From 5badb0e02901c3ea5570fdb9cf497aec7e48fd65 Mon Sep 17 00:00:00 2001
From: shiyunteng <shiyunteng@example.com>
Date: 星期四, 18 六月 2026 17:00:23 +0800
Subject: [PATCH] feat:新增账龄行业、地区分析账龄分析

---
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/StatisticServiceImpl.java      |  371 ++++++++++++++++++++++++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AnalysisCommonDTO.java                  |    6 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingVo.java                             |   26 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractPaymentScheduleMapper.java   |   18 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/StatisticController.java         |   27 +
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java                |    2 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingCompanyVo.java                      |   12 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java    |   10 
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingAnalysisVo.java                     |   16 +
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java |   99 +++++++
 platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AgingQueryDTO.java                      |   28 ++
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java          |    2 
 platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/StatisticService.java               |    6 
 platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml                               |  201 ++++++++++++++
 14 files changed, 817 insertions(+), 7 deletions(-)

diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AgingQueryDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AgingQueryDTO.java
new file mode 100644
index 0000000..4a6d89e
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AgingQueryDTO.java
@@ -0,0 +1,28 @@
+package com.by4cloud.platformx.business.dto;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class AgingQueryDTO {
+
+	private Long companyId;
+
+	private String areaId;
+
+	private String industryId;
+
+	/**
+	 * 璐﹂緞璁$畻鏃ユ湡绫诲瀷
+	 *  1/绾﹀畾鏃堕棿 2/鍙戣揣鏃堕棿 3/寮�绁ㄦ椂闂�
+	 */
+	private String agingType;
+
+	/**
+	 * 璐﹂緞璁$畻鏃ユ湡
+	 *  1/绾﹀畾鏃堕棿 2/鍙戣揣鏃堕棿 3/寮�绁ㄦ椂闂�
+	 */
+	private Date agingDate;
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AnalysisCommonDTO.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AnalysisCommonDTO.java
index e2f0384..f62f42a 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AnalysisCommonDTO.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/dto/AnalysisCommonDTO.java
@@ -7,4 +7,10 @@
 
 	private String year;
 
+	/**
+	 * 璐﹂緞璁$畻鏃ユ湡
+	 *  1/绾﹀畾鏃堕棿 2/鍙戣揣鏃堕棿 3/寮�绁ㄦ椂闂�
+	 */
+	private String agingType;
+
 }
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
index 23a58e1..ac52b6f 100644
--- a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/entity/BusinessCustomer.java
@@ -78,7 +78,7 @@
     private String registerName;
 
     @Schema(description = "寮�鎴烽摱琛�")
