Prechádzať zdrojové kódy

彪马对账单插入

HULEI 2 týždňov pred
rodič
commit
957f3af1a9

+ 179 - 0
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractApproveController.java

@@ -2505,5 +2505,184 @@ public class contractApproveController {
         }
     }
 
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertPumaDataByQuarter")
+    public ResponseObject insertPumaDataByQuarter(UserContext uc) {
+        try {
+            ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance(
+                    "obj_516c3984931b4153b18f5445a2ed30d0",
+                    uc.getUID(),
+                    "彪马客户对账单-季度"
+            );
+            String querySql = "SELECT item_quarter, " +
+                    "sum(onetime_dollars) as onetime_dollars, " +
+                    "sum(tube_dollars) as tube_dollars, " +
+                    "sum(property_manage_dollars) as property_manage_dollars, " +
+                    "sum(construction_dollars) as construction_dollars, " +
+                    "sum(phone_dollars) as phone_dollars, " +
+                    "sum(datacard_dollars) as datacard_dollars, " +
+                    "sum(datacard_personal_dollars) as datacard_personal_dollars, " +
+                    "sum(vats_service_dollars) as vats_service_dollars, " +
+                    "sum(product_dollars) as product_dollars, " +
+                    "sum(adsl_dollars) as adsl_dollars, " +
+                    "sum(total_dollars) as total_dollars, " +
+                    "sum(VATS_SERVICE_DOLLARS) as VATS_SERVICE_DOLLARS " +
+                    "FROM VIEW_EU_DNV_RPT_MONTH_PUMA " +
+                    "GROUP BY item_quarter";
+
+            List<RowMap> queryResult = DBSql.getMaps(querySql);
+            if (queryResult.isEmpty()) {
+                return ResponseObject.newErrResponse("未查询到可插入的季度数据");
+            }
+
+            List<String> detailIds = new ArrayList<>();
+            List<String> duplicateQuarters = new ArrayList<>();
+            for (RowMap data : queryResult) {
+                String itemQuarter = data.get("item_quarter").toString();
+                String checkDuplicateSql = "SELECT COUNT(1) FROM BO_EU_DNRPT_MONTH_PUMA WHERE ITEM_QUARTER = ?";
+                int count = DBSql.getInt(checkDuplicateSql, new Object[]{itemQuarter});
+                if (count > 0) {
+                    duplicateQuarters.add(itemQuarter);
+                    continue;
+                }
+
+                String dateRange = convertQuarterToDateRange(itemQuarter);
+
+                BigDecimal totalDollars = convertToBigDecimal(data.get("total_dollars"));
+                String requestAmountCn = convertNumberToChinese(totalDollars); // 转大写
+
+                BO detailBO = new BO();
+                detailBO.setBindId(processInstance.getId());
+
+                detailBO.set("ITEM_QUARTER", itemQuarter);
+                detailBO.set("DATE_ITEM", dateRange);
+                detailBO.set("ONETIME_DOLLARS", convertToBigDecimal(data.get("onetime_dollars")));
+                detailBO.set("TUBE_DOLLARS", convertToBigDecimal(data.get("tube_dollars")));
+                detailBO.set("PROPERTY_MANAGE_DOLLARS", convertToBigDecimal(data.get("property_manage_dollars")));
+                detailBO.set("CONSTRUCTION_DOLLARS", convertToBigDecimal(data.get("construction_dollars")));
+                detailBO.set("PHONE_DOLLARS", convertToBigDecimal(data.get("phone_dollars")));
+                detailBO.set("DATACARD_DOLLARS", convertToBigDecimal(data.get("datacard_dollars")));
+                detailBO.set("DATACARD_PERSONAL_DOLLARS", convertToBigDecimal(data.get("datacard_personal_dollars")));
+                detailBO.set("VATS_SERVICE_DOLLARS", convertToBigDecimal(data.get("vats_service_dollars")));
+                detailBO.set("PRODUCT_DOLLARS", convertToBigDecimal(data.get("product_dollars")));
+                detailBO.set("ADSL_DOLLARS", convertToBigDecimal(data.get("adsl_dollars")));
+                detailBO.set("TOTAL_DOLLARS", totalDollars);
+                detailBO.set("VATS_SERVICE_DOLLARS", convertToBigDecimal(data.get("VATS_SERVICE_DOLLARS")));
+                detailBO.set("REQUEST_AMOUNT_CN", requestAmountCn);
+
+                SDK.getBOAPI().createDataBO("BO_EU_DNRPT_MONTH_PUMA", detailBO, uc);
+                detailIds.add(detailBO.getId());
+            }
+
+            Map<String, Object> result = new HashMap<>();
+            result.put("isCreated", true);
+            result.put("insertCount", detailIds.size());
+            result.put("duplicateCount", duplicateQuarters.size());
+            result.put("duplicateQuarters", duplicateQuarters);
+            result.put("detailRecordIds", detailIds);
+
+            String message;
+            if (!duplicateQuarters.isEmpty()) {
+                message = String.format("成功创建 %d 条季度汇总明细记录,跳过 %d 条重复季度数据(重复季度:%s)",
+                        detailIds.size(), duplicateQuarters.size(), String.join(",", duplicateQuarters));
+            } else {
+                message = String.format("成功创建 %d 条季度汇总明细记录", detailIds.size());
+            }
+            result.put("message", message);
+
+            ResponseObject responseObject = ResponseObject.newOkResponse();
+            responseObject.setData(result);
+            return responseObject;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseObject.newErrResponse("创建季度汇总明细失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 季度转日期范围(如20254 → 20251001-20251231)
+     * @param itemQuarter 季度字符串(格式:年+季度,如20251/20254)
+     * @return 日期范围字符串(如20251001-20251231)
+     */
+    private String convertQuarterToDateRange(String itemQuarter) {
+        if (StringUtils.isBlank(itemQuarter) || itemQuarter.length() < 5) {
+            return ""; // 格式异常返回空
+        }
+        // 拆分年和季度(如20254 → 年:2025,季度:4)
+        String yearStr = itemQuarter.substring(0, 4);
+        int quarter = Integer.parseInt(itemQuarter.substring(4));
+        int year = Integer.parseInt(yearStr);
+
+        // 定义各季度的起止月份
+        int startMonth = 0, endMonth = 0;
+        switch (quarter) {
+            case 1:
+                startMonth = 1;
+                endMonth = 3;
+                break;
+            case 2:
+                startMonth = 4;
+                endMonth = 6;
+                break;
+            case 3:
+                startMonth = 7;
+                endMonth = 9;
+                break;
+            case 4:
+                startMonth = 10;
+                endMonth = 12;
+                break;
+            default:
+                return ""; // 无效季度返回空
+        }
+
+        // 拼接起止日期(格式:年月日)
+        String startDate = yearStr + String.format("%02d", startMonth) + "01";
+        // 获取季度最后一天(处理2月/30天月份等)
+        String endDate = getQuarterLastDay(year, endMonth);
+
+        return startDate + "-" + endDate;
+    }
+
+    /**
+     * 获取指定年+月份的最后一天(如2025年2月 → 20250228/20250229)
+     * @param year 年
+     * @param month 月(1-12)
+     * @return 最后一天字符串(如20250228)
+     */
+    private String getQuarterLastDay(int year, int month) {
+        Calendar cal = Calendar.getInstance();
+        cal.set(Calendar.YEAR, year);
+        cal.set(Calendar.MONTH, month - 1); // Calendar月份从0开始
+        cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH));
+        // 格式化为yyyyMMdd
+        SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
+        return sdf.format(cal.getTime());
+    }
+
+    /**
+     * 通用金额类型转换(避免0值/类型异常)
+     */
+    private BigDecimal convertToBigDecimal(Object value) {
+        if (value == null) {
+            return BigDecimal.ZERO;
+        }
+        if (value instanceof BigDecimal) {
+            return (BigDecimal) value;
+        }
+        if (value instanceof Number) {
+            return BigDecimal.valueOf(((Number) value).doubleValue());
+        }
+        if (value instanceof String) {
+            try {
+                return new BigDecimal((String) value);
+            } catch (NumberFormatException e) {
+                return BigDecimal.ZERO;
+            }
+        }
+        return BigDecimal.ZERO;
+    }
+
+
 }