Просмотр исходного кода

Merge remote-tracking branch 'origin/dev_jzg_lipf_v20260518'

jiakai 3 месяцев назад
Родитель
Сommit
d34f4a468e

+ 21 - 0
commons/src/main/java/com/jzg/commons/util/BigDecimalUtil.java

@@ -1,7 +1,10 @@
 package com.jzg.commons.util;
 
+import cn.hutool.core.collection.CollUtil;
+
 import java.math.BigDecimal;
 import java.math.RoundingMode;
+import java.util.List;
 
 
 /**
@@ -29,6 +32,24 @@ public class BigDecimalUtil {
         return v1.add(v2);
     }
 
+    /**
+     * 将多个值进行相加
+     *
+     * @param items 要相加的值
+     * @author lipf
+     * @date 2026/6/6 10:22
+     */
+    public static BigDecimal add(List<BigDecimal> items){
+        if(CollUtil.isEmpty(items)) {
+            return BigDecimal.ZERO;
+        }
+        BigDecimal sum = BigDecimal.ZERO;
+        for (BigDecimal item : items) {
+            sum = sum.add(item);
+        }
+        return sum;
+    }
+
     /**
      * 提供精确的减法运算
      * @param v1 被减数

+ 69 - 45
tenant/insurance/quotation-summary/src/main/java/com/jzg/quotation/summary/service/impl/InsFeeAuditServiceImpl.java

@@ -414,7 +414,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             AssertionUtils.isFail(true, "订单已被"+audit.getReceiveUser()+"领取返回待审核订单列表!");
         }
         InsFeeOrders feeOrders = null;
-        SysUserAccount userAccount = null,distributor1 = null,distributor2 = null,distributor3 = null;
+        SysUserAccount userAccount = null;
         if(param.getAuditStatus().equals(1)){
             List<SysUserAccountIncomeLog> incomeLogs = new ArrayList<>();
             StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.SUCCESS_AUDIT,audit.getAuditStatus()+"");
@@ -447,7 +447,6 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
                 userAccount.setSumAmountUnpaid(feeOrders.getTotalReceivablePremium().add(userAccount.getSumAmount()));
             }
             orgClient.saveOrUpdate(userAccount);
-
             // 进入应收表
             List<String> orderNos = new ArrayList<>();
             orderNos.add(audit.getOrderNo());
@@ -455,42 +454,7 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
             requestData.put("orderNo",orderNos);
             HttpResult httpResult = orgClient.addReceivable(requestData);
             AssertionUtils.isFail(httpResult.getCode() == 500,"应收出错");
-
-            // 一级分销费用户进账
-            if (feeOrders.getFirstDistributorId() != null && feeOrders.getFirstDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
-                HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getFirstDistributorId());
-                AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
-                SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
-                HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
-                AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
-                distributor1 = jzgAccountResult.getData();
-                verifySysAccount(distributor1,jzgInfo,feeOrders);
-            }
-            // 二级分销费用户进账
-            if (feeOrders.getSecondDistributorId() != null && feeOrders.getSecondDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
-                HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getSecondDistributorId());
-                AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
-                SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
-                HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
-                AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
-                distributor2 = jzgAccountResult.getData();
-                verifySysAccount(distributor2,jzgInfo,feeOrders);
-            }
-            // 三级分销费用户进账
-            if (feeOrders.getThirdDistributorId() != null && feeOrders.getThirdDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
-                HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getThirdDistributorId());
-                AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
-                SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
-                HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
-                AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
-                distributor3 = jzgAccountResult.getData();
-                verifySysAccount(distributor3,jzgInfo,feeOrders);
-            }
-            // 增加账户的金额记录
-            // modify by lipf, 2026年5月20日11:31:59 审核通过后,才需要 生成收入明细日志
-            List<SysUserAccountIncomeLog>builderIncomeLog = this.builderIncomeLog(param.getOrderNo(),feeOrders,userAccount,distributor1,distributor2,distributor3);
-            HttpResult result2 = orgClient.addUserAccountIncomeLog(builderIncomeLog);
-            AssertionUtils.isFail(result2.getCode() != 200,"账户记录添加失败,审核失败");
+            this.dealDistribution(feeOrders,userAccount);
         }else{
             log.info("订单审核驳回:param=[{}]", JSONUtil.toJsonStr(param));
             StateResult stateFailResult = auditStateListener.statusChange(AuditState.AuditStateEnum.FAIL_AUDIT,audit.getAuditStatus()+"");
@@ -512,6 +476,56 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         }
     }
 
+    /**
+     * 分销逻辑处理 (抽取原来的方法)
+     *      根据分销逻辑更新业务员账户的金额信息
+     *
+     * @param feeOrders 订单费用
+     * @param userAccount 业务员账户信息
+     * @author lipf
+     * @date 2026/6/6 10:49
+     */
+    private void dealDistribution(InsFeeOrders feeOrders, SysUserAccount userAccount){
+        log.info("处理分销逻辑。 feeOrders=[{}],userAccount=[{}]", JSONUtil.toJsonStr(feeOrders), JSONUtil.toJsonStr(userAccount));
+        SysUserAccount distributor1 = null,distributor2 = null,distributor3 = null;
+        // 一级分销费用户进账
+        if (feeOrders.getFirstDistributorId() != null && feeOrders.getFirstDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
+            HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getFirstDistributorId());
+            AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
+            SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
+            HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
+            AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
+            distributor1 = jzgAccountResult.getData();
+            updateSysAccount(distributor1,jzgInfo,feeOrders);
+        }
+        // 二级分销费用户进账
+        if (feeOrders.getSecondDistributorId() != null && feeOrders.getSecondDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
+            HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getSecondDistributorId());
+            AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
+            SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
+            HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
+            AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
+            distributor2 = jzgAccountResult.getData();
+            updateSysAccount(distributor2,jzgInfo,feeOrders);
+        }
+        // 三级分销费用户进账
+        if (feeOrders.getThirdDistributorId() != null && feeOrders.getThirdDistributionFee().compareTo(BigDecimal.ZERO) > 0) {
+            HttpResult<SysUserJzgInfo> jzgInfoResult = orgClient.getUserInfoById(feeOrders.getThirdDistributorId());
+            AssertionUtils.isFail(jzgInfoResult.getCode() != 200,"获取用户失败!");
+            SysUserJzgInfo jzgInfo = jzgInfoResult.getData();
+            HttpResult<SysUserAccount> jzgAccountResult = orgClient.accountGet(jzgInfo.getUserId());
+            AssertionUtils.isFail(jzgAccountResult.getCode() != 200,"获取用户账户失败!");
+            distributor3 = jzgAccountResult.getData();
+            updateSysAccount(distributor3,jzgInfo,feeOrders);
+        }
+        // 增加账户的金额记录
+        // modify by lipf, 2026年5月20日11:31:59 审核通过后,才需要 生成收入明细日志
+        List<SysUserAccountIncomeLog>builderIncomeLog = this.builderIncomeLog(feeOrders.getOrderNo(),feeOrders,userAccount,distributor1,distributor2,distributor3);
+        HttpResult result2 = orgClient.addUserAccountIncomeLog(builderIncomeLog);
+        AssertionUtils.isFail(result2.getCode() != 200,"账户记录添加失败,审核失败");
+    }
+
+
     /**
      * 处理订单关联的权益信息(将权益处理的逻辑抽取到一个单独的方法里面)
      *
@@ -629,10 +643,15 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
      * @param distributor3  3级分销人员
      * @return
      */
