ludc
2023-10-26 0c70227fc2ace5da24f27515574981310643c4be
Source/UBCS/ubcs-service/ubcs-code/src/main/java/com/vci/ubcs/code/service/impl/CodeBasicSecServiceImpl.java
@@ -340,7 +340,7 @@
      uiFormReferVO.setTableConfig(uiTableConfigVO);
      //字段名不一致,需要手动set
      uiFormReferVO.setMuti(Func.toBoolean(codeReferConfig.getIsMuti()));
      uiFormReferVO.setInitSort(new UIFieldSortVO(codeReferConfig.getSortType(),codeReferConfig.getSortField()));
      uiFormReferVO.setInitSort(new UIFieldSortVO(codeReferConfig.getSortField(),codeReferConfig.getSortType()));
      // 筛选条件
      HashMap<String, String> whereMap = new HashMap<>();
      if(!codeReferConfig.getCodeSrchCondConfigVOS().isEmpty()){
@@ -588,6 +588,15 @@
      }
      List<CodeBasicSec> createList = new ArrayList<>();
      List<CodeBasicSec> basicSecDOS = codeBasicSecMapper.selectBatchIds(oidList);
      /* 需要注意的是克隆过来的码段需要对orderNum进行排序,否则会出现排序乱跳的情况
      实现方式是查询出该规则下根据orderNum排序后的最后一个码段   */
      LambdaQueryWrapper<CodeBasicSec> lastBasicWrapper = Wrappers.<CodeBasicSec>query()
         .lambda().orderByDesc(CodeBasicSec::getOrderNum)
         .eq(CodeBasicSec::getPkCodeRule,pkCodeRule)
         .last("limit 1");
      CodeBasicSec lastCodeBasicSec = codeBasicSecMapper.selectOne(lastBasicWrapper);
      // 排序号从这儿开始排
      int orderNum = Func.isEmpty(lastCodeBasicSec) || Func.isEmpty(lastCodeBasicSec.getOrderNum()) ? -1 : lastCodeBasicSec.getOrderNum();
      if(basicSecDOS.isEmpty()){
         return R.fail("克隆的码段信息不存在!");
      }
@@ -599,6 +608,8 @@
         String oldBasicOid = newSecDO.getOid();
         newSecDO.setId(newSecDO.getId());
         newSecDO.setName(newSecDO.getName());
         orderNum++;
         newSecDO.setOrderNum(orderNum);
         newSecDO.setPkCodeRule(pkCodeRule);
         // 判断是否是分类码段,业务逻辑稍微复杂一点所以需要先提出来单独处理
         if(newSecDO.getSecType().equals(CodeSecTypeEnum.CODE_CLASSIFY_SEC.getValue())){
@@ -618,10 +629,13 @@
         createList.add(newSecDO);
      }
      // 处理分类码段的oid,因为oid关联parentClassifyOid,与码值codeClassifyOid,码值又需要通过旧的码段oid来查询,所以不能直接改变oid
      boolean resChangeAssn = changeParentOidAssnOid(codeClassifySec);
      changeParentOidAssnOid(codeClassifySec);
      // 将处理过的分类码段也添加进要做新增处理的码段集合中
      createList.addAll(codeClassifySec);
      boolean resBoolean = saveBatch(createList);
      boolean resBoolean = true;
      if(!createList.isEmpty()){
         resBoolean = saveBatch(createList);
      }
      // 最终要存入码值表中的,码值对象
      List<CodeFixedValue> codeFixedDOValues = new ArrayList<>();
      // 构造码值对象,与码段主键关联关系,以及改变固定码值的oid
