Commit 32b93dba by jianan

新单跟进149

parent 5b3b159d
......@@ -10,15 +10,20 @@ import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.feign.client.expectedfortune.ApiExpectedFortuneFeignClient;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
import com.yd.csf.feign.request.expectedfortune.ExpectedFortuneStatisticsRequest;
import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
/**
* 预计发佣信息
*
......@@ -27,6 +32,7 @@ import javax.validation.constraints.NotBlank;
*/
@RestController
@RequestMapping("/expectedFortune")
@Tag(name = "预计发佣接口")
@Validated
public class ApiExpectedFortuneController implements ApiExpectedFortuneFeignClient {
......@@ -69,16 +75,29 @@ public class ApiExpectedFortuneController implements ApiExpectedFortuneFeignClie
}
/**
* 分页查询 - 预计发佣
* 分页查询 - 应付款管理列表(预计发佣列表)
* @param request
* @return
*/
@Override
@Operation(summary = "分页查询 - 应付款管理列表(预计发佣列表)")
public Result<IPage<ApiExpectedFortunePageResponse>> page(ApiExpectedFortunePageRequest request) {
return apiExpectedFortuneService.page(request);
}
/**
* 计算统计数据 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
*/
@PostMapping("/statistics")
@Operation(summary = "计算统计数据 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD")
public Result<ExpectedFortuneStatisticsVO> getStatistics(@RequestBody ExpectedFortuneStatisticsRequest commissionExpectedStatisticsRequest) {
if (commissionExpectedStatisticsRequest == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(apiExpectedFortuneService.getStatistics(commissionExpectedStatisticsRequest.getExpectedFortuneIds()));
}
/**
* 查询保单是否生成过预计发佣
* @param policyNo
* @return
......
......@@ -8,6 +8,7 @@ import com.yd.csf.feign.response.expectedfortune.ApiExpectedFortunePageResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.service.dto.QueryPolicyAndBrokerDto;
import com.yd.csf.service.model.CommissionRuleBinding;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import org.springframework.scheduling.annotation.Async;
import java.util.List;
......@@ -25,4 +26,6 @@ public interface ApiExpectedFortuneService {
Result<Boolean> isGenerate(String policyNo);
Result batchDelByPolicyNo(String policyNo);
ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds);
}
package com.yd.csf.api.service.impl;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.bean.BeanUtil;
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.common.constant.RedisConstants;
......@@ -31,24 +31,25 @@ import com.yd.csf.service.service.ICommissionRuleBindingService;
import com.yd.csf.service.service.IExpectedFortuneService;
import com.yd.csf.service.service.PolicyBrokerService;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import com.yd.user.feign.client.clientuser.ApiClientUserFeignClient;
import jodd.util.StringUtil;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.util.CollectionUtils;
import org.springframework.util.StringUtils;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
......@@ -416,9 +417,57 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
*/
@Override
public Result<IPage<ApiExpectedFortunePageResponse>> page(ApiExpectedFortunePageRequest request) {
Page<ApiExpectedFortunePageResponse> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiExpectedFortunePageResponse> iPage = iExpectedFortuneService.page(page, request);
return Result.success(iPage);
Page<ExpectedFortune> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ExpectedFortune> iPage = iExpectedFortuneService.page(page, this.getQueryWrapper(request));
// 转换为ApiExpectedFortunePageResponse
IPage<ApiExpectedFortunePageResponse> apiPage = iPage.convert(ApiExpectedFortuneServiceImpl::transform);
return Result.success(apiPage);
}
public static ApiExpectedFortunePageResponse transform(ExpectedFortune expectedFortune) {
ApiExpectedFortunePageResponse response = new ApiExpectedFortunePageResponse();
BeanUtil.copyProperties(expectedFortune, response);
return response;
}
public QueryWrapper<ExpectedFortune> getQueryWrapper(ApiExpectedFortunePageRequest request) {
QueryWrapper<ExpectedFortune> queryWrapper = new QueryWrapper<>();
if (request == null) {
return queryWrapper;
}
// 获取参数
String policyNo = request.getPolicyNo();
LocalDate payoutDateStart = request.getPayoutDateStart();
LocalDate payoutDateEnd = request.getPayoutDateEnd();
String status = request.getStatus();
Integer fortunePeriod = request.getFortunePeriod();
String fortuneName = request.getFortuneName();
String team = request.getTeam();
String insuranceCompany = request.getInsuranceCompany();
String productName = request.getProductName();
// String reconciliationCompany = request.getReconciliationCompany();
String broker = request.getBroker();
String signer = request.getSigner();
// 按保单号模糊查询
queryWrapper.like(StringUtils.isNotBlank(policyNo), "policy_no", policyNo);
queryWrapper.gt(ObjectUtils.isNotEmpty(payoutDateStart), "payout_date", payoutDateStart);
queryWrapper.lt(ObjectUtils.isNotEmpty(payoutDateEnd), "payout_date", payoutDateEnd);
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.eq(ObjectUtils.isNotEmpty(fortunePeriod), "fortune_period", fortunePeriod);
queryWrapper.like(StringUtils.isNotBlank(fortuneName), "fortune_name", fortuneName);
queryWrapper.like(StringUtils.isNotBlank(team), "team", team);
queryWrapper.like(StringUtils.isNotBlank(insuranceCompany), "insurance_company", insuranceCompany);
queryWrapper.like(StringUtils.isNotBlank(productName), "product_name", productName);
// queryWrapper.like(StringUtils.isNotBlank(reconciliationCompany), "reconciliation_company", reconciliationCompany);
queryWrapper.like(StringUtils.isNotBlank(broker), "broker", broker);
queryWrapper.like(StringUtils.isNotBlank(signer), "signer", signer);
// 按id升序排序
queryWrapper.orderByAsc("id");
return queryWrapper;
}
/**
......@@ -445,4 +494,24 @@ public class ApiExpectedFortuneServiceImpl implements ApiExpectedFortuneService
iExpectedFortuneService.batchDelByPolicyNo(policyNo);
return Result.success();
}
@Override
public ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds) {
// 自定义统计数据
ExpectedFortuneStatisticsVO statisticsVO = iExpectedFortuneService.getStatistics(expectedFortuneIds);
BigDecimal totalAmount = statisticsVO.getTotalExpectedAmount();
BigDecimal totalPaidAmount = statisticsVO.getTotalPaidAmount();
// 计算待出账金额
statisticsVO.setTotalUnpaidAmount(totalAmount.subtract(totalPaidAmount));
// 计算已出账比例(已出账金额/预计发佣金额)
BigDecimal divided = BigDecimal.ZERO;
if (totalAmount.compareTo(BigDecimal.ZERO) > 0) {
divided = totalPaidAmount.divide(totalAmount, 4, RoundingMode.HALF_UP);
}
// 格式化 %
statisticsVO.setPaidAmountRatio(String.format("%.2f%%", divided.doubleValue() * 100));
return statisticsVO;
}
}
package com.yd.csf.feign.request.expectedfortune;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
@Data
public class ApiExpectedFortunePageRequest extends PageDto {
/**
* 保单号
*/
@Schema(description = "保单号")
private String policyNo;
@Schema(description = "预估发佣开始日期")
private LocalDate payoutDateStart;
@Schema(description = "预估发佣结束日期")
private LocalDate payoutDateEnd;
@Schema(description = "发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效")
private String status;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)")
private Integer fortunePeriod;
@Schema(description = "发佣名称")
private String fortuneName;
@Schema(description = "出单团队")
private String team;
@Schema(description = "保险公司")
private String insuranceCompany;
@Schema(description = "产品名称")
private String productName;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
private String broker;
@Schema(description = "签单员名称")
private String signer;
}
package com.yd.csf.feign.request.expectedfortune;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class ExpectedFortuneStatisticsRequest {
/**
* expected fortune id 列表
*/
@Schema(description = "expected fortune id 列表")
private List<Long> expectedFortuneIds;
}
package com.yd.csf.feign.response.expectedfortune;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
......@@ -11,86 +12,121 @@ public class ApiExpectedFortunePageResponse {
/**
* 主键ID
*/
@Schema(description = "expected fortune id")
private Long id;
/**
* 预计发佣表唯一业务id
*/
@Schema(description = "expected fortune biz id")
private String expectedFortuneBizId;
/**
* 保单号
*/
@Schema(description = "policy no")
private String policyNo;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
@Schema(description = "fortune period")
private Integer fortunePeriod;
/**
* 发佣总期数
*/
@Schema(description = "fortune total period")
private Integer fortuneTotalPeriod;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
private String brokerBizId;
/**
* 团队名称
*/
@Schema(description = "团队名称")
private String team;
/**
* 所属团队业务ID
*/
@Schema(description = "所属团队 biz id")
private String teamBizId;
/**
* 发佣名称
*/
@Schema(description = "发佣名称")
private String fortuneName;
/**
* 发佣类型
*/
@Schema(description = "发佣类型")
private String fortuneType;
/**
* 发佣金额
* 预计应发金额
*/
@Schema(description = "预计应发金额")
private BigDecimal amount;
/**
* 发佣币种
*/
@Schema(description = "发佣币种")
private String currency;
/**
* 发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效
*/
@Schema(description = "发佣状态 0=待出账 1=可出帐 2=完成出账 3=部分出账 4=保留 5=已失效")
private String status;
/**
* 预计发佣日期
*/
@Schema(description = "预计发佣日期")
private LocalDate payoutDate;
/**
* 已出账金额
*/
@Schema(description = "已出账金额")
private BigDecimal paidAmount;
/**
* 待出账金额
*/
@Schema(description = "待出账金额")
private BigDecimal unPaidAmount;
/**
* 发佣比例 已发佣金额/应发佣金额
*/
@Schema(description = "发佣比例 已发佣金额/应发佣金额")
private BigDecimal paidRatio;
/**
* 基本法项目配置表唯一业务ID
*/
@Schema(description = "rule item biz id")
private String ruleItemBizId;
/**
* 创建时间
*/
@Schema(description = "create time")
private LocalDateTime createTime;
}
......@@ -6,6 +6,7 @@ import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
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 org.apache.ibatis.annotations.Param;
import java.util.List;
......@@ -24,4 +25,6 @@ public interface ExpectedFortuneMapper extends BaseMapper<ExpectedFortune> {
@Param("request") ApiExpectedFortunePageRequest request);
List<ExpectedFortune> listByPolicyBizId(@Param("policyBizId") String policyBizId);
ExpectedFortuneStatisticsVO getStatistics(@Param("expectedFortuneIds") List<Long> expectedFortuneIds);
}
......@@ -128,6 +128,24 @@ public class ExpectedFortune implements Serializable {
@TableField("payout_date")
private LocalDate payoutDate;
/**
* 已出账金额
*/
@TableField("paid_amount")
private BigDecimal paidAmount;
/**
* 待出账金额
*/
@TableField("un_paid_amount")
private BigDecimal unPaidAmount;
/**
* 发佣比例 已发佣金额/应发佣金额
*/
@TableField("paid_ratio")
private BigDecimal paidRatio;
/**
* 是否含税 0=No, 1=Yes
*/
......
......@@ -6,6 +6,7 @@ import com.yd.csf.feign.request.expectedfortune.ApiExpectedFortunePageRequest;
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 java.util.List;
......@@ -27,4 +28,6 @@ public interface IExpectedFortuneService extends IService<ExpectedFortune> {
List<ExpectedFortune> queryList(String policyNo);
Boolean batchDelByPolicyNo(String policyNo);
ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds);
}
......@@ -9,6 +9,7 @@ import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.service.IExpectedFortuneService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.vo.ExpectedFortuneStatisticsVO;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
......@@ -51,4 +52,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
public Boolean batchDelByPolicyNo(String policyNo) {
return this.remove(new LambdaQueryWrapper<ExpectedFortune>().eq(ExpectedFortune::getPolicyNo,policyNo));
}
@Override
public ExpectedFortuneStatisticsVO getStatistics(List<Long> expectedFortuneIds) {
return baseMapper.getStatistics(expectedFortuneIds);
}
}
package com.yd.csf.service.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
/**
* 预计发佣统计VO 预计发佣金额 HKD、已出账金额 HKD、待出账金额 HKD、总保单数、总保费 HKD
*/
@Data
public class ExpectedFortuneStatisticsVO {
/**
* 预计发佣金额 HKD
*/
@Schema(description = "预计发佣金额 HKD")
private BigDecimal totalExpectedAmount;
/**
* 已出账金额 HKD
*/
@Schema(description = "已出账金额 HKD")
private BigDecimal totalPaidAmount;
/**
* 待出账金额 HKD
*/
@Schema(description = "待出账金额 HKD")
private BigDecimal totalUnpaidAmount;
/**
* 已出账比例(已出账金额/预计发佣金额)
*/
@Schema(description = "已出账比例(已出账金额/预计发佣金额)")
private String paidAmountRatio;
/**
* 总保单数
*/
@Schema(description = "总保单数")
private Integer totalPolicyCount;
/**
* 总保费 HKD
*/
@Schema(description = "总保费 HKD")
private BigDecimal totalPremiumAmount;
}
......@@ -23,4 +23,27 @@
from expected_fortune ef
where ef.policy_no = (select policy_no from policy where policy_biz_id = #{policyBizId})
</select>
<select id="getStatistics" resultType="com.yd.csf.service.vo.ExpectedFortuneStatisticsVO">
select
ifnull(sum(ef.amount),0) as totalExpectedAmount,
ifnull(sum(ef.paid_amount),0) as totalPaidAmount,
ifnull(sum(ef.unpaid_amount),0) as totalUnpaidAmount,
ifnull(e.totalPremiumAmount,0) as totalPremiumAmount,
count(distinct ef.policy_no) as totalPolicyCount
from expected_fortune ef
LEFT JOIN (
SELECT p.policy_no, SUM(p.payment_premium*p.payment_term) as totalPremiumAmount
FROM policy p
GROUP BY policy_no
) e ON ef.policy_no = e.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>
</where>
</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