shc 10 месяцев назад
Родитель
Сommit
3d8dda5889
18 измененных файлов с 726 добавлено и 34 удалено
  1. 32 0
      doc/db/32wm_pkg_contract.sql
  2. 35 0
      doc/db/33sys_ent_cont_info.sql
  3. 32 0
      doc/db/34wm_pkg_tt_qty.sql
  4. 10 0
      hnqz-common/hnqz-common-core/pom.xml
  5. 122 0
      hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/util/PDFUtils.java
  6. 42 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysEntContractInfo.java
  7. 34 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPackageContract.java
  8. 36 0
      hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPackageTaskTypeQty.java
  9. 18 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/event/PackageContractEvent.java
  10. 200 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/PackageContractEventListener.java
  11. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysEntContractInfoMapper.java
  12. 15 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPackageContractMapper.java
  13. 24 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPackageTaskTypeQtyMapper.java
  14. 10 1
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysFileService.java
  15. 13 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPackageContractService.java
  16. 12 2
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysFileServiceImpl.java
  17. 21 0
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPackageContractServiceImpl.java
  18. 55 31
      hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/OsEnvUtils.java

+ 32 - 0
doc/db/32wm_pkg_contract.sql

@@ -0,0 +1,32 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_pkg_contract
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_pkg_contract`;
+CREATE TABLE `wm_pkg_contract`
+(
+    `cont_id`     INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '合同ID',
+    `pkg_id`      INT UNSIGNED                NOT NULL COMMENT '包ID',
+    `file_id`     INT UNSIGNED                NOT NULL COMMENT '合同地址',
+    `create_time` DATETIME                    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`cont_id`) USING BTREE,
+    KEY `idx_pid` (`pkg_id`) USING BTREE,
+    KEY `idx_ctime` (`create_time`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='积分包合同';
+
+
+-- ----------------------------
+-- Records of wm_pkg_contract
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 35 - 0
doc/db/33sys_ent_cont_info.sql

@@ -0,0 +1,35 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for sys_ent_cont_info
+-- ----------------------------
+DROP TABLE IF EXISTS `sys_ent_cont_info`;
+CREATE TABLE `sys_ent_cont_info`
+(
+    `info_id`           INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '信息',
+    `ent_id`            INT                         NOT NULL COMMENT '企业ID',
+    `ent_name`          VARCHAR(64)                 NULL COMMENT '企业名称',
+    `ent_addr`          VARCHAR(255)                NULL COMMENT '企业地址',
+    `ent_resp_name`     VARCHAR(64)                 NULL COMMENT '企业法人',
+    `ent_contact_name`  VARCHAR(64)                 NULL COMMENT '企业联系人',
+    `ent_contact_phone` VARCHAR(64)                 NULL COMMENT '企业联系电话',
+    `create_time`       DATETIME                    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`info_id`) USING BTREE,
+    KEY `idx_eid` (`ent_id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='企业合同信息';
+
+
+-- ----------------------------
+-- Records of sys_ent_cont_info
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 32 - 0
doc/db/34wm_pkg_tt_qty.sql

@@ -0,0 +1,32 @@
+USE `cnbg_20240511_001`;
+
+SET NAMES utf8mb4;
+SET FOREIGN_KEY_CHECKS = 0;
+
+-- ----------------------------
+-- Table structure for wm_pkg_tt_qty
+-- ----------------------------
+DROP TABLE IF EXISTS `wm_pkg_tt_qty`;
+CREATE TABLE `wm_pkg_tt_qty`
+(
+    `record_id`   INT UNSIGNED AUTO_INCREMENT NOT NULL COMMENT '信息',
+    `pkg_id`      INT                         NOT NULL COMMENT '企业ID',
+    `tt_id`       INT                         NOT NULL COMMENT '企业名称',
+    `qty`         VARCHAR(64)                 NOT NULL COMMENT '企业法人',
+    `create_time` DATETIME                    NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`record_id`) USING BTREE,
+    KEY `idx_pid` (`pkg_id`) USING BTREE
+) ENGINE = InnoDB
+  DEFAULT CHARSET = utf8mb4
+  COLLATE = utf8mb4_general_ci
+  ROW_FORMAT = DYNAMIC COMMENT ='企业合同信息';
+
+
+-- ----------------------------
+-- Records of wm_pkg_tt_qty
+-- ----------------------------
+BEGIN;
+COMMIT;
+
+
+SET FOREIGN_KEY_CHECKS = 1;