@@ -633,9 +647,12 @@
            codeFixedDOValues.add(item);
         });
      });
      // 克隆固定码值
      boolean resFixed = fixedValueService.saveBatch(codeFixedDOValues);
      return (resBoolean&&resFixed&&resChangeAssn) ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
      boolean resFixed = true;
      if(!codeFixedValueMaps.isEmpty()){
         // 克隆固定码值
         resFixed = fixedValueService.saveBatch(codeFixedDOValues);
      }
      return (resBoolean&&resFixed) ? R.data(resBoolean,"克隆码段信息成功"):R.fail("克隆码段信息失败!");
   }
   /**
@@ -1100,4 +1117,63 @@
      }
      return String.valueOf(maxSecNum);
   }
   /***
    * 根据流水依赖获取最大流水号
    * @param codeOrderDTO 编码申请传输对象
    * @return
    */
   @Override
   public Double getMaxSerialNumberForCodeRule(CodeOrderDTO codeOrderDTO) {
      Double maxSerialNumber=0.0;
      VciBaseUtil.alertNotNull(codeOrderDTO.getCodeRuleOid(),"编码规则主键");
      List<CodeOrderSecDTO>  codeOrderSecDTOList=codeOrderDTO.getSecDTOList();
      if(CollectionUtils.isEmpty(codeOrderSecDTOList)){
         throw new VciBaseException("最大流水号的流水依赖不能为空!");
      }
      String codeRuleOid = codeOrderDTO.getCodeRuleOid();
      Map<String/**码段主键*/,CodeOrderSecDTO/**码段相关信息*/> codeOrderSecDTOMap = codeOrderSecDTOList.stream().collect(Collectors.toMap(s -> s.getSecOid(), t -> t));
      List<String> codeBasicSecOidList = codeOrderSecDTOList.stream().map(s->s.getSecOid()).collect(Collectors.toList());//流水依赖码段的主键集合
      //获取流水依赖码段
      LambdaQueryWrapper<CodeBasicSec> wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .in(CodeBasicSec::getOid,codeBasicSecOidList)
         .eq(CodeBasicSec::getSerialDependFlag,"true")
         .orderByAsc(CodeBasicSec::getSerialDependOrder);
      List<CodeBasicSec> codeBasicSecList = this.list(wrapper);
      //按流水依赖顺序,处理流水依赖码段的值
      List<String> serialDependValueList = new ArrayList<>();
      codeBasicSecList.stream().forEach(s->{
         CodeOrderSecDTO codeOrderSecDTO = codeOrderSecDTOMap.get(s.getOid());
         String serialDependValue = codeOrderSecDTO.getSecValue();
         if(s.getSecType().equals(CodeSecTypeEnum.CODE_DATE_SEC.getValue())){
            try {
               Date date = VciDateUtil.str2Date(codeOrderSecDTO.getSecValue(),s.getCodeDateFormatStr());
               serialDependValue = VciDateUtil.date2Str(date,s.getCodeDateFormatStr());
            } catch (Exception e) {
               throw new RuntimeException(e);
            }
         }
         serialDependValueList.add(serialDependValue);
      });
      //获取流水码段
      wrapper = Wrappers.<CodeBasicSec>query().lambda()
         .eq(CodeBasicSec::getPkCodeRule,codeRuleOid)
         .eq(CodeBasicSec::getSecType,CodeSecTypeEnum.CODE_SERIAL_SEC.getValue())
         .orderByAsc(CodeBasicSec::getSerialDependOrder);
      CodeBasicSec codeBasicSec = this.getOne(wrapper);
      //根据编码规则和流水依赖,获取最大流水号
      String serialUnitString = serialDependValueList.size() == 0 ? EMPTY_SERIAL_UNIT : serialDependValueList.stream().collect(Collectors.joining(SERIAL_UNIT_SPACE));
      LambdaQueryWrapper<CodeSerialValue> codeSerialWrapper = new LambdaQueryWrapper<>();
      codeSerialWrapper.eq(CodeSerialValue::getCodeRuleOid, codeRuleOid);
      codeSerialWrapper.eq(CodeSerialValue::getSerialUnit, serialUnitString);
      codeSerialWrapper.eq(CodeSerialValue::getCodeSecOid,codeBasicSec.getOid());
      codeSerialWrapper.orderByDesc(CodeSerialValue::getCreateTime);
      List<CodeSerialValue> codeSerialValueList = serialValueMapper.selectList(codeSerialWrapper);
      if(!CollectionUtils.isEmpty(codeSerialValueList)){
         maxSerialNumber=StringUtils.isBlank(codeSerialValueList.get(0).getMaxSerial())?0:Double.parseDouble(codeSerialValueList.get(0).getMaxSerial());
      }
      return maxSerialNumber;
   }
}