Эх сурвалжийг харах

feat: 下发季度积分包和合同生成

shc 11 сар өмнө
parent
commit
9b9ba9e875

+ 3 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/entity/WmScorePackage.java

@@ -593,6 +593,9 @@ public class WmScorePackage implements Serializable {
     @TableField(exist = false)
     private List<Map<String, Object>> pkgTaskTypeQtyList;
 
+    @TableField(exist = false)
+    private WmPackageContract contract;
+
     @Getter
     @AllArgsConstructor
     public enum PackageStopStatus {

+ 1 - 1
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/vo/SysImplementPlanVO.java

@@ -71,7 +71,7 @@ public final class SysImplementPlanVO {
         /**
          * 详情子项
          */
-        private List<SysImplPlanDetailsItem> planItems;
+        private List<Map<String, Object>> planItems;
 
 
     }

+ 5 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/SysFileController.java

@@ -103,4 +103,9 @@ public class SysFileController {
         sysFileService.getFile(bucket, fileName, response);
     }
 
+    @GetMapping(value = "/get/{file_id}")
+    public void getFileById(@PathVariable(value = "file_id") Integer fileId, HttpServletResponse response) {
+        sysFileService.getFileById(fileId, response);
+    }
+
 }

+ 20 - 323
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -31,7 +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.WmPackageTaskTypeQty;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageContract;
 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;
@@ -71,7 +71,7 @@ import com.qunzhixinxi.hnqz.admin.service.WmBizReminderService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntDrugtableService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
-import com.qunzhixinxi.hnqz.admin.service.WmPackageTaskTypeQtyService;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageContractService;
 import com.qunzhixinxi.hnqz.admin.service.WmPkgQuizRelationService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
@@ -81,7 +81,6 @@ import com.qunzhixinxi.hnqz.admin.service.WmTaskService;
 import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
 import com.qunzhixinxi.hnqz.admin.service.WmTeamService;
 import com.qunzhixinxi.hnqz.common.core.constant.CommonConstants;
-import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.log.annotation.SysLog;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
@@ -90,7 +89,6 @@ import com.qunzhixinxi.hnqz.common.sequence.sequence.Sequence;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.commons.collections4.CollectionUtils;
-import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang.StringUtils;
 import org.springframework.context.ApplicationEventPublisher;
 import org.springframework.data.redis.core.StringRedisTemplate;
@@ -169,7 +167,7 @@ public class WmScorePackageController {
     private final Sequence pkgSequence;
     private final SysPlanPkgService planPkgService;
     private final WmPackageManager packageManager;
-    private final WmPackageTaskTypeQtyService packageTaskTypeQtyService;
+    private final WmPackageContractService packageContractService;
     private final ApplicationEventPublisher applicationEventPublisher;
 
 
@@ -1572,6 +1570,18 @@ public class WmScorePackageController {
 
             }
 
+            if (CollUtil.isNotEmpty(finalRecords)){
+                Set<Integer> pkgIds = finalRecords.stream().map(WmScorePackage::getId).mapToInt(Integer::valueOf).boxed().collect(Collectors.toSet());
+                Map<Integer, List<WmPackageContract>> collect = packageContractService.list(Wrappers.<WmPackageContract>lambdaQuery()
+                                .in(WmPackageContract::getPackageId, pkgIds)
+                                .orderByDesc(WmPackageContract::getCreateTime))
+                        .stream().collect(Collectors.groupingBy(WmPackageContract::getPackageId));
+                finalRecords.forEach(pkg -> {
+                    List<WmPackageContract> wmPackageContracts = collect.get(Integer.valueOf(pkg.getId()));
+                    pkg.setContract(CollUtil.isNotEmpty(wmPackageContracts) ? wmPackageContracts.get(0) : null);
+                });
+            }
+
             pageAnswer.setRecords(finalRecords);
         } catch (ExecutionException | InterruptedException e) {
             log.error("获取分页信息失败", e);
@@ -1793,330 +1803,17 @@ public class WmScorePackageController {
      */
     @SysLog("新增积分包(大包)")
     @PostMapping("/saves")
-    @Transactional(rollbackFor = Exception.class)
     public R<?> saves(@RequestBody WmScorePackage wmScorePackage) {
 
         log.info("新增积分包(大包)入参:{}", wmScorePackage);
 
-        HnqzUser operator = SecurityUtils.getUser();
-        LocalDateTime now = LocalDateTime.now();
-        List<Integer> roles = SecurityUtils.getRoles();
-        Integer deptId = operator.getDeptId();
-        Integer userId = operator.getId();
-        Integer planId = wmScorePackage.getPlanId();
-
-        String relPkgId = wmScorePackage.getRelationScoreId();
-        boolean relatedScoreId = CharSequenceUtil.isNotBlank(relPkgId) && Integer.parseInt(relPkgId) > 0;
-        SysDeptRecharge deptRecharge = null;
-
-        // 校验积分值
-        if (wmScorePackage.getScore() <= 0) {
-            return R.failed("积分包分值必须大于0");
-        }
-
-        // 校验积分包名称是否存在
-        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
-
-            int existed = wmScorePackageService.count(Wrappers.<WmScorePackage>lambdaQuery()
-                    .eq(WmScorePackage::getDelFlag, "0")
-                    .eq(WmScorePackage::getScorePackageName, wmScorePackage.getScorePackageName())
-                    .eq(WmScorePackage::getDeptId, wmScorePackage.getDeptId()));
-
-            if (existed != 0) {
-                return R.failed("积分包名称已存在");
-            }
-        }
-
-        // 校验积分值
-        if (!relatedScoreId) {
-            // 校验 发包积分 < 积分充值分配的积分 则可以发包
-            deptRecharge = sysDeptRechargeMapper.selectOne(Wrappers.<SysDeptRecharge>lambdaQuery().eq(SysDeptRecharge::getDeptId, deptId));
-            if (deptRecharge == null) {
-                log.error("未配置积分充值信息");
-                throw new BizException("积分余额:0,积分不足");
-            }
-            long limitScore = deptRecharge.getScore() + deptRecharge.getOverdrawScore();
-            if (wmScorePackage.getScore() > limitScore) {
-                log.error("已分配积分不足,发包积分={},剩余积分={},透支额度={}", wmScorePackage.getScore(), deptRecharge.getScore(), limitScore);
-                throw new BizException(String.format("积分余额:%s,积分不足", deptRecharge.getScore()));
-            }
-        } else {
-            // 校验上级可分配积分值
-            List<WmScorePackage> scorePackagekfpjf =
-                    wmScorePackageService.getScorePackagekfpjf(
-                            null,
-                            null,
-                            new String[]{"0", "1", "2"},
-                            new String[]{wmScorePackage.getRelationScoreId()});
-
-            if (CollUtil.isNotEmpty(scorePackagekfpjf)) {
-                int kfpjf = scorePackagekfpjf.get(0).getKfpjf();
-                if (wmScorePackage.getScore() > kfpjf) {
-                    log.error("可分配积分值不足");
-                    throw new BizException("可分配积分值不足");
-                }
-            }
-        }
-
-        wmScorePackage.setPackageType1("1");
-        wmScorePackage.setDelFlag("0");
-        wmScorePackage.setEnableFlag("0");
-        wmScorePackage.setPackageIsConduct("0");
-        wmScorePackage.setDrugEntId(null);
-        wmScorePackage.setCreateUser(userId);
-        wmScorePackage.setCreateTime(now);
-        wmScorePackage.setUpdateTime(now);
-        wmScorePackage.setPackageFinishStatus("0");
-        wmScorePackage.setPackageAuditStatus("0");
-        wmScorePackage.setSendPackageDeptId(deptId.toString());
-        wmScorePackage.setAllocationDate(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN).format(now));
-        if (wmScorePackage.getEndTime() == null) {
-            // 默认截止日期为一年后
-            wmScorePackage.setEndTime(now.plusYears(1).toLocalDate());
-        }
-
-        // 关联上级推广药品企业(兼容历史)
-        if (StringUtils.isEmpty(relPkgId)) {
-            wmScorePackage.setDrugProducerList(null);
-        } else if (StringUtils.isNotEmpty(relPkgId) && ArrayUtils.isEmpty(wmScorePackage.getDrugtable())) {
-            // 关联上级推广药品
-            WmScorePackage relateSp = wmScorePackageService.getById(relPkgId);
-            if (relateSp != null) {
-                wmScorePackage.setDrugtable(relateSp.getDrugtable());
-            }
-        }
-
-        SysDept sysDeptRelatedService = sysDeptService.getById(Integer.valueOf(wmScorePackage.getRelatedService()));
-        if (CharSequenceUtil.isBlank(wmScorePackage.getTypeid())) {
-            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(deptId);
-            if (wmDaDrugEnt != null) {
-                if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
-                    WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
-                    SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
-                    if (sysDepts.getLevel() == 3) {
-                        wmScorePackage.setLevel1Id(wmDaAgent.getId());
-                    } else if (sysDepts.getLevel() == 4) {
-                        wmScorePackage.setLevel2Id(wmDaAgent.getId());
-                    }
-                    wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
-                    wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                } else if (wmDaDrugEnt.getId().toString().equals(wmScorePackage.getAcceptSug())) {
-                    wmScorePackage.setDeptId(deptId.toString());
-                    wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                }
-            } else {
-                if (sysDeptRelatedService.getLevel() == 2) {
-                    WmDaDrugEnt wmDaDrugEnts = wmDaDrugEntService.selectByDeptId(Integer.valueOf(wmScorePackage.getRelatedService()));
-                    if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaDrugEnts.getId().toString())) {
-                        WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
-                        SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
-
-                        if (sysDepts.getLevel() == 3) {
-                            wmScorePackage.setLevel1Id(wmDaAgent.getId());
-                        } else if (sysDepts.getLevel() == 4) {
-                            wmScorePackage.setLevel2Id(wmDaAgent.getId());
-                        }
-                        wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
-                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                    } else if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
-                        wmScorePackage.setDeptId(String.valueOf(SecurityUtils.getUser().getDeptId()));
-                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                    }
-                } else if (sysDeptRelatedService.getLevel() == 3) {
-                    WmDaAgent wmDaAgent1 = wmDaAgentService.selectByDeptId(Integer.valueOf(wmScorePackage.getRelatedService()));
-                    if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaAgent1.getId().toString())) {
-                        WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
-                        SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
-                        if (sysDepts.getLevel() == 3) {
-                            wmScorePackage.setLevel1Id(wmDaAgent.getId());
-                        } else if (sysDepts.getLevel() == 4) {
-                            wmScorePackage.setLevel2Id(wmDaAgent.getId());
-                        }
-                        wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
-                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                    } else if (wmDaAgent1.getId().toString().equals(wmScorePackage.getAcceptSug())) {
-                        wmScorePackage.setDeptId(deptId.toString());
-                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
-                    }
-                }
-            }
-        }
-
-        // 药企规则ID
-        SysDept sysDeptRuleId = sysDeptService.getById(deptId);
-        Integer deptLevel = sysDeptRuleId.getLevel();
-
-        if (deptLevel == 2) {
-            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(sysDeptRuleId.getDeptId());
-            if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
-                wmScorePackage.setRuleId(wmScorePackage.getAcceptSug());
-                wmScorePackage.setDrugEntId(wmDaDrugEnt.getId());
-            } else {
-                WmTaskType wmTaskType = new WmTaskType();
-                wmTaskType.setRuleId(wmDaDrugEnt.getId() + wmScorePackage.getAcceptSug());
-                List<WmTaskType> wmTaskTypeList = wmTaskTypeService.selectByRuleId(wmTaskType);
-                if (CollUtil.isNotEmpty(wmTaskTypeList)) {
-                    wmScorePackage.setRuleId(wmDaDrugEnt.getId() + wmScorePackage.getAcceptSug());
-                    wmScorePackage.setDrugEntId(wmDaDrugEnt.getId());
-                } else {
-                    log.error("请药企给下级cso分配积分规则");
-                    return R.failed("请药企给下级cso分配积分规则");
-                }
-
-            }
-        } else if (deptLevel == 3) {
-            // 一级cso规则ID
-            WmDaAgent daAgent = wmDaAgentService.getOne(Wrappers.<WmDaAgent>lambdaQuery()
-                    .eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
-                    .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
-                    .eq(WmDaAgent::getDeptId, String.valueOf(sysDeptRuleId.getDeptId())));
-            if (StringUtils.isNotBlank(wmScorePackage.getRelationScoreId())) {
-                // 关联了积分包的情况
-                WmScorePackage relationScorePackage = wmScorePackageService.getById(wmScorePackage.getRelationScoreId());
-                if (relationScorePackage != null) {
-                    wmScorePackage.setRuleId(relationScorePackage.getRuleId());
-                    wmScorePackage.setDrugEntId(relationScorePackage.getDrugEntId());
-                } else {
-                    log.error("cso没有分配积分规则");
-                    return R.failed("cso没有分配积分规则");
-                }
-            } else {
-                // 没有关联积分包的情况
-                List<WmTaskType> taskTypeList = wmTaskTypeService.list(Wrappers.<WmTaskType>lambdaQuery()
-                        .eq(WmTaskType::getRuleId, daAgent.getId()));
-                if (CollectionUtil.isNotEmpty(taskTypeList)) {
-                    wmScorePackage.setRuleId(daAgent.getId().toString());
-                    wmScorePackage.setDrugEntId(null);
-                } else {
-                    log.error("cso没有分配积分规则");
-                    return R.failed("cso没有分配积分规则");
-                }
-            }
-        }
-
-        // 保存积分包
-        String typeId = "";
-        if (roles.contains(4) || roles.contains(37) || roles.contains(3)) {
-            if (deptLevel == 2) {
-                typeId = wmScorePackage.getDeptId().equals(deptId.toString()) ? "0" : "1";
-            } else if (deptLevel == 3) {
-                typeId = wmScorePackage.getDeptId().equals(deptId.toString()) ? "1" : "2";
-            }
-        }
-        wmScorePackage.setTypeid(typeId);
-        boolean isAnswer = wmScorePackageService.save(wmScorePackage);
-
-        // 发包成功 更新 上级包
-        if (isAnswer) {
-            if ((roles.contains(4) || roles.contains(37) || roles.contains(3)) && deptLevel == 3) {
-                WmScorePackage relPkg = wmScorePackageService.getById(relPkgId);
-                // 是当前操作人所在企业的的关联包
-                if (relPkg != null && deptId.toString().equals(relPkg.getDeptId())) {
-                    relPkg.setKfpjf((int) Math.ceil(relPkg.getKfpjf() - wmScorePackage.getScore()));
-                    // 判断积分包是否被发放 (原有外包业务逻辑,不知道为什么)
-                    int count = wmScorePackageService.count(Wrappers.<WmScorePackage>lambdaQuery()
-                            .ne(WmScorePackage::getId, wmScorePackage.getId())
-                            .eq(WmScorePackage::getId, relPkgId)
-                            .eq(WmScorePackage::getEnableFlag, "0")
-                            .notIn(WmScorePackage::getTypeid, 3, 4));
-
-                    relPkg.setPackageIsConduct(count == 0 ? "0" : "1");
-                    wmScorePackageService.updateById(relPkg);
-                }
-            }
-        }
-        // 失败了
-        else {
-            return R.failed("下发积分包失败");
-        }
-
-        List<WmScoreTaskType> taskTypeList = wmScorePackage.getWmScoreTaskTypeList();
-        if (CollUtil.isNotEmpty(taskTypeList)) {
-
-            if (CharSequenceUtil.isBlank(relPkgId) || (CharSequenceUtil.isNotBlank(relPkgId) && deptLevel == 3)) {
-                List<WmScoreTaskType> scoreTaskTypes = taskTypeList.stream().map(taskType -> {
-                    WmScoreTaskType wmScoreTaskType = new WmScoreTaskType();
-                    wmScoreTaskType.setScoreId(wmScorePackage.getId());
-                    wmScoreTaskType.setType("1");
-                    wmScoreTaskType.setTaskTypeId(taskType.getTaskTypeId());
-
-                    return wmScoreTaskType;
-                }).collect(Collectors.toList());
-                wmScoreTaskTypeService.deleteByScoreId(wmScorePackage.getId());
-                // todo
-                wmScoreTaskTypeService.saveBatch(scoreTaskTypes);
-                // wmScoreTaskTypeService.batchInsertType(scoreTaskTypes);
-            }
-        }
-
-
-        if (!relatedScoreId) {
-            // 更新积分充值信息
-            long currentScore = deptRecharge.getScore() - (long) wmScorePackage.getScore();
-            int updateRecharge = sysDeptRechargeMapper.update(null, Wrappers.<SysDeptRecharge>lambdaUpdate()
-                    .eq(SysDeptRecharge::getId, deptRecharge.getId())
-                    .eq(SysDeptRecharge::getVersion, deptRecharge.getVersion())
-                    .set(SysDeptRecharge::getScore, currentScore)
-                    .set(SysDeptRecharge::getVersion, deptRecharge.getVersion() + 1)
-                    .set(SysDeptRecharge::getUpdateTime, now)
-                    .set(SysDeptRecharge::getUpdateUser, userId));
-            if (updateRecharge <= 0) {
-                log.warn("更新积分充值信息失败");
-                throw new RuntimeException("操作失败,请重试");
-            }
-            // 更新积分充值记录
-            SysDeptRechargeRecord rechargeRecord = new SysDeptRechargeRecord();
-            rechargeRecord.setDeptId(deptId);
-            rechargeRecord.setChangeScore((long) -wmScorePackage.getScore());
-            rechargeRecord.setRechargeId(deptRecharge.getId());
-            rechargeRecord.setPackageId(wmScorePackage.getId());
-            rechargeRecord.setPackageType(RechargeRecordPackageType.TO_ENTERPRISE);
-            rechargeRecord.setType(RechargeRecordType.SEND_PACKAGE_DEPT);
-            rechargeRecord.setCurrentScore(currentScore);
-            rechargeRecord.setCreateUser(userId);
-            rechargeRecord.setCreateTime(now);
-            sysDeptRechargeRecordMapper.insert(rechargeRecord);
-        }
-
-        // 保存关联的试卷
-        if (CollUtil.isNotEmpty(wmScorePackage.getQuizIds())) {
-            pkgQuizRelationService.createPkgQuizzes(wmScorePackage.getQuizIds(), Integer.parseInt(wmScorePackage.getId()));
-        }
-
-        // 判断是否有关联关系
-        if (CollUtil.isNotEmpty(wmScorePackage.getQuizRelationIds())) {
-            pkgQuizRelationService.copyQuizRelations(wmScorePackage.getQuizRelationIds(), Integer.parseInt(wmScorePackage.getId()));
-        }
-
-        // 关联计划
-        SysPlanPkg rel = new SysPlanPkg();
-        rel.setPlanId(planId);
-        rel.setPkgId(Integer.valueOf(wmScorePackage.getId()));
-        rel.setCreateTime(LocalDateTime.now());
-
-        planPkgService.save(rel);
-
-        // 保存积分包任务类型数量限制 && 异步生成合同
-        List<Map<String, Object>> typeQtyList = wmScorePackage.getPkgTaskTypeQtyList();
-        if (CollUtil.isNotEmpty(typeQtyList)) {
-
-            List<WmPackageTaskTypeQty> collect = typeQtyList.stream().map(m -> {
-                WmPackageTaskTypeQty typeQty = new WmPackageTaskTypeQty();
-                typeQty.setPackageId(Integer.valueOf(wmScorePackage.getId()));
-                typeQty.setTaskTypeName((String) m.get("taskTypeName"));
-                typeQty.setPrice((Integer) m.get("price"));
-                typeQty.setTaskTypeId((Integer) m.get("taskTypeId"));
-                typeQty.setQty((Integer) m.get("qty"));
-                typeQty.setCreateTime(LocalDateTime.now());
-                return typeQty;
-            }).collect(Collectors.toList());
-
-            packageTaskTypeQtyService.saveBatch(collect);
-
-            // 异步生成合同
-            applicationEventPublisher.publishEvent(new PackageContractEvent(Integer.valueOf(wmScorePackage.getId()), collect));
 
+        PackageContractEvent contractEvent = wmScorePackageService.saveEntPkg(wmScorePackage);
 
+        // 异步生成合同
+        if (contractEvent != null && CollUtil.isNotEmpty(contractEvent.getTaskTypeQtiyList())) {
+            contractEvent.setCreator(SecurityUtils.getUser().getUsername());
+            applicationEventPublisher.publishEvent(contractEvent);
         }
 
         return R.ok();

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

@@ -1,8 +1,7 @@
 package com.qunzhixinxi.hnqz.admin.event;
 
 import com.qunzhixinxi.hnqz.admin.api.entity.WmPackageTaskTypeQty;
-import lombok.AllArgsConstructor;
-import lombok.Getter;
+import lombok.Data;
 
 import java.util.List;
 
@@ -12,12 +11,13 @@ import java.util.List;
  * @author jimmy
  * @date 2024-08-17 21:31
  */
-@Getter
-@AllArgsConstructor
+@Data
 public class PackageContractEvent {
 
     private Integer packageId;
 
     private List<WmPackageTaskTypeQty> taskTypeQtiyList;
 
+    private String creator;
+
 }

+ 19 - 14
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/listener/PackageContractEventListener.java

@@ -116,7 +116,7 @@ public class PackageContractEventListener {
         // 上传到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);
+        Map<String, String> uploaded = fileService.upload(multipartFile, event.getCreator());
         String fileId = uploaded.get("fileId");
 
         // 保存合同对象
@@ -135,6 +135,7 @@ public class PackageContractEventListener {
 
         // 获取积分包
         WmScorePackage pkg = packageService.getById(event.getPackageId().toString());
+        log.info("pkg_info:【{}】", pkg);
 
         // 通过药品获取甲方信息
         String[] drugtable = pkg.getDrugtable();
@@ -143,20 +144,24 @@ public class PackageContractEventListener {
         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());
+        if (mah != null) {
+            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());
+        SysEntContractInfo contractInfo = entContractInfoMapper.selectById(pkg.getDeptId());
+        if (contractInfo != null) {
+            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()));
@@ -173,8 +178,8 @@ public class PackageContractEventListener {
         // Map<Integer, String> collect = qtyList.stream().collect(Collectors.toMap(WmPackageTaskTypeQty::getTaskTypeId, WmPackageTaskTypeQty::getTaskTypeName));
 
 
-        for (int i = 1, size = qtyList.size() + 1; i <= size; i++) {
-            String prefix = "s" + i;
+        for (int i = 0, size = qtyList.size(); i < size; i++) {
+            String prefix = "s" + (i + 1);
             WmPackageTaskTypeQty qty = qtyList.get(i);
             // WmTaskType taskType = collect.get(qty.getTaskTypeId().toString());
 

+ 19 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysImplementPlanManager.java

@@ -20,6 +20,7 @@ import com.qunzhixinxi.hnqz.admin.api.entity.SysImplPlanDetailsItem;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysImplementPlan;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysPlanPkg;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmScorePackage;
+import com.qunzhixinxi.hnqz.admin.api.entity.WmTaskType;
 import com.qunzhixinxi.hnqz.admin.api.vo.SysImplementPlanVO;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysImplPlanDetailsItemService;
@@ -29,6 +30,7 @@ import com.qunzhixinxi.hnqz.admin.service.SysPlanPkgService;
 import com.qunzhixinxi.hnqz.admin.service.SysRoleService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntDrugtableService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
+import com.qunzhixinxi.hnqz.admin.service.WmTaskTypeService;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import lombok.AllArgsConstructor;
@@ -62,6 +64,7 @@ public class SysImplementPlanManager {
     private final WmDaDrugEntDrugtableService drugEntDrugtableService;
     private final SysPlanPkgService planPkgService;
     private final WmScorePackageService scorePackageService;
+    private final WmTaskTypeService taskTypeService;
 
     /**
      * 创建计划
@@ -443,7 +446,7 @@ public class SysImplementPlanManager {
         List<Map<String, String>> skuList = drugEntDrugtableService.listDrugs(skuIds);
         Map<Integer, Map<String, String>> skuMap = skuList.stream().collect(Collectors.toMap(sku -> Integer.valueOf(sku.get("drug_id")), Function.identity()));
 
-
+        Map<String, WmTaskType> collect = taskTypeService.list(Wrappers.<WmTaskType>lambdaQuery().lt(WmTaskType::getId, "100")).stream().collect(Collectors.toMap(WmTaskType::getTaskTypeName, Function.identity()));
         return plans.stream().map(p -> {
             SysImplementPlanVO.ToList copied = BeanUtil.copyProperties(p, SysImplementPlanVO.ToList.class);
 
@@ -466,9 +469,23 @@ public class SysImplementPlanManager {
             SysImplPlanDetails details = implPlanDetailsService.getDetailsByPlanId(p.getPlanId());
             copied.setPlanDetails(details);
             if (details != null) {
+
                 // 拆解子项
                 List<SysImplPlanDetailsItem> detailsItems = implPlanDetailsItemService.listDetailItems(details.getDetailsId()).stream().filter(item -> item.getQty() > 0).collect(Collectors.toList());
-                copied.setPlanItems(detailsItems);
+
+                List<Map<String, Object>> coll = null;
+                if (CollUtil.isNotEmpty(detailsItems)) {
+
+                    coll = detailsItems.stream().map(item -> {
+                        Map<String, Object> map = BeanUtil.copyProperties(item, Map.class);
+                        WmTaskType taskType = collect.get(item.getTaskTypeName());
+                        map.put("orgTaskTypeId", taskType.getId());
+                        map.put("parent_id", taskType.getParentId());
+                        return map;
+                    }).collect(Collectors.toList());
+                }
+
+                copied.setPlanItems(CollUtil.isNotEmpty(coll) ? coll : Collections.emptyList());
             }
 
 

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

@@ -34,7 +34,7 @@ public interface SysFileService extends IService<SysFile> {
      * @param file 文件
      * @return 上传结果
      */
-    Map<String, String> upload(MultipartFile file);
+    Map<String, String> upload(MultipartFile file, String username);
 
     /**
      * 上传文件
@@ -67,4 +67,5 @@ public interface SysFileService extends IService<SysFile> {
 
     String uploadImgByByte(InputStream inputStream);
 
+    void getFileById(Integer fileId, HttpServletResponse response);
 }

+ 9 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/WmScorePackageService.java

@@ -20,6 +20,7 @@ import com.qunzhixinxi.hnqz.admin.api.model.input.WmScorePackageApiOutput;
 import com.qunzhixinxi.hnqz.admin.api.model.input.WmScorePackageSettleInput;
 import com.qunzhixinxi.hnqz.admin.api.model.input.WmScorePackageSettleOutput;
 import com.qunzhixinxi.hnqz.admin.api.vo.SettleFinancialReviewVO;
+import com.qunzhixinxi.hnqz.admin.event.PackageContractEvent;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 
@@ -269,4 +270,12 @@ public interface WmScorePackageService extends IService<WmScorePackage> {
     void pageForSupervision(Page<Map<String, Object>> page, String pkgName, Boolean supervision, Set<Integer> finalEntIds);
 
     Map<String, Object> indPkgStat(HnqzUser user);
+
+    /**
+     * 创建大包
+     *
+     * @param wmScorePackage 包参数
+     * @return 合同事件
+     */
+    PackageContractEvent saveEntPkg(WmScorePackage wmScorePackage);
 }

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

@@ -14,6 +14,7 @@ import com.qunzhixinxi.hnqz.admin.service.SysFileService;
 import com.qunzhixinxi.hnqz.common.core.util.R;
 import com.qunzhixinxi.hnqz.common.oss.OssProperties;
 import com.qunzhixinxi.hnqz.common.oss.service.OssTemplate;
+import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.SneakyThrows;
@@ -58,7 +59,8 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
      */
     @Override
     public R<Map<String, String>> uploadFile(MultipartFile file) {
-        return R.ok(upload(file));
+        HnqzUser user = SecurityUtils.getUser();
+        return R.ok(upload(file, user.getUsername()));
     }
 
     /**
@@ -68,7 +70,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
      * @return 上传结果
      */
     @Override
-    public Map<String, String> upload(MultipartFile file) {
+    public Map<String, String> upload(MultipartFile file, String username) {
         // 判断是否有重名的操作
         String fileName = IdUtil.simpleUUID() + StrPool.DOT + FileUtil.extName(file.getOriginalFilename());
         Map<String, String> resultMap = new HashMap<>(5);
@@ -81,7 +83,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            SysFile sysFile = fileLog(file, fileName, url);
+            SysFile sysFile = fileLog(file, fileName, url, username);
             resultMap.put("fileId", String.valueOf(sysFile.getId()));
 
         } catch (Exception e) {
@@ -111,7 +113,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName, url);
+            fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
         } catch (Exception e) {
             log.error("上传失败", e);
             return R.failed(e.getLocalizedMessage());
@@ -142,7 +144,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         try {
             minioTemplate.putObject(ossProperties.getBucketName(), fileName, file.getInputStream());
             // 文件管理数据记录,收集管理追踪文件
-            fileLog(file, fileName, url);
+            fileLog(file, fileName, url, SecurityUtils.getUser().getUsername());
         } catch (Exception e) {
             log.error("上传失败", e);
             return R.failed(e.getLocalizedMessage());
@@ -217,7 +219,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
      * @param file     上传文件格式
      * @param fileName 文件名
      */
-    private SysFile fileLog(MultipartFile file, String fileName, String url) {
+    private SysFile fileLog(MultipartFile file, String fileName, String url, String username) {
         SysFile sysFile = new SysFile();
         // 原文件名
         String original = file.getOriginalFilename();
@@ -227,9 +229,7 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         sysFile.setType(FileUtil.extName(original));
         sysFile.setBucketName(ossProperties.getBucketName());
         sysFile.setPath(url);
-        if (null != SecurityUtils.getUser()) {
-            sysFile.setCreateUser(SecurityUtils.getUser().getUsername());
-        }
+        sysFile.setCreateUser(username);
         this.save(sysFile);
         return sysFile;
     }
@@ -255,4 +255,12 @@ public class SysFileServiceImpl extends ServiceImpl<SysFileMapper, SysFile> impl
         return null;
     }
 
+    @Override
+    public void getFileById(Integer fileId, HttpServletResponse response) {
+        SysFile file = this.getById(fileId);
+
+        this.getFile(file.getBucketName(), file.getFileName(), response);
+
+    }
+
 }

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

@@ -3,6 +3,8 @@ package com.qunzhixinxi.hnqz.admin.service.impl;
 import cn.hutool.core.bean.BeanUtil;
 import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DatePattern;
+import cn.hutool.core.text.CharSequenceUtil;
 import cn.hutool.core.util.ArrayUtil;
 import cn.hutool.core.util.DesensitizedUtil;
 import cn.hutool.core.util.RandomUtil;
@@ -28,6 +30,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.WmPackageTaskTypeQty;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmPkgQuizRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReport;
 import com.qunzhixinxi.hnqz.admin.api.entity.WmReportOpt;
@@ -59,6 +62,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.event.PackageContractEvent;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRechargeMapper;
 import com.qunzhixinxi.hnqz.admin.mapper.SysDeptRechargeRecordMapper;
@@ -73,12 +77,15 @@ import com.qunzhixinxi.hnqz.admin.mapper.WmTaskTypeMapper;
 import com.qunzhixinxi.hnqz.admin.service.SysDeptService;
 import com.qunzhixinxi.hnqz.admin.service.SysDictItemService;
 import com.qunzhixinxi.hnqz.admin.service.SysImplementPlanService;
+import com.qunzhixinxi.hnqz.admin.service.SysPlanPkgService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaAgentService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntDrugtableService;
 import com.qunzhixinxi.hnqz.admin.service.WmDaDrugEntService;
+import com.qunzhixinxi.hnqz.admin.service.WmPackageTaskTypeQtyService;
 import com.qunzhixinxi.hnqz.admin.service.WmPkgQuizRelationService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageService;
 import com.qunzhixinxi.hnqz.admin.service.WmScorePackageStatusService;
+import com.qunzhixinxi.hnqz.admin.service.WmScoreTaskTypeService;
 import com.qunzhixinxi.hnqz.admin.service.WmTeamService;
 import com.qunzhixinxi.hnqz.admin.util.MapUtil;
 import com.qunzhixinxi.hnqz.common.core.exception.BizException;
@@ -88,6 +95,7 @@ import com.qunzhixinxi.hnqz.common.security.service.HnqzUser;
 import com.qunzhixinxi.hnqz.common.security.util.SecurityUtils;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.ArrayUtils;
 import org.apache.commons.lang3.StringUtils;
 import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.scheduling.annotation.Async;
@@ -148,6 +156,9 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
     private final WmDaDrugEntDrugtableService drugEntDrugtableService;
     private final SysPlanPkgMapper sysPlanPkgMapper;
     private final SysImplementPlanService implementPlanService;
+    private final WmPackageTaskTypeQtyService packageTaskTypeQtyService;
+    private final WmScoreTaskTypeService wmScoreTaskTypeService;
+    private final SysPlanPkgService planPkgService;
 
     @Override
     public List<WmScorePackage> listWmScorePackageAndTask(WmScorePackage wmScorePackage) {
@@ -3932,6 +3943,341 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
         return records;
     }
 
+    /**
+     * 创建大包
+     *
+     * @param wmScorePackage 包参数
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public PackageContractEvent saveEntPkg(WmScorePackage wmScorePackage) {
+        HnqzUser operator = SecurityUtils.getUser();
+        LocalDateTime now = LocalDateTime.now();
+        List<Integer> roles = SecurityUtils.getRoles();
+        Integer deptId = operator.getDeptId();
+        Integer userId = operator.getId();
+        Integer planId = wmScorePackage.getPlanId();
+
+        String relPkgId = wmScorePackage.getRelationScoreId();
+        boolean relatedScoreId = CharSequenceUtil.isNotBlank(relPkgId) && Integer.parseInt(relPkgId) > 0;
+        SysDeptRecharge deptRecharge = null;
+
+        // 校验积分值
+        if (wmScorePackage.getScore() <= 0) {
+            throw new RuntimeException("积分包分值必须大于0");
+        }
+
+        // 校验积分包名称是否存在
+        if (CharSequenceUtil.isNotBlank(wmScorePackage.getScorePackageName())) {
+
+            int existed = this.count(Wrappers.<WmScorePackage>lambdaQuery()
+                    .eq(WmScorePackage::getDelFlag, "0")
+                    .eq(WmScorePackage::getScorePackageName, wmScorePackage.getScorePackageName())
+                    .eq(WmScorePackage::getDeptId, wmScorePackage.getDeptId()));
+
+            if (existed != 0) {
+                throw new RuntimeException("积分包名称已存在");
+            }
+        }
+
+        // 校验积分值
+        if (!relatedScoreId) {
+            // 校验 发包积分 < 积分充值分配的积分 则可以发包
+            deptRecharge = sysDeptRechargeMapper.selectOne(Wrappers.<SysDeptRecharge>lambdaQuery().eq(SysDeptRecharge::getDeptId, deptId));
+            if (deptRecharge == null) {
+                log.error("未配置积分充值信息");
+                throw new BizException("积分余额:0,积分不足");
+            }
+            long limitScore = deptRecharge.getScore() + deptRecharge.getOverdrawScore();
+            if (wmScorePackage.getScore() > limitScore) {
+                log.error("已分配积分不足,发包积分={},剩余积分={},透支额度={}", wmScorePackage.getScore(), deptRecharge.getScore(), limitScore);
+                throw new BizException(String.format("积分余额:%s,积分不足", deptRecharge.getScore()));
+            }
+        } else {
+            // 校验上级可分配积分值
+            List<WmScorePackage> scorePackagekfpjf =
+                    this.getScorePackagekfpjf(
+                            null,
+                            null,
+                            new String[]{"0", "1", "2"},
+                            new String[]{wmScorePackage.getRelationScoreId()});
+
+            if (CollUtil.isNotEmpty(scorePackagekfpjf)) {
+                int kfpjf = scorePackagekfpjf.get(0).getKfpjf();
+                if (wmScorePackage.getScore() > kfpjf) {
+                    log.error("可分配积分值不足");
+                    throw new BizException("可分配积分值不足");
+                }
+            }
+        }
+
+        wmScorePackage.setPackageType1("1");
+        wmScorePackage.setDelFlag("0");
+        wmScorePackage.setEnableFlag("0");
+        wmScorePackage.setPackageIsConduct("0");
+        wmScorePackage.setDrugEntId(null);
+        wmScorePackage.setCreateUser(userId);
+        wmScorePackage.setCreateTime(now);
+        wmScorePackage.setUpdateTime(now);
+        wmScorePackage.setPackageFinishStatus("0");
+        wmScorePackage.setPackageAuditStatus("0");
+        wmScorePackage.setSendPackageDeptId(deptId.toString());
+        wmScorePackage.setAllocationDate(DateTimeFormatter.ofPattern(DatePattern.NORM_DATETIME_PATTERN).format(now));
+        if (wmScorePackage.getEndTime() == null) {
+            // 默认截止日期为一年后
+            wmScorePackage.setEndTime(now.plusYears(1).toLocalDate());
+        }
+
+        // 关联上级推广药品企业(兼容历史)
+        if (org.apache.commons.lang.StringUtils.isEmpty(relPkgId)) {
+            wmScorePackage.setDrugProducerList(null);
+        } else if (org.apache.commons.lang.StringUtils.isNotEmpty(relPkgId) && ArrayUtils.isEmpty(wmScorePackage.getDrugtable())) {
+            // 关联上级推广药品
+            WmScorePackage relateSp = this.getById(relPkgId);
+            if (relateSp != null) {
+                wmScorePackage.setDrugtable(relateSp.getDrugtable());
+            }
+        }
+
+        SysDept sysDeptRelatedService = sysDeptService.getById(Integer.valueOf(wmScorePackage.getRelatedService()));
+        if (CharSequenceUtil.isBlank(wmScorePackage.getTypeid())) {
+            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(deptId);
+            if (wmDaDrugEnt != null) {
+                if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
+                    WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
+                    SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
+                    if (sysDepts.getLevel() == 3) {
+                        wmScorePackage.setLevel1Id(wmDaAgent.getId());
+                    } else if (sysDepts.getLevel() == 4) {
+                        wmScorePackage.setLevel2Id(wmDaAgent.getId());
+                    }
+                    wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
+                    wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                } else if (wmDaDrugEnt.getId().toString().equals(wmScorePackage.getAcceptSug())) {
+                    wmScorePackage.setDeptId(deptId.toString());
+                    wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                }
+            } else {
+                if (sysDeptRelatedService.getLevel() == 2) {
+                    WmDaDrugEnt wmDaDrugEnts = wmDaDrugEntService.selectByDeptId(Integer.valueOf(wmScorePackage.getRelatedService()));
+                    if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaDrugEnts.getId().toString())) {
+                        WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
+                        SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
+
+                        if (sysDepts.getLevel() == 3) {
+                            wmScorePackage.setLevel1Id(wmDaAgent.getId());
+                        } else if (sysDepts.getLevel() == 4) {
+                            wmScorePackage.setLevel2Id(wmDaAgent.getId());
+                        }
+                        wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
+                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                    } else if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
+                        wmScorePackage.setDeptId(String.valueOf(SecurityUtils.getUser().getDeptId()));
+                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                    }
+                } else if (sysDeptRelatedService.getLevel() == 3) {
+                    WmDaAgent wmDaAgent1 = wmDaAgentService.selectByDeptId(Integer.valueOf(wmScorePackage.getRelatedService()));
+                    if (null != wmScorePackage.getAcceptSug() && !wmScorePackage.getAcceptSug().equals(wmDaAgent1.getId().toString())) {
+                        WmDaAgent wmDaAgent = wmDaAgentService.getById(wmScorePackage.getAcceptSug());
+                        SysDept sysDepts = sysDeptService.getById(wmDaAgent.getDeptId());
+                        if (sysDepts.getLevel() == 3) {
+                            wmScorePackage.setLevel1Id(wmDaAgent.getId());
+                        } else if (sysDepts.getLevel() == 4) {
+                            wmScorePackage.setLevel2Id(wmDaAgent.getId());
+                        }
+                        wmScorePackage.setDeptId(wmDaAgent.getDeptId().toString());
+                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                    } else if (wmDaAgent1.getId().toString().equals(wmScorePackage.getAcceptSug())) {
+                        wmScorePackage.setDeptId(deptId.toString());
+                        wmScorePackage.setKfpjf(wmScorePackage.getScore());
+                    }
+                }
+            }
+        }
+
+        // 药企规则ID
+        SysDept sysDeptRuleId = sysDeptService.getById(deptId);
+        Integer deptLevel = sysDeptRuleId.getLevel();
+
+        if (deptLevel == 2) {
+            WmDaDrugEnt wmDaDrugEnt = wmDaDrugEntService.selectByDeptId(sysDeptRuleId.getDeptId());
+            if (wmScorePackage.getAcceptSug().equals(wmDaDrugEnt.getId().toString())) {
+                wmScorePackage.setRuleId(wmScorePackage.getAcceptSug());
+                wmScorePackage.setDrugEntId(wmDaDrugEnt.getId());
+            } else {
+                WmTaskType wmTaskType = new WmTaskType();
+                wmTaskType.setRuleId(wmDaDrugEnt.getId() + wmScorePackage.getAcceptSug());
+                List<WmTaskType> wmTaskTypeList = wmTaskTypeMapper.selectByRuleId(wmTaskType);
+                if (CollUtil.isNotEmpty(wmTaskTypeList)) {
+                    wmScorePackage.setRuleId(wmDaDrugEnt.getId() + wmScorePackage.getAcceptSug());
+                    wmScorePackage.setDrugEntId(wmDaDrugEnt.getId());
+                } else {
+                    log.error("请药企给下级cso分配积分规则");
+                    throw new RuntimeException("请药企给下级cso分配积分规则");
+                }
+
+            }
+        } else if (deptLevel == 3) {
+            // 一级cso规则ID
+            WmDaAgent daAgent = wmDaAgentService.getOne(Wrappers.<WmDaAgent>lambdaQuery()
+                    .eq(WmDaAgent::getEnableFlag, EnableEnum.ENABLE.val())
+                    .eq(WmDaAgent::getDelFlag, DelEnum.NOT_DEL.getVal())
+                    .eq(WmDaAgent::getDeptId, String.valueOf(sysDeptRuleId.getDeptId())));
+            if (org.apache.commons.lang.StringUtils.isNotBlank(wmScorePackage.getRelationScoreId())) {
+                // 关联了积分包的情况
+                WmScorePackage relationScorePackage = this.getById(wmScorePackage.getRelationScoreId());
+                if (relationScorePackage != null) {
+                    wmScorePackage.setRuleId(relationScorePackage.getRuleId());
+                    wmScorePackage.setDrugEntId(relationScorePackage.getDrugEntId());
+                } else {
+                    log.error("cso没有分配积分规则");
+                    throw new RuntimeException("cso没有分配积分规则");
+                }
+            } else {
+                // 没有关联积分包的情况
+                List<WmTaskType> taskTypeList = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery()
+                        .eq(WmTaskType::getRuleId, daAgent.getId()));
+                if (CollectionUtil.isNotEmpty(taskTypeList)) {
+                    wmScorePackage.setRuleId(daAgent.getId().toString());
+                    wmScorePackage.setDrugEntId(null);
+                } else {
+                    log.error("cso没有分配积分规则");
+                    throw new RuntimeException("cso没有分配积分规则");
+                }
+            }
+        }
+
+        // 保存积分包
+        String typeId = "";
+        if (roles.contains(4) || roles.contains(37) || roles.contains(3)) {
+            if (deptLevel == 2) {
+                typeId = wmScorePackage.getDeptId().equals(deptId.toString()) ? "0" : "1";
+            } else if (deptLevel == 3) {
+                typeId = wmScorePackage.getDeptId().equals(deptId.toString()) ? "1" : "2";
+            }
+        }
+        wmScorePackage.setTypeid(typeId);
+        boolean isAnswer = this.save(wmScorePackage);
+
+        // 发包成功 更新 上级包
+        if (isAnswer) {
+            if ((roles.contains(4) || roles.contains(37) || roles.contains(3)) && deptLevel == 3) {
+                WmScorePackage relPkg = this.getById(relPkgId);
+                // 是当前操作人所在企业的的关联包
+                if (relPkg != null && deptId.toString().equals(relPkg.getDeptId())) {
+                    relPkg.setKfpjf((int) Math.ceil(relPkg.getKfpjf() - wmScorePackage.getScore()));
+                    // 判断积分包是否被发放 (原有外包业务逻辑,不知道为什么)
+                    int count = this.count(Wrappers.<WmScorePackage>lambdaQuery()
+                            .ne(WmScorePackage::getId, wmScorePackage.getId())
+                            .eq(WmScorePackage::getId, relPkgId)
+                            .eq(WmScorePackage::getEnableFlag, "0")
+                            .notIn(WmScorePackage::getTypeid, 3, 4));
+
+                    relPkg.setPackageIsConduct(count == 0 ? "0" : "1");
+                    this.updateById(relPkg);
+                }
+            }
+        }
+        // 失败了
+        else {
+            throw new RuntimeException("下发积分包失败");
+        }
+
+        List<WmScoreTaskType> taskTypeList = wmScorePackage.getWmScoreTaskTypeList();
+        if (CollUtil.isNotEmpty(taskTypeList)) {
+
+            if (CharSequenceUtil.isBlank(relPkgId) || (CharSequenceUtil.isNotBlank(relPkgId) && deptLevel == 3)) {
+                List<WmScoreTaskType> scoreTaskTypes = taskTypeList.stream().map(taskType -> {
+                    WmScoreTaskType wmScoreTaskType = new WmScoreTaskType();
+                    wmScoreTaskType.setScoreId(wmScorePackage.getId());
+                    wmScoreTaskType.setType("1");
+                    wmScoreTaskType.setTaskTypeId(taskType.getTaskTypeId());
+
+                    return wmScoreTaskType;
+                }).collect(Collectors.toList());
+                wmScoreTaskTypeService.deleteByScoreId(wmScorePackage.getId());
+                // todo
+                wmScoreTaskTypeService.saveBatch(scoreTaskTypes);
+                // wmScoreTaskTypeService.batchInsertType(scoreTaskTypes);
+            }
+        }
+
+
+        if (!relatedScoreId) {
+            // 更新积分充值信息
+            long currentScore = deptRecharge.getScore() - (long) wmScorePackage.getScore();
+            int updateRecharge = sysDeptRechargeMapper.update(null, Wrappers.<SysDeptRecharge>lambdaUpdate()
+                    .eq(SysDeptRecharge::getId, deptRecharge.getId())
+                    .eq(SysDeptRecharge::getVersion, deptRecharge.getVersion())
+                    .set(SysDeptRecharge::getScore, currentScore)
+                    .set(SysDeptRecharge::getVersion, deptRecharge.getVersion() + 1)
+                    .set(SysDeptRecharge::getUpdateTime, now)
+                    .set(SysDeptRecharge::getUpdateUser, userId));
+            if (updateRecharge <= 0) {
+                log.warn("更新积分充值信息失败");
+                throw new RuntimeException("操作失败,请重试");
+            }
+            // 更新积分充值记录
+            SysDeptRechargeRecord rechargeRecord = new SysDeptRechargeRecord();
+            rechargeRecord.setDeptId(deptId);
+            rechargeRecord.setChangeScore((long) -wmScorePackage.getScore());
+            rechargeRecord.setRechargeId(deptRecharge.getId());
+            rechargeRecord.setPackageId(wmScorePackage.getId());
+            rechargeRecord.setPackageType(RechargeRecordPackageType.TO_ENTERPRISE);
+            rechargeRecord.setType(RechargeRecordType.SEND_PACKAGE_DEPT);
+            rechargeRecord.setCurrentScore(currentScore);
+            rechargeRecord.setCreateUser(userId);
+            rechargeRecord.setCreateTime(now);
+            sysDeptRechargeRecordMapper.insert(rechargeRecord);
+        }
+
+        // 保存关联的试卷
+        if (CollUtil.isNotEmpty(wmScorePackage.getQuizIds())) {
+            pkgQuizRelationService.createPkgQuizzes(wmScorePackage.getQuizIds(), Integer.parseInt(wmScorePackage.getId()));
+        }
+
+        // 判断是否有关联关系
+        if (CollUtil.isNotEmpty(wmScorePackage.getQuizRelationIds())) {
+            pkgQuizRelationService.copyQuizRelations(wmScorePackage.getQuizRelationIds(), Integer.parseInt(wmScorePackage.getId()));
+        }
+
+        // 关联计划
+        SysPlanPkg rel = new SysPlanPkg();
+        rel.setPlanId(planId);
+        rel.setPkgId(Integer.valueOf(wmScorePackage.getId()));
+        rel.setCreateTime(LocalDateTime.now());
+
+        planPkgService.save(rel);
+
+        // 保存积分包任务类型数量限制 && 异步生成合同
+        List<Map<String, Object>> typeQtyList = wmScorePackage.getPkgTaskTypeQtyList();
+        List<WmPackageTaskTypeQty> collect = null;
+        if (CollUtil.isNotEmpty(typeQtyList)) {
+
+            collect = typeQtyList.stream().map(m -> {
+                WmPackageTaskTypeQty typeQty = new WmPackageTaskTypeQty();
+                typeQty.setPackageId(Integer.valueOf(wmScorePackage.getId()));
+                typeQty.setTaskTypeName((String) m.get("taskTypeName"));
+                typeQty.setPrice((Integer) m.get("price"));
+                typeQty.setTaskTypeId((Integer) m.get("taskTypeId"));
+                typeQty.setQty((Integer) m.get("qty"));
+                typeQty.setCreateTime(LocalDateTime.now());
+                return typeQty;
+            }).collect(Collectors.toList());
+
+            packageTaskTypeQtyService.saveBatch(collect);
+
+
+        }
+
+        PackageContractEvent event = new PackageContractEvent();
+        event.setPackageId(Integer.valueOf(wmScorePackage.getId()));
+        event.setTaskTypeQtiyList(collect);
+
+
+        return event;
+    }
+
     /**
      * 结算数据字段拼接转换
      *