shc před 1 rokem
rodič
revize
c7c5ccaa4b

+ 19 - 11
doc/db/24wm_pkg_rdp.sql

@@ -9,20 +9,28 @@ SET FOREIGN_KEY_CHECKS = 0;
 DROP TABLE IF EXISTS `wm_pkg_rdp`;
 CREATE TABLE `wm_pkg_rdp`
 (
-    `rdp_id`      BIGINT UNSIGNED AUTO_INCREMENT     NOT NULL COMMENT '主键ID',
-    `pkg_id`      BIGINT UNSIGNED                    NOT NULL COMMENT '包ID',
-    `rdp_res`     JSON                               NULL COMMENT '兑付结果',
-    `act_mark`    INT UNSIGNED                       NOT NULL COMMENT '实际得分',
-    `total_mark`  INT UNSIGNED                       NOT NULL COMMENT '满分',
-    `create_by`   VARCHAR(32)                        NOT NULL COMMENT '创建人',
-    `update_by`   VARCHAR(32)                        NOT NULL COMMENT '更新人',
-    `create_time` DATETIME DEFAULT CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
-    `update_time` DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE NOT NULL COMMENT '更新时间',
-    PRIMARY KEY `pk_id` (`rdp_id`) USING BTREE
+    `notice_id`      BIGINT UNSIGNED AUTO_INCREMENT                                 NOT NULL COMMENT '通知ID',
+    `pkg_id`         BIGINT UNSIGNED                                                NOT NULL COMMENT '积分包ID',
+    `step`           INT(1)                                                         NOT NULL COMMENT '步进',
+    `rdp_res`        JSON                                                           NULL COMMENT '通知信息',
+    `from_id`        BIGINT UNSIGNED                                                NOT NULL COMMENT '发起企业ID',
+    `to_id`          BIGINT UNSIGNED                                                NOT NULL COMMENT '目标企业ID',
+    `cur_rdp_score`  BIGINT UNSIGNED                                                NOT NULL COMMENT '本次兑付分值',
+    `cur_rdp_rate`   VARCHAR(32)                                                    NOT NULL COMMENT '本次兑付比例',
+    `cur_rdp_weight` VARCHAR(32)                                                    NOT NULL COMMENT '本次兑付权重',
+    `notice_state`   VARCHAR(32)                                                    NOT NULL COMMENT '通知状态',
+    `accept`         TINYINT(1)                                                     NULL COMMENT '接受结果',
+    `accept_remarks` VARCHAR(512)                                                   NULL COMMENT '接受说明',
+    `accept_time`    DATETIME                                                       NULL COMMENT '接受时间',
+    `create_by`      VARCHAR(32)                                                    NOT NULL COMMENT '创建人',
+    `update_by`      VARCHAR(32)                                                    NOT NULL COMMENT '更新人',
+    `create_time`    DATETIME DEFAULT CURRENT_TIMESTAMP                             NOT NULL COMMENT '创建时间',
+    `update_time`    DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP NOT NULL COMMENT '创建时间',
+    PRIMARY KEY `pk_id` (`notice_id`) USING BTREE
 ) ENGINE = InnoDB
   DEFAULT CHARSET = utf8mb4
   COLLATE = utf8mb4_general_ci
-  ROW_FORMAT = DYNAMIC COMMENT ='执行包兑付凭证';
+  ROW_FORMAT = DYNAMIC COMMENT ='执行包兑付通知';
 
 
 -- ----------------------------

+ 76 - 6
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmPkgDTO.java

@@ -1,11 +1,17 @@
 package com.qunzhixinxi.hnqz.admin.api.dto;
 
+import com.qunzhixinxi.hnqz.admin.api.model.WmPkgRedemptionNoticeItemModel;
 import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
 import lombok.AccessLevel;
 import lombok.Data;
 import lombok.NoArgsConstructor;
 
+import javax.validation.constraints.Max;
+import javax.validation.constraints.Min;
 import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.NotEmpty;
+import javax.validation.constraints.NotNull;
+import java.util.List;
 
 /**
  * 积分包操作dto
@@ -17,13 +23,77 @@ import javax.validation.constraints.NotBlank;
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class WmPkgDTO {
 
-	@Data
-	public static class OnPkgPickup {
+    @Data
+    public static class OnPkgPickup {
 
-		@NotBlank(message = "积分包ID必填")
-		private String pkgId;
+        @NotBlank(message = "积分包ID必填")
+        private String pkgId;
 
-		private WmQuizResultModel[] quizResults;
+        private WmQuizResultModel[] quizResults;
 
-	}
+    }
+
+    @Data
+    public static class OnRedemptionNoticeCreate {
+
+        @NotNull(message = "执行包ID必填")
+        private Integer packageId;
+
+        @NotNull(message = "通知步进值必填")
+        @Max(value = 3, message = "步进值最大为${value}")
+        @Min(value = 1, message = "步进值最小为${value}")
+        private Integer step;
+
+        @NotNull(message = "发起方ID必填")
+        private Integer fromEntId;
+
+        @NotNull(message = "接收方ID必填")
+        private Integer toEntId;
+
+        @NotEmpty(message = "通知项必填")
+        private List<WmPkgRedemptionNoticeItemModel> items;
+
+        @NotNull(message = "本次兑付分值必填")
+        private Long currentRedemptionScore;
+
+        @NotBlank(message = "本次兑付比例必填")
+        private String currentRedemptionRate;
+
+        @NotBlank(message = "本次兑付权重必填")
+        private String currentRedemptionWeight;
+
+    }
+
+    @Data
+    public static class OnRedemptionNoticePage {
+
+        @NotNull(message = "页码必填")
+        @Min(value = 1, message = "页码最小为{value}")
+        private Integer current;
+
+        @NotNull(message = "分页数量必填")
+        @Min(value = 10, message = "分页数量最小为{value}")
+        @Max(value = 100, message = "分页数量最大为{value}")
+        private Integer size;
+    }
+
+    @Data
+    public static class OnNoticeRead {
+
+        @NotNull(message = "兑付通知必填")
+        private Integer noticeId;
+    }
+
+    @Data
+    public static class OnAcceptNotice {
+
+        @NotNull(message = "兑付通知必填")
+        private Integer noticeId;
+
+        @NotBlank(message = "确认结果必填")
+        private String state;
+
+        @NotBlank(message = "确认信息必填")
+        private String remarks;
+    }
 }

+ 89 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmPackageRedemptionNotice.java

@@ -0,0 +1,89 @@
+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 com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
+import com.qunzhixinxi.hnqz.admin.api.model.WmPkgRedemptionNoticeItemModel;
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.Getter;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+
+/**
+ * 执行包兑付通知
+ *
+ * @author jimmy
+ * @date 13/07/2024 17:55
+ */
+@Data
+@TableName(value = "wm_pkg_rdp", autoResultMap = true)
+public class WmPackageRedemptionNotice implements Serializable {
+    private static final long serialVersionUID = 4760688421562936218L;
+
+    @TableId(type = IdType.AUTO)
+    private Integer noticeId;
+
+    @TableField(value = "pkg_id")
+    private Integer packageId;
+
+    private Integer step;
+
+    @TableField(value = "rdp_res", typeHandler = JacksonTypeHandler.class)
+    private WmPkgRedemptionNoticeItemModel[] redemptionResult;
+
+    @TableField(value = "cur_rdp_score")
+    private Long currentRedemptionScore;
+
+    @TableField(value = "cur_rdp_rate")
+    private String currentRedemptionRate;
+
+    @TableField(value = "cur_rdp_weight")
+    private String currentRedemptionWeight;
+
+    @TableField(value = "from_id")
+    private Integer fromEntId;
+
+    @TableField(value = "to_id")
+    private Integer toEntId;
+
+    /**
+     * 通知状态
+     */
+    @TableField(value = "notice_state")
+    private String state;
+
+    private LocalDateTime acceptTime;
+
+    private Boolean accept;
+
+    private String acceptRemarks;
+
+    private String createBy;
+
+    private LocalDateTime createTime;
+
+    private String updateBy;
+
+    private LocalDateTime updateTime;
+
+
+    @Getter
+    @AllArgsConstructor
+    public enum NoticeState {
+
+        SEND("SEND", "发送"),
+        READ("READ", "已读"),
+        CONFIRM("CONFIRM", "确认"),
+        ARGUE("ARGUE", "申诉"),
+        DONE("DONE", "完结");
+
+        private final String state;
+
+        private final String description;
+
+    }
+}

+ 26 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/model/WmPkgRedemptionNoticeItemModel.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.api.model;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * 兑付通知项
+ *
+ * @author jimmy
+ * @date 13/07/2024 18:23
+ */
+@Data
+public final class WmPkgRedemptionNoticeItemModel implements Serializable {
+    private static final long serialVersionUID = 2888447878580160590L;
+
+    private Integer itemId;
+
+    private String category;
+
+    private String subCategory;
+
+    private Integer total;
+
+    private Integer mark;
+}

+ 179 - 144
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -5,9 +5,10 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import cn.hutool.core.date.DatePattern;
 import cn.hutool.core.lang.Validator;
+import cn.hutool.core.text.CharSequenceUtil;
+import cn.hutool.core.text.StrPool;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.IdUtil;
-import cn.hutool.core.util.StrUtil;
 import cn.hutool.json.JSONObject;
 import cn.hutool.json.JSONUtil;
 import com.alibaba.csp.sentinel.util.StringUtil;
