Browse Source

设计生成svg,这里保存并写入任务队列交给pdfMonitor处理

Veronique 1 year ago
parent
commit
032cc9f894

+ 98 - 135
conf/rediskeys.properties

@@ -1,17 +1,13 @@
 # suppress inspection "UnusedProperty" for whole file
-
 redis.reqlimit=sdtool:mall:reqlimit
 redis.authcode=sdtool:mall:authcode
 redis.sessions=sdtool:mall:sessions
-
 #多租户多工厂信息
-redis.platform.supplier = sdtool:mall:platform:supplier:info
-redis.platform.supplier.sharding.key = sdtool:mall:platform:supplier:sharding
-redis.platform.supplier.itemcode = sdtool:mall:platform:supplier:itemcode
-
-redis.erp.access.token.value = sdtool:mall:erp:access:token:value
-redis.erp.access.token.date = sdtool:mall:erp:access:token:date
-
+redis.platform.supplier=sdtool:mall:platform:supplier:info
+redis.platform.supplier.sharding.key=sdtool:mall:platform:supplier:sharding
+redis.platform.supplier.itemcode=sdtool:mall:platform:supplier:itemcode
+redis.erp.access.token.value=sdtool:mall:erp:access:token:value
+redis.erp.access.token.date=sdtool:mall:erp:access:token:date
 #单个redis节点的分布式锁
 redis.lock=sdtool:mall:lock
 redis.dept=sdtool:mall:sysdept
@@ -31,187 +27,154 @@ redis.sysroleactions=sdtool:mall:sysroleactions
 #这里在首次从数据库中获取时进行存储,在修改员工档案的时候删除键值并修改
 redis.sysuserrole=sdtool:mall:sysuserrole
 redis.erp.dicttype=sdtool:mall:erp:dicttype
-
-
 #系统配置
 redis.configvalue=sdtool:mall:configvalue
 #字典数据
 redis.dicttype=sdtool:mall:dicttype
 redis.dictdata=sdtool:mall:dictdata
-
 redis.site.content=sdtool:mall:site:content
-
 #业务脚本
 redis.businessscript=sdtool:mall:businessscript
 redis.scriptcompile=sdtool:mall:scriptcompile
-
 #分厂信息
-redis.company.info = sdtool:mall:company:info
-
+redis.company.info=sdtool:mall:company:info
 #科目档案
-redis.erp.finance.account =sdtool:mall:erp:finance:account
-
+redis.erp.finance.account=sdtool:mall:erp:finance:account
 #消息类型
-redis.erp.noticemessage = sdtool:mall:noticemessage
-redis.erp.usernoticemessage = sdtool:mall:usernoticemessage
-
-redis.erp.pay.tradeno = sdtool:mall:erp:pay:tradeno
-
+redis.erp.noticemessage=sdtool:mall:noticemessage
+redis.erp.usernoticemessage=sdtool:mall:usernoticemessage
+redis.erp.pay.tradeno=sdtool:mall:erp:pay:tradeno
 #消息组前缀
-redis.erp.noticemsggroup = sdtool:mall:noticemsggroup
-
+redis.erp.noticemsggroup=sdtool:mall:noticemsggroup
 #登录用户,一直记录,用户登录则记录下信息
-redis.erp.loginuser = sdtool:mall:loginuser
-redis.erp.onlineuser = sdtool:mall:onlineuser
-
-redis.erp.personconfig = sdtool:mall:personconfig
-
-redis.formtoken = sdtool:mall:formtoken
-redis.formtokenex = sdtool:mall:formtokenex
-
+redis.erp.loginuser=sdtool:mall:loginuser
+redis.erp.onlineuser=sdtool:mall:onlineuser
+redis.erp.personconfig=sdtool:mall:personconfig
+redis.formtoken=sdtool:mall:formtoken
+redis.formtokenex=sdtool:mall:formtokenex
 #仪表盘
-redis.cardpanel = sdtool:mall:cardpanel
-
+redis.cardpanel=sdtool:mall:cardpanel
 #业务锁定数据
-redis.erplock.data = sdtool:mall:erplock:data
-redis.erplock.userdata = sdtool:mall:erplock:userdata
-redis.erplock.exclusivelockpart = sdtool:mall:erplock:exclusivelockpart
-redis.erp.machineonwork = sdtool:mall:erp:machineonwork
-
+redis.erplock.data=sdtool:mall:erplock:data
+redis.erplock.userdata=sdtool:mall:erplock:userdata
+redis.erplock.exclusivelockpart=sdtool:mall:erplock:exclusivelockpart
+redis.erp.machineonwork=sdtool:mall:erp:machineonwork
 #查询统计
