demand: 1.新增月结客户临时额度操作界面,增加增删改查操 作,月结客户额度操作界面查询返回增加临时额度
2.运单录入、运单修改等界面销售额度计算逻辑适应临时额度调整 committer: heyu
This commit is contained in:
parent
6d879fceb6
commit
7bb93abc47
@ -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));
|
||||
}
|
||||
}
|
||||
@ -65,4 +65,6 @@ public class EmisCreditCustomer extends BaseEntity
|
||||
private String payee;
|
||||
private String salesmen;
|
||||
|
||||
/** 临时额度总额 */
|
||||
private BigDecimal tempCreditMoney;
|
||||
}
|
||||
|
||||
@ -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;
|
||||
|
||||
}
|
||||
@ -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;
|
||||
|
||||
@ -99,4 +99,12 @@ public interface EmisCreditCustomerMapper extends BaseMapper<EmisCreditCustomer>
|
||||
* @return 结果
|
||||
*/
|
||||
public int deleteEmisCreditCustomerByIds(Long[] ids);
|
||||
|
||||
/**
|
||||
* 根据条件查询客户信用额度信息
|
||||
*
|
||||
* @param emisCreditCustomer 客户信用额度
|
||||
* @return 客户信用额度
|
||||
*/
|
||||
EmisCreditCustomer selectCreditCustomerInfo(EmisCreditCustomer emisCreditCustomer);
|
||||
}
|
||||
|
||||
@ -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);
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* 重新计算使用信用额度
|
||||
|
||||
@ -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);
|
||||
|
||||
}
|
||||
@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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));
|
||||
}
|
||||
}
|
||||
@ -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>
|
||||
@ -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>
|
||||
@ -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">
|
||||
|
||||
Loading…
Reference in New Issue
Block a user