Explorar el Código

佣金周期生成更新

HULEI hace 2 meses
padre
commit
c3dae582db

BIN
com.awspaas.user.apps.donenow_ctt/com.awspaas.user.apps.donenow_ctt.jar


+ 319 - 176
com.awspaas.user.apps.donenow_ctt/src/com/awspaas/user/apps/donenow_ctt/controller/contractApproveController.java

@@ -1015,29 +1015,136 @@ public class contractApproveController {
         return ResponseObject.newOkResponse();
     }
 
-    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertCommissionPeriods")
-    public ResponseObject insertCommissionPeriods(UserContext uc,
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.updateCommissionPeriodEndDate")
+    public ResponseObject updateCommissionPeriodEndDate(UserContext uc, String id, String periodEndDate) {
+        // 1. 参数校验
+        if (StringUtils.isBlank(id)) {
+            return ResponseObject.newErrResponse("id 不能为空");
+        }
+        if (StringUtils.isBlank(periodEndDate)) {
+            return ResponseObject.newErrResponse("PERIOD_END_DATE 不能为空");
+        }
+
+        try {
+
+            // 3. 构建更新 SQL
+            String updateSql = "UPDATE BO_EU_DNCTT_COMMISSION SET PERIOD_END_DATE = ? WHERE ID = ?";
+
+            // 4. 执行更新操作
+            int rows = DBSql.update(updateSql, new Object[]{periodEndDate, id});
+
+            // 5. 构造返回结果
+            Map<String, Object> result = new HashMap<>();
+            result.put("id", id);
+            result.put("periodEndDate", periodEndDate);
+            result.put("updatedRows", rows);
+
+            ResponseObject responseObject = ResponseObject.newOkResponse();
+            responseObject.setData(result);
+
+            return responseObject;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseObject.newErrResponse("更新失败:" + e.getMessage());
+        }
+    }
+
+    // 按月补贴:周期增量=1个月
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertMonthlyCommission")
+    public ResponseObject insertMonthlyCommission(UserContext uc,
                                                   String bindid,
                                                   String startDate,
                                                   String endDate,
                                                   String amount) {
+        return insertCommissionByPeriod(uc, bindid, startDate, endDate, amount, 1);
+    }
+
+    // 按季度补贴:周期增量=3个月
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertQuarterlyCommission")
+    public ResponseObject insertQuarterlyCommission(UserContext uc,
+                                                    String bindid,
+                                                    String startDate,
+                                                    String endDate,
+                                                    String amount) {
+        return insertCommissionByPeriod(uc, bindid, startDate, endDate, amount, 3);
+    }
+
+    // 按年补贴:周期增量=12个月
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertYearlyCommission")
+    public ResponseObject insertYearlyCommission(UserContext uc,
+                                                 String bindid,
+                                                 String startDate,
+                                                 String endDate,
+                                                 String amount) {
+        return insertCommissionByPeriod(uc, bindid, startDate, endDate, amount, 12);
+    }
 
+    // 一次性补贴:只生成一个周期(开始日期到结束日期)
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.insertOneTimeCommission")
+    public ResponseObject insertOneTimeCommission(UserContext uc,
+                                                  String bindid,
+                                                  String startDate,
+                                                  String endDate,
+                                                  String amount) {
         // 1. 参数校验
-        if (StringUtils.isBlank(bindid)) {
-            return ResponseObject.newErrResponse("bindid不能为空");
-        }
-        if (StringUtils.isBlank(startDate)) {
-            return ResponseObject.newErrResponse("开始日期不能为空");
-        }
-        if (StringUtils.isBlank(endDate)) {
-            return ResponseObject.newErrResponse("结束日期不能为空");
-        }
-        if (StringUtils.isBlank(amount)) {
-            return ResponseObject.newErrResponse("金额不能为空");
+        if (StringUtils.isBlank(bindid)) return ResponseObject.newErrResponse("bindid不能为空");
+        if (StringUtils.isBlank(startDate)) return ResponseObject.newErrResponse("开始日期不能为空");
+        if (StringUtils.isBlank(endDate)) return ResponseObject.newErrResponse("结束日期不能为空");
+        if (StringUtils.isBlank(amount)) return ResponseObject.newErrResponse("金额不能为空");
+
+        try {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            // 校验开始日期是否早于结束日期
+            Date start = sdf.parse(startDate);
+            Date end = sdf.parse(endDate);
+            if (start.after(end)) {
+                return ResponseObject.newErrResponse("开始日期不能晚于结束日期");
+            }
+
+            // 2. 插入SQL(仅插入一条记录)
+            String insertSql = "INSERT INTO BO_EU_DNCTT_COMMISSION_PERIOD " +
+                    "(ID, ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, " +
+                    "COMMISSION_DOLLARS, PERIOD_ADJUSTED_PRICE) " +
+                    "VALUES (UUID(), ?, ?, ?, ?, ?, ?)";
+
+            // 3. 执行插入(仅一次,不循环)
+            int rows = DBSql.update(insertSql, new Object[]{
+                    uc.getCompanyModel().getId(),
+                    bindid,
+                    startDate, // 直接用用户输入的开始日期
+                    endDate,   // 直接用用户输入的结束日期
+                    amount,
+                    amount
+            });
+
+            // 4. 返回结果
+            Map<String, Object> result = new HashMap<>();
+            result.put("bindid", bindid);
+            result.put("rows", rows); // 应为1(成功插入1条)
+            ResponseObject responseObject = ResponseObject.newOkResponse();
+            responseObject.setData(result);
+
+            return responseObject;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseObject.newErrResponse("插入失败:" + e.getMessage());
         }
+    }
+
+    // 通用方法:按周期增量(1/3/12个月)生成多个周期
+    private ResponseObject insertCommissionByPeriod(UserContext uc,
+                                                    String bindid,
+                                                    String startDate,
+                                                    String endDate,
+                                                    String amount,
+                                                    int periodIncrement) {
+        // 参数校验(同上,略)
+        if (StringUtils.isBlank(bindid)) return ResponseObject.newErrResponse("bindid不能为空");
+        // ... 其他校验
 
         try {
-            // 2. 日期处理
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             Calendar cal = Calendar.getInstance();
             cal.setTime(sdf.parse(startDate));
@@ -1046,28 +1153,26 @@ public class contractApproveController {
             Calendar endCal = Calendar.getInstance();
             endCal.setTime(sdf.parse(endDate));
 
-            // 3. 插入 SQL
             String insertSql = "INSERT INTO BO_EU_DNCTT_COMMISSION_PERIOD " +
-                    "(ID,ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, COMMISSION_DOLLARS,PERIOD_ADJUSTED_PRICE) " +
-                    "VALUES (UUID(),?, ?, ?, ?, ?,?)";
+                    "(ID, ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, " +
+                    "COMMISSION_DOLLARS, PERIOD_ADJUSTED_PRICE) " +
+                    "VALUES (UUID(), ?, ?, ?, ?, ?, ?)";
 
             int rows = 0;
-
             Calendar currentCal = Calendar.getInstance();
             currentCal.setTime(sdf.parse(startDate));
 
-            // 4. 循环生成 12 个周期
-            for (int i = 0; i < 12; i++) {
+            // 循环生成周期(按传入的增量:1/3/12个月)
+            while (true) {
                 Date periodStart = currentCal.getTime();
+                if (periodStart.after(endCal.getTime())) break;
 
-                currentCal.add(Calendar.MONTH, 1);
+                currentCal.add(Calendar.MONTH, periodIncrement);
                 currentCal.set(Calendar.DATE, settleDay);
                 currentCal.add(Calendar.DATE, -1);
                 Date periodEnd = currentCal.getTime();
 
-                if (periodEnd.after(endCal.getTime())) {
-                    periodEnd = endCal.getTime();
-                }
+                if (periodEnd.after(endCal.getTime())) periodEnd = endCal.getTime();
 
                 rows += DBSql.update(insertSql, new Object[]{
                         uc.getCompanyModel().getId(),
@@ -1080,20 +1185,10 @@ public class contractApproveController {
 
                 currentCal.add(Calendar.DATE, 1);
                 currentCal.set(Calendar.DATE, settleDay);
-
-                if (periodStart.after(endCal.getTime())) {
-                    break;
-                }
             }
 
-            // 5. 构造返回结果
             Map<String, Object> result = new HashMap<>();
-            result.put("bindid", bindid);
-            result.put("startDate", startDate);
-            result.put("endDate", endDate);
-            result.put("amount", amount);
             result.put("rows", rows);
-
             ResponseObject responseObject = ResponseObject.newOkResponse();
             responseObject.setData(result);
 
@@ -1105,150 +1200,213 @@ public class contractApproveController {
         }
     }
 
-    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.batchInsertAgentPeriods")
-    public ResponseObject batchInsertAgentPeriods(UserContext uc,
-                                                  String bindid,
-                                                  String startDate,
-                                                  String endDate,
-                                                  String amount) {
+    // 通用查询代理列表(不变)
+    private List<Map<String, Object>> queryAgentList(String bindid) {
+        List<Map<String, Object>> agentList = new ArrayList<>();
+        int offset = 0;
+        while (true) {
+            String querySql = "SELECT AGENT, RATIO FROM BO_EU_DNCTT_COMMISSION_AGENT WHERE bindid = ? LIMIT 1 OFFSET ?";
+            RowMap agentMap = DBSql.getMap(querySql, new Object[]{bindid, offset});
+            if (agentMap == null) break;
+
+            String agent = agentMap.getString("AGENT");
+            BigDecimal ratio = parseRatio(agentMap.get("RATIO"));
+            if (ratio == null) {
+                throw new RuntimeException("代理 " + agent + " 的比例为空");
+            }
 
-        // 1. 参数校验
-        if (StringUtils.isBlank(bindid)) {
-            return ResponseObject.newErrResponse("bindid不能为空");
-        }
-        if (StringUtils.isBlank(startDate)) {
-            return ResponseObject.newErrResponse("开始日期不能为空");
-        }
-        if (StringUtils.isBlank(endDate)) {
-            return ResponseObject.newErrResponse("结束日期不能为空");
-        }
-        if (StringUtils.isBlank(amount)) {
-            return ResponseObject.newErrResponse("基础金额不能为空");
+            Map<String, Object> agentInfo = new HashMap<>();
+            agentInfo.put("AGENT", agent);
+            agentInfo.put("RATIO", ratio);
+            agentList.add(agentInfo);
+            offset++;
         }
+        return agentList;
+    }
 
+    // 通用比例解析(不变)
+    private BigDecimal parseRatio(Object ratioObj) {
+        if (ratioObj == null) return null;
         try {
-            // 2. 分页查询所有代理(同时查 AGENT 和 RATIO)
-            List<Map<String, Object>> agentList = new ArrayList<>();
-            int offset = 0;
-            while (true) {
-                String querySql = "SELECT AGENT, RATIO FROM BO_EU_DNCTT_COMMISSION_AGENT WHERE bindid = ? LIMIT 1 OFFSET ?";
-                RowMap agentMap = DBSql.getMap(querySql, new Object[]{bindid, offset});
-                if (agentMap == null) {
-                    break; // 没有更多数据
-                }
-
-                String agent = agentMap.getString("AGENT");
-                BigDecimal ratio = null;
-
-                Object ratioObj = agentMap.get("RATIO");
-                if (ratioObj != null) {
-                    if (ratioObj instanceof BigDecimal) {
-                        ratio = (BigDecimal) ratioObj;
-                    } else if (ratioObj instanceof Double) {
-                        ratio = BigDecimal.valueOf((Double) ratioObj);
-                    } else if (ratioObj instanceof Float) {
-                        ratio = BigDecimal.valueOf(((Float) ratioObj).doubleValue());
-                    } else if (ratioObj instanceof Integer) {
-                        ratio = BigDecimal.valueOf(((Integer) ratioObj).longValue());
-                    } else {
-                        try {
-                            ratio = new BigDecimal(ratioObj.toString());
-                        } catch (Exception e) {
-                            return ResponseObject.newErrResponse("代理 " + agent + " 的比例格式错误:" + ratioObj);
-                        }
-                    }
-                }
-
-                if (ratio == null) {
-                    return ResponseObject.newErrResponse("代理 " + agent + " 的比例为空");
-                }
-
-                Map<String, Object> agentInfo = new HashMap<>();
-                agentInfo.put("AGENT", agent);
-                agentInfo.put("RATIO", ratio);
-                agentList.add(agentInfo);
+            if (ratioObj instanceof BigDecimal) return (BigDecimal) ratioObj;
+            if (ratioObj instanceof Double) return BigDecimal.valueOf((Double) ratioObj);
+            if (ratioObj instanceof Float) return BigDecimal.valueOf(((Float) ratioObj).doubleValue());
+            if (ratioObj instanceof Integer) return BigDecimal.valueOf(((Integer) ratioObj).longValue());
+            return new BigDecimal(ratioObj.toString());
+        } catch (Exception e) {
+            throw new RuntimeException("比例格式错误:" + ratioObj, e);
+        }
+    }
 
-                offset++;
+    // 通用周期生成方法(按月/季度/年复用,不变)
+    private ResponseObject batchInsertAgentByPeriod(UserContext uc,
+                                                    String bindid,
+                                                    String startDate,
+                                                    String endDate,
+                                                    String amount,
+                                                    int periodIncrement) {
+        try {
+            // 参数校验
+            if (StringUtils.isBlank(bindid) || StringUtils.isBlank(startDate) ||
+                    StringUtils.isBlank(endDate) || StringUtils.isBlank(amount)) {
+                return ResponseObject.newErrResponse("bindid、日期、金额不能为空");
             }
 
+            // 查询代理列表
+            List<Map<String, Object>> agentList = queryAgentList(bindid);
             if (agentList.isEmpty()) {
                 return ResponseObject.newErrResponse("未找到二级代理数据");
             }
 
-            // 3. 日期处理
+            // 日期与金额处理
             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
             Calendar cal = Calendar.getInstance();
             cal.setTime(sdf.parse(startDate));
             int settleDay = cal.get(Calendar.DATE);
-
             Calendar endCal = Calendar.getInstance();
             endCal.setTime(sdf.parse(endDate));
+            BigDecimal baseAmount = new BigDecimal(amount);
 
-            // 4. 插入 SQL
+            // 插入SQL
             String insertSql = "INSERT INTO BO_EU_DNCTT_COMMISSION_PERIOD_AGENT " +
-                    "(ID, AGENT,ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, COMMISSION_DOLLARS,PERIOD_ADJUSTED_PRICE) " +
-                    "VALUES (UUID(), ?,?, ?, ?, ?, ?,?)";
+                    "(ID, AGENT, ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, " +
+                    "COMMISSION_DOLLARS, PERIOD_ADJUSTED_PRICE) " +
+                    "VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?)";
 
-            int rows = 0;
-            BigDecimal baseAmount = new BigDecimal(amount);
-
-            // 5. 循环每个代理
+            int totalRows = 0;
             for (Map<String, Object> agentInfo : agentList) {
                 String agent = (String) agentInfo.get("AGENT");
                 BigDecimal ratio = (BigDecimal) agentInfo.get("RATIO");
+                BigDecimal realCommission = baseAmount.multiply(ratio.divide(new BigDecimal("100")));
 
-                // 百分比转小数(20 → 0.2)
-                BigDecimal ratioDecimal = ratio.divide(new BigDecimal("100"));
-
-                // 计算实际佣金
-                BigDecimal realCommission = baseAmount.multiply(ratioDecimal);
-
+                // 按周期增量生成子周期
                 Calendar currentCal = Calendar.getInstance();
                 currentCal.setTime(sdf.parse(startDate));
-
-                for (int i = 0; i < 12; i++) {
+                while (true) {
                     Date periodStart = currentCal.getTime();
+                    if (periodStart.after(endCal.getTime())) break;
 
-                    currentCal.add(Calendar.MONTH, 1);
+                    // 计算周期结束日
+                    currentCal.add(Calendar.MONTH, periodIncrement);
                     currentCal.set(Calendar.DATE, settleDay);
                     currentCal.add(Calendar.DATE, -1);
                     Date periodEnd = currentCal.getTime();
+                    if (periodEnd.after(endCal.getTime())) periodEnd = endCal.getTime();
 
-                    if (periodEnd.after(endCal.getTime())) {
-                        periodEnd = endCal.getTime();
-                    }
-
-                    rows += DBSql.update(insertSql, new Object[]{
-                            agent,
-                            uc.getCompanyModel().getId(),
-                            bindid,
-                            sdf.format(periodStart),
-                            sdf.format(periodEnd),
-                            realCommission.toPlainString(),
-                            realCommission.toPlainString()
+                    // 插入记录
+                    totalRows += DBSql.update(insertSql, new Object[]{
+                            agent, uc.getCompanyModel().getId(), bindid,
+                            sdf.format(periodStart), sdf.format(periodEnd),
+                            realCommission.toPlainString(), realCommission.toPlainString()
                     });
 
+                    // 准备下一个周期
                     currentCal.add(Calendar.DATE, 1);
                     currentCal.set(Calendar.DATE, settleDay);
-
-                    if (periodStart.after(endCal.getTime())) {
-                        break;
-                    }
                 }
             }
 
-            // 6. 返回结果
+            // 返回结果
             Map<String, Object> result = new HashMap<>();
             result.put("bindid", bindid);
-            result.put("startDate", startDate);
-            result.put("endDate", endDate);
-            result.put("baseAmount", amount);
-            result.put("rows", rows);
+            result.put("rows", totalRows);
             result.put("agentCount", agentList.size());
-
             ResponseObject responseObject = ResponseObject.newOkResponse();
             responseObject.setData(result);
+            return responseObject;
+
+        } catch (Exception e) {
+            e.printStackTrace();
+            return ResponseObject.newErrResponse("插入失败:" + e.getMessage());
+        }
+    }
+
+    // 1. 按月生成(周期增量=1个月)
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.batchInsertAgentMonthly")
+    public ResponseObject batchInsertAgentMonthly(UserContext uc,
+                                                  String bindid,
+                                                  String startDate,
+                                                  String endDate,
+                                                  String amount) {
+        return batchInsertAgentByPeriod(uc, bindid, startDate, endDate, amount, 1);
+    }
+
+    // 2. 按季度生成(周期增量=3个月)
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.batchInsertAgentQuarterly")
+    public ResponseObject batchInsertAgentQuarterly(UserContext uc,
+                                                    String bindid,
+                                                    String startDate,
+                                                    String endDate,
+                                                    String amount) {
+        return batchInsertAgentByPeriod(uc, bindid, startDate, endDate, amount, 3);
+    }
+
+    // 3. 按年生成(新增,周期增量=12个月)
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.batchInsertAgentYearly")
+    public ResponseObject batchInsertAgentYearly(UserContext uc,
+                                                 String bindid,
+                                                 String startDate,
+                                                 String endDate,
+                                                 String amount) {
+        return batchInsertAgentByPeriod(uc, bindid, startDate, endDate, amount, 12); // 12个月=1年
+    }
+
+    // 4. 一次性生成(无周期拆分)
+    @Mapping(value = "com.awspaas.user.apps.donenow_ctt.batchInsertAgentOneTime")
+    public ResponseObject batchInsertAgentOneTime(UserContext uc,
+                                                  String bindid,
+                                                  String startDate,
+                                                  String endDate,
+                                                  String amount) {
+        try {
+            // 参数校验
+            if (StringUtils.isBlank(bindid) || StringUtils.isBlank(startDate) ||
+                    StringUtils.isBlank(endDate) || StringUtils.isBlank(amount)) {
+                return ResponseObject.newErrResponse("bindid、日期、金额不能为空");
+            }
+
+            // 日期合法性校验
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            Date start = sdf.parse(startDate);
+            Date end = sdf.parse(endDate);
+            if (start.after(end)) {
+                return ResponseObject.newErrResponse("开始日期不能晚于结束日期");
+            }
+
+            // 查询代理列表
+            List<Map<String, Object>> agentList = queryAgentList(bindid);
+            if (agentList.isEmpty()) {
+                return ResponseObject.newErrResponse("未找到二级代理数据");
+            }
+
+            // 插入SQL
+            String insertSql = "INSERT INTO BO_EU_DNCTT_COMMISSION_PERIOD_AGENT " +
+                    "(ID, AGENT, ORGID, BINDID, PERIOD_BEGIN_DATE, PERIOD_END_DATE, " +
+                    "COMMISSION_DOLLARS, PERIOD_ADJUSTED_PRICE) " +
+                    "VALUES (UUID(), ?, ?, ?, ?, ?, ?, ?)";
+
+            int totalRows = 0;
+            BigDecimal baseAmount = new BigDecimal(amount);
+            for (Map<String, Object> agentInfo : agentList) {
+                String agent = (String) agentInfo.get("AGENT");
+                BigDecimal ratio = (BigDecimal) agentInfo.get("RATIO");
+                BigDecimal realCommission = baseAmount.multiply(ratio.divide(new BigDecimal("100")));
 
+                // 直接插入“开始→结束”的1条记录
+                totalRows += DBSql.update(insertSql, new Object[]{
+                        agent, uc.getCompanyModel().getId(), bindid,
+                        startDate, endDate,
+                        realCommission.toPlainString(), realCommission.toPlainString()
+                });
+            }
+
+            // 返回结果
+            Map<String, Object> result = new HashMap<>();
+            result.put("bindid", bindid);
+            result.put("rows", totalRows);
+            result.put("agentCount", agentList.size());
+            ResponseObject responseObject = ResponseObject.newOkResponse();
+            responseObject.setData(result);
             return responseObject;
 
         } catch (Exception e) {
@@ -1259,15 +1417,19 @@ public class contractApproveController {
 
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.checkCommissionPeriodExists")
     public ResponseObject checkCommissionPeriodExists(UserContext uc,
-                                                      String bindid) {
+                                                      String bindid,
+                                                      String startDate,
+                                                      String endDate) {
         try {
             String checkSql = "SELECT COUNT(1) FROM BO_EU_DNCTT_COMMISSION_PERIOD " +
-                    "WHERE BINDID = ?";
+                    "WHERE BINDID = ? " +
+                    "AND PERIOD_BEGIN_DATE <= ? " +
+                    "AND PERIOD_END_DATE >= ?";
 
-            int existCount = DBSql.getInt(checkSql, new Object[]{bindid});
+            int existCount = DBSql.getInt(checkSql, new Object[]{bindid, endDate, startDate});
 
             Map<String, Object> result = new HashMap<>();
-            result.put("exists", existCount > 0); // true 表示已存在
+            result.put("exists", existCount > 0);
 
             ResponseObject responseObject = ResponseObject.newOkResponse();
             responseObject.setData(result);
@@ -1303,48 +1465,31 @@ public class contractApproveController {
 
     @Mapping(value = "com.awspaas.user.apps.donenow_ctt.updateAgentCommissionByIds")
     public ResponseObject updateAgentCommissionByIds(UserContext uc,
-                                                     String ids,          // 多个ID逗号分隔
-                                                     String agent,        // 二级代理(必填)
-                                                     String ACCOUNT_PAY_DATE, // 实际付款时间(必填)
-                                                     BigDecimal payAmount,// 付款金额(必填)
-                                                     String payer,        // 付款人(必填)
-                                                     String remark,       // 备注(可选)
-                                                     String invoiceTypeId,// 发票类型(可选)
-                                                     String agentInvoiceNo,// 二代发票号(可选)
-                                                     String invoiceFile)  // 发票附件(可选)
-    {
+                                                     String ids,
+                                                     String commissionPayId,
+                                                     String agent,
+                                                     String ACCOUNT_PAY_DATE,
+                                                     BigDecimal payAmount,
+                                                     String payer,
+                                                     String remark,
+                                                     String invoiceTypeId,
+                                                     String agentInvoiceNo,
+                                                     String invoiceFile) {
         try {
-            // 必填字段校验
             if (ids == null || ids.trim().isEmpty()) {
-                ResponseObject err = ResponseObject.newErrResponse("ids不能为空");
-                return err;
-            }
-            if (agent == null || agent.trim().isEmpty()) {
-                ResponseObject err = ResponseObject.newErrResponse("二级代理不能为空");
-                return err;
-            }
-            if (ACCOUNT_PAY_DATE == null || ACCOUNT_PAY_DATE.trim().isEmpty()) {
-                ResponseObject err = ResponseObject.newErrResponse("实际付款时间不能为空");
-                return err;
-            }
-            if (payAmount == null || payAmount.compareTo(BigDecimal.ZERO) < 0) {
-                ResponseObject err = ResponseObject.newErrResponse("付款金额无效");
-                return err;
+                return ResponseObject.newErrResponse("ids不能为空");
             }
-            if (payer == null || payer.trim().isEmpty()) {
-                ResponseObject err = ResponseObject.newErrResponse("付款人不能为空");
-                return err;
+            if (commissionPayId == null || commissionPayId.trim().isEmpty()) {
+                return ResponseObject.newErrResponse("commissionPayId不能为空");
             }
 
-            // ID 转数组
             String[] idArr = ids.split(",");
 
-            // 动态拼接 SQL
             StringBuilder updateSql = new StringBuilder("UPDATE VIEW_EU_DNV_COMMISSION_PERIOD_AGENT SET ");
             List<Object> params = new ArrayList<>();
 
-            // 必更新字段
-            updateSql.append("AGENT = ?, ACCOUNT_PAY_DATE = ?, PAY_AMOUNT = ?, PAYER = ?, ");
+            updateSql.append("COMMISSION_PAY_ID = ?, AGENT = ?, ACCOUNT_PAY_DATE = ?, PAY_AMOUNT = ?, PAYER = ?, ");
+            params.add(commissionPayId.trim());
             params.add(agent);
             params.add(ACCOUNT_PAY_DATE);
             params.add(payAmount);
@@ -1368,12 +1513,10 @@ public class contractApproveController {
                 params.add(invoiceFile);
             }
 
-            // 去掉最后一个逗号和空格
             if (updateSql.charAt(updateSql.length() - 2) == ',') {
                 updateSql.setLength(updateSql.length() - 2);
             }
 
-            // WHERE IN
             StringBuilder placeholders = new StringBuilder();
             for (int i = 0; i < idArr.length; i++) {
                 if (i > 0) placeholders.append(",");
@@ -1381,15 +1524,12 @@ public class contractApproveController {
             }
             updateSql.append(" WHERE ID IN (").append(placeholders.toString()).append(")");
 
-            // 补充ID参数
             for (String id : idArr) {
                 params.add(id.trim());
             }
 
-            // 执行更新
             int updateCount = DBSql.update(updateSql.toString(), params.toArray());
 
-            // 构造返回结果
             Map<String, Object> result = new HashMap<>();
             result.put("updateCount", updateCount);
 
@@ -1399,9 +1539,9 @@ public class contractApproveController {
 
         } catch (Exception e) {
             e.printStackTrace();
-            ResponseObject err = ResponseObject.newErrResponse("更新失败:" + e.getMessage());
-            return err;
+            return ResponseObject.newErrResponse("更新失败:" + e.getMessage());
         }
+    }
 
     /**
      * 佣金审批
@@ -1528,4 +1668,7 @@ public class contractApproveController {
         }
         return ResponseObject.newOkResponse();
     }
+
+
 }
+

+ 22 - 5
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/caiController.java

@@ -217,6 +217,7 @@ public class caiController {
                                             String orderId,
                                             String planDate,
                                             Double planAmount) {
+        // 参数校验
         if (StringUtils.isBlank(orderId)) {
             return ResponseObject.newErrResponse("订单ID不能为空");
         }
@@ -225,33 +226,49 @@ public class caiController {
         }
 
         try {
+            // 用原生SQL查询订单表,获取VENDOR_ACCOUNT_ID(与queryPayAmount风格一致)
+            String querySql = "select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_ORDER where ID = ?";
+            List<RowMap> orderRows = DBSql.getMaps(querySql, new Object[]{orderId});
+
+            if (orderRows == null || orderRows.isEmpty()) {
+                return ResponseObject.newErrResponse("订单不存在,orderId=" + orderId);
+            }
+            String vendorAccountId = orderRows.get(0).getString("VENDOR_ACCOUNT_ID");
+            if (StringUtils.isBlank(vendorAccountId)) {
+                return ResponseObject.newErrResponse("订单对应的VENDOR_ACCOUNT_ID为空,orderId=" + orderId);
+            }
+
+            // 创建流程实例(保持原有逻辑不变)
             ProcessInstance processInstance = SDK.getProcessAPI()
                     .createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d",
                             uc.getUID(),
                             "付款计划");
+            String bindId = processInstance.getId();
 
+            // 构建BO对象并创建业务数据(保持原有逻辑不变)
             BO bo = new BO();
-
-            bo.setBindId(processInstance.getId());
-
+            bo.setBindId(bindId);
             bo.set("ORDER_ID", orderId);
             bo.set("PLAN_DATE", planDate);
             bo.set("PLAN_AMOUNT", planAmount);
-
+            bo.set("ACCOUNT_PAYEE", vendorAccountId);
             SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", bo, uc);
 
+            // 组装返回结果(与queryPayAmount风格一致)
             List<Map<String, Object>> resultList = new ArrayList<>();
             Map<String, Object> plan = new HashMap<>();
             plan.put("order_id", orderId);
             plan.put("计划付款时间", planDate);
             plan.put("计划付款金额", planAmount);
-            plan.put("bindId", processInstance.getId());
+            plan.put("bindId", bindId);
+            plan.put("ACCOUNT_PAYEE", vendorAccountId);
             resultList.add(plan);
 
             ResponseObject responseObject = ResponseObject.newOkResponse();
             responseObject.setData(resultList);
 
             return responseObject;
+
         } catch (Exception e) {
             return ResponseObject.newErrResponse("创建失败:" + e.getMessage());
         }

+ 59 - 35
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/controller/ivtOrderController.java

@@ -604,28 +604,29 @@ public class ivtOrderController {
      */
     @Mapping(value = "com.awspaas.user.apps.donenow_ivt.createPurchaseOrder")
     public ResponseObject createPurchaseOrder(UserContext uc, String costIds) throws SQLException {
-
         Connection conn = null;
         try {
             conn = DBSql.open();
             conn.setAutoCommit(false);
+            System.out.println("接收到的costIds参数: " + costIds);
+
             String[] costIdArr = costIds.split(",");
             String sql = "SELECT * FROM BO_EU_DNCTT_CONTRACT_COST WHERE ID IN(";
-            for (int i = 0; costIdArr.length > i; i++) {
+            for (int i = 0; i < costIdArr.length; i++) {
                 sql += "?,";
             }
             sql = sql.substring(0, sql.length() - 1) + ")";
             List<RowMap> costList = DBSql.getMaps(sql, Arrays.stream(costIdArr).toArray());
+            System.out.println("查询到的合同成本数据条数: " + costList.size());
 
+            BO purchaseOrder = new BO();
+            purchaseOrder.set("SUBMIT_TIME", getCurrentDateTime());
+            purchaseOrder.set("SUBMITTED_RESOURCE_ID", uc.getUID());
 
-            BO purchaseOrder = new BO();//采购单
-
-            purchaseOrder.set("SUBMIT_TIME", getCurrentDateTime());//提交时间
-            purchaseOrder.set("SUBMITTED_RESOURCE_ID", uc.getUID());//提交人
+            Set<String> PURCHASE_ACCOUNT_ID = new HashSet<>();
+            Set<String> VENDOR_ACCOUNT_ID = new HashSet<>();
+            int validCount = 0;
 
-            Set<String> PURCHASE_ACCOUNT_ID = new HashSet<>();   //采购客户
-            Set<String> VENDOR_ACCOUNT_ID = new HashSet<>();  //   供应商
-            int i = 0;
             for (RowMap cost : costList) {
                 String account_id = cost.getString("ACCOUNT_ID");
                 if (StringUtils.isNotBlank(account_id)) {
@@ -637,72 +638,91 @@ public class ivtOrderController {
                         PURCHASE_ACCOUNT_ID.add(account_id);
                     }
                 }
+                System.out.println("处理的account_id: " + account_id);
 
                 String PRODUCT_ID = cost.getString("PRODUCT_ID");
                 String vendor_id = DBSql.getString("select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_PRODUCT_VENDOR where PRODUCT_ID=? or BINDID in (select BINDID FROM BO_EU_DNIVT_PRODUCT WHERE ID=?)", new Object[]{PRODUCT_ID, PRODUCT_ID});
-
                 if (StringUtils.isNotBlank(vendor_id)) {
                     VENDOR_ACCOUNT_ID.add(vendor_id);
                 }
+                System.out.println("处理的vendor_id: " + vendor_id);
 
-                //采购数量需要扣除拣货数量
                 int purchase_quantity = cost.getInt("QUANTITY") - DBSql.getInt("select sum(QUANTITY) AS QU from BO_EU_DNCTT_CONTRACT_COST_PRODUCT where CONTRACT_COST_ID=? and CLOSED=0", new Object[]{cost.getString("ID")});
-                if (purchase_quantity <= 0)
+                if (purchase_quantity <= 0) {
+                    System.out.println("采购数量<=0,跳过该记录,ID: " + cost.getString("ID"));
                     continue;
-
+                }
                 cost.put("PURCHASE_QUANTITY", purchase_quantity);
-                i++;
+                validCount++;
             }
 
-            if (i < 1)
+            if (validCount < 1) {
+                System.out.println("没有可处理的采购订单记录");
                 return ResponseObject.newErrResponse("没有可处理的采购订单");
+            }
 
-            ProcessInstance processInstance = SDK.getProcessAPI().createProcessInstance("obj_795cb3601f3a4b919b5896cf5b076a3a", uc.getUID(), "采购订单");
+            ProcessInstance processInstance;
+            try {
+                processInstance = SDK.getProcessAPI().createProcessInstance("obj_795cb3601f3a4b919b5896cf5b076a3a", uc.getUID(), "采购订单");
+                System.out.println("流程实例创建成功,ID: " + processInstance.getId());
+            } catch (Exception e) {
+                System.err.println("流程实例创建失败: " + e.getMessage());
+                throw new RuntimeException("流程实例创建失败", e);
+            }
             purchaseOrder.setBindId(processInstance.getId());
-            if (PURCHASE_ACCOUNT_ID.size() == 1)
+
+            if (PURCHASE_ACCOUNT_ID.size() == 1) {
                 purchaseOrder.set("PURCHASE_ACCOUNT_ID", PURCHASE_ACCOUNT_ID.stream().findFirst().get());
-            if (VENDOR_ACCOUNT_ID.size() == 1)
+            }
+            if (VENDOR_ACCOUNT_ID.size() == 1) {
                 purchaseOrder.set("VENDOR_ACCOUNT_ID", VENDOR_ACCOUNT_ID.stream().findFirst().get());
+            }
 
             SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER", purchaseOrder, uc, conn);
-            //采购产品
+            System.out.println("采购单创建成功,ID: " + purchaseOrder.getId());
+
             for (RowMap cost : costList) {
                 BO purchaseOrderProduct = new BO();
                 purchaseOrderProduct.setBindId(processInstance.getId());
 
-    
                 purchaseOrderProduct.set("PURCHASE_ACCOUNT_ID", cost.getString("ACCOUNT_ID"));
                 purchaseOrderProduct.set("NAME", cost.getString("NAME"));
                 purchaseOrderProduct.set("PRODUCT_ID", cost.getString("PRODUCT_ID"));
                 purchaseOrderProduct.set("QUANTITY", cost.getString("PURCHASE_QUANTITY"));
                 purchaseOrderProduct.set("UNIT_COST", cost.getString("UNIT_COST"));
                 purchaseOrderProduct.set("TAX_CATEGORY_ID", cost.getString("TAX_CATEGORY_ID"));
-                purchaseOrderProduct.set("WAREHOUSE_ID", DBSql.getString("SELECT ID FROM bo_eu_dnivt_warehouse WHERE CATE_ID=2 AND ORGID=? ", new Object[]{uc.getCompanyModel().getId()}));//采购仓库 固定仓库
+
+                String warehouseId = DBSql.getString("SELECT ID FROM bo_eu_dnivt_warehouse WHERE CATE_ID=2 AND ORGID=? ", new Object[]{uc.getCompanyModel().getId()});
+                if (warehouseId == null) {
+                    System.err.println("未查询到符合条件的仓库");
+                    throw new RuntimeException("未查询到符合条件的仓库");
+                }
+                purchaseOrderProduct.set("WAREHOUSE_ID", warehouseId);
+
                 purchaseOrderProduct.set("NOTE", cost.getString("DESCRIPTION"));
-                // purchaseOrderProduct.set("UNIT_COST_ADD_TAX", cost.getString(""));//含税价
                 purchaseOrderProduct.set("COST_TOTAL", cost.getString("EXTENDED_COST"));
                 purchaseOrderProduct.set("CONTRACT_ID", cost.getString("CONTRACT_ID"));
                 purchaseOrderProduct.set("PROJECT_ID", cost.getString("PROJECT_ID"));
                 purchaseOrderProduct.set("TASK_ID", cost.getString("TASK_ID"));
                 purchaseOrderProduct.set("CONTRACT_COST_ID", cost.getString("ID"));
                 purchaseOrderProduct.set("CONTRACT_SERVICE_ID", cost.getString("SERVICE_ID"));
-                
                 purchaseOrderProduct.set("ORDER_ID", purchaseOrder.getId());
-                SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER_PRODUCT", purchaseOrderProduct, uc, conn);  //采购项
 
+                SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER_PRODUCT", purchaseOrderProduct, uc, conn);
+                System.out.println("采购项创建成功,关联采购单ID: " + purchaseOrder.getId());
 
-                //更新采购订单号
                 String PURCHASE_ORDER_NO = DBSql.getString("SELECT GROUP_CONCAT(PURCHASE_ORDER_NO) FROM " + IVTConstant.BO_EU_DNIVT_ORDER + " WHERE CLOSED=0 AND ID IN (SELECT ORDER_ID FROM BO_EU_DNIVT_ORDER_PRODUCT WHERE CONTRACT_COST_ID=?) ", new Object[]{cost.getString("ID")});
-
                 DBSql.update(conn, "UPDATE BO_EU_DNCTT_CONTRACT_COST SET PURCHASE_ORDER_NO=? WHERE ID=?", new Object[]{PURCHASE_ORDER_NO, cost.getString("ID")});
             }
 
-
-            //启动流程:查询该次操作产生的活动任务
             List<TaskInstance> taskInstances = SDK.getProcessAPI().start(processInstance).fetchActiveTasks();
-
+            System.out.println("流程启动成功,活动任务数: " + taskInstances.size());
             conn.commit();
 
+            if (taskInstances.isEmpty()) {
+                System.err.println("未查询到活动任务");
+                throw new RuntimeException("未查询到活动任务");
+            }
             TaskInstance taskInstance = taskInstances.get(0);
 
             String processUrl = SDK.getFormAPI().getFormURL(SDK.getPortalAPI().getPortalUrl(), uc.getSessionId(), processInstance.getId(), taskInstance.getId(), taskInstance.getState(), null, null, null, true);
@@ -711,17 +731,21 @@ public class ivtOrderController {
             responseObject.setData(processUrl);
             return responseObject;
         } catch (Exception e) {
-            conn.rollback();
+            System.err.println("创建采购订单异常: " + e.getMessage());
+            e.printStackTrace();
+            if (conn != null) {
+                try {
+                    conn.rollback();
+                } catch (SQLException ex) {
+                    System.err.println("事务回滚异常: " + ex.getMessage());
+                }
+            }
+            return ResponseObject.newErrResponse("创建采购订单失败,原因: " + e.getMessage());
         } finally {
             DBSql.close(conn);
         }
-
-        return ResponseObject.newErrResponse("创建采购订单失败");
     }
 
-    /*
-     * 获取当前时间
-     */
     private static String getCurrentDateTime() {
         String DATE_TIME_FORMAT = "yyyy-MM-dd HH:mm:ss";
         SimpleDateFormat sdf = new SimpleDateFormat(DATE_TIME_FORMAT);

+ 19 - 1
com.awspaas.user.apps.donenow_ivt/src/com/awspaas/user/apps/donenow_ivt/event/ivtOrderProcessAfterComplete.java

@@ -243,21 +243,39 @@ public class ivtOrderProcessAfterComplete extends ExecuteListener {
 
 
     private void createPaymentPlan(UserContext uc, String orderId, String planDate, Double planAmount) throws Exception {
+        // 1. 原有参数校验(保持不变)
         if (StringUtils.isBlank(orderId) || StringUtils.isBlank(planDate) || planAmount == null) {
-            throw new Exception("创建付款计划参数不完整");
+            throw new Exception("创建付款计划参数不完整:orderId=" + orderId + ",planDate=" + planDate + ",planAmount=" + planAmount);
         }
 
+        // 2. 新增:通过orderId查询订单表,获取VENDOR_ACCOUNT_ID(遵循当前类SQL风格)
+        String queryVendorSql = "select VENDOR_ACCOUNT_ID from BO_EU_DNIVT_ORDER where id = ?";
+        String vendorAccountId = DBSql.getString(queryVendorSql, new Object[]{orderId});
+        // 处理查询结果(空值/无数据时抛异常,与现有异常风格一致)
+        if (StringUtils.isBlank(vendorAccountId)) {
+            throw new Exception("创建付款计划失败:订单不存在或VENDOR_ACCOUNT_ID为空,orderId=" + orderId);
+        }
+        System.out.println("==== 查询订单表成功,VENDOR_ACCOUNT_ID=" + vendorAccountId + " ====");
+
+        // 3. 原有流程实例创建(保持不变)
         ProcessInstance processInstance = SDK.getProcessAPI()
                 .createProcessInstance("obj_5cb4ae4a42944fd0a9a284ff4c64c65d",
                         uc.getUID(),
                         "付款计划");
+        System.out.println("==== 付款计划流程实例创建成功,bindId=" + processInstance.getId() + " ====");
 
+        // 4. 构建BO对象(新增:设置ACCOUNT_PAYEE=查询到的VENDOR_ACCOUNT_ID)
         BO bo = new BO();
         bo.setBindId(processInstance.getId());
         bo.set("ORDER_ID", orderId);
         bo.set("PLAN_DATE", planDate);
         bo.set("PLAN_AMOUNT", planAmount);
+        bo.set("ACCOUNT_PAYEE", vendorAccountId); // 关键新增:赋值ACCOUNT_PAYEE
+        System.out.println("==== BO对象构建完成,ACCOUNT_PAYEE=" + vendorAccountId + " ====");
+
+        // 5. 原有业务数据创建(保持不变)
         SDK.getBOAPI().createDataBO("BO_EU_DNIVT_ORDER_PAYMENT_PLAN", bo, uc);
+        System.out.println("==== 付款计划数据创建成功,orderId=" + orderId + " ====");
     }