Ver Fonte

缺失功能:
平台协议应收-应收订单,没有批量结算功能

jiakai há 4 meses atrás
pai
commit
63c5728fb0

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

@@ -74,4 +74,7 @@ public class ExportSuperviseSettlementExcelDto {
     @Schema(description = "附件url")
     private String fileUrl;
 
+    @Schema(description = "订单号")
+    private String orderNo;
+
 }

+ 8 - 0
commons/src/main/java/com/jzg/commons/entity/finance/po/InsPlyIncome.java

@@ -206,6 +206,14 @@ public class InsPlyIncome extends BaseModel {
     @ExcelProperty("驾意跟单位是否已经结算")
     private String jyOtherSettlement;
 
+    @Schema(description = "平台协议车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议车险应收是否已经结算")
+    private String platformSuperviseSettlement;
+
+    @Schema(description = "平台协议非车险应收是否已经结算  0 未结算  1 结算")
+    @ExcelProperty("平台协议非车险应收是否已经结算")
+    private String platformOtherSettlement;
+
     @Schema(description = "维护人工号")
     @ExcelProperty("维护人工号")
     private String leaderId;

+ 22 - 0
commons/src/main/java/com/jzg/commons/entity/finance/vo/PlatformSettlementVo.java

@@ -0,0 +1,22 @@
+package com.jzg.commons.entity.finance.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+
+/**
+ * 结算Vo
+ */
+@Data
+@Schema(description = "平台结算Vo")
+public class PlatformSettlementVo {
+
+    @Schema(description = "结算Vo")
+    private SettlementVo settlementVo;
+
+    @Schema(description = "开票id")
+    private InvoicingVo invoicingVo;
+}

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

@@ -25,6 +25,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -194,7 +195,7 @@ public class ReceivableController {
     }
 
     @PostMapping("settlement")
-    @Operation(summary = "结算")
+    @Operation(summary = "私有协议结算")
     public HttpResult<String> settlement(@RequestBody SettlementVo settlementVo){
         try{
             boolean settlement = receivableService.settlement(settlementVo);
@@ -205,6 +206,25 @@ public class ReceivableController {
         }
     }
 
+    @PostMapping("platformSettlement")
+    @Operation(summary = "平台协议结算")
+    public HttpResult<String> platformSettlement(@RequestBody PlatformSettlementVo platformSettlementVo){
+        try{
+            boolean settlement = receivableService.platformSettlement(platformSettlementVo);
+            return settlement ? HttpResult.ok("结算成功") : HttpResult.error("结算失败");
+        }catch (Exception e){
+            log.error("结算失败",e);
+            return HttpResult.error(e.getMessage());
+        }
+    }
+
+    @PostMapping("getPlatformSettlementReceivableAmount")
+    @Operation(summary = "获取平台协议结算的应收金额")
+    public HttpResult<BigDecimal> getPlatformSettlementReceivableAmount(@RequestBody InvoicingVo invoicingVo){
+        BigDecimal receivableAmount = receivableService.getReceivableAmount(invoicingVo);
+        return HttpResult.ok(receivableAmount);
+    }
+
     @PostMapping("settlementList")
     @Operation(summary = "结算明细")
     public HttpResult  settlementList(@RequestSingleParam("invoiceId") String invoiceId){

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

@@ -321,4 +321,10 @@ public interface ReceivableService extends IService<InsPlyIncome> {
      */
     HttpResult<String> deleteIncomesByIds(List<Long> ids, String userName);
 
+    /**
+     * 平台结算
+     * @param platformSettlementVo
+     * @return
+     */
+    boolean platformSettlement(PlatformSettlementVo platformSettlementVo);
 }

+ 115 - 2
tenant/organization/src/main/java/com/jzg/organization/service/impl/ReceivableServiceImpl.java

@@ -603,6 +603,12 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
         } else if (invoiceType.equals("4")) {
             // 驾意险的总跟单费(jy_follow_premium)
             return jyFollowPremium;
+        } else if (invoiceType.equals("5")) {
+            // 交强的总手续费(jq_commission_premium) + 商业的总手续费(sy_commission_premium) + 交强的总跟单费(jq_follow_premium) + 商业的总跟单费(sy_follow_premium)
+            return jqCommissionPremium.add(syCommissionPremium).add(jqFollowPremium).add(syFollowPremium);
+        } else if (invoiceType.equals("6")) {
+            // 驾意险的总手续费(jy_commission_premium) + 驾意险的总跟单费(jy_follow_premium)
+            return jyCommissionPremium.add(jyFollowPremium);
         }
         return null;
     }
@@ -627,7 +633,7 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             //  开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
             if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
                 invoice.setInvoiceRiskType("10");
-            }else if("5".equals(invoicingVo.getInvoiceType())){
+            }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
                 invoice.setInvoiceRiskType("30");
             }else{
                 invoice.setInvoiceRiskType("20");
@@ -700,12 +706,116 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                         .in(InsPlyIncome::getId, invoiceIds)
                         .set(InsPlyIncome::getJyOtherSettlement, "1"));
                 break;
