diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java index c5cf4adbd..d1a07a79f 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisSettleBillServiceImpl.java @@ -1608,6 +1608,63 @@ public class EmisSettleBillServiceImpl extends EmisBaseService implements IEmisS @Override public int updateEmisSettleBill(EmisSettleBill emisSettleBill) { + // 如果修改了billMonth,需要重新计算最后回款日 + if (emisSettleBill.getId() != null && StringUtils.isNotEmpty(emisSettleBill.getBillMonth())) { + EmisSettleBill oldBill = emisSettleBillMapper.selectEmisSettleBillById(emisSettleBill.getId()); + if (oldBill != null && !emisSettleBill.getBillMonth().equals(oldBill.getBillMonth())) { + // billMonth发生变化,且是月结类型,需要重新计算最后回款日 + if ("2".equals(oldBill.getSettleType())) { + EmisCustomerUser monthUser = getCustomerUserByMonthlyPayCode(oldBill.getCustNo()); + if (monthUser != null) { + // 默认30天,从1号开始 + BigDecimal creditPeriod = BigDecimal.valueOf(30D); + Integer settleDay = 1; + + if (monthUser.getCreditPeriod() != null) { + creditPeriod = monthUser.getCreditPeriod(); + } + + if (monthUser.getSettleDay() != null) { + settleDay = monthUser.getSettleDay(); + } + + Date paymentDueDate = null; + // 周结和半月结的特殊处理 + if (creditPeriod.intValue() == 7) { +// // 获取今日零点 T+6,T为出账日 +// String currDayStr = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, new Date()); +// Date currDayDate = DateUtils.parseDate(currDayStr); +// paymentDueDate = DateUtils.addDays(currDayDate, 7); + } else if (creditPeriod.intValue() == 15) { +// String currDayStr = DateUtils.parseDateToStr(DateUtils.YYYY_MM_DD, new Date()); +// Date currDayDate = DateUtils.parseDate(currDayStr); +// paymentDueDate = DateUtils.addDays(currDayDate, 15); + } else { + Date billMonthDate = DateUtils.parseDate(emisSettleBill.getBillMonth() + "-" + settleDay); + + // credit_period 为 30/60/90 且结算日为每月 1 号时,按对应月份月末作为最后付款日 + if ((creditPeriod.intValue() == 30 || creditPeriod.intValue() == 60 || creditPeriod.intValue() == 90) + && monthUser.getSettleDay() == 1) { + Calendar cal = Calendar.getInstance(); + cal.setTime(billMonthDate); + // 30 -> 加 1 个月,60 -> 加 2 个月,90 -> 加 3 个月 + cal.add(Calendar.MONTH, creditPeriod.intValue() / 30); + // 设置为该月的最后一天 + cal.set(Calendar.DAY_OF_MONTH, cal.getActualMaximum(Calendar.DAY_OF_MONTH)); + paymentDueDate = cal.getTime(); + } else { + paymentDueDate = DateUtils.addMonths(billMonthDate, 1); + paymentDueDate = DateUtils.addDays(paymentDueDate, creditPeriod.intValue()); + } + } + + // 设置重新计算后的最后回款日 + emisSettleBill.setPaymentDueDate(paymentDueDate); + } + } + } + } + return emisSettleBillMapper.updateEmisSettleBill(emisSettleBill); }