demand: 1.新增月结客户临时额度操作界面,增加增删改查操 作,月结客户额度操作界面查询返回增加临时额度

2.运单录入、运单修改等界面销售额度计算逻辑适应临时额度调整
committer: heyu
This commit is contained in:
aike 2025-04-17 14:07:52 +08:00
parent 6d879fceb6
commit 7bb93abc47
14 changed files with 695 additions and 57 deletions

View File

@ -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<EmisTempCreditCustomer> 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));
}
}

View File

@ -65,4 +65,6 @@ public class EmisCreditCustomer extends BaseEntity
private String payee;
private String salesmen;
/** 临时额度总额 */
private BigDecimal tempCreditMoney;
}

View File

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

View File

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

View File

@ -99,4 +99,12 @@ public interface EmisCreditCustomerMapper extends BaseMapper<EmisCreditCustomer>
* @return 结果
*/
public int deleteEmisCreditCustomerByIds(Long[] ids);
/**
* 根据条件查询客户信用额度信息
*
* @param emisCreditCustomer 客户信用额度
* @return 客户信用额度
*/
EmisCreditCustomer selectCreditCustomerInfo(EmisCreditCustomer emisCreditCustomer);
}

View File

@ -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<EmisTempCreditCustomer> 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);
}

View File

@ -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<EmisTempCreditSalesmen> 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<EmisTempCreditCustomer> 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;
}
/**
*
* 重新计算使用信用额度

View File

@ -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<EmisTempCreditCustomer> 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);
}

View File

@ -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<EmisCreditCustomer> selectEmisCreditCustomerList(EmisCreditCustomer emisCreditCustomer)
{
return emisCreditCustomerMapper.selectEmisCreditCustomerList(emisCreditCustomer);
public List<EmisCreditCustomer> selectEmisCreditCustomerList(EmisCreditCustomer emisCreditCustomer) {
log.info("开始查询客户信用额度列表, 查询条件: {}", emisCreditCustomer);
List<EmisCreditCustomer> list = emisCreditCustomerMapper.selectEmisCreditCustomerList(emisCreditCustomer);
// 计算每个记录的临时额度总额
for (EmisCreditCustomer item : list) {
item.setTempCreditMoney(calculateCustomerTempCreditMoney(item));
}
log.info("查询到{}条客户信用额度记录", list.size());
return list;
}
/**

View File

@ -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<EmisTempCreditSalesmen> 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

View File

@ -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<EmisTempCreditCustomer> selectEmisTempCreditCustomerList(
EmisTempCreditCustomer emisTempCreditCustomer) {
log.info("开始查询客户临时额度列表, 查询条件: {}", emisTempCreditCustomer);
List<EmisTempCreditCustomer> 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<EmisTempCreditCustomer> 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));
}
}

View File

@ -229,4 +229,21 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<select id="selectCreditCustomerInfo" parameterType="EmisCreditCustomer" resultMap="EmisCreditCustomerResult">
select
a.id, a.acc_code, a.customer_code, a.monthly_pay_code, a.credit_money,
a.use_money, a.currency, a.trans_type, a.start_date, a.end_date, a.bl_open,
b.customer_name
from emis_credit_customer a
inner join emis_customer_user b on a.customer_code = b.customer_code and b.del_flag = '0'
<where>
a.del_flag = '0'
<if test="accCode != null and accCode != ''"> and a.acc_code = #{accCode}</if>
<if test="customerCode != null and customerCode != ''"> and a.customer_code = #{customerCode}</if>
<if test="monthlyPayCode != null and monthlyPayCode != ''"> and a.monthly_pay_code = #{monthlyPayCode}</if>
<if test="transType != null and transType != ''"> and FIND_IN_SET(#{transType}, a.trans_type)</if>
<if test="customerName != null and customerName != ''"> and b.customer_name like concat('%', #{customerName}, '%')</if>
</where>
</select>
</mapper>

View File

@ -0,0 +1,108 @@
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.xdadan.erp.emis.mapper.EmisTempCreditCustomerMapper">
<resultMap type="EmisTempCreditCustomer" id="EmisTempCreditCustomerResult"
extends="com.xdadan.erp.emis.mapper.EmisBaseMapper.EmisBaseResult">
<result property="id" column="id"/>
<result property="accCode" column="acc_code"/>
<result property="tempCreditMoneyAdjust" column="temp_credit_money_adjust"/>
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
<result property="transType" column="trans_type"/>
</resultMap>
<sql id="selectEmisTempCreditCustomerVo">
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'
</sql>
<select id="selectEmisTempCreditCustomerList" parameterType="EmisTempCreditCustomer" resultMap="EmisTempCreditCustomerResult">
<include refid="selectEmisTempCreditCustomerVo"/>
<where>
<if test="accCode != null and accCode != ''"> and t.acc_code = #{accCode}</if>
<if test="startDate != null "> and t.start_date = #{startDate}</if>
<if test="endDate != null "> and t.end_date = #{endDate}</if>
<if test="transType != null and transType != ''"> and FIND_IN_SET(#{transType},c.trans_type)</if>
<if test="customerName != null and customerName != ''"> and d.customer_name like concat('%', #{customerName}, '%')</if>
and t.del_flag = '0'
</where>
order by t.create_time desc
</select>
<select id="selectEmisTempCreditCustomerById" parameterType="Long" resultMap="EmisTempCreditCustomerResult">
select 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
from emis_temp_credit_customer
where id = #{id} and del_flag = '0'
</select>
<insert id="insertEmisTempCreditCustomer" parameterType="EmisTempCreditCustomer">
insert into emis_temp_credit_customer
<trim prefix="(" suffix=")" suffixOverrides=",">
<if test="id != null">id,</if>
<if test="accCode != null">acc_code,</if>
<if test="tempCreditMoneyAdjust != null">temp_credit_money_adjust,</if>
<if test="startDate != null">start_date,</if>
<if test="endDate != null">end_date,</if>
<if test="remark != null">remark,</if>
<if test="delFlag != null">del_flag,</if>
<if test="createBy != null">create_by,</if>
<if test="createTime != null">create_time,</if>
<if test="updateBy != null">update_by,</if>
<if test="updateTime != null">update_time,</if>
<if test="createSite != null">create_site,</if>
<if test="updateSite != null">update_site,</if>
</trim>
<trim prefix="values (" suffix=")" suffixOverrides=",">
<if test="id != null">#{id},</if>
<if test="accCode != null">#{accCode},</if>
<if test="tempCreditMoneyAdjust != null">#{tempCreditMoneyAdjust},</if>
<if test="startDate != null">#{startDate},</if>
<if test="endDate != null">#{endDate},</if>
<if test="remark != null">#{remark},</if>
<if test="delFlag != null">#{delFlag},</if>
<if test="createBy != null">#{createBy},</if>
<if test="createTime != null">#{createTime},</if>
<if test="updateBy != null">#{updateBy},</if>
<if test="updateTime != null">#{updateTime},</if>
<if test="createSite != null">#{createSite},</if>
<if test="updateSite != null">#{updateSite},</if>
</trim>
</insert>
<update id="updateEmisTempCreditCustomer" parameterType="EmisTempCreditCustomer">
update emis_temp_credit_customer
<trim prefix="SET" suffixOverrides=",">
<if test="accCode != null">acc_code = #{accCode},</if>
<if test="tempCreditMoneyAdjust != null">temp_credit_money_adjust = #{tempCreditMoneyAdjust},</if>
<if test="startDate != null">start_date = #{startDate},</if>
<if test="endDate != null">end_date = #{endDate},</if>
<if test="remark != null">remark = #{remark},</if>
<if test="delFlag != null">del_flag = #{delFlag},</if>
<if test="createBy != null">create_by = #{createBy},</if>
<if test="createTime != null">create_time = #{createTime},</if>
<if test="updateBy != null">update_by = #{updateBy},</if>
<if test="updateTime != null">update_time = #{updateTime},</if>
<if test="createSite != null">create_site = #{createSite},</if>
<if test="updateSite != null">update_site = #{updateSite},</if>
</trim>
where id = #{id}
</update>
<delete id="deleteEmisTempCreditCustomerById" parameterType="Long">
update emis_temp_credit_customer set del_flag = '1' where id = #{id}
</delete>
<delete id="deleteEmisTempCreditCustomerByIds" parameterType="String">
update emis_temp_credit_customer set del_flag = '1' where id in
<foreach item="id" collection="array" open="(" separator="," close=")">
#{id}
</foreach>
</delete>
</mapper>

View File

@ -10,7 +10,6 @@
<result property="startDate" column="start_date"/>
<result property="endDate" column="end_date"/>
<result property="transType" column="trans_type"/>
<result property="tempCreditMoney" column="temp_credit_money"/>
</resultMap>
<sql id="selectEmisTempCreditSalesmenVo">