From 7bb93abc4789a038b1c1e1e7d18b484ddc7097fd Mon Sep 17 00:00:00 2001 From: aike <17730485278@139.com> Date: Thu, 17 Apr 2025 14:07:52 +0800 Subject: [PATCH] =?UTF-8?q?demand:=201.=E6=96=B0=E5=A2=9E=E6=9C=88?= =?UTF-8?q?=E7=BB=93=E5=AE=A2=E6=88=B7=E4=B8=B4=E6=97=B6=E9=A2=9D=E5=BA=A6?= =?UTF-8?q?=E6=93=8D=E4=BD=9C=E7=95=8C=E9=9D=A2=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E5=A2=9E=E5=88=A0=E6=94=B9=E6=9F=A5=E6=93=8D=20=20=20=20=20=20?= =?UTF-8?q?=20=20=E4=BD=9C=EF=BC=8C=E6=9C=88=E7=BB=93=E5=AE=A2=E6=88=B7?= =?UTF-8?q?=E9=A2=9D=E5=BA=A6=E6=93=8D=E4=BD=9C=E7=95=8C=E9=9D=A2=E6=9F=A5?= =?UTF-8?q?=E8=AF=A2=E8=BF=94=E5=9B=9E=E5=A2=9E=E5=8A=A0=E4=B8=B4=E6=97=B6?= =?UTF-8?q?=E9=A2=9D=E5=BA=A6=20=20=20=20=20=20=20=20=202.=E8=BF=90?= =?UTF-8?q?=E5=8D=95=E5=BD=95=E5=85=A5=E3=80=81=E8=BF=90=E5=8D=95=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E7=AD=89=E7=95=8C=E9=9D=A2=E9=94=80=E5=94=AE=E9=A2=9D?= =?UTF-8?q?=E5=BA=A6=E8=AE=A1=E7=AE=97=E9=80=BB=E8=BE=91=E9=80=82=E5=BA=94?= =?UTF-8?q?=E4=B8=B4=E6=97=B6=E9=A2=9D=E5=BA=A6=E8=B0=83=E6=95=B4=20commit?= =?UTF-8?q?ter:=20heyu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../EmisTempCreditCustomerController.java | 77 ++++++ .../erp/emis/domain/EmisCreditCustomer.java | 2 + .../emis/domain/EmisTempCreditCustomer.java | 44 ++++ .../emis/domain/EmisTempCreditSalesmen.java | 3 - .../emis/mapper/EmisCreditCustomerMapper.java | 8 + .../mapper/EmisTempCreditCustomerMapper.java | 59 +++++ .../erp/emis/service/EmisBaseService.java | 96 +++++++- .../IEmisTempCreditCustomerService.java | 47 ++++ .../impl/EmisCreditCustomerServiceImpl.java | 27 ++- .../impl/EmisCreditSalesmenServiceImpl.java | 43 +--- .../EmisTempCreditCustomerServiceImpl.java | 220 ++++++++++++++++++ .../mapper/EmisCreditCustomerMapper.xml | 17 ++ .../mapper/EmisTempCreditCustomerMapper.xml | 108 +++++++++ .../mapper/EmisTempCreditSalesmenMapper.xml | 1 - 14 files changed, 695 insertions(+), 57 deletions(-) create mode 100644 emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTempCreditCustomerController.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditCustomer.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTempCreditCustomerMapper.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTempCreditCustomerService.java create mode 100644 emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTempCreditCustomerServiceImpl.java create mode 100644 emis-biz/src/main/resources/mapper/EmisTempCreditCustomerMapper.xml diff --git a/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTempCreditCustomerController.java b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTempCreditCustomerController.java new file mode 100644 index 000000000..79f2e128b --- /dev/null +++ b/emis-biz-web/src/main/java/com/xdadan/erp/web/emis/EmisTempCreditCustomerController.java @@ -0,0 +1,77 @@ +package com.xdadan.erp.web.emis; + +import java.util.List; + +import com.xdadan.erp.common.annotation.Log; +import com.xdadan.erp.common.core.controller.BaseController; +import com.xdadan.erp.common.core.domain.AjaxResult; +import com.xdadan.erp.common.core.page.TableDataInfo; +import com.xdadan.erp.common.enums.BusinessType; +import com.xdadan.erp.emis.domain.EmisTempCreditCustomer; +import com.xdadan.erp.emis.service.IEmisTempCreditCustomerService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +/** + * 客户临时额度Controller + * + * @author heyu + */ +@RestController +@RequestMapping("/emis/emisTempCreditCustomer") +public class EmisTempCreditCustomerController extends BaseController { + + @Autowired + private IEmisTempCreditCustomerService emisTempCreditCustomerService; + + /** + * 查询客户临时额度列表 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTempCreditCustomer:list')") + @GetMapping("/list") + public TableDataInfo list(EmisTempCreditCustomer emisTempCreditCustomer) { + startPage(); + List list = emisTempCreditCustomerService + .selectEmisTempCreditCustomerList(emisTempCreditCustomer); + return getDataTable(list); + } + + /** + * 新增客户临时额度 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTempCreditCustomer:add')") + @Log(title = "客户临时额度", businessType = BusinessType.INSERT) + @PostMapping + public AjaxResult add(@RequestBody EmisTempCreditCustomer emisTempCreditCustomer) { + try { + return toAjax(emisTempCreditCustomerService.insertEmisTempCreditCustomer(emisTempCreditCustomer)); + } catch (Exception e) { + return error(e.getMessage()); + } + } + + /** + * 修改客户临时额度 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTempCreditCustomer:edit')") + @Log(title = "客户临时额度", businessType = BusinessType.UPDATE) + @PutMapping + public AjaxResult edit(@RequestBody EmisTempCreditCustomer emisTempCreditCustomer) { + try { + return toAjax(emisTempCreditCustomerService.updateEmisTempCreditCustomer(emisTempCreditCustomer)); + } catch (Exception e) { + return error(e.getMessage()); + } + } + + /** + * 删除客户临时额度 + */ + @PreAuthorize("@ss.hasPermi('emis:emisTempCreditCustomer:remove')") + @Log(title = "客户临时额度", businessType = BusinessType.DELETE) + @DeleteMapping("/{ids}") + public AjaxResult remove(@PathVariable Long[] ids) { + return toAjax(emisTempCreditCustomerService.deleteEmisTempCreditCustomerByIds(ids)); + } +} \ No newline at end of file diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisCreditCustomer.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisCreditCustomer.java index 5f10afb66..48ed37506 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisCreditCustomer.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisCreditCustomer.java @@ -65,4 +65,6 @@ public class EmisCreditCustomer extends BaseEntity private String payee; private String salesmen; + /** 临时额度总额 */ + private BigDecimal tempCreditMoney; } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditCustomer.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditCustomer.java new file mode 100644 index 000000000..6c57107d1 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditCustomer.java @@ -0,0 +1,44 @@ +package com.xdadan.erp.emis.domain; + +import com.xdadan.erp.common.annotation.Excel; +import com.xdadan.erp.common.core.domain.BaseEntity; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.math.BigDecimal; +import java.util.Date; + +/** + * 客户临时额度对象 + * + * @author heyu + */ +@Data +@EqualsAndHashCode(callSuper = true) +public class EmisTempCreditCustomer extends BaseEntity { + private static final long serialVersionUID = 1L; + + /** ID */ + private Long id; + + /** 客户编码 */ + private String accCode; + + /** 月结客户名称 */ + private String customerName; + + /** 临时额度调整 */ + private BigDecimal tempCreditMoneyAdjust; + + /** 运输方式 **/ + private String transType; + + /** 开始日期 */ + @Excel(name = "开始日期", dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date startDate; + + /** 结束日期 */ + @Excel(name = "结束日期", dateFormat = "yyyy-MM-dd HH:mm:ss") + private Date endDate; + +} \ No newline at end of file diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditSalesmen.java b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditSalesmen.java index d36c1b7e5..95440d504 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditSalesmen.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/domain/EmisTempCreditSalesmen.java @@ -31,9 +31,6 @@ public class EmisTempCreditSalesmen extends BaseEntity { /** 运输方式 **/ private String transType; - /** 临时额度总额 */ - private BigDecimal tempCreditMoney; - /** 开始日期 */ @Excel(name = "开始日期", width = 30, dateFormat = "yyyy-MM-dd HH:mm:ss") private Date startDate; diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisCreditCustomerMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisCreditCustomerMapper.java index 957dbbb40..c6b58d92f 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisCreditCustomerMapper.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisCreditCustomerMapper.java @@ -99,4 +99,12 @@ public interface EmisCreditCustomerMapper extends BaseMapper * @return 结果 */ public int deleteEmisCreditCustomerByIds(Long[] ids); + + /** + * 根据条件查询客户信用额度信息 + * + * @param emisCreditCustomer 客户信用额度 + * @return 客户信用额度 + */ + EmisCreditCustomer selectCreditCustomerInfo(EmisCreditCustomer emisCreditCustomer); } diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTempCreditCustomerMapper.java b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTempCreditCustomerMapper.java new file mode 100644 index 000000000..bfa27f141 --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/mapper/EmisTempCreditCustomerMapper.java @@ -0,0 +1,59 @@ +package com.xdadan.erp.emis.mapper; + +import com.xdadan.erp.emis.domain.EmisTempCreditCustomer; +import java.util.List; + +/** + * 客户临时额度Mapper接口 + * + * @author heyu + */ +public interface EmisTempCreditCustomerMapper { + /** + * 查询客户临时额度 + * + * @param id 客户临时额度主键 + * @return 客户临时额度 + */ + EmisTempCreditCustomer selectEmisTempCreditCustomerById(Long id); + + /** + * 查询客户临时额度列表 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 客户临时额度集合 + */ + List selectEmisTempCreditCustomerList(EmisTempCreditCustomer emisTempCreditCustomer); + + /** + * 新增客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + int insertEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer); + + /** + * 修改客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + int updateEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer); + + /** + * 删除客户临时额度 + * + * @param id 客户临时额度主键 + * @return 结果 + */ + int deleteEmisTempCreditCustomerById(Long id); + + /** + * 批量删除客户临时额度 + * + * @param ids 需要删除的数据主键集合 + * @return 结果 + */ + int deleteEmisTempCreditCustomerByIds(Long[] ids); +} \ No newline at end of file diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java index 909da88f6..445c5684e 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/EmisBaseService.java @@ -154,6 +154,12 @@ public class EmisBaseService { @Autowired private EmisTmsCostFeeMapper emisTmsCostFeeMapper; + @Autowired + private EmisTempCreditSalesmenMapper emisTempCreditSalesmenMapper; + + @Autowired + private EmisTempCreditCustomerMapper emisTempCreditCustomerMapper; + private static SysUser emptySysUser = new SysUser(); static { @@ -256,7 +262,7 @@ public class EmisBaseService { if("2".equals(newSettleType)){ EmisCreditCustomer creditCustomer = getEmisCreditCustomerByCond(newBill.getCustNo(),newBill.getSendDate(),newBill.getCarryType()); if(creditCustomer!=null) { - BigDecimal preBalance = creditCustomer.getCreditMoney().subtract(creditCustomer.getUseMoney()); + BigDecimal preBalance = calculateCustomerTempCreditMoney(creditCustomer).subtract(creditCustomer.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -267,7 +273,7 @@ public class EmisBaseService { // bug:1415 统计数据由销售联系人更改为回款联系人 EmisCreditSalesmen creditSalesmen = getEmisCreditSalesmenByCond(newBill.getPayee(),newBill.getSendDate(),newBill.getCarryType()); if(creditSalesmen!=null) { - BigDecimal preBalance = creditSalesmen.getCreditMoney().subtract(creditSalesmen.getUseMoney()); + BigDecimal preBalance = calculateSalesmenTempCreditMoney(creditSalesmen).subtract(creditSalesmen.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -282,7 +288,7 @@ public class EmisBaseService { if("2".equals(newSettleType)){ EmisCreditCustomer creditCustomer = getEmisCreditCustomerByCond(newBill.getCustNo(),newBill.getSendDate(),newBill.getCarryType()); if(creditCustomer!=null) { - BigDecimal preBalance = creditCustomer.getCreditMoney().subtract(creditCustomer.getUseMoney()); + BigDecimal preBalance = calculateCustomerTempCreditMoney(creditCustomer).subtract(creditCustomer.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -293,7 +299,7 @@ public class EmisBaseService { // bug:1415 统计数据由销售联系人更改为回款联系人 EmisCreditSalesmen creditSalesmen = getEmisCreditSalesmenByCond(newBill.getPayee(),newBill.getSendDate(),newBill.getCarryType()); if(creditSalesmen!=null) { - BigDecimal preBalance = creditSalesmen.getCreditMoney().subtract(creditSalesmen.getUseMoney()); + BigDecimal preBalance = calculateSalesmenTempCreditMoney(creditSalesmen).subtract(creditSalesmen.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -313,7 +319,7 @@ public class EmisBaseService { if("2".equals(newSettleType)){ EmisCreditCustomer creditCustomer = getEmisCreditCustomerByCond(newBill.getCustNo(),newBill.getSendDate(),newBill.getCarryType()); if(creditCustomer!=null) { - BigDecimal preBalance = creditCustomer.getCreditMoney().subtract(creditCustomer.getUseMoney()); + BigDecimal preBalance = calculateCustomerTempCreditMoney(creditCustomer).subtract(creditCustomer.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -324,7 +330,7 @@ public class EmisBaseService { // bug:1415 统计数据由销售联系人更改为回款联系人 EmisCreditSalesmen creditSalesmen = getEmisCreditSalesmenByCond(newBill.getPayee(),newBill.getSendDate(),newBill.getCarryType()); if(creditSalesmen!=null) { - BigDecimal preBalance = creditSalesmen.getCreditMoney().subtract(creditSalesmen.getUseMoney()); + BigDecimal preBalance = calculateSalesmenTempCreditMoney(creditSalesmen).subtract(creditSalesmen.getUseMoney()); if (changeMoney.compareTo(preBalance) > 0) { // 提示异常 throw new EmisBizError(EmisBizErrorType.FAIL, "超出信用额度"); @@ -336,6 +342,84 @@ public class EmisBaseService { } } + /** + * 计算并返回销售临时额度总额 + * tempCreditMoney = creditMoney + tempCreditMoneyAdjust + * tempCreditMoneyAdjust取自emis_temp_credit_salesmen,有多条时取当前时间在范围内的一条,没有则为0 + * + * @param creditSalesmen 销售信用额度记录 + * @return 临时额度总额 + */ + public BigDecimal calculateSalesmenTempCreditMoney(EmisCreditSalesmen creditSalesmen) { + log.debug("开始计算客户[{}]的临时额度总额", creditSalesmen.getAccCode()); + + // 获取基础信用额度 + BigDecimal baseCreditMoney = creditSalesmen.getCreditMoney() != null ? creditSalesmen.getCreditMoney() + : BigDecimal.ZERO; + + // 查询当前有效的临时额度调整 + EmisTempCreditSalesmen tempQuery = new EmisTempCreditSalesmen(); + tempQuery.setAccCode(creditSalesmen.getAccCode()); + List tempList = emisTempCreditSalesmenMapper + .selectEmisTempCreditSalesmenList(tempQuery); + + BigDecimal tempAdjust = BigDecimal.ZERO; + Date now = new Date(); + + for (EmisTempCreditSalesmen temp : tempList) { + if (temp.getStartDate() != null && temp.getEndDate() != null + && now.after(temp.getStartDate()) && now.before(temp.getEndDate())) { + tempAdjust = temp.getTempCreditMoneyAdjust() != null ? temp.getTempCreditMoneyAdjust() + : BigDecimal.ZERO; + break; + } + } + + BigDecimal totalCreditMoney = baseCreditMoney.add(tempAdjust); + log.debug("客户[{}]的临时额度总额计算完成: 基础额度[{}] + 临时调整[{}] = 总额[{}]", + creditSalesmen.getAccCode(), baseCreditMoney, tempAdjust, totalCreditMoney); + return totalCreditMoney; + } + + /** + * 计算并返回客户临时额度总额 + * + * tempCreditMoney = creditMoney + tempCreditMoneyAdjust + * tempCreditMoneyAdjust取自emis_temp_credit_customer,有多条时取当前时间在范围内的一条,没有则为0 + * + * @param creditCustomer 客户信用额度记录 + */ + public BigDecimal calculateCustomerTempCreditMoney(EmisCreditCustomer creditCustomer) { + log.debug("开始计算客户[{}]的临时额度总额", creditCustomer.getAccCode()); + + // 获取基础信用额度 + BigDecimal baseCreditMoney = creditCustomer.getCreditMoney() != null ? creditCustomer.getCreditMoney() + : BigDecimal.ZERO; + + // 查询当前有效的临时额度调整 + EmisTempCreditCustomer tempQuery = new EmisTempCreditCustomer(); + tempQuery.setAccCode(creditCustomer.getAccCode()); + List tempList = emisTempCreditCustomerMapper + .selectEmisTempCreditCustomerList(tempQuery); + + BigDecimal tempAdjust = BigDecimal.ZERO; + Date now = new Date(); + + for (EmisTempCreditCustomer temp : tempList) { + if (temp.getStartDate() != null && temp.getEndDate() != null + && !now.before(temp.getStartDate()) && now.before(temp.getEndDate())) { + tempAdjust = temp.getTempCreditMoneyAdjust() != null ? temp.getTempCreditMoneyAdjust() + : BigDecimal.ZERO; + break; + } + } + + BigDecimal totalCreditMoney = baseCreditMoney.add(tempAdjust); + log.debug("客户[{}]的临时额度总额计算完成: 基础额度[{}] + 临时调整[{}] = 总额[{}]", + creditCustomer.getAccCode(), baseCreditMoney, tempAdjust, totalCreditMoney); + return totalCreditMoney; + } + /** * * 重新计算使用信用额度 diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTempCreditCustomerService.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTempCreditCustomerService.java new file mode 100644 index 000000000..e76edbe9f --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/IEmisTempCreditCustomerService.java @@ -0,0 +1,47 @@ +package com.xdadan.erp.emis.service; + +import com.xdadan.erp.emis.domain.EmisTempCreditCustomer; +import com.xdadan.erp.emis.domain.exception.EmisBizError; + +import java.util.List; + +/** + * 客户临时额度Service接口 + * + * @author heyu + */ +public interface IEmisTempCreditCustomerService { + + /** + * 查询客户临时额度列表 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 客户临时额度集合 + */ + List selectEmisTempCreditCustomerList(EmisTempCreditCustomer emisTempCreditCustomer); + + /** + * 新增客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + int insertEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer) throws EmisBizError; + + /** + * 修改客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + int updateEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer) throws EmisBizError; + + /** + * 批量删除客户临时额度 + * + * @param ids 需要删除的客户临时额度主键集合 + * @return 结果 + */ + int deleteEmisTempCreditCustomerByIds(Long[] ids); + +} \ No newline at end of file diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditCustomerServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditCustomerServiceImpl.java index d9addfe85..471b5ec22 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditCustomerServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditCustomerServiceImpl.java @@ -1,4 +1,4 @@ - /** +/** * @Project: emis * @Title: EmisCreditCustomerServiceImpl.java * @author linfso @@ -11,13 +11,18 @@ package com.xdadan.erp.emis.service.impl; import java.math.BigDecimal; +import java.util.Date; import java.util.List; import java.util.Map; import cn.hutool.core.collection.CollectionUtil; -import com.xdadan.erp.emis.domain.EmisQuotePrice; +import com.alibaba.fastjson.JSON; +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.xdadan.erp.emis.domain.EmisTempCreditCustomer; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.mapper.EmisTempCreditCustomerMapper; +import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.utils.WaybillHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -34,8 +39,8 @@ import com.xdadan.erp.emis.service.IEmisCreditCustomerService; */ @Slf4j @Service -public class EmisCreditCustomerServiceImpl implements IEmisCreditCustomerService -{ +public class EmisCreditCustomerServiceImpl extends EmisBaseService + implements IEmisCreditCustomerService { @Autowired private EmisCreditCustomerMapper emisCreditCustomerMapper; @@ -59,9 +64,17 @@ public class EmisCreditCustomerServiceImpl implements IEmisCreditCustomerService * @return 客户信用额度表 */ @Override - public List selectEmisCreditCustomerList(EmisCreditCustomer emisCreditCustomer) - { - return emisCreditCustomerMapper.selectEmisCreditCustomerList(emisCreditCustomer); + public List selectEmisCreditCustomerList(EmisCreditCustomer emisCreditCustomer) { + log.info("开始查询客户信用额度列表, 查询条件: {}", emisCreditCustomer); + List list = emisCreditCustomerMapper.selectEmisCreditCustomerList(emisCreditCustomer); + + // 计算每个记录的临时额度总额 + for (EmisCreditCustomer item : list) { + item.setTempCreditMoney(calculateCustomerTempCreditMoney(item)); + } + + log.info("查询到{}条客户信用额度记录", list.size()); + return list; } /** diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditSalesmenServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditSalesmenServiceImpl.java index ee9be4899..405c25850 100644 --- a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditSalesmenServiceImpl.java +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisCreditSalesmenServiceImpl.java @@ -21,6 +21,7 @@ import com.xdadan.erp.emis.domain.EmisTempCreditSalesmen; import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; import com.xdadan.erp.emis.domain.exception.EmisBizError; import com.xdadan.erp.emis.mapper.EmisTempCreditSalesmenMapper; +import com.xdadan.erp.emis.service.EmisBaseService; import com.xdadan.erp.emis.utils.WaybillHelper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; @@ -36,7 +37,7 @@ import com.xdadan.erp.emis.service.IEmisCreditSalesmenService; */ @Slf4j @Service -public class EmisCreditSalesmenServiceImpl implements IEmisCreditSalesmenService +public class EmisCreditSalesmenServiceImpl extends EmisBaseService implements IEmisCreditSalesmenService { @Autowired private EmisCreditSalesmenMapper emisCreditSalesmenMapper; @@ -68,50 +69,12 @@ public class EmisCreditSalesmenServiceImpl implements IEmisCreditSalesmenService // 计算每个记录的临时额度总额 for (EmisCreditSalesmen item : list) { - calculateAndSetTempCreditMoney(item); + item.setTempCreditMoney(calculateSalesmenTempCreditMoney(item)); } return list; } - /** - * 计算并设置临时额度总额 - * tempCreditMoney = creditMoney + tempCreditMoneyAdjust - * tempCreditMoneyAdjust取自emis_temp_credit_salesmen,有多条时取当前时间在范围内的一条,没有则为0 - * - * @param creditSalesmen 销售信用额度记录 - */ - private void calculateAndSetTempCreditMoney(EmisCreditSalesmen creditSalesmen) { - log.info("开始计算客户[{}]的临时额度总额", creditSalesmen.getAccCode()); - - // 获取基础信用额度 - BigDecimal baseCreditMoney = creditSalesmen.getCreditMoney() != null ? creditSalesmen.getCreditMoney() - : BigDecimal.ZERO; - - // 查询当前有效的临时额度调整 - EmisTempCreditSalesmen tempQuery = new EmisTempCreditSalesmen(); - tempQuery.setAccCode(creditSalesmen.getAccCode()); - List tempList = emisTempCreditSalesmenMapper - .selectEmisTempCreditSalesmenList(tempQuery); - - BigDecimal tempAdjust = BigDecimal.ZERO; - Date now = new Date(); - - for (EmisTempCreditSalesmen temp : tempList) { - if (temp.getStartDate() != null && temp.getEndDate() != null - && now.after(temp.getStartDate()) && now.before(temp.getEndDate())) { - tempAdjust = temp.getTempCreditMoneyAdjust() != null ? temp.getTempCreditMoneyAdjust() - : BigDecimal.ZERO; - break; - } - } - - BigDecimal totalCreditMoney = baseCreditMoney.add(tempAdjust); - creditSalesmen.setTempCreditMoney(totalCreditMoney); - log.info("客户[{}]的临时额度总额计算完成: 基础额度[{}] + 临时调整[{}] = 总额[{}]", - creditSalesmen.getAccCode(), baseCreditMoney, tempAdjust, totalCreditMoney); - } - /** * 检查是否重复 * @param emisCreditSalesmen diff --git a/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTempCreditCustomerServiceImpl.java b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTempCreditCustomerServiceImpl.java new file mode 100644 index 000000000..4872416ae --- /dev/null +++ b/emis-biz/src/main/java/com/xdadan/erp/emis/service/impl/EmisTempCreditCustomerServiceImpl.java @@ -0,0 +1,220 @@ +package com.xdadan.erp.emis.service.impl; + +import java.util.Calendar; +import java.util.Date; +import java.util.List; + +import com.xdadan.erp.common.utils.DateUtils; +import com.xdadan.erp.emis.domain.EmisCreditCustomer; +import com.xdadan.erp.emis.domain.enumtype.EmisBizErrorType; +import com.xdadan.erp.emis.domain.exception.EmisBizError; +import com.xdadan.erp.emis.mapper.EmisCreditCustomerMapper; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import com.xdadan.erp.emis.mapper.EmisTempCreditCustomerMapper; +import com.xdadan.erp.emis.domain.EmisTempCreditCustomer; +import com.xdadan.erp.emis.service.IEmisTempCreditCustomerService; + +/** + * 客户临时额度Service业务层处理 + * + * @author heyu + */ +@Slf4j +@Service +public class EmisTempCreditCustomerServiceImpl implements IEmisTempCreditCustomerService { + @Autowired + private EmisTempCreditCustomerMapper emisTempCreditCustomerMapper; + + @Autowired + private EmisCreditCustomerMapper emisCreditCustomerMapper; + + /** + * 查询客户临时额度列表 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 客户临时额度 + */ + @Override + public List selectEmisTempCreditCustomerList( + EmisTempCreditCustomer emisTempCreditCustomer) { + log.info("开始查询客户临时额度列表, 查询条件: {}", emisTempCreditCustomer); + List list = emisTempCreditCustomerMapper + .selectEmisTempCreditCustomerList(emisTempCreditCustomer); + log.info("查询到{}条客户临时额度记录", list.size()); + return list; + } + + /** + * 新增客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + @Override + public int insertEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer) throws EmisBizError { + log.info("开始新增客户临时额度记录: {}", emisTempCreditCustomer); + + // 获取客户信用额度信息 + EmisCreditCustomer query = new EmisCreditCustomer(); + query.setAccCode(emisTempCreditCustomer.getAccCode()); + EmisCreditCustomer creditInfo = emisCreditCustomerMapper.selectCreditCustomerInfo(query); + if (creditInfo == null) { + log.error("未找到客户[{}]对应的信用额度记录", emisTempCreditCustomer.getAccCode()); + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS, "未找到对应的客户信用额度记录"); + } + + // 校验临时额度日期范围 + validateTempCreditDateRange(emisTempCreditCustomer, creditInfo); + + // 校验临时额度时间是否有交叉 + validateTempCreditTimeOverlap(emisTempCreditCustomer); + + int rows = emisTempCreditCustomerMapper.insertEmisTempCreditCustomer(emisTempCreditCustomer); + log.info("新增客户临时额度记录成功"); + return rows; + } + + /** + * 修改客户临时额度 + * + * @param emisTempCreditCustomer 客户临时额度 + * @return 结果 + */ + @Override + public int updateEmisTempCreditCustomer(EmisTempCreditCustomer emisTempCreditCustomer) throws EmisBizError { + log.info("开始修改客户临时额度记录: {}", emisTempCreditCustomer); + + // 获取原记录 + EmisTempCreditCustomer oldRecord = emisTempCreditCustomerMapper.selectEmisTempCreditCustomerById(emisTempCreditCustomer.getId()); + if (oldRecord == null) { + log.error("未找到ID为[{}]的客户临时额度记录", emisTempCreditCustomer.getId()); + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS, "未找到对应的客户临时额度记录"); + } + + // 获取客户信用额度信息 + EmisCreditCustomer query = new EmisCreditCustomer(); + query.setAccCode(oldRecord.getAccCode()); + EmisCreditCustomer creditInfo = emisCreditCustomerMapper.selectCreditCustomerInfo(query); + if (creditInfo == null) { + log.error("未找到客户[{}]对应的信用额度记录", oldRecord.getAccCode()); + throw new EmisBizError(EmisBizErrorType.NOT_EXISTS, "未找到对应的客户信用额度记录"); + } + + // 校验临时额度日期范围 + validateTempCreditDateRange(emisTempCreditCustomer, creditInfo); + + // 校验临时额度时间是否有交叉 + validateTempCreditTimeOverlap(emisTempCreditCustomer); + + int rows = emisTempCreditCustomerMapper.updateEmisTempCreditCustomer(emisTempCreditCustomer); + log.info("修改客户临时额度记录成功"); + return rows; + } + + /** + * 批量删除客户临时额度 + * + * @param ids 需要删除的客户临时额度主键 + * @return 结果 + */ + @Override + public int deleteEmisTempCreditCustomerByIds(Long[] ids) { + log.info("开始批量删除客户临时额度记录, ids: {}", ids); + int rows = emisTempCreditCustomerMapper.deleteEmisTempCreditCustomerByIds(ids); + log.info("批量删除客户临时额度记录成功, 删除{}条记录", rows); + return rows; + } + + /** + * 校验临时额度日期范围是否在客户信用额度日期范围内 + * + * @param tempCredit 临时额度信息 + * @param creditInfo 客户信用额度信息 + */ + private void validateTempCreditDateRange(EmisTempCreditCustomer tempCredit, EmisCreditCustomer creditInfo) + throws EmisBizError { + if (tempCredit.getStartDate() == null || tempCredit.getEndDate() == null) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "临时额度的开始日期和结束日期不能为空"); + } + + // 获取当前日期(年月日) + Calendar calendar = Calendar.getInstance(); + calendar.set(Calendar.HOUR_OF_DAY, 0); + calendar.set(Calendar.MINUTE, 0); + calendar.set(Calendar.SECOND, 0); + calendar.set(Calendar.MILLISECOND, 0); + Date currentDate = calendar.getTime(); + + // 校验开始日期不能早于当前日期 + if (tempCredit.getStartDate().before(currentDate)) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "临时额度的开始日期不能早于当前日期"); + } + + if (tempCredit.getStartDate().after(tempCredit.getEndDate())) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "临时额度的开始日期不能晚于结束日期"); + } + + if (creditInfo.getStartDate() != null && tempCredit.getStartDate().before(creditInfo.getStartDate())) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "临时额度的开始日期不能早于客户信用额度的开始日期"); + } + + if (creditInfo.getEndDate() != null && tempCredit.getEndDate().after(creditInfo.getEndDate())) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, "临时额度的结束日期不能晚于客户信用额度的结束日期"); + } + } + + /** + * 校验临时额度时间是否有交叉 + * 同一个acc_code对应的多个start_date、end_date不能有交叉 + * + * @param tempCredit 临时额度信息 + */ + private void validateTempCreditTimeOverlap(EmisTempCreditCustomer tempCredit) throws EmisBizError { + log.info("开始校验客户[{}]的临时额度时间范围", tempCredit.getAccCode()); + + // 查询该客户的所有临时额度记录 + EmisTempCreditCustomer query = new EmisTempCreditCustomer(); + query.setAccCode(tempCredit.getAccCode()); + List existingCredits = selectEmisTempCreditCustomerList(query); + + // 检查新记录的时间范围是否与现有记录有交叉 + for (EmisTempCreditCustomer credit : existingCredits) { + if (credit.getId() != null && credit.getId().equals(tempCredit.getId())) { + continue; // 跳过当前正在修改的记录 + } + + // 检查时间范围是否有交叉 + if (isDateRangeOverlap(tempCredit.getStartDate(), tempCredit.getEndDate(), + credit.getStartDate(), credit.getEndDate())) { + throw new EmisBizError(EmisBizErrorType.PARAM_ERROR1, + String.format("临时额度时间范围与现有记录交叉: 新记录[%s-%s], 现有记录[%s-%s]", + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", tempCredit.getStartDate()), + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", tempCredit.getEndDate()), + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", credit.getStartDate()), + DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", credit.getEndDate()))); + } + } + + log.info("客户[{}]的临时额度时间范围校验通过", tempCredit.getAccCode()); + } + + /** + * 检查两个时间范围是否有交叉 + * + * @param start1 第一个时间范围的开始时间 + * @param end1 第一个时间范围的结束时间 + * @param start2 第二个时间范围的开始时间 + * @param end2 第二个时间范围的结束时间 + * @return true表示有交叉,false表示无交叉 + */ + private boolean isDateRangeOverlap(Date start1, Date end1, Date start2, Date end2) { + if (start1 == null || end1 == null || start2 == null || end2 == null) { + return false; + } + + // 检查是否有交叉 + return !(end1.before(start2) || start1.after(end2)); + } +} \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisCreditCustomerMapper.xml b/emis-biz/src/main/resources/mapper/EmisCreditCustomerMapper.xml index bb5616076..db067a87d 100644 --- a/emis-biz/src/main/resources/mapper/EmisCreditCustomerMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisCreditCustomerMapper.xml @@ -229,4 +229,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" #{id} + + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTempCreditCustomerMapper.xml b/emis-biz/src/main/resources/mapper/EmisTempCreditCustomerMapper.xml new file mode 100644 index 000000000..e6db327e7 --- /dev/null +++ b/emis-biz/src/main/resources/mapper/EmisTempCreditCustomerMapper.xml @@ -0,0 +1,108 @@ + + + + + + + + + + + + + + + select t.id, t.acc_code, t.temp_credit_money_adjust, t.start_date, t.end_date, + t.remark, t.del_flag, t.create_by, t.create_time, t.update_by, t.update_time, + t.create_site, t.update_site, c.trans_type, d.customer_name + from emis_temp_credit_customer t + left join emis_credit_customer c on t.acc_code = c.acc_code and c.del_flag = '0' + left join emis_customer_user d on c.customer_code = d.customer_code and d.del_flag = '0' + + + + + + + + insert into emis_temp_credit_customer + + id, + acc_code, + temp_credit_money_adjust, + start_date, + end_date, + remark, + del_flag, + create_by, + create_time, + update_by, + update_time, + create_site, + update_site, + + + #{id}, + #{accCode}, + #{tempCreditMoneyAdjust}, + #{startDate}, + #{endDate}, + #{remark}, + #{delFlag}, + #{createBy}, + #{createTime}, + #{updateBy}, + #{updateTime}, + #{createSite}, + #{updateSite}, + + + + + update emis_temp_credit_customer + + acc_code = #{accCode}, + temp_credit_money_adjust = #{tempCreditMoneyAdjust}, + start_date = #{startDate}, + end_date = #{endDate}, + remark = #{remark}, + del_flag = #{delFlag}, + create_by = #{createBy}, + create_time = #{createTime}, + update_by = #{updateBy}, + update_time = #{updateTime}, + create_site = #{createSite}, + update_site = #{updateSite}, + + where id = #{id} + + + + update emis_temp_credit_customer set del_flag = '1' where id = #{id} + + + + update emis_temp_credit_customer set del_flag = '1' where id in + + #{id} + + + \ No newline at end of file diff --git a/emis-biz/src/main/resources/mapper/EmisTempCreditSalesmenMapper.xml b/emis-biz/src/main/resources/mapper/EmisTempCreditSalesmenMapper.xml index 11e84f58f..e6a3a8c02 100644 --- a/emis-biz/src/main/resources/mapper/EmisTempCreditSalesmenMapper.xml +++ b/emis-biz/src/main/resources/mapper/EmisTempCreditSalesmenMapper.xml @@ -10,7 +10,6 @@ -