|
@@ -2079,58 +2079,68 @@ public class contractApproveController {
|
|
|
if (planIds.length == 0) {
|
|
if (planIds.length == 0) {
|
|
|
return ResponseObject.newErrResponse("支付计划ID不能为空");
|
|
return ResponseObject.newErrResponse("支付计划ID不能为空");
|
|
|
}
|
|
}
|
|
|
- String planId = planIds[0];
|
|
|
|
|
|
|
|
|
|
- // 检查是否已存在
|
|
|
|
|
- String checkSql = "SELECT BINDID " +
|
|
|
|
|
- "FROM BO_EU_DNIVT_PAY_REQUEST_DETAIL " +
|
|
|
|
|
- "WHERE PAYMENT_PLAN_ID = ?";
|
|
|
|
|
- Map<String, Object> existingBind = DBSql.getMap(checkSql, new Object[]{planId});
|
|
|
|
|
-
|
|
|
|
|
- if (existingBind != null) {
|
|
|
|
|
- String existingBindId = existingBind.get("BINDID").toString();
|
|
|
|
|
- Map<String, Object> result = new HashMap<>();
|
|
|
|
|
- result.put("isCreated", false);
|
|
|
|
|
- result.put("mainBindId", existingBindId);
|
|
|
|
|
- result.put("message", "已创建请求单主表:bindId");
|
|
|
|
|
- ResponseObject responseObject = ResponseObject.newOkResponse();
|
|
|
|
|
- responseObject.setData(result);
|
|
|
|
|
-
|
|
|
|
|
- if(DBSql.getInt("select count(1) from wfc_task where processinstid=?",new Object[]{existingBindId})==0)
|
|
|
|
|
- SDK.getProcessAPI().startById(existingBindId);
|
|
|
|
|
|
|
+ // -------------------------- 关键修正 --------------------------
|
|
|
|
|
+ // 1. 首先检查所有待创建的支付计划ID是否已存在于明细表中
|
|
|
|
|
+ List<String> existingPlanIds = new ArrayList<>();
|
|
|
|
|
+ for (String pid : planIds) {
|
|
|
|
|
+ String checkSql = "SELECT PAYMENT_PLAN_ID FROM BO_EU_DNIVT_PAY_REQUEST_DETAIL WHERE PAYMENT_PLAN_ID = ?";
|
|
|
|
|
+ Map<String, Object> existingDetail = DBSql.getMap(checkSql, new Object[]{pid});
|
|
|
|
|
+ if (existingDetail != null) {
|
|
|
|
|
+ existingPlanIds.add(pid);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- return responseObject;
|
|
|
|
|
|
|
+ // 如果有任何一个ID已存在,则不创建任何记录,并返回错误信息
|
|
|
|
|
+ if (!existingPlanIds.isEmpty()) {
|
|
|
|
|
+ return ResponseObject.newErrResponse("支付计划ID " + String.join(", ", existingPlanIds) + " 已存在于支付请求明细中,无法重复创建。");
|
|
|
}
|
|
}
|
|
|
|
|
+ // -------------------------- 关键修正结束 --------------------------
|
|
|
|
|
|
|
|
- // 新增:计算所有选中计划的PLAN_AMOUNT总和
|
|
|
|
|
|
|
+ // 2. 计算所有选中支付计划的总金额
|
|
|
BigDecimal requestAmountTotal = BigDecimal.ZERO;
|
|
BigDecimal requestAmountTotal = BigDecimal.ZERO;
|
|
|
|
|
+ Map<String, Map<String, Object>> allPlanData = new HashMap<>();
|
|
|
|
|
+
|
|
|
for (String pid : planIds) {
|
|
for (String pid : planIds) {
|
|
|
- String amountSql = "SELECT PLAN_AMOUNT FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE ID = ?";
|
|
|
|
|
- Map<String, Object> amountData = DBSql.getMap(amountSql, new Object[]{pid});
|
|
|
|
|
- if (amountData != null && amountData.get("PLAN_AMOUNT") != null) {
|
|
|
|
|
- // 兼容不同数字类型(BigDecimal/Double等)
|
|
|
|
|
- if (amountData.get("PLAN_AMOUNT") instanceof BigDecimal) {
|
|
|
|
|
- requestAmountTotal = requestAmountTotal.add((BigDecimal) amountData.get("PLAN_AMOUNT"));
|
|
|
|
|
- } else if (amountData.get("PLAN_AMOUNT") instanceof Number) {
|
|
|
|
|
- requestAmountTotal = requestAmountTotal.add(
|
|
|
|
|
- BigDecimal.valueOf(((Number) amountData.get("PLAN_AMOUNT")).doubleValue())
|
|
|
|
|
- );
|
|
|
|
|
|
|
+ String querySql = "SELECT " +
|
|
|
|
|
+ "PROJECT_LOCATION, PERIOD_BEGIN_DATE, PERIOD_END_DATE, LOCATION, " +
|
|
|
|
|
+ "PAY_DESC, PLAN_AMOUNT, PURCHASE_ORDER_NO, REFERENCE_NUMBER, PLAN_DATE, PAY_AMOUNT, REMARK, " +
|
|
|
|
|
+ "PLAN_NO, ORDER_ID, CONTRACT_SERVICE_ID, CONTRACT_COST_ID " +
|
|
|
|
|
+ "FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN WHERE ID = ?";
|
|
|
|
|
+ Map<String, Object> planData = DBSql.getMap(querySql, new Object[]{pid});
|
|
|
|
|
+
|
|
|
|
|
+ if (planData == null) {
|
|
|
|
|
+ return ResponseObject.newErrResponse("支付计划ID " + pid + " 不存在或已被删除。");
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ allPlanData.put(pid, planData); // 缓存查询结果,pid作为键
|
|
|
|
|
+
|
|
|
|
|
+ // 累加总金额
|
|
|
|
|
+ Object amountObj = planData.get("PLAN_AMOUNT");
|
|
|
|
|
+ if (amountObj != null) {
|
|
|
|
|
+ BigDecimal amount;
|
|
|
|
|
+ if (amountObj instanceof BigDecimal) {
|
|
|
|
|
+ amount = (BigDecimal) amountObj;
|
|
|
|
|
+ } else if (amountObj instanceof Number) {
|
|
|
|
|
+ amount = BigDecimal.valueOf(((Number) amountObj).doubleValue());
|
|
|
|
|
+ } else {
|
|
|
|
|
+ continue;
|
|
|
}
|
|
}
|
|
|
|
|
+ requestAmountTotal = requestAmountTotal.add(amount);
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- String payRequestId = planId;
|
|
|
|
|
|
|
+ // 3. 创建支付请求单主表(Process Instance + BO)
|
|
|
|
|
+ String mainPayRequestId = planIds[0];
|
|
|
ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance(
|
|
ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance(
|
|
|
"obj_8cf0923593b7465490c4e1f73e98d4d3",
|
|
"obj_8cf0923593b7465490c4e1f73e98d4d3",
|
|
|
uc.getUID(),
|
|
uc.getUID(),
|
|
|
- "支付请求单-" + payRequestId
|
|
|
|
|
|
|
+ "支付请求单-" + mainPayRequestId
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- // 创建主表时设置REQUEST_AMOUNT字段(存总和)
|
|
|
|
|
BO mainPayRequestBO = new BO();
|
|
BO mainPayRequestBO = new BO();
|
|
|
mainPayRequestBO.setBindId(processInstance.getId());
|
|
mainPayRequestBO.setBindId(processInstance.getId());
|
|
|
- mainPayRequestBO.set("REQUEST_AMOUNT", requestAmountTotal); // 关键修改:存入总和
|
|
|
|
|
-
|
|
|
|
|
|
|
+ mainPayRequestBO.set("REQUEST_AMOUNT", requestAmountTotal);
|
|
|
SDK.getBOAPI().create("BO_EU_DNIVT_PAY_REQUEST", mainPayRequestBO, processInstance, uc);
|
|
SDK.getBOAPI().create("BO_EU_DNIVT_PAY_REQUEST", mainPayRequestBO, processInstance, uc);
|
|
|
SDK.getProcessAPI().start(processInstance);
|
|
SDK.getProcessAPI().start(processInstance);
|
|
|
|
|
|
|
@@ -2138,55 +2148,49 @@ public class contractApproveController {
|
|
|
String mainBindId = mainPayRequestBO.getBindId();
|
|
String mainBindId = mainPayRequestBO.getBindId();
|
|
|
List<String> detailIds = new ArrayList<>();
|
|
List<String> detailIds = new ArrayList<>();
|
|
|
|
|
|
|
|
- // 明细创建逻辑保持不变
|
|
|
|
|
for (String pid : planIds) {
|
|
for (String pid : planIds) {
|
|
|
- String querySql = "SELECT " +
|
|
|
|
|
- "PROJECT_LOCATION, PERIOD_BEGIN_DATE, PERIOD_END_DATE, LOCATION, " +
|
|
|
|
|
- "PAY_DESC, PLAN_AMOUNT, PURCHASE_ORDER_NO, REFERENCE_NUMBER, PLAN_DATE, PAY_AMOUNT, REMARK, " +
|
|
|
|
|
- "PLAN_NO, ORDER_ID, CONTRACT_SERVICE_ID, CONTRACT_COST_ID " +
|
|
|
|
|
- "FROM VIEW_EU_DNIVT_ORDER_PAYMENT_PLAN " +
|
|
|
|
|
- "WHERE ID = ?";
|
|
|
|
|
- Map<String, Object> planData = DBSql.getMap(querySql, new Object[]{pid});
|
|
|
|
|
-
|
|
|
|
|
- if (planData != null) {
|
|
|
|
|
- BO detailBO = new BO();
|
|
|
|
|
- detailBO.setBindId(mainBindId);
|
|
|
|
|
- detailBO.set("PAYMENT_PLAN_ID", pid);
|
|
|
|
|
- detailBO.set("PROJECT_LOCATION", planData.get("PROJECT_LOCATION"));
|
|
|
|
|
- detailBO.set("PERIOD_BEGIN_DATE", planData.get("PERIOD_BEGIN_DATE"));
|
|
|
|
|
- detailBO.set("PERIOD_END_DATE", planData.get("PERIOD_END_DATE"));
|
|
|
|
|
- detailBO.set("LOCATION", planData.get("LOCATION"));
|
|
|
|
|
- detailBO.set("PAY_DESC", planData.get("PAY_DESC"));
|
|
|
|
|
- detailBO.set("PLAN_AMOUNT", planData.get("PLAN_AMOUNT"));
|
|
|
|
|
- detailBO.set("PLAN_DATE", planData.get("PLAN_DATE"));
|
|
|
|
|
- detailBO.set("AMOUNT", planData.get("PLAN_AMOUNT"));
|
|
|
|
|
- detailBO.set("REMARK", planData.get("REMARK"));
|
|
|
|
|
- detailBO.set("PLAN_NO", planData.get("PLAN_NO"));
|
|
|
|
|
- detailBO.set("ORDER_ID", planData.get("ORDER_ID"));
|
|
|
|
|
- detailBO.set("CONTRACT_SERVICE_ID", planData.get("CONTRACT_SERVICE_ID"));
|
|
|
|
|
- detailBO.set("CONTRACT_COST_ID", planData.get("CONTRACT_COST_ID"));
|
|
|
|
|
- detailBO.set("ORDER_NO", planData.get("PURCHASE_ORDER_NO"));
|
|
|
|
|
- detailBO.set("EXTTEXT3", planData.get("REFERENCE_NUMBER"));
|
|
|
|
|
-
|
|
|
|
|
- SDK.getBOAPI().createDataBO("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detailBO, uc);
|
|
|
|
|
- detailIds.add(detailBO.getId());
|
|
|
|
|
- }
|
|
|
|
|
- }
|
|
|
|
|
-
|
|
|
|
|
|
|
+ Map<String, Object> planData = allPlanData.get(pid);
|
|
|
|
|
+
|
|
|
|
|
+ BO detailBO = new BO();
|
|
|
|
|
+ detailBO.setBindId(mainBindId);
|
|
|
|
|
+
|
|
|
|
|
+ detailBO.set("PAYMENT_PLAN_ID", pid);
|
|
|
|
|
+
|
|
|
|
|
+ detailBO.set("PROJECT_LOCATION", planData.get("PROJECT_LOCATION"));
|
|
|
|
|
+ detailBO.set("PERIOD_BEGIN_DATE", planData.get("PERIOD_BEGIN_DATE"));
|
|
|
|
|
+ detailBO.set("PERIOD_END_DATE", planData.get("PERIOD_END_DATE"));
|
|
|
|
|
+ detailBO.set("LOCATION", planData.get("LOCATION"));
|
|
|
|
|
+ detailBO.set("PAY_DESC", planData.get("PAY_DESC"));
|
|
|
|
|
+ detailBO.set("PLAN_AMOUNT", planData.get("PLAN_AMOUNT"));
|
|
|
|
|
+ detailBO.set("PLAN_DATE", planData.get("PLAN_DATE"));
|
|
|
|
|
+ detailBO.set("AMOUNT", planData.get("PLAN_AMOUNT"));
|
|
|
|
|
+ detailBO.set("REMARK", planData.get("REMARK"));
|
|
|
|
|
+ detailBO.set("PLAN_NO", planData.get("PLAN_NO"));
|
|
|
|
|
+ detailBO.set("ORDER_ID", planData.get("ORDER_ID"));
|
|
|
|
|
+ detailBO.set("CONTRACT_SERVICE_ID", planData.get("CONTRACT_SERVICE_ID"));
|
|
|
|
|
+ detailBO.set("CONTRACT_COST_ID", planData.get("CONTRACT_COST_ID"));
|
|
|
|
|
+ detailBO.set("ORDER_NO", planData.get("PURCHASE_ORDER_NO"));
|
|
|
|
|
+ detailBO.set("EXTTEXT3", planData.get("REFERENCE_NUMBER"));
|
|
|
|
|
+
|
|
|
|
|
+ SDK.getBOAPI().createDataBO("BO_EU_DNIVT_PAY_REQUEST_DETAIL", detailBO, uc);
|
|
|
|
|
+ detailIds.add(detailBO.getId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 5. 组织并返回成功结果
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
result.put("isCreated", true);
|
|
result.put("isCreated", true);
|
|
|
result.put("mainRecordId", mainRecordId);
|
|
result.put("mainRecordId", mainRecordId);
|
|
|
result.put("mainBindId", mainBindId);
|
|
result.put("mainBindId", mainBindId);
|
|
|
result.put("detailRecordIds", detailIds);
|
|
result.put("detailRecordIds", detailIds);
|
|
|
- result.put("requestAmountTotal", requestAmountTotal); // 新增:返回总和
|
|
|
|
|
- result.put("message", "成功创建支付请求单及" + detailIds.size() + "条明细记录,请求总金额:" + requestAmountTotal);
|
|
|
|
|
|
|
+ result.put("requestAmountTotal", requestAmountTotal);
|
|
|
|
|
+ result.put("message", String.format("成功创建支付请求单及 %d 条明细记录,请求总金额:%s", detailIds.size(), requestAmountTotal));
|
|
|
|
|
|
|
|
ResponseObject responseObject = ResponseObject.newOkResponse();
|
|
ResponseObject responseObject = ResponseObject.newOkResponse();
|
|
|
responseObject.setData(result);
|
|
responseObject.setData(result);
|
|
|
return responseObject;
|
|
return responseObject;
|
|
|
|
|
|
|
|
} catch (Exception e) {
|
|
} catch (Exception e) {
|
|
|
- e.printStackTrace();
|
|
|
|
|
|
|
+ e.printStackTrace(); // 在生产环境中,建议使用日志框架记录异常
|
|
|
return ResponseObject.newErrResponse("创建支付请求单及明细失败:" + e.getMessage());
|
|
return ResponseObject.newErrResponse("创建支付请求单及明细失败:" + e.getMessage());
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|