浏览代码

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

Veronique 1 年之前
父节点
当前提交
33158bd551

+ 1 - 0
conf/rediskeys.properties

@@ -176,5 +176,6 @@ redis.designer.design.template.session=sdtool:mall:designer:design:template:sess
 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.pdf.callback.list=sdtool:mall:designer:pdf:callback:list
 redis.designer.design.order.edit=sdtool:mall:designer:design:order:edit
 redis.designer.design.order.imposition=sdtool:mall:designer:design:order:imposition

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

@@ -53,8 +53,8 @@ from $table$
     -- end
   -- end
   -- isNotEmpty userIdentity
-       userIdentity = #{userIdentity}
-    -- end
+     and userIdentity = #{userIdentity}
+  -- end
   -- isNotEmpty keyWord
     and (orderName LIKE #{Like:keyWord})
   -- end
@@ -125,17 +125,19 @@ updateTime = #{updatetime}
 where id = #{id};
 
 -- [addDesignOrder]
-insert into $table$ (id, idTemplate, userIdentity, orderMame,
+insert into $table$ (id, idTemplate, userIdentity, orderName,
 backgroundPath, viewThumbPath, canvasHeight,
 canvasWidth, breedHeight, breedWidth,
-productIdentity, voidFlag, jsonContent,
-createBy, createTime, createTimeLong,
-updateBy, updateTime, updateTimeLong ) values ( #{id}, #{idtemplate}, #{useridentity}, #{ordermame},
+productIdentity, pdfDownloadUrl, voidFlag,
+jsonContent, createBy, createTime,
+createTimeLong, updateBy, updateTime,
+updateTimeLong ) values ( #{id}, #{idtemplate}, #{useridentity}, #{ordername},
 #{backgroundpath}, #{viewthumbpath}, #{canvasheight},
 #{canvaswidth}, #{breedheight}, #{breedwidth},
-#{productidentity}, #{voidflag}, #{jsoncontent},
-#{createby}, #{createtime}, #{createtimelong},
-#{updateby}, #{updatetime}, #{updatetimelong} );
+#{productidentity}, #{pdfdownloadurl}, #{voidflag},
+#{jsoncontent}, #{createby}, #{createtime},
+#{createtimelong}, #{updateby}, #{updatetime},
+#{updatetimelong} );
 
 -- [addDesignOrderItem]
 insert into $table$ (id, idOrder, itemType, locationX,
@@ -159,5 +161,9 @@ updateBy = #{updateby},
 updateTime = #{updatetime}
 where id = #{id};
 
+-- [pdfCallbackDesignOrder]
+update $table$ set pdfDownloadUrl = #{pdfdownloadurl}
+where id = #{id};
+
 -- [deleteDesignOrderItem]
 delete from $table$ where idOrder = #{id};

+ 4 - 0
sdBusiness/src/main/java/com/sdtool/business/dao/DesignDao.java

@@ -87,6 +87,10 @@ public interface DesignDao extends DaoRepository {
     @SqlId(clazz = DesignDao.class, sql = "addDesignOrderItem", table = "deDesignOrderItem", params = {2}, sort = 3)
     void updateDesignOrder(DesignOrder designOrder, List<DesignOrderItem> itemList, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
 
+    @Sharding(databaseShardingStrategy = SupplierDataBaseShardingStrategy.class, tableShardingStrategy = SupplierTableShardingStrategy.class)
+    @DAOMethod(operator = OperatorType.UPDATE, owait = OperatorWait.ASNYC)
+    @SqlId(clazz = DesignDao.class, sql = "pdfCallbackDesignOrder", table = "deDesignOrder", params = {1}, sort = 1)
+    void pdfCallbackDesignOrder(DesignOrder designOrder, @DatabaseShardingBy String dataSourceId, @TableShardingBy Long supplierCode);
     //endregion
 
 }

+ 76 - 5
sdBusiness/src/main/java/com/sdtool/business/service/mall/DesignServiceImpl.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.serializer.SerializerFeature;
 import com.dySweetFishPlugin.redis.RedisService;
 import com.dySweetFishPlugin.sql.TableIdService;
 import com.dySweetFishPlugin.sql.dao.TunaService;
+import com.dySweetFishPlugin.tool.lang.ThreadFactoryWithNamePrefix;
 import com.sdtool.business.dao.DesignDao;
 import com.sdtool.common.api.NoSqlKeysService;
 import com.sdtool.common.api.mall.DesignService;
@@ -46,6 +47,8 @@ import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
 import java.util.*;
 import java.util.List;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
 
 @Local
 @AutoLoad(false)
@@ -84,6 +87,8 @@ public class DesignServiceImpl extends BaseService implements DesignService {
 
     private static final int tempTemplateExpire = 60 * 60 * 2;
 
+    private final ScheduledThreadPoolExecutor pdfCallbackExecutor = new ScheduledThreadPoolExecutor(1, new ThreadFactoryWithNamePrefix("[PDF任务回调线程池]"));
+
     @Override
     public void start(AnyValue config) {
         designDao = tunaService.generate(DesignDao.class);
@@ -91,6 +96,36 @@ public class DesignServiceImpl extends BaseService implements DesignService {
         designContentRoot = appHome + File.separator + "conf" + File.separator + "designContent";
         designOutputRoot = appHome + File.separator + "conf" + File.separator + "designOutput";
         orderContentRoot = appHome + File.separator + "conf" + File.separator + "orderContent";
+
+        long supplierCode = 1000;//写死1000了,没必要为了这个耽误时间
+        String dataSourceId = "erp001";
+        pdfCallbackExecutor.scheduleWithFixedDelay(() -> {
+            String callBackStr = redisService.lpop(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_PDF_CALLBACK_LIST, supplierCode));
+            if (StringUtils.isNotEmpty(callBackStr)) {
+                logger.info("接收到PDF生成回调: " + callBackStr);
+
+                PDFCallbackInfo callbackInfo = jsonConvert.convertFrom(PDFCallbackInfo.class, callBackStr);
+
+                String orderEditStr = redisService.hget(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_EDIT, supplierCode), String.valueOf(callbackInfo.getIdDesignOrder()));
+                String orderImpositionStr = redisService.hget(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_IMPOSITION, supplierCode), String.valueOf(callbackInfo.getIdDesignOrder()));
+
+                DesignOrder orderEdit = jsonConvert.convertFrom(DesignOrder.class, orderEditStr);
+                DesignOrder orderImposition = jsonConvert.convertFrom(DesignOrder.class, orderImpositionStr);
+
+                orderEdit.setPdfDownloadUrl("/output/" + callbackInfo.getPdfFileName());
+                orderImposition.setPdfDownloadUrl("/output/" + callbackInfo.getPdfFileName());
+
+                redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_EDIT, supplierCode), String.valueOf(orderEdit.getId()), orderEdit);
+                redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_IMPOSITION, supplierCode), String.valueOf(orderImposition.getId()), orderImposition);
+
+                designDao.pdfCallbackDesignOrder(orderImposition, dataSourceId, supplierCode);
+            }
+        }, 1, 2, TimeUnit.SECONDS);
+    }
+
+    @Override
+    public void destroy(AnyValue config) {
+        pdfCallbackExecutor.shutdown();
     }
 
     @Override
