demand: 现金销售查询增加展示理赔金额。 现金销售支持查询理赔账单列表。 销售剩余额度计算支持过滤理赔账单, 运单录入销售额度计算支持过滤理赔账单。 定时计算销售额度/实时计算支持计算销售理赔金额

committer: heyu
This commit is contained in:
aike 2025-08-21 13:39:03 +08:00
parent 8cce2fa7f4
commit 1ddddfd496
7 changed files with 293 additions and 70 deletions

View File

@ -14,6 +14,7 @@ package com.xdadan.erp.web.emis;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import com.xdadan.erp.emis.domain.EmisWaybill;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
@ -36,6 +37,7 @@ import com.xdadan.erp.common.utils.poi.ExcelUtil;
import com.xdadan.erp.emis.domain.EmisCreditSalesmen;
import com.xdadan.erp.emis.service.IEmisCreditSalesmenService;
import com.xdadan.erp.emis.domain.EmisSettleBill;
/**
* 销售信用额度Controller
@ -62,6 +64,16 @@ public class EmisCreditSalesmenController extends BaseController
return getDataTable(list);
}
/**
* 查询销售理赔账单列表
*/
@PreAuthorize("@ss.hasPermi('emis:emisCreditSalesmen:getSalesSatisfyDetail')")
@GetMapping("/getSalesSatisfyDetail")
public TableDataInfo getSalesSatisfyDetail(EmisWaybill emisWaybill) {
startPage();
List<EmisSettleBill> list = emisCreditSalesmenService.selectSalesSatisfyDetailList(emisWaybill);
return getDataTable(list);
}
/**
* 检查是否重复

View File

@ -49,6 +49,8 @@ public class EmisCreditSalesmen extends BaseEntity
private BigDecimal overTermMoney;
/* 账期内额度 */
private BigDecimal inTermMoney;
/* 理赔金额 */
private BigDecimal satisfyMoney;
/* 币种 */
private String currency;
/* 运输方式 */

View File

@ -17,6 +17,8 @@ import java.util.Map;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xdadan.erp.emis.domain.EmisCreditSalesmen;
import org.apache.ibatis.annotations.Param;
import com.xdadan.erp.emis.domain.EmisSettleBill;
import com.xdadan.erp.emis.domain.EmisWaybill;
/**
* @ClassName EmisCreditSalesmenMapper
@ -98,4 +100,12 @@ public interface EmisCreditSalesmenMapper extends BaseMapper<EmisCreditSalesmen>
* @return 结果
*/
public int deleteEmisCreditSalesmenByIds(Long[] ids);
/**
* 查询销售理赔详情列表
*
* @param emisWaybill 运单查询条件
* @return 结算账单集合
*/
public List<EmisSettleBill> selectSalesSatisfyDetailList(EmisWaybill emisWaybill);
}

View File

