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

feat: 个人发包加锁并校验可分配任务数

shc 8 сар өмнө
parent
commit
025114da1e

+ 31 - 14
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/controller/WmScorePackageController.java

@@ -9,6 +9,7 @@ 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;
@@ -1344,7 +1345,7 @@ public class WmScorePackageController {
 
             }
 
-            if (CollUtil.isNotEmpty(finalRecords)){
+            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)
@@ -1522,7 +1523,7 @@ public class WmScorePackageController {
             }
         }
 
-        if (CollUtil.isNotEmpty(wmDaDrugEnts)){
+        if (CollUtil.isNotEmpty(wmDaDrugEnts)) {
             wmDaDrugEnts.forEach(ent -> {
                 SysDept service = sysDeptService.getById(ent.getDeptId());
                 ent.setProvAbbr(service.getProvAbbr());
@@ -1573,7 +1574,6 @@ public class WmScorePackageController {
     }
 
     /**
-     *
      * 新增积分包(大包)
      * <p>
      * 满足以下任一条件,则可以发包
@@ -2515,7 +2515,7 @@ public class WmScorePackageController {
      *
      * @param acceptUser 接单对象,模糊查询
      */
-    @ResponseExcel(name = "exportPackageSettle", sheets ={ @Sheet(sheetName = "个人承接积分值导出")})
+    @ResponseExcel(name = "exportPackageSettle", sheets = {@Sheet(sheetName = "个人承接积分值导出")})
     @SysLog("个人承接积分值导出-用于BC")
     @GetMapping("/export-score-package-for-bc")
     public List<WmScorePackageExcelModel> exportScorePackageForBC(
@@ -2694,7 +2694,7 @@ public class WmScorePackageController {
      * @param acceptUser 接单对象,模糊查询
      */
     // @ResponseExcel(name = "exportPackageSettle", sheet = "个人承接积分值导出")
-    @ResponseExcel(name = "exportPackageSettle",  sheets ={ @Sheet(sheetName = "个人承接积分值导出")})
+    @ResponseExcel(name = "exportPackageSettle", sheets = {@Sheet(sheetName = "个人承接积分值导出")})
     @SysLog("个人承接积分值导出")
     @GetMapping("/export-score-package")
     public List<WmScorePackageExcelModel> exportScorePackage(
@@ -2724,7 +2724,7 @@ public class WmScorePackageController {
      * @param acceptUser 接单对象,模糊查询
      */
     // @ResponseExcel(name = "exportPackageSettle", sheet = "个人承接积分值-其他导出")
-    @ResponseExcel(name = "exportPackageSettle",  sheets ={ @Sheet(sheetName = "个人承接积分值-其他导出")})
+    @ResponseExcel(name = "exportPackageSettle", sheets = {@Sheet(sheetName = "个人承接积分值-其他导出")})
     @SysLog("个人承接积分值-其他导出-用于BC")
     @GetMapping("/export-score-package-mah-for-bc")
     public List<WmScorePackageExcelModel> exportPackageSettleForMahForBC(
@@ -2878,7 +2878,7 @@ public class WmScorePackageController {
      * @param acceptUser 接单对象,模糊查询
      */
     // @ResponseExcel(name = "exportPackageSettle", sheet = "个人承接积分值-其他导出")
-    @ResponseExcel(name = "exportPackageSettle", sheets ={ @Sheet(sheetName = "个人承接积分值-其他导出")})
+    @ResponseExcel(name = "exportPackageSettle", sheets = {@Sheet(sheetName = "个人承接积分值-其他导出")})
     @SysLog("个人承接积分值-其他导出")
     @GetMapping("/export-score-package-mah")
     public List<WmScorePackageExcelModel> exportPackageSettleForMah(
@@ -3113,19 +3113,36 @@ public class WmScorePackageController {
     @SysLog("新增积分包(小包)")
     @PostMapping("/addWmScorePackage")
     public R<?> addWmScorePackage(@RequestBody WmScorePackage wmScorePackage) {
+
         log.info("新增积分包(小包)入参:{}", wmScorePackage);
-        // 定额
-        if (wmScorePackage.getPackageType1().equals("1")) {
-            if (wmScorePackage.getScore() <= 0) {
+
+        // 获取操作对象
+        HnqzUser user = SecurityUtils.getUser();
+        String relationScoreId = wmScorePackage.getRelationScoreId();
+
+        String lockKey = String.format("pkg:inid:create:lock:%s:%s", user.getDeptId(), StrUtil.isBlank(relationScoreId) ? relationScoreId : IdUtil.fastSimpleUUID());
+
+
+        try {
+
+            if (Boolean.FALSE.equals(redisTemplate.opsForValue().setIfAbsent(lockKey, lockKey, 12, TimeUnit.HOURS))) {
+                return R.failed("存在在途操作,请刷新重试");
+            }
+
+            // 定额
+            if ("1".equals(wmScorePackage.getPackageType1()) && wmScorePackage.getScore() <= 0) {
                 return R.failed("积分包分值必须大于0");
             }
-        }
 
-        if (CharSequenceUtil.isBlank(wmScorePackage.getPackageSn())) {
-            return R.failed("积分包序列号必填");
+            if (CharSequenceUtil.isBlank(wmScorePackage.getPackageSn())) {
+                return R.failed("积分包序列号必填");
+            }
+
+            return wmScorePackageService.addWmScorePackage(wmScorePackage);
+        } finally {
+            redisTemplate.delete(lockKey);
         }
 
-        return wmScorePackageService.addWmScorePackage(wmScorePackage);
     }
 
 

+ 43 - 3
hnqz-upms/hnqz-upms-biz/src/main/java/com/qunzhixinxi/hnqz/admin/service/impl/WmScorePackaeServiceImpl.java

@@ -1143,10 +1143,9 @@ public class WmScorePackaeServiceImpl extends ServiceImpl<WmScorePackageMapper,
 
         // 保存积分包任务类型数量限制 && 异步生成合同
         List<Map<String, Object>> typeQtyList = wmScorePackage.getPkgTaskTypeQtyList();
-        List<WmPackageTaskTypeQty> collect = null;
         if (CollUtil.isNotEmpty(typeQtyList)) {
             LocalDateTime ctime = LocalDateTime.now();
-            collect = typeQtyList.stream().map(m -> {
+            List<WmPackageTaskTypeQty> collect = typeQtyList.stream().map(m -> {
                 WmPackageTaskTypeQty typeQty = new WmPackageTaskTypeQty();
                 typeQty.setPackageId(Integer.valueOf(wmScorePackage.getId()));
                 typeQty.setTaskTypeName((String) m.get("taskTypeName"));
@@ -1157,8 +1156,49 @@ public class WmScorePackaeServiceImpl extends ServiceImpl<WmScorePackageMapper,
                 return typeQty;
             }).collect(Collectors.toList());
 
-            packageTaskTypeQtyService.saveBatch(collect);
+            // 获取关联积分包的剩余用量
+            if (relatedScoreId) {
+
+                List<WmPackageTaskTypeQty> relPkgTtq = packageTaskTypeQtyService.list(Wrappers.<WmPackageTaskTypeQty>lambdaQuery().eq(WmPackageTaskTypeQty::getPackageId, wmScorePackage.getRelationScoreId()));
+
+                if (CollUtil.isEmpty(relPkgTtq)) {
+                    throw new BizException("关联包没有分配服务数量");
+                }
+
+                Map<String, Integer> parent = relPkgTtq.stream().collect(Collectors.toMap(WmPackageTaskTypeQty::getTaskTypeName, WmPackageTaskTypeQty::getQty, (v1, v2) -> v2));
+
+                List<WmScorePackage> list = this.list(Wrappers.<WmScorePackage>lambdaQuery().eq(WmScorePackage::getRelationScoreId, wmScorePackage.getRelationScoreId()));
+                if (CollUtil.isNotEmpty(list)) {
+                    Set<Integer> pkgIds = list.stream().map(pkg -> Integer.valueOf(pkg.getId())).collect(Collectors.toSet());
+                    List<WmPackageTaskTypeQty> taskTypeQtyList
+                            = packageTaskTypeQtyService.list(Wrappers.<WmPackageTaskTypeQty>lambdaQuery().in(WmPackageTaskTypeQty::getPackageId, pkgIds));
+
+                    if (CollUtil.isNotEmpty(taskTypeQtyList)) {
+                        Map<String, Integer> taskTypeName2SumMap = taskTypeQtyList.stream()
+                                .collect(Collectors.groupingBy(WmPackageTaskTypeQty::getTaskTypeName, Collectors.summingInt(WmPackageTaskTypeQty::getQty)));
+
+                        for (WmPackageTaskTypeQty qty : taskTypeQtyList) {
+                            Integer pQty = parent.get(qty.getTaskTypeName());
+
+                            if (pQty == null || pQty == 0) {
+                                throw new RuntimeException("关联包没有分配【" + qty.getTaskTypeName() + "】服务数量");
+                            }
 
+                            Integer used = taskTypeName2SumMap.get(qty.getTaskTypeName());
+
+                            int avail = pQty - used;
+
+                            if (avail - qty.getQty() < 0) {
+                                throw new RuntimeException("【" + qty.getTaskTypeName() + "】服务数量已用完,请刷新后重试");
+                            }
+                        }
+                    }
+
+                }
+            }
+
+
+            packageTaskTypeQtyService.saveBatch(collect);
         }
 
         return R.ok(wmScorePackage.getId(), "新增成功");