-redis.erp.inquireinfo = sdtool:mall:erp:inquireinfo
-
-redis.erp.product.parameter = sdtool:mall:erp:product:parameter
-redis.erp.product.center.parameter = sdtool:mall:erp:product:center:parameter
-redis.erp.product.info = sdtool:mall:erp:product:info
-redis.erp.product.detail = sdtool:mall:erp:product:detail
-redis.erp.product.type = sdtool:mall:erp:product:type
-redis.erp.product.pagePrice = sdtool:mall:erp:product:pagePrice
-redis.erp.product.example.image = sdtool:mall:erp:product:exampleImage
-redis.erp.product.room = sdtool:mall:erp:product:room
-
+redis.erp.inquireinfo=sdtool:mall:erp:inquireinfo
+redis.erp.product.parameter=sdtool:mall:erp:product:parameter
+redis.erp.product.center.parameter=sdtool:mall:erp:product:center:parameter
+redis.erp.product.info=sdtool:mall:erp:product:info
+redis.erp.product.detail=sdtool:mall:erp:product:detail
+redis.erp.product.type=sdtool:mall:erp:product:type
+redis.erp.product.pagePrice=sdtool:mall:erp:product:pagePrice
+redis.erp.product.example.image=sdtool:mall:erp:product:exampleImage
+redis.erp.product.room=sdtool:mall:erp:product:room
 #单据打印次数
-redis.erp.itemprintcount = sdtool:mall:print:printcount
-
-redis.erp.order.cycle.item = sdtool:mall:erp:cycle:item:order
-
-redis.erp.print.bill.cycle.item = sdtool:mall:erp:cycle:item:printBill
+redis.erp.itemprintcount=sdtool:mall:print:printcount
+redis.erp.order.cycle.item=sdtool:mall:erp:cycle:item:order
+redis.erp.print.bill.cycle.item=sdtool:mall:erp:cycle:item:printBill
 #施工单版心尺寸
-redis.erp.breedplatesize = sdtool:mall:erp:breedplatesize
+redis.erp.breedplatesize=sdtool:mall:erp:breedplatesize
 #专版施工单拼版任务
-redis.erp.version.exclusivetask = sdtool:mall:version:exclusivetask
-redis.erp.spliceworkcount = sdtool:mall:erp:spliceworkcount
-redis.erp.printbillmessage = sdtool:mall:erp:printbillmessage
-redis.erp.print.breed.message = sdtool:mall:erp:print:breed:message
+redis.erp.version.exclusivetask=sdtool:mall:version:exclusivetask
+redis.erp.spliceworkcount=sdtool:mall:erp:spliceworkcount
+redis.erp.printbillmessage=sdtool:mall:erp:printbillmessage
+redis.erp.print.breed.message=sdtool:mall:erp:print:breed:message
 #施工单版本号
-redis.erp.version.printbill = sdtool:mall:erp:version:printbill
-
-redis.erp.develop.client = sdtool:mall:erp:developclient
-redis.erp.develop.client.code = sdtool:mall:erp:developclientcode
-
+redis.erp.version.printbill=sdtool:mall:erp:version:printbill
+redis.erp.develop.client=sdtool:mall:erp:developclient
+redis.erp.develop.client.code=sdtool:mall:erp:developclientcode
 #机型机台
-redis.erp.machine.type = sdtool:mall:erp:machine:type
-redis.erp.machine.info = sdtool:mall:erp:machine:info
-
+redis.erp.machine.type=sdtool:mall:erp:machine:type
+redis.erp.machine.info=sdtool:mall:erp:machine:info
 #数据锁定
-
-redis.erp.client.industry.info = sdtool:mall:erp:client:industry:info
-redis.erp.client.moneybalance = sdtool:mall:erp:client:balance:clientmoney
-redis.erp.client.clientlevel = sdtool:mall:erp:client:clientlevel
-
+redis.erp.client.industry.info=sdtool:mall:erp:client:industry:info
+redis.erp.client.moneybalance=sdtool:mall:erp:client:balance:clientmoney
+redis.erp.client.clientlevel=sdtool:mall:erp:client:clientlevel
 #纸张品牌