@@ -431,7 +466,7 @@ public class DesignServiceImpl extends BaseService implements DesignService {
     private DesignOrder convertTemplateToOrder(DesignTemplate designTemplate) {
         DesignOrder designOrder = new DesignOrder();
         designOrder.setIdTemplate(designTemplate.getId());
-        designOrder.setOrderMame("[" + designTemplate.getTemplateName() + "]" + ERPUtils.parseTimeFormat(new Date(), "yyyyMMdd") + "设计订单");
+        designOrder.setOrderName("[" + designTemplate.getTemplateName() + "]" + ERPUtils.parseTimeFormat(new Date(), "yyyyMMddHHmmss") + "设计订单");
         designOrder.setProductIdentity(designTemplate.getProductIdentity());
         designOrder.setJsonContent(designTemplate.getJsonContent());
 
@@ -480,6 +515,12 @@ public class DesignServiceImpl extends BaseService implements DesignService {
             throw new RuntimeException(e);
         }
 
+        //生成订单结构
+        DesignOrder designOrder = convertTemplateToOrder(template);
+        designOrder.setId(tableIdService.getTableIdMulti("deDesignOrder.id", 1, dataSourceId, String.valueOf(supplierCode)));
+        designOrder.setUserIdentity(String.valueOf(currentUser.getId()));
+        DesignOrder.create(designOrder, currentUser.getId());
+
         // 获取 SVG 根元素
         Element rootElement = document.getRootElement();
 
@@ -488,12 +529,42 @@ public class DesignServiceImpl extends BaseService implements DesignService {
         taskInfo.setWidth(rootElement.attributeValue("width").replace("px", ""));
         taskInfo.setSvgPath(fileUrl);
         taskInfo.setSvgFileName(fileName);
+        taskInfo.setIdDesignOrder(designOrder.getId());
 
         redisService.rpush(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_SVG_TASK_LIST, supplierCode), jsonConvert.convertTo(taskInfo));
 
-        //算了别写了没人用
-//        return this.newDesignOrder(template, dataSourceId, supplierCode, currentUser);
-        return RetResult.successT();
+
+        //保存订单的设计文件信息
+        String fileNameJson = orderContentRoot + File.separator + supplierCode +
+                File.separator + designOrder.getId() + ".txt";
+        Path pathJson = Paths.get(fileNameJson);
+
+        String writeContent = "";
+        if (StringUtils.isNotEmpty(designOrder.getJsonContent())) {
+            writeContent = designOrder.getJsonContent();
+        }
+        try {
+            if (!Files.exists(pathJson.getParent())) {
+                Files.createDirectories(pathJson.getParent());
+            }
+            Files.write(pathJson,
+                    Collections.singleton(new StringBuilder(writeContent)),
+                    StandardCharsets.UTF_8,
+                    StandardOpenOption.CREATE,
+                    StandardOpenOption.WRITE,
+                    StandardOpenOption.TRUNCATE_EXISTING);
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+
+        redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_EDIT, supplierCode), String.valueOf(designOrder.getId()), designOrder);
+        convertJsonObjectsToOrder(designOrder, dataSourceId, supplierCode);
+        designOrder.setJsonContent(fileNameJson);
+        redisService.hset(keysService.getRedisKey(RedisKeys.KEY_DESIGNER_DESIGN_ORDER_IMPOSITION, supplierCode), String.valueOf(designOrder.getId()), designOrder);
+
+        designDao.addDesignOrder(designOrder, designOrder.getItemList(), dataSourceId, supplierCode);
+
+        return RetResult.<DesignOrder>successT().result(designOrder);
     }
 
     @Override