@@ -22,6 +23,7 @@ import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
 import com.google.common.collect.Multimap;
 import com.pig4cloud.plugin.excel.annotation.RequestExcel;
 import com.qunzhixinxi.hnqz.admin.api.constant.UpmsType;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmPkgDTO;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDept;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysPlanPkg;
@@ -29,6 +31,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysUser;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmDaAgent;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEnt;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmDaDrugEntDrugtable;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageRedemptionNotice;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.TargetType;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
@@ -51,6 +54,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRecharge;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDeptRechargeRecord;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.RechargeRecordPackageType;
 import com.qunzhixinxi.hnqz.admin.api.constant.enums.RechargeRecordType;
+import com.qunzhixinxi.hnqz.admin.manager.WmPackageManager;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRechargeMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRechargeRecordMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.WmDaAgentMapper;
@@ -101,6 +105,7 @@ import org.springframework.web.bind.annotation.RequestPart;
 import org.springframework.web.bind.annotation.RestController;
 
 import javax.validation.Valid;
+import javax.validation.constraints.NotNull;
 import java.math.BigDecimal;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
@@ -161,6 +166,7 @@ public class WmScorePackageController {
     private final SysDictItemService sysDictItemService;
     private final Sequence pkgSequence;
     private final SysPlanPkgService planPkgService;
+    private final WmPackageManager packageManager;
 
 
     @GetMapping(value = "/quiz/relation/list")
@@ -184,7 +190,7 @@ public class WmScorePackageController {
     @PutMapping(value = "/p2p/amount")
     @Transactional(rollbackFor = Exception.class)
     public R<?> saveP2pAmount(@RequestBody WmScorePackage wmScorePackage) {
-        if (StrUtil.isBlank(wmScorePackage.getId()) || wmScorePackage.getP2pAmount() == null || wmScorePackage.getP2pDraft() == null) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getId()) || wmScorePackage.getP2pAmount() == null || wmScorePackage.getP2pDraft() == null) {
             return R.failed("参数错误");
         }
 
@@ -245,29 +251,28 @@ public class WmScorePackageController {
             queryWrapper.like("score_name", pakcageName);
         }
 
-        if ("4".equals(wmScorePackage.getTypeid())) {
-            if (null != ruleId) {
-                WmTaskRule wmTaskRule = new WmTaskRule();
+        if ("4".equals(wmScorePackage.getTypeid()) && null != ruleId) {
 
-                if (null != wmScorePackage.getDrugEntId()) {
-                    wmTaskRule.setDrugentId(wmScorePackage.getDrugEntId());
-                    wmTaskRule.setRuleMonth(ruleId);
-                } else {
-                    wmTaskRule.setRuleMonth(ruleId);
-                }
+            WmTaskRule wmTaskRule = new WmTaskRule();
 
-                List<WmTaskRule> wmTaskRuleList = wmTaskRuleService.list(Wrappers.query(wmTaskRule));
-                List<String> stringList = new ArrayList<>();
-                if (CollUtil.isNotEmpty(wmTaskRuleList)) {
-                    for (WmTaskRule wmt : wmTaskRuleList) {
-                        stringList.add(wmt.getId());
-                    }
-                } else {
-                    stringList.add("-1");
-                }
+            if (null != wmScorePackage.getDrugEntId()) {
+                wmTaskRule.setDrugentId(wmScorePackage.getDrugEntId());
+                wmTaskRule.setRuleMonth(ruleId);
+            } else {
+                wmTaskRule.setRuleMonth(ruleId);
+            }
 
-                queryWrapper.in(true, "task_rule_id", stringList);
+            List<WmTaskRule> wmTaskRuleList = wmTaskRuleService.list(Wrappers.query(wmTaskRule));
+            List<String> stringList = new ArrayList<>();
+            if (CollUtil.isNotEmpty(wmTaskRuleList)) {
+                for (WmTaskRule wmt : wmTaskRuleList) {
+                    stringList.add(wmt.getId());
+                }
+            } else {
+                stringList.add("-1");
             }
+
+            queryWrapper.in(true, "task_rule_id", stringList);
         }
 
         wmScorePackageService.page(page, queryWrapper);
@@ -278,7 +283,7 @@ public class WmScorePackageController {
                 String s = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:amount:%s", r.getId()));
                 String s1 = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:service-amount:%s", r.getId()));
                 String desc = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:desc:%s", r.getId()));
-                if (StrUtil.isNotBlank(s)) {
+                if (CharSequenceUtil.isNotBlank(s)) {
                     r.setP2pAmount(new BigDecimal(s));
                     r.setP2pServiceAmount(new BigDecimal(s1));
                     r.setDescription(desc);
@@ -740,7 +745,7 @@ public class WmScorePackageController {
 //				String s = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:amount:%s", r.getId()));
 //				String s1 = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:service-amount:%s", r.getId()));
 //				String desc = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:desc:%s", r.getId()));
-//				if (StrUtil.isNotBlank(s)) {
+//				if (CharSequenceUtil.isNotBlank(s)) {
 //					r.setP2pAmount(new BigDecimal(s));
 //					r.setP2pServiceAmount(new BigDecimal(s1));
 //					r.setDescription(desc);
@@ -771,7 +776,7 @@ public class WmScorePackageController {
                     String s = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:amount:%s", sPackage.getId()));
                     String s1 = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:service-amount:%s", sPackage.getId()));
                     String desc = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:desc:%s", sPackage.getId()));
-                    if (StrUtil.isNotBlank(s)) {
+                    if (CharSequenceUtil.isNotBlank(s)) {
                         sPackage.setP2pAmount(new BigDecimal(s));
                         sPackage.setP2pServiceAmount(new BigDecimal(s1));
                         sPackage.setDescription(desc);
@@ -853,8 +858,6 @@ public class WmScorePackageController {
             ywc += wmS.getScore();
 
             if (null != wmS.getYsh()) {
-                //TODO
-                //dqf+=wmS.getYsh();
                 if (wmS.getYtj() > wmS.getScore()) {
                     dqf += wmS.getScore();
                 } else {
@@ -1086,7 +1089,7 @@ public class WmScorePackageController {
         }
 
 
-        if (StrUtil.isNotBlank(wmScorePackage.getScoreId())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScoreId())) {
             WmScorePackage wmScorePackage1 = new WmScorePackage();
             wmScorePackage1.setDelFlag("0");
             wmScorePackage1.setScoreId(wmScorePackage.getScoreId());
@@ -1111,14 +1114,12 @@ public class WmScorePackageController {
             SysDept sysDept1 = new SysDept();
             sysDept1.setDeptId(SecurityUtils.getUser().getDeptId());
             SysDept sysDept = sysDeptService.selectDeptId(sysDept1);
-            if (sysDept.getLevel() == 3) {
-                if (null != wmScorePackage.getLevel2Id()) {
-                    WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getLevel2Id());
-                    wmScorePackage.setDeptId(wmDaAgent.getDeptId() + "");
+            if (sysDept.getLevel() == 3 && null != wmScorePackage.getLevel2Id()) {
+                WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getLevel2Id());
+                wmScorePackage.setDeptId(wmDaAgent.getDeptId() + "");
 
-                    WmDaAgent wmDaAgent1 = wmDaAgentService.getById(sysDept.getLevel2Id());
-                    wmScorePackage.setLevel1Id(wmDaAgent1.getId());
-                }
+                WmDaAgent wmDaAgent1 = wmDaAgentService.getById(sysDept.getLevel2Id());
+                wmScorePackage.setLevel1Id(wmDaAgent1.getId());
             }
 
 
@@ -1148,7 +1149,7 @@ public class WmScorePackageController {
             wmScorePackage.setLevel2Id(sysDept.getLevel3Id() == null || sysDept.getLevel3Id() == 0 ? null : sysDept.getLevel3Id());
         }
 
-        if (StrUtil.isNotBlank(wmScorePackage.getScoreName())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScoreName())) {
             WmScorePackage wmScorePackage1 = new WmScorePackage();
             wmScorePackage1.setDelFlag("0");
             wmScorePackage1.setScoreName(wmScorePackage.getScoreName());
@@ -1228,7 +1229,7 @@ public class WmScorePackageController {
 
         }
 
-        if (StrUtil.isNotBlank(wmScorePackage.getScoreId())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScoreId())) {
             WmScorePackage wmScorePackage1 = new WmScorePackage();
             wmScorePackage1.setDelFlag("0");
             wmScorePackage1.setScoreId(wmScorePackage.getScoreId());
@@ -1300,8 +1301,8 @@ public class WmScorePackageController {
             for (WmScorePackage sysUser : list) {
                 Map<String, String> map = new HashMap<>(3);
                 map.put("id", sysUser.getId());
-                map.put("scoreId", StrUtil.isBlank(sysUser.getScoreId().trim()) ? "-" : sysUser.getScoreId());
-                map.put("scoreName", StrUtil.isBlank(sysUser.getScoreName().trim()) ? "-" : sysUser.getScoreName());
+                map.put("scoreId", CharSequenceUtil.isBlank(sysUser.getScoreId().trim()) ? "-" : sysUser.getScoreId());
+                map.put("scoreName", CharSequenceUtil.isBlank(sysUser.getScoreName().trim()) ? "-" : sysUser.getScoreName());
                 answerList.add(map);
             }
 
@@ -1425,7 +1426,7 @@ public class WmScorePackageController {
         WmScorePackage wmScorePackage = wmScorePackageMapper.selectById(id);
 
         // 关联积分包
-        if (StrUtil.isBlank(wmScorePackage.getRelationScoreId())) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getRelationScoreId())) {
             wmScorePackage.setRelationScoreId("-1");
             wmScorePackage.setRelationScoreName("无");
         } else {
@@ -1436,7 +1437,7 @@ public class WmScorePackageController {
         }
 
         // 关联服务企业
-        if (StrUtil.isNotBlank(wmScorePackage.getRelatedService())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getRelatedService())) {
             SysDept serviceDept = sysDeptService.getById(wmScorePackage.getRelatedService());
             if (serviceDept != null) {
                 wmScorePackage.setRelatedServiceName(serviceDept.getName());
@@ -1444,7 +1445,7 @@ public class WmScorePackageController {
         }
 
         // 接包对象
-        if (StrUtil.isNotBlank(wmScorePackage.getAcceptSug())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getAcceptSug())) {
             // 此处暂认为drugEnt和agent不会出现相同的id
             WmDaAgent daAgent = wmDaAgentMapper.selectById(wmScorePackage.getAcceptSug());
             if (daAgent == null) {
@@ -1524,7 +1525,7 @@ public class WmScorePackageController {
         Page<WmScorePackage> pageAnswer = wmScorePackageService.selectWmScorePackageLists(new Page<>(current, size), deptId,
                 scorePackageName, acceptSug, allocationDate, endLabelDate);
 
-        //根据积分包id查询计算完成积分值 已付积分值
+        // 根据积分包id查询计算完成积分值 已付积分值
         List<WmScorePackage> wmList = pageAnswer.getRecords();
 
         List<Future<WmScorePackage>> futureList = new ArrayList<>(wmList.size());
@@ -1555,7 +1556,7 @@ public class WmScorePackageController {
                     String s = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:amount:%s", wmScorePackage.getId()));
                     String s1 = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:service-amount:%s", wmScorePackage.getId()));
                     String desc = redisTemplate.opsForValue().get(String.format("scorepackage:p2p:desc:%s", wmScorePackage.getId()));
-                    if (StrUtil.isNotBlank(s)) {
+                    if (CharSequenceUtil.isNotBlank(s)) {
                         wmScorePackage.setP2pAmount(new BigDecimal(s));
                         wmScorePackage.setP2pServiceAmount(new BigDecimal(s1));
                         wmScorePackage.setDescription(desc);
@@ -1600,7 +1601,7 @@ public class WmScorePackageController {
     public R<?> listWmScorePackages(WmScorePackage wmScorePackage) {
         // 当前企业deptId
         String deptId = wmScorePackage.getDeptId();
-        if (StrUtil.isBlank(deptId)) {
+        if (CharSequenceUtil.isBlank(deptId)) {
             deptId = String.valueOf(SecurityUtils.getUser().getDeptId());
         }
 
@@ -1639,7 +1640,7 @@ public class WmScorePackageController {
 
         List<Map<String, Object>> answerList = new ArrayList<>();
 
-        //获取关联积分包
+        // 获取关联积分包
         if (sysDept.getLevel() == 2 && selfId.getLevel() != 2) {
             wmScorePackage.setSendPackageDeptId(wmScorePackage.getRelatedService());
             wmScorePackage.setDeptId(String.valueOf(SecurityUtils.getUser().getDeptId()));
@@ -1706,7 +1707,7 @@ public class WmScorePackageController {
         List<Map<String, Object>> answerList = new ArrayList<>();
         Map<String, Object> map2 = new HashMap<>();
 
-        //获取接包对象和可分配积分
+        // 获取接包对象和可分配积分
         List<WmDaAgent> wmDaDrugEnts = new ArrayList();
         if ("-1".equals(wmScorePackage.getId()) && wmId.getLevel() == 3) {
             map2.put("kfpjf", "");
@@ -1746,7 +1747,7 @@ public class WmScorePackageController {
             }
         }
         answerList.add(map2);
-        //获取数据
+        // 获取数据
         if (wmId.getLevel() == 3) {
             for (WmScorePackage wmScorePackage1 : list) {
                 Map<String, Object> map1 = new HashMap<>(7);
@@ -1801,7 +1802,7 @@ public class WmScorePackageController {
         Integer planId = wmScorePackage.getPlanId();
 
         String relPkgId = wmScorePackage.getRelationScoreId();
-        boolean relatedScoreId = StrUtil.isNotBlank(relPkgId) && Integer.parseInt(relPkgId) > 0;
+        boolean relatedScoreId = CharSequenceUtil.isNotBlank(relPkgId) && Integer.parseInt(relPkgId) > 0;
         SysDeptRecharge deptRecharge = null;
 
         // 校验积分值
@@ -1810,7 +1811,7 @@ public class WmScorePackageController {
         }
 
         // 校验积分包名称是否存在
-        if (StrUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
 
             int existed = wmScorePackageService.count(Wrappers.<WmScorePackage>lambdaQuery()
                     .eq(WmScorePackage::getDelFlag, "0")
@@ -1882,7 +1883,7 @@ public class WmScorePackageController {
         }
 
         SysDept sysDeptRelatedService = sysDeptService.getById(Integer.valueOf(wmScorePackage.getRelatedService()));
-        if (StrUtil.isBlank(wmScorePackage.getTypeid())) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getTypeid())) {
             WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(deptId);
             if (wmDaDrugEnt != null) {
                 if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
@@ -1937,7 +1938,7 @@ public class WmScorePackageController {
             }
         }
 
-        //药企规则ID
+        // 药企规则ID
         SysDept sysDeptRuleId = sysDeptService.getById(deptId);
         Integer deptLevel = sysDeptRuleId.getLevel();
 
@@ -1960,7 +1961,7 @@ public class WmScorePackageController {
 
             }
         } else if (deptLevel == 3) {
-            //一级cso规则ID
+            // 一级cso规则ID
             WmDaAgent daAgent = wmDaAgentService.getOne(Wrappers.<WmDaAgent>lambdaQuery()
                     .eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
                     .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
@@ -2028,7 +2029,7 @@ public class WmScorePackageController {
         List<WmScoreTaskType> taskTypeList = wmScorePackage.getWmScoreTaskTypeList();
         if (CollUtil.isNotEmpty(taskTypeList)) {
 
-            if (StrUtil.isBlank(relPkgId) || (StrUtil.isNotBlank(relPkgId) && deptLevel == 3)) {
+            if (CharSequenceUtil.isBlank(relPkgId) || (CharSequenceUtil.isNotBlank(relPkgId) && deptLevel == 3)) {
                 List<WmScoreTaskType> scoreTaskTypes = taskTypeList.stream().map(taskType -> {
                     WmScoreTaskType wmScoreTaskType = new WmScoreTaskType();
                     wmScoreTaskType.setScoreId(wmScorePackage.getId());
@@ -2040,7 +2041,7 @@ public class WmScorePackageController {
                 wmScoreTaskTypeService.deleteByScoreId(wmScorePackage.getId());
                 // todo
                 wmScoreTaskTypeService.saveBatch(scoreTaskTypes);
-                //wmScoreTaskTypeService.batchInsertType(scoreTaskTypes);
+                // wmScoreTaskTypeService.batchInsertType(scoreTaskTypes);
             }
         }
 
@@ -2107,7 +2108,7 @@ public class WmScorePackageController {
 
     public R<?> stopWmScorePackage(@RequestBody WmScorePackage wmScorePackage) {
         log.info("终止积分包(大包)入参:{}", wmScorePackage);
-        if (StrUtil.isBlank(wmScorePackage.getId()) || !StrUtil.equalsAny(wmScorePackage.getEnableType(), "1", "2")) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getId()) || !CharSequenceUtil.equalsAny(wmScorePackage.getEnableType(), "1", "2")) {
             return R.failed("参数错误");
         }
 
@@ -2137,7 +2138,7 @@ public class WmScorePackageController {
 
         wmScorePackage.setUpdateUser(SecurityUtils.getUser().getId());
         wmScorePackage.setUpdateTime(LocalDateTime.now());
-        if (StrUtil.isNotBlank(wmScorePackage.getRelationScoreId())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getRelationScoreId())) {
             WmScorePackage wmScorePackage1 = new WmScorePackage();
             wmScorePackage1.setDelFlag("0");
             wmScorePackage1.setRelationScoreId(wmScorePackage.getRelationScoreId());
@@ -2152,7 +2153,7 @@ public class WmScorePackageController {
                 for (WmScorePackage wms : wmScorePackageList) {
                     if (wmId.getId().equals(wms.getRelationScoreId())) {
                         return R.failed("积分包已被分派,请联系下属CSO终止关联积分包");
-                    } else if (StrUtil.isNotBlank(wms.getRelationScoreId())) {
+                    } else if (CharSequenceUtil.isNotBlank(wms.getRelationScoreId())) {
                         wmScorePackage.setEnableFlag("1");
                         wmScorePackage.setPackageFinishStatus("2");
                         List<WmScorePackage> wmScorePackages = wmScorePackageService.selectRelationScoreId(wmId.getId());
@@ -2326,7 +2327,7 @@ public class WmScorePackageController {
         }
         if (SecurityUtils.getRoles().contains(3) || SecurityUtils.getRoles().contains(4)) {
 
-            //药企规则ID
+            // 药企规则ID
             SysDept sysDeptRuleId = sysDeptService.getById(SecurityUtils.getUser().getDeptId());
 
             if (sysDeptRuleId.getLevel() == 2) {
@@ -2339,7 +2340,7 @@ public class WmScorePackageController {
                     wmScorePackage.setDrugEntId(wmDaDrugEntRuleId.getId());
                 }
             } else if (sysDeptRuleId.getLevel() == 3) {
-                //一级cso规则ID
+                // 一级cso规则ID
                 WmDaAgent daAgent = wmDaAgentService.getOne(Wrappers.<WmDaAgent>lambdaQuery()
                         .eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
                         .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
@@ -2369,11 +2370,11 @@ public class WmScorePackageController {
             WmScorePackage queryWm = new WmScorePackage();
             SysDept sysDept = sysDeptService.getById(SecurityUtils.getUser().getDeptId());
 
-            if (sysDept.getLevel() == 3) {//判断是cso
+            if (sysDept.getLevel() == 3) {// 判断是cso
                 queryWm.setEnableFlag("0");
-            } else if (sysDept.getLevel() == 2) {//判断是药企
+            } else if (sysDept.getLevel() == 2) {// 判断是药企
                 WmScorePackage wmId = wmScorePackageService.getById(wmScorePackage.getId());
-                queryWm.setScorePackageName(wmId.getScorePackageName());//获取当前包的scoreId
+                queryWm.setScorePackageName(wmId.getScorePackageName());// 获取当前包的scoreId
             } else {
                 queryWm.setId("-1");
             }
@@ -2419,7 +2420,7 @@ public class WmScorePackageController {
             if (CollUtil.isNotEmpty(wmScorePackageList)) {
                 for (WmScorePackage wms : wmScorePackageList) {
                     if (CollUtil.isNotEmpty(wmScorePackageList)) {
-                        if (wms.getId().equals(wmScorePackage.getRelationScoreId())) {//判断是否有scoreId与当前关联积分包匹配
+                        if (wms.getId().equals(wmScorePackage.getRelationScoreId())) {// 判断是否有scoreId与当前关联积分包匹配
                             List<WmScorePackage> wmScorePackagess = wmScorePackageService.selectRelationScoreId(wmId.getId());
                             if (CollUtil.isNotEmpty(wmScorePackagess)) {
                                 for (WmScorePackage wmScorePackage13 : wmScorePackagess) {
@@ -2448,13 +2449,13 @@ public class WmScorePackageController {
                                         .intValue());
                                 wmId.setScore(wmScorePackage.getScore());
                             }
-                        } else if (wms.getKfpjf() != null && StrUtil.isNotBlank(wmScorePackage.getRelationScoreId()) && wmScorePackage.getScore() > wms.getKfpjf() + wmId.getScore()) {
+                        } else if (wms.getKfpjf() != null && CharSequenceUtil.isNotBlank(wmScorePackage.getRelationScoreId()) && wmScorePackage.getScore() > wms.getKfpjf() + wmId.getScore()) {
                             return R.failed("可分配积分不足");
-                        } else if ("".equals(wmScorePackage.getRelationScoreId()) && wms.getId().equals(wmId.getRelationScoreId())) {//判断关联积分包是否为无
+                        } else if ("".equals(wmScorePackage.getRelationScoreId()) && wms.getId().equals(wmId.getRelationScoreId())) {// 判断关联积分包是否为无
                             wms.setKfpjf(wmId.getScore() + wms.getKfpjf());
                         } else if (wms.getId().equals(wmId.getRelationScoreId())) {
                             wms.setKfpjf(new Double(Math.ceil(wms.getKfpjf() + wmId.getScore())).intValue());
-                            //判断是否进行中
+                            // 判断是否进行中
                             List<WmScorePackage> wmScorePackages = wmScorePackageService.selectRelationScoreId(wmId.getId());
                             if (CollUtil.isNotEmpty(wmScorePackages)) {
                                 for (WmScorePackage wmScorePackage1 : wmScorePackages) {
@@ -2521,7 +2522,7 @@ public class WmScorePackageController {
             List<WmScoreTaskType> wmScoreTaskTypess = new ArrayList<>();
             for (WmScoreTaskType wmScoreTaskTypes : wmScorePackage.getWmScoreTaskTypeList()) {
                 WmScoreTaskType wmScoreTaskType = new WmScoreTaskType();
-                //将积分表id和前端传的tasktypeId赋值给wmScoreTaskTypess
+                // 将积分表id和前端传的tasktypeId赋值给wmScoreTaskTypess
                 if ("".equals(wmScorePackage.getRelationScoreId())) {
                     wmScoreTaskType.setScoreId(wmScorePackage.getId());
                     wmScoreTaskType.setType("1");
@@ -2535,8 +2536,8 @@ public class WmScorePackageController {
                 }
             }
             wmScoreTaskTypeService.deleteByScoreId(wmScorePackage.getId());
-            //todo
-            //wmScoreTaskTypeService.batchInsertType(wmScoreTaskTypess);
+            // todo
+            // wmScoreTaskTypeService.batchInsertType(wmScoreTaskTypess);
             wmScoreTaskTypeService.saveBatch(wmScoreTaskTypess);
         }
 
@@ -2556,7 +2557,7 @@ public class WmScorePackageController {
                 .in(SysDeptRechargeRecord::getType, RechargeRecordType.SEND_PACKAGE_DEPT, RechargeRecordType.SEND_PACKAGE_PERSONAL));
         LocalDateTime now = LocalDateTime.now();
 
-        boolean relatedScoreId = StrUtil.isNotBlank(wmScorePackage.getRelationScoreId()) && Integer.parseInt(wmScorePackage.getRelationScoreId()) > 0;
+        boolean relatedScoreId = CharSequenceUtil.isNotBlank(wmScorePackage.getRelationScoreId()) && Integer.parseInt(wmScorePackage.getRelationScoreId()) > 0;
 
         // 积分值相比修改前的变动(相对于积分余额,增加则为负-消耗,减少则为正-回收)
         int changeScore = oldPackageScore - wmScorePackage.getScore();
@@ -2715,7 +2716,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -2729,24 +2730,24 @@ public class WmScorePackageController {
                 .eq("p.send_package_dept_id", deptId)
                 .between(start != null, "p.create_time", start, end);
 
-        if (StrUtil.isNotBlank(scorePackageName)) {
+        if (CharSequenceUtil.isNotBlank(scorePackageName)) {
             queryWrapper.and(wrapper -> wrapper.like("p.score_package_name", scorePackageName).or().like("p.pkg_sn", scorePackageName));
         }
 
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in("p.typeid", "3", "4", "5");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in("p.typeid", split);
         }
 
         // 接单对象范围筛选
-        if (StrUtil.isNotBlank(packageUserScope)) {
+        if (CharSequenceUtil.isNotBlank(packageUserScope)) {
             queryWrapper.eq("p.package_user_scope", packageUserScope);
         }
 
         // 用于问问的系统来源
-        if (StrUtil.isNotBlank(sourceType)) {
+        if (CharSequenceUtil.isNotBlank(sourceType)) {
             queryWrapper.eq("p.source_type", sourceType);
         }
 
@@ -2762,7 +2763,7 @@ public class WmScorePackageController {
                         .eq(WmTeam::getEnableFlag, EnableEnum.ENABLE.val())
                         .eq(WmTeam::getDelFlag, DelEnum.NOT_DEL.getVal())
                         .apply("FIND_IN_SET({0}, leader)", String.valueOf(userId)));
-                if (CollectionUtil.isNotEmpty(teamList)) {
+                if (CollUtil.isNotEmpty(teamList)) {
                     // 如果配置了,则只查询所在团队下发的积分包
                     List<String> teamIdList = teamList.stream().map(wmTeam -> String.valueOf(wmTeam.getId())).collect(Collectors.toList());
                     queryWrapper.in("p.package_user_scope", teamIdList);
@@ -2795,7 +2796,7 @@ public class WmScorePackageController {
             Map<String, List<WmScorePackageStatus>> packageStatusGroupMap = scorePackageStatusList.stream()
                     .collect(Collectors.groupingBy(WmScorePackageStatus::getPackageId));
 
-            //获取上级包
+            // 获取上级包
             Set<String> parentPackageIds = pageRecords.stream().map(WmScorePackage::getRelationScoreId).collect(Collectors.toSet());
             List<WmScorePackage> parentPackages = wmScorePackageMapper.selectList(Wrappers.<WmScorePackage>lambdaQuery()
                     .in(WmScorePackage::getId, parentPackageIds));
@@ -2881,7 +2882,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -2896,14 +2897,14 @@ public class WmScorePackageController {
                 .in("p.mah_settle_step", UpmsType.MahSettleStep.BUSINESS.getType(), UpmsType.MahSettleStep.FINANCE.getType())
                 .between(start != null, "p.create_time", start, end);
 
-        if (StrUtil.isNotBlank(scorePackageName)) {
+        if (CharSequenceUtil.isNotBlank(scorePackageName)) {
             queryWrapper.and(wrapper -> wrapper.like("p.score_package_name", scorePackageName).or().like("p.pkg_sn", scorePackageName));
         }
 
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in("p.typeid", "3", "4", "5");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in("p.typeid", split);
         }
 
@@ -2931,7 +2932,7 @@ public class WmScorePackageController {
             Map<String, List<WmScorePackageStatus>> packageStatusGroupMap = scorePackageStatusList.stream()
                     .collect(Collectors.groupingBy(WmScorePackageStatus::getPackageId));
 
-            //获取上级包
+            // 获取上级包
             Set<String> parentPackageIds = pageRecords.stream().map(WmScorePackage::getRelationScoreId).collect(Collectors.toSet());
             List<WmScorePackage> parentPackages = wmScorePackageMapper.selectList(Wrappers.<WmScorePackage>lambdaQuery()
                     .in(WmScorePackage::getId, parentPackageIds));
@@ -2947,16 +2948,16 @@ public class WmScorePackageController {
 
             // todo
             //// 结算记录
-            //List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+            // List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
             //		.in(WmScorePackageSettleNote::getPackageId, packageIds));
-            //Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
+            // Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
             //		.collect(Collectors.groupingBy(WmScorePackageSettleNote::getPackageId));
 
             // 有效任务类型
             List<WmScoreTaskType> taskTypeList = wmScoreTaskTypeMapper.getScoreTaskTypeByScoreId(String.join(",", packageIds));
             Map<String, List<WmScoreTaskType>> taskTypeMap = taskTypeList.stream().collect(Collectors.groupingBy(WmScoreTaskType::getScoreId));
 
-            //for (int i = 0; i < pageRecords.size(); i++) {
+            // for (int i = 0; i < pageRecords.size(); i++) {
             //	WmScorePackage wmScorePackage = pageRecords.get(i);
             //
             //	List<WmTask> tasks = taskGoupMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
@@ -3030,7 +3031,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -3044,19 +3045,19 @@ public class WmScorePackageController {
                 .eq("p.send_package_dept_id", deptId)
                 .between(start != null, "p.create_time", start, end);
 
-        if (StrUtil.isNotBlank(scorePackageName)) {
+        if (CharSequenceUtil.isNotBlank(scorePackageName)) {
             queryWrapper.and(wrapper -> wrapper.like("p.score_package_name", scorePackageName).or().like("p.pkg_sn", scorePackageName));
         }
 
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in("p.typeid", "3", "4", "5");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in("p.typeid", split);
         }
 
         // 接单对象范围筛选
-        if (StrUtil.isNotBlank(packageUserScope)) {
+        if (CharSequenceUtil.isNotBlank(packageUserScope)) {
             queryWrapper.eq("p.package_user_scope", packageUserScope);
         }
 
@@ -3109,7 +3110,7 @@ public class WmScorePackageController {
         Map<String, List<WmScorePackageStatus>> packageStatusGroupMap = scorePackageStatusList.stream()
                 .collect(Collectors.groupingBy(WmScorePackageStatus::getPackageId));
 
-        //获取上级包
+        // 获取上级包
         Set<String> parentPackageIds = scorePackageList.stream().map(WmScorePackage::getRelationScoreId).collect(Collectors.toSet());
         List<WmScorePackage> parentPackages = wmScorePackageMapper.selectList(Wrappers.<WmScorePackage>lambdaQuery()
                 .in(WmScorePackage::getId, parentPackageIds));
@@ -3125,9 +3126,9 @@ public class WmScorePackageController {
 
         // todo
         //// 结算记录
-        //List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+        // List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
         //		.in(WmScorePackageSettleNote::getPackageId, packageIds));
-        //Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
+        // Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
         //		.collect(Collectors.groupingBy(WmScorePackageSettleNote::getPackageId));
 
         // 有效任务类型
@@ -3142,14 +3143,14 @@ public class WmScorePackageController {
             List<WmTask> tasks = taskGoupMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             List<WmScorePackageStatus> statuses = packageStatusGroupMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             // todo
-            //List<WmScorePackageSettleNote> notes = noteMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
-            //List<WmScoreTaskType> scoreTaskTypes = taskTypeMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
+            // List<WmScorePackageSettleNote> notes = noteMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
+            // List<WmScoreTaskType> scoreTaskTypes = taskTypeMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             //
-            //wmScorePackageService.buildScorePackageSync(wmScorePackage, packageType1, packageType2, tasks, statuses,
+            // wmScorePackageService.buildScorePackageSync(wmScorePackage, packageType1, packageType2, tasks, statuses,
             //		packageType1List, packageType2List, parentPackageNameMap, notes, scoreTaskTypes);
 
             WmScorePackageExcelModel excelModel = BeanUtil.copyProperties(wmScorePackage, WmScorePackageExcelModel.class);
-            if (StrUtil.isNotBlank(wmScorePackage.getScorePackageStatus())) {
+            if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageStatus())) {
                 excelModel.setScorePackageStatus(Objects.requireNonNull(ScorePackageStatusEnum.getByVal(wmScorePackage.getScorePackageStatus())).getDesc());
             }
 
@@ -3158,7 +3159,7 @@ public class WmScorePackageController {
             }
 
             String typeid = wmScorePackage.getTypeid();
-            if (StrUtil.isNotBlank(typeid)) {
+            if (CharSequenceUtil.isNotBlank(typeid)) {
                 excelModel.setTypeidName("3".equals(typeid) ? "全职学术信息沟通专员" :
                         "4".equals(typeid) ? "兼职学术信息沟通专员" : "5".equals(typeid) ? "招商经理" : typeid);
             }
@@ -3235,7 +3236,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -3250,14 +3251,14 @@ public class WmScorePackageController {
                 .in("p.mah_settle_step", UpmsType.MahSettleStep.BUSINESS.getType(), UpmsType.MahSettleStep.FINANCE.getType())
                 .between(start != null, "p.create_time", start, end);
 
-        if (StrUtil.isNotBlank(scorePackageName)) {
+        if (CharSequenceUtil.isNotBlank(scorePackageName)) {
             queryWrapper.and(wrapper -> wrapper.like("p.score_package_name", scorePackageName).or().like("p.pkg_sn", scorePackageName));
         }
 
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in("p.typeid", "3", "4", "5");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in("p.typeid", split);
         }
 
@@ -3291,7 +3292,7 @@ public class WmScorePackageController {
         Map<String, List<WmScorePackageStatus>> packageStatusGroupMap = scorePackageStatusList.stream()
                 .collect(Collectors.groupingBy(WmScorePackageStatus::getPackageId));
 
-        //获取上级包
+        // 获取上级包
         Set<String> parentPackageIds = scorePackageList.stream().map(WmScorePackage::getRelationScoreId).collect(Collectors.toSet());
         List<WmScorePackage> parentPackages = wmScorePackageMapper.selectList(Wrappers.<WmScorePackage>lambdaQuery()
                 .in(WmScorePackage::getId, parentPackageIds));
@@ -3307,9 +3308,9 @@ public class WmScorePackageController {
 
         // todo
         // 结算记录
-        //List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+        // List<WmScorePackageSettleNote> noteList = settleNoteMapper.selectList(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
         //		.in(WmScorePackageSettleNote::getPackageId, packageIds));
-        //Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
+        // Map<String, List<WmScorePackageSettleNote>> noteMap = noteList.stream()
         //		.collect(Collectors.groupingBy(WmScorePackageSettleNote::getPackageId));
 
         // 有效任务类型
@@ -3324,14 +3325,14 @@ public class WmScorePackageController {
             List<WmTask> tasks = taskGoupMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             List<WmScorePackageStatus> statuses = packageStatusGroupMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             // todo
-            //List<WmScorePackageSettleNote> notes = noteMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
-            //List<WmScoreTaskType> scoreTaskTypes = taskTypeMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
+            // List<WmScorePackageSettleNote> notes = noteMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
+            // List<WmScoreTaskType> scoreTaskTypes = taskTypeMap.getOrDefault(wmScorePackage.getId(), new ArrayList<>());
             //
-            //wmScorePackageService.buildScorePackageSync(wmScorePackage, packageType1, packageType2, tasks, statuses,
+            // wmScorePackageService.buildScorePackageSync(wmScorePackage, packageType1, packageType2, tasks, statuses,
             //		packageType1List, packageType2List, parentPackageNameMap, notes, scoreTaskTypes);
 
             WmScorePackageExcelModel excelModel = BeanUtil.copyProperties(wmScorePackage, WmScorePackageExcelModel.class);
-            if (StrUtil.isNotBlank(wmScorePackage.getScorePackageStatus())) {
+            if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageStatus())) {
                 excelModel.setScorePackageStatus(Objects.requireNonNull(ScorePackageStatusEnum.getByVal(wmScorePackage.getScorePackageStatus())).getDesc());
             }
 
@@ -3340,7 +3341,7 @@ public class WmScorePackageController {
             }
 
             String typeid = wmScorePackage.getTypeid();
-            if (StrUtil.isNotBlank(typeid)) {
+            if (CharSequenceUtil.isNotBlank(typeid)) {
                 excelModel.setTypeidName("3".equals(typeid) ? "全职学术信息沟通专员" :
                         "4".equals(typeid) ? "兼职学术信息沟通专员" : "5".equals(typeid) ? "招商经理" : typeid);
             }
@@ -3413,7 +3414,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -3422,13 +3423,13 @@ public class WmScorePackageController {
 
         LambdaQueryWrapper<WmScorePackage> queryWrapper = Wrappers.<WmScorePackage>lambdaQuery()
                 .eq(WmScorePackage::getPackageType2, packageType2)
-                .like(StrUtil.isNotEmpty(scorePackageName), WmScorePackage::getScorePackageName, scorePackageName)
+                .like(CharSequenceUtil.isNotEmpty(scorePackageName), WmScorePackage::getScorePackageName, scorePackageName)
                 .eq(scorePackageStatus != null, WmScorePackage::getScorePackageStatus, scorePackageStatus)
                 .eq(WmScorePackage::getSendPackageDeptId, sendDeptId)
                 .between(start != null, WmScorePackage::getCreateTime, start, end);
 
-        List<String> packageType1List = StrUtil.split(packageType1, StrUtil.COMMA);
-        if (StrUtil.contains(packageType1, StrUtil.COMMA)) {
+        List<String> packageType1List = CharSequenceUtil.split(packageType1, StrPool.COMMA);
+        if (CharSequenceUtil.contains(packageType1, StrPool.COMMA)) {
             queryWrapper.in(WmScorePackage::getPackageType1, packageType1List);
         } else {
             queryWrapper.eq(WmScorePackage::getPackageType1, packageType1);
@@ -3438,11 +3439,11 @@ public class WmScorePackageController {
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in(WmScorePackage::getTypeid, "3", "4");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in(WmScorePackage::getTypeid, split);
         }
 
-        //queryWrapper.ne(WmScorePackage::getLocation, SubjectLocation.MAH_SETTLE);
+        // queryWrapper.ne(WmScorePackage::getLocation, SubjectLocation.MAH_SETTLE);
 
         Page<WmScorePackage> wmScorePackagePage = wmScorePackageMapper.selectPage(new Page<>(current, size), queryWrapper
                 .orderByDesc(WmScorePackage::getCreateTime));
@@ -3456,14 +3457,14 @@ public class WmScorePackageController {
                 if (packageType2 == 2) {
 
                     // todo
-                    //int wsNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+                    // int wsNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
                     //		.eq(WmScorePackageSettleNote::getPackageId, scorePackage.getId())
                     //		.in(WmScorePackageSettleNote::getSettleNoteStatus, 2, 9));
-                    //int asNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+                    // int asNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
                     //		.eq(WmScorePackageSettleNote::getPackageId, scorePackage.getId())
                     //		.eq(WmScorePackageSettleNote::getSettleNoteStatus, 1));
-                    //scorePackage.setWsTaskNum(wsNum);
-                    //scorePackage.setAsTaskNum(asNum);
+                    // scorePackage.setWsTaskNum(wsNum);
+                    // scorePackage.setAsTaskNum(asNum);
 
                 }
 
@@ -3509,7 +3510,7 @@ public class WmScorePackageController {
         LocalDateTime start = null;
         LocalDateTime end = null;
 
-        if (StrUtil.isNotEmpty(monthStart) && StrUtil.isNotEmpty(monthEnd)) {
+        if (CharSequenceUtil.isNotEmpty(monthStart) && CharSequenceUtil.isNotEmpty(monthEnd)) {
             start = LocalDateTime.of(LocalDate.parse(monthStart + "-01", DatePattern.NORM_DATE_FORMATTER), LocalTime.MIN);
             LocalDate e = LocalDate.parse(monthEnd + "-01", DatePattern.NORM_DATE_FORMATTER);
             end = LocalDateTime.of(e.with(TemporalAdjusters.lastDayOfMonth()), LocalTime.MAX);
@@ -3518,14 +3519,14 @@ public class WmScorePackageController {
 
         LambdaQueryWrapper<WmScorePackage> queryWrapper = Wrappers.<WmScorePackage>lambdaQuery()
                 .eq(WmScorePackage::getPackageType2, packageType2)
-                .like(StrUtil.isNotEmpty(scorePackageName), WmScorePackage::getScorePackageName, scorePackageName)
+                .like(CharSequenceUtil.isNotEmpty(scorePackageName), WmScorePackage::getScorePackageName, scorePackageName)
                 .eq(scorePackageStatus != null, WmScorePackage::getScorePackageStatus, scorePackageStatus)
                 .eq(WmScorePackage::getMahSettleDeptId, sendDeptId)
                 .eq(WmScorePackage::getMahSettleStep, UpmsType.MahSettleStep.FINANCE.getType())
                 .between(start != null, WmScorePackage::getCreateTime, start, end);
 
-        List<String> packageType1List = StrUtil.split(packageType1, StrUtil.COMMA);
-        if (StrUtil.contains(packageType1, StrUtil.COMMA)) {
+        List<String> packageType1List = CharSequenceUtil.split(packageType1, StrPool.COMMA);
+        if (CharSequenceUtil.contains(packageType1, StrPool.COMMA)) {
             queryWrapper.in(WmScorePackage::getPackageType1, packageType1List);
         } else {
             queryWrapper.eq(WmScorePackage::getPackageType1, packageType1);
@@ -3535,11 +3536,11 @@ public class WmScorePackageController {
         if (StringUtil.isEmpty(typeId)) {
             queryWrapper.in(WmScorePackage::getTypeid, "3", "4");
         } else {
-            List<String> split = StrUtil.split(typeId, StrUtil.COMMA);
+            List<String> split = CharSequenceUtil.split(typeId, StrPool.COMMA);
             queryWrapper.in(WmScorePackage::getTypeid, split);
         }
 
-        //queryWrapper.eq(WmScorePackage::getLocation, SubjectLocation.MAH_SETTLE);
+        // queryWrapper.eq(WmScorePackage::getLocation, SubjectLocation.MAH_SETTLE);
 
         Page<WmScorePackage> wmScorePackagePage = wmScorePackageMapper.selectPage(new Page<>(current, size), queryWrapper
                 .orderByDesc(WmScorePackage::getCreateTime));
@@ -3552,14 +3553,14 @@ public class WmScorePackageController {
                 if (packageType2 == 2) {
 
                     // todo
-                    //int wsNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+                    // int wsNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
                     //		.eq(WmScorePackageSettleNote::getPackageId, scorePackage.getId())
                     //		.in(WmScorePackageSettleNote::getSettleNoteStatus, 2, 9));
-                    //int asNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
+                    // int asNum = settleNoteMapper.selectCount(Wrappers.<WmScorePackageSettleNote>lambdaQuery()
                     //		.eq(WmScorePackageSettleNote::getPackageId, scorePackage.getId())
                     //		.eq(WmScorePackageSettleNote::getSettleNoteStatus, 1));
-                    //scorePackage.setWsTaskNum(wsNum);
-                    //scorePackage.setAsTaskNum(asNum);
+                    // scorePackage.setWsTaskNum(wsNum);
+                    // scorePackage.setAsTaskNum(asNum);
 
                 }
 
@@ -3604,14 +3605,14 @@ public class WmScorePackageController {
     @PostMapping("/addWmScorePackage")
     public R<?> addWmScorePackage(@RequestBody WmScorePackage wmScorePackage) {
         log.info("新增积分包(小包)入参:{}", wmScorePackage);
-        //定额
+        // 定额
         if (wmScorePackage.getPackageType1().equals("1")) {
             if (wmScorePackage.getScore() <= 0) {
                 return R.failed("积分包分值必须大于0");
             }
         }
 
-        if (StrUtil.isBlank(wmScorePackage.getPackageSn())) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getPackageSn())) {
             return R.failed("积分包序列号必填");
         }
 
@@ -3638,11 +3639,11 @@ public class WmScorePackageController {
 
         log.info("修改积分包(小包)入参:{}", wmScorePackage);
 
-        if (StrUtil.isBlank(wmScorePackage.getId())) {
+        if (CharSequenceUtil.isBlank(wmScorePackage.getId())) {
             return R.failed("积分包id必填");
         }
 
-        //定额
+        // 定额
         if (wmScorePackage.getPackageType1().equals("1") && wmScorePackage.getScore() <= 0) {
             return R.failed("积分包分值必须大于0");
         }
@@ -3654,7 +3655,7 @@ public class WmScorePackageController {
         }
 
         // 校验重名
-        if (StrUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
 
             long existed = wmScorePackageService.count(Wrappers.<WmScorePackage>lambdaQuery()
                     .eq(WmScorePackage::getDelFlag, "0")
@@ -3680,7 +3681,7 @@ public class WmScorePackageController {
     @GetMapping("/updateEnable")
     public R<?> terminatePackageForPersonal(WmScorePackage wmScorePackage) {
         log.info("终止积分包(个人包)入参:{}", wmScorePackage);
-        if (!StrUtil.equalsAny(wmScorePackage.getEnableType(), "1", "2") || StrUtil.isBlank(wmScorePackage.getId())) {
+        if (!CharSequenceUtil.equalsAny(wmScorePackage.getEnableType(), "1", "2") || CharSequenceUtil.isBlank(wmScorePackage.getId())) {
             return R.failed("参数错误");
         }
 
@@ -3780,7 +3781,7 @@ public class WmScorePackageController {
 
         String result = redisTemplate.opsForValue().get(key);
 
-        if (StrUtil.isNotEmpty(result) && JSONUtil.isJson(result)) {
+        if (CharSequenceUtil.isNotEmpty(result) && JSONUtil.isJson(result)) {
             JSONObject jsonObject = JSONUtil.parseObj(result);
             return R.ok(jsonObject);
         }
@@ -3836,11 +3837,11 @@ public class WmScorePackageController {
             TargetType targetType = null;
 
             // 全职
-            if (StrUtil.equals("3", scorePackage.getTypeid())) {
+            if (CharSequenceUtil.equals("3", scorePackage.getTypeid())) {
                 targetType = TargetType.FULL_TIME;
             }
             // 兼职
-            else if (StrUtil.equals("4", scorePackage.getTypeid())) {
+            else if (CharSequenceUtil.equals("4", scorePackage.getTypeid())) {
                 targetType = TargetType.PART_TIME;
             }
 
@@ -3907,7 +3908,7 @@ public class WmScorePackageController {
                 scorePackage.setScore(Integer.parseInt(model.getScore()));
                 scorePackage.setScorePackageName(model.getScorePackageName());
                 scorePackage.setDescription(model.getDescription());
-                scorePackage.setUserList(StrUtil.isEmpty(model.getTargetId()) ? new ArrayList<>(1) :
+                scorePackage.setUserList(CharSequenceUtil.isEmpty(model.getTargetId()) ? new ArrayList<>(1) :
                         Collections.singletonList(model.getTargetId()));
                 scorePackage.setPackageSn("PKG" + pkgSequence.nextNo());
 
@@ -3945,7 +3946,7 @@ public class WmScorePackageController {
 
         // 校验是否同名
         log.info("[{}]", model.getScorePackageName());
-        if (StrUtil.isNotEmpty(model.getScorePackageName())) {
+        if (CharSequenceUtil.isNotEmpty(model.getScorePackageName())) {
             int count = wmScorePackageService.count(Wrappers.<WmScorePackage>lambdaQuery()
                     .eq(WmScorePackage::getScorePackageName, model.getScorePackageName()));
 
@@ -3956,13 +3957,13 @@ public class WmScorePackageController {
 
         // 校验积分制是否为空
         log.info("[{}]", model.getScore());
-        if (StrUtil.isEmpty(model.getScore())) {
+        if (CharSequenceUtil.isEmpty(model.getScore())) {
             errorMap.put("积分值未填", row);
         } else {
             // 校验是否是数字
             if (!Validator.isNumber(model.getScore())) {
                 errorMap.put("积分值不是数字", row);
-            } else if (model.getScore().contains(StrUtil.DOT) || Integer.parseInt(model.getScore()) <= 0) {
+            } else if (model.getScore().contains(StrPool.DOT) || Integer.parseInt(model.getScore()) <= 0) {
                 errorMap.put("积分值必须是正整数", row);
                 model.setScore("0");
             }
@@ -3973,13 +3974,13 @@ public class WmScorePackageController {
 
             // 校验名称是否为空
             log.info("[{}]", model.getTargetName());
-            if (StrUtil.isEmpty(model.getTargetName())) {
+            if (CharSequenceUtil.isEmpty(model.getTargetName())) {
                 errorMap.put("接单人姓名未填", row);
             }
 
             // 校验名称是否为空,是否是企业下的人
             log.info("[{}]", model.getMobile());
-            if (StrUtil.isEmpty(model.getMobile())) {
+            if (CharSequenceUtil.isEmpty(model.getMobile())) {
                 errorMap.put("接单人手机号未填", row);
             } else {
                 if (!Validator.isMobile(model.getMobile())) {
@@ -4006,7 +4007,7 @@ public class WmScorePackageController {
         else {
             // 校验名称是否为空
             log.info("MOBILE: [{}], NAME: [{}]", model.getTargetName(), model.getTargetName());
-            if (StrUtil.isNotEmpty(model.getTargetName()) || StrUtil.isNotEmpty(model.getMobile())) {
+            if (CharSequenceUtil.isNotEmpty(model.getTargetName()) || CharSequenceUtil.isNotEmpty(model.getMobile())) {
                 errorMap.put("请勿使用全职模板", row);
             }
         }
@@ -4045,7 +4046,7 @@ public class WmScorePackageController {
     @PostMapping("/upload-invoice")
     public R<?> uploadInvoice(@RequestBody WmScorePackageSettleOutput param) {
         log.info("积分包结算管理-发票上传参数:{}", param);
-        if (StrUtil.isBlank(param.getId()) || StrUtil.isBlank(param.getInvoiceNumber()) || ArrayUtil.isEmpty(param.getInvoiceFile())) {
+        if (CharSequenceUtil.isBlank(param.getId()) || CharSequenceUtil.isBlank(param.getInvoiceNumber()) || ArrayUtil.isEmpty(param.getInvoiceFile())) {
             return R.failed("必填参数为空");
         }
 
@@ -4084,4 +4085,38 @@ public class WmScorePackageController {
 
         return R.ok();
     }
+
+    @GetMapping(value = "/redemption/val/stat/{pkg_id}")
+    public R<Map<String, Object>> getRedemptionStat(@PathVariable(value = "pkg_id") Integer packageId) {
+
+        return R.ok(packageManager.getRedemptionValueStat(packageId, SecurityUtils.getUser()));
+
+    }
+
+    @SysLog(value = "创建积分包兑付通知")
+    @PostMapping(value = "/redemption/notice/create")
+    public R<Boolean> createPackageRedemptionNotice(@Validated @RequestBody WmPkgDTO.OnRedemptionNoticeCreate resource) {
+        return R.ok(packageManager.createPackageRedemptionNotice(resource, SecurityUtils.getUser()));
+    }
+
+    @GetMapping(value = "/redemption/notice/page")
+    public R<Page<Map<String, Object>>> pageRedemptionNotices(@Validated WmPkgDTO.OnRedemptionNoticePage query) {
+        return R.ok(packageManager.pageRedemptionNotices(query, SecurityUtils.getUser()));
+    }
+
+    @SysLog(value = "创建积分包兑付通知阅读")
+    @PostMapping(value = "/redemption/notice/read")
+    public R<Boolean> readRedemptionNotice(@Validated @RequestBody WmPkgDTO.OnNoticeRead resource) {
+
+        return R.ok(packageManager.readRedemptionNotice(resource, SecurityUtils.getUser()));
+
+    }
+
+    @SysLog(value = "创建积分包兑付通知确认")
+    @PostMapping(value = "/redemption/notice/confirm")
+    public R<Boolean> doAcceptNotice(@Validated @RequestBody WmPkgDTO.OnAcceptNotice resource) {
+        return R.ok(packageManager.doAcceptNotice(resource, SecurityUtils.getUser()));
+    }
+
+
 }

+ 212 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/WmPackageManager.java

@@ -0,0 +1,212 @@
+package com.qunzhixinxi.hnqz.admin.manager;
+
+import cn.hutool.core.bean.BeanUtil;
+import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmPkgDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysCheckChainNodeCheckHistory;
+import com.qunzhixinxi.hnqz.admin.api.entity.SysUserRole;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageRedemptionNotice;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTask;
+import com.qunzhixinxi.hnqz.admin.service.SysCheckChainNodeCheckHistoryService;
+import com.qunzhixinxi.hnqz.admin.service.SysUserRoleService;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageRedemptionNoticeService;
+import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
+import com.qunzhixinxi.hnqz.common.core.exception.BizException;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+/**
+ * 积分包管理器
+ *
+ * @author jimmy
+ * @date 13/07/2024 18:10
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmPackageManager {
+
+
+    private static final int SERV_ADMIN_ROLE = 37;
+    private static final int DIST_ADMIN_ROLE = 4;
+    private static final int OK_CHAIN_TASK_NODE = 6;
+
+    private final WmScorePackageService scorePackageService;
+    private final SysUserRoleService userRoleService;
+    private final WmTaskService taskService;
+    private final SysCheckChainNodeCheckHistoryService checkChainNodeCheckHistoryService;
+    private final WmPackageRedemptionNoticeService packageRedemptionNoticeService;
+
+    /**
+     * 创建执行包兑付通知
+     *
+     * @param resource 兑付信息
+     * @param user     添加人
+     * @return 创建结果
+     */
+    public Boolean createPackageRedemptionNotice(WmPkgDTO.OnRedemptionNoticeCreate resource, HnqzUser user) {
+
+        boolean noticed = packageRedemptionNoticeService.hasNotice(resource.getPackageId(), resource.getStep());
+
+        if (noticed) {
+            throw new BizException("当前执行包,已存在第【" + resource.getStep() + "】兑付通知,请勿重新发起");
+        }
+
+        return packageRedemptionNoticeService.createPackageRedemptionNotice(resource, user);
+    }
+
+    /**
+     * 获取兑付通知分页
+     *
+     * @param query 查询条件
+     * @param user  查询人
+     * @return 返回结果
+     */
+    public Page<Map<String, Object>> pageRedemptionNotices(WmPkgDTO.OnRedemptionNoticePage query, HnqzUser user) {
+
+        Page<Map<String, Object>> res = new Page<>(query.getCurrent(), query.getSize());
+
+        // 获取用户角色
+        Set<Integer> roleIds = userRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, user.getId()))
+                .stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toSet());
+
+        Page<WmPackageRedemptionNotice> page = new Page<>(query.getCurrent(), query.getSize());
+        LambdaQueryWrapper<WmPackageRedemptionNotice> queryWrapper = Wrappers.lambdaQuery();
+
+        // 根据用户角色判断是管理员还是服务商
+        // 区域管理员
+        if (roleIds.contains(DIST_ADMIN_ROLE)) {
+            queryWrapper.eq(WmPackageRedemptionNotice::getFromEntId, user.getDeptId()).eq(WmPackageRedemptionNotice::getCreateBy, user.getUsername());
+        }
+        // 服务商
+        else if (roleIds.contains(SERV_ADMIN_ROLE)) {
+            queryWrapper.eq(WmPackageRedemptionNotice::getToEntId, user.getDeptId());
+        } else {
+            throw new BizException("角色不支持该数据查询");
+        }
+        packageRedemptionNoticeService.page(page, queryWrapper);
+
+        List<WmPackageRedemptionNotice> records = page.getRecords();
+        List<Map<String, Object>> resList;
+        if (CollUtil.isNotEmpty(records)) {
+
+            Set<Integer> pkgIds = records.stream().mapToInt(WmPackageRedemptionNotice::getPackageId).boxed().collect(Collectors.toSet());
+
+            Map<String, WmScorePackage> pkgIdToPkgMap = scorePackageService.listByIds(pkgIds).stream().collect(Collectors.toMap(WmScorePackage::getId, Function.identity()));
+
+
+            resList = records.stream().map(r -> {
+                Map<String, Object> map = BeanUtil.copyProperties(r, Map.class);
+
+                WmScorePackage wmScorePackage = pkgIdToPkgMap.get(r.getPackageId().toString());
+                String pkgName = Objects.nonNull(wmScorePackage) ? wmScorePackage.getScorePackageName() : "";
+                String score = Objects.nonNull(wmScorePackage) ? wmScorePackage.getScore().toString() : "";
+
+                map.put("packageName", pkgName);
+                map.put("packageScore", score);
+                return map;
+            }).collect(Collectors.toList());
+
+        } else {
+            resList = Collections.emptyList();
+        }
+
+        res.setRecords(resList);
+        res.setTotal(page.getTotal());
+        return res;
+    }
+
+    /**
+     * 阅读通知
+     *
+     * @param resource 阅读信息
+     * @param user     阅读人
+     * @return 操作结果
+     */
+    public Boolean readRedemptionNotice(WmPkgDTO.OnNoticeRead resource, HnqzUser user) {
+
+        this.checkRole(user);
+
+
+        boolean read = packageRedemptionNoticeService.hasRead(resource.getNoticeId());
+        if (read) {
+            return Boolean.TRUE;
+        }
+
+        return packageRedemptionNoticeService.readRedemptionNotice(resource, user);
+    }
+
+    /**
+     * 确认通知
+     *
+     * @param resource 确认信息
+     * @param user     确认人
+     * @return 操作结果
+     */
+    public Boolean doAcceptNotice(WmPkgDTO.OnAcceptNotice resource, HnqzUser user) {
+
+        this.checkRole(user);
+        return packageRedemptionNoticeService.doAcceptNotice(resource, user);
+    }
+
+
+    private void checkRole(HnqzUser user) {
+        List<SysUserRole> userRoles = userRoleService.list(Wrappers.<SysUserRole>lambdaQuery().eq(SysUserRole::getUserId, user.getId()));
+
+        Set<Integer> roleIds = userRoles.stream().mapToInt(SysUserRole::getRoleId).boxed().collect(Collectors.toSet());
+
+        if (!roleIds.contains(SERV_ADMIN_ROLE)) {
+            throw new BizException("您没有阅读权限");
+        }
+    }
+
+    /**
+     * 获取执行包兑付通知信息
+     *
+     * @param packageId 执行包ID
+     * @param user      操作人
+     * @return 统计信息
+     */
+    public Map<String, Object> getRedemptionValueStat(Integer packageId, HnqzUser user) {
+
+        WmScorePackage scorePackage = scorePackageService.getById(packageId);
+        List<WmTask> tasks = taskService.list(Wrappers.<WmTask>lambdaQuery().eq(WmTask::getScorePackageId, packageId));
+        Set<Integer> taskIds = tasks.stream().map(WmTask::getId).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+        List<SysCheckChainNodeCheckHistory> okTasks = checkChainNodeCheckHistoryService.list(Wrappers.<SysCheckChainNodeCheckHistory>lambdaQuery().eq(SysCheckChainNodeCheckHistory::getNodeId, OK_CHAIN_TASK_NODE)
+                .in(SysCheckChainNodeCheckHistory::getTargetId, taskIds));
+
+        Map<String, Object> result = new HashMap<>(10);
+        result.put("id", packageId);
+        result.put("pkgSn", scorePackage.getPackageSn());
+        result.put("pkgName", scorePackage.getScorePackageName());
+        result.put("pkgScore", scorePackage.getScore());
+
+        int taskTotalCount = tasks.size();
+        result.put("taskTotalCount", taskTotalCount);
+        result.put("servicePlanDeviationRate", "10%");
+        result.put("taskCompleteRate", String.format(".2f%d%%", okTasks.size() * 100 / ((taskTotalCount == 0) ? 1 : taskTotalCount)));
+        result.put("marketCustomerContactRate", "3%");
+        result.put("fromEntId", scorePackage.getSendPackageDeptId());
+        result.put("toEntId", scorePackage.getDeptId());
+
+
+        return result;
+    }
+}
+

+ 15 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/mapper/WmPackageRedemptionNoticeMapper.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.WmPackageRedemptionNotice;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 执行包兑付通知mapper
+ *
+ * @author jimmy
+ * @date 13/07/2024 18:03
+ */
+@Mapper
+public interface WmPackageRedemptionNoticeMapper extends BaseMapper<WmPackageRedemptionNotice> {
+}

+ 26 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmPackageRedemptionNoticeService.java

@@ -0,0 +1,26 @@
+package com.qunzhixinxi.hnqz.admin.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmPkgDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageRedemptionNotice;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+
+/**
+ * 执行包兑付通知服务
+ *
+ * @author jimmy
+ * @date 13/07/2024 18:04
+ */
+public interface WmPackageRedemptionNoticeService extends IService<WmPackageRedemptionNotice> {
+
+    Boolean createPackageRedemptionNotice(WmPkgDTO.OnRedemptionNoticeCreate resource, HnqzUser user);
+
+
+    boolean hasNotice(Integer packageId, Integer step);
+
+    boolean hasRead(Integer packageId);
+
+    Boolean readRedemptionNotice(WmPkgDTO.OnNoticeRead resource, HnqzUser user);
+
+    Boolean doAcceptNotice(WmPkgDTO.OnAcceptNotice resource, HnqzUser user);
+}

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

@@ -0,0 +1,95 @@
+package com.qunzhixinxi.hnqz.admin.service.impl;
+
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.qunzhixinxi.hnqz.admin.api.dto.WmPkgDTO;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageRedemptionNotice;
+import com.qunzhixinxi.hnqz.admin.api.model.WmPkgRedemptionNoticeItemModel;
+import com.qunzhixinxi.hnqz.admin.mapper.WmPackageRedemptionNoticeMapper;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageRedemptionNoticeService;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.time.LocalDateTime;
+
+/**
+ * 执行包兑付通知服务实现
+ *
+ * @author jimmy
+ * @date 13/07/2024 18:05
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+public class WmPackageRedemptionNoticeServiceImpl extends ServiceImpl<WmPackageRedemptionNoticeMapper, WmPackageRedemptionNotice> implements WmPackageRedemptionNoticeService {
+
+
+    @Override
+    public Boolean createPackageRedemptionNotice(WmPkgDTO.OnRedemptionNoticeCreate resource, HnqzUser user) {
+
+        LocalDateTime now = LocalDateTime.now();
+        String username = user.getUsername();
+
+        WmPackageRedemptionNotice notice = new WmPackageRedemptionNotice();
+        notice.setPackageId(resource.getPackageId());
+        notice.setStep(resource.getStep());
+        notice.setRedemptionResult(resource.getItems().toArray(new WmPkgRedemptionNoticeItemModel[0]));
+        notice.setFromEntId(resource.getFromEntId());
+        notice.setToEntId(resource.getToEntId());
+        notice.setCurrentRedemptionScore(resource.getCurrentRedemptionScore());
+        notice.setCurrentRedemptionRate(resource.getCurrentRedemptionRate());
+        notice.setCurrentRedemptionWeight(resource.getCurrentRedemptionWeight());
+        notice.setState(WmPackageRedemptionNotice.NoticeState.SEND.getState());
+        notice.setCreateBy(username);
+        notice.setCreateTime(now);
+        notice.setUpdateBy(username);
+        notice.setUpdateTime(now);
+
+        return this.save(notice);
+    }
+
+    @Override
+    public boolean hasNotice(Integer packageId, Integer step) {
+        return this.count(Wrappers.<WmPackageRedemptionNotice>lambdaQuery()
+                .eq(WmPackageRedemptionNotice::getPackageId, packageId).eq(WmPackageRedemptionNotice::getStep, step)) > 0;
+    }
+
+    @Override
+    public boolean hasRead(Integer packageId) {
+        return this.count(Wrappers.<WmPackageRedemptionNotice>lambdaQuery()
+                .eq(WmPackageRedemptionNotice::getPackageId, packageId).ne(WmPackageRedemptionNotice::getState, WmPackageRedemptionNotice.NoticeState.SEND.getState())) > 0;
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Boolean readRedemptionNotice(WmPkgDTO.OnNoticeRead resource, HnqzUser user) {
+
+
+        WmPackageRedemptionNotice notice = new WmPackageRedemptionNotice();
+        notice.setNoticeId(resource.getNoticeId());
+        notice.setState(WmPackageRedemptionNotice.NoticeState.READ.getState());
+        notice.setUpdateBy(user.getUsername());
+        notice.setUpdateTime(LocalDateTime.now());
+
+        return this.updateById(notice);
+    }
+
+    @Override
+    public Boolean doAcceptNotice(WmPkgDTO.OnAcceptNotice resource, HnqzUser user) {
+
+        boolean accept = WmPackageRedemptionNotice.NoticeState.READ.getState().equals(resource.getState());
+
+        WmPackageRedemptionNotice notice = new WmPackageRedemptionNotice();
+        notice.setNoticeId(resource.getNoticeId());
+        notice.setAccept(accept);
+        notice.setState(accept ? WmPackageRedemptionNotice.NoticeState.READ.getState() : WmPackageRedemptionNotice.NoticeState.ARGUE.getState());
+        notice.setAcceptTime(LocalDateTime.now());
+        notice.setUpdateBy(user.getUsername());
+        notice.setUpdateTime(LocalDateTime.now());
+
+        return this.updateById(notice);
+    }
+}