-redis.erp.paper.brand = sdtool:mall:erp:paper:brand
+redis.erp.paper.brand=sdtool:mall:erp:paper:brand
 #纸张开数档案
-redis.erp.paper.cut.info = sdtool:mall:erp:paper:cut:info
-redis.erp.paper.cut.size.info= sdtool:mall:erp:paper:cut:size:info
+redis.erp.paper.cut.info=sdtool:mall:erp:paper:cut:info
+redis.erp.paper.cut.size.info=sdtool:mall:erp:paper:cut:size:info
 #辅料类型
-redis.erp.material.type = sdtool:mall:erp:material:type
+redis.erp.material.type=sdtool:mall:erp:material:type
 #辅料纸张数量库存
-redis.erp.material.qty.balance = sdtool:mall:erp:balance:material:qty
+redis.erp.material.qty.balance=sdtool:mall:erp:balance:material:qty
 #纸张与辅料入库的总金额和总数量,方便后续计算加权平均
-redis.erp.material.stock.in.money = sdtool:mall:erp:balance:stock:in:money
-redis.erp.material.stock.in.qty = sdtool:mall:erp:balance:stock:in:qty
+redis.erp.material.stock.in.money=sdtool:mall:erp:balance:stock:in:money
+redis.erp.material.stock.in.qty=sdtool:mall:erp:balance:stock:in:qty
 #辅料纸张数量虚拟库存,用于预出库锁定,不存数据库
-redis.erp.material.virtual.balance = sdtool:mall:erp:balance:material:virtual
+redis.erp.material.virtual.balance=sdtool:mall:erp:balance:material:virtual
 #库房盘点状态
-redis.erp.stock.check.status = sdtool:mall:erp:stock:check:status
-
+redis.erp.stock.check.status=sdtool:mall:erp:stock:check:status
 #进销存单据定义
-redis.erp.bill.define = sdtool:mall:erp:bill:define
+redis.erp.bill.define=sdtool:mall:erp:bill:define
 #库房
-redis.erp.stockroom = sdtool:mall:erp:stockroom
-
+redis.erp.stockroom=sdtool:mall:erp:stockroom
 #版芯档案
-redis.erp.plate.template = sdtool:mall:erp:plate:template
+redis.erp.plate.template=sdtool:mall:erp:plate:template
 #版式标题
-redis.erp.plate.title = sdtool:mall:erp:plate:title
+redis.erp.plate.title=sdtool:mall:erp:plate:title
 #纸杯版芯档案
-redis.erp.cup.plate.template = sdtool:mall:erp:cup:plate:template
+redis.erp.cup.plate.template=sdtool:mall:erp:cup:plate:template
 #班组
-redis.erp.work.team = sdtool:mall:erp:work:team
+redis.erp.work.team=sdtool:mall:erp:work:team
 #班组人员
-redis.erp.work.team.person = sdtool:mall:erp:work:team:person
+redis.erp.work.team.person=sdtool:mall:erp:work:team:person
 #版印刷工序调度排序
-redis.breedtask.schedule.sort = sdtool:mall:erp:breedtask:schedulesort
+redis.breedtask.schedule.sort=sdtool:mall:erp:breedtask:schedulesort
 #异步处理施工单生命周期队列
-redis.printbill.cycle.item = sdtool:mall:erp:printbill:cycle:item
+redis.printbill.cycle.item=sdtool:mall:erp:printbill:cycle:item
 #版任务的实时状态
-redis.printbill.breed.taskStatus = sdtool:mall:erp:printbill:breed:taskstatus
-
+redis.printbill.breed.taskStatus=sdtool:mall:erp:printbill:breed:taskstatus
 #PDFMonitor使用
-redis.pdf.printbilldetail = sdtool:mall:pdf:printbilldetail
-redis.pdf.hadrebuildplate = sdtool:mall:pdf:hadrebuildplate
-redis.pdf.voidprintbillid = sdtool:mall:pdf:voidprintbillid
-
-redis.erp.order.batch.file.code = sdtool:mall:order:filecode
-
+redis.pdf.printbilldetail=sdtool:mall:pdf:printbilldetail
+redis.pdf.hadrebuildplate=sdtool:mall:pdf:hadrebuildplate
+redis.pdf.voidprintbillid=sdtool:mall:pdf:voidprintbillid
+redis.erp.order.batch.file.code=sdtool:mall:order:filecode
 #数据锁定
