Commit b70d4af7 by zhangxingmin

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

parents 744d58f7 0707d9ed
package com.yd.csf.api.controller;
import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
......@@ -14,6 +15,7 @@ import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
......@@ -30,7 +32,9 @@ import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
......@@ -247,6 +251,19 @@ public class ApiCommissionController {
}
/**
* 计算统计数据 总金额、总入账金额、待入账金额、已入账比例(已入账金额/总金额)、总保单数
*/
@PostMapping("/statistics")
@Operation(summary = "计算统计数据 总金额、总入账金额、待入账金额、已入账比例(已入账金额/总金额)、总保单数")
public Result<CommissionStatisticsVO> getCommissionStatistics(@RequestBody CommissionStatisticsRequest commissionStatisticsRequest) {
if (commissionStatisticsRequest == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(commissionService.getCommissionStatistics(commissionStatisticsRequest.getCommissionIds()));
}
/**
* 根据 commissionBizId 获取保单来佣(封装类)
*
* @param commissionBizId
......@@ -293,16 +310,26 @@ public class ApiCommissionController {
*/
@PostMapping("/list/page/vo")
@Operation(summary = "分页获取保单来佣列表")
public Result<Page<CommissionVO>> listPolicyFollowByPage(@RequestBody CommissionQueryRequest commissionQueryRequest,
public Result<Map<String, Object>> listPolicyFollowByPage(@RequestBody CommissionQueryRequest commissionQueryRequest,
HttpServletRequest request) {
long current = commissionQueryRequest.getPageNo();
long size = commissionQueryRequest.getPageSize();
// 查询数据库
// 查询列表数据
QueryWrapper<Commission> queryWrapper = commissionService.getQueryWrapper(commissionQueryRequest);
Page<Commission> commissionPage = commissionService.page(new Page<>(current, size),
commissionService.getQueryWrapper(commissionQueryRequest));
// 获取封装类
return Result.success(commissionService.getCommissionVOPage(commissionPage));
queryWrapper);
// 查询统计数据
List<Commission> commissionList = commissionService.list(queryWrapper);
// 计算统计数据
List<Long> commissionIds = commissionList.stream().map(Commission::getId).collect(Collectors.toList());
CommissionStatisticsVO commissionStatisticsVO = commissionService.getCommissionStatistics(commissionIds);
// 组装返回值
Map<String, Object> map = new HashMap<>();
map.put("commissionStatisticsVO", commissionStatisticsVO);
map.put("page", commissionService.getCommissionVOPage(commissionPage));
return Result.success(map);
}
}
......@@ -12,19 +12,18 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.api.dto.PolicyExcelDTO;
import com.yd.csf.api.dto.PolicyFollowDTO;
import com.yd.csf.api.listener.PolicyDataListener;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.enums.PolicyFollowStatusEnum;
import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*;
import com.yd.csf.service.utils.AsyncQueryUtil;
import com.yd.csf.service.vo.PolicyFollowDetailVO;
import com.yd.csf.service.vo.PolicyFollowRecordVO;
import com.yd.csf.service.vo.PolicyFollowVO;
......@@ -35,13 +34,15 @@ import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.util.*;
......@@ -82,6 +83,10 @@ public class ApiPolicyFollowController {
private PolicyFollowFileService policyFollowFileService;
@Resource
private PolicyReportPdfService policyReportPdfService;
@PostMapping("/upload/excel")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> uploadExcel(@RequestParam("file") MultipartFile file) throws Exception {
......@@ -258,6 +263,8 @@ public class ApiPolicyFollowController {
if (policyFollow.getEffectiveDate()!= null && policyFollow.getCoolingOffDays() != null) {
policyFollow.setCoolingOffEndDate(DateUtil.offset(policyFollow.getEffectiveDate(), DateField.DAY_OF_MONTH, policyFollow.getCoolingOffDays()));
}
// 获取币种字典值
policyFollow.setCurrency(policyFollowService.getCurrencyValue(policyExcelDTO.getCurrency()));
// 转换为Policy对象
Policy policy = new Policy();
......@@ -549,4 +556,89 @@ public class ApiPolicyFollowController {
List<PolicyFollowRecord> policyFollowStatusList = policyFollowRecordService.list(queryWrapper);
return Result.success(policyFollowRecordService.getVOList(policyFollowStatusList));
}
/**
* 生成签约单
*/
@GetMapping(value = "/report/download", produces = "application/pdf")
@Operation(summary = "生成签约单")
public void previewPolicyReport(@RequestParam("policyBizId") String policyBizId,
HttpServletResponse response) {
PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
if (policyFollow == null) {
throw new BusinessException(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
}
PolicyReportData reportData = new PolicyReportData();
// 填充数据
// reportData.setStartTime("2025-10-30");
// reportData.setEndTime("2025-10-30");
// reportData.setLocation("香港");
// reportData.setServiceManager("Vickie");
// reportData.setPolicyHolder(policyFollow.getPolicyHolder());
// reportData.setPolicyNumber(policyFollow.getPolicyNo());
// reportData.setInsuranceCompany(policyFollow.getInsurer());
// reportData.setInsuredPerson(policyFollow.getInsured());
// reportData.setInsurancePlan(policyFollow.getProductName());
// reportData.setInsuredAge(0);
// reportData.setCurrency(policyFollow.getCurrency());
// reportData.setPaymentPeriod((Integer) policyFollow.getPaymentTerm());
// reportData.setAnnualAmount(policyFollow.getPaymentPremium());
// reportData.setTotalPrepayment(BigDecimal.ZERO);
// reportData.setPremiumFee(BigDecimal.ZERO);
reportData.setStartTime("2025-10-30");
reportData.setEndTime("2025-10-30");
reportData.setLocation("香港");
reportData.setServiceManager("Vickie");
reportData.setPolicyHolder("policyHolder");
reportData.setPolicyNumber("B635379588");
reportData.setInsuranceCompany("友邦保险");
reportData.setInsuredPerson("insuredPerson");
reportData.setInsurancePlan("环宇盈活储蓄保险计划");
reportData.setInsuredAge(1);
reportData.setCurrency("HKD");
reportData.setPaymentPeriod(5);
reportData.setAnnualAmount(BigDecimal.valueOf(30000.08));
reportData.setTotalPrepayment(BigDecimal.valueOf(150064.70));
reportData.setPremiumFee(BigDecimal.valueOf(12.86));
try {
log.info("收到PDF生成请求: {}", reportData);
log.info("PolicyReportData 内容检查:");
log.info("startTime: {}", reportData.getStartTime());
log.info("endTime: {}", reportData.getEndTime());
log.info("location: {}", reportData.getLocation());
log.info("serviceManager: {}", reportData.getServiceManager());
byte[] pdfBytes = policyReportPdfService.generatePolicyReport(reportData);
if (pdfBytes == null || pdfBytes.length == 0) {
log.error("生成的PDF为空");
throw new BusinessException("生成的PDF内容为空");
}
log.info("PDF生成成功,大小: {} bytes", pdfBytes.length);
// 设置下载响应头
response.setContentType("application/pdf");
response.setHeader("Content-Disposition", "attachment; filename=policy-report-" +
reportData.getPolicyNumber() + ".pdf");
response.setContentLength(pdfBytes.length);
// 写入响应流
ServletOutputStream outputStream = response.getOutputStream();
outputStream.write(pdfBytes);
outputStream.flush();
log.info("PDF响应发送完成");
} catch (Exception e) {
log.error("PDF预览失败", e);
throw new BusinessException("PDF预览失败: " + e.getMessage());
}
}
}
\ No newline at end of file
......@@ -12,6 +12,20 @@
<artifactId>yd-csf-service</artifactId>
<dependencies>
<!-- 公共工具类 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- itextpdf -->
<dependency>
<groupId>com.github.librepdf</groupId>
<artifactId>openpdf</artifactId>
<version>1.3.30</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
......@@ -104,5 +118,10 @@
<artifactId>yd-feign</artifactId>
<version>${project.version}</version>
</dependency>
<!-- 添加AOP依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.csf.service.dao;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yd.csf.service.dto.CommissionBindPolicyBrokerDto;
import com.yd.csf.service.dto.CommissionDto;
import com.yd.csf.service.model.Commission;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -17,6 +20,8 @@ import java.util.List;
public interface CommissionMapper extends BaseMapper<Commission> {
List<CommissionBindPolicyBrokerDto> queryCommissionBindPolicyBrokerList(@Param("dto") CommissionDto dto);
CommissionStatisticsVO getCommissionStatistics(@Param("commissionIdList") List<Long> commissionIdList);
}
......
......@@ -64,6 +64,12 @@ public class CommissionAddRequest implements Serializable {
private String currency;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private String exchangeRate;
/**
* 来佣日期
*/
@Schema(description = "来佣日期", requiredMode = Schema.RequiredMode.REQUIRED, format = "yyyy-MM-dd")
......
......@@ -49,5 +49,12 @@ public class CommissionQueryRequest extends PageDto implements Serializable {
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDateEnd;
/**
* 预计入账日期
*/
@Schema(description = "预计入账日期 格式-yyyy-MM-dd", example = "2023-01-01")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date expectedDate;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class CommissionStatisticsRequest {
/**
* 佣金ID列表
*/
@Schema(description = "佣金ID列表")
private List<Long> commissionIds;
}
......@@ -75,6 +75,12 @@ public class CommissionUpdateRequest implements Serializable {
@Schema(description = "来佣币种")
private String currency;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private String exchangeRate;
/**
* 来佣日期
*/
......
package com.yd.csf.service.dto;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
@Data
public class PolicyReportData {
// 基本信息
private String startTime;
private String endTime;
private String location;
private String serviceManager;
// 保单详细信息
private String policyHolder;
private String policyNumber;
private String insuranceCompany;
private String insuredPerson;
private String insurancePlan;
private Integer insuredAge;
private String currency;
private Integer paymentPeriod;
private BigDecimal annualAmount;
private BigDecimal totalPrepayment;
private BigDecimal premiumFee;
// 附加险信息
private List<AdditionalInsurance> additionalInsurances;
@Data
public static class AdditionalInsurance {
private String name;
private String paymentTerm;
private String currency;
private BigDecimal firstYearAmount;
}
}
......@@ -9,6 +9,7 @@ public enum FortuneStatusEnum {
WAIT("待出账", "0"),
CAN_SEND("可出账", "1"),
SENT("已出账", "2"),
MATCH_FAIL("未找到当前预计发佣对应的来佣", "3"),
;
//字典项标签(名称)
......
......@@ -30,6 +30,11 @@ public class Fortune implements Serializable {
*/
private String fortuneBizId;
/**
* 来佣保单业务id
*/
private String commissionBizId;
/**
* 保单号
*/
......
......@@ -7,6 +7,7 @@ import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.Commission;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.vo.CommissionStatisticsVO;
import com.yd.csf.service.vo.CommissionVO;
import java.util.List;
......@@ -36,4 +37,6 @@ public interface CommissionService extends IService<Commission> {
List<Commission> queryList(CommissionDto dto);
List<CommissionBindPolicyBrokerDto> queryCommissionBindPolicyBrokerList(CommissionDto dto);
CommissionStatisticsVO getCommissionStatistics(List<Long> commissionIds);
}
......@@ -42,4 +42,6 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
PolicyFollowAggregateDto getPolicyFollowAggregate(String policyBizId);
Page<PolicyFollowDetailVO> getPolicyFollowDetailVOList(Page<PolicyFollow> policyFollowPage);
String getCurrencyValue(String currency);
}
......@@ -157,6 +157,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
if (policyFollowUpdateDto.getCoolingOffDays() != null && policyFollowUpdateDto.getEffectiveDate() != null) {
policyFollow.setCoolingOffEndDate(DateUtil.offset(policyFollowUpdateDto.getEffectiveDate(), DateField.DAY_OF_MONTH, policyFollowUpdateDto.getCoolingOffDays()));
}
// 获取币种字典值
policyFollow.setCurrency(this.getCurrencyValue(policyFollowUpdateDto.getCurrency()));
}
// 设置核保信息
setValidPolicyInfo(policyFollow, policyFollowUpdateRequest.getVerifyPolicyInfo());
......@@ -248,6 +250,9 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
if (policyFollowAddRequest.getCoolingOffDays() != null) {
policyFollow.setCoolingOffEndDate(DateUtil.offset(policyFollowAddRequest.getEffectiveDate(), DateField.DAY_OF_MONTH, policyFollowAddRequest.getCoolingOffDays()));
}
// 获取币种字典值
policyFollow.setCurrency(this.getCurrencyValue(policyFollowAddRequest.getCurrency()));
// 创建 Policy对象
Policy policy = new Policy();
BeanUtils.copyProperties(policyFollowAddRequest, policy);
......@@ -527,6 +532,42 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
}
@Override
public String getCurrencyValue(String currency) {
if (StringUtils.isBlank(currency)) {
return null;
}
switch (currency) {
case "美元":
currency = "USD";
break;
case "人民幣":
currency = "CNY";
break;
case "港幣":
currency = "HKD";
break;
case "澳元":
currency = "AUD";
break;
case "加元":
currency = "CAD";
break;
case "欧元":
currency = "EUR";
break;
case "英鎊":
currency = "GBP";
break;
case "新加坡元":
currency = "SGD";
break;
default:
break;
}
return currency;
}
@Override
public Boolean uploadAttachment(AttachmentUploadRequest attachmentUploadRequest) {
String policyBizId = attachmentUploadRequest.getPolicyBizId();
if (policyBizId == null) {
......
package com.yd.csf.service.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 佣金统计VO 包含总金额、总入账金额、待入账金额、已入账比例(已入账金额/总金额)、总保单数
*/
@Data
public class CommissionStatisticsVO {
/**
* 总金额
*/
@Schema(description = "总金额")
private BigDecimal totalAmount;
/**
* 总入账金额
*/
@Schema(description = "总入账金额")
private BigDecimal totalPaidAmount;
/**
* 待入账金额
*/
@Schema(description = "待入账金额")
private BigDecimal pendingPaidAmount;
/**
* 已入账比例(已入账金额/总金额)
*/
@Schema(description = "已入账比例(已入账金额/总金额)")
private String paidAmountRatio;
/**
* 总保单数
*/
@Schema(description = "总保单数")
private Integer totalPolicyCount;
}
......@@ -14,6 +14,12 @@ import java.util.Date;
public class CommissionVO implements Serializable {
/**
* commission id
*/
@Schema(description = "commission id")
private Long id;
/**
* 保单来佣业务id
*/
@Schema(description = "保单来佣业务id")
......
......@@ -52,4 +52,26 @@
left join policy_broker pb on pb.policy_no = p.policy_no and pb.is_deleted = 0
</select>
<!-- 总金额:统计保单预计来佣表 已入账金额:统计来佣表-->
<select id="getCommissionStatistics" resultType="com.yd.csf.service.vo.CommissionStatisticsVO">
SELECT
COALESCE(SUM(e.amount), 0) as totalAmount,
COALESCE(SUM(c.amount), 0) as totalPaidAmount,
COUNT(DISTINCT c.policy_no) as totalPolicyCount
FROM commission c
LEFT JOIN (
SELECT policy_no, SUM(amount) as amount
FROM commission_expected
GROUP BY policy_no
) e ON c.policy_no = e.policy_no
<where>
<if test="commissionIdList != null and commissionIdList.size > 0">
c.id IN
<foreach collection="commissionIdList" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</if>
</where>
</select>
</mapper>
......@@ -7,6 +7,7 @@
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.Fortune">
<id property="id" column="id" />
<result property="fortuneBizId" column="fortune_biz_id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="policyNo" column="policy_no" />
<result property="fortunePeriod" column="fortune_period" />
<result property="fortuneTotalPeriod" column="fortune_total_period" />
......@@ -36,7 +37,7 @@
</resultMap>
<sql id="Base_Column_List">
id,fortune_biz_id,policy_no,fortune_period,fortune_total_period,broker_biz_id,
id,fortune_biz_id,commission_biz_id,policy_no,fortune_period,fortune_total_period,broker_biz_id,
team_biz_id,grade_commission_rate,share_rate,fortune_name,fortune_type,
amount,currency,status,payout_date,is_tax,
tax_amount,net_amount,salary_biz_id,base_rule_biz_id,settlement_biz_id,
......
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