-    @Column(columnDefinition = "VARCHAR(20) comment '寮�鎴烽摱琛�'")
+    @Column(columnDefinition = "VARCHAR(255) comment '寮�鎴烽摱琛�'")
     private String bankName;
 
     @Schema(description = "閾惰璐﹀彿")
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingAnalysisVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingAnalysisVo.java
new file mode 100644
index 0000000..8997369
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingAnalysisVo.java
@@ -0,0 +1,16 @@
+package com.by4cloud.platformx.business.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.List;
+
+@Data
+public class AgingAnalysisVo {
+
+	private String companyName;
+
+	private List<BigDecimal> amount;
+
+	private List<BigDecimal> percent;
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingCompanyVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingCompanyVo.java
new file mode 100644
index 0000000..7bf699e
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingCompanyVo.java
@@ -0,0 +1,12 @@
+package com.by4cloud.platformx.business.vo;
+
+import lombok.Data;
+
+@Data
+public class AgingCompanyVo {
+
+	private Long companyId;
+
+	private Long compId;
+
+}
diff --git a/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingVo.java b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingVo.java
new file mode 100644
index 0000000..1b85a43
--- /dev/null
+++ b/platformx-business-finance-api/src/main/java/com/by4cloud/platformx/business/vo/AgingVo.java
@@ -0,0 +1,26 @@
+package com.by4cloud.platformx.business.vo;
+
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+public class AgingVo {
+
+	private String overdueRange;
+
+	private BigDecimal totalAmount;
+
+	private BigDecimal totalPercent;
+
+	public AgingVo(String overdueRange,BigDecimal totalAmount, BigDecimal totalPercent) {
+		this.overdueRange = overdueRange;
+		this.totalAmount = totalAmount;
+		this.totalPercent = totalPercent;
+	}
+
+	public AgingVo(String overdueRange, BigDecimal totalAmount) {
+		this.overdueRange = overdueRange;
+		this.totalAmount = totalAmount;
+	}
+}
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
index 63c0af2..a50c169 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/PaymentConfirmController.java
@@ -13,6 +13,7 @@
 import com.by4cloud.platformx.common.log.annotation.SysLog;
 import com.by4cloud.platformx.business.entity.PaymentConfirm;
 import com.by4cloud.platformx.business.service.PaymentConfirmService;
+import com.by4cloud.platformx.common.security.annotation.Inner;
 import org.springframework.security.access.prepost.PreAuthorize;
 import com.by4cloud.platformx.common.excel.annotation.ResponseExcel;
 import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -142,4 +143,13 @@
 	public R queryAllBusinessType(){
 		return paymentConfirmService.queryAllBusinessType();
 	}
+
+
+	/**
+	 * 璐﹂緞璇︾粏鏌ヨ
+	 */
+	@GetMapping("queryAging")
+	public R queryAging(){
+		return paymentConfirmService.queryAging();
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/StatisticController.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/StatisticController.java
index 9129dd8..1086131 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/StatisticController.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/controller/StatisticController.java
@@ -120,4 +120,31 @@
 	public R contractAmountAnalysisBySaleModel(@RequestBody AnalysisCommonDTO commonDTO) {
 		return statisticService.contractAmountAnalysisBySaleModel(commonDTO);
 	}
+
+	/**
+	 * 璐﹂緞鍦板尯鍒嗘瀽
+	 * @return R
+	 */
+	@PostMapping("/agingAnalysisByArea")
+	public R agingAnalysisByArea(@RequestBody AnalysisCommonDTO commonDTO) {
+		return statisticService.agingAnalysisByArea(commonDTO);
+	}
+
+	/**
+	 * 璐﹂緞琛屼笟鍒嗘瀽
+	 * @return R
+	 */
+	@PostMapping("/agingAnalysisByIndustry")
+	public R agingAnalysisByIndustry(@RequestBody AnalysisCommonDTO commonDTO) {
+		return statisticService.agingAnalysisByIndustry(commonDTO);
+	}
+
+	/**
+	 * 璐﹂緞鍒嗘瀽
+	 * @return R
+	 */
+	@PostMapping("/agingAnalysis")
+	public R agingAnalysis(@RequestBody AnalysisCommonDTO commonDTO) {
+		return statisticService.agingAnalysis(commonDTO);
+	}
 }
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractPaymentScheduleMapper.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractPaymentScheduleMapper.java
index 4d4e8e8..c7b9965 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractPaymentScheduleMapper.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/mapper/ContractPaymentScheduleMapper.java
@@ -1,11 +1,29 @@
 package com.by4cloud.platformx.business.mapper;
 
+import com.by4cloud.platformx.business.dto.AgingQueryDTO;
 import com.by4cloud.platformx.business.entity.ContractPaymentSchedule;
+import com.by4cloud.platformx.business.vo.AgingCompanyVo;
+import com.by4cloud.platformx.business.vo.AgingVo;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import com.by4cloud.platformx.common.data.datascope.PlatformxBaseMapper;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
 
 @Mapper
 public interface ContractPaymentScheduleMapper extends PlatformxBaseMapper<ContractPaymentSchedule> {
 
 
+    List<AgingCompanyVo> selectAgingCompany(@Param("queryDTO") AgingQueryDTO queryDT,DataScope compId);
+
+	List<AgingVo> selectAgingTotal(@Param("queryDTO") AgingQueryDTO queryDTO);
+
+	List<AgingCompanyVo> selectAgingCompanyShip(DataScope comp_id);
+
+	List<AgingCompanyVo> selectAgingCompanyInvoice(DataScope comp_id);
+
+	List<AgingVo> selectAgingTotalShip(@Param("queryDTO") AgingQueryDTO queryDTO);
+
+	List<AgingVo> selectAgingTotalInvoice(@Param("queryDTO") AgingQueryDTO queryDTO);
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java
index 09a7c82..247e316 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/PaymentConfirmService.java
@@ -17,4 +17,6 @@
 	void saveBipRequestRecord(JSONObject params,String methodName, String result);
 
     R queryAllBusinessType();
+
+	R queryAging();
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/StatisticService.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/StatisticService.java
index 8312046..47222e2 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/StatisticService.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/StatisticService.java
@@ -23,4 +23,10 @@
 	R contractAmountAnalysisByComp(AnalysisCommonDTO commonDTO);
 
 	R contractAmountAnalysisBySaleModel(AnalysisCommonDTO commonDTO);
+
+	R agingAnalysisByArea(AnalysisCommonDTO commonDTO);
+
+	R agingAnalysisByIndustry(AnalysisCommonDTO commonDTO);
+
+	R agingAnalysis(AnalysisCommonDTO commonDTO);
 }
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java
index 02ec8d9..675784b 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/PaymentConfirmServiceImpl.java
@@ -13,6 +13,7 @@
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.by4cloud.platformx.admin.api.entity.SysDept;
 import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
+import com.by4cloud.platformx.business.dto.AgingQueryDTO;
 import com.by4cloud.platformx.business.dto.PaymentConfirmAddDTO;
 import com.by4cloud.platformx.business.entity.*;
 import com.by4cloud.platformx.business.mapper.*;
@@ -20,7 +21,11 @@
 import com.by4cloud.platformx.business.service.ContractService;
 import com.by4cloud.platformx.business.service.PaymentConfirmService;
 import com.by4cloud.platformx.business.utils.SignHelper;
+import com.by4cloud.platformx.business.vo.AgingAnalysisVo;
+import com.by4cloud.platformx.business.vo.AgingCompanyVo;
+import com.by4cloud.platformx.business.vo.AgingVo;
 import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import com.by4cloud.platformx.common.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -30,11 +35,13 @@
 
 import java.io.UnsupportedEncodingException;
 import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.security.InvalidKeyException;
 import java.security.NoSuchAlgorithmException;
 import java.util.*;
 import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 /**
  * 鏀舵纭
@@ -849,4 +856,96 @@
 		return R.ok(baseMapper.selectList(Wrappers.<PaymentConfirm>lambdaQuery().select(PaymentConfirm::getBusinessType).isNotNull(PaymentConfirm::getBusinessType)
 						.groupBy(PaymentConfirm::getBusinessType)).stream().map(PaymentConfirm::getBusinessType).collect(Collectors.toList()));
 	}
+
+	@Override
+	public R queryAging() {
+		List<AgingCompanyVo> companys = contractPaymentScheduleMapper.selectAgingCompany(null,DataScope.of("comp_id"));
+		if (ArrayUtil.isEmpty(companys.toArray())){
+			return R.failed("鏆傛棤璐﹂緞");
+		}
+		List<AgingAnalysisVo> result = new ArrayList<>();
+		AgingQueryDTO queryDTO = new AgingQueryDTO();
+		List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotal(null);
+		companys.stream().forEach(company->{
+			BusinessCustomer businessCustomer = businessCustomerService.getById(company.getCompanyId());
+			AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+			agingAnalysisVo.setCompanyName(businessCustomer.getCompanyName());
+			queryDTO.setCompanyId(company.getCompanyId());
+			List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotal(queryDTO);
+			//琛ュ叏鏁版嵁
+			if (ArrayUtil.isEmpty(companyAgingVo.toArray())){
+				companyAgingVo = new ArrayList<>();
+				AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+				AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+				AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+				AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+				AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+				AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+				companyAgingVo.add(agingVo1);
+				companyAgingVo.add(agingVo2);
+				companyAgingVo.add(agingVo3);
+				companyAgingVo.add(agingVo4);
+				companyAgingVo.add(agingVo5);
+				companyAgingVo.add(agingVo6);
+			}else {
+				List<String> overdueRanges = companyAgingVo.stream().map(AgingVo::getOverdueRange).collect(Collectors.toList());
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"0-30澶�")){
+					AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo1);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"31-60澶�")){
+					AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo2);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"61-90澶�")){
+					AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo3);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"91-180澶�")){
+					AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo4);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"181-365澶�")){
+					AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo5);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"1骞翠互涓�")){
+					AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo6);
+				}
+			}
+			agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+			List<AgingVo> finalCompanyAgingVo = companyAgingVo;
+			agingAnalysisVo.setPercent(IntStream.range(0, agingVoList.size())
+					.mapToObj(i -> {
+						BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
+						BigDecimal total = agingVoList.get(i).getTotalAmount();
+						if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
+							return null;
+						}
+						return part.divide(total, 4, RoundingMode.HALF_UP)
+								.multiply(new BigDecimal("100"))
+								.setScale(2, RoundingMode.HALF_UP);
+					})
+					.collect(Collectors.toList()));
+			result.add(agingAnalysisVo);
+		});
+		//鍚堣
+		AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+		agingAnalysisVo.setCompanyName("鍚堣");
+		agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+		List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
+				.mapToObj(i -> {
+
+					if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
+						return null;
+					}else {
+						return new BigDecimal("100");
+					}
+				})
+				.collect(Collectors.toList());
+		agingAnalysisVo.setPercent(percent);
+		result.add(agingAnalysisVo);
+		return R.ok(result);
+	}
 }
\ No newline at end of file
diff --git a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/StatisticServiceImpl.java b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/StatisticServiceImpl.java
index 6899e89..de700ce 100644
--- a/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/StatisticServiceImpl.java
+++ b/platformx-business-finance-biz/src/main/java/com/by4cloud/platformx/business/service/impl/StatisticServiceImpl.java
@@ -5,25 +5,35 @@
 import com.by4cloud.platformx.admin.api.entity.SysDictItem;
 import com.by4cloud.platformx.admin.api.feign.RemoteDeptService;
 import com.by4cloud.platformx.admin.api.feign.RemoteDictService;
+import com.by4cloud.platformx.business.dto.AgingQueryDTO;
 import com.by4cloud.platformx.business.dto.AnalysisCommonDTO;
+import com.by4cloud.platformx.business.entity.BusinessCustomer;
+import com.by4cloud.platformx.business.mapper.BusinessCustomerMapper;
 import com.by4cloud.platformx.business.mapper.ContractMapper;
+import com.by4cloud.platformx.business.mapper.ContractPaymentScheduleMapper;
 import com.by4cloud.platformx.business.service.StatisticService;
 import com.by4cloud.platformx.business.vo.*;
 import com.by4cloud.platformx.common.core.util.R;
+import com.by4cloud.platformx.common.data.datascope.DataScope;
 import com.by4cloud.platformx.common.security.util.SecurityUtils;
 import lombok.RequiredArgsConstructor;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.stream.Collectors;
+import java.util.stream.IntStream;
 
 @Service
 @RequiredArgsConstructor
 public class StatisticServiceImpl implements StatisticService {
 
 	private final ContractMapper contractMapper;
+	private final ContractPaymentScheduleMapper contractPaymentScheduleMapper;
+	private final BusinessCustomerMapper businessCustomerMapper;
 	private final RemoteDeptService remoteDeptService;
 	private final RemoteDictService remoteDictService;
 
@@ -102,7 +112,7 @@
 		R<List<SysDictItem>> r = remoteDictService.getDictByType("company_area");
 		List<SysDictItem> items = r.getData();
 		if (ArrayUtil.isEmpty(items.toArray())){
-			return R.failed("鍖哄煙瀛楁鑾峰彇寮傚父");
+			return R.failed("鍦板尯瀛楀吀鍒嗙被鑾峰彇寮傚父");
 		}
 		List<Long> compIds = new ArrayList<>();
 		compIds.add(Long.valueOf(sgb));
@@ -142,7 +152,7 @@
 		R<List<SysDictItem>> r = remoteDictService.getDictByType("industry_sector");
 		List<SysDictItem> items = r.getData();
 		if (ArrayUtil.isEmpty(items.toArray())){
-			return R.failed("鍖哄煙瀛楁鑾峰彇寮傚父");
+			return R.failed("琛屼笟瀛楀吀鍒嗙被鑾峰彇寮傚父");
 		}
 		List<Long> compIds = new ArrayList<>();
 		compIds.add(Long.valueOf(sgb));
@@ -182,7 +192,7 @@
 		R<List<SysDictItem>> r = remoteDictService.getDictByType("market_type");
 		List<SysDictItem> items = r.getData();
 		if (ArrayUtil.isEmpty(items.toArray())){
-			return R.failed("鍖哄煙瀛楁鑾峰彇寮傚父");
+			return R.failed("甯傚満绫诲瀷瀛楀吀鍒嗙被鑾峰彇寮傚父");
 		}
 		List<Long> compIds = new ArrayList<>();
 		compIds.add(Long.valueOf(sgb));
@@ -222,7 +232,7 @@
 		R<List<SysDictItem>> r = remoteDictService.getDictByType("supply_attribute");
 		List<SysDictItem> items = r.getData();
 		if (ArrayUtil.isEmpty(items.toArray())){
-			return R.failed("鍖哄煙瀛楁鑾峰彇寮傚父");
+			return R.failed("渚涘簲灞炴�у瓧鍏稿垎绫昏幏鍙栧紓甯�");
 		}
 		List<Long> compIds = new ArrayList<>();
 		compIds.add(Long.valueOf(sgb));
@@ -303,7 +313,7 @@
 		R<List<SysDictItem>> r = remoteDictService.getDictByType("sales_model");
 		List<SysDictItem> items = r.getData();
 		if (ArrayUtil.isEmpty(items.toArray())){
-			return R.failed("鍖哄煙瀛楁鑾峰彇寮傚父");
+			return R.failed("閿�鍞ā寮忓瓧鍏稿垎绫昏幏鍙栧紓甯�");
 		}
 		List<Long> compIds = new ArrayList<>();
 		compIds.add(Long.valueOf(sgb));
@@ -338,4 +348,355 @@
 		});
 		return R.ok(contractIncomeAnalysisVoList);
 	}
+
+	@Override
+	public R agingAnalysisByArea(AnalysisCommonDTO commonDTO) {
+		R<List<SysDictItem>> r = remoteDictService.getDictByType("company_area");
+		List<SysDictItem> items = r.getData();
+		if (ArrayUtil.isEmpty(items.toArray())){
+			return R.failed("鍦板尯瀛楀吀鍒嗙被鑾峰彇寮傚父");
+		}
+//		List<AgingCompanyVo> companys = contractPaymentScheduleMapper.selectAgingCompany(DataScope.of("comp_id"));
+//		if (ArrayUtil.isEmpty(companys.toArray())){
+//			return R.failed("鏆傛棤璐﹂緞");
+//		}
+		List<AgingAnalysisVo> result = new ArrayList<>();
+		AgingQueryDTO queryDTO = new AgingQueryDTO();
+		List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotal(null);
+		items.stream().forEach(item->{
+			AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+			agingAnalysisVo.setCompanyName(item.getLabel());
+			queryDTO.setAreaId(item.getItemValue());
+			List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotal(queryDTO);
+			//琛ュ叏鏁版嵁
+			if (ArrayUtil.isEmpty(companyAgingVo.toArray())){
+				companyAgingVo = new ArrayList<>();
+				AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+				AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+				AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+				AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+				AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+				AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+				companyAgingVo.add(agingVo1);
+				companyAgingVo.add(agingVo2);
+				companyAgingVo.add(agingVo3);
+				companyAgingVo.add(agingVo4);
+				companyAgingVo.add(agingVo5);
+				companyAgingVo.add(agingVo6);
+			}else {
+				List<String> overdueRanges = companyAgingVo.stream().map(AgingVo::getOverdueRange).collect(Collectors.toList());
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"0-30澶�")){
+					AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo1);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"31-60澶�")){
+					AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo2);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"61-90澶�")){
+					AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo3);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"91-180澶�")){
+					AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo4);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"181-365澶�")){
+					AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo5);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"1骞翠互涓�")){
+					AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo6);
+				}
+			}
+			agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+			List<AgingVo> finalCompanyAgingVo = companyAgingVo;
+			agingAnalysisVo.setPercent(IntStream.range(0, agingVoList.size())
+					.mapToObj(i -> {
+						BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
+						BigDecimal total = agingVoList.get(i).getTotalAmount();
+						if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
+							return null;
+						}
+						return part.divide(total, 4, RoundingMode.HALF_UP)
+								.multiply(new BigDecimal("100"))
+								.setScale(2, RoundingMode.HALF_UP);
+					})
+					.collect(Collectors.toList()));
+			result.add(agingAnalysisVo);
+		});
+		//鍚堣
+		AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+		agingAnalysisVo.setCompanyName("鍚堣");
+		agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+		List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
+				.mapToObj(i -> {
+
+					if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
+						return null;
+					}else {
+						return new BigDecimal("100");
+					}
+				})
+				.collect(Collectors.toList());
+		agingAnalysisVo.setPercent(percent);
+		result.add(agingAnalysisVo);
+		return R.ok(result);
+	}
+
+	@Override
+	public R agingAnalysisByIndustry(AnalysisCommonDTO commonDTO) {
+		R<List<SysDictItem>> r = remoteDictService.getDictByType("industry_sector");
+		List<SysDictItem> items = r.getData();
+		if (ArrayUtil.isEmpty(items.toArray())){
+			return R.failed("鍦板尯瀛楀吀鍒嗙被鑾峰彇寮傚父");
+		}
+		List<AgingAnalysisVo> result = new ArrayList<>();
+		AgingQueryDTO queryDTO = new AgingQueryDTO();
+		List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotal(null);
+		items.stream().forEach(item->{
+			AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+			agingAnalysisVo.setCompanyName(item.getLabel());
+			queryDTO.setIndustryId(item.getItemValue());
+			List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotal(queryDTO);
+			//琛ュ叏鏁版嵁
+			if (ArrayUtil.isEmpty(companyAgingVo.toArray())){
+				companyAgingVo = new ArrayList<>();
+				AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+				AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+				AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+				AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+				AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+				AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+				companyAgingVo.add(agingVo1);
+				companyAgingVo.add(agingVo2);
+				companyAgingVo.add(agingVo3);
+				companyAgingVo.add(agingVo4);
+				companyAgingVo.add(agingVo5);
+				companyAgingVo.add(agingVo6);
+			}else {
+				List<String> overdueRanges = companyAgingVo.stream().map(AgingVo::getOverdueRange).collect(Collectors.toList());
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"0-30澶�")){
+					AgingVo agingVo1 = new AgingVo("0-30澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo1);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"31-60澶�")){
+					AgingVo agingVo2 = new AgingVo("31-60澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo2);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"61-90澶�")){
+					AgingVo agingVo3 = new AgingVo("61-90澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo3);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"91-180澶�")){
+					AgingVo agingVo4 = new AgingVo("91-180澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo4);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"181-365澶�")){
+					AgingVo agingVo5 = new AgingVo("181-365澶�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo5);
+				}
+				if (!ArrayUtil.contains(overdueRanges.toArray(),"1骞翠互涓�")){
+					AgingVo agingVo6 = new AgingVo("1骞翠互涓�",new BigDecimal("0"),null);
+					companyAgingVo.add(agingVo6);
+				}
+			}
+			agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+			List<AgingVo> finalCompanyAgingVo = companyAgingVo;
+			agingAnalysisVo.setPercent(IntStream.range(0, agingVoList.size())
+					.mapToObj(i -> {
+						BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
+						BigDecimal total = agingVoList.get(i).getTotalAmount();
+						if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
+							return null;
+						}
+						return part.divide(total, 4, RoundingMode.HALF_UP)
+								.multiply(new BigDecimal("100"))
+								.setScale(2, RoundingMode.HALF_UP);
+					})
+					.collect(Collectors.toList()));
+			result.add(agingAnalysisVo);
+		});
+		//鍚堣
+		AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+		agingAnalysisVo.setCompanyName("鍚堣");
+		agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+		List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
+				.mapToObj(i -> {
+
+					if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
+						return null;
+					}else {
+						return new BigDecimal("100");
+					}
+				})
+				.collect(Collectors.toList());
+		agingAnalysisVo.setPercent(percent);
+		result.add(agingAnalysisVo);
+		return R.ok(result);
+	}
+
+	@Override
+	public R agingAnalysis(AnalysisCommonDTO commonDTO) {
+		if (commonDTO.getAgingType().equals("2")) {
+			AgingQueryDTO queryDTO = new AgingQueryDTO();
+			List<AgingCompanyVo> companys = contractPaymentScheduleMapper.selectAgingCompanyShip(DataScope.of("comp_id"));
+
+			if (ArrayUtil.isEmpty(companys.toArray())) {
+				return R.failed("鏆傛棤璐﹂緞");
+			}
+			//鍚堣鏁版嵁
+			List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotalShip(queryDTO);
+			agingVoList = completeData(agingVoList);
+			List<AgingVo> finalAgingVoList = agingVoList;
+			List<AgingAnalysisVo> result = new ArrayList<>();
+
+			companys.stream().forEach(company -> {
+				BusinessCustomer businessCustomer = businessCustomerMapper.selectById(company.getCompanyId());
+				AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+				agingAnalysisVo.setCompanyName(businessCustomer.getCompanyName());
+				queryDTO.setCompanyId(company.getCompanyId());
+				List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotalShip(queryDTO);
+				//琛ュ叏鏁版嵁
+				companyAgingVo = completeData(companyAgingVo);
+
+				agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+				List<AgingVo> finalCompanyAgingVo = companyAgingVo;
+
+				agingAnalysisVo.setPercent(IntStream.range(0, finalAgingVoList.size())
+						.mapToObj(i -> {
+							BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
+							BigDecimal total = finalAgingVoList.get(i).getTotalAmount();
+							if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
+								return null;
+							}
+							return part.divide(total, 4, RoundingMode.HALF_UP)
+									.multiply(new BigDecimal("100"))
+									.setScale(2, RoundingMode.HALF_UP);
+						})
+						.collect(Collectors.toList()));
+				result.add(agingAnalysisVo);
+			});
+			//鍚堣
+			AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+			agingAnalysisVo.setCompanyName("鍚堣");
+			agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+			List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
+					.mapToObj(i -> {
+
+						if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
+							return null;
+						} else {
+							return new BigDecimal("100");
+						}
+					})
+					.collect(Collectors.toList());
+			agingAnalysisVo.setPercent(percent);
+			result.add(agingAnalysisVo);
+			return R.ok(result);
+		}
+		if (commonDTO.getAgingType().equals("3")) {
+			AgingQueryDTO queryDTO = new AgingQueryDTO();
+			List<AgingCompanyVo> companys = contractPaymentScheduleMapper.selectAgingCompanyInvoice(DataScope.of("comp_id"));
+			if (ArrayUtil.isEmpty(companys.toArray())) {
+				return R.failed("鏆傛棤璐﹂緞");
+			}
+			//鍚堣鏁版嵁
+			List<AgingVo> agingVoList = contractPaymentScheduleMapper.selectAgingTotalInvoice(queryDTO);
+			agingVoList = completeData(agingVoList);
+			List<AgingVo> finalAgingVoList = agingVoList;
+			List<AgingAnalysisVo> result = new ArrayList<>();
+
+			companys.stream().forEach(company -> {
+				BusinessCustomer businessCustomer = businessCustomerMapper.selectById(company.getCompanyId());
+				AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+				agingAnalysisVo.setCompanyName(businessCustomer.getCompanyName());
+				queryDTO.setCompanyId(company.getCompanyId());
+				List<AgingVo> companyAgingVo = contractPaymentScheduleMapper.selectAgingTotalInvoice(queryDTO);
+				//琛ュ叏鏁版嵁
+				companyAgingVo = completeData(companyAgingVo);
+
+				agingAnalysisVo.setAmount(companyAgingVo.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+				List<AgingVo> finalCompanyAgingVo = companyAgingVo;
+
+				agingAnalysisVo.setPercent(IntStream.range(0, finalAgingVoList.size())
+						.mapToObj(i -> {
+							BigDecimal part = finalCompanyAgingVo.get(i).getTotalAmount();
+							BigDecimal total = finalAgingVoList.get(i).getTotalAmount();
+							if (total == null || total.compareTo(BigDecimal.ZERO) == 0) {
+								return null;
+							}
+							return part.divide(total, 4, RoundingMode.HALF_UP)
+									.multiply(new BigDecimal("100"))
+									.setScale(2, RoundingMode.HALF_UP);
+						})
+						.collect(Collectors.toList()));
+				result.add(agingAnalysisVo);
+			});
+			//鍚堣
+			AgingAnalysisVo agingAnalysisVo = new AgingAnalysisVo();
+			agingAnalysisVo.setCompanyName("鍚堣");
+			agingAnalysisVo.setAmount(agingVoList.stream().map(AgingVo::getTotalAmount).collect(Collectors.toList()));
+			List<BigDecimal> percent = IntStream.range(0, agingAnalysisVo.getAmount().size())
+					.mapToObj(i -> {
+
+						if (agingAnalysisVo.getAmount().get(i) == null || agingAnalysisVo.getAmount().get(i).compareTo(BigDecimal.ZERO) == 0) {
+							return null;
+						} else {
+							return new BigDecimal("100");
+						}
+					})
+					.collect(Collectors.toList());
+			agingAnalysisVo.setPercent(percent);
+			result.add(agingAnalysisVo);
+			return R.ok(result);
+		}
+		return R.ok();
+	}
+
+	private List<AgingVo> completeData(List<AgingVo> companyAgingVo) {
+		if (ArrayUtil.isEmpty(companyAgingVo.toArray())) {
+			companyAgingVo = new ArrayList<>();
+			AgingVo agingVo1 = new AgingVo("0-30澶�", new BigDecimal("0"), null);
+			AgingVo agingVo2 = new AgingVo("31-60澶�", new BigDecimal("0"), null);
+			AgingVo agingVo3 = new AgingVo("61-90澶�", new BigDecimal("0"), null);
+			AgingVo agingVo4 = new AgingVo("91-180澶�", new BigDecimal("0"), null);
+			AgingVo agingVo5 = new AgingVo("181-365澶�", new BigDecimal("0"), null);
+			AgingVo agingVo6 = new AgingVo("1骞翠互涓�", new BigDecimal("0"), null);
+			companyAgingVo.add(agingVo1);
+			companyAgingVo.add(agingVo2);
+			companyAgingVo.add(agingVo3);
+			companyAgingVo.add(agingVo4);
+			companyAgingVo.add(agingVo5);
+			companyAgingVo.add(agingVo6);
+		} else {
+			List<String> overdueRanges = companyAgingVo.stream().map(AgingVo::getOverdueRange).collect(Collectors.toList());
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "0-30澶�")) {
+				AgingVo agingVo1 = new AgingVo("0-30澶�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo1);
+			}
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "31-60澶�")) {
+				AgingVo agingVo2 = new AgingVo("31-60澶�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo2);
+			}
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "61-90澶�")) {
+				AgingVo agingVo3 = new AgingVo("61-90澶�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo3);
+			}
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "91-180澶�")) {
+				AgingVo agingVo4 = new AgingVo("91-180澶�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo4);
+			}
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "181-365澶�")) {
+				AgingVo agingVo5 = new AgingVo("181-365澶�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo5);
+			}
+			if (!ArrayUtil.contains(overdueRanges.toArray(), "1骞翠互涓�")) {
+				AgingVo agingVo6 = new AgingVo("1骞翠互涓�", new BigDecimal("0"), null);
+				companyAgingVo.add(agingVo6);
+			}
+		}
+		return companyAgingVo;
+	}
 }
diff --git a/platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml b/platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml
index 64c9b87..94fd082 100644
--- a/platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml
+++ b/platformx-business-finance-biz/src/main/resources/mapper/ContractPaymentScheduleMapper.xml
@@ -16,7 +16,7 @@
         <result property="paymentRatio" column="payment_ratio"/>
         <result property="paymentStatus" column="payment_status"/>
         <result property="plannedAmount" column="planned_amount"/>
-        <result property="plannedPaymentDate" column="planned_payment_date"/>
+<!--        <result property="plannedPaymentDate" column="planned_payment_date"/>-->
         <result property="remark" column="remark"/>
         <result property="stageName" column="stage_name"/>
         <result property="stageOrder" column="stage_order"/>
@@ -28,4 +28,203 @@
         <result property="updateTime" column="update_time"/>
         <result property="delFlag" column="del_flag"/>
   </resultMap>
+    <select id="selectAgingCompany" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
+		SELECT
+		c.party_a_id companyId,
+		cps.comp_id
+		FROM
+		contract_payment_schedule cps,
+		contract c
+		WHERE
+		cps.contract_id = c.id
+		AND cps.del_flag = '0'
+		AND c.del_flag = '0'
+	    AND cps.effective_end_date is not null
+		AND cps.effective_end_date &lt; current_date
+		AND DATEDIFF(current_date, cps.effective_end_date)>0
+		AND cps.payment_status &lt;&gt; '2'
+		AND cps.payment_status &lt;&gt; 3
+		GROUP BY
+		c.party_a_id,
+		cps.comp_id
+	</select>
+	<select id="selectAgingTotal" resultType="com.by4cloud.platformx.business.vo.AgingVo">
+		SELECT
+		ranges.overdue_range,
+		COALESCE(SUM(
+		CASE
+		WHEN cps.payment_status = '0' THEN
+		cps.planned_amount
+		WHEN cps.payment_status = '1' THEN
+		cps.planned_amount - cps.actual_amount ELSE 0
+		END
+		), 0) AS total_amount
+		FROM
+		(
+		SELECT '0-30澶�' AS overdue_range, 0 AS min_days, 30 AS max_days UNION ALL
+		SELECT '31-60澶�', 31, 60 UNION ALL
+		SELECT '61-90澶�', 61, 90 UNION ALL
+		SELECT '91-180澶�', 91, 180 UNION ALL
+		SELECT '181-365澶�', 181, 365 UNION ALL
+		SELECT '1骞翠互涓�', 366, 999999
+		) AS ranges
+		LEFT JOIN
+		contract_payment_schedule cps ON
+		cps.del_flag = '0'
+		AND cps.payment_status NOT IN ('2', '3')
+		AND cps.effective_end_date &lt; current_date
+		AND DATEDIFF(current_date, cps.effective_end_date) BETWEEN ranges.min_days AND ranges.max_days
+		LEFT JOIN
+		contract c ON cps.contract_id = c.id
+		LEFT JOIN
+		business_customer bc ON c.party_a_id = bc.id
+		 where
+		 c.del_flag = '0'
+		<if test="queryDTO.companyId !=null">
+			and c.party_a_id = #{queryDTO.companyId}
+		</if>
+		<if test="queryDTO.areaId !=null">
+			and bc.area_id = #{queryDTO.areaId}
+		</if>
+		<if test="queryDTO.industryId !=null">
+			and bc.industry_id = #{queryDTO.industryId}
+		</if>
+		GROUP BY
+		ranges.overdue_range,
+		ranges.min_days
+		ORDER BY
+		ranges.min_days;
+	</select>
+	<select id="selectAgingCompanyShip" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
+		SELECT
+			c.party_a_id companyId,
+		    c.comp_id
+		FROM
+			contract c
+		WHERE
+			c.del_flag = '0'
+		  AND c.amount > c.paid_amount
+		  AND EXISTS ( SELECT 1 FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id )
+		GROUP BY
+			c.party_a_id,
+			c.comp_id;
+	</select>
+	<select id="selectAgingCompanyInvoice" resultType="com.by4cloud.platformx.business.vo.AgingCompanyVo">
+		SELECT
+			c.party_a_id companyId,
+			c.comp_id
+		FROM
+			contract c
+		WHERE
+			c.del_flag = '0'
+		  AND c.amount > c.paid_amount
+		  AND EXISTS ( SELECT 1 FROM contract_invoice ci WHERE ci.del_flag = '0' AND ci.contract_id = c.id )
+		GROUP BY
+			c.party_a_id,
+			c.comp_id;
+	</select>
+	<select id="selectAgingTotalShip" resultType="com.by4cloud.platformx.business.vo.AgingVo">
+		SELECT
+			ranges.overdue_range,
+			COALESCE (
+					sum(amount-paid_amount),
+					0
+				) AS total_amount
+		FROM
+			(
+				SELECT
+					'0-30澶�' AS overdue_range,
+					0 AS min_days,
+					30 AS max_days UNION ALL
+				SELECT
+					'31-60澶�',
+					31,
+					60 UNION ALL
+				SELECT
+					'61-90澶�',
+					61,
+					90 UNION ALL
+				SELECT
+					'91-180澶�',
+					91,
+					180 UNION ALL
+				SELECT
+					'181-365澶�',
+					181,
+					365 UNION ALL
+				SELECT
+					'1骞翠互涓�',
+					366,
+					999999
+			) ranges
+				LEFT JOIN contract c ON c.del_flag = '0'
+				AND DATEDIFF(
+							CURRENT_DATE,
+							( SELECT max( out_bound_time ) FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id ORDER BY out_bound_time ASC )) BETWEEN ranges.min_days
+				AND ranges.max_days
+		WHERE
+			c.del_flag = '0'
+		  AND c.amount > c.paid_amount
+		<if test="queryDTO.companyId !=null">
+			and c.party_a_id = #{queryDTO.companyId}
+		</if>
+		  AND EXISTS ( SELECT 1 FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id )
+		GROUP BY
+			ranges.overdue_range,
+			ranges.min_days
+		ORDER BY
+			ranges.min_days;
+	</select>
+	<select id="selectAgingTotalInvoice" resultType="com.by4cloud.platformx.business.vo.AgingVo">
+		SELECT
+			ranges.overdue_range,
+			COALESCE (
+					sum(amount-paid_amount),
+					0
+				) AS total_amount
+		FROM
+			(
+				SELECT
+					'0-30澶�' AS overdue_range,
+					0 AS min_days,
+					30 AS max_days UNION ALL
+				SELECT
+					'31-60澶�',
+					31,
+					60 UNION ALL
+				SELECT
+					'61-90澶�',
+					61,
+					90 UNION ALL
+				SELECT
+					'91-180澶�',
+					91,
+					180 UNION ALL
+				SELECT
+					'181-365澶�',
+					181,
+					365 UNION ALL
+				SELECT
+					'1骞翠互涓�',
+					366,
+					999999
+			) ranges
+				LEFT JOIN contract c ON c.del_flag = '0'
+				AND DATEDIFF(
+														CURRENT_DATE,
+														( SELECT max( out_bound_time ) FROM contract_out_bound cob WHERE cob.del_flag = '0' AND cob.contract_id = c.id ORDER BY out_bound_time ASC )) BETWEEN ranges.min_days
+											AND ranges.max_days
+		WHERE
+			c.del_flag = '0'
+		  AND c.amount > c.paid_amount
+		<if test="queryDTO.companyId !=null">
+			and c.party_a_id = #{queryDTO.companyId}
+		</if>
+		  AND EXISTS ( SELECT 1 FROM contract_invoice ci WHERE ci.del_flag = '0' AND ci.contract_id = c.id)
+		GROUP BY
+			ranges.overdue_range,
+			ranges.min_days
+		ORDER BY
+			ranges.min_days;
+	</select>
 </mapper>
\ No newline at end of file

--
Gitblit v1.9.1