-    private List<SysUserAccountIncomeLog> builderIncomeLog(String orderNo,InsFeeOrders feeOrders,SysUserAccount userAccount,SysUserAccount distributor1,
-                                                           SysUserAccount distributor2, SysUserAccount distributor3){
+    private List<SysUserAccountIncomeLog> builderIncomeLog(String orderNo,
+                                                           InsFeeOrders feeOrders,
+                                                           SysUserAccount userAccount,
+                                                           SysUserAccount distributor1,
+                                                           SysUserAccount distributor2,
+                                                           SysUserAccount distributor3){
+        log.info("生成收入明细日志:feeOrders=[{}],userAccount=[{}],distributor1=[{}],distributor2=[{}],distributor3=[{}]",
+                JSONUtil.toJsonStr(feeOrders), JSONUtil.toJsonStr(userAccount), JSONUtil.toJsonStr(distributor1), JSONUtil.toJsonStr(distributor2), JSONUtil.toJsonStr(distributor3));
         List<SysUserAccountIncomeLog> incomeLogs = new ArrayList<>();
-
         // 出口费用
         SysUserAccountIncomeLog exportIncomeLog = new SysUserAccountIncomeLog();
         exportIncomeLog.setOrderId(orderNo);
@@ -678,11 +697,16 @@ public class InsFeeAuditServiceImpl extends ServiceImpl<InsFeeAuditMapper, InsFe
         return incomeLogs;
     }
 
-
-
-    // 验证用户账户
-    public void verifySysAccount(SysUserAccount userAccount, SysUserJzgInfo jzgInfo, InsFeeOrders feeOrders) {
+    /**
+     * 更新分销账户的金额
+     *
+     * @author lipf
+     * @date 2026/6/6 11:20
+     */
+    void updateSysAccount(SysUserAccount userAccount, SysUserJzgInfo jzgInfo, InsFeeOrders feeOrders) {
         if (Objects.isNull(userAccount)) {
+            userAccount = new SysUserAccount();
+            userAccount.setSystemCode(jzgInfo.getSystemCode());
             userAccount.setUserId(jzgInfo.getUserId());
             userAccount.setSumAmount(feeOrders.getFirstDistributionFee());
             userAccount.setSumAmountUnpaid(feeOrders.getFirstDistributionFee());

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/controller/ReceivableController.java

@@ -551,6 +551,13 @@ public class ReceivableController {
         return HttpResult.ok(receivableService.platformSettlementExcel(page,settlementQueryVo));
     }
 
+    @PostMapping("/followSettlementExcel")
+    @Operation(summary = "跟单费用结算记录")
+    public HttpResult<Page<ExportSuperviseSettlementExcelDto>> followSettlementExcel(@RequestBody SettlementQueryVo settlementQueryVo) {
+        Page page = settlementQueryVo.getPage();
+        return HttpResult.ok(receivableService.followSettlementExcel(page,settlementQueryVo));
+    }
+
     @DeleteMapping("/deleteSettlementById/{id}")
     @Operation(summary = "删除结算记录")
     public HttpResult<Boolean> deleteSettlementById(@PathVariable String id) {

+ 7 - 0
tenant/organization/src/main/java/com/jzg/organization/mapper/ReceivableMapper.java

@@ -98,6 +98,13 @@ public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
      */
     Page<ExportSuperviseSettlementExcelDto> platformSettlementExcelDtos(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
 
+    /**
+     * 获取平台结算记录列表
+     * @param settlementQueryVo
+     * @return
+     */
+    Page<ExportSuperviseSettlementExcelDto> followSettlementExcelDtos(Page page,@Param("settlementQueryVo") SettlementQueryVo settlementQueryVo);
+
     /**
      * 获取应收结算记录明细列表
      * @param settlementQueryVo

+ 8 - 0
tenant/organization/src/main/java/com/jzg/organization/service/ReceivableService.java

@@ -442,4 +442,12 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      * @return
      */
     HttpResult<String> followInvoiceAndSettlement(FollowInvoiceAndSettlementVo settlementVo);
+
+    /**
+     * 跟单费用结算记录
+     * @param page
+     * @param settlementQueryVo
+     * @return
+     */
+    Page<ExportSuperviseSettlementExcelDto> followSettlementExcel(Page page, SettlementQueryVo settlementQueryVo);
 }

+ 22 - 5
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -657,7 +657,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         // 2. 数据库校验:是否已存在开票记录
         Integer count = baseMapper.invoicingCheck(invoicingVo);
         if (count > 0) {
-            log.info("数据库已存在开票记录,直接禁止");
+            log.info("数据库已存在开票记录,直接禁止开票");
             return false;
         }
 
@@ -830,7 +830,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             log.info("开票异常.invoicingVo=[{}]",JSONUtil.toJsonStr(invoicingVo), e);
             // 回滚事务
             TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
-            return null;
+            throw new ServiceException(Objects.toString(e.getMessage(),"开票异常"));
         }
     }
 
@@ -844,9 +844,9 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         if(invoicingVo == null){
             throw new ServiceException("无法开票,开票参数为空");
         }
-        if(StrUtil.isEmpty(invoicingVo.getInvoiceNo())){
-            throw new ServiceException("发票号不能为空");
-        }
+//        if(StrUtil.isEmpty(invoicingVo.getInvoiceNo())){
+//            throw new ServiceException("发票号不能为空");
+//        }
     }
 
     @Override
@@ -2703,6 +2703,23 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         return exportSuperviseSettlementExcelDtos;
     }
 
+    /**
+     * 跟单协议结算记录
+     *
+     * @param settlementQueryVo 查询条件
+     * @return Page<ExportSuperviseSettlementExcelDto>
+     */
+    @Override
+    public Page<ExportSuperviseSettlementExcelDto> followSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) {
+        log.info("查询平台结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
+        // 设置空条件
+        setNoneCondition(settlementQueryVo);
+        Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.followSettlementExcelDtos(page, settlementQueryVo);
+        // 补充、转换列表的数据
+        supplementaryListData(exportSuperviseSettlementExcelDtos);
+        return exportSuperviseSettlementExcelDtos;
+    }
+
     /**
      * 设置空条件
      * @param settlementQueryVo

+ 70 - 3
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -608,7 +608,7 @@
         AND ipii.is_delete = 0
         AND ipi.is_delete = 0
         AND io.is_delete = 0
-        AND agree.is_delete = 0
+<!--        AND agree.is_delete = 0 modify by lipf 2026年6月6日14:53:23   解决协议被删除后,相关的开票信息,结算信息查询不出来的问题 -->
         <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
             AND ipiis.id IN
             <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
@@ -658,6 +658,73 @@
         order by ipiis.create_time desc
     </select>
 
+    <select id="followSettlementExcelDtos" resultType="com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementExcelDto">
+        SELECT
+        ipiis.id AS settlementId,
+        -- 拼接需要合并的字段,DISTINCT 去重,SEPARATOR '、' 用顿号分隔
+        GROUP_CONCAT(DISTINCT ipiis.invoice_id SEPARATOR ',') AS invoiceId,
+        GROUP_CONCAT(DISTINCT ipii.company_id SEPARATOR ',') AS company_id,
+        GROUP_CONCAT(DISTINCT eic.name SEPARATOR ',') AS company_name,
+        GROUP_CONCAT(DISTINCT ipii.invoice_type SEPARATOR ',') AS invoice_type,
+        GROUP_CONCAT(DISTINCT ipii.invoice_party SEPARATOR ',') AS invoice_party,
+        GROUP_CONCAT(DISTINCT ipii.tax_point SEPARATOR ',') AS tax_point,
+        -- 金额/日期这类同一settlementId相同的字段,直接取任意一个即可
+        MAX(ipiis.actual_received_amount) AS actual_received_amount,
+        MAX(ipiis.receive_payment_date) AS receive_payment_date,
+        MAX(ipiis.create_by) AS create_by,
+        MAX(ipiis.create_time) AS create_time
+        FROM ins_ply_income_invoice_settlement ipiis
+        LEFT JOIN ins_ply_income_invoice ipii ON ipii.id = ipiis.invoice_id AND ipii.is_delete = 0
+        LEFT JOIN ins_ply_follow_invoice_link link ON link.invoice_id = ipiis.invoice_id AND link.is_delete = 0
+        LEFT JOIN ins_fee_follow_order fo ON fo.id = link.follow_id AND fo.is_delete = 0
+        LEFT JOIN esm_ins_company eic ON ipii.company_id = eic.id  AND eic.is_delete = 0
+        WHERE 1 = 1
+        <if test="settlementQueryVo.settlementIds != null and settlementQueryVo.settlementIds != ''">
+            AND ipiis.id IN
+            <foreach collection="settlementQueryVo.settlementIds" item="settlementId" open="(" separator="," close=")">
+                #{settlementId}
+            </foreach>
+        </if>
+        <if test="settlementQueryVo.invoiceTypes != null and settlementQueryVo.invoiceTypes != ''">
+            AND ipii.invoice_type IN
+            <foreach collection="settlementQueryVo.invoiceTypes" item="invoiceType" open="(" separator="," close=")">
+                #{invoiceType}
+            </foreach>
+        </if>
+        <if test="settlementQueryVo.companyId != null and settlementQueryVo.companyId != ''">
+            and io.company_id = #{settlementQueryVo.companyId}
+        </if>
+        <if test="settlementQueryVo.invoiceParty != null and settlementQueryVo.invoiceParty != ''">
+            and ipii.invoice_party = #{settlementQueryVo.invoiceParty}
+        </if>
+        <if test="settlementQueryVo.invoiceRiskType != null and settlementQueryVo.invoiceRiskType != ''">
+            and ipii.invoice_risk_type = #{settlementQueryVo.invoiceRiskType}
+        </if>
+        <if test="settlementQueryVo.status != null and settlementQueryVo.status != ''">
+            and ipii.status = #{settlementQueryVo.status}
+        </if>
+        <if test="settlementQueryVo.settlementPerson != null and settlementQueryVo.settlementPerson != ''">
+            and ipiis.create_by = #{settlementQueryVo.settlementPerson}
+        </if>
+        <if test="settlementQueryVo.invoiceId != null and settlementQueryVo.invoiceId != ''">
+            AND ipiis.invoice_id = #{settlementQueryVo.invoiceId}
+        </if>
+        <if test="settlementQueryVo.settlementId != null and settlementQueryVo.settlementId != ''">
+            AND ipiis.id = #{settlementQueryVo.settlementId}
+        </if>
+        <if test="settlementQueryVo.settlementDateStart != null and settlementQueryVo.settlementDateStart != ''">
+            and ipiis.create_time >= date(#{settlementQueryVo.settlementDateStart})
+        </if>
+        <if test="settlementQueryVo.settlementDateEndStr != null and settlementQueryVo.settlementDateEndStr != ''">
+            and ipiis.create_time &lt;= date(#{settlementQueryVo.settlementDateEndStr})
+        </if>
+        <if test="settlementQueryVo.settlementId != null and settlementQueryVo.settlementId != ''">
+            AND ipiis.id = #{settlementQueryVo.settlementId}
+        </if>
+        GROUP BY ipiis.id
+        order by ipiis.create_time desc
+    </select>
+
 <!--    <select id="getSuperviseSettlementExcelDtos" resultType="com.jzg.commons.entity.finance.dto.ExportSuperviseSettlementExcelDto">-->
 <!--        select-->
 <!--            ipiis.id as settlementId,-->
@@ -1131,6 +1198,7 @@
         SELECT count(id) AS count
         FROM ins_ply_income_invoice_link
         <where>
+            is_delete = 0
             <if test="invoicingVo.incomeIds != null and invoicingVo.incomeIds.size > 0">
                 AND income_id IN
                 <foreach collection="invoicingVo.incomeIds"
@@ -1195,8 +1263,7 @@
             eic.name_simple as companyNameSimple,
             sum( ipiis.actual_received_amount ) AS actual_received_amount,
             ipii.status,
-            ipii.payment_reason,
-            ipiis.settlementPaymentReason
+            ipii.payment_reason
         FROM
             ins_ply_income_invoice ipii
                 LEFT JOIN ins_ply_income_invoice_settlement ipiis ON ipii.id = ipiis.invoice_id