+            case "5":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId, invoiceIds)
+                        .set(InsPlyIncome::getPlatformSuperviseSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                break;
+            case "6":
+                result = baseMapper.update(new LambdaUpdateWrapper<InsPlyIncome>()
+                        .in(InsPlyIncome::getId, invoiceIds)
+                        .set(InsPlyIncome::getPlatformOtherSettlement, "1").set(InsPlyIncome::getSettlementStatus, "1"));
+                break;
             default:
                 result = 0;
         }
         return result > 0;
     }
 
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public boolean platformSettlement(PlatformSettlementVo platformSettlementVo) {
+        SettlementVo settlementVo = platformSettlementVo.getSettlementVo();
+        InvoicingVo invoicingVo = platformSettlementVo.getInvoicingVo();
+
+        log.info("平台结算:platformSettlement=[{}]", JSONUtil.toJsonStr(platformSettlementVo));
+        try {
+            // ============================开票逻辑============================
+            invoicingVo.setReceivablePremium(this.getReceivableAmount(invoicingVo));
+
+            InvoiceingResult result = new InvoiceingResult();
+            InsPlyIncomeInvoice invoice = new InsPlyIncomeInvoice();
+            invoice.setId(IdGenerate.nextId());
+            invoice.setCompanyId(invoicingVo.getCompanyId());
+            invoice.setInvoiceType(invoicingVo.getInvoiceType());
+            //  开票类型  1、手续费  2、跟单费  3、驾意险手续费 4、驾意险跟单费 5、平台应收-车险 6、平台应收-非车险
+            if("1".equals(invoicingVo.getInvoiceType()) || "2".equals(invoicingVo.getInvoiceType())){
+                invoice.setInvoiceRiskType("10");
+            }else if("5".equals(invoicingVo.getInvoiceType()) || "6".equals(invoicingVo.getInvoiceType())){
+                invoice.setInvoiceRiskType("30");
+            }else{
+                invoice.setInvoiceRiskType("20");
+            }
+            invoice.setInvoiceParty(invoicingVo.getInvoiceParty());
+            invoice.setOverinflatedAmount(invoicingVo.getOverinflatedAmount());
+            invoice.setReceivableSupervisePremium(invoicingVo.getReceivablePremium());
+            invoice.setTaxPoint(invoicingVo.getTaxPoint());
+
+            List<InsPlyIncomeInvoiceLink> invoicingLinkList = new ArrayList();
+
+            invoicingVo.getIncomeIds().forEach(incomeId -> {
+                InsPlyIncomeInvoiceLink link = new InsPlyIncomeInvoiceLink();
+                link.setId(IdGenerate.nextId());
+                link.setInvoiceId(invoice.getId());
+                link.setIncomeId(incomeId);
+                link.setInvoiceType(invoicingVo.getInvoiceType());
+                invoicingLinkList.add(link);
+            });
+            insPlyIncomeInvoiceLinkMapper.insert(invoicingLinkList);
+            result.setInvoiceId(invoice.getId());
+            result.setSumPrice(null != invoicingVo.getReceivablePremium() ? invoicingVo.getReceivablePremium().toString() : null);
+
+            // ============================结算逻辑============================
+            // 实际已经收了的金额
+            BigDecimal actualReceivedAmount = this.getInvoicingAmount(settlementVo.getInvoicingId());
+
+            // 所有需要结算的金额
+            BigDecimal allToSettlement = invoice.getReceivableSupervisePremium().add(invoice.getOverinflatedAmount());
+            // 剩余的金额
+            BigDecimal surplusPremium = allToSettlement.subtract(actualReceivedAmount);
+            log.info("invoiceId=[{}],一共需要结算的金额[{}],实际已经结算的金额[{}],本次计划结算的金额[{}]",
+                    settlementVo.getInvoicingId(), allToSettlement,actualReceivedAmount,settlementVo.getActualReceivedAmount());
+            // 校验是否超出了剩余的金额
+            AssertionUtils.isFail(surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) < 0, "已超出应收金额,请核对!");
+
+            // 处理结算数据
+            // 未完全结算完成
+            InsPlyIncomeInvoiceSettlement settlement = new InsPlyIncomeInvoiceSettlement(invoice.getId(), settlementVo.getActualReceivedAmount(),
+                    DateTime.now(), settlementVo.getPaymentDifference(), settlementVo.getPaymentReason());
+            insPlyIncomeInvoiceSettlementMapper.insert(settlement);
+
+            if (CollectionUtils.isNotEmpty(settlementVo.getAttachmentIds())) {
+                // 添加发票附件
+                List<InsPlyIncomeInvoiceSettlementFile> files = new ArrayList<>();
+                for (String fileId : settlementVo.getAttachmentIds()) {
+                    InsPlyIncomeInvoiceSettlementFile file = new InsPlyIncomeInvoiceSettlementFile();
+                    file.setId(IdGenerate.nextId());
+                    file.setSettlementId(settlement.getId());
+                    file.setFileId(fileId);
+                    files.add(file);
+                }
+                insPlyIncomeInvoiceSettlementFileMapper.insert(files);
+            }
+
+            // 判断是否已经结算完成
+            if (surplusPremium.compareTo(settlementVo.getActualReceivedAmount()) == 0) {
+                log.info("序号为[{}]的发票已经结算完成",invoice.getId());
+                // 更新发票状态
+                invoice.setStatus("1");
+                insPlyIncomeInvoiceMapper.insert(invoice);
+                // 判断是需要更新哪个字段
+                this.updateIncomeSettlementStatus(invoice.getInvoiceType(), invoicingVo.getIncomeIds());
+            }else{
+                log.info("invoiceId=[{}], 还剩[{}]钱没有结算",settlementVo.getInvoicingId(), surplusPremium.subtract(settlementVo.getActualReceivedAmount()));
+            }
+            return true;
+        } catch (Exception e) {
+            log.error("平台结算异常. settlementVo=[{}]",JSONUtil.toJsonStr(settlementVo), e);
+            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
+            throw new RuntimeException(e.getMessage());
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public boolean settlement(SettlementVo settlementVo) {
@@ -1089,7 +1199,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
             // 数据库已存在 → 继续后续校验
             // 判断已开票 / 已结算
             if ("1".equals(existIncome.getSuperviseSettlement()) || "1".equals(existIncome.getOtherSettlement())
-                    || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())) {
+                    || "1".equals(existIncome.getJySuperviseSettlement()) || "1".equals(existIncome.getJyOtherSettlement())
+                    || "1".equals(existIncome.getPlatformSuperviseSettlement()) || "1".equals(existIncome.getPlatformOtherSettlement())) {
                 failedNumber++;
                 vo.setErrorMessage("应收数据已结算");
                 failedExcel.add(vo);
@@ -1459,6 +1570,8 @@ public class ReceivableServiceImpl extends ServiceImpl<ReceivableMapper, InsPlyI
                 case "2" -> dto.setInvoiceType("跟单费");
                 case "3" -> dto.setInvoiceType("驾意险手续费");
                 case "4" -> dto.setInvoiceType("驾意险跟单费");
+                case "5" -> dto.setInvoiceType("平台协议车险应收");
+                case "6" -> dto.setInvoiceType("平台协议非车险应收");
             }
             dto.setInvoiceTypeName(Constant.invoiceRiskTypeMap.get(Objects.toString(dto.getInvoiceType())));
             LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile> wrapper = new LambdaQueryWrapper<InsPlyIncomeInvoiceSettlementFile>();

+ 1 - 0
tenant/organization/src/main/resources/mapper/ReceivableMapper.xml

@@ -510,6 +510,7 @@
         ipii.invoice_type,
         ipii.invoice_party,
         ipii.tax_point,
+        ipi.order_no as orderNo,
         ipiis.actual_received_amount,
         ipiis.receive_payment_date,
         ipiis.create_by ,