-redis.erp.working.product.info = sdtool:mall:erp:working:product:info
-redis.erp.working.product.down = sdtool:mall:erp:working:product:down
-redis.erp.working.mall.order = sdtool:mall:erp:working:mall:order
-redis.erp.working.order.task = sdtool:mall:erp:working:order:task
-
+redis.erp.working.product.info=sdtool:mall:erp:working:product:info
+redis.erp.working.product.down=sdtool:mall:erp:working:product:down
+redis.erp.working.mall.order=sdtool:mall:erp:working:mall:order
+redis.erp.working.order.task=sdtool:mall:erp:working:order:task
 #商城
-redis.erp.mall.user = sdtool:mall:erp:mall:user
-redis.erp.mall.user.social = sdtool:mall:erp:mall:social
-
-redis.erp.mall.poster.location = sdtool:mall:erp:mallposterlocation
+redis.erp.mall.user=sdtool:mall:erp:mall:user
+redis.erp.mall.user.social=sdtool:mall:erp:mall:social
+redis.erp.mall.poster.location=sdtool:mall:erp:mallposterlocation
 #用户级别
-redis.erp.mall.user.level = sdtool:mall:erp:mall:user:level
-
+redis.erp.mall.user.level=sdtool:mall:erp:mall:user:level
 #ERP订单版本号
-redis.erp.version.order = sdtool:mall:erp:version:order
+redis.erp.version.order=sdtool:mall:erp:version:order
 #发货通知版本号
-redis.erp.version.deliver.inform = sdtool:mall:erp:version:deliver:inform
+redis.erp.version.deliver.inform=sdtool:mall:erp:version:deliver:inform
 #订单应收版本号
-redis.erp.version.receivable = sdtool:mall:erp:version:receivable
-
+redis.erp.version.receivable=sdtool:mall:erp:version:receivable
 #修图人员上班
-redis.image.designer = sdtool:mall:erp:image:designer:work:time
+redis.image.designer=sdtool:mall:erp:image:designer:work:time
 #修图分配方式,全局控制0或者没有表示自动分配,1手工分配
-redis.image.designer.work.kind = sdtool:mall:erp:image:designer:work:kind
+redis.image.designer.work.kind=sdtool:mall:erp:image:designer:work:kind
 #修图人员上班状态
-redis.image_designer_state = sdtool:mall:erp:image:designer:work:state
+redis.image_designer_state=sdtool:mall:erp:image:designer:work:state
 #修图人员排序
-redis.image.designer.sort.num = sdtool:mall:erp:image:designer:sort:num
+redis.image.designer.sort.num=sdtool:mall:erp:image:designer:sort:num
 #修图人员P数
-redis.designer.work.image.count = sdtool:mall:erp:image:designer:work:image:count
+redis.designer.work.image.count=sdtool:mall:erp:image:designer:work:image:count
 #修图人员暂停订单数
-redis.designer.work.order.count = sdtool:mall:erp:image:designer:work:order:count
+redis.designer.work.order.count=sdtool:mall:erp:image:designer:work:order:count
 #订单修图分配情况
-redis.order.image.dispatch.last = sdtool:mall:erp:image:designer:image:dispatch:last
+redis.order.image.dispatch.last=sdtool:mall:erp:image:designer:image:dispatch:last
 #手动分配订单异步记录,先锁定,防止重复分配,修图记录完成后(包括修图人退回、完成、强制完成、校稿审核)从redis中删除
-redis.order.image.manual.item = sdtool:mall:erp:image:designer:manual:item
+redis.order.image.manual.item=sdtool:mall:erp:image:designer:manual:item
 #科目余额
-redis.erp.account.money.balance = sdtool:mall:erp:balance:account:money
+redis.erp.account.money.balance=sdtool:mall:erp:balance:account:money
 #科目最新账期
-redis.erp.account.last.period = sdtool:mall:erp:account:last:period
-
+redis.erp.account.last.period=sdtool:mall:erp:account:last:period
 #在线设计
-redis.designer.design.template.edit = sdtool:mall:designer:design:template:edit
-redis.designer.design.template.imposition = sdtool:mall:designer:design:template:imposition
-redis.designer.design.font = sdtool:mall:designer:design:font
-redis.designer.sys.user.token = sdtool:mall:designer:sys:user:token
-
-redis.designer.design.order.edit = sdtool:mall:designer:design:order:edit
-redis.designer.design.order.imposition = sdtool:mall:designer:design:order:imposition
+redis.designer.design.template.edit=sdtool:mall:designer:design:template:edit
+redis.designer.design.template.imposition=sdtool:mall:designer:design:template:imposition
+redis.designer.design.template.session=sdtool:mall:designer:design:template:session
+redis.designer.design.font=sdtool:mall:designer:design:font
+redis.designer.sys.user.token=sdtool:mall:designer:sys:user:token
+redis.designer.svg.task.list=sdtool:mall:designer:svg:task:list
+redis.designer.design.order.edit=sdtool:mall:designer:design:order:edit
+redis.designer.design.order.imposition=sdtool:mall:designer:design:order:imposition

+ 7 - 7
conf/sqlroot/com/sdtool/business/dao/DesignDao.dql

@@ -2,13 +2,13 @@
 select * from $table$;
 
 -- [addDesignFont]
