浏览代码

feat: batch ent pkg

shc 9 月之前
父节点
当前提交
282d6eeca2

+ 14 - 0
hnqz-upms/hnqz-upms-api/src/main/java/com/qunzhixinxi/hnqz/admin/api/dto/WmPkgDTO.java

@@ -1,5 +1,6 @@
 package com.qunzhixinxi.hnqz.admin.api.dto;
 
+import com.alibaba.excel.annotation.ExcelProperty;
 import com.qunzhixinxi.hnqz.admin.api.model.WmPkgRedemptionNoticeItemModel;
 import com.qunzhixinxi.hnqz.admin.api.model.WmQuizResultModel;
 import lombok.AccessLevel;
@@ -25,6 +26,19 @@ import java.util.List;
 @NoArgsConstructor(access = AccessLevel.NONE)
 public final class WmPkgDTO {
 
+    @Data
+    public static class OnEntPkgBatchCreate {
+
+        @ExcelProperty(value = "执行包名称")
+        private String pkgName;
+
+
+        @ExcelProperty(value = "计划包名称")
+        private String planName;
+
+    }
+
+
     @Data
     public static class OnPkgPickup {
 

+ 8 - 2
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -172,6 +172,13 @@ public class WmScorePackageController {
     private final ApplicationEventPublisher applicationEventPublisher;
 
 
+    @SysLog(value = "批量创建2b包")
+    @PostMapping(value = "/batch/create")
+    public R<List<Map<String, String>>> batchCreateEntPkg(@RequestExcel(ignoreEmptyRow = true) List<WmPkgDTO.OnEntPkgBatchCreate> resource) {
+        return R.ok(wmScorePackageService.batchCreateEntPkg(resource, SecurityUtils.getUser()));
+    }
+
+
     @GetMapping(value = "/quiz/relation/list")
     public R<?> ListPkgQuizRel(@RequestParam Integer pkgId) {
 
@@ -405,8 +412,7 @@ public class WmScorePackageController {
         List<WmScorePackage> list = pageAnswer.getRecords();
 
 
-        for (WmScorePackage wmS :
-                list) {
+        for (WmScorePackage wmS : list) {
             for (WmScorePackage ext :
                     listExt) {
                 if (wmS.getId().equals(ext.getId())) {

+ 1 - 0
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/manager/SysImplementPlanManager.java

@@ -677,6 +677,7 @@ public class SysImplementPlanManager {
      * @param user     创建人
      * @return 创建结果
      */
+    @Transactional(rollbackFor = Exception.class)
     public List<Map<String, String>> createBatch(List<SysImplementPlanDTO.OnBatchCreate> resource, HnqzUser user) {
 
 

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

@@ -57,4 +57,17 @@ public interface SysImplementPlanService extends IService<SysImplementPlan> {
      * @return 校验结果
      */
     boolean dupName(String planName, Integer consignorId);
+
+
+    /**
+     * 获取计划信息
+     *
+     * @param planName    计划名称
+     * @param consignorId 企业ID
+     * @return 校验结果
+     */
+    SysImplementPlan getPlanByName(String planName, Integer consignorId);
+
+
+
 }

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

@@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.IService;
 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.WmReportOpt;
@@ -278,4 +279,12 @@ public interface WmScorePackageService extends IService<WmScorePackage> {
      * @return 合同事件
      */
     PackageContractEvent saveEntPkg(WmScorePackage wmScorePackage);
+
+    /**
+     * 批量创建企业包
+     *
+     * @param resource 信息
+     * @return 创建结果
+     */
+    List<Map<String, String>> batchCreateEntPkg(List<WmPkgDTO.OnEntPkgBatchCreate> resource, HnqzUser user);
 }

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

@@ -95,6 +95,18 @@ public class SysImplementPlanServiceImpl extends ServiceImpl<SysImplementPlanMap
     public boolean dupName(String planName, Integer consignorId) {
         return this.count(Wrappers.<SysImplementPlan>lambdaQuery().eq(SysImplementPlan::getPlanName, planName.trim()).eq(SysImplementPlan::getConsignorId, consignorId)) != 0;
     }
+
+    /**
+     * 获取计划信息
+     *
+     * @param planName    计划名称
+     * @param consignorId 企业ID
+     * @return 校验结果
+     */
+    @Override
+    public SysImplementPlan getPlanByName(String planName, Integer consignorId) {
+        return this.getOne(Wrappers.<SysImplementPlan>lambdaQuery().eq(SysImplementPlan::getPlanName, planName.trim()).eq(SysImplementPlan::getConsignorId, consignorId));
+    }
 }
 
 

+ 192 - 1
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackageServiceImpl.java → hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackaeServiceImpl.java

@@ -7,6 +7,7 @@ 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.IdUtil;
 import cn.hutool.core.util.RandomUtil;
 import cn.hutool.core.util.StrUtil;
 import com.alibaba.csp.sentinel.util.StringUtil;
@@ -20,7 +21,9 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.ImmutableMap;
 import com.qunzhixinxi.hnqz.admin.api.constant.CacheConstants;
+import com.qunzhixinxi.hnqz.admin.api.constant.UpmsState;
 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.SysDeptRelation;
 import com.qunzhixinxi.hnqz.admin.api.entity.SysDictItem;
@@ -87,6 +90,7 @@ 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.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.data.datascope.DataScope;
@@ -112,6 +116,7 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.HashSet;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -131,7 +136,7 @@ import java.util.stream.Collectors;
 @Slf4j
 @Service
 @AllArgsConstructor
-public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper, WmScorePackage> implements WmScorePackageService {
+public class WmScorePackaeServiceImpl extends ServiceImpl<WmScorePackageMapper, WmScorePackage> implements WmScorePackageService {
 
     private final WmScorePackageMapper wmScorePackageMapper;
     private final SysDeptRelationMapper sysDeptRelationMapper;
@@ -4280,6 +4285,192 @@ public class WmScorePackageServiceImpl extends ServiceImpl<WmScorePackageMapper,
         return event;
     }
 
+    /**
+     * 批量创建企业包
+     *
+     * @param resource 信息
+     * @return 创建结果
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public List<Map<String, String>> batchCreateEntPkg(List<WmPkgDTO.OnEntPkgBatchCreate> resource, HnqzUser user) {
+
+        // 加锁防止多处理
+        Integer deptId = user.getDeptId();
+        Integer userId = user.getId();
+        String lock = "lock:package:batch:" + deptId;
+        boolean locked = false;
+
+        try {
+
+            locked = Boolean.TRUE.equals(redisTemplate.opsForValue().setIfAbsent(lock, IdUtil.fastUUID(), 10, TimeUnit.MINUTES));
+
+            if (!locked) {
+                throw new BizException("有在途的操作,请稍后");
+            }
+
+            log.warn("==========================================批量导入积分包:开始=====================================================");
+
+            // 校验参数
+            List<Map<String, String>> errorList = this.checkBatchInfo(resource, deptId);
+
+            if (CollUtil.isNotEmpty(errorList)) {
+                return errorList;
+            }
+
+            List<WmScoreTaskType> scoreTaskTypes = wmTaskTypeMapper.selectList(Wrappers.<WmTaskType>lambdaQuery().le(WmTaskType::getId, "100")
+                    .eq(WmTaskType::getDelFlag, CommonConstants.STATUS_NORMAL)
+                    .eq(WmTaskType::getEnableFlag, CommonConstants.STATUS_NORMAL)).stream().map(tt -> {
+                WmScoreTaskType stt = new WmScoreTaskType();
+                stt.setTaskTypeId(tt.getParentId());
+                stt.setTaskTypeName(tt.getTaskTypeName());
+
+                return stt;
+            }).collect(Collectors.toList());
+
+
+            // 拼装积分包
+            List<WmScorePackage> collect = resource.stream().map(res -> {
+
+                SysImplementPlan plan = implementPlanService.getPlanByName(res.getPlanName(), deptId);
+
+                WmScorePackage pkg = new WmScorePackage();
+                // agentId
+                Integer consigneeId = plan.getConsigneeId();
+                List<WmDaAgent> list = wmDaAgentService.list(Wrappers.<WmDaAgent>lambdaQuery().eq(WmDaAgent::getDeptId, consigneeId));
+                pkg.setAcceptSug(list.get(0).getId().toString());
+                pkg.setAgentTypeId("1");
+                pkg.setAuditManagementFeeRates(BigDecimal.ZERO);
+                LocalDate planIssue = plan.getPlanIssue();
+                pkg.setBelongDate(DateTimeFormatter.ofPattern("yyyy-MM").format(planIssue));
+                pkg.setDescription("");
+                pkg.setDrugtable(new String[]{plan.getSkuId().toString()});
+                pkg.setStartTime(planIssue);
+                pkg.setEndTime(plan.getPlanExpiry());
+                pkg.setEntTaskLimit(BigDecimal.ZERO);
+                pkg.setKfpjf(0);
+                pkg.setPlanId(plan.getPlanId());
+                pkg.setRelatedService(deptId.toString());
+                pkg.setRelationScoreId("");
+                pkg.setScore(plan.getPlanScore().intValue());
+                pkg.setScorePackageName(res.getPkgName());
+                pkg.setWmScoreTaskTypeList(scoreTaskTypes);
+
+                return pkg;
+
+            }).collect(Collectors.toList());
+
+
+            collect.forEach(this::saveEntPkg);
+
+            return Collections.emptyList();
+
+        } finally {
+            if (locked) {
+                log.warn("==========================================批量导入积分包:结束=====================================================");
+                redisTemplate.delete(lock);
+            }
+        }
+
+    }
+
+    private List<Map<String, String>> checkBatchInfo(List<WmPkgDTO.OnEntPkgBatchCreate> resource, Integer deptId) {
+
+        List<Map<String, String>> errorList = new LinkedList<>();
+
+        int size = resource.size();
+
+        if (size == 0) {
+            Map<String, String> errorMap = new HashMap<>(2);
+            errorMap.put("idx", "1");
+            errorMap.put("errorMsg", "空表单不支持导入");
+            errorList.add(errorMap);
+            return errorList;
+        }
+
+        if (size > 500) {
+            Map<String, String> errorMap = new HashMap<>(2);
+            errorMap.put("idx", "500");
+            errorMap.put("errorMsg", "单次导入最大支持500条记录");
+            errorList.add(errorMap);
+            return errorList;
+        }
+
+        Map<String, List<WmPkgDTO.OnEntPkgBatchCreate>> pkgName2BatchInfoMap = resource.stream().collect(Collectors.groupingBy(WmPkgDTO.OnEntPkgBatchCreate::getPkgName));
+        Map<String, List<WmPkgDTO.OnEntPkgBatchCreate>> planName2BatchInfoMap = resource.stream().collect(Collectors.groupingBy(WmPkgDTO.OnEntPkgBatchCreate::getPlanName));
+
+
+        for (int i = 0; i < size; i++) {
+
+            StringBuilder errorMsg = new StringBuilder();
+            WmPkgDTO.OnEntPkgBatchCreate res = resource.get(i);
+
+            String pkgName = res.getPkgName().trim();
+            String planName = res.getPlanName().trim();
+
+            // 校验空值
+            if (StrUtil.hasBlank(pkgName, planName)) {
+                errorMsg.append("执行包信息不全,存在未填写的内容;");
+            }
+
+
+            // 校验执行包名称
+            List<WmPkgDTO.OnEntPkgBatchCreate> pkgNameOnBatchCreates = pkgName2BatchInfoMap.get(pkgName);
+            if (CollUtil.isNotEmpty(pkgNameOnBatchCreates) && pkgNameOnBatchCreates.size() > 1) {
+                errorMsg.append("表单内存在重名执行包名称;");
+            } else {
+                boolean dupName = this.dupName(planName, deptId);
+                if (dupName) {
+                    errorMsg.append("执行包名称已存在;");
+                }
+            }
+
+            // 校验计划名称
+            List<WmPkgDTO.OnEntPkgBatchCreate> planNameOnBatchCreates = planName2BatchInfoMap.get(planName);
+            if (CollUtil.isNotEmpty(planNameOnBatchCreates) && planNameOnBatchCreates.size() > 1) {
+                errorMsg.append("表单中存在相同计划名称名称;");
+            } else {
+                // 校验计划
+                SysImplementPlan plan = implementPlanService.getPlanByName(planName, deptId);
+
+                if (plan == null) {
+                    errorMsg.append("未查询到名称为【").append(planName).append("】的计划;");
+                } else {
+
+                    UpmsState.ImplementPlanState planState = plan.getPlanState();
+
+                    if (!UpmsState.ImplementPlanState.PASSED.equals(planState)) {
+                        errorMsg.append("只能关联审核通过的计划,当前所关联计划状态为【").append(planState.getDesc()).append("】;");
+                    }
+
+                    Integer count = sysPlanPkgMapper.selectCount(Wrappers.<SysPlanPkg>lambdaQuery().eq(SysPlanPkg::getPlanId, plan.getPlanId()));
+
+                    if (count != 0) {
+                        errorMsg.append("计划已经被关联其他执行包了");
+                    }
+
+                }
+            }
+
+
+            if (StrUtil.isNotBlank(errorMsg)) {
+                Map<String, String> errorMap = new HashMap<>(2);
+                errorMap.put("idx", String.valueOf(i + 1));
+                errorMap.put("errorMsg", errorMsg.toString());
+                errorList.add(errorMap);
+            }
+
+
+        }
+
+        return errorList;
+
+    }
+
+    private boolean dupName(String pkgName, Integer deptId) {
+        return this.count(Wrappers.<WmScorePackage>lambdaQuery().eq(WmScorePackage::getScorePackageName, pkgName).eq(WmScorePackage::getSendPackageDeptId, deptId.toString())) > 0;
+    }
+
     /**
      * 结算数据字段拼接转换
      *

二进制
hnqz-upms/hnqz-upms-biz/src/main/resources/excel/ent_pkg_batch_create_tmpl.xlsx