Commit c4db7e50 by zhangxingmin

push

parent f62da5ab
...@@ -351,52 +351,88 @@ public class ApiCommissionExpectedController { ...@@ -351,52 +351,88 @@ public class ApiCommissionExpectedController {
* @param commissionExpectedQueryRequest * @param commissionExpectedQueryRequest
* @return * @return
*/ */
// @PostMapping("/receivable_report")
// @Operation(summary = "应收款报表")
// public Result<ReceivableReportResponse> receivableReport(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) {
// //保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表
// List<String> queryPolicyNoList = new ArrayList<>();
// Boolean queryFlag = false;
// if (StringUtils.isNotBlank(commissionExpectedQueryRequest.getPolicyHolder())
// || StringUtils.isNotBlank(commissionExpectedQueryRequest.getSigner())
// || StringUtils.isNotBlank(commissionExpectedQueryRequest.getBrokerName())
// || StringUtils.isNotBlank(commissionExpectedQueryRequest.getInsured())
// ){
// queryPolicyNoList = policyFollowService.queryPolicyNoList(
// commissionExpectedQueryRequest.getPolicyHolder(),
// commissionExpectedQueryRequest.getSigner(),
// commissionExpectedQueryRequest.getBrokerName(),
// commissionExpectedQueryRequest.getInsured());
// queryFlag = true;
// }
// log.info("应收款报表=>receivableReport=>queryPolicyNoList:{}",JSON.toJSONString(queryPolicyNoList));
// // 构建查询条件
// commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
// commissionExpectedQueryRequest.setQueryFlag(queryFlag);
// QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
//
//// List<Long> allExpectedIdList = new ArrayList<>();
// // 先查询所有符合条件的记录ID(用于统计)
//// List<CommissionExpected> allCommissionExpectedList = commissionExpectedService.list(queryWrapper);
//// List<Long> allExpectedIdList = allCommissionExpectedList.stream().map(CommissionExpected::getId).collect(Collectors.toList());
//
// // 查询统计数据(基于所有符合条件的记录)
//// CommissionExpectedStatisticsVO statisticsVO = commissionExpectedService.getExpectedStatisticsNew(allCommissionExpectedList);
//
// queryWrapper.select("id");
// List<Long> allExpectedIdList = commissionExpectedService.listObjs(queryWrapper, obj -> (Long) obj);
//
// // 应收款报表分页查询 - 按保单号和期数维度统计
// Page<ReceivableReportVO> reportPage = new Page<>(commissionExpectedQueryRequest.getPageNo(), commissionExpectedQueryRequest.getPageSize());
// IPage<ReceivableReportVO> receivableReportPage = new Page<>(commissionExpectedQueryRequest.getPageNo(), commissionExpectedQueryRequest.getPageSize());
// if (!CollectionUtils.isEmpty(allExpectedIdList)) {
// receivableReportPage = commissionExpectedService.receivableReportPage(reportPage, allExpectedIdList);
// }
//// enrichReceivableReportWithCompanyName(receivableReportPage);
// receivableReportPage = convertReceivableReport(receivableReportPage);
// // 组装返回结果
// ReceivableReportResponse response = new ReceivableReportResponse();
//// response.setStatisticsVO(statisticsVO);
// response.setPage(receivableReportPage);
// return Result.success(response);
// }
@PostMapping("/receivable_report") @PostMapping("/receivable_report")
@Operation(summary = "应收款报表") @Operation(summary = "应收款报表")
public Result<ReceivableReportResponse> receivableReport(@RequestBody CommissionExpectedQueryRequest commissionExpectedQueryRequest) { public Result<ReceivableReportResponse> receivableReport(@RequestBody CommissionExpectedQueryRequest request) {
//保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表 // 1. 根据持有人、签单人等条件查询保单号列表
List<String> queryPolicyNoList = new ArrayList<>(); List<String> queryPolicyNoList = new ArrayList<>();
Boolean queryFlag = false; Boolean queryFlag = false;
if (StringUtils.isNotBlank(commissionExpectedQueryRequest.getPolicyHolder()) if (StringUtils.isNotBlank(request.getPolicyHolder())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getSigner()) || StringUtils.isNotBlank(request.getSigner())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getBrokerName()) || StringUtils.isNotBlank(request.getBrokerName())
|| StringUtils.isNotBlank(commissionExpectedQueryRequest.getInsured()) || StringUtils.isNotBlank(request.getInsured())) {
){
queryPolicyNoList = policyFollowService.queryPolicyNoList( queryPolicyNoList = policyFollowService.queryPolicyNoList(
commissionExpectedQueryRequest.getPolicyHolder(), request.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(), request.getSigner(),
commissionExpectedQueryRequest.getBrokerName(), request.getBrokerName(),
commissionExpectedQueryRequest.getInsured()); request.getInsured());
queryFlag = true; queryFlag = true;
} }
log.info("应收款报表=>receivableReport=>queryPolicyNoList:{}",JSON.toJSONString(queryPolicyNoList)); log.info("应收款报表=>receivableReport=>queryPolicyNoList:{}", JSON.toJSONString(queryPolicyNoList));
// 构建查询条件
commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
commissionExpectedQueryRequest.setQueryFlag(queryFlag);
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
// List<Long> allExpectedIdList = new ArrayList<>();
// 先查询所有符合条件的记录ID(用于统计)
// List<CommissionExpected> allCommissionExpectedList = commissionExpectedService.list(queryWrapper);
// List<Long> allExpectedIdList = allCommissionExpectedList.stream().map(CommissionExpected::getId).collect(Collectors.toList());
// 查询统计数据(基于所有符合条件的记录) // 2. 将保单号列表设回请求对象
// CommissionExpectedStatisticsVO statisticsVO = commissionExpectedService.getExpectedStatisticsNew(allCommissionExpectedList); request.setPolicyNoList(queryPolicyNoList);
request.setQueryFlag(queryFlag);
queryWrapper.select("id"); // 3. 直接分页查询(无需先查 ID)
List<Long> allExpectedIdList = commissionExpectedService.listObjs(queryWrapper, obj -> (Long) obj); Page<ReceivableReportVO> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ReceivableReportVO> receivableReportPage = commissionExpectedService.receivableReportPage(page, request);
// 应收款报表分页查询 - 按保单号和期数维度统计 // 4. 后处理:补充产品名称等字段,以及待入账金额归零逻辑
Page<ReceivableReportVO> reportPage = new Page<>(commissionExpectedQueryRequest.getPageNo(), commissionExpectedQueryRequest.getPageSize());
IPage<ReceivableReportVO> receivableReportPage = new Page<>(commissionExpectedQueryRequest.getPageNo(), commissionExpectedQueryRequest.getPageSize());
if (!CollectionUtils.isEmpty(allExpectedIdList)) {
receivableReportPage = commissionExpectedService.receivableReportPage(reportPage, allExpectedIdList);
}
// enrichReceivableReportWithCompanyName(receivableReportPage);
receivableReportPage = convertReceivableReport(receivableReportPage); receivableReportPage = convertReceivableReport(receivableReportPage);
// 组装返回结果
// 5. 组装返回(统计信息暂不提供,如需可后续添加单独统计查询)
ReceivableReportResponse response = new ReceivableReportResponse(); ReceivableReportResponse response = new ReceivableReportResponse();
// response.setStatisticsVO(statisticsVO);
response.setPage(receivableReportPage); response.setPage(receivableReportPage);
return Result.success(response); return Result.success(response);
} }
......
...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; ...@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Constants; import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.model.CommissionExpected; import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO; import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
...@@ -28,8 +29,11 @@ public interface CommissionExpectedMapper extends BaseMapper<CommissionExpected> ...@@ -28,8 +29,11 @@ public interface CommissionExpectedMapper extends BaseMapper<CommissionExpected>
* @param expectedIds 预计来佣ID列表 * @param expectedIds 预计来佣ID列表
* @return 应收款报表VO分页列表 * @return 应收款报表VO分页列表
*/ */
IPage<ReceivableReportVO> receivableReportPage(@Param("page") Page<ReceivableReportVO> page, // IPage<ReceivableReportVO> receivableReportPage(@Param("page") Page<ReceivableReportVO> page,
@Param("expectedIds") List<Long> expectedIds); // @Param("expectedIds") List<Long> expectedIds);
IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page,
@Param("query") CommissionExpectedQueryRequest query);
} }
......
...@@ -82,9 +82,12 @@ public interface CommissionExpectedService extends IService<CommissionExpected> ...@@ -82,9 +82,12 @@ public interface CommissionExpectedService extends IService<CommissionExpected>
* @param expectedIds 预计来佣ID列表 * @param expectedIds 预计来佣ID列表
* @return 应收款报表VO分页列表 * @return 应收款报表VO分页列表
*/ */
IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds); // IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds);
void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException; IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page,
CommissionExpectedQueryRequest query);
void testExpectedCommission(String policyNo, String effectiveDate, String coolingOffEndDate) throws IOException;
Boolean changeStatus(CommissionExpectedChangeStatusRequest commissionExpectedChangeStatusRequest); Boolean changeStatus(CommissionExpectedChangeStatusRequest commissionExpectedChangeStatusRequest);
......
...@@ -1481,10 +1481,16 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte ...@@ -1481,10 +1481,16 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
return cal.getTime(); return cal.getTime();
} }
// @Override
// public IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds) {
// return baseMapper.receivableReportPage(page, expectedIds);
// }
@Override @Override
public IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page, List<Long> expectedIds) { public IPage<ReceivableReportVO> receivableReportPage(Page<ReceivableReportVO> page,
return baseMapper.receivableReportPage(page, expectedIds); CommissionExpectedQueryRequest query){
} return baseMapper.receivableReportPage(page, query);
};
@Override @Override
public void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException { public void testExpectedCommission(String policyNo,String effectiveDate,String coolingOffEndDate) throws IOException {
......
...@@ -69,98 +69,156 @@ ...@@ -69,98 +69,156 @@
</select> </select>
<select id="receivableReportPage" resultType="com.yd.csf.service.vo.ReceivableReportVO"> <select id="receivableReportPage" resultType="com.yd.csf.service.vo.ReceivableReportVO">
select <!-- 预先获取每个 policy_biz_id 对应的第一条保单持有人和受保人信息 -->
null as receivableNo, <!-- 使用子查询 + MIN(id) 方式,兼容 MySQL 5.7 -->
ce.policy_no as policyNo, SELECT
'' as policyHolder, tmp.*
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn, FROM (
(select pi.name from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insured, -- 关联保单应收单部分
(select pi.name_en from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insuredEn, SELECT
ce.manual_remark as manualRemark, NULL AS receivableNo,
MAX(ce.reconciliation_company) as reconciliationCompany, ce.policy_no AS policyNo,
MAX(ce.reconciliation_company_biz_id) as reconciliationCompanyBizId, ph.name AS policyHolder,
ce.commission_period as commissionPeriod, ph.name_en AS policyHolderEn,
MAX(ce.total_period) as totalPeriod, ins.name AS insured,
MAX(ce.commission_date) as commissionDate, ins.name_en AS insuredEn,
ifnull(sum(ce.commission_ratio), 0) as commissionRatio, ce.manual_remark AS manualRemark,
ifnull(sum(ce.paid_ratio), 0) as paid, MAX(ce.reconciliation_company) AS reconciliationCompany,
ifnull(sum(ce.amount), 0) as amount, MAX(ce.reconciliation_company_biz_id) AS reconciliationCompanyBizId,
MAX(ce.currency) as currency, ce.commission_period AS commissionPeriod,
ifnull(sum(ce.expected_amount), 0) as hkdAmount, MAX(ce.total_period) AS totalPeriod,
ifnull(sum(ce.paid_amount), 0) as paidAmount, MAX(ce.commission_date) AS commissionDate,
ifnull(sum(ce.expected_amount) - sum(ce.paid_amount), 0) as unpaidAmount, IFNULL(SUM(ce.commission_ratio), 0) AS commissionRatio,
case when ifnull(sum(ce.expected_amount), 0) > 0 IFNULL(SUM(ce.paid_ratio), 0) AS paid,
then round(ifnull(sum(ce.paid_amount), 0) / ifnull(sum(ce.expected_amount), 0) * 100, 2) IFNULL(SUM(ce.amount), 0) AS amount,
else 0 MAX(ce.currency) AS currency,
end as paidRatio, IFNULL(SUM(ce.expected_amount), 0) AS hkdAmount,
case when ifnull(sum(ce.expected_amount), 0) > 0 IFNULL(SUM(ce.paid_amount), 0) AS paidAmount,
then round((ifnull(sum(ce.expected_amount), 0) - ifnull(sum(ce.paid_amount), 0)) / ifnull(sum(ce.expected_amount), 0) * 100, 2) IFNULL(SUM(ce.expected_amount) - SUM(ce.paid_amount), 0) AS unpaidAmount,
else 0 CASE WHEN IFNULL(SUM(ce.expected_amount), 0) > 0
end as unpaidRatio, THEN ROUND(IFNULL(SUM(ce.paid_amount), 0) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
MAX(ce.default_exchange_rate) as exchangeRate, ELSE 0
MAX(p.insurance_company) as insuranceCompany, END AS paidRatio,
MAX(p.product_name) as productName, CASE WHEN IFNULL(SUM(ce.expected_amount), 0) > 0
ifnull(avg(ce.premium), 0) as premium, THEN ROUND((IFNULL(SUM(ce.expected_amount), 0) - IFNULL(SUM(ce.paid_amount), 0)) / IFNULL(SUM(ce.expected_amount), 0) * 100, 2)
MAX(p.currency) as policyCurrency ELSE 0
from commission_expected ce END AS unpaidRatio,
left join policy p on ce.policy_no = p.policy_no MAX(ce.default_exchange_rate) AS exchangeRate,
<where> MAX(p.insurance_company) AS insuranceCompany,
ce.commission_biz_type = 'R' MAX(p.product_name) AS productName,
<if test="expectedIds != null and expectedIds.size > 0"> IFNULL(AVG(ce.premium), 0) AS premium,
and ce.id in MAX(p.currency) AS policyCurrency
<foreach collection="expectedIds" item="item" open="(" close=")" separator=","> FROM commission_expected ce
#{item} LEFT JOIN policy p ON ce.policy_no = p.policy_no
</foreach> LEFT JOIN (
</if> SELECT policy_biz_id, name, name_en
and ce.is_deleted = 0 FROM policy_policyholder
</where> WHERE id IN (SELECT MIN(id) FROM policy_policyholder GROUP BY policy_biz_id)
group by ce.policy_no, ce.commission_period ) ph ON ph.policy_biz_id = p.policy_biz_id
union all LEFT JOIN (
select SELECT policy_biz_id, name, name_en
ce.receivable_no as receivableNo, FROM policy_insurant
ce.policy_no as policyNo, WHERE id IN (SELECT MIN(id) FROM policy_insurant GROUP BY policy_biz_id)
(select pp.name from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolder, ) ins ON ins.policy_biz_id = p.policy_biz_id
(select pp.name_en from policy_policyholder pp where pp.policy_biz_id = p.policy_biz_id limit 1) as policyHolderEn, WHERE ce.commission_biz_type = 'R'
(select pi.name from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insured, AND ce.is_deleted = 0
(select pi.name_en from policy_insurant pi where pi.policy_biz_id = p.policy_biz_id limit 1) as insuredEn, <include refid="receivableReportWhere"/>
ce.manual_remark as manualRemark, GROUP BY ce.policy_no, ce.commission_period
ce.reconciliation_company as reconciliationCompany,
ce.reconciliation_company_biz_id as reconciliationCompanyBizId, UNION ALL
ce.commission_period as commissionPeriod,
ce.total_period as totalPeriod, -- 非关联保单应收单部分
ce.commission_date as commissionDate, SELECT
null as commissionRatio, ce.receivable_no AS receivableNo,
null as paid, ce.policy_no AS policyNo,
ifnull(ce.amount, 0) as amount, ph.name AS policyHolder,
ce.currency as currency, ph.name_en AS policyHolderEn,
ifnull(ce.expected_amount, 0) as hkdAmount, ins.name AS insured,
ifnull(ce.paid_amount, 0) as paidAmount, ins.name_en AS insuredEn,
ifnull(ce.expected_amount - ce.paid_amount, 0) as unpaidAmount, ce.manual_remark AS manualRemark,
case when ifnull(ce.expected_amount, 0) > 0 ce.reconciliation_company AS reconciliationCompany,
then round(ifnull(ce.paid_amount, 0) / ifnull(ce.expected_amount, 0) * 100, 2) ce.reconciliation_company_biz_id AS reconciliationCompanyBizId,
else 0 ce.commission_period AS commissionPeriod,
end as paidRatio, ce.total_period AS totalPeriod,
case when ifnull(ce.expected_amount, 0) > 0 ce.commission_date AS commissionDate,
then round((ifnull(ce.expected_amount, 0) - ifnull(ce.paid_amount, 0)) / ifnull(ce.expected_amount, 0) * 100, 2) NULL AS commissionRatio,
else 0 NULL AS paid,
end as unpaidRatio, IFNULL(ce.amount, 0) AS amount,
ce.default_exchange_rate as exchangeRate, ce.currency AS currency,
p.insurance_company as insuranceCompany, IFNULL(ce.expected_amount, 0) AS hkdAmount,
p.product_name as productName, IFNULL(ce.paid_amount, 0) AS paidAmount,
ifnull(ce.premium, 0) as premium, IFNULL(ce.expected_amount - ce.paid_amount, 0) AS unpaidAmount,
null as policyCurrency CASE WHEN IFNULL(ce.expected_amount, 0) > 0
from commission_expected ce THEN ROUND(IFNULL(ce.paid_amount, 0) / IFNULL(ce.expected_amount, 0) * 100, 2)
left join policy p on ce.policy_no = p.policy_no ELSE 0
<where> END AS paidRatio,
ce.commission_biz_type = 'U' CASE WHEN IFNULL(ce.expected_amount, 0) > 0
<if test="expectedIds != null and expectedIds.size > 0"> THEN ROUND((IFNULL(ce.expected_amount, 0) - IFNULL(ce.paid_amount, 0)) / IFNULL(ce.expected_amount, 0) * 100, 2)
and ce.id in ELSE 0
<foreach collection="expectedIds" item="item" open="(" close=")" separator=","> END AS unpaidRatio,
#{item} ce.default_exchange_rate AS exchangeRate,
</foreach> p.insurance_company AS insuranceCompany,
</if> p.product_name AS productName,
and ce.is_deleted = 0 IFNULL(ce.premium, 0) AS premium,
</where> NULL AS policyCurrency
FROM commission_expected ce
LEFT JOIN policy p ON ce.policy_no = p.policy_no
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_policyholder
WHERE id IN (SELECT MIN(id) FROM policy_policyholder GROUP BY policy_biz_id)
) ph ON ph.policy_biz_id = p.policy_biz_id
LEFT JOIN (
SELECT policy_biz_id, name, name_en
FROM policy_insurant
WHERE id IN (SELECT MIN(id) FROM policy_insurant GROUP BY policy_biz_id)
) ins ON ins.policy_biz_id = p.policy_biz_id
WHERE ce.commission_biz_type = 'U'
AND ce.is_deleted = 0
<include refid="receivableReportWhere"/>
) tmp
ORDER BY tmp.commissionDate DESC, tmp.policyNo, tmp.commissionPeriod
</select> </select>
<!-- 公共 WHERE 条件片段 -->
<sql id="receivableReportWhere">
<if test="query.policyNo != null and query.policyNo != ''">
AND ce.policy_no = #{query.policyNo}
</if>
<if test="query.policyNoList != null and query.policyNoList.size > 0">
AND ce.policy_no IN
<foreach collection="query.policyNoList" item="no" open="(" close=")" separator=",">
#{no}
</foreach>
</if>
<if test="query.commissionDateStart != null">
AND ce.commission_date >= #{query.commissionDateStart}
</if>
<if test="query.commissionDateEnd != null">
AND ce.commission_date &lt;= #{query.commissionDateEnd}
</if>
<if test="query.commissionPeriod != null">
AND ce.commission_period = #{query.commissionPeriod}
</if>
<if test="query.commissionType != null and query.commissionType != ''">
AND ce.commission_type = #{query.commissionType}
</if>
<if test="query.reconciliationCompanyBizIdList != null and query.reconciliationCompanyBizIdList.size > 0">
AND ce.reconciliation_company_biz_id IN
<foreach collection="query.reconciliationCompanyBizIdList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="query.insurerCompanyBizIdList != null and query.insurerCompanyBizIdList.size > 0">
AND ce.insurance_company_biz_id IN
<foreach collection="query.insurerCompanyBizIdList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
<if test="query.productLaunchBizId != null and query.productLaunchBizId != ''">
AND ce.product_launch_biz_id = #{query.productLaunchBizId}
</if>
<!-- 可根据需要添加更多条件,如 statusList 等 -->
</sql>
</mapper> </mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment