Explorar el Código

调整编码规则生成业务

车车 hace 1 año
padre
commit
6fbc0d9d93

+ 34 - 0
ktg-system/src/main/java/com/ktg/system/service/impl/SysAutoCodePartServiceImpl.java

@@ -1,20 +1,26 @@
 package com.ktg.system.service.impl;
 
+import cn.hutool.core.lang.Assert;
 import com.ktg.common.constant.UserConstants;
 import com.ktg.common.core.domain.entity.SysAutoCodePart;
+import com.ktg.common.core.domain.entity.SysAutoCodeRule;
 import com.ktg.common.utils.StringUtils;
 import com.ktg.system.mapper.SysAutoCodePartMapper;
+import com.ktg.system.mapper.SysAutoCodeRuleMapper;
 import com.ktg.system.service.IAutoCodePartService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
+import java.util.Objects;
 
 @Service
 public class SysAutoCodePartServiceImpl implements IAutoCodePartService {
 
     @Autowired
     private SysAutoCodePartMapper sysAutoCodePartMapper;
+    @Autowired
+    private SysAutoCodeRuleMapper sysAutoCodeRuleMapper;
 
     @Override
     public List<SysAutoCodePart> listPart(SysAutoCodePart sysAutoCodePart) {
@@ -38,11 +44,39 @@ public class SysAutoCodePartServiceImpl implements IAutoCodePartService {
 
     @Override
     public int insertPart(SysAutoCodePart sysAutoCodePart) {
+        // 1.检测此次新增长度是否大于总长度
+        SysAutoCodeRule sysAutoCodeRule = sysAutoCodeRuleMapper.findById(sysAutoCodePart.getRuleId());
+        Integer maxLength = sysAutoCodeRule.getMaxLength();
+        // 2.获取细则里的所有长度
+        long lengthSum = sysAutoCodePart.getPartLength();
+
+        SysAutoCodePart dto = new SysAutoCodePart();
+        dto.setRuleId(sysAutoCodePart.getRuleId());
+        List<SysAutoCodePart> sysAutoCodeParts = sysAutoCodePartMapper.selectSysAutoCodePartList(dto);
+        if (!sysAutoCodeParts.isEmpty()) {
+            long sum = sysAutoCodeParts.stream().mapToLong(SysAutoCodePart::getPartLength).sum();
+            lengthSum = lengthSum + sum;
+        }
+        Assert.isFalse(maxLength < lengthSum, "最大长度" + maxLength + "小于分段长度总和" + lengthSum + ",请扩容最大长度!");
         return sysAutoCodePartMapper.add(sysAutoCodePart);
     }
 
     @Override
     public int updatePart(SysAutoCodePart sysAutoCodePart) {
+        // 1.检测此次新增长度是否大于总长度
+        SysAutoCodeRule sysAutoCodeRule = sysAutoCodeRuleMapper.findById(sysAutoCodePart.getRuleId());
+        Integer maxLength = sysAutoCodeRule.getMaxLength();
+        // 2.获取细则里的所有长度
+        long lengthSum = sysAutoCodePart.getPartLength();
+
+        SysAutoCodePart dto = new SysAutoCodePart();
+        dto.setRuleId(sysAutoCodePart.getRuleId());
+        List<SysAutoCodePart> sysAutoCodeParts = sysAutoCodePartMapper.selectSysAutoCodePartList(dto);
+        if (!sysAutoCodeParts.isEmpty()) {
+            long sum = sysAutoCodeParts.stream().filter(o -> !Objects.equals(o.getPartId(), sysAutoCodePart.getPartId())).mapToLong(SysAutoCodePart::getPartLength).sum();
+            lengthSum = lengthSum + sum;
+        }
+        Assert.isFalse(maxLength < lengthSum, "最大长度" + maxLength + "小于分段长度总和" + lengthSum + ",请扩容最大长度!");
         return sysAutoCodePartMapper.updateSysAutoCodePart(sysAutoCodePart);
     }
 

+ 52 - 35
ktg-system/src/main/java/com/ktg/system/strategy/AutoCodeUtil.java

@@ -37,101 +37,118 @@ public class AutoCodeUtil {
 
     private String lastSerialNo;
 
-    @Log(title = "生成业务编号",businessType = BusinessType.INSERT)
+    @Log(title = "生成业务编号", businessType = BusinessType.INSERT)
     synchronized
-    public String genSerialCode(String ruleCode,String inputCharacter){
+    public String genSerialCode(String ruleCode, String inputCharacter) {
 
         //查找编码规则
         SysAutoCodeRule rule = iAutoCodeRuleService.getOne(ruleCode);
-        Assert.notNull(rule,"未获取到指定类型:[{}]的业务编码生成规则",ruleCode);
+        Assert.notNull(rule, "未获取到指定类型:[{}]的业务编码生成规则", ruleCode);
 
         //查找规则组成
         SysAutoCodePart partParam = new SysAutoCodePart();
         partParam.setRuleId(rule.getRuleId());
         List<SysAutoCodePart> parts = iAutoCodePartService.listPart(partParam);
-        List<SysAutoCodePart> collect = parts.stream().filter(part->PartTypeEnum.PART_TYPE_SERIALNO.getCode().equals(part.getPartType())).collect(Collectors.toList());
+        List<SysAutoCodePart> collect = parts.stream().filter(part -> PartTypeEnum.PART_TYPE_SERIALNO.getCode().equals(part.getPartType())).collect(Collectors.toList());
 
-        Assert.isTrue(collect.size()<2,"编码规则[{}]流水号方式的组成只能存在一个",ruleCode);
+        Assert.isTrue(collect.size() < 2, "编码规则[{}]流水号方式的组成只能存在一个", ruleCode);
 
         StringBuilder buff = new StringBuilder();
-        parts.forEach(codePart ->{
+        parts.forEach(codePart -> {
             codePart.setInputCharacter(inputCharacter);
             //根据当前组成部分,获取当前组成部分的结果
             String partStr = partTypeHandler.choiceExecute(codePart);
 
             //如果是流水号部分,则进行记录
-            if(StringUtils.equals(codePart.getPartType(),PartTypeEnum.PART_TYPE_SERIALNO.getCode())){
+            if (StringUtils.equals(codePart.getPartType(), PartTypeEnum.PART_TYPE_SERIALNO.getCode())) {
                 lastSerialNo = partStr;
             }
             //将获取到的部分组装进整体编码中
             buff.append(partStr);
         });
 
-        Assert.notBlank(buff.toString(),"规则:[{}]生成的编码为空!",ruleCode);
+        Assert.notBlank(buff.toString(), "规则:[{}]生成的编码为空!", ruleCode);
 
-        String autoCode = paddingStr(rule,buff);
+        String autoCode = paddingStr(rule, buff);
 
         //将生成结果保存到数据库
-        saveAutoCodeResult(rule,autoCode,inputCharacter);
+        saveAutoCodeResult(rule, autoCode, inputCharacter);
         return autoCode;
     }
 
     /**
      * 根据编码规则的配置进行补齐操作
+     *
      * @param rule
      * @param sb
      * @return
      */
-    private String paddingStr(SysAutoCodeRule rule,StringBuilder sb){
+    private String paddingStr(SysAutoCodeRule rule, StringBuilder sb) {
         String isPadding = rule.getIsPadded();
-        if("Y".equals(isPadding)){
-            int maxLength = rule.getMaxLength();
+        int maxLength = rule.getMaxLength();
+        if ("Y".equals(isPadding)) {
             String paddingChar = rule.getPaddedChar();
             StringBuilder resultStr = new StringBuilder();
             long length = maxLength - sb.length();
-            Assert.isTrue(maxLength>sb.length(),"生成的编码[{}]已经超出规则中配置的最大长度:[{}]",sb.toString(),maxLength);
-
-            if("L".equals(rule.getPaddedMethod())){
-                //左补齐
-                //使用指定字符补齐左侧后,再将生成的编码添加到右侧
-                for(;length>0;length --){
-                    resultStr.append(paddingChar);
-                }
-                resultStr.append(sb);
-            }else{
-                //右补齐
-                //将生成的编码添加到左侧后,再使用指定字符补齐右侧
-                resultStr.append(sb);
-                for(;length>0;length --){
-                    resultStr.append(paddingChar);
+            if (length > 0L) {
+                // 1.大于0就开始补齐
+                if ("L".equals(rule.getPaddedMethod())) {
+                    //左补齐
+                    //使用指定字符补齐左侧后,再将生成的编码添加到右侧
+                    for (long i = 0; i < length; i++) {
+                        resultStr.append(paddingChar);
+                        if (resultStr.length() == length) {
+                            break;
+                        } else if (resultStr.length() > length) {
+                            String substring = resultStr.substring(0, (int) length);
+                            resultStr = new StringBuilder(substring);
+                            break;
+                        }
+                    }
+                    resultStr.append(sb);
+                } else {
+                    //右补齐
+                    //将生成的编码添加到左侧后,再使用指定字符补齐右侧
+                    resultStr.append(sb);
+                    for (long i = 0; i < length; i++) {
+                        resultStr.append(paddingChar);
+                        if (resultStr.length() == maxLength) {
+                            break;
+                        } else if (resultStr.length() > maxLength) {
+                            resultStr = new StringBuilder(resultStr.substring(0, maxLength));
+                            break;
+                        }
+                    }
                 }
             }
+            Assert.isTrue(maxLength >= resultStr.length(), "生成的编码[{}]已经超出规则中配置的最大长度:[{}]", sb.toString(), maxLength);
             return resultStr.toString();
         }
+        Assert.isTrue(maxLength >= sb.length(), "生成的编码[{}]已经超出规则中配置的最大长度:[{}]", sb.toString(), maxLength);
         return sb.toString(); //如果不需要补齐,则直接返回
     }
 
-    private void saveAutoCodeResult(SysAutoCodeRule rule,String autoCode,String inputChar){
+    private void saveAutoCodeResult(SysAutoCodeRule rule, String autoCode, String inputChar) {
         Boolean flag = threadLocal.get(); //针对当前线程的判断 flag = true则数据库中没有当前规则的生成记录
-        if(flag !=null && flag){
+        if (flag != null && flag) {
             SysAutoCodeResult rs = new SysAutoCodeResult();
             rs.setRuleId(rule.getRuleId());
-            rs.setGenDate(DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss"));
+            rs.setGenDate(DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss"));
             rs.setLastResult(autoCode);
             rs.setGenIndex(1);
             rs.setLastSerialNo(Integer.parseInt(lastSerialNo));
             rs.setLastInputChar(inputChar);
             iAutoCodeResultService.saveAutoCodeResult(rs);
-        }else{
+        } else {
             //直接更新对应的记录(我们默认非流水号模式下一个RULE_CODE只有一种方式)
             SysAutoCodeResult bo = new SysAutoCodeResult();
             bo.setRuleId(rule.getRuleId());
             List<SysAutoCodeResult> results = iAutoCodeResultService.list(bo);
-            Assert.notEmpty(results,"未查询到规则{[]}对应的结果记录",rule.getRuleCode());
+            Assert.notEmpty(results, "未查询到规则{[]}对应的结果记录", rule.getRuleCode());
             SysAutoCodeResult rs = results.get(0);
             rs.setLastResult(autoCode);
-            rs.setGenDate(DateUtil.format(LocalDateTime.now(),"yyyyMMddHHmmss"));
-            rs.setGenIndex(rs.getGenIndex()+1);
+            rs.setGenDate(DateUtil.format(LocalDateTime.now(), "yyyyMMddHHmmss"));
+            rs.setGenIndex(rs.getGenIndex() + 1);
             rs.setLastSerialNo(Integer.parseInt(lastSerialNo));
             rs.setLastInputChar(inputChar);
             iAutoCodeResultService.updateAutoCodeResult(rs);

+ 2 - 1
ktg-system/src/main/resources/mapper/system/SysAutoCodeRuleMapper.xml

@@ -40,6 +40,7 @@
         <if test="ruleName != null and ruleName != ''">
             AND rule_name like concat('%', #{ruleName}, '%')
         </if>
+        order by d.rule_id desc
     </select>
 
     <select id="findById" parameterType="Long" resultMap="SysAutoCodeRuleResult">
@@ -125,4 +126,4 @@
         delete from sys_auto_code_rule where rule_id = #{ruleId}
     </delete>
 
-</mapper>
+</mapper>