|
|
@@ -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;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|