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

私有协议-开票记录

1. 查询条件完善
2. 展示字段完善
lipf 4 месяцев назад
Родитель
Сommit
7c82345ab7

+ 18 - 2
commons/src/main/java/com/jzg/commons/entity/Constant.java

@@ -10,9 +10,8 @@ import java.util.Map;
  */
 public class Constant {
 
-
+    // 业务员类型
     public static final Map<String, String> ywyAttrTypeMap = new HashMap<>();
-
     static {
         ywyAttrTypeMap.put("5","团队");
         ywyAttrTypeMap.put("6","个代");
@@ -21,4 +20,21 @@ public class Constant {
     }
 
 
+    // 结算状态
+    public static final Map<String, String> settlementStatusMap = new HashMap<>();
+    static {
+        settlementStatusMap.put("0","未结算");
+        settlementStatusMap.put("1","已结算");
+        settlementStatusMap.put("30","全部");
+    }
+
+    // 应收项
+    public static final Map<String, String> invoiceRiskTypeMap = new HashMap<>();
+    static {
+        invoiceRiskTypeMap.put("10","车险");
+        invoiceRiskTypeMap.put("20","非车险");
+        invoiceRiskTypeMap.put("30","全部");
+    }
+
+
 }

+ 14 - 0
commons/src/main/java/com/jzg/commons/entity/finance/dto/ExportSuperviseSettlementExcelDto.java

@@ -18,10 +18,20 @@ public class ExportSuperviseSettlementExcelDto {
     @ExcelProperty(value = "结算记录编号")
     private String settlementId;
 
+    @Schema(description = "结算状态")
+    private String settlementStatus;
+
+    // 结算状态转义
+    @Schema(description = "结算状态")
+    private String settlementStatusName;
+
     @Schema(description = "保险公司")
     @ExcelProperty(value = "保险公司")
     private String companyName;
 
+    @Schema(description = "保险公司序号")
+    private String companyId;
+
     @Schema(description = "开票方")
     @ExcelProperty(value = "开票方")
     private String invoiceParty;
@@ -30,6 +40,10 @@ public class ExportSuperviseSettlementExcelDto {
     @ExcelProperty(value = "应收项")
     private String invoiceType;
 
+    // 应收项转义
+    @Schema(description = "应收项")
+    private String invoiceTypeName;
+
     @Schema(description = "税点")
     @ExcelProperty(value = "税点")
     private String taxPoint;

+ 17 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncomeInvoice.java

@@ -4,11 +4,14 @@ import com.jzg.commons.core.base.BaseModel;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
 
+import java.io.Serial;
 import java.math.BigDecimal;
 
 @Data
 @Schema(description = "财务应收开票表")
 public class InsPlyIncomeInvoice extends BaseModel {
+    @Serial
+    private static final long serialVersionUID = -3532430480398453542L;
     private String id;
 
     @Schema(description = "保司id")
@@ -23,9 +26,23 @@ public class InsPlyIncomeInvoice extends BaseModel {
     @Schema(description = "虚增金额")
     private BigDecimal overinflatedAmount;
 
+    public BigDecimal getOverinflatedAmount(){
+        if(this.overinflatedAmount == null){
+            return BigDecimal.ZERO;
+        }
+        return this.overinflatedAmount;
+    }
+
     @Schema(description = "应收费用")
     private BigDecimal receivableSupervisePremium;
 
+    public BigDecimal getReceivableSupervisePremium(){
+        if(this.receivableSupervisePremium == null){
+            return BigDecimal.ZERO;
+        }
+        return this.receivableSupervisePremium;
+    }
+
     @Schema(description = "税点")
     private String taxPoint;
 

+ 34 - 3
commons/src/main/java/com/jzg/commons/entity/finance/vo/InvoiceRecordResult.java

@@ -3,6 +3,8 @@ package com.jzg.commons.entity.finance.vo;
 import com.jzg.commons.core.base.PageRequest;
 import lombok.Data;
 
+import java.math.BigDecimal;
+
 @Data
 public class InvoiceRecordResult extends PageRequest {
 
@@ -29,17 +31,27 @@ public class InvoiceRecordResult extends PageRequest {
     /**
      * 虚增金额
      */
-    private String overinflatedAmount;
+    private BigDecimal overinflatedAmount;
 
     /**
-     * 应收项
+     * 应收项(转义)
+     * 保留这个是为了兼容之前的功能
      */
     private String accountsReceivable;
 
+    /**
+     * 应收项的编码
+     */
+    private String invoiceRiskType;
+
+    /**
+     * 应收项的转义(新增的,之前用的是accountsReceivable)
+     */
+    private String invoiceRiskTypeName;
     /**
      * 应收费用
      */
-    private String receivableSupervisePremium;
+    private BigDecimal receivableSupervisePremium;
 
     /**
      * 开票金额
@@ -56,6 +68,25 @@ public class InvoiceRecordResult extends PageRequest {
      */
     private String settlementStatus;
 
+    /**
+     * 已结算金额
+     */
+    private BigDecimal settlementAmount;
+    /**
+     * 待结算金额
+     */
+    private BigDecimal remainSettlementAmount;
+
+    /**
+     * 数据库表中的status字段(结算状态)
+     */
+    private String status;
+
+    /**
+     * 结算状态(根据status转移得到的)
+     */
+    private String settlementStatusName;
+
     /**
      * 开票人
      */

+ 24 - 1
commons/src/main/java/com/jzg/commons/entity/finance/vo/SettlementQueryVo.java

@@ -1,5 +1,6 @@
 package com.jzg.commons.entity.finance.vo;
 
+import cn.hutool.core.util.StrUtil;
 import com.jzg.commons.core.base.PageRequest;
 import io.swagger.v3.oas.annotations.media.Schema;
 import lombok.Data;
@@ -24,6 +25,28 @@ public class SettlementQueryVo extends PageRequest {
     @Schema(description = "保险公司Id")
     private String companyId;
 
+    @Schema(description = "应收项")
+    private String invoiceRiskType;
+
+    @Schema(description = "结算状态")
+    private String settlementStatus;
+
+    @Schema(description = "结算用户")
+    private String settlementPerson;
+
+    @Schema(description = "结算日期-开始日期")
+    private String settlementDateStart;
+
+    @Schema(description = "结算日期-结束日期")
+    private String settlementDateEnd;
+
+    private String getSettlementDateEndStr(){
+        if(StrUtil.isEmpty(this.settlementDateEnd)){
+            return null;
+        }
+        return this.settlementDateEnd +" 23:59:59";
+    }
+
     @Schema(description = "开票方")
     private String invoiceParty;
 
@@ -31,7 +54,7 @@ public class SettlementQueryVo extends PageRequest {
     private String status;
 
     @Schema(description = "结算人")
-    private String settlementPerson;
+    private String invoicePerson;
 
     @Schema(description = "结算时间开始")
     private String settlementTimeStart;

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

@@ -254,7 +254,7 @@ public class ReceivableController {
     @DeleteMapping("/deleteInvoiceById/{id}")
     @Operation(summary = "删除开票记录")
     public HttpResult<Boolean> deleteInvoiceById(@PathVariable String id){
-        return HttpResult.ok(receivableService.deleteInvoiceById(id));
+        return HttpResult.ok(receivableService.deleteInvoiceById(id) ? "删除成功":"删除失败");
     }
 
 //    @PostMapping("batchModify")

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

@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.jzg.commons.entity.finance.dto.*;
 import com.jzg.commons.entity.finance.po.InsPlyIncome;
+import com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordQueryVo;
 import com.jzg.commons.entity.finance.vo.InvoiceRecordResult;
 import com.jzg.commons.entity.finance.vo.InvoicingVo;
@@ -19,6 +20,14 @@ import java.util.List;
 @Mapper
 public interface ReceivableMapper extends BaseMapper<InsPlyIncome> {
 
+    /**
+     * 根据发票序号查询结算明细
+     *
+     * @author lipf
+     * @date 2026/5/15 10:57
+     */
+    List<InsPlyIncomeInvoiceSettlement> queryInvoiceSettlementByInvoiceId(@Param("invoiceId") String invoiceId);
+
     /**
      * 获取已审核的订单
      * @param orderNo

+ 67 - 6
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -379,6 +379,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
     @Override
     public Boolean deleteInvoiceById(String id) {
+        log.info("私有协议-开票记录-删除: id=[{}]",id);
         return insPlyIncomeInvoiceMapper.deleteById(id) > 0;
     }
 
@@ -523,19 +524,21 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public BigDecimal getInvoicingAmount(String invoicingId) {
         BigDecimal ctualReceivedAmount = new BigDecimal(BigInteger.ZERO);
-
         // 获取票据的实际收款金额
         List<InsPlyIncomeInvoiceSettlement> insPlyIncomeInvoiceSettlements = insPlyIncomeInvoiceSettlementMapper.selectList(new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlement>()
                 .eq(InsPlyIncomeInvoiceSettlement::getInvoiceId, invoicingId));
         for (InsPlyIncomeInvoiceSettlement settlement : insPlyIncomeInvoiceSettlements) {
             ctualReceivedAmount = ctualReceivedAmount.add(new BigDecimal(settlement.getActualReceivedAmount()));
         }
-
         return ctualReceivedAmount;
     }
 
     @Override
     public boolean updateIncomeSettlementStatus(String invoiceType, List<String> invoiceIds) {
+        log.info("更新结算状态: invoiceType=[{}],invoiceIds=[{}]",  invoiceType, JSONUtil.toJsonStr(invoiceIds));
+        if(CollUtil.isEmpty(invoiceIds)) {
+            return false;
+        }
         long result = 0;
         switch (invoiceType) {
             case "1":
@@ -572,13 +575,15 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             // 获取应收的金额
             InsPlyIncomeInvoice insPlyIncomeInvoice = insPlyIncomeInvoiceMapper.selectById(settlementVo.getInvoicingId());
             AssertionUtils.isFail(Objects.isNull(insPlyIncomeInvoice), "发票数据不存在");
-
             // 实际已经收的了金额
             BigDecimal ctualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
 
+            // 所有需要结算的金额
+            BigDecimal allToSettlement = insPlyIncomeInvoice.getReceivableSupervisePremium().add(insPlyIncomeInvoice.getOverinflatedAmount());
             // 剩余的金额
-            BigDecimal surplusPremium = insPlyIncomeInvoice.getReceivableSupervisePremium().subtract(ctualReceivedAmount);
-            log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",settlementVo.getInvoicingId(), insPlyIncomeInvoice.getReceivableSupervisePremium(),ctualReceivedAmount.toString(),settlementVo.getActualReceivedAmount());
+            BigDecimal surplusPremium = allToSettlement.subtract(ctualReceivedAmount);
+            log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
+                    settlementVo.getInvoicingId(), allToSettlement,ctualReceivedAmount,settlementVo.getActualReceivedAmount());
             // 校验是否超出了剩余的金额
             AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
 
@@ -602,6 +607,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
 
             // 判断是否已经结算完成
             if (surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) == 0) {
+                log.info("序号为[{}]的发票已经结算完成",insPlyIncomeInvoice.getId());
                 // 更新发票状态
                 insPlyIncomeInvoice.setStatus("1");
                 insPlyIncomeInvoiceMapper.updateById(insPlyIncomeInvoice);
@@ -1165,7 +1171,45 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
     @Override
     public Page<InvoiceRecordResult> getInvoiceRecordList(InvoiceRecordQueryVo invoiceRecordQueryVo) {
         log.info("手续费应收-开票记录-查询:invoiceRecordQueryVo=[{}]", JSONUtil.toJsonStr(invoiceRecordQueryVo));
-        return baseMapper.getInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
+
+        // 将前端的全部转换为空
+        // 开票方
+        if("30".equals(invoiceRecordQueryVo.getInvoiceParty())){
+            invoiceRecordQueryVo.setInvoiceParty(null);
+        }
+        // 应收项(车险/非车险)
+        if("30".equals(invoiceRecordQueryVo.getAccountsReceivable())){
+            invoiceRecordQueryVo.setAccountsReceivable(null);
+        }
+        // 结算状态
+        if("30".equals(invoiceRecordQueryVo.getSettlementStatus())){
+            invoiceRecordQueryVo.setSettlementStatus(null);
+        }
+        Page<InvoiceRecordResult> invoiceRecordList = baseMapper.getInvoiceRecordList(invoiceRecordQueryVo.getPage(), invoiceRecordQueryVo);
+        List<InvoiceRecordResult> records = invoiceRecordList.getRecords();
+        if(CollUtil.isNotEmpty(records)){
+            records = records.stream().peek(action->{
+                String settlementStatusName = Constant.settlementStatusMap.get(Objects.toString(action.getStatus(),""));
+                action.setSettlementStatusName(settlementStatusName);
+                String invoiceRiskTypeName = Constant.invoiceRiskTypeMap.get(Objects.toString(action.getInvoiceRiskType(), ""));
+                action.setAccountsReceivable(invoiceRiskTypeName);
+                action.setInvoiceRiskTypeName(invoiceRiskTypeName);
+                List<InsPlyIncomeInvoiceSettlement> insPlyIncomeInvoiceSettlements = baseMapper.queryInvoiceSettlementByInvoiceId(action.getId());
+                BigDecimal settlementAmount = insPlyIncomeInvoiceSettlements.stream()
+                        .map(InsPlyIncomeInvoiceSettlement::getActualReceivedAmount)
+                        .filter(Objects::nonNull).map(BigDecimal::new)
+                        .reduce(BigDecimal.ZERO, BigDecimal::add);
+                BigDecimal receivableSupervisePremium = action.getReceivableSupervisePremium()  != null ? action.getReceivableSupervisePremium(): BigDecimal.ZERO;
+                BigDecimal overinflatedAmount = action.getOverinflatedAmount() != null? action.getOverinflatedAmount(): BigDecimal.ZERO;
+                BigDecimal remainSettlementAmount = receivableSupervisePremium.add(overinflatedAmount).subtract(settlementAmount);
+                // 设置已结算的金额
+                action.setSettlementAmount(settlementAmount);
+                // 设置待结算金额
+                action.setRemainSettlementAmount(remainSettlementAmount);
+            }).toList();
+            invoiceRecordList.setRecords(records);
+        }
+        return invoiceRecordList;
     }
 
     @Override
@@ -1249,6 +1293,22 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
      */
     @Override
     public Page<ExportSuperviseSettlementExcelDto> superviseSettlementExcel(Page page, SettlementQueryVo settlementQueryVo) {
+        log.info("查询结算手续费结算记录:settlementQueryVo=[{}]", JSONUtil.toJsonStr(settlementQueryVo));
+        if("30".equals(settlementQueryVo.getInvoiceParty())){
+            settlementQueryVo.setInvoiceParty(null);
+        }
+        if("30".equals(settlementQueryVo.getInvoiceRiskType())){
+            settlementQueryVo.setInvoiceRiskType(null);
+        }
+        if("30".equals(settlementQueryVo.getStatus())){
+            settlementQueryVo.setStatus(null);
+        }
+//        if("30".equals(settlementQueryVo.getAccountsReceivable())){
+//            settlementQueryVo.setAccountsReceivable(null);
+//        }
+//        if("accountsReceivable"){
+//
+//        }
         Page<ExportSuperviseSettlementExcelDto> exportSuperviseSettlementExcelDtos = baseMapper.superviseSettlementExcelDtos(page, settlementQueryVo);
         exportSuperviseSettlementExcelDtos.getRecords().forEach(dto -> {
             if (dto.getInvoiceParty().equals("1")) {
@@ -1262,6 +1322,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 case "3" -> dto.setInvoiceType("驾意险手续费");
                 case "4" -> dto.setInvoiceType("驾意险跟单费");
             }
+            dto.setInvoiceTypeName(Constant.invoiceRiskTypeMap.get(Objects.toString(dto.getInvoiceType())));
             SysUploadFiles file = sysUploadFilesMapper.selectById(dto.getFileId());
             if (file != null) {
                 dto.setFileUrl(MinioUtils.getPresignedObjectUrl("jzg", file.getFileName()));

+ 46 - 4
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -501,7 +501,8 @@
         select
         ipiis.id as settlementId,
         ipiis.invoice_id as invoiceId,
-        io.company_name as companyName,
+        io.company_id,
+        io.company_name,
         ipii.invoice_type as invoiceType,
         ipii.invoice_party as invoiceParty,
         ipii.tax_point as taxPoint,
@@ -532,8 +533,38 @@
                 #{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.agreementType != null and settlementQueryVo.agreementType != ''">
-            AND agree.agreement_type = #{settlementQueryVo.agreementType}
+            AND (agree.agreement_type = #{settlementQueryVo.agreementType} or agree.agreement_type is null)
+        </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>
     </select>
 
@@ -1020,6 +1051,8 @@
             ipii.id,
             ipii.company_id,
             ipii.invoice_type,
+            -- 应收项
+            ipii.invoice_risk_type,
             CASE
                 WHEN ipii.invoice_party = '1' THEN
                     '我方开票' ELSE '保司开票'
@@ -1033,8 +1066,9 @@
             ipii.update_by,
             eic.name as company_name,
             sum( ipiis.actual_received_amount ) AS actual_received_amount,
+            ipii.status,
             CASE
-                WHEN ipii.receivable_supervise_premium = SUM( ipiis.actual_received_amount ) THEN
+                WHEN ifnull(ipii.receivable_supervise_premium,0)  + ifnull(ipii.overinflated_amount,0) = SUM( ipiis.actual_received_amount ) THEN
                     '已结清' ELSE '已开票未结算'
                 END AS settlement_status
         FROM
@@ -1046,6 +1080,9 @@
         <if test="invoiceRecordQueryVo.invoiceType != null and invoiceRecordQueryVo.invoiceType != ''">
             AND ipii.invoice_type = #{invoiceRecordQueryVo.invoiceType}
         </if>
+        <if test="invoiceRecordQueryVo.accountsReceivable != null and invoiceRecordQueryVo.accountsReceivable != ''">
+            AND ipii.invoice_risk_type = #{invoiceRecordQueryVo.accountsReceivable}
+        </if>
         <if test="invoiceRecordQueryVo.recordId != null and invoiceRecordQueryVo.recordId != ''">
             AND ipii.id = #{invoiceRecordQueryVo.recordId}
         </if>
@@ -1316,8 +1353,13 @@
             ipi.contact_person,
             ipi.company_name
     </select>
+    <!-- 根据发票序号查询结算明细 lipf 2026年5月15日10:58:36 -->
+    <select id="queryInvoiceSettlementByInvoiceId"
+            resultType="com.jzg.commons.entity.finance.po.InsPlyIncomeInvoiceSettlement">
+        select * from ins_ply_income_invoice_settlement ipiis where ipiis.invoice_id = #{invoiceId}
+    </select>
 
-<!--    <select id="getReceivableList" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">-->
+    <!--    <select id="getReceivableList" resultType="com.jzg.commons.entity.finance.po.InsPlyIncome">-->
 <!--        SELECT-->
 <!--            ipi.*,-->
 <!--            io.signing_time,-->