Commit a89661db by zhangxingmin

Merge remote-tracking branch 'origin/test' into test

parents 134b057f f5e36dfb
......@@ -6,6 +6,7 @@ import com.yd.common.result.Result;
import com.yd.common.utils.RedisUtil;
import com.yd.csf.api.dto.ApiExpectedFortuneLogDto;
import com.yd.csf.api.dto.ApiExpectedFortunePageResponseVO;
import com.yd.csf.api.dto.PayableReportResponse;
import com.yd.csf.api.service.ApiExpectedFortuneLogService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.feign.client.expectedfortune.ApiExpectedFortuneFeignClient;
......@@ -102,6 +103,17 @@ public class ApiExpectedFortuneController implements ApiExpectedFortuneFeignClie
}
/**
* 应付款报表
* @param request
* @return
*/
@PostMapping("/payable_report")
@Operation(summary = "应付款报表")
public Result<PayableReportResponse> payableReport(@RequestBody ApiExpectedFortunePageRequest request) {
return apiExpectedFortuneService.payableReport(request);
}
/**
* 计算统计数据 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
*/
@PostMapping("/statistics")
......
......@@ -14,6 +14,7 @@ import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.FortuneImportDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.model.FortuneAccount;
import com.yd.csf.service.model.FortuneAccountEditRecord;
......@@ -528,6 +529,7 @@ public class ApiFortuneController {
// 查询列表数据
QueryWrapper<Fortune> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("expected_fortune_biz_id", fortuneQueryRequest.getExpectedFortuneBizId());
queryWrapper.eq("status", FortuneStatusEnum.SENT.getItemValue());
Page<Fortune> fortunePage = fortuneService.page(new Page<>(current, size),
queryWrapper);
// 组装返回值
......
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import lombok.Data;
@Data
public class PayableReportResponse {
private ExpectedFortuneStatisticsVO statisticsVO;
/**
* 应付款报表分页列表 - 按保单号和期数维度统计
*/
private IPage<PayableReportVO> page;
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.ApiExpectedFortunePageResponseVO;
import com.yd.csf.api.dto.PayableReportResponse;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.request.expectedfortune.ExpectedFortuneAddRequest;
......@@ -45,4 +46,6 @@ public interface ApiExpectedFortuneService {
Boolean add(List<ExpectedFortuneAddRequest> request);
void exportExpectedFortune(ApiExpectedFortunePageRequest request, HttpServletResponse response);
Result<PayableReportResponse> payableReport(ApiExpectedFortunePageRequest request);
}
......@@ -31,7 +31,6 @@ import com.yd.csf.service.dto.QueryPolicyBrokerDto;
import com.yd.csf.service.enums.FortuneStatusEnum;
import com.yd.csf.service.model.CommissionRuleBinding;
import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyBroker;
import com.yd.csf.service.service.ICommissionRuleBindingService;
import com.yd.csf.service.service.IExpectedFortuneService;
......@@ -39,6 +38,7 @@ import com.yd.csf.service.service.PolicyBrokerService;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.ExpectedFortuneExportDTO;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient;
import com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse;
......@@ -61,7 +61,6 @@ import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
@Slf4j
......@@ -538,6 +537,32 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
}
}
@Override
public Result<PayableReportResponse> payableReport(ApiExpectedFortunePageRequest request) {
// 构建查询条件
QueryWrapper<ExpectedFortune> queryWrapper = this.getQueryWrapper(request);
// 先查询所有符合条件的记录ID(用于统计)
List<ExpectedFortune> allFortuneList = iExpectedFortuneService.list(queryWrapper);
List<Long> allFortuneIdList = allFortuneList.stream().map(ExpectedFortune::getId).collect(Collectors.toList());
// 查询统计数据(基于所有符合条件的记录)
ExpectedFortuneStatisticsVO statisticsVO = this.getStatistics(allFortuneIdList);
// 应付款报表分页查询 - 按保单号和期数维度统计
Page<com.yd.csf.service.vo.PayableReportVO> reportPage = new Page<>(request.getPageNo(), request.getPageSize());
IPage<com.yd.csf.service.vo.PayableReportVO> payableReportPage = null;
if (!CollectionUtils.isEmpty(allFortuneIdList)) {
payableReportPage = iExpectedFortuneService.payableReportPage(reportPage, allFortuneIdList);
}
// 组装返回结果
PayableReportResponse response = new PayableReportResponse();
response.setStatisticsVO(statisticsVO);
response.setPage(payableReportPage);
return Result.success(response);
}
/**
* 创建应付款编号 应付款类型-CSF-年份后两位-6位数字(不重复)
*
......
......@@ -7,6 +7,7 @@ import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.model.ExpectedFortune;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -27,4 +28,13 @@ public interface ExpectedFortuneMapper extends BaseMapper<ExpectedFortune> {
List<ExpectedFortune> listByPolicyBizId(@Param("policyBizId") String policyBizId);
ExpectedFortuneStatisticsVO getStatistics(@Param("expectedFortuneIds") List<Long> expectedFortuneIds);
/**
* 应付款报表 - 按保单号和期数维度统计(分页)
* @param page 分页参数
* @param expectedFortuneIds 预计发佣ID列表
* @return 应付款报表VO分页列表
*/
IPage<PayableReportVO> payableReportPage(@Param("page") Page<PayableReportVO> page,
@Param("expectedFortuneIds") List<Long> expectedFortuneIds);
}
......@@ -7,6 +7,7 @@ import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.service.model.ExpectedFortune;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import java.util.List;
......@@ -34,4 +35,12 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
IPage<ApiExpectedFortunePageResponse> getVOPage(IPage<ExpectedFortune> iPage);
List<ApiExpectedFortunePageResponse> toVOList(List<ExpectedFortune> fortuneList);
/**
* 应付款报表 - 按保单号和期数维度统计(分页)
* @param page 分页参数
* @param expectedFortuneIds 预计发佣ID列表
* @return 应付款报表VO分页列表
*/
IPage<PayableReportVO> payableReportPage(Page<PayableReportVO> page, List<Long> expectedFortuneIds);
}
......@@ -2,12 +2,10 @@ package com.yd.csf.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.PolicyInfo;
import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.model.Policy;
......@@ -15,6 +13,7 @@ import com.yd.csf.service.service.IExpectedFortuneService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.PayableReportVO;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
......@@ -105,4 +104,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
}).collect(Collectors.toList());
return expectedFortuneVOList;
}
@Override
public IPage<PayableReportVO> payableReportPage(Page<PayableReportVO> page, List<Long> expectedFortuneIds) {
return baseMapper.payableReportPage(page, expectedFortuneIds);
}
}
......@@ -161,6 +161,18 @@ public class FortuneVO implements Serializable {
private String currency;
/**
* 已出账金额
*/
@Schema(description = "已出账金额")
private BigDecimal fortunePaidAmount;
/**
* 待出账金额
*/
@Schema(description = "剩余出账金额")
private BigDecimal fortuneUnpaidAmount;
/**
* 本期出账金额
*/
@Schema(description = "本期出账金额")
......
package com.yd.csf.service.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
public class PayableReportVO {
/**
* 保单号
*/
@Schema(description = "policy no")
private String policyNo;
/**
* 转介人
*/
@Schema(description = "转介人(保单的第一位转介人)")
private String broker;
/**
* 出账期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "出账期数")
private Integer fortunePeriod;
/**
* 总期数
*/
@Schema(description = "总期数")
private Integer fortuneTotalPeriod;
/**
* 出账日
*/
@Schema(description = "出账日 (保单日+2个月)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDate;
/**
* 已出账比例 已出账金额/应出账金额
*/
@Schema(description = "已出账比例 已出账金额/应出账金额")
private BigDecimal paidRatio;
/**
* 待出账比例 待出账金额/应出账金额
*/
@Schema(description = "待出账比例 待出账金额/应出账金额")
private BigDecimal unpaidRatio;
/**
* 已出账金额
*/
@Schema(description = "已出账金额")
private BigDecimal paidAmount;
/**
* 待出账金额
*/
@Schema(description = "待出账金额")
private BigDecimal unpaidAmount;
/**
* 应出账金额(预计发佣金额 = 标准发佣金额 * 转介人介绍费占比)
*/
@Schema(description = "应出账金额(预计发佣金额 = 标准发佣金额 * 转介人介绍费占比)")
private BigDecimal amount;
/**
* 期交保费
*/
@Schema(description = "期交保费")
private BigDecimal premium;
/**
* 出账币种
*/
@Schema(description = "出账币种")
private String currency;
/**
* 应出账金额(港币)
*/
@Schema(description = "出账金额(港币)")
private BigDecimal hkdAmount;
/**
* 保险公司 ID
*/
@Schema(description = "保险公司 ID")
private String insuranceCompanyBizId;
/**
* 保险公司
*/
@Schema(description = "保险公司")
private String insuranceCompany;
/**
* 产品计划 ID
*/
@Schema(description = "产品计划 ID")
private String productLaunchBizId;
/**
* 产品计划
*/
@Schema(description = "产品计划")
private String productName;
}
......@@ -46,4 +46,57 @@
</if>
</where>
</select>
<select id="payableReportPage" resultType="com.yd.csf.service.vo.PayableReportVO">
select
ef.policy_no as policyNo,
ef.premium as premium,
ef.insurance_company_biz_id as insuranceCompanyBizId,
p.insurance_company as insuranceCompany,
ef.product_launch_biz_id as productLaunchBizId,
p.product_name as productName,
ef.fortune_period as fortunePeriod,
ef.fortune_total_period as fortuneTotalPeriod,
ifnull(sum(ef.amount), 0) as amount,
ifnull(sum(ef.hkd_amount), 0) as hkdAmount,
ef.currency as currency,
ifnull(sum(ef.paid_amount), 0) as paidAmount,
ifnull(sum(ef.unpaid_amount), 0) as unpaidAmount,
case when ifnull(sum(ef.hkd_amount), 0) > 0
then round(ifnull(sum(ef.paid_amount), 0) / ifnull(sum(ef.hkd_amount), 0) * 100, 2)
else 0
end as paidRatio,
case when ifnull(sum(ef.hkd_amount), 0) > 0
then round(ifnull(sum(ef.unpaid_amount), 0) / ifnull(sum(ef.hkd_amount), 0) * 100, 2)
else 0
end as unpaidRatio,
first_broker.broker_name as broker,
DATE_ADD(DATE_ADD(p.effective_date, INTERVAL 2 MONTH), INTERVAL (ef.fortune_period - 1) YEAR) as payoutDate
from expected_fortune ef
left join policy p on ef.policy_no = p.policy_no
left join (
SELECT pb1.policy_no, pb1.broker_name
FROM policy_broker pb1
WHERE pb1.id = (
SELECT pb2.id
FROM policy_broker pb2
WHERE pb2.policy_no = pb1.policy_no
AND pb2.is_deleted = 0
ORDER BY pb2.id ASC
LIMIT 1
)
AND pb1.is_deleted = 0
) first_broker on ef.policy_no = first_broker.policy_no
<where>
<if test="expectedFortuneIds != null and expectedFortuneIds.size > 0">
ef.id in
<foreach collection="expectedFortuneIds" item="item" open="(" close=")" separator=",">
#{item}
</foreach>
</if>
and ef.is_deleted = 0
</where>
group by ef.policy_no, ef.fortune_period
order by ef.policy_no, ef.fortune_period
</select>
</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