|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* 结算数据字段拼接转换
|
|
|
*
|