Jelajahi Sumber

财务 应收管理

785834757 2 tahun lalu
induk
melakukan
9567a6846e

+ 11 - 6
src/main/java/com/ydtech/modules/inv/controller/InvReceivableController.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.core.page.PageResult;
 import com.ydtech.modules.base.controller.BaseController;
+import com.ydtech.modules.esm.model.EsmInsCompany;
 import com.ydtech.modules.inv.model.po.InvChannelAccount;
 import com.ydtech.modules.inv.model.po.InvSettlementSource;
 import com.ydtech.modules.inv.model.po.InvSource;
@@ -75,13 +76,13 @@ public class InvReceivableController extends BaseController {
 
     @ApiOperation("应收结果")
     @GetMapping("receivableResult")
-    public HttpResult<BasePageResult<ReceivableResultVo>> receivableResult(String yearMonthStr){
+    public HttpResult<BasePageResult<ReceivableResultVo>> receivableResult(String yearMonthStr,String insuranceId){
         // 获取当前年月
         DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
         YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
         // 获取当前月份的最大天数
         int maxDaysInMonth = yearMonth.lengthOfMonth();
-        List<ReceivableResultVo> invChannelAccountList = invReceivableService.getReceivableList(yearMonth.toString() + "-01",yearMonth.toString() + "-" + String.valueOf(maxDaysInMonth));
+        List<ReceivableResultVo> invChannelAccountList = invReceivableService.getReceivableList(yearMonth.toString() + "-01",yearMonth.toString() + "-" + String.valueOf(maxDaysInMonth),insuranceId);
         BasePageResult<ReceivableResultVo> invChannelAccountBasePageResult = new BasePageResult<>(0, 0, 0, 0, invChannelAccountList);
         return HttpResult.ok(invChannelAccountBasePageResult);
     }
@@ -99,11 +100,9 @@ public class InvReceivableController extends BaseController {
 
     @ApiOperation("结算日期结算来源表")
     @GetMapping("settlementSourceResult")
-    public HttpResult<BasePageResult<SettlementSourceResultVo>> settlementSourceResult(String yearMonthStr){
+    public HttpResult<BasePageResult<SettlementSourceResultVo>> settlementSourceResult(String yearMonthStr,String insuranceId){
         // 获取当前年月
-        String startMonth = yearMonthStr + "-01-01";
-        String endMonth = yearMonthStr + "-12-31";
-        List<SettlementSourceResultVo> invChannelAccountList = invReceivableService.getSettlementSourceResult(yearMonthStr,startMonth,endMonth);
+        List<SettlementSourceResultVo> invChannelAccountList = invReceivableService.getSettlementSourceResult(yearMonthStr,insuranceId);
         BasePageResult<SettlementSourceResultVo> invChannelAccountBasePageResult = new BasePageResult<>(0, 0, 0, 0, invChannelAccountList);
         return HttpResult.ok(invChannelAccountBasePageResult);
     }
@@ -115,5 +114,11 @@ public class InvReceivableController extends BaseController {
         return HttpResult.ok("同步成功,共同步" + i + "条数据");
     }
 
+    @ApiOperation("获取保险公司")
+    @GetMapping("getInsureCompany")
+    public HttpResult getInsureCompany(){
+        List<EsmInsCompany> insureCompany = invReceivableService.getInsureCompany();
+        return HttpResult.ok(insureCompany);
+    }
 
 }

+ 7 - 1
src/main/java/com/ydtech/modules/inv/controller/InvSettlementSourController.java

@@ -1,6 +1,7 @@
 package com.ydtech.modules.inv.controller;
 
 import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.inv.service.InvReceivableService;
 import com.ydtech.modules.inv.service.InvSettlementSourceService;
 import io.swagger.annotations.Api;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -19,6 +20,9 @@ public class InvSettlementSourController {
     @Autowired
     private InvSettlementSourceService invSettlementSourceService;
 
+    @Autowired
+    private InvReceivableService invReceivableService;
+
     private static String concatenateWithSlash(String[] array) {
         StringBuilder result = new StringBuilder();
 
@@ -51,6 +55,8 @@ public class InvSettlementSourController {
         int index = findIndex(pathSegments,"upload");
         String[] subarray = Arrays.copyOfRange(pathSegments, index+1, pathSegments.length);
         String filename = concatenateWithSlash(subarray);
-        return invSettlementSourceService.readInvSettlementSourceExcel(filename);
+        HttpResult httpResult = invSettlementSourceService.readInvSettlementSourceExcel(filename);
+        invReceivableService.syncStatus();
+        return httpResult;
     }
 }

+ 7 - 1
src/main/java/com/ydtech/modules/inv/controller/InvSourceController.java

@@ -3,6 +3,7 @@ package com.ydtech.modules.inv.controller;
 import com.ydtech.core.page.HttpResult;
 import com.ydtech.modules.inv.model.excel.InvSourceExcel;
 import com.ydtech.modules.inv.model.po.InvSource;
+import com.ydtech.modules.inv.service.InvReceivableService;
 import com.ydtech.modules.inv.service.InvSourceService;
 import com.ydtech.modules.inv.utils.EasyExcelUtils;
 import io.swagger.annotations.Api;
@@ -22,6 +23,9 @@ public class InvSourceController {
     @Autowired
     private InvSourceService invSourceService;
 
+    @Autowired
+    private InvReceivableService invReceivableService;
+
     private static String concatenateWithSlash(String[] array) {
         StringBuilder result = new StringBuilder();
 
@@ -53,6 +57,8 @@ public class InvSourceController {
         int index = findIndex(pathSegments,"upload");
         String[] subarray = Arrays.copyOfRange(pathSegments, index+1, pathSegments.length);
         String filename = concatenateWithSlash(subarray);
-       return invSourceService.readExcel(filename);
+        HttpResult httpResult = invSourceService.readExcel(filename);
+        invReceivableService.syncStatus();
+        return httpResult;
     }
 }

+ 13 - 2
src/main/java/com/ydtech/modules/inv/dao/InvReceivableMapper.java

@@ -1,11 +1,14 @@
 package com.ydtech.modules.inv.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.ydtech.modules.esm.model.EsmInsCompany;
 import com.ydtech.modules.inv.model.po.InvChannelAccount;
 import com.ydtech.modules.inv.model.vo.ReceivableResultVo;
+import com.ydtech.modules.inv.model.vo.SettlementSourceDataVo;
 import com.ydtech.modules.inv.model.vo.SettlementSourceResultVo;
 import com.ydtech.modules.inv.model.vo.SigningSourceResultVo;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -15,11 +18,19 @@ import java.util.List;
 * @Entity com.ydtech.modules.inv.model.po.InvChannelAccount
 */
 public interface InvReceivableMapper extends BaseMapper<InvChannelAccount> {
-    List<ReceivableResultVo> getReceivableList(String startTime, String endTime);
+    List<ReceivableResultVo> getReceivableList(String startTime, String endTime,String insuranceId);
 
     List<SigningSourceResultVo> getSigningSourceResult(String startTime, String endTime);
 
-    List<SettlementSourceResultVo> getSettlementSourceResult(String startTime, String endTime);
+    List<SigningSourceResultVo> getSigningSourceDayResult(String startTime, String endTime,String insuranceId);
+
+    List<SettlementSourceDataVo> getSettlementSourceResult(String signDate,String startTime, String endTime, String insuranceId);
+
+    List<EsmInsCompany> getInsureCompany();
+
+    List<HashMap> getMaxReceivable(String startTime,String endTime);
+
+    List<HashMap> getUnsettledProfitCalculation(String startTime,String endTime);
 }
 
 

+ 3 - 0
src/main/java/com/ydtech/modules/inv/model/po/InvChannelAccount.java

@@ -23,6 +23,9 @@ public class InvChannelAccount implements Serializable {
     @TableField(value = "employee_id")
     private String employeeId;
 
+    @TableField(value = "channel_name")
+    private String channelName;
+
     /**
      * 编号
      */

+ 7 - 1
src/main/java/com/ydtech/modules/inv/model/po/InvSettlementSource.java

@@ -71,11 +71,17 @@ public class InvSettlementSource implements Serializable {
     @ApiModelProperty("被保险人")
     private String insuredName;
 
+    /**
+     * 保司编码
+     */
+    @TableField(value = "insurance_id")
+    @ApiModelProperty("保司编码")
+    private String insuranceId;
     /**
      * 保险公司
      */
     @TableField(value = "insurance_company")
-    @ApiModelProperty("险种")
+    @ApiModelProperty("保险公司")
     private String insuranceCompany;
 
     /**

+ 5 - 0
src/main/java/com/ydtech/modules/inv/model/po/QueryInvChannelAccount.java

@@ -45,6 +45,11 @@ public class QueryInvChannelAccount extends PageRequest implements Serializable
      */
     private String group;
 
+    /**
+     * 渠道名称
+     */
+    private String channelName;
+
     /**
      * 组员
      */

+ 10 - 3
src/main/java/com/ydtech/modules/inv/model/vo/InvSettlementSourceQueryVo.java

@@ -53,7 +53,7 @@ public class InvSettlementSourceQueryVo extends PageRequest implements Serializa
     @TableField(value = "sign_date")
     @ApiModelProperty("签单日期")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate signDate;
+    private String signDate;
 
     /**
      * 车牌号
@@ -69,11 +69,18 @@ public class InvSettlementSourceQueryVo extends PageRequest implements Serializa
     @ApiModelProperty("被保险人")
     private String insuredName;
 
+    /**
+     * 保司编码
+     */
+    @TableField(value = "insurance_id")
+    @ApiModelProperty("保司编码")
+    private String insuranceId;
+
     /**
      * 保险公司
      */
     @TableField(value = "insurance_company")
-    @ApiModelProperty("险种")
+    @ApiModelProperty("保险公司")
     private String insuranceCompany;
 
     /**
@@ -173,7 +180,7 @@ public class InvSettlementSourceQueryVo extends PageRequest implements Serializa
     @TableField(value = "agency_settlement_time")
     @ApiModelProperty("代理结算时间")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate agencySettlementTime;
+    private String agencySettlementTime;
 
     @TableField(exist = false)
     private static final long serialVersionUID = 1L;

+ 2 - 2
src/main/java/com/ydtech/modules/inv/model/vo/InvSourceQueryVo.java

@@ -33,7 +33,7 @@ public class InvSourceQueryVo extends PageRequest implements Serializable {
      */
     @TableField(value = "insurance_id")
     @ApiModelProperty("保司编码")
-    private Long insuranceId;
+    private String insuranceId;
 
 
     /**
@@ -147,7 +147,7 @@ public class InvSourceQueryVo extends PageRequest implements Serializable {
     @TableField(value = "signing_time")
     @ApiModelProperty("出单日期")
     @JsonFormat(pattern = "yyyy-MM-dd")
-    private LocalDate signingTime;
+    private String signingTime;
 
     /**
      * 结算日期

+ 30 - 0
src/main/java/com/ydtech/modules/inv/model/vo/SettlementSourceDataVo.java

@@ -0,0 +1,30 @@
+package com.ydtech.modules.inv.model.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
+@Data
+public class SettlementSourceDataVo {
+
+    @ApiModelProperty(value = "日期")
+    private String day;
+
+    @ApiModelProperty(value = "结算日期")
+    private String settlementDate;
+
+    @ApiModelProperty(value = "签单结算保费")
+    private BigDecimal settlementPremium;
+
+    @ApiModelProperty(value = "签单结算应收金额")
+    private BigDecimal agentCommission;
+
+    public SettlementSourceDataVo(){
+        this.settlementDate = "0";
+        this.settlementPremium = new BigDecimal(0);
+        this.agentCommission = new BigDecimal(0);
+    }
+}

+ 31 - 29
src/main/java/com/ydtech/modules/inv/model/vo/SettlementSourceResultVo.java

@@ -1,51 +1,53 @@
 package com.ydtech.modules.inv.model.vo;
 
 import com.alibaba.excel.annotation.ExcelProperty;
+import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.List;
+
 @Data
 public class SettlementSourceResultVo {
-    @ApiModelProperty(value = "年月")
-    @ExcelProperty(value = "年月",index = 0)
-    private String yearmonth;
 
     @ApiModelProperty(value = "日期")
-    @ExcelProperty(value = "日期",index = 1)
     private String day;
 
-    @ApiModelProperty(value = "保险公司名称")
-    @ExcelProperty(value = "保险公司名称",index = 2)
-    private String insuranceName;
+    @ApiModelProperty(value = "签单日期")
+    private String signDate;
 
-    @ApiModelProperty(value = "交强")
-    @ExcelProperty(value = "交强",index = 3)
-    private String jqPremiumTax;
+    @ApiModelProperty(value = "签单保费")
+    private BigDecimal signPremium;
 
-    @ApiModelProperty(value = "商业")
-    @ExcelProperty(value = "商业",index = 4)
-    private String syPremiumTax;
+    @ApiModelProperty(value = "签单应收金额")
+    private BigDecimal signReceivableAmount;
 
-    @ApiModelProperty(value = "非车")
-    @ExcelProperty(value = "非车",index = 6)
-    private String nonCarPremiumTax;
+    @ApiModelProperty(value = "未计算签单金额")
+    private BigDecimal unCalculatedAmount;
 
-    @ApiModelProperty(value = "签单保费")
-    private String writtenPremium;
+    @ApiModelProperty(value = "代理人金额")
+    private BigDecimal agentAmount;
 
-    @ApiModelProperty(value = "结算金额")
-    @ExcelProperty(value = "结算金额",index = 10)
-    private String settlementAmount;
+    @ApiModelProperty(value = "已结算利润")
+    private BigDecimal settledProfit;
 
+    @ApiModelProperty(value = "未结算利润测算")
+    private BigDecimal unsettledProfitCalculation;
+
+    @ApiModelProperty(value = "结算数据")
+    private List<SettlementSourceDataVo> settlementData;
 
     public SettlementSourceResultVo(){
-        this.yearmonth = "0";
-        this.day = "0";
-        this.insuranceName = "0";
-        this.jqPremiumTax = "0";
-        this.syPremiumTax = "0";
-        this.nonCarPremiumTax = "0";
-        this.writtenPremium = "0";
-        this.settlementAmount = "0";
+        this.signDate = "0";
+        this.signPremium = new BigDecimal(0);
+        this.signReceivableAmount = new BigDecimal(0);
+        this.unCalculatedAmount = new BigDecimal(0);
+        this.settledProfit = new BigDecimal(0);
+        if(this.settlementData == null) {
+            this.settlementData = new ArrayList<>();
+        }
     }
+
 }

+ 3 - 0
src/main/java/com/ydtech/modules/inv/model/vo/SigningSourceResultVo.java

@@ -14,6 +14,9 @@ public class SigningSourceResultVo {
     @ExcelProperty(value = "日期",index = 1)
     private String day;
 
+    @ApiModelProperty(value = "月份")
+    private String month;
+
     @ApiModelProperty(value = "保险公司名称")
     @ExcelProperty(value = "保险公司名称",index = 2)
     private String insuranceName;

+ 9 - 2
src/main/java/com/ydtech/modules/inv/service/InvReceivableService.java

@@ -3,12 +3,14 @@ package com.ydtech.modules.inv.service;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.ydtech.core.page.HttpResult;
+import com.ydtech.modules.esm.model.EsmInsCompany;
 import com.ydtech.modules.inv.model.InvAccount;
 import com.ydtech.modules.inv.model.po.InvSettlementSource;
 import com.ydtech.modules.inv.model.po.InvSource;
 import com.ydtech.modules.inv.model.po.QueryInvChannelAccount;
 import com.ydtech.modules.inv.model.vo.*;
 
+import java.util.HashMap;
 import java.util.List;
 
 /**
@@ -18,11 +20,13 @@ import java.util.List;
 */
 public interface InvReceivableService {
 
-    List<ReceivableResultVo> getReceivableList(String startTime,String endTime);
+    List<ReceivableResultVo> getReceivableList(String startTime,String endTime,String insuranceId);
 
     List<SigningSourceResultVo> getSigningSourceResult(String yearMonthStr,String startTime, String endTime);
 
-    List<SettlementSourceResultVo> getSettlementSourceResult(String yearMonthStr,String startTime,String endTime);
+    List<SigningSourceResultVo> getSigningSourceDayResult(String yearMonthStr,String startTime, String endTime,String insuranceId);
+
+    List<SettlementSourceResultVo> getSettlementSourceResult(String yearMonthStr,String insuranceId);
 
 
     IPage<InvSource> getRecivablePage(InvSourceQueryVo invSourceQueryVo);
@@ -34,4 +38,7 @@ public interface InvReceivableService {
     Boolean updateSettlement(InvSettlementSource invSettlementSource);
 
     Integer syncStatus();
+
+    List<EsmInsCompany> getInsureCompany();
+
 }

+ 7 - 4
src/main/java/com/ydtech/modules/inv/service/impl/InvChannelAccountServiceImpl.java

@@ -28,18 +28,21 @@ public class InvChannelAccountServiceImpl extends ServiceImpl<InvChannelAccountM
         pageRequest.setPageSize(invChannelAccount.getPageSize());
         Page page = PageRequest.buildPageRequest(pageRequest);
         LambdaQueryWrapper<InvChannelAccount> wrapper = new LambdaQueryWrapper<>();
-        if(invChannelAccount.getEmployeeId() != null) {
+        if(invChannelAccount.getEmployeeId() != null && !invChannelAccount.getEmployeeId().equals("")) {
             wrapper.eq(InvChannelAccount::getEmployeeId, invChannelAccount.getEmployeeId());
         }
-        if(invChannelAccount.getAccount() != null) {
+        if(invChannelAccount.getAccount() != null && !invChannelAccount.getAccount().equals("")) {
             wrapper.eq(InvChannelAccount::getAccount, invChannelAccount.getAccount());
         }
-        if(invChannelAccount.getMember() != null){
+        if(invChannelAccount.getMember() != null && !invChannelAccount.getMember().equals("")) {
             wrapper.eq(InvChannelAccount::getMember, invChannelAccount.getMember());
         }
-        if(invChannelAccount.getPayee() != null){
+        if(invChannelAccount.getPayee() != null && !invChannelAccount.getPayee().equals("")){
             wrapper.eq(InvChannelAccount::getProvince, invChannelAccount.getProvince());
         }
+        if(invChannelAccount.getChannelName() != null && !invChannelAccount.getChannelName().equals("")){
+            wrapper.like(InvChannelAccount::getChannelName, invChannelAccount.getChannelName());
+        }
         return baseMapper.selectPage(page, wrapper);
     }
 }

+ 244 - 37
src/main/java/com/ydtech/modules/inv/service/impl/InvReceivableServiceImpl.java

@@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.ydtech.core.page.PageRequest;
+import com.ydtech.modules.esm.model.EsmInsCompany;
 import com.ydtech.modules.inv.dao.InvChannelAccountMapper;
 import com.ydtech.modules.inv.dao.InvReceivableMapper;
 import com.ydtech.modules.inv.dao.InvSettlementSourceMapper;
@@ -26,7 +27,9 @@ import java.math.RoundingMode;
 import java.time.YearMonth;
 import java.time.format.DateTimeFormatter;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.stream.Collectors;
 
 /**
 * @author Administrator
@@ -48,8 +51,8 @@ public class InvReceivableServiceImpl implements InvReceivableService {
     InvSettlementSourceMapper invSettlementSourceMapper;
 
     @Override
-    public List<ReceivableResultVo> getReceivableList(String startTime, String endTime) {
-        return invReceivableMapper.getReceivableList(startTime,endTime);
+    public List<ReceivableResultVo> getReceivableList(String startTime, String endTime,String insuranceId) {
+        return invReceivableMapper.getReceivableList(startTime,endTime,insuranceId);
     }
 
     @Override
@@ -99,67 +102,236 @@ public class InvReceivableServiceImpl implements InvReceivableService {
     }
 
     @Override
-    public List<SettlementSourceResultVo> getSettlementSourceResult(String yearMonthStr, String startTime, String endTime) {
-        List<SettlementSourceResultVo> settlementSources = invReceivableMapper.getSettlementSourceResult(startTime, endTime);
-        List<SettlementSourceResultVo> settlementSourceResult = new ArrayList<>();
-
+    public List<SigningSourceResultVo> getSigningSourceDayResult(String yearMonthStr, String startTime, String endTime,String insuranceId) {
+        List<SigningSourceResultVo> signingSources = invReceivableMapper.getSigningSourceDayResult(startTime, endTime,insuranceId);
+        List<SigningSourceResultVo> signingSourceResult = new ArrayList<>();
+        // 定义日期时间格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        // 将字符串解析为YearMonth对象
+        YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
+        int maxDays = yearMonth.lengthOfMonth();
         Float jqPremiumTax = 0f;
         Float syPremiumTax = 0f;
         Float nonCarPremiumTax = 0f;
         Float writtenPremium = 0f;
         Float settlementAmount = 0f;
 
-        for(int i=1;i<=12;i++){
+        for(int i=1;i<=maxDays;i++){
             //查找day是否有数据
             String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
-            boolean countBol = settlementSources.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
+            boolean countBol = signingSources.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
             if(countBol)
             {
-                settlementSourceResult.add(settlementSources.stream().filter(x -> String.valueOf(finalI).equals(x.getDay())).findFirst().get());
+                signingSourceResult.add(signingSources.stream().filter(x -> String.valueOf(finalI).equals(x.getDay())).findFirst().get());
             }else{
-                SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
-                settlementSourceResultVo.setDay(finalI);
-                settlementSourceResultVo.setYearmonth(yearMonthStr + "-" + String.valueOf(i));
-                settlementSourceResult.add(settlementSourceResultVo);
+                SigningSourceResultVo signingSourceResultVo = new SigningSourceResultVo();
+                signingSourceResultVo.setDay(finalI);
+                signingSourceResultVo.setYearmonth(yearMonthStr + "-" + finalI);
+                signingSourceResult.add(signingSourceResultVo);
             }
         }
 
 
         //处理合计
-        for(SettlementSourceResultVo vo : settlementSources){
+        for(SigningSourceResultVo vo : signingSourceResult){
             jqPremiumTax = Float.parseFloat(vo.getJqPremiumTax()) + jqPremiumTax;
             syPremiumTax = Float.parseFloat(vo.getSyPremiumTax()) + syPremiumTax;
             nonCarPremiumTax = Float.parseFloat(vo.getNonCarPremiumTax()) + nonCarPremiumTax;
             writtenPremium = Float.parseFloat(vo.getWrittenPremium()) + writtenPremium;
-            settlementAmount = Float.parseFloat(vo.getSettlementAmount()) + settlementAmount;
+            settlementAmount = Float.parseFloat(vo.getTotalAmountReceivable()) + settlementAmount;
         }
-        SettlementSourceResultVo vo = new SettlementSourceResultVo();
+        SigningSourceResultVo vo = new SigningSourceResultVo();
         vo.setYearmonth("合计");
         vo.setJqPremiumTax(String.format("%.2f", jqPremiumTax));
         vo.setSyPremiumTax(String.format("%.2f", syPremiumTax));
         vo.setNonCarPremiumTax(String.format("%.2f", nonCarPremiumTax));
         vo.setWrittenPremium(String.format("%.2f", writtenPremium));
-        vo.setSettlementAmount(String.format("%.2f", settlementAmount));
-        settlementSourceResult.add(vo);
-
-        //签单数据
-        List<SigningSourceResultVo> signingSourceResult = this.getSigningSourceResult(yearMonthStr, startTime, endTime);
-        //签单合计
-        SigningSourceResultVo signingSourceResultVo = signingSourceResult.get(signingSourceResult.size() - 1);
-        SettlementSourceResultVo voCalc = new SettlementSourceResultVo();
-        Float jq = Float.parseFloat(signingSourceResultVo.getJqPremiumTax()) - Float.parseFloat(vo.getJqPremiumTax());
-        Float sy = Float.parseFloat(signingSourceResultVo.getSyPremiumTax()) - Float.parseFloat(vo.getSyPremiumTax());
-        Float nonCar = Float.parseFloat(signingSourceResultVo.getNonCarPremiumTax()) - Float.parseFloat(vo.getNonCarPremiumTax());
-        Float written = Float.parseFloat(signingSourceResultVo.getWrittenPremium()) - Float.parseFloat(vo.getWrittenPremium());
-        Float settlement = Float.parseFloat(signingSourceResultVo.getTotalAmountReceivable()) - Float.parseFloat(vo.getSettlementAmount());
-        voCalc.setJqPremiumTax(String.format("%.2f", jq));
-        voCalc.setSyPremiumTax(String.format("%.2f", sy));
-        voCalc.setNonCarPremiumTax(String.format("%.2f", nonCar));
-        voCalc.setWrittenPremium(String.format("%.2f", written));
-        voCalc.setSettlementAmount(String.format("%.2f", settlement));
-        voCalc.setYearmonth("签单合计");
-        settlementSourceResult.add(voCalc);
-        return settlementSourceResult;
+        vo.setTotalAmountReceivable(String.format("%.2f", settlementAmount));
+        signingSourceResult.add(vo);
+        return signingSourceResult;
+    }
+
+    @Override
+    public List<SettlementSourceResultVo> getSettlementSourceResult(String yearMonthStr, String insuranceId) {
+        // 定义日期时间格式
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM");
+        // 将字符串解析为YearMonth对象
+        YearMonth yearMonth = YearMonth.parse(yearMonthStr, formatter);
+        int maxDays = yearMonth.lengthOfMonth();
+        //获取签单数据
+        List<SigningSourceResultVo> signingSources = invReceivableMapper.getSigningSourceDayResult(yearMonthStr + "-01", yearMonthStr + "-" + maxDays,insuranceId);
+        //转换类型
+        List<SettlementSourceResultVo> settlementSourcesTmp = new ArrayList<>();
+        List<SettlementSourceResultVo> settlementSources = new ArrayList<>();
+        signingSources.forEach(signing->{
+            SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
+            settlementSourceResultVo.setDay(signing.getDay());
+            settlementSourceResultVo.setSignDate(signing.getYearmonth());
+            settlementSourceResultVo.setSignPremium(new BigDecimal(signing.getWrittenPremium()));
+            settlementSourceResultVo.setSignReceivableAmount(new BigDecimal(signing.getTotalAmountReceivable()));
+            settlementSourceResultVo.setSettlementData(new ArrayList<>());
+            settlementSourcesTmp.add(settlementSourceResultVo);
+        });
+
+        for(int i=1;i<=maxDays;i++)
+        {
+            //查找day是否有数据
+            String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
+            boolean countBol = settlementSourcesTmp.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
+            if(!countBol)
+            {
+                SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
+                settlementSourceResultVo.setDay(finalI);
+                settlementSourceResultVo.setSignDate(yearMonthStr + "-" + finalI);
+                settlementSources.add(settlementSourceResultVo);
+            }else{
+                settlementSources.add(settlementSourcesTmp.stream().filter(x -> finalI.equals(x.getDay())).findFirst().get());
+            }
+        }
+
+        int year = yearMonth.getYear();
+        //遍历结算数据
+        settlementSources.forEach(signing->{
+            String startTime = String.valueOf(year) + "-01-01";
+            String endTime = String.valueOf(year) + "-12-31";
+            List<SettlementSourceDataVo> settlementSourceResultTmp =
+                    invReceivableMapper.getSettlementSourceResult(signing.getSignDate(),startTime, endTime, insuranceId);
+            List<SettlementSourceDataVo> settlementSourceResult = new ArrayList<>();
+            System.out.printf("1");
+            //补齐数据
+            for(int i=1;i<=12;i++)
+            {
+                //查找day是否有数据
+                String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
+                boolean countBol = settlementSourceResultTmp.stream().filter(x -> finalI.equals(x.getDay())).count() > 0 ? true : false;
+                if(!countBol)
+                {
+                    SettlementSourceDataVo settlementSourceData = new SettlementSourceDataVo();
+                    settlementSourceData.setDay(finalI);
+                    settlementSourceData.setSettlementDate(year + "-" + finalI);
+                    settlementSourceResult.add(settlementSourceData);
+                }else{
+                    settlementSourceResult.add(settlementSourceResultTmp.stream().filter(x -> finalI.equals(x.getDay())).findFirst().get());
+                }
+            }
+            signing.setSettlementData(settlementSourceResult);
+        });
+
+
+        //计算每个日期的签单保费 和代理人佣金
+        settlementSources.forEach(settlementSource->{
+            int length = settlementSource.getSettlementData().size();
+            BigDecimal settlementPremium = new BigDecimal(0);
+            BigDecimal agentCommission = new BigDecimal(0);
+            //横向计算
+            for(int i=0;i<length;i++){
+                SettlementSourceDataVo settlementSourceData = settlementSource.getSettlementData().get(i);
+                settlementPremium = settlementPremium.add(settlementSourceData.getSettlementPremium());
+                agentCommission = agentCommission.add(settlementSourceData.getAgentCommission());
+            }
+            SettlementSourceDataVo settlementSourceData = new SettlementSourceDataVo();
+            settlementSourceData.setSettlementPremium(settlementPremium);
+            settlementSourceData.setAgentCommission(agentCommission);
+            settlementSourceData.setSettlementDate("合计");
+            settlementSource.getSettlementData().add(settlementSourceData);
+
+            //竖向计算
+//            settlementSource.getSettlementData().stream().filter(x-> x.getDay().equals("01")).count()
+        });
+
+        // 计算每个日期的签单保费 和代理人佣金 竖向计算
+        List<SettlementSourceDataVo> settlementSourceDataSum = new ArrayList<>();
+
+        for(int i=1;i<=12;i++){
+            //提取每个月的数据
+            String finalI = i < 10 ? "0" + String.valueOf(i) : String.valueOf(i);
+            List<SettlementSourceDataVo> settlementSourceDataVos = new ArrayList<>();
+
+            BigDecimal settlementPremium = new BigDecimal(0);
+            BigDecimal agentCommission = new BigDecimal(0);
+
+            for(int j=0;j<settlementSources.size();j++){
+
+                List<SettlementSourceDataVo> collect = settlementSources.get(j).getSettlementData().stream().filter(x -> x.getDay() != null && x.getDay().equals(finalI)).collect(Collectors.toList());
+                for(int k=0;k<collect.size();k++)
+                {
+                    settlementPremium = settlementPremium.add(collect.get(k).getAgentCommission());
+                    agentCommission = agentCommission.add(collect.get(k).getAgentCommission());
+                }
+            }
+            SettlementSourceDataVo settlementSourceDataVo = new SettlementSourceDataVo();
+            settlementSourceDataVo.setDay(finalI);
+            settlementSourceDataVo.setSettlementPremium(settlementPremium);
+            settlementSourceDataVo.setAgentCommission(agentCommission);
+            settlementSourceDataSum.add(settlementSourceDataVo);
+        }
+
+        //未结算签单保费 与 已结算利润计算
+        settlementSources.forEach(settlementSource -> {
+            SettlementSourceDataVo settlementSourceDataVo = settlementSource.getSettlementData().stream().filter(x -> !"合计".equals(x.getSettlementDate())).findFirst().get();
+            settlementSource.setUnCalculatedAmount(settlementSource.getSignPremium().subtract(settlementSourceDataVo.getSettlementPremium()));
+            settlementSource.setSettledProfit(settlementSource.getSignReceivableAmount().subtract(settlementSourceDataVo.getAgentCommission()));
+        });
+
+        //计算代理人佣金
+        List<HashMap> maxReceivable = invReceivableMapper.getMaxReceivable(yearMonthStr + "-01", yearMonthStr + "-" + maxDays);
+        settlementSources.forEach(settlementSource -> {
+            Boolean b = maxReceivable.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().isPresent();
+            if(!b)
+            {
+                settlementSource.setAgentAmount(new BigDecimal(0));
+            }else{
+                HashMap max = maxReceivable.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().get();
+                SettlementSourceDataVo settlementSourceDataVo = settlementSource.getSettlementData().get(settlementSource.getSettlementData().size() - 1);
+                settlementSource.setAgentAmount(new BigDecimal(max.get("receivable").toString()).subtract(settlementSourceDataVo.getAgentCommission()));
+            }
+        });
+        //计算未结算利润测算
+        List<HashMap> unsettledProfitCalculation = invReceivableMapper.getUnsettledProfitCalculation(yearMonthStr + "-01", yearMonthStr + "-" + maxDays);
+        settlementSources.forEach(settlementSource -> {
+            Boolean b = unsettledProfitCalculation.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().isPresent();
+            if(!b)
+            {
+                settlementSource.setUnsettledProfitCalculation(new BigDecimal(0));
+            }else{
+                HashMap max = unsettledProfitCalculation.stream().filter(x -> settlementSource.getSignDate().equals(x.get("yeatmonth"))).findFirst().get();
+                settlementSource.setUnsettledProfitCalculation(new BigDecimal(max.get("unsettled_profit_calculation").toString()));
+            }
+        });
+
+
+        //计算签单合计 (第一层)
+        int length = settlementSources.size();
+        BigDecimal signPremium = new BigDecimal(0);
+        BigDecimal signReceivableAmount = new BigDecimal(0);
+        BigDecimal unCalculatedAmount = new BigDecimal(0);
+        BigDecimal settledProfit = new BigDecimal(0);
+        BigDecimal agentAmount = new BigDecimal(0);
+        BigDecimal unsettledProfitCalculationSum = new BigDecimal(0);
+        for (int i = 0; i < length; i++) {
+            SettlementSourceResultVo settlementSource = settlementSources.get(i);
+            signPremium = signPremium.add(settlementSource.getSignPremium());
+            signReceivableAmount = signReceivableAmount.add(settlementSource.getSignReceivableAmount());
+            unCalculatedAmount = unCalculatedAmount.add(settlementSource.getUnCalculatedAmount());
+            settledProfit = settledProfit.add(settlementSource.getSettledProfit());
+            agentAmount = agentAmount.add(settlementSource.getAgentAmount());
+            unsettledProfitCalculationSum = unsettledProfitCalculationSum.add(settlementSource.getUnsettledProfitCalculation());
+        }
+
+
+
+        //合计
+        SettlementSourceResultVo settlementSourceResultVo = new SettlementSourceResultVo();
+        settlementSourceResultVo.setSignDate("合计");
+        settlementSourceResultVo.setSignPremium(signPremium);
+        settlementSourceResultVo.setSettlementData(settlementSourceDataSum);
+        settlementSourceResultVo.setSignReceivableAmount(signReceivableAmount);
+        settlementSourceResultVo.setUnCalculatedAmount(unCalculatedAmount);
+        settlementSourceResultVo.setSettledProfit(settledProfit);
+        settlementSourceResultVo.setAgentAmount(agentAmount);
+        settlementSourceResultVo.setUnsettledProfitCalculation(unsettledProfitCalculationSum);
+        settlementSources.add(settlementSourceResultVo);
+        return settlementSources;
     }
 
     @Override
@@ -181,6 +353,23 @@ public class InvReceivableServiceImpl implements InvReceivableService {
         if(invSourceQueryVo.getNonCarPolicyId() != null && !"".equals(invSourceQueryVo.getNonCarPolicyId())){
             queryWrapper.eq(InvSource::getNonCarPolicyId,invSourceQueryVo.getNonCarPolicyId());
         }
+        if(invSourceQueryVo.getInsuranceId() != null && !"".equals(invSourceQueryVo.getInsuranceId())){
+            queryWrapper.in(InvSource::getInsuranceId,invSourceQueryVo.getInsuranceId());
+        }
+        if(invSourceQueryVo.getRisk() != null && !"".equals(invSourceQueryVo.getRisk())){
+            queryWrapper.eq(InvSource::getRisk,invSourceQueryVo.getRisk());
+        }
+        if(invSourceQueryVo.getInsuredName() != null && !"".equals(invSourceQueryVo.getInsuredName())){
+            queryWrapper.like(InvSource::getInsuredName,invSourceQueryVo.getInsuredName());
+        }
+        if(invSourceQueryVo.getClearingTime() != null && !"".equals(invSourceQueryVo.getClearingTime())){
+            String[] split = invSourceQueryVo.getClearingTime().split(",");
+            queryWrapper.between(InvSource::getClearingTime,split[0],split[1]);
+        }
+        if(invSourceQueryVo.getSigningTime() != null && !"".equals(invSourceQueryVo.getSigningTime())){
+            String[] split = invSourceQueryVo.getSigningTime().split(",");
+            queryWrapper.between(InvSource::getSigningTime,split[0],split[1]);
+        }
         Page pageData = invSourceMapper.selectPage(page, queryWrapper);
         return pageData;
     }
@@ -245,6 +434,17 @@ public class InvReceivableServiceImpl implements InvReceivableService {
         if(invSettlementSourceQueryVo.getNonCarPolicyId() != null && !"".equals(invSettlementSourceQueryVo.getNonCarPolicyId())){
             queryWrapper.eq(InvSettlementSource::getNonCarPolicyId,invSettlementSourceQueryVo.getNonCarPolicyId());
         }
+        if(invSettlementSourceQueryVo.getInsuranceId() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceId())){
+            queryWrapper.in(InvSettlementSource::getInsuranceId,invSettlementSourceQueryVo.getInsuranceId());
+        }
+        if(invSettlementSourceQueryVo.getInsuranceType() != null && !"".equals(invSettlementSourceQueryVo.getInsuranceType())){
+            queryWrapper.eq(InvSettlementSource::getInsuranceType,invSettlementSourceQueryVo.getInsuranceType());
+        }
+        if(invSettlementSourceQueryVo.getSignDate() != null && !"".equals(invSettlementSourceQueryVo.getSignDate()))
+        {
+            String[] split = invSettlementSourceQueryVo.getSignDate().split(",");
+            queryWrapper.between(InvSettlementSource::getSignDate,split[0],split[1]);
+        }
         Page pageData = invSettlementSourceMapper.selectPage(page, queryWrapper);
 
         return pageData;
@@ -264,6 +464,13 @@ public class InvReceivableServiceImpl implements InvReceivableService {
         Integer i = invSourceMapper.syncStatus();
         return i;
     }
+
+    @Override
+    public List<EsmInsCompany> getInsureCompany() {
+        List<EsmInsCompany> insureCompany = invReceivableMapper.getInsureCompany();
+        return insureCompany;
+    }
+
 }
 
 

+ 103 - 18
src/main/resources/mapper/modules/inv/InvReceivableMapper.xml

@@ -9,7 +9,42 @@
 
     <select id="getReceivableList" resultType="com.ydtech.modules.inv.model.vo.ReceivableResultVo">
         SELECT
-        DATE_FORMAT( signing_time, '%d') as day,
+            DATE_FORMAT( signing_time, '%d' ) AS DAY,
+            DATE_FORMAT( signing_time, '%Y-%m' ) AS yearmonth,
+            DATE_FORMAT( signing_time, '%Y-%m-%d' ),
+            insurance_id,
+            insurance_name,
+            sum( jq_premium_tax ) AS jq_premium_tax,
+            sum( jq_premium ) AS jq_premium,
+            sum( sy_premium_tax ) AS sy_premium_tax,
+            sum( sy_premium ) AS sy_premium,
+            sum( taxamount ) AS taxamount,
+            sum( non_car_premium_tax ) AS non_car_premium_tax,
+            sum( non_car_premium ) AS non_car_premium,
+            sum( premium ) AS premium,
+            sum( non_copying ) AS non_copying,
+            sum( jq_premium_tax + sy_premium_tax + non_car_premium_tax ) AS total_permium,
+            sum( premium + non_copying ) AS total_receivable,
+            sum( subsidy_amount ) AS subsidy_amount,
+            sum( total_receivable_amount ) AS total_receivable_amount
+        FROM
+            inv_source
+        WHERE
+            signing_time BETWEEN #{startTime}
+                AND #{endTime}
+          and insurance_id = #{insuranceId}
+        GROUP BY
+            insurance_id,
+            insurance_name,
+            DATE_FORMAT( signing_time,'%Y-%m-%d'),
+            DATE_FORMAT( signing_time, '%d' ),
+            DATE_FORMAT( signing_time, '%Y-%m' )
+
+    </select>
+
+    <select id="getSigningSourceResult" resultType="com.ydtech.modules.inv.model.vo.SigningSourceResultVo">
+        SELECT
+        DATE_FORMAT( signing_time, '%m') as day,
         DATE_FORMAT( signing_time, '%Y-%m' ) as yearmonth,
         insurance_name,
         sum( jq_premium_tax ) as jq_premium_tax,
@@ -21,10 +56,9 @@
         sum(non_car_premium) as non_car_premium,
         sum(premium) as premium,
         sum(non_copying) as non_copying,
-        sum(jq_premium_tax + sy_premium_tax + non_car_premium_tax) as total_permium,
+        sum(jq_premium_tax + sy_premium_tax + non_car_premium_tax) as written_premium,
         sum(premium + non_copying) as total_receivable,
-        sum(subsidy_amount) as subsidy_amount,
-        sum(total_receivable_amount) as total_receivable_amount
+        sum(receivable) as total_amount_receivable
         FROM
         inv_source
         WHERE
@@ -35,13 +69,13 @@
         insurance_id,
         DATE_FORMAT(
         signing_time,
-        '%Y-%m-%d')
+        '%Y-%m')
     </select>
 
-    <select id="getSigningSourceResult" resultType="com.ydtech.modules.inv.model.vo.SigningSourceResultVo">
+    <select id="getSigningSourceDayResult" resultType="com.ydtech.modules.inv.model.vo.SigningSourceResultVo">
         SELECT
-        DATE_FORMAT( signing_time, '%m') as day,
-        DATE_FORMAT( signing_time, '%Y-%m' ) as yearmonth,
+        DATE_FORMAT( signing_time, '%d') as day,
+        DATE_FORMAT( signing_time, '%Y-%m-%d' ) as yearmonth,
         insurance_name,
         sum( jq_premium_tax ) as jq_premium_tax,
         sum(jq_premium) as jq_premium,
@@ -60,34 +94,85 @@
         WHERE
         signing_time BETWEEN #{startTime}
         AND #{endTime}
-        <!--and insurance_id = '123'-->
+          <if test="insuranceId != null and insuranceId != ''">
+            and insurance_id = #{insuranceId}
+          </if>
         GROUP BY
         insurance_id,
+        insurance_name,
         DATE_FORMAT(
         signing_time,
-        '%Y-%m')
+        '%Y-%m-%d'),
+        DATE_FORMAT( signing_time, '%d' )
     </select>
 
-    <select id="getSettlementSourceResult" resultType="com.ydtech.modules.inv.model.vo.SettlementSourceResultVo">
+    <select id="getSettlementSourceResult" resultType="com.ydtech.modules.inv.model.vo.SettlementSourceDataVo">
         SELECT
             DATE_FORMAT( agency_settlement_time, '%m' ) AS DAY,
-            DATE_FORMAT( agency_settlement_time, '%Y-%m' ) AS yearmonth,
+            DATE_FORMAT( agency_settlement_time, '%Y-%m' ) AS settlement_date,
             insurance_company,
-            sum( jq_premium_tax ) AS jq_premium_tax,
-            sum( sy_premium_tax ) AS sy_premium_tax,
-            sum( non_car_premium_tax ) AS non_car_premium_tax,
-            sum( jq_premium_tax + sy_premium_tax + non_car_premium_tax ) AS writtenPremium,
-            sum( settlement_amount ) AS settlement_amount
+            sum( jq_premium_tax + sy_premium_tax + non_car_premium_tax ) AS settlement_premium,
+            sum( settlement_amount ) AS agent_commission
         FROM
             inv_settlement_source
         WHERE
+            sign_date = #{signDate}
+                AND
             agency_settlement_time BETWEEN #{startTime}
                 AND #{endTime}
         GROUP BY
             insurance_company,
             DATE_FORMAT(
                     agency_settlement_time,
-                    '%Y-%m')
+                    '%Y-%m'),
+            DATE_FORMAT( agency_settlement_time, '%m' )
+    </select>
+
+    <select id="getInsureCompany" resultType="com.ydtech.modules.esm.model.EsmInsCompany">
+        SELECT
+            eic.*
+        FROM
+            esm_ins_company eic,
+            ptl_agreement pa
+        WHERE
+            eic.id = pa.insurance_company_id
+        GROUP BY
+            eic.id
     </select>
 
+
+    <select id="getMaxReceivable" resultType="HashMap">
+        SELECT
+            DATE_FORMAT(
+                    signing_time,
+                    '%Y-%m-%d') as yeatmonth,
+            sum( receivable ) as receivable
+        FROM
+            inv_source
+        WHERE
+          signing_time BETWEEN #{startTime}  and #{endTime}
+        GROUP BY
+            DATE_FORMAT(
+                    signing_time,
+                    '%Y-%m-%d')
+    </select>
+
+    <select id="getUnsettledProfitCalculation" resultType="HashMap">
+        SELECT
+            DATE_FORMAT(
+                    signing_time,
+                    '%Y-%m-%d') as yeatmonth,
+            sum( receivable ) - sum(max_receivable) as unsettled_profit_calculation
+        FROM
+            inv_source
+        WHERE
+            clearing_state = 0 and
+            signing_time BETWEEN '2024-01-01'  and '2024-01-31'
+        GROUP BY
+            DATE_FORMAT(
+                signing_time,
+                '%Y-%m-%d')
+    </select>
+
+
 </mapper>

+ 7 - 7
src/main/resources/mapper/modules/inv/InvSourceMapper.xml

@@ -61,12 +61,12 @@
     </sql>
 
     <update id="syncStatus">
-        UPDATE inv_source ins,
-            inv_settlement_source iss
-        SET ins.clearing_state = 1
-            AND ins.jq_policy_id = iss.jq_policy_id
-            AND ins.sy_policy_id = iss.sy_policy_id
-            AND ins.non_car_policy_id = iss.non_car_policy_id
-            AND ins.licenseno = iss.licenseno
+        UPDATE inv_source ins
+            JOIN inv_settlement_source iss ON ins.jq_policy_id = iss.jq_policy_id
+                AND ins.sy_policy_id = iss.sy_policy_id
+                AND ins.non_car_policy_id = iss.non_car_policy_id
+                AND ins.licenseno = iss.licenseno
+        SET ins.clearing_state = 1,
+            ins.clearing_time = iss.agency_settlement_time;
     </update>
 </mapper>