ソースを参照

Merge remote-tracking branch 'origin/test-merge' into test-merge

LHB 2 日 前
コミット
19178f4caf

+ 6 - 1
blade-service/blade-manager/src/main/java/org/springblade/manager/formula/impl/ExecutorMeter.java

@@ -1061,16 +1061,21 @@ public class ExecutorMeter extends FormulaExecutor {
                             //上一期的到本期末变更数量+本期变更数量
                             /*到本期末变更累计数量*/
                             BigDecimal prechangeTotal = new BigDecimal(StringUtils.isEmpty(preChangeForm.getChangeTotal())?"0":preChangeForm.getChangeTotal());
-                            change.setChangeEndPeriodUnit(prechangeTotal.add(prechangeTotal)+"");
+                            change.setChangeEndPeriodUnit(prechangeTotal.add(totalChangeUnit)+"");
                             //上一期的到本期末变更金额+本期变更金额
                             /*到本期末变更累计金额*/
                             BigDecimal prechangeMoney = new BigDecimal(StringUtils.isEmpty(preChangeForm.getChangeMoney())?"0":preChangeForm.getChangeMoney());
                             change.setChangeEndPeriodAmount(prechangeMoney.add(totalChangeAmount)+"");
                         }
+                    }else {
+                        change.setChangeEndPeriodUnit(totalChangeUnit+"");
+                        change.setChangeEndPeriodAmount(totalChangeAmount+"");
                     }
                     dataList.add(change);
                 }
                 if(!dataList.isEmpty()){
+                    //按清单号和项目编号排序
+                    InventoryUCUtil.sort(dataList);
                     InventoryUCUtil.saveOrUpdate(dataList,tec.getContractId(),tec.getPeriodId());
                 }
                 putOut();

+ 92 - 2
blade-service/blade-manager/src/main/java/org/springblade/manager/utils/InventoryUCUtil.java

@@ -19,6 +19,96 @@ import java.util.List;
 public class InventoryUCUtil {
     private static JdbcTemplate jdbcTemplate;
 
+    public static void sort(List<InventoryUnitChange> dataList) {
+        dataList.sort((a, b) -> {
+            // 首先按 inventoryNum 排序
+            int inventoryNumCompare = compareInventoryNum(a.getInventoryNum(), b.getInventoryNum());
+            if (inventoryNumCompare != 0) {
+                return inventoryNumCompare;
+            }
+
+            // 如果 inventoryNum 相同,按 formNumber 排序
+            return compareFormNumber(a.getFormNumber(), b.getFormNumber());
+        });
+    }
+    // 比较 inventoryNum 的方法
+    private static int compareInventoryNum(String num1, String num2) {
+        if (num1 == null && num2 == null) return 0;
+        if (num1 == null) return -1;
+        if (num2 == null) return 1;
+
+        // 提取数字部分和字母部分
+        Integer num1Int = extractNumber(num1);
+        Integer num2Int = extractNumber(num2);
+
+        // 先按数字比较
+        int numCompare = Integer.compare(num1Int != null ? num1Int : Integer.MAX_VALUE,
+                num2Int != null ? num2Int : Integer.MAX_VALUE);
+        if (numCompare != 0) {
+            return numCompare;
+        }
+
+        // 数字相同则按字母比较
+        String letter1 = extractLetter(num1);
+        String letter2 = extractLetter(num2);
+        return letter1.compareTo(letter2);
+    }
+
+    // 比较 formNumber 的方法
+    private static int compareFormNumber(String num1, String num2) {
+        if (num1 == null && num2 == null) return 0;
+        if (num1 == null) return -1;
+        if (num2 == null) return 1;
+
+        // 去掉横线并分割
+        String[] parts1 = num1.replace("-", "").split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+        String[] parts2 = num2.replace("-", "").split("(?<=\\D)(?=\\d)|(?<=\\d)(?=\\D)");
+
+        int minLength = Math.min(parts1.length, parts2.length);
+
+        for (int i = 0; i < minLength; i++) {
+            String part1 = parts1[i];
+            String part2 = parts2[i];
+
+            // 如果都是数字,按数字比较
+            if (isNumeric(part1) && isNumeric(part2)) {
+                int numCompare = Integer.compare(Integer.parseInt(part1), Integer.parseInt(part2));
+                if (numCompare != 0) {
+                    return numCompare;
+                }
+            } else {
+                // 否则按字符串比较
+                int strCompare = part1.compareTo(part2);
+                if (strCompare != 0) {
+                    return strCompare;
+                }
+            }
+        }
+
+        // 如果前面都相同,长度短的在前
+        return Integer.compare(parts1.length, parts2.length);
+    }
+
+    // 提取字符串中的数字部分
+    private static Integer extractNumber(String str) {
+        java.util.regex.Pattern pattern = java.util.regex.Pattern.compile("(\\d+)");
+        java.util.regex.Matcher matcher = pattern.matcher(str);
+        if (matcher.find()) {
+            return Integer.parseInt(matcher.group(1));
+        }
+        return null;
+    }
+
+    // 提取字符串中的字母部分
+    private static String extractLetter(String str) {
+        return str.replaceAll("\\d+", "");
+    }
+
+    // 判断字符串是否为纯数字
+    private static boolean isNumeric(String str) {
+        return str.matches("\\d+");
+    }
+
     @Autowired
     public  void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
         InventoryUCUtil.jdbcTemplate = jdbcTemplate;
@@ -44,8 +134,8 @@ public class InventoryUCUtil {
         for (InventoryUnitChange change : dataList) {
             ChangeInventoryForm changeForm = getChangeForm(contractId, periodId, change.getFormNumber());
             if(changeForm==null){
-                String insertSql = "INSERT INTO s_change_inventory_form(id,contract_id,period_id,form_number,item_name,change_total,change_money,after_change_total,after_change_money,is_deleted) VALUES(?,?,?,?,?,?,?,?,?,?)";
-                jdbcTemplate.update(insertSql, SnowFlakeUtil.getId(), contractId, periodId, change.getFormNumber(), change.getItemName(),
+                String insertSql = "INSERT INTO s_change_inventory_form(id,contract_id,period_id,inventory_num,form_number,item_name,change_total,change_money,after_change_total,after_change_money,is_deleted) VALUES(?,?,?,?,?,?,?,?,?,?,?)";
+                jdbcTemplate.update(insertSql, SnowFlakeUtil.getId(), contractId, periodId,change.getInventoryNum(), change.getFormNumber(), change.getItemName(),
                         change.getChangePeriodUnit(), change.getChangePeriodAmount(), change.getChangeEndPeriodUnit(),
                         change.getChangeEndPeriodAmount(), 0);
             }else {