-insert into $table$ (id, fontName, fontThumbUrl, voidFlag,
-fontFilePath, createBy, createTime,
-createTimeLong, updateBy, updateTime,
-updateTimeLong ) values ( #{id}, #{fontname}, #{fontthumburl}, #{voidflag},
-#{fontfilepath}, #{createby}, #{createtime},
-#{createtimelong}, #{updateby}, #{updatetime},
-#{updatetimelong} );
+insert into $table$ (id, fontName, fontFamily, fontThumbUrl,
+voidFlag, fontFilePath, createBy,
+createTime, createTimeLong, updateBy,
+updateTime, updateTimeLong ) values ( #{id}, #{fontname}, #{fontfamily}, #{fontthumburl},
+#{voidflag}, #{fontfilepath}, #{createby},
+#{createtime}, #{createtimelong}, #{updateby},
+#{updatetime}, #{updatetimelong} );
 
 -- [voidDesignFont]
 update $table$ set

+ 183 - 49
sdBusiness/src/main/java/com/sdtool/business/service/mall/DesignServiceImpl.java

@@ -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);

+ 4 - 8
sdCommon/pom.xml

@@ -108,15 +108,11 @@
         </dependency>
 
         <dependency>
-            <groupId>org.apache.pdfbox</groupId>
-            <artifactId>pdfbox</artifactId>
-            <version>2.0.24</version>
-        </dependency>
-        <dependency>
-            <groupId>org.apache.pdfbox</groupId>
-            <artifactId>fontbox</artifactId>
-            <version>2.0.24</version>
+            <groupId>org.dom4j</groupId>
+            <artifactId>dom4j</artifactId>
+            <version>2.1.3</version>
         </dependency>
+
     </dependencies>
 
 </project>

+ 5 - 0
sdCommon/src/main/java/com/sdtool/common/api/mall/DesignService.java

@@ -29,6 +29,9 @@ public interface DesignService extends ScriptService {
 
     RetResult<DesignTemplate> getDesignTemplateEdit(long id, RMap params, String dataSourceId, long supplierCode);
 
+    //给前端客户设计传入参数并提供预览时使用,需要传入外部网站当前的session,用于唯一确认临时模板信息
+    RetResult<DesignTemplate> getDesignTemplateEdit(long id, RMap params, String outerSessionId, String dataSourceId, long supplierCode);
+
     RetResult<DesignTemplate> getDesignTemplateImposition(long id, String dataSourceId, long supplierCode);
 
     RetResult<DesignTemplate> updateDesignTemplate(DesignTemplate template, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
@@ -51,6 +54,8 @@ public interface DesignService extends ScriptService {
 
     RetResult<DesignOrder> getDesignOrderImposition(long id, String dataSourceId, long supplierCode);
 
+    RetResult<DesignOrder> newDesignOrder(String outerSessionId, String svgContent, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
+
     RetResult<DesignOrder> newDesignOrder(DesignTemplate customerDesign, String dataSourceId, long supplierCode, ERPTokenUser currentUser);
 
     RetResult<DesignOrder> updateDesignOrder(DesignOrder designOrder, String dataSourceId, long supplierCode, ERPTokenUser currentUser);

+ 4 - 0
sdCommon/src/main/java/com/sdtool/common/datas/RedisKeys.java

@@ -463,6 +463,8 @@ public class RedisKeys {
     public static final String KEY_DESIGNER_DESIGN_TEMPLATE_EDIT = "redis.designer.design.template.edit";
     //模板--给后面流程用的,记录itemList,不记录jsonContent
     public static final String KEY_DESIGNER_DESIGN_TEMPLATE_IMPOSITION = "redis.designer.design.template.imposition";
+    //模板--给前端传入参数后生成的临时模板,如果要生成订单则传入下一步,否则过期自动清除
+    public static final String KEY_DESIGNER_DESIGN_TEMPLATE_SESSION = "redis.designer.design.template.session";
 
     //订单--给模板编辑用的,不记录item,全文记录jsonContent
     public static final String KEY_DESIGNER_DESIGN_ORDER_EDIT = "redis.designer.design.order.edit";
@@ -472,6 +474,8 @@ public class RedisKeys {
     public static final String KEY_DESIGNER_DESIGN_FONT = "redis.designer.design.font";
     //系统流转间暂存token
     public static final String KEY_DESIGNER_SYS_USER_TOKEN = "redis.designer.sys.user.token";
+
+    public static final String KEY_DESIGNER_SVG_TASK_LIST = "redis.designer.svg.task.list";
     //endregion
 
     private RedisKeys() {

+ 17 - 5
sdCommon/src/main/java/com/sdtool/common/entity/design/DesignFont.java

@@ -8,24 +8,28 @@ import org.rex.db.RColumn;
  * 设计字体
  */
 public class DesignFont extends BaseEntity {
-    @Comment("")
     @RColumn("id")
+    @Comment("")
     private long id;
 
-    @Comment("字体名称")
     @RColumn("fontname")
+    @Comment("字体名称")
     private String fontName;
 
-    @Comment("字体缩略图")
+    @Comment("")
+    @RColumn("fontfamily")
+    private String fontFamily;
+
     @RColumn("fontthumburl")
+    @Comment("字体缩略图")
     private String fontThumbUrl;
 
-    @Comment("")
     @RColumn("voidflag")
+    @Comment("")
     private int voidFlag;
 
-    @Comment("字体链接")
     @RColumn("fontfilepath")
+    @Comment("字体链接")
     private String fontFilePath;
 
     public long getId() {
@@ -67,4 +71,12 @@ public class DesignFont extends BaseEntity {
     public void setFontFilePath(String fontFilePath) {
         this.fontFilePath = fontFilePath;
     }
+
+    public String getFontFamily() {
+        return fontFamily;
+    }
+
+    public void setFontFamily(String fontFamily) {
+        this.fontFamily = fontFamily;
+    }
 }

+ 3 - 3
sdCommon/src/main/java/com/sdtool/common/entity/design/DesignOrderItem.java

@@ -18,7 +18,7 @@ public class DesignOrderItem extends BaseEntity {
 
     @Comment("元素类型")
     @RColumn("itemtype")
-    private int itemType;
+    private String itemType;
 
     @Comment("坐标x(锚点相对于拼版尺寸左上角)")
     @RColumn("locationx")
@@ -64,11 +64,11 @@ public class DesignOrderItem extends BaseEntity {
         this.idOrder = idOrder;
     }
 
-    public int getItemType() {
+    public String getItemType() {
         return itemType;
     }
 
-    public void setItemType(int itemType) {
+    public void setItemType(String itemType) {
         this.itemType = itemType;
     }
 

+ 3 - 3
sdCommon/src/main/java/com/sdtool/common/entity/design/DesignTemplateItem.java

@@ -18,7 +18,7 @@ public class DesignTemplateItem extends BaseEntity {
 
     @Comment("元素类型")
     @RColumn("itemtype")
-    private int itemType;
+    private String itemType;
 
     @Comment("坐标x(锚点相对于拼版尺寸左上角)")
     @RColumn("locationx")
@@ -64,11 +64,11 @@ public class DesignTemplateItem extends BaseEntity {
         this.idTemplate = idTemplate;
     }
 
-    public int getItemType() {
+    public String getItemType() {
         return itemType;
     }
 
-    public void setItemType(int itemType) {
+    public void setItemType(String itemType) {
         this.itemType = itemType;
     }
 

+ 43 - 0
sdCommon/src/main/java/com/sdtool/common/entity/design/SVGTaskInfo.java

@@ -0,0 +1,43 @@
+package com.sdtool.common.entity.design;
+
+public class SVGTaskInfo {
+    private String width;
+
+    private String height;
+
+    private String svgPath;
+
+    private String svgFileName;
+
+    public String getWidth() {
+        return width;
+    }
+
+    public void setWidth(String width) {
+        this.width = width;
+    }
+
+    public String getHeight() {
+        return height;
+    }
+
+    public void setHeight(String height) {
+        this.height = height;
+    }
+
+    public String getSvgPath() {
+        return svgPath;
+    }
+
+    public void setSvgPath(String svgPath) {
+        this.svgPath = svgPath;
+    }
+
+    public String getSvgFileName() {
+        return svgFileName;
+    }
+
+    public void setSvgFileName(String svgFileName) {
+        this.svgFileName = svgFileName;
+    }
+}

+ 7 - 2
sdCommon/src/main/java/com/sdtool/common/tool/ERPUtils.java

@@ -115,6 +115,7 @@ public class ERPUtils {
     public static final RMap<String, Integer> PARAM_VOID_FLAG_ALL = new RMap<>(Utility.ofMap("voidFlag", -1));
 
     private static final double DEFAULT_RATIO = 25.4;
+    private static final double DEFAULT_DPI = 96;
 
     static {
         try {
@@ -1061,10 +1062,14 @@ public class ERPUtils {
     }
 
     public static double px2mm(double px) {
-        return px / 300 * DEFAULT_RATIO;
+        return px / DEFAULT_DPI * DEFAULT_RATIO;
     }
 
     public static double mm2px(double mm) {
-        return mm * 300 / DEFAULT_RATIO;
+        return mm * DEFAULT_DPI / DEFAULT_RATIO;
+    }
+
+    public static String generateUUID() {
+        return UUID.randomUUID().toString().replace("-", "");
     }
 }

+ 40 - 0
sdWebCore/src/main/java/com/sdtool/webcore/rest/DesignRest.java

@@ -8,6 +8,7 @@ import com.sdtool.common.datas.HttpCode;
 import com.sdtool.common.entity.base.ProcessIdItem;
 import com.sdtool.common.entity.base.ProcessStringItem;
 import com.sdtool.common.entity.design.DesignFont;
+import com.sdtool.common.entity.design.DesignOrder;
 import com.sdtool.common.entity.design.DesignTemplate;
 import com.sdtool.common.entity.site.ERPTokenUser;
 import com.sweetfish.net.http.*;
@@ -190,6 +191,45 @@ public class DesignRest extends BaseService {
     }
     //endregion
 
+    //region 设计订单
+    @RestMapping(name = "getPreViewTemplate", auth = true, sort = 20, comment = "传参获取设计模板,供前端预览", methods = {"POST"})
+    @WebApiBean(result = true, type = DesignTemplate.class)
+    public CompletableFuture<RMap> getPreViewTemplate(
+            @RestParam(name = "id", comment = "id") long id,
+            @RestParam(name = "params", comment = "可变参数", required = false) RMap params,
+            @RestParam(name = "outerSessionId", comment = "外部网站的sessionId") String outerSessionId,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<DesignTemplate> result = designService.getDesignTemplateEdit(id, params, outerSessionId, dataSourceId, Long.parseLong(supplierCode));
+                    if (result.isSuccess())
+                        return RMapUtils.successV2(result.getResult(), null, result.getPageFlipper());
+                    else return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                }, getExecutor()
+        );
+    }
+
+    @RestMapping(name = "newDesignOrder", auth = true, sort = 21, comment = "生成设计订单", methods = {"POST"})
+    @WebApiBean(result = true, type = DesignOrder.class)
+    public CompletableFuture<RMap> newDesignOrder(
+            @RestParam(name = "outerSessionId", comment = "外部网站的sessionId") String outerSessionId,
+            @RestBody(comment = "前端处理过的svg") String svgContent,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<DesignOrder> result = designService.newDesignOrder(outerSessionId, svgContent, dataSourceId, Long.parseLong(supplierCode), currentUser);
+                    if (result.isSuccess())
+                        return RMapUtils.successV2(result.getResult(), null, result.getPageFlipper());
+                    else return RMapUtils.error(HttpCode.BAD_REQUEST.value(), result.getRetinfo());
+                }, getExecutor()
+        );
+    }
+    //endregion
+
     //region 系统间转跳传递用户
     @RestMapping(name = "saveCurrentUserTokenInfo", auth = true, sort = 100, comment = "存储当前用户token", methods = {"POST"})
     @WebApiBean(result = true, type = ProcessIdItem.class)

File diff suppressed because it is too large
+ 37 - 0
sdWebOne/src/test/java/TestSVGDom.java