+ 10 - 0
hnqz-common/hnqz-common-core/pom.xml

@@ -76,5 +76,15 @@
             <groupId>com.baomidou</groupId>
             <artifactId>mybatis-plus-extension</artifactId>
         </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itextpdf</artifactId>
+            <version>5.5.13.3</version>
+        </dependency>
+        <dependency>
+            <groupId>com.itextpdf</groupId>
+            <artifactId>itext-asian</artifactId>
+            <version>5.2.0</version>
+        </dependency>
     </dependencies>
 </project>

+ 122 - 0
hnqz-common/hnqz-common-core/src/main/java/com/qunzhixinxi/hnqz/common/core/util/PDFUtils.java

@@ -0,0 +1,122 @@
+package com.qunzhixinxi.hnqz.common.core.util;
+
+import cn.hutool.core.date.DatePattern;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.AcroFields;
+import com.itextpdf.text.pdf.BaseFont;
+import com.itextpdf.text.pdf.PdfCopy;
+import com.itextpdf.text.pdf.PdfImportedPage;
+import com.itextpdf.text.pdf.PdfReader;
+import com.itextpdf.text.pdf.PdfStamper;
+import lombok.experimental.UtilityClass;
+
+import java.io.ByteArrayOutputStream;
+import java.io.FileOutputStream;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.UUID;
+
+/**
+ * pdf工具
+ *
+ * @author jimmy
+ * @version 1.0.0
+ * @date 2024/04/14 12:33
+ */
+@UtilityClass
+public final class PdfUtils {
+
+    public static void resumeGenerate(String templatePath, String outFilePath, String font, Map<String, String> params) {
+
+        PdfReader reader;
+        FileOutputStream out;
+        ByteArrayOutputStream bos;
+        PdfStamper stamper;
+        try {
+
+            out = new FileOutputStream(outFilePath);
+            reader = new PdfReader(templatePath);
+            bos = new ByteArrayOutputStream();
+            stamper = new PdfStamper(reader, bos);
+            // 获取pdf表单合集
+            AcroFields form = stamper.getAcroFields();
+
+            // 中文字体
+            BaseFont baseFont = BaseFont.createFont(font + ",0", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
+            form.addSubstitutionFont(baseFont);
+
+            for (Map.Entry<String, String> entry : params.entrySet()) {
+                form.setField(entry.getKey(), entry.getValue());
+            }
+
+            // pdf不能编辑
+            stamper.setFormFlattening(true);
+            stamper.close();
+
+            // 文档对象
+            Document doc = new Document(PageSize.A4);
+            PdfCopy copy = new PdfCopy(doc, out);
+            doc.open();
+
+            for (int i = 1; i <= 12; i++) {
+                PdfImportedPage importedPage = copy.getImportedPage(new PdfReader(bos.toByteArray()), i);
+                copy.addPage(importedPage);
+            }
+            doc.close();
+
+
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+
+    }
+
+
+    public static void main(String[] args) {
+
+        String templatePath = "/Users/jimmy/Documents/pkg_tmpl_v19.pdf";
+        String outFilePath = "/Users/jimmy/Desktop/temp/" + UUID.randomUUID() + ".pdf";
+        Map<String, String> params = new HashMap<>();
+        params.put("party_a_name", "中国生物水痘生产企业");
+        params.put("party_a_address", "北京市朝阳区双桥路123号中国生物基地10-12号");
+        params.put("party_a_resp_name", "张三");
+        params.put("party_a_contact_name", "买还买提~阿卜杜拉~买买提");
+        params.put("party_a_contact_phone", "13388889999");
+
+        params.put("party_b_name", "长春生物药品科技有限公司");
+        params.put("party_b_address", "吉林省长春市光驱路123号生物医药基地123楼");
+        params.put("party_b_resp_name", "里斯");
+        params.put("party_b_contact_name", "王五");
+        params.put("party_b_contact_phone", "18877778888");
+
+        params.put("issue_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(LocalDate.of(2024, 1, 1)));
+        params.put("expiry_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(LocalDate.of(2024, 3, 31)));
+
+        params.put("s1_name", "市场信息手机");
+        params.put("s1_qty", "1");
+        params.put("s1_price", "3000");
+        params.put("s1_rate", "19%");
+
+        params.put("s2_name", "会议举办");
+        params.put("s2_qty", "1000");
+        params.put("s2_price", "30000");
+        params.put("s2_rate", "100%");
+
+        params.put("s3_name", "会议举办");
+        params.put("s3_qty", "1000");
+        params.put("s3_price", "30000");
+        params.put("s3_rate", "100%");
+
+        params.put("s4_name", "会议举办");
+        params.put("s4_qty", "1000");
+        params.put("s4_price", "30000");
+        params.put("s4_rate", "100%");
+
+
+        params.put("sign_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(LocalDate.now()));
+        resumeGenerate(templatePath, outFilePath, "/Users/jimmy/Desktop/SimSun.ttc", params);
+    }
+}

+ 42 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/SysEntContractInfo.java

@@ -0,0 +1,42 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 企业合同信息
+ *
+ * @author jimmy
+ * @date 2024-08-17 23:04
+ */
+@Data
+@TableName(value = "sys_ent_cont_info")
+public class SysEntContractInfo implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "info_id", type = IdType.AUTO)
+    private Integer infoId;
+
+    @TableField(value = "ent_id")
+    private Integer deptId;
+
+    private String entName;
+
+    @TableField(value = "ent_addr")
+    private String address;
+
+    @TableField(value = "ent_resp_name")
+    private String respName;
+
+    @TableField(value = "ent_contact_name")
+    private String contactName;
+
+    @TableField(value = "ent_contact_phone")
+    private String contactPhone;
+}

+ 34 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPackageContract.java

@@ -0,0 +1,34 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 积分包合同
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:25
+ */
+@Data
+@TableName(value = "wm_pkg_contract")
+public class WmPackageContract implements Serializable {
+
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(value = "cont_id", type = IdType.AUTO)
+    private String contractId;
+
+    @TableField(value = "pkg_id")
+    private Integer packageId;
+
+    private Integer fileId;
+
+    private LocalDateTime createTime;
+}

+ 36 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPackageTaskTypeQty.java

@@ -0,0 +1,36 @@
+package com.qunzhixinxi.hnqz.admin.api.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 积分包任务类型限制
+ *
+ * @author jimmy
+ * @date 2024-08-17 23:29
+ */
+@Data
+@TableName(value = "wm_pkg_tt_qty")
+public class WmPackageTaskTypeQty implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer recordId;
+
+    @TableField(value = "pkg_id")
+    private Integer packageId;
+
+    @TableField(value = "tt_id")
+    private Integer taskTypeId;
+
+    private Integer qty;
+
+    private LocalDateTime createTime;
+}

+ 18 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/event/PackageContractEvent.java

@@ -0,0 +1,18 @@
+package com.qunzhixinxi.hnqz.admin.event;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+
+/**
+ * 积分包合同事件
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:31
+ */
+@Getter
+@AllArgsConstructor
+public class PackageContractEvent {
+
+    private Integer packageId;
+
+}

+ 200 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/PackageContractEventListener.java

@@ -0,0 +1,200 @@
+package com.qunzhixinxi.hnqz.admin.listener;
+
+import cn.hutool.core.date.DatePattern;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysEntContractInfo;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEntDrugtable;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageContract;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageTaskTypeQty;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskType;
+import com.qunzhixinxi.hnqz.admin.event.PackageContractEvent;
+import com.qunzhixinxi.hnqz.admin.mapper.SysEntContractInfoMapper;
+import com.qunzhixinxi.hnqz.admin.mapper.WmPackageTaskTypeQtyMapper;
+import com.qunzhixinxi.hnqz.admin.service.SysFileService;
+import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntDrugtableService;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageContractService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
+import com.qunzhixinxi.hnqz.admin.util.OsEnvUtils;
+import com.qunzhixinxi.hnqz.common.core.util.PdfUtils;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.context.event.EventListener;
+import org.springframework.core.annotation.Order;
+import org.springframework.mock.web.MockMultipartFile;
+import org.springframework.scheduling.annotation.Async;
+
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.time.LocalDateTime;
+import java.time.format.DateTimeFormatter;
+import java.util.Arrays;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 积分包合同生成
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:33
+ */
+@Slf4j
+@AllArgsConstructor
+@Configuration
+public class PackageContractEventListener {
+
+    @Getter
+    @AllArgsConstructor
+    private enum MAH {
+
+        ENT_1("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_2("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_3("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_4("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_5("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_6("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999"),
+        ENT_7("中国生物水痘生产企业", "北京市朝阳区双桥路123号中国生物基地10-12号", "张三", "买还买提", "13388889999");
+
+
+        public static MAH get(String entName) {
+            return Arrays.stream(MAH.values()).filter(ent -> ent.name.equals(entName)).findFirst().orElse(null);
+        }
+
+
+        private final String name;
+        private final String address;
+        private final String respName;
+        private final String contractName;
+        private final String contractPhone;
+    }
+
+
+    private final WmPackageContractService packageContractService;
+    private final SysFileService fileService;
+    private final WmScorePackageService packageService;
+    private final WmDaDrugEntDrugtableService drugEntDrugtableService;
+    private final SysEntContractInfoMapper entContractInfoMapper;
+    private final WmPackageTaskTypeQtyMapper packageTaskTypeQtyMapper;
+    private final WmTaskTypeService taskTypeService;
+
+
+    /**
+     * 推送事件
+     *
+     * @param event 事件
+     */
+    @Async
+    @Order
+    @EventListener(PackageContractEvent.class)
+    public void pushEvent(PackageContractEvent event) throws IOException {
+
+        Integer pkgId = event.getPackageId();
+        LocalDateTime now = LocalDateTime.now();
+
+        log.info("生成市场服务包(id:{})合同", pkgId);
+
+        // 获取环境变量
+        Map<String, String> envPaths = OsEnvUtils.getEachEnvPaths();
+
+        // 生成合同
+        String templatePath = envPaths.get(OsEnvUtils.TargetFile.TEMPLATE.getName()) + "pkg_tmpl_v19.pdf";
+        final String outFilePath =
+                // 根据环境获取临时目录
+                envPaths.get(OsEnvUtils.TargetFile.CONTACT.getName())
+                        // 拼接包ID
+                        + "PID" + pkgId
+                        // 拼接时间
+                        + "_" + now.format(DateTimeFormatter.ofPattern(DatePattern.PURE_DATETIME_PATTERN))
+                        + ".pdf";
+
+        Map<String, String> params = buildContractParams(pkgId, now);
+
+        PdfUtils.resumeGenerate(templatePath, outFilePath, envPaths.get(OsEnvUtils.TargetFile.FONT.getName()) + "SimSun.ttc", params);
+
+
+        // 上传到oss
+        File contractPdf = new File(outFilePath);
+        MockMultipartFile multipartFile = new MockMultipartFile("file", contractPdf.getName(), null, Files.newInputStream(contractPdf.toPath()));
+        Map<String, String> uploaded = fileService.upload(multipartFile);
+        String fileId = uploaded.get("fileId");
+
+        // 保存合同对象
+        WmPackageContract pc = new WmPackageContract();
+        pc.setPackageId(pkgId);
+        pc.setFileId(Integer.valueOf(fileId));
+        pc.setCreateTime(now);
+
+        packageContractService.save(pc);
+
+    }
+
+    private Map<String, String> buildContractParams(Integer pkgId, LocalDateTime now) {
+
+        Map<String, String> params = new HashMap<>(29);
+
+        // 获取积分包
+        WmScorePackage pkg = packageService.getById(pkgId.toString());
+
+        // 通过药品获取甲方信息
+        String[] drugtable = pkg.getDrugtable();
+        List<WmDaDrugEntDrugtable> drugtables = drugEntDrugtableService.listByIds(Arrays.stream(drugtable).collect(Collectors.toSet()));
+        String drugEntName = drugtables.get(0).getDrugEntName();
+        MAH mah = MAH.get(drugEntName);
+
+        // 甲方信息
+        params.put("party_a_name", mah.getName());
+        params.put("party_a_address", mah.getAddress());
+        params.put("party_a_resp_name", mah.getRespName());
+        params.put("party_a_contact_name", mah.getContractName());
+        params.put("party_a_contact_phone", mah.getContractPhone());
+
+
+        // 乙方信息
+        SysEntContractInfo contractInfo = entContractInfoMapper.selectById(pkg.getSendPackageDeptId());
+        params.put("party_b_name", contractInfo.getEntName());
+        params.put("party_b_address", contractInfo.getAddress());
+        params.put("party_b_resp_name", contractInfo.getRespName());
+        params.put("party_b_contact_name", contractInfo.getContactName());
+        params.put("party_b_contact_phone", contractInfo.getContactPhone());
+
+        // 合同岂止时间
+        params.put("issue_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(pkg.getCreateTime()));
+        params.put("expiry_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(pkg.getEndTime()));
+
+
+        // 任务数量统计
+
+        List<WmPackageTaskTypeQty> qtyList = packageTaskTypeQtyMapper.listByPackageId(pkgId);
+        int total = qtyList.stream().mapToInt(WmPackageTaskTypeQty::getQty).sum();
+        Set<Integer> ttIds = qtyList.stream().map(WmPackageTaskTypeQty::getTaskTypeId).collect(Collectors.toSet());
+
+        List<WmTaskType> list = taskTypeService.list(Wrappers.<WmTaskType>lambdaQuery().in(WmTaskType::getId, ttIds));
+        Map<String, WmTaskType> collect = list.stream().collect(Collectors.toMap(WmTaskType::getId, Function.identity()));
+
+
+        for (int i = 1, size = qtyList.size() + 1; i <= size; i++) {
+            String prefix = "s" + i;
+            WmPackageTaskTypeQty qty = qtyList.get(i);
+            WmTaskType taskType = collect.get(qty.getTaskTypeId().toString());
+
+            Integer count = qty.getQty();
+            params.put(prefix + "_name", taskType.getTaskTypeName());
+            params.put(prefix + "_qty", count.toString());
+            params.put(prefix + "_price", taskType.getScore().toString());
+
+
+            params.put(prefix + "_rate", String.format(".2%f%%", count.doubleValue() / total));
+        }
+
+        params.put("sign_date", DateTimeFormatter.ofPattern(DatePattern.CHINESE_DATE_PATTERN).format(now.toLocalDate()));
+        return params;
+    }
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/SysEntContractInfoMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysEntContractInfo;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 企业合同信息
+ *
+ * @author jimmy
+ * @date 2024-08-17 23:03
+ */
+@Mapper
+public interface SysEntContractInfoMapper extends BaseMapper<SysEntContractInfo> {
+}

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPackageContractMapper.java

@@ -0,0 +1,15 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageContract;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 积分包合同mapper
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:28
+ */
+@Mapper
+public interface WmPackageContractMapper extends BaseMapper<WmPackageContract> {
+}

+ 24 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPackageTaskTypeQtyMapper.java

@@ -0,0 +1,24 @@
+package com.qunzhixinxi.hnqz.admin.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageTaskTypeQty;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+/**
+ * 积分包任务类型数量mapper
+ *
+ * @author jimmy
+ * @date 2024-08-17 23:31
+ */
+@Mapper
+public interface WmPackageTaskTypeQtyMapper extends BaseMapper<WmPackageTaskTypeQty> {
+
+
+    default List<WmPackageTaskTypeQty> listByPackageId(Integer packageId) {
+        return this.selectList(Wrappers.<WmPackageTaskTypeQty>lambdaQuery().eq(WmPackageTaskTypeQty::getPackageId, packageId));
+    }
+
+}

+ 10 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/SysFileService.java

@@ -27,6 +27,15 @@ public interface SysFileService extends IService<SysFile> {
      */
     R<Map<String, String>> uploadFile(MultipartFile file);
 
+
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return 上传结果
+     */
+    Map<String, String> upload(MultipartFile file);
+
     /**
      * 上传文件
      *
@@ -56,6 +65,6 @@ public interface SysFileService extends IService<SysFile> {
      */
     Boolean deleteFile(Long id);
 
-    public String uploadImgByByte(InputStream inputStream);
+    String uploadImgByByte(InputStream inputStream);
 
 }

+ 13 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPackageContractService.java

@@ -0,0 +1,13 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageContract;
+
+/**
+ * 积分包合同服务
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:29
+ */
+public interface WmPackageContractService extends IService<WmPackageContract> {
+}

+ 12 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/SysFileServiceImpl.java

@@ -58,7 +58,17 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
      */
     @Override
     public R<Map<String, String>> uploadFile(MultipartFile file) {
+        return R.ok(upload(file));
+    }
 
+    /**
+     * 上传文件
+     *
+     * @param file 文件
+     * @return 上传结果
+     */
+    @Override
+    public Map<String, String> upload(MultipartFile file) {
         // 判断是否有重名的操作
         String fileName = IdUtil.simpleUUID() + StrPool.DOT + FileUtil.extName(file.getOriginalFilename());
         Map<String, String> resultMap = new HashMap<>(5);
@@ -76,9 +86,9 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
 
         } catch (Exception e) {
             log.error("上传失败", e);
-            return R.failed(e.getLocalizedMessage());
+            throw new RuntimeException(e.getLocalizedMessage());
         }
-        return R.ok(resultMap);
+        return resultMap;
     }
 
 

+ 21 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmPackageContractServiceImpl.java

@@ -0,0 +1,21 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageContract;
+import com.qunzhixinxi.hnqz.admin.mapper.WmPackageContractMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageContractService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+/**
+ * 积分包合同服务实现
+ *
+ * @author jimmy
+ * @date 2024-08-17 21:29
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmPackageContractServiceImpl extends ServiceImpl<WmPackageContractMapper, WmPackageContract> implements WmPackageContractService {
+}

+ 55 - 31
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/util/OsEnvUtils.java

@@ -1,5 +1,9 @@
 package com.qunzhixinxi.hnqz.admin.util;
 
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.experimental.UtilityClass;
+
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Properties;
@@ -12,37 +16,57 @@ import java.util.Properties;
  * @date 2021-04-16
  * @since ver.1.0.0
  */
+@UtilityClass
 public final class OsEnvUtils {
 
-	private OsEnvUtils(){}
-
-	/**
-	 * 获取系统名称
-	 * @return 系统名称
-	 */
-	public static String getOSName(){
-		Properties props = System.getProperties(); // 获得系统属性集
-		String osName = props.getProperty("os.name").toLowerCase(); // 操作系统名称
-		return osName;
-	}
-
-	/**
-	 * 根据环境获取不用的路径
-	 *
-	 * @return 路径map
-	 */
-	public static Map<String, Object> getEachEnvPaths() {
-		String osName = getOSName();
-		Map<String, Object> pathMap = new HashMap<String, Object>();
-		if (osName.contains("linux") || osName.contains("unix")) {
-			pathMap.put("EXCEL_FILE_PATH","/excel/");
-		}
-		if (osName.contains("mac")) {
-			pathMap.put("EXCEL_FILE_PATH","/Users/jimmy/Desktop/excel/");
-		}
-		if (osName.contains("windows")) {
-			pathMap.put("EXCEL_FILE_PATH","D:\\");
-		}
-		return pathMap;
-	}
+    @Getter
+    @AllArgsConstructor
+    public enum TargetFile {
+        FONT("font"),
+        TEMPLATE("tmpl"),
+        EXCEL("EXCEL_FILE_PATH"),
+        CONTACT("pkg_cont");
+
+        private final String name;
+    }
+
+    /**
+     * 获取系统名称
+     *
+     * @return 系统名称
+     */
+    public static String getOSName() {
+        Properties props = System.getProperties(); // 获得系统属性集
+        return props.getProperty("os.name").toLowerCase();
+    }
+
+
+    /**
+     * 根据环境获取不用的路径
+     *
+     * @return 路径map
+     */
+    public static Map<String, String> getEachEnvPaths() {
+        String osName = getOSName();
+        Map<String, String> pathMap = new HashMap<>(2);
+        if (osName.contains("linux") || osName.contains("unix")) {
+            pathMap.put(TargetFile.EXCEL.getName(), "/excel/");
+            pathMap.put(TargetFile.FONT.getName(), "/excel/");
+            pathMap.put(TargetFile.CONTACT.getName(), "~/");
+            pathMap.put(TargetFile.TEMPLATE.getName(), "~/");
+        }
+        if (osName.contains("mac")) {
+            pathMap.put(TargetFile.EXCEL.getName(), "~/");
+            pathMap.put(TargetFile.FONT.getName(), "~/");
+            pathMap.put(TargetFile.CONTACT.getName(), "~/");
+            pathMap.put(TargetFile.TEMPLATE.getName(), "~/");
+        }
+        if (osName.contains("windows")) {
+            pathMap.put(TargetFile.EXCEL.getName(), "D:\\");
+            pathMap.put(TargetFile.FONT.getName(), "D:\\");
+            pathMap.put(TargetFile.CONTACT.getName(), "D:\\");
+            pathMap.put(TargetFile.TEMPLATE.getName(), "D:\\");
+        }
+        return pathMap;
+    }
 }