@ -54,6 +54,7 @@ package com.xdadan.erp.emis.service;
import java.time.format.DateTimeParseException;
import java.time.temporal.ChronoUnit;
import java.util.*;
import java.util.Set;
import java.util.stream.Collectors;
/**
@ -418,7 +419,8 @@ public class EmisBaseService {
}
}
BigDecimal totalCreditMoney = baseCreditMoney.add(tempAdjust);
BigDecimal satisfyMoney = creditSalesmen.getSatisfyMoney() != null ? creditSalesmen.getSatisfyMoney() : BigDecimal.ZERO;
BigDecimal totalCreditMoney = baseCreditMoney.add(tempAdjust).add(satisfyMoney);
log.debug("客户[{}]的临时额度总额计算完成: 基础额度[{}] + 临时调整[{}] = 总额[{}]",
creditSalesmen.getAccCode(), baseCreditMoney, tempAdjust, totalCreditMoney);
return totalCreditMoney;
@ -1662,11 +1664,15 @@ public class EmisBaseService {
BigDecimal inTermMoney = getInTermMoney(emisWaybillList);
// 超期金额
BigDecimal overTermMoney = new BigDecimal(useMoney.subtract(inTermMoney).stripTrailingZeros().toPlainString());
// 计算理赔金额
BigDecimal satisfyMoney = calculateSatisfyMoney(emisWaybillList);
EmisCreditSalesmen emisCreditSalesmen = new EmisCreditSalesmen();
emisCreditSalesmen.setId(item.getId());
emisCreditSalesmen.setUseMoney(useMoney);
emisCreditSalesmen.setOverTermMoney(overTermMoney);
emisCreditSalesmen.setInTermMoney(inTermMoney);
emisCreditSalesmen.setSatisfyMoney(satisfyMoney);
emisCreditSalesmenMapper.updateEmisCreditSalesmen(emisCreditSalesmen);
log.info("success.autoDoCredit , emisCreditSalesmen,{}", JSON.toJSONString(emisCreditSalesmen));
}catch (Exception ex){
@ -1715,6 +1721,61 @@ public class EmisBaseService {
return inTermMoney;
}
/**
* 根据运单列表计算理赔金额
* 根据emisWaybillList.billCode查emis_settle_sub_bill获取settle_bill_no
* 关联emis_settle_bill获取总的satisfy_money并返回
* 一个settle_bill_no对应多个billCode
*
* @param emisWaybillList 运单列表
* @return 理赔金额总额
*/
protected BigDecimal calculateSatisfyMoney(List<EmisWaybill> emisWaybillList) {
if (CollectionUtil.isEmpty(emisWaybillList)) {
return BigDecimal.ZERO;
}
// 获取所有运单号
List<String> billCodeList = emisWaybillList.stream()
.map(EmisWaybill::getBillCode)
.collect(Collectors.toList());
log.info("开始计算理赔金额,运单号列表: {}", billCodeList);
// 根据billCode查询emis_settle_sub_bill获取settle_bill_no
List<EmisSettleSubBill> emisSettleSubBillList = emisSettleSubBillMapper.querysSettleSubBillByBillCodeList(billCodeList);
if (CollectionUtil.isEmpty(emisSettleSubBillList)) {
log.info("未找到对应的结算子账单记录");
return BigDecimal.ZERO;
}
// 获取所有settle_bill_no
Set<String> settleBillNoSet = emisSettleSubBillList.stream()
.map(EmisSettleSubBill::getSettleBillNo)
.filter(StringUtils::isNotEmpty)
.collect(Collectors.toSet());
if (CollectionUtil.isEmpty(settleBillNoSet)) {
log.info("未找到对应的结算账单号");
return BigDecimal.ZERO;
}
log.info("找到的结算账单号: {}", settleBillNoSet);
// 根据settle_bill_no查询emis_settle_bill获取satisfy_money
BigDecimal totalSatisfyMoney = BigDecimal.ZERO;
for (String settleBillNo : settleBillNoSet) {
EmisSettleBill settleBill = emisSettleBillMapper.selectSettleBillBySettleBillNo(settleBillNo);
if (settleBill != null && settleBill.getSatisfyMoney() != null) {
totalSatisfyMoney = totalSatisfyMoney.add(settleBill.getSatisfyMoney());
log.debug("结算账单[{}]的理赔金额: {}", settleBillNo, settleBill.getSatisfyMoney());
}
}
log.info("理赔金额计算完成,总额: {}", totalSatisfyMoney);
return totalSatisfyMoney;
}
public List<EmisWaybill> filterOverTermEmisWaybillList(List<EmisWaybill> list) {
log.info("cd filterOverTermEmisWaybillList , emisWaybillList,{}", list);
if (CollectionUtil.isEmpty(list)) {
@ -4723,6 +4784,7 @@ public class EmisBaseService {
EmisWaybillBatchStatus batchStatus = new EmisWaybillBatchStatus();
batchStatus.setBillCode(waybill.getBillCode());
batchStatus.setSiteBatchStatus("1"); // 1表示匹配成功
// batchStatus.setBlManual("1");
Date now = new Date();
batchStatus.setCreateBy("system");
batchStatus.setCreateTime(now);

View File

@ -12,6 +12,8 @@ package com.xdadan.erp.emis.service;
import java.util.List;
import com.xdadan.erp.emis.domain.EmisCreditSalesmen;
import com.xdadan.erp.emis.domain.exception.EmisBizError;
import com.xdadan.erp.emis.domain.EmisSettleBill;
import com.xdadan.erp.emis.domain.EmisWaybill;
/**
* @ClassName EmisCreditSalesmenService
@ -76,4 +78,12 @@ public interface IEmisCreditSalesmenService
* @return 结果
*/
public int deleteEmisCreditSalesmenById(Long id);
/**
* 查询销售理赔详情列表
*
* @param emisWaybill 运单查询条件
* @return 结算账单集合
*/
public List<EmisSettleBill> selectSalesSatisfyDetailList(EmisWaybill emisWaybill);
}

View File

@ -30,6 +30,7 @@ import org.springframework.stereotype.Service;
import com.xdadan.erp.emis.domain.EmisCreditSalesmen;
import com.xdadan.erp.emis.mapper.EmisCreditSalesmenMapper;
import com.xdadan.erp.emis.service.IEmisCreditSalesmenService;
import com.xdadan.erp.emis.domain.EmisSettleBill;
/**
* 销售信用额度Service业务层处理
@ -145,6 +146,9 @@ public class EmisCreditSalesmenServiceImpl extends EmisBaseService implements IE
emisCreditSalesmen.setOverTermMoney(overTermMoney);
emisCreditSalesmen.setInTermMoney(inTermMoney);
// 理赔金额
BigDecimal satisfyMoney = calculateSatisfyMoney(emisWaybillList);
emisCreditSalesmen.setSatisfyMoney(satisfyMoney);
log.error("=====>useMoneyMap=1111====>{}", JSON.toJSONString(useMoneyMap));
log.error("=====>useMoney=1111====>{}", useMoney.toString());
@ -173,4 +177,15 @@ public class EmisCreditSalesmenServiceImpl extends EmisBaseService implements IE
return emisCreditSalesmenMapper.deleteEmisCreditSalesmenById(id);
}
/**
* 查询销售理赔详情列表
*
* @param emisWaybill 运单查询条件
* @return 结算账单集合
*/
@Override
public List<EmisSettleBill> selectSalesSatisfyDetailList(EmisWaybill emisWaybill) {
log.info("开始查询销售理赔详情列表");
return emisCreditSalesmenMapper.selectSalesSatisfyDetailList(emisWaybill);
}
}

View File

@ -12,6 +12,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<result property="useMoney" column="use_money" />
<result property="overTermMoney" column="over_term_money" />
<result property="inTermMoney" column="in_term_money" />
<result property="satisfyMoney" column="satisfy_money" />
<result property="currency" column="currency" />
<result property="transType" column="trans_type" />
<result property="startDate" column="start_date" />
@ -20,7 +21,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</resultMap>
<sql id="selectEmisCreditSalesmenVo">
select id, acc_code, salesmen, credit_money, use_money, currency, trans_type, start_date, end_date, bl_open, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_credit_salesmen
select id, acc_code, salesmen, credit_money, use_money, over_term_money, in_term_money, satisfy_money, currency, trans_type, start_date, end_date, bl_open, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site from emis_credit_salesmen
</sql>
<select id="selectEmisCreditSalesmenList" parameterType="EmisCreditSalesmen" resultMap="EmisCreditSalesmenResult">
@ -38,7 +39,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
a.use_money, a.over_term_money, a.in_term_money, a.currency,
a.trans_type, a.start_date, a.end_date, a.bl_open,
a.remark, a.tenant_id, a.del_flag, a.create_by,
a.create_time, a.update_by, a.update_time, a.create_site, a.update_site
a.create_time, a.update_by, a.update_time, a.create_site, a.update_site, a.satisfy_money
from emis_credit_salesmen a
<where>
del_flag='0'
@ -146,7 +147,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
</select>
<select id="selectEmisCreditSalesmenById" parameterType="Long" resultMap="EmisCreditSalesmenResult">
select id, acc_code, salesmen, credit_money, use_money, over_term_money, in_term_money, currency, trans_type, start_date, end_date, bl_open, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site
select id, acc_code, salesmen, credit_money, use_money, over_term_money, in_term_money, satisfy_money, currency, trans_type, start_date, end_date, bl_open, remark, tenant_id, del_flag, create_by, create_time, update_by, update_time, create_site, update_site
from emis_credit_salesmen a
where a.id = #{id}
</select>
@ -188,6 +189,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="useMoney != null">use_money,</if>
<if test="overTermMoney != null">over_term_money,</if>
<if test="inTermMoney != null">in_term_Money,</if>
<if test="satisfyMoney != null">satisfy_money,</if>
<if test="currency != null and currency != ''">currency,</if>
<if test="transType != null and transType != ''">trans_type,</if>
<if test="startDate != null">start_date,</if>
@ -210,6 +212,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="useMoney != null">#{useMoney},</if>
<if test="overTermMoney != null">#{overTermMoney},</if>
<if test="inTermMoney != null">#{inTermMoney},</if>
<if test="satisfyMoney != null">#{satisfyMoney},</if>
<if test="currency != null and currency != ''">#{currency},</if>
<if test="transType != null and transType != ''">#{transType},</if>
<if test="startDate != null">#{startDate},</if>
@ -234,6 +237,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="useMoney != null">use_money = #{useMoney},</if>
<if test="overTermMoney != null">over_term_money = #{overTermMoney},</if>
<if test="inTermMoney != null">in_term_Money = #{inTermMoney},</if>
<if test="satisfyMoney != null">satisfy_money = #{satisfyMoney},</if>
<if test="currency != null and currency != ''">currency = #{currency},</if>
<if test="transType != null and transType != ''">trans_type = #{transType},</if>
<if test="startDate != null">start_date = #{startDate},</if>
@ -267,4 +271,112 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id}
</foreach>
</delete>
<!-- 查询销售理赔详情列表 -->
<select id="selectSalesSatisfyDetailList" parameterType="EmisWaybill" resultType="EmisSettleBill">
SELECT DISTINCT
sb.id,
sb.settle_bill_no as settleBillNo,
sb.settle_bill_name as settleBillName,
sb.settle_type as settleType,
sb.settle_start_date as settleStartDate,
sb.settle_end_date as settleEndDate,
sb.bill_month as billMonth,
sb.rec_money as recMoney,
sb.reced_money as recedMoney,
sb.invoiced_money as invoicedMoney,
sb.cust_no as custNo,
sb.cust_name as custName,
sb.customer_code as customerCode,
sb.customer_name as customerName,
sb.site_code as siteCode,
sb.site_name as siteName,
sb.satisfy_money as satisfyMoney,
sb.allowance_money as allowanceMoney,
sb.deduction_money as deductionMoney,
sb.other_money as otherMoney,
sb.satisfy_reason as satisfyReason,
sb.allowance_reason as allowanceReason,
sb.deduction_reason as deductionReason,
sb.other_reason as otherReason,
sb.open_bill_status as openBillStatus,
sb.payment_status as paymentStatus,
sb.charge_status as chargeStatus,
sb.send_piece_sum as sendPieceSum,
sb.piece_number as pieceNumber,
sb.fee_weight as feeWeight,
sb.uncollected_amount as uncollectedAmount,
sb.send_money_sum as sendMoneySum,
sb.refund_amount as refundAmount,
sb.refund_money as refundMoney,
sb.payee,
sb.salesmen,
sb.credit_period as creditPeriod,
sb.credit_period_type as creditPeriodType,
sb.settle_day as settleDay,
sb.payment_due_date as paymentDueDate,
sb.bl_send_oms as blSendOms,
sb.bl_confirm_center as blConfirmCenter,
sb.confirm_center_date as confirmCenterDate,
sb.confirm_center_note as confirmCenterNote,
sb.confirm_center_man_code as confirmCenterManCode,
sb.confirm_center_code as confirmCenterCode,
sb.bl_confirm_site as blConfirmSite,
sb.confirm_site_date as confirmSiteDate,
sb.confirm_site_man_code as confirmSiteManCode,
sb.confirm_site_note as confirmSiteNote,
sb.confirm_site_code as confirmSiteCode,
sb.remark,
sb.del_flag as delFlag,
sb.create_by as createBy,
sb.create_time as createTime,
sb.update_by as updateBy,
sb.update_time as updateTime,
sb.create_site as createSite,
sb.update_site as updateSite
FROM emis_settle_bill sb
INNER JOIN emis_settle_sub_bill ssb ON sb.settle_bill_no = ssb.settle_bill_no
INNER JOIN emis_waybill w ON ssb.bill_code = w.bill_code
WHERE sb.del_flag = '0'
AND ssb.del_flag = '0'
AND w.del_flag = '0'
and w.order_status !='0' and w.order_status!='2'
AND sb.satisfy_money > 0
<if test="paymentType != null and paymentType != ''">
AND FIND_IN_SET(w.payment_type, #{paymentType})
</if>
<if test="payee != null and payee != ''">
AND sb.payee = #{payee}
</if>
<if test="paymentStatus != null and paymentStatus != ''">
AND FIND_IN_SET(w.payment_status, #{paymentStatus})
</if>
<if test="params.problemQueryType != null and params.problemQueryType == 1 and params.problemQueryIds != null and params.problemQueryIds !=''">
and exists (
select 1 from emis_waybill_problem_info ewpi where w.bill_code=ewpi.bill_code and ewpi.del_flag='0' and FIND_IN_SET( ewpi.`problem_type`, #{params.problemQueryIds} )
)
</if>
<if test="params.problemQueryType != null and params.problemQueryType == 2 and params.problemQueryIds != null and params.problemQueryIds !=''">
and not exists (
select 1 from emis_waybill_problem_info ewpi where w.bill_code=ewpi.bill_code and ewpi.del_flag='0' and FIND_IN_SET( ewpi.`problem_type`, #{params.problemQueryIds} )
)
</if>
<!-- <if test="params.queryTabType != null and params.queryTabType != ''">-->
<!-- AND w.query_tab_type = #{params.queryTabType}-->
<!-- </if>-->
<!-- <if test="params.querySendType != null and params.querySendType != ''">-->
<!-- AND w.query_send_type = #{params.querySendType}-->
<!-- </if>-->
<if test="params.beginSendDate != null and params.beginSendDate != ''">
AND w.send_date <![CDATA[ >= ]]> #{params.beginSendDate}
</if>
<if test="params.endSendDate != null and params.endSendDate != ''">
AND w.send_date <![CDATA[ <= ]]> #{params.endSendDate}
</if>
<if test="carryType != null and carryType != ''">
AND FIND_IN_SET(w.carry_type, #{carryType})
</if>
ORDER BY sb.create_time DESC
</select>
</mapper>