@@ -543,7 +614,7 @@ public class DesignServiceImpl extends BaseService implements DesignService {
 
         designOrder.setIdTemplate(redisOrder.getIdTemplate());
         designOrder.setUserIdentity(redisOrder.getUserIdentity());
-        designOrder.setOrderMame(redisOrder.getOrderMame());
+        designOrder.setOrderName(redisOrder.getOrderName());
         designOrder.setProductIdentity(redisOrder.getProductIdentity());
 
         DesignOrder.update(designOrder, currentUser.getId());

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

@@ -476,6 +476,7 @@ public class RedisKeys {
     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";
+    public static final String KEY_DESIGNER_PDF_CALLBACK_LIST = "redis.designer.pdf.callback.list";
     //endregion
 
     private RedisKeys() {

+ 19 - 7
sdCommon/src/main/java/com/sdtool/common/entity/design/DesignOrder.java

@@ -19,13 +19,13 @@ public class DesignOrder extends BaseEntity {
     @Comment("模板id")
     private long idTemplate;
 
-    @Comment("用户id")
     @RColumn("useridentity")
+    @Comment("用户id")
     private String userIdentity;
 
-    @RColumn("ordermame")
+    @RColumn("ordername")
     @Comment("订单名称")
-    private String orderMame;
+    private String orderName;
 
     @RColumn("backgroundpath")
     @Comment("背景图片")
@@ -55,6 +55,10 @@ public class DesignOrder extends BaseEntity {
     @Comment("产品id,暂时手传")
     private String productIdentity;
 
+    @Comment("生成的pdf下载地址")
+    @RColumn("pdfdownloadurl")
+    private String pdfDownloadUrl;
+
     @RColumn("voidflag")
     @Comment("")
     private int voidFlag;
@@ -90,12 +94,12 @@ public class DesignOrder extends BaseEntity {
         this.idTemplate = idTemplate;
     }
 
-    public String getOrderMame() {
-        return orderMame;
+    public String getOrderName() {
+        return orderName;
     }
 
-    public void setOrderMame(String orderMame) {
-        this.orderMame = orderMame;
+    public void setOrderName(String orderName) {
+        this.orderName = orderName;
     }
 
     public String getBackgroundPath() {
@@ -177,4 +181,12 @@ public class DesignOrder extends BaseEntity {
     public void setItemList(List<DesignOrderItem> itemList) {
         this.itemList = itemList;
     }
+
+    public String getPdfDownloadUrl() {
+        return pdfDownloadUrl;
+    }
+
+    public void setPdfDownloadUrl(String pdfDownloadUrl) {
+        this.pdfDownloadUrl = pdfDownloadUrl;
+    }
 }

+ 23 - 0
sdCommon/src/main/java/com/sdtool/common/entity/design/PDFCallbackInfo.java

@@ -0,0 +1,23 @@
+package com.sdtool.common.entity.design;
+
+public class PDFCallbackInfo {
+    private long idDesignOrder;
+
+    private String pdfFileName;
+
+    public long getIdDesignOrder() {
+        return idDesignOrder;
+    }
+
+    public void setIdDesignOrder(long idDesignOrder) {
+        this.idDesignOrder = idDesignOrder;
+    }
+
+    public String getPdfFileName() {
+        return pdfFileName;
+    }
+
+    public void setPdfFileName(String pdfFileName) {
+        this.pdfFileName = pdfFileName;
+    }
+}

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

@@ -9,6 +9,8 @@ public class SVGTaskInfo {
 
     private String svgFileName;
 
+    private long idDesignOrder;
+
     public String getWidth() {
         return width;
     }
@@ -40,4 +42,12 @@ public class SVGTaskInfo {
     public void setSvgFileName(String svgFileName) {
         this.svgFileName = svgFileName;
     }
+
+    public long getIdDesignOrder() {
+        return idDesignOrder;
+    }
+
+    public void setIdDesignOrder(long idDesignOrder) {
+        this.idDesignOrder = idDesignOrder;
+    }
 }

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

@@ -192,6 +192,25 @@ public class DesignRest extends BaseService {
     //endregion
 
     //region 设计订单
+    @RestMapping(name = "queryDesignOrders", auth = true, sort = 22, comment = "获取设计模板", methods = {"POST"})
+    @WebApiBean(result = true, type = DesignOrder.class)
+    public CompletableFuture<RMap> queryDesignOrders(
+            @RestParam(name = "params", comment = "搜索内容", required = false) RMap searchData,
+            @RestParam(name = "page", comment = "分页信息", required = false) PageFlipper pageFlipper,
+            @RestParam(name = "orderBy", comment = "排序", required = false) String orderBy,
+            @RestParam(name = "&", comment = "登录用户,无需传入") ERPTokenUser currentUser,
+            @RestHeader(name = ERPHeader.HTTPHEADER_DATASOURCE) String dataSourceId,
+            @RestHeader(name = ERPHeader.HTTPHEADER_SUPPLIER) String supplierCode) {
+        return CompletableFuture.supplyAsync(
+                () -> {
+                    RetResult<List<DesignOrder>> result = designService.queryDesignOrders(searchData, pageFlipper, 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()
+        );
+    }
+
     @RestMapping(name = "getPreViewTemplate", auth = true, sort = 20, comment = "传参获取设计模板,供前端预览", methods = {"POST"})
     @WebApiBean(result = true, type = DesignTemplate.class)
     public CompletableFuture<RMap> getPreViewTemplate(