|
|
@@ -25,12 +25,19 @@ import com.sweetfish.source.PageFlipper;
|
|
|
import com.sweetfish.util.AnyValue;
|
|
|
import com.sweetfish.util.AutoLoad;
|
|
|
import com.sweetfish.util.ResourceType;
|
|
|
+import com.sweetfish.util.TypeToken;
|
|
|
+import org.apache.commons.lang3.StringEscapeUtils;
|
|
|
import org.apache.commons.lang3.StringUtils;
|
|
|
+
|
|
|
+import org.dom4j.Document;
|
|
|
+import org.dom4j.DocumentException;
|
|
|
+import org.dom4j.Element;
|
|
|
+import org.dom4j.io.SAXReader;
|
|
|
import org.rex.RMap;
|
|
|
|
|
|
import javax.annotation.Resource;
|
|
|
-import java.io.File;
|
|
|
-import java.io.IOException;
|
|
|
+import java.awt.*;
|
|
|
+import java.io.*;
|
|
|
import java.math.BigDecimal;
|
|
|
import java.nio.charset.StandardCharsets;
|
|
|
import java.nio.file.Files;
|
|
|
@@ -38,6 +45,7 @@ import java.nio.file.Path;
|
|
|
import java.nio.file.Paths;
|
|
|
import java.nio.file.StandardOpenOption;
|
|
|
import java.util.*;
|
|
|
+import java.util.List;
|
|
|
|
|
|
@Local
|
|
|
@AutoLoad(false)
|
|
|
@@ -69,15 +77,19 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
private String tokenKey;
|
|
|
|
|
|
private String designContentRoot;
|
|
|
+ private String designOutputRoot;
|
|
|
private String orderContentRoot;
|
|
|
|
|
|
private DesignDao designDao;
|
|
|
|
|
|
+ private static final int tempTemplateExpire = 60 * 60 * 2;
|
|
|
+
|
|
|
@Override
|
|
|
public void start(AnyValue config) {
|
|
|
designDao = tunaService.generate(DesignDao.class);
|
|
|
|
|
|
designContentRoot = appHome + File.separator + "conf" + File.separator + "designContent";
|
|
|
+ designOutputRoot = appHome + File.separator + "conf" + File.separator + "designOutput";
|
|
|
orderContentRoot = appHome + File.separator + "conf" + File.separator + "orderContent";
|
|
|
}
|
|
|
|
|
|
@@ -94,6 +106,19 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
@Override
|
|
|
public RetResult<DesignFont> addDesignFont(DesignFont designFont, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
|
|
|
designFont.setId(tableIdService.getTableIdMulti("deDesignFont.id", 1, dataSourceId, String.valueOf(supplierCode)));
|
|
|
+
|
|
|
+ //加载字体读取fontFamily
|
|
|
+ String fontUrl = appHome + File.separator +
|
|
|
+ "erpfiles" + File.separator +
|
|
|
+ (designFont.getFontFilePath().replaceFirst("/static/", "").replace("/", File.separator));
|
|
|
+
|
|
|
+ try {
|
|
|
+ Font font = Font.createFont(Font.TRUETYPE_FONT, new File(fontUrl));
|
|
|
+ designFont.setFontFamily(font.getFamily());
|
|
|
+ } catch (FontFormatException | IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
designFont.setVoidFlag(0);
|
|
|
DesignFont.create(designFont, currentUser.getId());
|
|
|
|
|
|
@@ -137,6 +162,61 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
return RetResult.<DesignTemplate>successT().result(redisTemplate);
|
|
|
}
|
|
|
|
|
|
+ private void fillParamsToTemplate(DesignTemplate designTemplate, RMap params) {
|
|
|
+ FabricMain fabricMain = jsonConvert.convertFrom(FabricMain.class, designTemplate.getJsonContent());
|
|
|
+
|
|
|
+ //根据传入参数不同,查找替换
|
|
|
+ if (ERPUtils.mapContainKey(params, "backgroundWidth") &&
|
|
|
+ ERPUtils.mapContainKey(params, "backgroundHeight")) {
|
|
|
+ //传进来的默认都是mm,但是fabric记录的是px,需要转一下
|
|
|
+ double width = ERPUtils.mm2px(params.getDouble("backgroundWidth"));
|
|
|
+ double height = ERPUtils.mm2px(params.getDouble("backgroundHeight"));
|
|
|
+
|
|
|
+ fabricMain.setHeight(height * fabricMain.getZoom());
|
|
|
+ fabricMain.setWidth(width * fabricMain.getZoom());
|
|
|
+
|
|
|
+ fabricMain.getObjects().forEach(object -> {
|
|
|
+ if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
+ //背景对象
|
|
|
+ object.put("height", height);
|
|
|
+ object.put("width", width);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ if (ERPUtils.mapContainKey(params, "backgroundColor")) {
|
|
|
+ //格式 rgba(125,125,125,1)
|
|
|
+ String color = params.getString("backgroundColor");
|
|
|
+ fabricMain.getObjects().forEach(object -> {
|
|
|
+ if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
+ //背景对象
|
|
|
+ object.put("color", color);
|
|
|
+ object.put("fill", color);
|
|
|
+ }
|
|
|
+ });
|
|
|
+
|
|
|
+ fabricMain.getWorkSpace().setColor(color);
|
|
|
+ fabricMain.getWorkSpace().setFill(color);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (ERPUtils.mapContainKey(params, "objects")) {
|
|
|
+ List<HashMap<String, Object>> objects = jsonConvert.convertFrom(new TypeToken<List<HashMap<String, Object>>>() {
|
|
|
+ }.getType(), params.getString("objects"));
|
|
|
+
|
|
|
+ objects.forEach(object -> {
|
|
|
+ fabricMain.getObjects().stream().filter(x ->
|
|
|
+ x.get("id").equals(object.get("id")) && x.get("name").equals("textbox")
|
|
|
+ ).findFirst().ifPresent(x -> {
|
|
|
+ x.put("color", object.get("color"));
|
|
|
+ x.put("fill", object.get("color"));
|
|
|
+ x.put("text", object.get("text"));
|
|
|
+ x.put("fontFamily", object.get("fontFamily"));
|
|
|
+ });
|
|
|
+ });
|
|
|
+ }
|
|
|
+// redisTemplate.setJsonContent(jsonConvert.convertTo(fabricMain))
|
|
|
+ designTemplate.setJsonContent(JSON.toJSONString(fabricMain, SerializerFeature.WriteMapNullValue));
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 获取供编辑的设计模板,带参数
|
|
|
*
|
|
|
@@ -153,48 +233,25 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
|
|
|
if (redisTemplate == null) return RetResult.<DesignTemplate>errorT().retinfo("模板id不正确");
|
|
|
else {
|
|
|
- FabricMain fabricMain = jsonConvert.convertFrom(FabricMain.class, redisTemplate.getJsonContent());
|
|
|
-
|
|
|
- //根据传入参数不同,查找替换
|
|
|
- if (ERPUtils.mapContainKey(params, "backgroundWidth") &&
|
|
|
- ERPUtils.mapContainKey(params, "backgroundHeight")) {
|
|
|
- //传进来的默认都是mm,但是fabric记录的是px,需要转一下
|
|
|
- double width = ERPUtils.mm2px(params.getDouble("backgroundWidth"));
|
|
|
- double height = ERPUtils.mm2px(params.getDouble("backgroundHeight"));
|
|
|
-
|
|
|
- fabricMain.setHeight(height * fabricMain.getZoom());
|
|
|
- fabricMain.setWidth(width * fabricMain.getZoom());
|
|
|
-
|
|
|
- fabricMain.getObjects().forEach(object -> {
|
|
|
- if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
- //背景对象
|
|
|
- object.put("height", height);
|
|
|
- object.put("width", width);
|
|
|
- }
|
|
|
- });
|
|
|
- }
|
|
|
- if (ERPUtils.mapContainKey(params, "backgroundColor")) {
|
|
|
- //格式 rgba(125,125,125,1)
|
|
|
- String color = params.getString("backgroundColor");
|
|
|
- fabricMain.getObjects().forEach(object -> {
|
|
|
- if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
- //背景对象
|
|
|
- object.put("color", color);
|
|
|
- object.put("fill", color);
|
|
|
- }
|
|
|
- });
|
|
|
-
|
|
|
- fabricMain.getWorkSpace().setColor(color);
|
|
|
- fabricMain.getWorkSpace().setFill(color);
|
|
|
- }
|
|
|
-// redisTemplate.setJsonContent(jsonConvert.convertTo(fabricMain));
|
|
|
- redisTemplate.setJsonContent(JSON.toJSONString(fabricMain, SerializerFeature.WriteMapNullValue));
|
|
|
+ fillParamsToTemplate(redisTemplate, params);
|
|
|
return RetResult.<DesignTemplate>successT().result(redisTemplate);
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ public RetResult<DesignTemplate> getDesignTemplateEdit(long id, RMap params, String outerSessionId, String dataSourceId, long supplierCode) {
|
|
|
+ RetResult<DesignTemplate> templateRetResult = this.getDesignTemplateEdit(id, params, dataSourceId, supplierCode);
|
|
|
+ if (!templateRetResult.isSuccess()) return templateRetResult;
|
|
|
+ DesignTemplate designTemplate = templateRetResult.getResult();
|
|
|
+
|
|
|
+ //将当前临时模板记录在redis中,设置个过期时间就行了
|
|
|
+ redisService.setex(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_SESSION, supplierCode, true)
|
|
|
+ + outerSessionId, tempTemplateExpire, designTemplate);
|
|
|
+ return RetResult.<DesignTemplate>successT().result(designTemplate);
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public RetResult<DesignTemplate> getDesignTemplateImposition(long id, String dataSourceId, long supplierCode) {
|
|
|
DesignTemplate redisTemplate = getRedisDocInfo(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode),
|
|
|
String.valueOf(id), DesignTemplate.class);
|
|
|
@@ -205,9 +262,9 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
}
|
|
|
|
|
|
//todo 转换fabric的元素结构
|
|
|
- private void convertJsonObjectsToTemplate(DesignTemplate designTemplate) {
|
|
|
+ private void convertJsonObjectsToTemplate(DesignTemplate designTemplate, String dataSourceId, long supplierCode) {
|
|
|
FabricMain fabricMain = jsonConvert.convertFrom(FabricMain.class, designTemplate.getJsonContent());
|
|
|
- List<DesignOrderItem> orderItems = new ArrayList<>();
|
|
|
+ List<DesignTemplateItem> templateItems = new ArrayList<>();
|
|
|
fabricMain.getObjects().forEach(object -> {
|
|
|
if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
//背景对象
|
|
|
@@ -218,11 +275,34 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
|
|
|
});
|
|
|
|
|
|
- designTemplate.setItemList(new ArrayList<>());
|
|
|
+ designTemplate.setItemList(templateItems);
|
|
|
}
|
|
|
|
|
|
- private void convertJsonObjectsToOrder(DesignOrder designOrder) {
|
|
|
- designOrder.setItemList(new ArrayList<>());
|
|
|
+ private void convertJsonObjectsToOrder(DesignOrder designOrder, String dataSourceId, long supplierCode) {
|
|
|
+ FabricMain fabricMain = jsonConvert.convertFrom(FabricMain.class, designOrder.getJsonContent());
|
|
|
+ List<DesignOrderItem> orderItems = new ArrayList<>();
|
|
|
+ long idItem = tableIdService.getTableIdMulti("deDesignOrderItem.id", fabricMain.getObjects().size(), dataSourceId, String.valueOf(supplierCode));
|
|
|
+ for (HashMap<String, Object> object : fabricMain.getObjects()) {
|
|
|
+ if (object.get("id").equals("WorkSpaceDrawType")) {
|
|
|
+ //背景对象
|
|
|
+ designOrder.setCanvasHeight(ERPUtils.px2mm(((BigDecimal) object.get("height")).doubleValue()));
|
|
|
+ designOrder.setCanvasWidth(ERPUtils.px2mm(((BigDecimal) object.get("width")).doubleValue()));
|
|
|
+ }
|
|
|
+
|
|
|
+ DesignOrderItem orderItem = new DesignOrderItem();
|
|
|
+ orderItem.setId(idItem++);
|
|
|
+ orderItem.setIdOrder(designOrder.getId());
|
|
|
+ orderItem.setItemType(object.get("type").toString());
|
|
|
+ orderItem.setLocationX(Double.parseDouble(object.get("left").toString()));
|
|
|
+ orderItem.setLocationY(Double.parseDouble(object.get("top").toString()));
|
|
|
+ orderItem.setSizeWidth(ERPUtils.px2mm(((BigDecimal) object.get("width")).doubleValue()));
|
|
|
+ orderItem.setSizeHeight(ERPUtils.px2mm(((BigDecimal) object.get("height")).doubleValue()));
|
|
|
+ orderItem.setRotation(Double.parseDouble(object.get("angle").toString()));
|
|
|
+
|
|
|
+ orderItems.add(orderItem);
|
|
|
+ }
|
|
|
+
|
|
|
+ designOrder.setItemList(orderItems);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
@@ -260,7 +340,7 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
}
|
|
|
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_EDIT, supplierCode), String.valueOf(template.getId()), template);
|
|
|
- convertJsonObjectsToTemplate(template);
|
|
|
+ convertJsonObjectsToTemplate(template, dataSourceId, supplierCode);
|
|
|
template.setJsonContent(fileName);
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION, supplierCode), String.valueOf(template.getId()), template);
|
|
|
|
|
|
@@ -360,6 +440,63 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
|
|
|
//region 设计订单
|
|
|
@Override
|
|
|
+ public RetResult<DesignOrder> newDesignOrder(String outerSessionId, String svgContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
|
|
|
+ String templateJson = redisService.get(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_TEMPLATE_SESSION, supplierCode, true)
|
|
|
+ + outerSessionId);
|
|
|
+ if (StringUtils.isEmpty(templateJson))
|
|
|
+ return RetResult.<DesignOrder>errorT().retinfo("当前设计已超时,请刷新后操作");
|
|
|
+ DesignTemplate template = jsonConvert.convertFrom(DesignTemplate.class, templateJson);
|
|
|
+ svgContent = StringEscapeUtils.unescapeJava(svgContent);
|
|
|
+ if (svgContent.startsWith("\"") && svgContent.endsWith("\"")) {
|
|
|
+ svgContent = svgContent.substring(1, svgContent.length() - 1);
|
|
|
+ }
|
|
|
+
|
|
|
+ String fileName = ERPUtils.generateUUID() + ".svg";
|
|
|
+ String fileUrl = designOutputRoot + File.separator + supplierCode +
|
|
|
+ File.separator + fileName;
|
|
|
+ Path path = Paths.get(fileUrl);
|
|
|
+
|
|
|
+ try {
|
|
|
+ if (!Files.exists(path.getParent())) {
|
|
|
+ Files.createDirectories(path.getParent());
|
|
|
+ }
|
|
|
+ Files.write(path,
|
|
|
+ Collections.singleton(new StringBuilder(svgContent)),
|
|
|
+ StandardCharsets.UTF_8,
|
|
|
+ StandardOpenOption.CREATE,
|
|
|
+ StandardOpenOption.WRITE,
|
|
|
+ StandardOpenOption.TRUNCATE_EXISTING);
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ //生成redis任务
|
|
|
+ // 使用 SAXReader 解析 SVG 内容
|
|
|
+ SAXReader reader = new SAXReader();
|
|
|
+ Document document = null;
|
|
|
+ try {
|
|
|
+ document = reader.read(new StringReader(svgContent));
|
|
|
+ } catch (DocumentException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 获取 SVG 根元素
|
|
|
+ Element rootElement = document.getRootElement();
|
|
|
+
|
|
|
+ SVGTaskInfo taskInfo = new SVGTaskInfo();
|
|
|
+ taskInfo.setHeight(rootElement.attributeValue("height").replace("px", ""));
|
|
|
+ taskInfo.setWidth(rootElement.attributeValue("width").replace("px", ""));
|
|
|
+ taskInfo.setSvgPath(fileUrl);
|
|
|
+ taskInfo.setSvgFileName(fileName);
|
|
|
+
|
|
|
+ redisService.rpush(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SVG_TASK_LIST, supplierCode), jsonConvert.convertTo(taskInfo));
|
|
|
+
|
|
|
+ //算了别写了没人用
|
|
|
+// return this.newDesignOrder(template, dataSourceId, supplierCode, currentUser);
|
|
|
+ return RetResult.successT();
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public RetResult<DesignOrder> newDesignOrder(DesignTemplate customerDesign, String dataSourceId, long supplierCode, ERPTokenUser currentUser) {
|
|
|
DesignOrder designOrder = convertTemplateToOrder(customerDesign);
|
|
|
designOrder.setId(tableIdService.getTableIdMulti("deDesignOrder.id", 1, dataSourceId, String.valueOf(supplierCode)));
|
|
|
@@ -389,12 +526,10 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
}
|
|
|
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_EDIT, supplierCode), String.valueOf(designOrder.getId()), designOrder);
|
|
|
- convertJsonObjectsToOrder(designOrder);
|
|
|
+ convertJsonObjectsToOrder(designOrder, dataSourceId, supplierCode);
|
|
|
designOrder.setJsonContent(fileName);
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_IMPOSITION, supplierCode), String.valueOf(designOrder.getId()), designOrder);
|
|
|
|
|
|
- //todo 生成pdf
|
|
|
-
|
|
|
designDao.addDesignOrder(designOrder, designOrder.getItemList(), dataSourceId, supplierCode);
|
|
|
|
|
|
return RetResult.<DesignOrder>successT().result(designOrder);
|
|
|
@@ -436,11 +571,10 @@ public class DesignServiceImpl extends BaseService implements DesignService {
|
|
|
}
|
|
|
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_EDIT, supplierCode), String.valueOf(designOrder.getId()), designOrder);
|
|
|
- convertJsonObjectsToOrder(designOrder);
|
|
|
+ convertJsonObjectsToOrder(designOrder, dataSourceId, supplierCode);
|
|
|
designOrder.setJsonContent(fileName);
|
|
|
redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_IMPOSITION, supplierCode), String.valueOf(designOrder.getId()), designOrder);
|
|
|
|
|
|
- //todo 生成pdf
|
|
|
designDao.updateDesignOrder(designOrder, designOrder.getItemList(), dataSourceId, supplierCode);
|
|
|
|
|
|
return RetResult.<DesignOrder>successT().result(designOrder);
|