Commit 7ebd6b55 by zhangxingmin

Merge remote-tracking branch 'origin/dev' into prod

parents ccf53a60 40306bcb
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding">
<file url="file://$PROJECT_DIR$/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-api/src/main/java" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-api/src/main/resources" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/yd-csf-feign/src/main/java" charset="UTF-8" />
......
package com.yd.csf.service.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 业务员累计积分表 - 存储业务员的累计FYC积分和当前等级信息 前端控制器
* </p>
*
* @author zxm
* @since 2026-04-16
*/
@RestController
@RequestMapping("/agentAccumulatedFyc")
public class AgentAccumulatedFycController {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.AgentAccumulatedFyc;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 业务员累计积分表 - 存储业务员的累计FYC积分和当前等级信息 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-04-16
*/
public interface AgentAccumulatedFycMapper extends BaseMapper<AgentAccumulatedFyc> {
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.yd.csf.service.dao.AgentAccumulatedFycMapper">
</mapper>
package com.yd.csf.service.model;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import lombok.Getter;
import lombok.Setter;
/**
* <p>
* 业务员累计积分表 - 存储业务员的累计FYC积分和当前等级信息
* </p>
*
* @author zxm
* @since 2026-04-16
*/
@Getter
@Setter
@TableName("agent_accumulated_fyc")
public class AgentAccumulatedFyc implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 业务员ID(会员唯一业务ID)
*/
@TableField("agent_id")
private String agentId;
/**
* 未生效累计积分(不限业务场景)
*/
@TableField("no_effect")
private BigDecimal noEffect;
/**
* 已生效累计积分(不限业务场景)
*/
@TableField("effect")
private BigDecimal effect;
/**
* 累计积分 = 未生效累计积分 + 已生效累计积分
*/
@TableField("total_fyc")
private BigDecimal totalFyc;
/**
* 已生效累计首期佣金积分值(佣金场景)
*/
@TableField("first_commission")
private BigDecimal firstCommission;
/**
* 未生效累计首期佣金积分值(佣金场景)
*/
@TableField("no_first_commission")
private BigDecimal noFirstCommission;
/**
* 已生效累计非首期佣金积分值(佣金场景)
*/
@TableField("ryc")
private BigDecimal ryc;
/**
* 未生效累计非首期佣金积分值(佣金场景)
*/
@TableField("no_ryc")
private BigDecimal noRyc;
/**
* 晋升职级累计积分 = 已生效累计积分 - 已生效累计非首期佣金积分值
*/
@TableField("promotion")
private BigDecimal promotion;
/**
* 当前等级,业务员当前的会员等级编码(会员等级配置表等级编码)
*/
@TableField("current_grade_code")
private String currentGradeCode;
/**
* 最后计算日期,记录最后一次计算累计FYC的日期
*/
@TableField("last_calc_date")
private LocalDateTime lastCalcDate;
/**
* 状态(0:停用 1:启用)
*/
@TableField("status")
private Byte status;
/**
* 所属租户唯一业务ID(冗余)
*/
@TableField("tenant_biz_id")
private String tenantBizId;
/**
* 所属项目唯一业务ID(冗余)
*/
@TableField("project_biz_id")
private String projectBizId;
/**
* 通用备注
*/
@TableField("remark")
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
@TableField("is_deleted")
private Boolean isDeleted;
/**
* 创建人ID
*/
@TableField("creator_id")
private String creatorId;
/**
* 更新人ID
*/
@TableField("updater_id")
private String updaterId;
/**
* 创建时间
*/
@TableField("create_time")
private LocalDateTime createTime;
/**
* 更新时间
*/
@TableField("update_time")
private LocalDateTime updateTime;
}
package com.yd.csf.service.service;
import com.yd.csf.service.model.AgentAccumulatedFyc;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* <p>
* 业务员累计积分表 - 存储业务员的累计FYC积分和当前等级信息 服务类
* </p>
*
* @author zxm
* @since 2026-04-16
*/
public interface IAgentAccumulatedFycService extends IService<AgentAccumulatedFyc> {
}
package com.yd.csf.service.service.impl;
import com.yd.csf.service.model.AgentAccumulatedFyc;
import com.yd.csf.service.dao.AgentAccumulatedFycMapper;
import com.yd.csf.service.service.IAgentAccumulatedFycService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
/**
* <p>
* 业务员累计积分表 - 存储业务员的累计FYC积分和当前等级信息 服务实现类
* </p>
*
* @author zxm
* @since 2026-04-16
*/
@Service
public class AgentAccumulatedFycServiceImpl extends ServiceImpl<AgentAccumulatedFycMapper, AgentAccumulatedFyc> implements IAgentAccumulatedFycService {
}
package com.yd.csf.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 业务员累计积分表操作日志记录表(每次主表(累计积分表)的操作变化记录) 前端控制器
* </p>
*
* @author zxm
* @since 2026-04-17
*/
@RestController
@RequestMapping("/agentAccumulatedFycLog")
public class AgentAccumulatedFycLogController {
}
package com.yd.csf.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 保单冷静期定时任务表 前端控制器
* </p>
*
* @author zxm
* @since 2026-04-08
*/
@RestController
@RequestMapping("/calmTask")
public class ApiCalmTaskController {
}
......@@ -12,6 +12,8 @@ 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.service.ApiCommissionService;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.component.CommissionAsyncService;
import com.yd.csf.service.dto.*;
......@@ -29,16 +31,19 @@ import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationManager;
import org.springframework.transaction.support.TransactionTemplate;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
......@@ -74,6 +79,8 @@ public class ApiCommissionController {
private PolicyService policyService;
@Resource
private TransactionTemplate transactionTemplate;
@Autowired
private ApiCommissionService apiCommissionService;
@PostMapping("/upload/excel")
......@@ -469,45 +476,6 @@ public class ApiCommissionController {
return Result.success(commissionService.getCommissionStatistics(commissionStatisticsRequest.getCommissionIds()));
}
/**
* 根据 commissionBizId 获取保单来佣(封装类)
*
* @param commissionBizId
* @return
*/
// @GetMapping("/get/vo")
// @Operation(summary = "根据 policyBizId 获取保单来佣详情")
// public Result<PolicyFollowVO> getPolicyFollowByPolicyBizId(@RequestParam("commissionBizId") String commissionBizId, HttpServletRequest request) {
// if (commissionBizId == null) {
// return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
// }
// // 查询数据库
// PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
// if (policyFollow == null) {
// return Result.fail(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
// }
//
// // 获取封装类
// return Result.success(policyFollowService.getPolicyFollowVO(policyFollow));
// }
/**
* 分页获取保单来佣列表(仅管理员可用)
*
* @param fnaQueryRequest
* @return
*/
// @PostMapping("/list/page")
// public Result<Page<Customer>> listFnaByPage(@RequestBody FnaQueryRequest fnaQueryRequest) {
// long current = fnaQueryRequest.getPageNo();
// long size = fnaQueryRequest.getPageSize();
// // 查询数据库
// Page<Customer> fnaPage = policyFollowService.page(new Page<>(current, size),
// policyFollowService.getQueryWrapper(fnaQueryRequest));
// return Result.success(fnaPage);
// }
/**
* 来佣检核页面-分页获取保单来佣列表(VO)
*
......@@ -540,6 +508,16 @@ public class ApiCommissionController {
}
/**
* 修改入账状态
* @param request
* @return
*/
@PutMapping("/edit/status")
public Result editStatus(@Validated @RequestBody CommissionExpectedEditStatusRequest request) {
return apiCommissionService.editStatus(request);
}
/**
* 入账记录
*
* @param pageByCommissionexpectedBizIdRequest
......@@ -567,4 +545,27 @@ public class ApiCommissionController {
return Result.success(commissionService.getCommissionVOPage(commissionPage));
}
/**
* 查询入账结算汇率
*
* @param queryCommissionExchangeRateRequest
* @return
*/
@PostMapping("/commission_exchange_rate")
@Operation(summary = "查询入账结算汇率")
public Result<BigDecimal> commissionExchangeRate(@RequestBody QueryCommissionExchangeRateRequest queryCommissionExchangeRateRequest) {
if (queryCommissionExchangeRateRequest == null || StringUtils.isBlank(queryCommissionExchangeRateRequest.getPolicyNo())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "policyNo 不能为空");
}
if (queryCommissionExchangeRateRequest.getCommissionPeriod() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "commissionPeriod 不能为空");
}
return Result.success(
commissionService.queryCommissionExchangeRate(
queryCommissionExchangeRateRequest.getPolicyNo(),
queryCommissionExchangeRateRequest.getCommissionPeriod()
)
);
}
}
......@@ -37,6 +37,7 @@ import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.math.BigDecimal;
import java.util.*;
import java.util.stream.Collectors;
......@@ -123,8 +124,8 @@ public class ApiFortuneController {
existingEntity.setFortunePeriod(updateEntity.getFortunePeriod());
existingEntity.setFortuneTotalPeriod(updateEntity.getFortuneTotalPeriod());
existingEntity.setFortuneName(updateEntity.getFortuneName());
existingEntity.setAmount(updateEntity.getAmount());
existingEntity.setCurrency(updateEntity.getCurrency());
existingEntity.setOriginalAmount(updateEntity.getOriginalAmount());
existingEntity.setOriginalCurrency(updateEntity.getOriginalCurrency());
existingEntity.setBroker(updateEntity.getBroker());
existingEntity.setTeam(updateEntity.getTeam());
existingEntity.setRemark(updateEntity.getRemark());
......@@ -194,7 +195,7 @@ public class ApiFortuneController {
@PostMapping("/download/account")
public Result<Boolean> downloadAccount(@RequestBody FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws IOException {
if (CollectionUtils.isEmpty(fortuneDownloadRequest.getFortuneBizIdList())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
}
fortuneService.downloadAccount(fortuneDownloadRequest, response);
......@@ -412,58 +413,93 @@ public class ApiFortuneController {
}
/**
* 修改出账状态
* 分期出账
*
* @param fortuneStatusUpdateRequest
* @param fortuneSplitRequest 分期出账请求
* @return
*/
@PostMapping("/update/status")
@Operation(summary = "修改出账状态")
public Result<Boolean> updateFortuneStatus(@RequestBody FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
if (fortuneStatusUpdateRequest == null || CollectionUtils.isEmpty(fortuneStatusUpdateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
@PostMapping("/split")
@Operation(summary = "分期出账")
public Result<Boolean> splitFortune(@RequestBody FortuneSplitRequest fortuneSplitRequest) {
if (fortuneSplitRequest == null || CollectionUtils.isEmpty(fortuneSplitRequest.getFortuneSplitDtoList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "分期出账请求不能为空");
}
return Result.success(fortuneService.updateFortuneStatus(fortuneStatusUpdateRequest));
// 操作数据库
return Result.success(fortuneService.splitFortune(fortuneSplitRequest));
}
/**
* 修改设置出账年月(实)),设置完成后,更新到应付款管理明细中
*
* @param editActualPayoutDateRequest
* @return
*/
@PostMapping("/edit/actual_payout_date")
@Operation(summary = "修改设置出账年月(实),设置完成后,更新到应付款管理明细中")
public Result<Boolean> editActualPayoutDate(@RequestBody EditActualPayoutDateRequest editActualPayoutDateRequest) {
if (editActualPayoutDateRequest == null || StringUtils.isBlank(editActualPayoutDateRequest.getFortuneBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizId 不能为空");
}
if (StringUtils.isBlank(editActualPayoutDateRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "actualPayoutDate 不能为空");
}
return Result.success(fortuneService.editActualPayoutDate(editActualPayoutDateRequest));
}
/**
* 根据 fortuneBizId 获取保单发佣(封装类)
* 批量设置出账年月(实)),已设置的跳过
*
* @param fortuneBizId
* @param editBatchActualPayoutDateRequest
* @return
*/
// @GetMapping("/get/vo")
// @Operation(summary = "根据 policyBizId 获取保单发佣详情")
// public Result<PolicyFollowVO> getPolicyFollowByPolicyBizId(@RequestParam("fortuneBizId") String fortuneBizId, HttpServletRequest request) {
// if (fortuneBizId == null) {
// return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
// }
// // 查询数据库
// PolicyFollow policyFollow = policyFollowService.getByPolicyBizId(policyBizId);
// if (policyFollow == null) {
// return Result.fail(ErrorCode.NOT_FOUND_ERROR.getCode(), ErrorCode.NOT_FOUND_ERROR.getMessage());
// }
//
// // 获取封装类
// return Result.success(policyFollowService.getPolicyFollowVO(policyFollow));
// }
@PostMapping("/edit/actual_payout_date/batch")
@Operation(summary = "批量设置出账年月(实),已设置的跳过")
public Result<String> batchEditActualPayoutDate(@RequestBody BatchEditActualPayoutDateRequest editBatchActualPayoutDateRequest) {
if (editBatchActualPayoutDateRequest == null || CollectionUtils.isEmpty(editBatchActualPayoutDateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizIdList 不能为空");
}
if (StringUtils.isBlank(editBatchActualPayoutDateRequest.getActualPayoutDate())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "actualPayoutDate 不能为空");
}
return Result.success(fortuneService.batchEditActualPayoutDate(editBatchActualPayoutDateRequest));
}
/**
* 分页获取保单发佣列表(仅管理员可用)
* 修改结算汇率,设置完成后,更新到应付款管理明细中
*
* @param fnaQueryRequest
* @param editExchangeRateRequest
* @return
*/
// @PostMapping("/list/page")
// public Result<Page<Customer>> listFnaByPage(@RequestBody FnaQueryRequest fnaQueryRequest) {
// long current = fnaQueryRequest.getPageNo();
// long size = fnaQueryRequest.getPageSize();
// // 查询数据库
// Page<Customer> fnaPage = policyFollowService.page(new Page<>(current, size),
// policyFollowService.getQueryWrapper(fnaQueryRequest));
// return Result.success(fnaPage);
// }
@PostMapping("/edit/exchange_rate")
@Operation(summary = "修改结算汇率,设置完成后,更新到应付款管理明细中")
public Result<Boolean> editExchangeRate(@RequestBody EditExchangeRateRequest editExchangeRateRequest) {
if (editExchangeRateRequest == null || StringUtils.isBlank(editExchangeRateRequest.getFortuneBizId())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "fortuneBizId 不能为空");
}
if (editExchangeRateRequest.getExchangeRate() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "exchangeRate 不能为空");
}
if (editExchangeRateRequest.getHkdAmount() == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), "hkdAmount 不能为空");
}
return Result.success(fortuneService.editExchangeRate(editExchangeRateRequest));
}
/**
* 修改出账状态
*
* @param fortuneStatusUpdateRequest
* @return
*/
@PostMapping("/update/status")
@Operation(summary = "修改出账状态")
public Result<Boolean> updateFortuneStatus(@RequestBody FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
if (fortuneStatusUpdateRequest == null || CollectionUtils.isEmpty(fortuneStatusUpdateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(fortuneService.updateFortuneStatus(fortuneStatusUpdateRequest));
}
/**
* 出账检核页面-分页获取保单发佣列表(VO)
......
......@@ -27,7 +27,9 @@ import com.yd.csf.api.service.ApiCommissionConditionService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
import com.yd.csf.api.service.ApiPolicyFollowService;
import com.yd.csf.feign.request.expectedfortune.ApiGenerateExpectedFortuneRequest;
import com.yd.csf.feign.response.appointment.ApiAppointmentDetailResponse;
import com.yd.csf.feign.response.expectedfortune.ApiGenerateExpectedFortuneResponse;
import com.yd.csf.feign.response.policyfollow.ApiPolicyFollowDetailResponse;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.component.PolicyReportPdfService;
import com.yd.csf.service.dto.*;
......@@ -56,6 +58,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
......@@ -63,6 +66,7 @@ import javax.annotation.Resource;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
import java.sql.SQLIntegrityConstraintViolationException;
import java.text.ParseException;
......@@ -942,4 +946,25 @@ public class ApiPolicyFollowController {
}
return Result.success(policyFollowService.updatePolicySecondHolder(policySecondHolderUpdateRequest));
}
/**
* 根据保单号查询新单跟进详情
* @param policyNo
* @return
*/
@GetMapping("/detail")
public Result<ApiPolicyFollowDetailResponse> detail(@RequestParam(value = "policyNo") String policyNo){
return policyFollowService.detail(policyNo);
}
/**
* 更新-新单跟进投保人和受保人的名字冗余字段
* @return
*/
@PutMapping("/update")
public Result update(){
return policyFollowService.updateTs();
}
}
\ No newline at end of file
package com.yd.csf.api.controller;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiSalaryService;
import com.yd.csf.feign.client.salary.ApiSalaryFeignClient;
import com.yd.csf.feign.request.salary.*;
import com.yd.csf.feign.response.salary.ApiSalaryDetailResponse;
import com.yd.csf.feign.response.salary.ApiSalaryPageResponse;
import com.yd.csf.feign.response.salary.ApiSalaryPushPageResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
/**
* 薪资单信息
*
* @author zxm
* @since 2026-05-08
*/
@RestController
@RequestMapping("/salary")
@Validated
public class ApiSalaryController implements ApiSalaryFeignClient {
@Autowired
private ApiSalaryService apiSalaryService;
/**
* 分页查询-制作薪资单列表信息
* @param request
* @return
*/
@Override
public Result<IPage<ApiSalaryPageResponse>> page(ApiSalaryPageRequest request) {
return apiSalaryService.page(request);
}
/**
* 分页查询-电子薪资单列表信息(推送列表信息)
* @param request
* @return
*/
@Override
public Result<IPage<ApiSalaryPushPageResponse>> pushPage(ApiSalaryPushPageRequest request) {
return apiSalaryService.pushPage(request);
}
/**
* 详情-薪资单信息
* @param salaryBizId
* @return
*/
@Override
public Result<ApiSalaryDetailResponse> detail(String salaryBizId) {
return apiSalaryService.detail(salaryBizId);
}
/**
* 新增-薪资单信息
* @param request
* @return
*/
@Override
public Result add(ApiSalaryAddRequest request) {
return apiSalaryService.add(request);
}
/**
* 修改-薪资单信息
* @param request
* @return
*/
@Override
public Result edit(ApiSalaryEditRequest request) {
return apiSalaryService.edit(request);
}
/**
* 提交核对
* @param request
* @return
*/
@Override
public Result submitCheck(ApiSalarySubmitCheckRequest request) {
return apiSalaryService.submitCheck(request);
}
/**
* 核对
* @param request
* @return
*/
@Override
public Result check(ApiSalaryCheckRequest request) {
return apiSalaryService.check(request);
}
/**
* 推送
* @param request
* @return
*/
@Override
public Result push(ApiSalaryPushRequest request) {
return apiSalaryService.push(request);
}
/**
* 取消薪资
* @param request
* @return
*/
@Override
public Result cancel(ApiSalaryCancelRequest request) {
return apiSalaryService.cancel(request);
}
/**
* 批量新增-薪资单信息
* @param request
* @return
*/
@Override
public Result batchAdd(ApiSalaryBatchAddRequest request) {
return apiSalaryService.batchAdd(request);
}
/**
* 删除-薪资单汇款明细信息
* @param salaryRemittanceBizId
* @return
*/
@Override
public Result delSalaryRemittance(String salaryRemittanceBizId) {
return apiSalaryService.delSalaryRemittance(salaryRemittanceBizId);
}
/**
* 根据转介人和薪资年月查询应发总金额
* @param request
* @return
*/
@Override
public Result<BigDecimal> getGrossAmount(ApiSalaryGrossAmountRequest request) {
return apiSalaryService.getGrossAmount(request);
}
/**
* 薪资单信息-汇款明细-查询汇率
* @param request
* @return
*/
@Override
public Result<BigDecimal> getExchangeRate(ApiSalaryExchangeRateRequest request) {
return apiSalaryService.getExchangeRate(request);
}
/**
* 计算-实发金额
* @param request
* @return
*/
@Override
public Result<BigDecimal> calculatePaidAmount(ApiSalaryCalculatePaidAmountRequest request) {
return apiSalaryService.calculatePaidAmount(request);
}
/**
* 计算-薪资汇款明细合计发放金额(单位:HKD)
* @param request
* @return
*/
@Override
public Result<BigDecimal> calculateTotalAmount(ApiSalaryCalculateTotalAmountRequest request) {
return apiSalaryService.calculateTotalAmount(request);
}
}
package com.yd.csf.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 评定职级表 前端控制器
* </p>
*
* @author zxm
* @since 2026-04-20
*/
@RestController
@RequestMapping("/evaluateRank")
public class EvaluateRankController {
}
package com.yd.csf.api.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* <p>
* 薪资汇款明细表 前端控制器
* </p>
*
* @author zxm
* @since 2026-05-08
*/
@RestController
@RequestMapping("/salaryRemittance")
public class SalaryRemittanceController {
}
package com.yd.csf.api.dto;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
/**
* 基本法计算值收集对象
*/
@Data
public class AlgorithmCollectResDto {
/**
* 客户端用户业务ID
*/
private String clientUserBizId;
/**
* 客户端用户名称
*/
private String clientUserName;
/**
* 介绍费占比
*/
private String brokerRatio;
/**
* 发佣期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
private Integer fortunePeriod;
/**
* 积分解冻时间(受发佣期数影响,第一年就是冷静期结束日期,第二年冷静期结束日期+1年,以此类推)
*/
private LocalDateTime thawingTime;
// /**
// * 计算值-当前用户的基本法合计值(客户端用户业务ID分组后统计组内的algorithmResDtoList的里面的calculatedValue合计值)
// */
// private BigDecimal sumCalculatedValue;
//
// /**
// * 计算值-佣金项目(去重algorithmResDtoList的itemName通过分号拼接的)
// */
// private String commissionName;
/**
* 算法-基本法计算-返回的列表(当前客户端用户绑定的多个基本法类型的计算值列表)
*/
private List<AlgorithmResDto> algorithmResDtoList;
}
......@@ -11,6 +11,8 @@ import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.math.BigDecimal;
@Data
@Builder
@NoArgsConstructor
......@@ -43,6 +45,11 @@ public class ExecuteBillingDto {
private Integer paymentTerm;
/**
* 介绍费占比
*/
private String brokerRatio;
/**
* 保单和转介人信息
*/
private QueryPolicyAndBrokerDto policyAndBrokerDto;
......
......@@ -55,8 +55,8 @@ public class FortuneImportDTO {
entity.setFortunePeriod(data.getFortunePeriod());
entity.setFortuneTotalPeriod(data.getFortuneTotalPeriod());
entity.setFortuneName(data.getFortuneName());
entity.setAmount(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setOriginalAmount(data.getAmount());
entity.setOriginalCurrency(data.getCurrency());
entity.setBroker(data.getBroker());
entity.setTeam(data.getTeam());
entity.setRemark(data.getRemark());
......
......@@ -116,6 +116,11 @@ public class GenerateExpectedFortuneDto {
private BigDecimal paymentPremium;
/**
* 介绍费占比
*/
private String brokerRatio;
/**
* 获得积分业务员绑定的基本法列表对应计算值
*/
private List<AlgorithmResDto> algorithmResDtoList;
......
package com.yd.csf.api.dto;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsNewVO;
import com.yd.csf.service.vo.CommissionExpectedStatisticsVO;
import com.yd.csf.service.vo.CommissionExpectedVO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "查询预计来佣分页响应")
public class QueryCommissionExpectedByPageNewResponse {
/**
* 预计来佣统计信息
*/
// @Schema(description = "预计来佣统计信息")
private CommissionExpectedStatisticsVO expectedStatisticsVO;
/**
* 预计来佣分页列表
*/
// @Schema(description = "预计来佣分页列表")
private Page<CommissionExpectedNewVO> page;
}
package com.yd.csf.api.handler;
import com.alibaba.fastjson.JSON;
import com.xxl.job.core.context.XxlJobHelper;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.feign.enums.OprSourceEnum;
import com.yd.csf.service.enums.RuleItemEnum;
import com.yd.csf.service.model.*;
import com.yd.csf.service.service.*;
import com.yd.framework.config.LockExecutor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Objects;
/**
* 冷静期定时发送任务处理器
*/
@Component
@Slf4j
public class CalmSendJobHandler {
@Resource
private LockExecutor lockExecutor;
@Resource
private ICalmTaskService iCalmTaskService;
@Resource
private IAgentDetailFycService iAgentDetailFycService;
@Resource
private IAgentAccumulatedFycService iAgentAccumulatedFycService;
@Resource
private IAgentAccumulatedFycLogService iAgentAccumulatedFycLogService;
/**
* XXL-Job任务执行入口方法
*/
@XxlJob("calmSendJobHandler")
public void execute() throws Exception {
LocalDateTime taskSendTime = LocalDateTime.now();
String param = XxlJobHelper.getJobParam();
log.info("开始冷静期定时发送任务,参数: {}", param);
String taskBizId = param;
CalmTask calmTask = iCalmTaskService.queryOne(taskBizId);
log.info("根据冷静期定时发送任务业务ID查询冷静期定时任务信息: {}: {}", taskBizId, JSON.toJSONString(calmTask));
if (Objects.isNull(calmTask)) {
XxlJobHelper.log("冷静期定时发送任务不存在: " + taskBizId);
XxlJobHelper.handleFail("冷静期定时发送任务不存在");
return;
}
// 更新任务状态
calmTask.setExecutionStatus("2");
iCalmTaskService.saveOrUpdate(calmTask);
// 更新积分明细状态
AgentDetailFyc agentDetailFyc = iAgentDetailFycService.queryOne(calmTask.getDetailFycBizId());
if (agentDetailFyc != null) {
agentDetailFyc.setStatus(1);
iAgentDetailFycService.saveOrUpdate(agentDetailFyc);
}
// 使用分布式锁保护积分总表更新(流式调用)
String brokerBizId = calmTask.getBrokerBizId();
String lockKey = "calm:accumulated:lock:" + brokerBizId;
lockExecutor.executeWithLock(lockKey, () -> {
// 锁内业务逻辑
updateAccumulatedFyc(calmTask);
});
}
/**
* 积分总表累计更新逻辑(原 execute 内的积分部分)
* 在分布式锁保护下执行,确保同一经纪人串行处理
*/
private void updateAccumulatedFyc(CalmTask calmTask) {
String brokerBizId = calmTask.getBrokerBizId();
AgentAccumulatedFyc agentAccumulatedFyc = iAgentAccumulatedFycService.queryOne(brokerBizId);
if (agentAccumulatedFyc == null) {
log.warn("经纪人积分总表记录不存在,brokerBizId: {}", brokerBizId);
return;
}
// 安全获取任务佣金增量值
BigDecimal fycValue = calmTask.getAfterFyc() == null ? BigDecimal.ZERO : calmTask.getAfterFyc();
// 安全获取原有字段值(null -> 0)
BigDecimal noEffectOld = nvl(agentAccumulatedFyc.getNoEffect());
BigDecimal effectOld = nvl(agentAccumulatedFyc.getEffect());
BigDecimal firstCommissionOld = nvl(agentAccumulatedFyc.getFirstCommission());
BigDecimal noFirstCommissionOld = nvl(agentAccumulatedFyc.getNoFirstCommission());
BigDecimal rycOld = nvl(agentAccumulatedFyc.getRyc());
BigDecimal noRycOld = nvl(agentAccumulatedFyc.getNoRyc());
BigDecimal firstSalesCommissionOld = nvl(agentAccumulatedFyc.getFirstSalesCommission());
BigDecimal noFirstSalesCommissionOld = nvl(agentAccumulatedFyc.getNoFirstSalesCommission());
// 未生效/已生效累计积分
BigDecimal noEffect = noEffectOld.subtract(fycValue);
agentAccumulatedFyc.setNoEffect(noEffect.max(BigDecimal.ZERO));
BigDecimal effect = effectOld.add(fycValue);
agentAccumulatedFyc.setEffect(effect);
agentAccumulatedFyc.setTotalFyc(agentAccumulatedFyc.getNoEffect().add(agentAccumulatedFyc.getEffect()));
if (calmTask.getFortunePeriod() != null && calmTask.getFortunePeriod() == 1) {
// 首期佣金
BigDecimal firstCommission = firstCommissionOld.add(fycValue);
agentAccumulatedFyc.setFirstCommission(firstCommission);
BigDecimal noFirstCommission = noFirstCommissionOld.subtract(fycValue);
agentAccumulatedFyc.setNoFirstCommission(noFirstCommission.max(BigDecimal.ZERO));
if (RuleItemEnum.SALES.getRuleItemBizId().equals(calmTask.getRuleItemBizId())) {
BigDecimal firstSalesCommission = firstSalesCommissionOld.add(fycValue);
agentAccumulatedFyc.setFirstSalesCommission(firstSalesCommission);
BigDecimal noFirstSalesCommission = noFirstSalesCommissionOld.subtract(fycValue);
agentAccumulatedFyc.setNoFirstSalesCommission(noFirstSalesCommission.max(BigDecimal.ZERO));
}
} else {
// 非首期佣金
BigDecimal ryc = rycOld.add(fycValue);
agentAccumulatedFyc.setRyc(ryc);
BigDecimal noRyc = noRycOld.subtract(fycValue);
agentAccumulatedFyc.setNoRyc(noRyc.max(BigDecimal.ZERO));
}
// 晋升职级累计积分
BigDecimal initEffect = nvl(agentAccumulatedFyc.getInitEffect());
BigDecimal firstSalesCommission = nvl(agentAccumulatedFyc.getFirstSalesCommission());
BigDecimal promotion = initEffect.add(firstSalesCommission);
agentAccumulatedFyc.setPromotion(promotion.max(BigDecimal.ZERO));
agentAccumulatedFyc.setLastCalcDate(LocalDateTime.now());
iAgentAccumulatedFycService.saveOrUpdate(agentAccumulatedFyc);
// 新增积分总表日志
AgentAccumulatedFycLog logObj = new AgentAccumulatedFycLog();
BeanUtils.copyProperties(agentAccumulatedFyc, logObj);
logObj.setId(null);
logObj.setFycBizId(agentAccumulatedFyc.getFycBizId());
logObj.setFycLogBizId(RandomStringGenerator.generateBizId16(
CommonEnum.UID_TYPE_AGENT_ACCUMULATED_FYC_LOG.getCode()));
logObj.setSourceType(OprSourceEnum.CALM_TASK_FREEZE.getItemValue());
logObj.setCreateTime(LocalDateTime.now());
logObj.setUpdateTime(LocalDateTime.now());
iAgentAccumulatedFycLogService.saveOrUpdate(logObj);
log.debug("经纪人积分累算完成,brokerBizId: {}, 本次增量: {}", brokerBizId, fycValue);
}
/**
* BigDecimal 空值安全转零
*/
private BigDecimal nvl(BigDecimal val) {
return val == null ? BigDecimal.ZERO : val;
}
}
\ No newline at end of file
package com.yd.csf.api.handler;
import com.xxl.job.core.handler.annotation.XxlJob;
import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.feign.enums.OprSourceEnum;
import com.yd.csf.service.dto.GradeQueryParam;
import com.yd.csf.service.model.AgentAccumulatedFyc;
import com.yd.csf.service.model.AgentAccumulatedFycLog;
import com.yd.csf.service.model.EvaluateRank;
import com.yd.csf.service.model.MemberGradeConfig;
import com.yd.csf.service.service.IAgentAccumulatedFycLogService;
import com.yd.csf.service.service.IAgentAccumulatedFycService;
import com.yd.csf.service.service.IEvaluateRankService;
import com.yd.csf.service.service.IMemberGradeConfigService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 评定职级定时任务处理器 - XXL-Job定时任务执行器
* 使用@XxlJob注解方式
*/
@Component
@Slf4j
public class EvaluateRankJobHandler {
@Resource
private IAgentAccumulatedFycService iAgentAccumulatedFycService;
@Resource
private IAgentAccumulatedFycLogService iAgentAccumulatedFycLogService;
@Resource
private IEvaluateRankService iEvaluateRankService;
@Resource
private IMemberGradeConfigService iMemberGradeConfigService;
/**
* 评定职级定时任务,每月1号0点执行(XXL-Job任务执行入口方法)
*/
@XxlJob("evaluateRankJobHandler")
public void execute() throws Exception {
//查询积分总表记录(所有转介人积分总表记录)
List<AgentAccumulatedFyc> allList = iAgentAccumulatedFycService.queryAll();
if (CollectionUtils.isEmpty(allList)) {
return;
}
//过滤出转介人唯一业务ID列表
List<String> agentIdList = allList.stream()
.map(AgentAccumulatedFyc::getAgentId)
.collect(Collectors.toList());
// 构建批量查询参数列表(业务员ID和晋升职级累计积分入参)
List<GradeQueryParam> paramList = allList.stream()
.map(fyc -> new GradeQueryParam(fyc.getAgentId(), fyc.getPromotion()))
.collect(Collectors.toList());
// 最新评定记录(用于获取上一次的 afterGrade / afterPromotion)
Map<String, EvaluateRank> latestRankMap = iEvaluateRankService.getLatestByBrokerBizIds(agentIdList);
//查询每个业务员已有的评定记录数量
Map<String, Long> rankCountMap = iEvaluateRankService.countGroupByBrokerBizId(agentIdList);
// 批量查询各业务员对应的等级配置
Map<String, MemberGradeConfig> gradeConfigMap = iMemberGradeConfigService.batchGetGradeByPromotion(paramList);
List<EvaluateRank> toSaveList = new ArrayList<>();
for (AgentAccumulatedFyc fyc : allList) {
String agentId = fyc.getAgentId();
Long existingCount = rankCountMap.getOrDefault(agentId, 0L);
//最新评定记录
EvaluateRank latestRank = latestRankMap.get(agentId);
//查询当前业务员的晋升职级累计积分对应的职级对象
MemberGradeConfig gradeConfig = gradeConfigMap.get(agentId);
EvaluateRank evaluateRank = new EvaluateRank();
evaluateRank.setBrokerBizId(fyc.getAgentId());
evaluateRank.setBrokerName(fyc.getAgentName());
//评定职级表唯一业务ID
evaluateRank.setEvaluateRankBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_EVALUATE_RANK.getCode()));
if (existingCount == 0) {
//首次评级:评定前职级和评定前累计已生效积分 = 初始化职级和已生效积分
//评定前职级 = 初始化等级
evaluateRank.setBeforeGrade(fyc.getInitGrade());
//评定前晋升职级累计积分 = 初始化已生效积分
evaluateRank.setBeforePromotion(fyc.getInitEffect());
//评定后职级 = 晋升职级累计积分对应职级
evaluateRank.setAfterGrade(gradeConfig != null ? gradeConfig.getGradeCode() : "G1001");
//评定后晋升职级累计积分
evaluateRank.setAfterPromotion(fyc.getPromotion());
//查询评定结果
evaluateRank.setResult(getResult(evaluateRank.getBeforeGrade(),evaluateRank.getAfterGrade()));
//评定来源 1-每月1号0点定时评级
evaluateRank.setSource(1);
} else {
// 非首次评级
//评定前职级 = 当前业务员评定职级记录最新一条记录的评定后的职级
evaluateRank.setBeforeGrade(latestRank.getAfterGrade());
//评定前晋升职级累计积分 = 当前业务员评定职级记录最新一条记录的评定后的晋升职级累计积分
evaluateRank.setBeforePromotion(latestRank.getAfterPromotion());
//评定后职级 = 积分总表的晋升职级累计积分对应职级
evaluateRank.setAfterGrade(gradeConfig != null ? gradeConfig.getGradeCode() : "G1001");
//评定后晋升职级累计积分 = 积分总表的晋升职级累计积分
evaluateRank.setAfterPromotion(fyc.getPromotion());
//查询评定结果
evaluateRank.setResult(getResult(evaluateRank.getBeforeGrade(),evaluateRank.getAfterGrade()));
//评定来源 1-每月1号0点定时评级
evaluateRank.setSource(1);
}
//当前等级
fyc.setCurrentGradeCode(evaluateRank.getAfterGrade());
toSaveList.add(evaluateRank);
}
// 批量保存评定职级记录
if (CollectionUtils.isNotEmpty(toSaveList)) {
iEvaluateRankService.saveBatch(toSaveList);
}
//更新积分总表的当前等级
iAgentAccumulatedFycService.saveOrUpdateBatch(allList);
//新增积分总表操作日志表
List<AgentAccumulatedFycLog> addLogList = allList.stream().map(dto -> {
AgentAccumulatedFycLog log = new AgentAccumulatedFycLog();
BeanUtils.copyProperties(dto,log);
log.setId(null);
log.setFycBizId(dto.getFycBizId());
log.setFycLogBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_AGENT_ACCUMULATED_FYC_LOG.getCode()));
//操作来源
log.setSourceType(OprSourceEnum.CALM_TASK_EVALUATE_RANK.getItemValue());
log.setCreateTime(LocalDateTime.now());
log.setUpdateTime(LocalDateTime.now());
return log;
}).collect(Collectors.toList());
iAgentAccumulatedFycLogService.saveOrUpdateBatch(addLogList);
}
/**
* 查询评定结果(1-平级 2-升级 3-降级)
* @param beforeGrade 评定前职级
* @param afterGrade 评定后职级
* @return 1-平级 2-升级 3-降级
*/
public Integer getResult(String beforeGrade, String afterGrade) {
// 若任一参数为空,视为无法比较,默认返回平级(可根据业务调整)
if (beforeGrade == null || afterGrade == null) {
return 1;
}
// 提取职级代码中的数字部分,例如 "G1001" -> 1001
int beforeLevel = extractLevel(beforeGrade);
int afterLevel = extractLevel(afterGrade);
if (beforeLevel == afterLevel) {
return 1; // 平级
} else if (beforeLevel < afterLevel) {
return 2; // 升级
} else {
return 3; // 降级
}
}
/**
* 从职级代码中提取等级数值
* @param gradeCode 职级代码,如 "G1001"
* @return 数字部分,若格式异常则返回 0
*/
private int extractLevel(String gradeCode) {
if (gradeCode == null || gradeCode.length() < 2) {
return 0;
}
try {
// 去掉首字母 'G',解析剩余数字
return Integer.parseInt(gradeCode.substring(1));
} catch (NumberFormatException e) {
log.warn("Invalid grade code format: {}", gradeCode, e);
return 0;
}
}
}
\ No newline at end of file
......@@ -2,6 +2,7 @@ package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.GenerateAgentDetailFycDto;
import com.yd.csf.service.model.AgentDetailFyc;
public interface ApiAgentDetailFycService {
......
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
public interface ApiCommissionExpectedService {
void exportCommissionExpectedNew(CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException;
Result editStatus(CommissionExpectedEditStatusRequest request);
}
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
public interface ApiCommissionService {
Result editStatus(CommissionExpectedEditStatusRequest request);
}
package com.yd.csf.api.service;
import com.yd.common.result.Result;
import com.yd.csf.feign.dto.salaryremittance.ApiSalaryRemittanceFzDTO;
public interface ApiSalaryRemittanceService {
Result batchSave(String salaryBizId, ApiSalaryRemittanceFzDTO fzDTO);
}
package com.yd.csf.api.service;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.yd.common.result.Result;
import com.yd.csf.feign.request.salary.*;
import com.yd.csf.feign.response.salary.ApiSalaryDetailResponse;
import com.yd.csf.feign.response.salary.ApiSalaryPageResponse;
import com.yd.csf.feign.response.salary.ApiSalaryPushPageResponse;
import java.math.BigDecimal;
public interface ApiSalaryService {
Result<IPage<ApiSalaryPageResponse>> page(ApiSalaryPageRequest request);
Result<IPage<ApiSalaryPushPageResponse>> pushPage(ApiSalaryPushPageRequest request);
Result<ApiSalaryDetailResponse> detail(String salaryBizId);
Result add(ApiSalaryAddRequest request);
Result edit(ApiSalaryEditRequest request);
Result submitCheck(ApiSalarySubmitCheckRequest request);
Result check(ApiSalaryCheckRequest request);
Result push(ApiSalaryPushRequest request);
Result cancel(ApiSalaryCancelRequest request);
Result batchAdd(ApiSalaryBatchAddRequest request);
Result delSalaryRemittance(String salaryRemittanceBizId);
Result<BigDecimal> getGrossAmount(ApiSalaryGrossAmountRequest request);
Result<BigDecimal> getExchangeRate(ApiSalaryExchangeRateRequest request);
Result<BigDecimal> calculatePaidAmount(ApiSalaryCalculatePaidAmountRequest request);
Result<BigDecimal> calculateTotalAmount(ApiSalaryCalculateTotalAmountRequest request);
}
package com.yd.csf.api.service;
import java.util.Date;
public interface XxlJobService {
String addScheduleJob(String taskBizId, String jobDesc, String executorHandler, Date scheduleTime);
}
......@@ -59,7 +59,7 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService {
//累加积分值
totalFyc = totalFyc.add(algorithmResDto.getCalculatedValue());
//变化值(-代表减少)
agentDetailFyc.setChangeFyc(algorithmResDto.getCalculatedValue().toString());
agentDetailFyc.setChangeFyc(algorithmResDto.getCalculatedValue());
//变化后的业务员总FYC积分
agentDetailFyc.setAfterFyc(totalFyc);
//获得积分的业务员(客户端用户唯一业务ID)
......@@ -69,7 +69,7 @@ public class ApiAgentDetailFycServiceImpl implements ApiAgentDetailFycService {
//积分来源基本法项目配置表唯一业务ID
agentDetailFyc.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
//提供积分的保单发佣批次ID
agentDetailFyc.setBatchBizId(dto.getBatchBizId());
// agentDetailFyc.setBatchBizId(dto.getBatchBizId());
//提供积分的保单号
agentDetailFyc.setPolicyNo(dto.getPolicyNo());
//提供积分的业务员(客户端用户唯一业务ID)
......
......@@ -11,7 +11,9 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.CodeGenerator;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.service.*;
import com.yd.csf.feign.dto.appointment.*;
......@@ -388,7 +390,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
dto = new ApiAppointmentInfoDto();
}
//获取Security上下文当前用户的登录信息
AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
// AuthUserDto authUserDto = SecurityUtil.getCurrentLoginUser();
Appointment appointment = new Appointment();
BeanUtils.copyProperties(dto, appointment);
//生成预约信息主表唯一业务ID
......@@ -397,7 +399,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
appointment.setAppointmentNo(CodeGenerator.generateCode(CodeGeneratorConstants.APPOINTMENT));
//预约状态
appointment.setStatus(status);
appointment.setCreatorName(authUserDto.getUsername());
// appointment.setCreatorName(authUserDto.getUsername());
appointment.setIsLegalBeneficiary(isLegalBeneficiary);
iAppointmentService.saveOrUpdate(appointment);
return Result.success(appointment);
......@@ -683,8 +685,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
// 保單持有人
if (apiPolicyholderInfoDto != null) {
follow.setPolicyHolder(StringUtils.isNotBlank(apiPolicyholderInfoDto.getNameCn()) ? apiPolicyholderInfoDto.getNameCn() : apiPolicyholderInfoDto.getNamePyEn());
follow.setPolicyHolderEn(apiPolicyholderInfoDto.getNamePyEn());
}
// 受保人信息
if (!Objects.isNull(apiInsurantInfoDto)) {
// 受保人
......@@ -707,6 +710,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
&& !response.getApiAppointmentInfoDto().getUserSignDtoList().isEmpty()) {
ApiAppointmentUserSignDto firstSigner = response.getApiAppointmentInfoDto().getUserSignDtoList().get(0);
follow.setSigner(firstSigner.getName());
follow.setSignerSc(ChineseTextConverter.traditionalToSimplified(firstSigner.getName()));
follow.setSignerBizId(firstSigner.getAppointmentUserSignBizId());
follow.setPracticeCode(firstSigner.getPracticeCode());
}
......@@ -946,6 +950,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
policyInsurant.setPolicyBizId(policyBizId);
policyInsurant.setPolicyInsurantBizId(RandomStringGenerator.generateBizId16("policy_insurant"));
policyInsurant.setName(apiInsurantInfoDto.getNameCn());
policyInsurant.setNameEn(apiInsurantInfoDto.getNamePyEn());
policyInsurant.setNameSc(ChineseTextConverter.traditionalToSimplified(apiInsurantInfoDto.getNameCn()));
policyInsurant.setNameEnLc(EnglishTextUtil.toLowerCaseSafe(apiInsurantInfoDto.getNamePyEn()));
return policyInsurantService.saveOrUpdate(policyInsurant);
}
......@@ -963,6 +970,9 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
policyPolicyholder.setPolicyBizId(policyBizId);
policyPolicyholder.setPolicyPolicyholderBizId(RandomStringGenerator.generateBizId16("policy_policyholder"));
policyPolicyholder.setName(apiPolicyholderInfoDto.getNameCn());
policyPolicyholder.setNameEn(apiPolicyholderInfoDto.getNamePyEn());
policyPolicyholder.setNameSc(ChineseTextConverter.traditionalToSimplified(apiPolicyholderInfoDto.getNameCn()));
policyPolicyholder.setNameEnLc(EnglishTextUtil.toLowerCaseSafe(apiPolicyholderInfoDto.getNamePyEn()));
return policyPolicyholderService.saveOrUpdate(policyPolicyholder);
}
......
......@@ -317,8 +317,8 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
continue;
}
Fortune fortune = new Fortune();
//发佣金额 -> 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值
fortune.setAmount(algorithmResDto.getCalculatedValue());
//基本法发佣金额 -> 计算值 - sqlAlgorithmResultDtoList集合里面的计算值和值
fortune.setRuleAmount(algorithmResDto.getCalculatedValue());
//保单发佣批次ID
fortune.setBatchBizId(fortuneDto.getBatchBizId());
//转介人姓名 (获得积分的业务员)
......@@ -331,8 +331,8 @@ public class ApiBasicLawCalculateServiceImpl implements ApiBasicLawCalculateServ
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
//基本法项目配置表唯一业务ID
fortune.setRuleItemBizId(algorithmResDto.getRuleItemBizId());
//发佣币种
fortune.setCurrency(fortuneDto.getCurrency());
//基本法发佣币种
fortune.setRuleCurrency(fortuneDto.getCurrency());
//发佣期数
fortune.setFortunePeriod(fortuneDto.getFortunePeriod());
//发佣总期数
......
package com.yd.csf.api.service.impl;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiCommissionExpectedService;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.dto.CommissionExpectedQueryRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.vo.CommissionExpectedExportDTO;
import com.yd.csf.service.vo.CommissionExpectedExportNewDTO;
import com.yd.csf.service.vo.CommissionExpectedNewVO;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiCommissionExpectedServiceImpl implements ApiCommissionExpectedService {
@Resource
private PolicyFollowService policyFollowService;
@Resource
private CommissionExpectedService commissionExpectedService;
/**
* 应收款导出(新)
*
* @param commissionExpectedQueryRequest
* @return
*/
@Override
public void exportCommissionExpectedNew(CommissionExpectedQueryRequest commissionExpectedQueryRequest, HttpServletResponse response) throws UnsupportedEncodingException {
if (commissionExpectedQueryRequest == null) {
throw new RuntimeException("查询参数不能为空");
}
// 设置响应头
String fileName = URLEncoder.encode("应收款管理数据", "UTF-8").replaceAll("\\+", "%20");
response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
response.setCharacterEncoding("utf-8");
response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");
//保單持有人(中/英、繁简/大小写)、签单人、转介人名称(主)、受保人(中/英、繁简/大小写)、查询保单号列表
List<String> queryPolicyNoList = policyFollowService.queryPolicyNoList(commissionExpectedQueryRequest.getPolicyHolder(),
commissionExpectedQueryRequest.getSigner(),
commissionExpectedQueryRequest.getBrokerName(),
commissionExpectedQueryRequest.getInsured());
// 构建查询条件
commissionExpectedQueryRequest.setPolicyNoList(queryPolicyNoList);
QueryWrapper<CommissionExpected> queryWrapper = commissionExpectedService.getQueryWrapper(commissionExpectedQueryRequest);
// 先查询所有符合条件的记录列表
List<CommissionExpected> allCommissionExpectedList = commissionExpectedService.list(queryWrapper);
if (CollectionUtils.isEmpty(allCommissionExpectedList)) {
throw new BusinessException("无导出数据");
}
commissionExpectedQueryRequest.setPageNo(1);
commissionExpectedQueryRequest.setPageSize(99999999);
Page<CommissionExpectedNewVO> page = commissionExpectedService.getCommissionExpectedVONewPage(commissionExpectedQueryRequest,allCommissionExpectedList);
log.info("应收款导出=>查询所有符合条件的记录列表=>Page<CommissionExpectedNewVO>:{}", JSON.toJSONString(page));
// 转换为导出DTO
List<CommissionExpectedExportNewDTO> exportDataList = page.getRecords().stream()
.map(CommissionExpectedExportNewDTO::convertToExportDTO)
.collect(Collectors.toList());
log.info("应收款导出=>转换为导出DTO=>exportDataList:{}", JSON.toJSONString(exportDataList));
// 使用EasyExcel导出
try (ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), CommissionExpectedExportNewDTO.class).build()) {
WriteSheet writeSheet = EasyExcel.writerSheet("应收款数据").build();
excelWriter.write(exportDataList, writeSheet);
} catch (Exception e) {
throw new RuntimeException("导出应收款数据失败", e);
}
}
/**
* 修改入账状态
* @param request
* @return
*/
@Override
public Result editStatus(CommissionExpectedEditStatusRequest request) {
CommissionExpected commissionExpected = commissionExpectedService.queryOne(request.getCommissionExpectedBizId());
if (commissionExpected == null) {
throw new BusinessException("预计来佣数据不存在");
}
commissionExpected.setStatus(request.getStatus());
commissionExpected.setStatusDesc(request.getStatusDesc());
commissionExpectedService.saveOrUpdate(commissionExpected);
return Result.success();
}
}
package com.yd.csf.api.service.impl;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiCommissionService;
import com.yd.csf.feign.request.commission.CommissionExpectedEditStatusRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Slf4j
@Service
public class ApiCommissionServiceImpl implements ApiCommissionService {
@Autowired
private CommissionExpectedService commissionExpectedService;
/**
* 修改入账状态
* @param request
* @return
*/
@Override
public Result editStatus(CommissionExpectedEditStatusRequest request) {
CommissionExpected commissionExpected = commissionExpectedService.queryOne(request.getCommissionExpectedBizId());
if (commissionExpected == null) {
throw new BusinessException("预计来佣数据不存在");
}
commissionExpected.setStatus(request.getStatus());
commissionExpected.setStatusDesc(request.getStatusDesc());
commissionExpectedService.saveOrUpdate(commissionExpected);
return Result.success();
}
}
......@@ -13,8 +13,10 @@ import com.yd.csf.feign.request.policyreceipt.ApiPolicyReceiptPageRequest;
import com.yd.csf.feign.response.policyreceipt.ApiPolicyReceiptDetailResponse;
import com.yd.csf.feign.response.policyreceipt.ApiPolicyReceiptPageResponse;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.model.PolicyReceipt;
import com.yd.csf.service.service.IPolicyReceiptService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
......@@ -24,8 +26,10 @@ import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.Objects;
@Slf4j
......@@ -38,6 +42,9 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
@Autowired
private PolicyService policyService;
@Autowired
private PolicyFollowService policyFollowService;
/**
* 分页列表查询-保单回执信息
* @param request
......@@ -94,6 +101,10 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
policyReceipt.setReceiptStatus(request.getReceiptStatus());
policyReceipt.setPolicyHolderSignature(!CollectionUtils.isEmpty(request.getPolicyHolderSignatureList()) ? String.join(";", request.getPolicyHolderSignatureList()) : "");
iPolicyReceiptService.saveOrUpdate(policyReceipt);
//更新新单跟进回执信息
updateReceiptToPolicyFollow(policyReceipt);
return Result.success();
}
......@@ -120,6 +131,10 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
policyReceipt.setReceiptStatus(request.getReceiptStatus());
policyReceipt.setPolicyHolderSignature(!CollectionUtils.isEmpty(request.getPolicyHolderSignatureList()) ? String.join(";", request.getPolicyHolderSignatureList()) : "");
iPolicyReceiptService.saveOrUpdate(policyReceipt);
//更新新单跟进回执信息
updateReceiptToPolicyFollow(policyReceipt);
return Result.success();
}
......@@ -141,4 +156,27 @@ public class ApiPolicyReceiptServiceImpl implements ApiPolicyReceiptService {
return Result.success();
}
/**
* 更新新单跟进信息的回执信息
* @param policyReceipt
* @return
*/
public Result updateReceiptToPolicyFollow(PolicyReceipt policyReceipt) {
PolicyFollow policyFollow = policyFollowService.queryOneByPolicyNo(policyReceipt.getPolicyNo());
if (policyFollow == null) {
throw new BusinessException("新单跟进信息不存在");
}
if ("CONFIRMED".equals(policyReceipt.getReceiptStatus())) {
//回执状态为已确认时,更新新单跟进信息的回执状态和回执日期
policyFollow.setReceiptStatus(policyReceipt.getReceiptStatus());
policyFollow.setReceiptDate(policyReceipt.getReceiptDate() != null ? Date.from(policyReceipt.getReceiptDate().atZone(ZoneId.systemDefault()).toInstant()) : null);
}else if ("UNCONFIRMED".equals(policyReceipt.getReceiptStatus())) {
//回执状态为未确认时,更新新单跟进信息的回执状态
policyFollow.setReceiptStatus(policyReceipt.getReceiptStatus());
policyFollow.setReceiptDate(null);
}
policyFollowService.saveOrUpdate(policyFollow);
return Result.success();
}
}
......@@ -14,6 +14,8 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.EnglishTextUtil;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.async.ApiExpectedFortuneAsyncService;
import com.yd.csf.api.service.ApiExpectedFortuneService;
......@@ -129,6 +131,19 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
*/
@Override
public Result<IPage<ApiPremiumReconciliationPageResponse>> page(ApiPremiumReconciliationPageRequest request) {
// 投保人-中文转简体
String policyHolderNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 投保人-英文转小写
String policyHolderNameEnLc = EnglishTextUtil.toLowerCaseSafe(request.getPolicyHolder());
// 受保人-中文转简体
String insuredNameSc = ChineseTextConverter.traditionalToSimplified(request.getPolicyHolder());
// 受保人-英文转小写
String insuredNameEnLc = EnglishTextUtil.toLowerCaseSafe(request.getPolicyHolder());
request.setPolicyHolderNameSc(policyHolderNameSc);
request.setPolicyHolderNameEnLc(policyHolderNameEnLc);
request.setInsuredNameSc(insuredNameSc);
request.setInsuredNameEnLc(insuredNameEnLc);
Page<ApiPremiumReconciliationPageResponse> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiPremiumReconciliationPageResponse> iPage = iPremiumReconciliationService.page(page, request);
......@@ -1290,7 +1305,7 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
// 修改为生效时需要同步预计发佣
if (PolicyFollowStatusEnum.EFFECTIVE.equals(currentStatusEnum)) {
log.info("修改跟进状态获取token:{}", token);
// 同步:根据保单生成预计出账记录
// 根据保单生成预计出账记录
apiExpectedFortuneAsyncService.execute(policyFollow.getPolicyNo(),token);
}
return Result.success(true);
......
......@@ -6,6 +6,7 @@ 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.common.utils.UrlPathExtractor;
import com.yd.csf.api.service.ApiPremiumRemittanceFileService;
import com.yd.csf.api.service.ApiPremiumRemittanceService;
import com.yd.csf.feign.dto.premiumremittance.ApiPremiumRemittanceDto;
......@@ -15,6 +16,9 @@ import com.yd.csf.feign.response.premiumreconciliation.ApiPremiumReconciliationP
import com.yd.csf.service.dto.PremiumRemittanceDto;
import com.yd.csf.service.model.PremiumRemittance;
import com.yd.csf.service.service.IPremiumRemittanceService;
import com.yd.oss.feign.client.ApiOssFileFeignClient;
import com.yd.oss.feign.request.ApiOssFileListRequest;
import com.yd.oss.feign.response.ApiOssFileListResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
......@@ -38,6 +42,9 @@ public class ApiPremiumRemittanceServiceImpl implements ApiPremiumRemittanceServ
@Autowired
private ApiPremiumRemittanceFileService apiPremiumRemittanceFileService;
@Autowired
private ApiOssFileFeignClient apiOssFileFeignClient;
/**
* 分页列表查询-保费对账汇款记录信息
* @param request
......@@ -176,9 +183,41 @@ public class ApiPremiumRemittanceServiceImpl implements ApiPremiumRemittanceServ
ApiPremiumRemittanceDto remittanceDto = new ApiPremiumRemittanceDto();
BeanUtils.copyProperties(dto,remittanceDto);
//支付凭证列表
remittanceDto.setPaymentVoucherList(StringUtils.isNotBlank(dto.getPaymentVoucher()) ? Arrays.asList(dto.getPaymentVoucher().split(";").clone()) : new ArrayList<>());
ApiOssFileListRequest request = new ApiOssFileListRequest();
if (StringUtils.isNotBlank(dto.getPaymentVoucher())) {
List<String> fileKeyList = UrlPathExtractor.extractPaths(dto.getPaymentVoucher());
request.setFileKeyList(fileKeyList);
Result<List<ApiOssFileListResponse>> result = apiOssFileFeignClient.list(request);
if (!CollectionUtils.isEmpty(result.getData())) {
List<ApiPremiumRemittanceFileDto> paymentVoucherDtoList = result.getData().stream().map(d -> {
ApiPremiumRemittanceFileDto fileDto = new ApiPremiumRemittanceFileDto();
fileDto.setFileName(d.getOriginalName());
fileDto.setFileUrl(d.getFileUrl());
fileDto.setFileType(d.getFileType());
return fileDto;
}).collect(Collectors.toList());
remittanceDto.setPaymentVoucherDtoList(paymentVoucherDtoList);
}
}
// remittanceDto.setPaymentVoucherList(StringUtils.isNotBlank(dto.getPaymentVoucher()) ? Arrays.asList(dto.getPaymentVoucher().split(";").clone()) : new ArrayList<>());
//账户证明列表
remittanceDto.setAccountVerificationList(StringUtils.isNotBlank(dto.getAccountVerification()) ? Arrays.asList(dto.getAccountVerification().split(";").clone()) : new ArrayList<>());
ApiOssFileListRequest request1 = new ApiOssFileListRequest();
if (StringUtils.isNotBlank(dto.getAccountVerification())) {
List<String> fileKeyList = UrlPathExtractor.extractPaths(dto.getAccountVerification());
request1.setFileKeyList(fileKeyList);
Result<List<ApiOssFileListResponse>> result = apiOssFileFeignClient.list(request1);
if (!CollectionUtils.isEmpty(result.getData())) {
List<ApiPremiumRemittanceFileDto> accountVerificationDtoList = result.getData().stream().map(d -> {
ApiPremiumRemittanceFileDto fileDto = new ApiPremiumRemittanceFileDto();
fileDto.setFileName(d.getOriginalName());
fileDto.setFileUrl(d.getFileUrl());
fileDto.setFileType(d.getFileType());
return fileDto;
}).collect(Collectors.toList());
remittanceDto.setAccountVerificationDtoList(accountVerificationDtoList);
}
}
// remittanceDto.setAccountVerificationList(StringUtils.isNotBlank(dto.getAccountVerification()) ? Arrays.asList(dto.getAccountVerification().split(";").clone()) : new ArrayList<>());
//其他资料列表
List<ApiPremiumRemittanceFileDto> fileDtoList = apiPremiumRemittanceFileService.apiPremiumRemittanceFileDtoList(dto.getPremiumRemittanceBizId());
......
package com.yd.csf.api.service.impl;
import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.service.ApiSalaryRemittanceService;
import com.yd.csf.feign.dto.salaryremittance.ApiSalaryRemittanceFzDTO;
import com.yd.csf.service.model.SalaryRemittance;
import com.yd.csf.service.service.ISalaryRemittanceService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiSalaryRemittanceServiceImpl implements ApiSalaryRemittanceService {
@Autowired
private ISalaryRemittanceService iSalaryRemittanceService;
/**
* 批量保存薪资汇款明细
* @param salaryBizId
* @param fzDTO
* @return
*/
@Override
public Result batchSave(String salaryBizId, ApiSalaryRemittanceFzDTO fzDTO) {
//先删,后批量新增
iSalaryRemittanceService.delBySalaryBizId(salaryBizId);
//批量新增
if (CollectionUtils.isNotEmpty(fzDTO.getSalaryRemittanceDTOList())) {
List<SalaryRemittance> saveList = fzDTO.getSalaryRemittanceDTOList()
.stream().map(dto -> {
SalaryRemittance salaryRemittance = new SalaryRemittance();
BeanUtils.copyProperties(dto,salaryRemittance);
salaryRemittance.setSalaryBizId(salaryBizId);
salaryRemittance.setSalaryRemittanceBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_SALARY_REMITTANCE.getCode()));
return salaryRemittance;
}).collect(Collectors.toList());
iSalaryRemittanceService.saveOrUpdateBatch(saveList);
}
return Result.success();
}
}
......@@ -33,16 +33,17 @@ import com.yd.oss.feign.client.ApiExcelFeignClient;
import com.yd.oss.feign.dto.ExportParam;
import com.yd.oss.feign.dto.ExportResult;
import com.yd.oss.feign.request.ApiExportRequest;
import com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.request.sysdict.GetDictTypeListRequest;
import com.yd.user.feign.response.sysdict.GetDictItemListByDictTypeResponse;
import com.yd.user.feign.response.sysdict.GetDictTypeListResponse;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.stream.Collectors;
@Slf4j
......@@ -61,6 +62,9 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
@Autowired
private ApiExcelFeignClient apiExcelFeignClient;
@Autowired
private ApiSysDictFeignClient apiSysDictFeignClient;
/**
* 分页查询-薪资拆分应发信息汇总列表
* @param request
......@@ -72,6 +76,13 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
// 查询分页信息
Page<ApiSalarySplitSummaryPageDto> page = new Page<>(request.getPageNo(), request.getPageSize());
IPage<ApiSalarySplitSummaryPageDto> iPage = iSalarySplitService.summaryPage(page, request);
if (CollectionUtils.isNotEmpty(iPage.getRecords())) {
Map<String, String> map = getBillOrgDict();
iPage.getRecords().stream().map(dto -> {
dto.setBillOrg(map != null ? map.get(dto.getBillOrg()) : "");
return dto;
}).collect(Collectors.toList());
}
response.setPage(iPage);
//查询薪资拆分业务ID列表
List<String> salarySplitBizIdList = iSalarySplitService.queryList(request);
......@@ -80,6 +91,33 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
}
/**
* 获取出账机构字典数据
*/
private Map<String, String> getBillOrgDict() {
Map<String, String> dictMap = new HashMap<>();
try {
GetDictTypeListRequest dictRequest = new GetDictTypeListRequest();
dictRequest.setTypeList(Collections.singletonList("csf_bill_org"));
List<GetDictTypeListResponse> dictTypeResponses = apiSysDictFeignClient.getByDictTypeList(dictRequest).getData();
if (dictTypeResponses != null && !dictTypeResponses.isEmpty()) {
for (GetDictTypeListResponse dictTypeResponse : dictTypeResponses) {
if ("csf_bill_org".equals(dictTypeResponse.getDictType())
&& dictTypeResponse.getDictItemList() != null) {
for (GetDictItemListByDictTypeResponse dictItem : dictTypeResponse.getDictItemList()) {
dictMap.put(dictItem.getItemValue(), dictItem.getItemLabel());
}
break;
}
}
}
} catch (Exception e) {
log.error("获取出账机构字典数据失败", e);
}
return dictMap;
}
/**
* 分页查询-薪资拆分应发信息列表
* @param request
* @return
......@@ -133,6 +171,21 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
if (fortuneAccount == null) {
throw new BusinessException("出账记录不存在");
}
//统计保存入参的薪资拆分应发记录原币种金额金额之和
if (CollectionUtils.isNotEmpty(request.getApiSalarySplitBatchSaveDtoList())) {
//入参的薪资拆分应发记录原币种金额金额之和
BigDecimal total = request.getApiSalarySplitBatchSaveDtoList().stream()
.map(ApiSalarySplitBatchSaveDto::getFromAmount)
.filter(Objects::nonNull)
.reduce(BigDecimal.ZERO, BigDecimal::add);
//原币种总金额
BigDecimal fortuneAmount = fortuneAccount.getHkdAmount() != null ? fortuneAccount.getHkdAmount() : BigDecimal.ZERO;
//入参的薪资拆分应发记录原币种金额金额之和不能大于原币种总金额
if (fortuneAmount.compareTo(total) < 0) {
throw new BusinessException("拆分的原币种金额之和不能大于原币种总金额");
}
}
//薪资拆分应发记录-先删除后新增
iSalarySplitService.deleteByFortuneAccountBizId(request.getFortuneAccountBizId());
......@@ -256,9 +309,9 @@ public class ApiSalarySplitServiceImpl implements ApiSalarySplitService {
ExportParam exportParam = new ExportParam();
// 指定需要导出的字段(字段名必须与 DTO 中的属性名一致)
exportParam.setFieldNames(Arrays.asList(
"salarySplitNo","brokerName","team","fromAmount",
"salarySplitNo","businessNo","brokerName","team","fromAmount",
"currency","exchangeRate","toAmount","toCurrency",
"fortuneAccountMonth","billOrg","hkdAmount","fortuneAccountBizId"
"fortuneAccountMonth","billOrg","hkdAmount"
));
exportParam.setFileName("薪资拆分应发信息汇总");
exportParam.setUploadToOss(true);
......
......@@ -47,5 +47,11 @@
<artifactId>yd-base-feign</artifactId>
<version>${project.version}</version>
</dependency>
<!-- XXL-Job 核心依赖 -->
<dependency>
<groupId>com.xuxueli</groupId>
<artifactId>xxl-job-core</artifactId>
</dependency>
</dependencies>
</project>
package com.yd.csf.feign.client.salary;
import com.yd.common.result.Result;
import com.yd.csf.feign.fallback.salary.ApiSalaryFeignFallbackFactory;
import com.yd.csf.feign.request.salary.*;
import com.yd.csf.feign.response.salary.ApiSalaryDetailResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
/**
* 香港保险服务-薪资单信息Feign客户端
*/
@FeignClient(name = "yd-csf-api", fallbackFactory = ApiSalaryFeignFallbackFactory.class)
public interface ApiSalaryFeignClient {
/**
* 分页查询-制作薪资单列表信息
* @param request
* @return
*/
@PostMapping("/page")
Result page(@Validated @RequestBody ApiSalaryPageRequest request);
/**
* 分页查询-电子薪资单列表信息(推送列表信息)
* @param request
* @return
*/
@PostMapping("/push/page")
Result pushPage(@Validated @RequestBody ApiSalaryPushPageRequest request);
/**
* 详情-薪资单信息
* @param salaryBizId
* @return
*/
@GetMapping("/detail")
Result<ApiSalaryDetailResponse> detail(@NotBlank(message = "薪资单表唯一业务ID不能为空") @RequestParam(value = "salaryBizId") String salaryBizId);
/**
* 新增-薪资单信息
* @param request
* @return
*/
@PostMapping("/add")
Result add(@Validated @RequestBody ApiSalaryAddRequest request);
/**
* 修改-薪资单信息
* @param request
* @return
*/
@PutMapping("/edit")
Result edit(@Validated @RequestBody ApiSalaryEditRequest request);
/**
* 提交核对
* @param request
* @return
*/
@PutMapping("/submit/check")
Result submitCheck(@Validated @RequestBody ApiSalarySubmitCheckRequest request);
/**
* 核对
* @param request
* @return
*/
@PutMapping("/check")
Result check(@Validated @RequestBody ApiSalaryCheckRequest request);
/**
* 推送
* @param request
* @return
*/
@PutMapping("/push")
Result push(@Validated @RequestBody ApiSalaryPushRequest request);
/**
* 取消薪资
* @param request
* @return
*/
@PutMapping("/cancel")
Result cancel(@Validated @RequestBody ApiSalaryCancelRequest request);
/**
* 批量新增-薪资单信息
* @param request
* @return
*/
@PostMapping("/batch/add")
Result batchAdd(@Validated @RequestBody ApiSalaryBatchAddRequest request);
/**
* 删除-薪资单汇款明细信息
* @param salaryRemittanceBizId
* @return
*/
@DeleteMapping("/delSalaryRemittance")
Result delSalaryRemittance(@NotBlank(message = "薪资汇款明细表唯一业务ID不能为空") @RequestParam(value = "salaryRemittanceBizId") String salaryRemittanceBizId);
/**
* 根据转介人和薪资年月查询应发总金额
* @param request
* @return
*/
@PostMapping("/get/grossAmount")
Result<BigDecimal> getGrossAmount(@Validated @RequestBody ApiSalaryGrossAmountRequest request);
/**
* 薪资单信息-汇款明细-查询汇率
* @param request
* @return
*/
@PostMapping("/get/exchangeRate")
Result<BigDecimal> getExchangeRate(@Validated @RequestBody ApiSalaryExchangeRateRequest request);
/**
* 计算-实发金额
* @param request
* @return
*/
@PostMapping("/calculate/paidAmount")
Result<BigDecimal> calculatePaidAmount(@Validated @RequestBody ApiSalaryCalculatePaidAmountRequest request);
/**
* 计算-薪资汇款明细合计发放金额(单位:HKD)
* @param request
* @return
*/
@PostMapping("/calculate/totalAmount")
Result<BigDecimal> calculateTotalAmount(@Validated @RequestBody ApiSalaryCalculateTotalAmountRequest request);
}
......@@ -10,6 +10,9 @@ public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "发放编号", orderNum = "1")
private String salarySplitNo;
@Excel(name = "业务编号", orderNum = "1")
private String businessNo;
@Excel(name = "转介人", orderNum = "2")
private String brokerName;
......@@ -43,7 +46,4 @@ public class ApiSalarySplitSummaryExcelDto {
@Excel(name = "本期总出账金额(原币种)", orderNum = "12")
private BigDecimal hkdAmount;
@Excel(name = "出账记录业务id", orderNum = "13")
private String fortuneAccountBizId;
}
......@@ -86,6 +86,18 @@ public class ApiPremiumRemittanceDto {
private List<String> accountVerificationList;
/**
* 支付凭证列表
*/
// @NotEmpty(message = "支付凭证列表不能为空")
private List<ApiPremiumRemittanceFileDto> paymentVoucherDtoList;
/**
* 账户证明列表
*/
// @NotEmpty(message = "账户证明列表不能为空")
private List<ApiPremiumRemittanceFileDto> accountVerificationDtoList;
/**
* 其他资料列表
*/
private List<ApiPremiumRemittanceFileDto> apiPremiumRemittanceFileDtoList;
......
package com.yd.csf.feign.dto.salary;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalaryBatchAddDTO {
/**
* 转介人名称
*/
private String brokerName;
/**
* 转介人业务id
*/
private String brokerBizId;
/**
* 薪资月份(同出账月,如:202605)
*/
private String month;
/**
* 应发总金额(单位:HKD)
*/
private BigDecimal grossAmount;
/**
* MPF事项总金额(单位:HKD)
*/
private BigDecimal mpfAmount;
/**
* 其他调整总金额(单位:HKD)
*/
private BigDecimal otherAmount;
/**
* 其他调整的备注
*/
private String otherRemark;
/**
* 实发总金额(单位:HKD)
*/
private BigDecimal paidAmount;
//========以下是薪资汇款明细字段,两个汇款明细对象
/**
* 收款银行1
*/
private String bank1;
/**
* 账户尾号1
*/
private String accountEndNo1;
/**
* 汇款币种1
*/
private String currency1;
/**
* 汇款金额1(发放金额1)
*/
private BigDecimal amount1;
/**
* 汇率1
*/
private BigDecimal exchangeRate1;
/**
* 备注1
*/
private String remark1;
/**
* 收款银行1
*/
private String bank2;
/**
* 账户尾号1
*/
private String accountEndNo2;
/**
* 汇款币种1
*/
private String currency2;
/**
* 汇款金额1(发放金额1)
*/
private BigDecimal amount2;
/**
* 汇率1
*/
private BigDecimal exchangeRate2;
/**
* 备注1
*/
private String remark2;
}
package com.yd.csf.feign.dto.salary;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
public class CalculateTotalAmountDTO {
/**
* 汇款币种
*/
private String currency;
/**
* 发放金额
*/
@NotNull(message = "发放金额不能为空")
private BigDecimal amount;
/**
* 汇率
*/
@NotNull(message = "汇率不能为空")
private BigDecimal exchangeRate;
}
package com.yd.csf.feign.dto.salaryremittance;
import lombok.Data;
import java.math.BigDecimal;
@Data
public class ApiSalaryRemittanceDTO {
/**
* 薪资汇款明细表唯一业务ID
*/
private String salaryRemittanceBizId;
/**
* 收款银行
*/
private String bank;
/**
* 账户尾号
*/
private String accountEndNo;
/**
* 汇款币种
*/
private String currency;
/**
* 汇款金额
*/
private BigDecimal amount;
/**
* 汇率
*/
private BigDecimal exchangeRate;
/**
* 通用备注
*/
private String remark;
}
package com.yd.csf.feign.dto.salaryremittance;
import lombok.Data;
import java.math.BigDecimal;
import java.util.List;
/**
* 薪资汇款明细封装DTO
*/
@Data
public class ApiSalaryRemittanceFzDTO {
/**
* 汇款金额合计(单位:HKD)
*/
private BigDecimal totalAmount;
/**
* 薪资汇款明细
*/
private List<ApiSalaryRemittanceDTO> salaryRemittanceDTOList;
}
......@@ -24,6 +24,11 @@ public class ApiSalarySplitSummaryPageDto {
private String fortuneAccountBizId;
/**
* 出账业务编号(出账年月 + 转介人内部编号(后6位)(如无,用0补齐)+流水号(6位))
*/
private String businessNo;
/**
* 转介人名称
*/
private String brokerName;
......
package com.yd.csf.feign.enums;
/**
* 积分来源枚举
*/
public enum FycSourceTypeEnum {
CALM_TASK("冷静期定时计算","CALM_TASK"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
FycSourceTypeEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
package com.yd.csf.feign.enums;
/**
* 操作来源枚举
*/
public enum OprSourceEnum {
CALM_TASK_FREEZE("冷静期定时计算-冻结","CALM_TASK_FREEZE"),
CALM_TASK_DEFROST("冷静期定时计算-解冻","CALM_TASK_DEFROST"),
CALM_TASK_EVALUATE_RANK("评级定时任务计算职级","CALM_TASK_EVALUATE_RANK"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
OprSourceEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
package com.yd.csf.feign.enums;
/**
* 薪资单状态枚举
*/
public enum SalaryStatusEnum {
DTJ("待提交","1"),
DHD("待核对","2"),
YHD("已核对","3"),
TH("退回修改","4"),
YTS("已推送","5"),
YQX("已取消","6"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
SalaryStatusEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
package com.yd.csf.feign.fallback.salary;
import com.yd.common.result.Result;
import com.yd.csf.feign.client.salary.ApiSalaryFeignClient;
import com.yd.csf.feign.request.salary.*;
import com.yd.csf.feign.response.salary.ApiSalaryDetailResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
/**
* 香港保险服务-薪资单信息Feign降级处理
*/
@Slf4j
@Component
public class ApiSalaryFeignFallbackFactory implements FallbackFactory<ApiSalaryFeignClient> {
@Override
public ApiSalaryFeignClient create(Throwable cause) {
return new ApiSalaryFeignClient() {
@Override
public Result page(ApiSalaryPageRequest request) {
return null;
}
@Override
public Result pushPage(ApiSalaryPushPageRequest request) {
return null;
}
@Override
public Result<ApiSalaryDetailResponse> detail(String salaryBizId) {
return null;
}
@Override
public Result add(ApiSalaryAddRequest request) {
return null;
}
@Override
public Result edit(ApiSalaryEditRequest request) {
return null;
}
@Override
public Result submitCheck(ApiSalarySubmitCheckRequest request) {
return null;
}
@Override
public Result check(ApiSalaryCheckRequest request) {
return null;
}
@Override
public Result push(ApiSalaryPushRequest request) {
return null;
}
@Override
public Result cancel(ApiSalaryCancelRequest request) {
return null;
}
@Override
public Result batchAdd(ApiSalaryBatchAddRequest request) {
return null;
}
@Override
public Result delSalaryRemittance(String salaryRemittanceBizId) {
return null;
}
@Override
public Result<BigDecimal> getGrossAmount(ApiSalaryGrossAmountRequest request) {
return null;
}
@Override
public Result<BigDecimal> getExchangeRate(ApiSalaryExchangeRateRequest request) {
return null;
}
@Override
public Result<BigDecimal> calculatePaidAmount(ApiSalaryCalculatePaidAmountRequest request) {
return null;
}
@Override
public Result<BigDecimal> calculateTotalAmount(ApiSalaryCalculateTotalAmountRequest request) {
return null;
}
};
}
}
package com.yd.csf.feign.request.commission;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class CommissionExpectedEditStatusRequest {
/**
* 预计来佣业务ID
*/
@NotBlank(message = "预计来佣业务ID不能为空")
private String commissionExpectedBizId;
/**
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效 字典值: csf_expected_commission_status
*/
@NotBlank(message = "入账状态不能为空")
private String status;
/**
* 设置入账状态-修改理由
*/
private String statusDesc;
}
......@@ -51,7 +51,7 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "产品计划业务ID列表")
private List<String> productLaunchBizIdList;
@Schema(description = "转介人业务ID列表")
@Schema(description = "转介人(主)业务ID列表")
private List<String> brokerBizIdList;
@Schema(description = "签单员业务ID列表")
......@@ -59,4 +59,10 @@ public class ApiExpectedFortunePageRequest extends PageDto {
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
private String fortuneBizType;
@Schema(description = "保單持有人(中/英)")
private String policyHolder;
private List<String> PolicyNoList;
}
......@@ -5,112 +5,84 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ExpectedFortuneAddRequest {
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizType;
/**
* 关联保单号
*/
@Schema(description = "出账年月 (估)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String payoutDate;
@Schema(description = "出账年月 (实)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String actualPayoutDate;
@Schema(description = "关联保单号")
private String policyNo;
/**
* 产品计划 ID
*/
@Schema(description = "产品计划 ID")
private String productLaunchBizId;
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
@Schema(description = "出账状态-修改理由")
private String statusDesc;
/**
* 佣金期数
*/
@Schema(description = "佣金期数")
@Schema(description = "出账项目", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneName;
@Schema(description = "出账项目类型 字典值:csf_fortune_type", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneType;
@Schema(description = "出账期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortunePeriod;
/**
* 总期数
*/
@Schema(description = "总期数")
@Schema(description = "出账总期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortuneTotalPeriod;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
@Schema(description = "转介人名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
@Schema(description = "broker biz id", requiredMode = Schema.RequiredMode.REQUIRED)
private String brokerBizId;
/**
* 团队名称
*/
@Schema(description = "团队名称")
@Schema(description = "所属团队")
private String team;
/**
* 所属团队业务ID
*/
@Schema(description = "所属团队 biz id")
@Schema(description = "所属团队业务ID")
private String teamBizId;
/**
* 出账项目
*/
@Schema(description = "出账项目")
private String fortuneName;
@Schema(description = "保单币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal ruleAmount;
/**
* 出账项目类型
*/
@Schema(description = "出账项目类型 字典值:csf_fortune_type")
private String fortuneType;
@Schema(description = "保单币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleCurrency;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
@Schema(description = "保单币种→港币汇率(默认保单币种汇率)", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal defaultExchangeRate;
/**
* 出账金额 单位:港币
*/
@Schema(description = "出账金额 单位:港币")
private BigDecimal hkdAmount;
@Schema(description = "原币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String originalCurrency;
/**
* 出账币种
*/
@Schema(description = "出账币种")
private String currency;
/**
* 出账日 (估)
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date actualPayoutDate;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
@Schema(description = "原币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalAmount;
@Schema(description = "原币种→港币汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalToHkdRate;
@Schema(description = "发放币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutCurrency;
@Schema(description = "发放币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币种汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdToPayoutRate;
@Schema(description = "港币金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdAmount;
@Schema(description = "备注")
private String remark;
}
......@@ -5,99 +5,94 @@ import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDate;
@Data
public class ExpectedFortuneUpdateRequest {
/**
* 预计发佣业务id
*/
@Schema(description = "预计发佣业务id")
@Schema(description = "预计发佣业务id", requiredMode = Schema.RequiredMode.REQUIRED)
private String expectedFortuneBizId;
/**
* 应付款类型 R-关联保单应付款 U-非关联保单应付款
*/
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款")
@Schema(description = "应付款类型 R-关联保单应付款 U-非关联保单应付款", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneBizType;
/**
* 出账日 (估)
*/
@Schema(description = "出账日 (估)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate payoutDate;
@Schema(description = "出账年月 (估)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String payoutDate;
/**
* 出账日 (实)
*/
@Schema(description = "出账日 (实)")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private LocalDate actualPayoutDate;
@Schema(description = "出账年月 (实)", requiredMode = Schema.RequiredMode.REQUIRED)
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private String actualPayoutDate;
/**
* 港币出账金额
*/
@Schema(description = "港币出账金额")
private BigDecimal hkdAmount;
@Schema(description = "关联保单号")
private String policyNo;
/**
* 出账状态
*/
@Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
private String status;
// @Schema(description = "出账状态 0=待出账 1=可出帐,待检核 2=完成出账 3=部分出账 4=保留 5=已失效 6=可出帐,检核完成 7=未找到当前预计发佣对应的来佣, 字典值: csf_expected_fortune_status")
// private String status;
/**
* 出账状态-修改理由
*/
@Schema(description = "出账状态-修改理由")
private String statusDesc;
// @Schema(description = "出账状态-修改理由")
// private String statusDesc;
/**
* 出账项目
*/
@Schema(description = "出账项目")
@Schema(description = "出账项目", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneName;
/**
* 出账项目类型
*/
@Schema(description = "出账项目类型 字典值:csf_fortune_type")
@Schema(description = "出账项目类型 字典值:csf_fortune_type", requiredMode = Schema.RequiredMode.REQUIRED)
private String fortuneType;
/**
* 出账期数
*/
@Schema(description = "出账期数")
@Schema(description = "出账期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortunePeriod;
/**
* 出账总期数
*/
@Schema(description = "出账总期数")
@Schema(description = "出账总期数", requiredMode = Schema.RequiredMode.REQUIRED)
private Integer fortuneTotalPeriod;
/**
* 币种
*/
@Schema(description = "币种")
private String currency;
/**
* 转介人名称
*/
@Schema(description = "转介人名称")
@Schema(description = "转介人名称", requiredMode = Schema.RequiredMode.REQUIRED)
private String broker;
/**
* 转介人业务ID
*/
@Schema(description = "broker biz id")
@Schema(description = "broker biz id", requiredMode = Schema.RequiredMode.REQUIRED)
private String brokerBizId;
/**
* 备注
*/
@Schema(description = "所属团队")
private String team;
@Schema(description = "所属团队业务ID")
private String teamBizId;
@Schema(description = "保单币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal ruleAmount;
@Schema(description = "保单币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String ruleCurrency;
@Schema(description = "保单币种→港币汇率(默认保单币种汇率)", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal defaultExchangeRate;
@Schema(description = "原币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String originalCurrency;
@Schema(description = "原币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalAmount;
@Schema(description = "原币种→港币汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal originalToHkdRate;
@Schema(description = "发放币种", requiredMode = Schema.RequiredMode.REQUIRED)
private String payoutCurrency;
@Schema(description = "发放币种金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币种汇率", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdToPayoutRate;
@Schema(description = "港币金额", requiredMode = Schema.RequiredMode.REQUIRED)
private BigDecimal hkdAmount;
@Schema(description = "备注")
private String remark;
}
......@@ -2,7 +2,9 @@ package com.yd.csf.feign.request.premiumreconciliation;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.yd.common.dto.PageDto;
import com.yd.common.utils.ChineseTextConverter;
import com.yd.common.utils.CustomLocalDateTimeDeserializer;
import com.yd.common.utils.EnglishTextUtil;
import lombok.Data;
import java.time.LocalDateTime;
......@@ -35,11 +37,16 @@ public class ApiPremiumReconciliationPageRequest extends PageDto {
private String appointmentNo;
/**
* 保單持有人(投保人)
* 保單持有人(投保人)(中文名/英文名)(繁简/大小写)
*/
private String policyHolder;
/**
* 受保人(保单表)(中文名/英文名)(繁简/大小写)
*/
private String insured;
/**
* 缴费方式
*/
private String paymentMethod;
......@@ -59,6 +66,15 @@ public class ApiPremiumReconciliationPageRequest extends PageDto {
*/
private String reconciliationType;
// 投保人-中文转简体
private String policyHolderNameSc;
// 投保人-英文转小写
private String policyHolderNameEnLc;
// 受保人-中文转简体
private String insuredNameSc;
// 受保人-英文转小写
private String insuredNameEnLc;
/**
* 付款日期
*/
......
package com.yd.csf.feign.request.salary;
import com.yd.csf.feign.dto.salaryremittance.ApiSalaryRemittanceFzDTO;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
@Data
public class ApiSalaryAddRequest {
/**
* 转介人名称
*/
@NotBlank(message = "转介人名称不能为空")
private String brokerName;
/**
* 转介人业务id
*/
@NotBlank(message = "转介人业务id不能为空")
private String brokerBizId;
/**
* 薪资月份(同出账月,如:202605)
*/
@NotBlank(message = "薪资月份不能为空")
private String month;
/**
* 应发总金额(单位:HKD)(正常情况下,录入转介人和薪资月份去查询出账记录表出账金额和值)
*/
private BigDecimal grossAmount;
/**
* MPF事项总金额(单位:HKD)
*/
private BigDecimal mpfAmount;
/**
* 其他调整总金额(单位:HKD)
*/
private BigDecimal otherAmount;
/**
* 其他调整的备注
*/
private String otherRemark;
/**
* 实发总金额(单位:HKD)
*/
private BigDecimal paidAmount;
/**
* 薪资汇款明细封装的DTO
*/
private ApiSalaryRemittanceFzDTO apiSalaryRemittanceFzDTO;
}
package com.yd.csf.feign.request.salary;
import com.yd.csf.feign.dto.salary.ApiSalaryBatchAddDTO;
import lombok.Data;
import java.util.List;
@Data
public class ApiSalaryBatchAddRequest {
private List<ApiSalaryBatchAddDTO> apiSalaryBatchAddDTOList;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
@Data
public class ApiSalaryCalculatePaidAmountRequest {
/**
* 应发总金额(单位:HKD)
*/
@NotNull(message = "应发总金额不能为空")
private BigDecimal grossAmount;
/**
* MPF事项总金额(单位:HKD)
*/
@NotNull(message = "MPF事项总金额不能为空")
private BigDecimal mpfAmount;
/**
* 其他调整总金额(单位:HKD)
*/
@NotNull(message = "其他调整总金额不能为空")
private BigDecimal otherAmount;
}
package com.yd.csf.feign.request.salary;
import com.yd.csf.feign.dto.salary.CalculateTotalAmountDTO;
import lombok.Data;
import javax.validation.Valid;
import java.util.List;
@Data
public class ApiSalaryCalculateTotalAmountRequest {
@Valid
private List<CalculateTotalAmountDTO> calculateTotalAmountDTOList;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiSalaryCancelRequest {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
/**
* 取消薪资备注
*/
private String cancelRemark;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@Data
public class ApiSalaryCheckRequest {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
/**
* 状态:1-核对通过 2-退回修改
*/
@NotNull(message = "核对状态不能为空")
private Integer status;
/**
* 退回备注
*/
private String returnRemark;
}
package com.yd.csf.feign.request.salary;
import com.yd.csf.feign.dto.salaryremittance.ApiSalaryRemittanceFzDTO;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
@Data
public class ApiSalaryEditRequest {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
/**
* 转介人名称
*/
@NotBlank(message = "转介人名称不能为空")
private String brokerName;
/**
* 转介人业务id
*/
@NotBlank(message = "转介人业务id不能为空")
private String brokerBizId;
/**
* 薪资月份(同出账月,如:202605)
*/
@NotBlank(message = "薪资月份不能为空")
private String month;
/**
* 应发总金额(单位:HKD)(正常情况下,录入转介人和薪资月份去查询出账记录表出账金额和值)
*/
private BigDecimal grossAmount;
/**
* MPF事项总金额(单位:HKD)
*/
private BigDecimal mpfAmount;
/**
* 其他调整总金额(单位:HKD)
*/
private BigDecimal otherAmount;
/**
* 其他调整的备注
*/
private String otherRemark;
/**
* 实发总金额(单位:HKD)
*/
private BigDecimal paidAmount;
/**
* 薪资汇款明细封装的DTO
*/
private ApiSalaryRemittanceFzDTO apiSalaryRemittanceFzDTO;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiSalaryExchangeRateRequest {
/**
* 原币种
*/
@NotBlank(message = "原币种不能为空")
private String fromCurrency;
/**
* 目标币种
*/
@NotBlank(message = "目标币种不能为空")
private String toCurrency;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiSalaryGrossAmountRequest {
/**
* 转介人业务id
*/
@NotBlank(message = "转介人业务id不能为空")
private String brokerBizId;
/**
* 薪资月份(同出账月,如:202605)
*/
@NotBlank(message = "薪资月份不能为空")
private String month;
}
package com.yd.csf.feign.request.salary;
import com.yd.common.dto.PageDto;
import lombok.Data;
@Data
public class ApiSalaryPageRequest extends PageDto {
/**
* 转介人名称
*/
private String brokerName;
/**
* 薪资月份(同出账月,如:202605)
*/
private String month;
}
package com.yd.csf.feign.request.salary;
import com.yd.common.dto.PageDto;
import lombok.Data;
@Data
public class ApiSalaryPushPageRequest extends PageDto {
/**
* 转介人名称
*/
private String brokerName;
/**
* 薪资月份(同出账月,如:202605)
*/
private String month;
/**
* 薪资单状态:1-待提交 2-待核对 3-已核对 4-退回 5-已推送 6-已取消
*/
private String status;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiSalaryPushRequest {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
}
package com.yd.csf.feign.request.salary;
import lombok.Data;
import javax.validation.constraints.NotBlank;
@Data
public class ApiSalarySubmitCheckRequest {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
}
......@@ -42,4 +42,9 @@ public class ApiSalarySplitSummaryPageRequest extends PageDto {
* 出账机构
*/
private String billOrg;
/**
* 出账业务编号
*/
private String businessNo;
}
......@@ -18,6 +18,12 @@ public class ApiExpectedFortunePageResponse {
private Long id;
/**
* 是否实际出账:1-预计出账 2-实际出账
*/
@Schema(description = "是否实际出账:1-预计出账 2-实际出账")
private Integer type;
/**
* 预计出账表唯一业务id
*/
@Schema(description = "expected fortune biz id")
......@@ -32,7 +38,7 @@ public class ApiExpectedFortunePageResponse {
/**
* 应付款编号
*/
@Schema(description = "应付款编号")
@Schema(description = "应付款编号(业务编号)")
private String payableNo;
/**
......@@ -126,46 +132,75 @@ public class ApiExpectedFortunePageResponse {
private String fortuneType;
/**
* 转介人介绍费占比
* 持有比例
*/
@Schema(description = "转介人介绍费占比")
@Schema(description = "持有比例")
private String brokerRatio;
// ========== 保单币种及金额(基本法币种) ==========
/**
* 标准出佣金额
* 保单币种金额(保单币种金额 = 标准发佣金额 * 转介人介绍费占比)
*/
@Schema(description = "标准出佣金额")
private BigDecimal standardAmount;
@Schema(description = "保单币种金额(保单币种金额 = 标准发佣金额 * 转介人介绍费占比)")
private BigDecimal ruleAmount;
/**
* 应出账金额(预计发佣金额 = 标准发佣金额 * 转介人介绍费占比)
* 保单币种
*/
@Schema(description = "应出账金额(预计发佣金额 = 标准发佣金额 * 转介人介绍费占比)")
private BigDecimal amount;
@Schema(description = "保单币种")
private String ruleCurrency;
/**
* 出账币种
* 预计出账-默认保单币种汇率(保单币种 -> 港币汇率)
*/
@Schema(description = "出账币种")
private String currency;
@Schema(description = "预计出账-默认保单币种汇率(保单币种 -> 港币汇率)")
private BigDecimal defaultExchangeRate;
/**
* 出账币种名称
* 预计出账-HKD应出账金额
*/
@Schema(description = "出账币种名称")
private String currencyName;
@Schema(description = "预计出账-HKD应出账金额")
private BigDecimal hkdAmount;
// ========== 原币种及金额 ==========
@Schema(description = "原币种")
private String originalCurrency;
@Schema(description = "原币种金额")
private BigDecimal originalAmount;
@Schema(description = "原币→港币汇率")
private BigDecimal originalToHkdRate;
// ========== 发放币种及金额 ==========
@Schema(description = "发放币种")
private String payoutCurrency;
@Schema(description = "发放币种金额")
private BigDecimal payoutAmount;
@Schema(description = "港币→发放币汇率")
private BigDecimal hkdToPayoutRate;
/**
* 默认结算汇率
* 实际出账-本次出账金额(HKD)
*/
@Schema(description = "默认结算汇率")
private BigDecimal defaultExchangeRate;
@Schema(description = "实际出账-本次出账金额(HKD)")
private BigDecimal currentPaymentHkdAmount;
/**
* 港币预计出账金额
* 实际出账-本期结算汇率
*/
@Schema(description = "港币预计出账金额")
private BigDecimal hkdAmount;
@Schema(description = "实际出账-本期结算汇率")
private BigDecimal exchangeRate;
/**
* 出账币种名称
*/
@Schema(description = "出账币种名称")
private String currencyName;
/**
* 出账状态
......@@ -180,65 +215,67 @@ public class ApiExpectedFortunePageResponse {
private String statusDesc;
/**
* 预计出账日期
* 出账年月(估)
*/
@Schema(description = "预计出账日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Schema(description = "出账年月(估)")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private LocalDate payoutDate;
/**
* 实际出账日期
* 出账年月(实)
*/
@Schema(description = "实际出账日期")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
@Schema(description = "出账年月(实)")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private LocalDate actualPayoutDate;
/**
* 已出账金额
* 预计出账-已出账金额(HKD)
*/
@Schema(description = "已出账金额")
@Schema(description = "预计出账-已出账金额(HKD)")
private BigDecimal paidAmount;
/**
* 待出账金额
* 预计出账-待出账金额
*/
@Schema(description = "待出账金额")
@Schema(description = "预计出账-待出账金额")
private BigDecimal unpaidAmount;
/**
* 已出账比例 已出账金额/应出账金额
* 预计出账-已出账金额比例 已出账金额/应出账金额
*/
@Schema(description = "已出账比例 已出账金额/应出账金额")
@Schema(description = "预计出账-已出账金额比例 已出账金额/应出账金额")
private BigDecimal paidRatio;
/**
* 待出账比例 待出账金额/应出账金额
* 预计出账-待出账比例 待出账金额/应出账金额
*/
@Schema(description = "待出账比例 待出账金额/应出账金额")
@Schema(description = "预计出账-待出账比例 待出账金额/应出账金额")
private BigDecimal unpaidRatio;
/**
* 基本法项目配置表唯一业务ID
*/
@Schema(description = "rule item biz id")
private String ruleItemBizId;
/**
* 备注
*/
@Schema(description = "备注")
private String remark;
/**
* 创建人
*/
@Schema(description = "创建人")
private String creatorName;
/**
* 创建时间
*/
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
/**
* 更新时间
* 更新时间(操作时间)
*/
@Schema(description = "更新时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
/**
......
package com.yd.csf.feign.response.policyfollow;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
@Data
public class ApiPolicyFollowDetailResponse {
/**
* id
*/
private Long id;
/**
* 新单跟进唯一业务ID
*/
private String policyBizId;
/**
* 保单号
*/
private String policyNo;
/**
* FNA 业务ID
*/
private String fnaBizId;
/**
* 预约信息主表唯一业务ID
*/
private String appointmentBizId;
/**
* 预约编号
*/
private String appointmentNo;
/**
* 客户业务id
*/
private String customerBizId;
/**
* 递交日期
*/
private Date submitDate;
/**
* 客户名称
*/
private String customerName;
/**
* 签单日期
*/
private Date signDate;
/**
* 签单人
*/
private String signer;
/**
* 签单人业务id
*/
private String signerBizId;
/**
* 签单人执业编号
*/
private String practiceCode;
/**
* 签单地点
*/
private String signLocation;
/**
* 缮发日期
*/
private Date issueDate;
/**
* 冷静期结束日期
*/
private Date coolingOffEndDate;
/**
* 冷静期天数
*/
private Integer coolingOffDays;
/**
* 核保日期
*/
private Date underwritingDate;
/**
* 生效日期
*/
private Date effectiveDate;
/**
* 续保日期
*/
private Date renewalDate;
/**
* 保单回执日期
*/
private Date receiptDate;
/**
* 回执状态
*/
private String receiptStatus;
/**
* 是否开通直接支付
*/
private Integer directPaymentEnabled;
/**
* 供款年期
*/
private Object issueNumber;
/**
* 保障期限
*/
private String guaranteePeriod;
/**
* 保额(重疾险)
*/
private BigDecimal sumInsured;
/**
* 付款频率(字典)
*/
private String paymentFrequency;
/**
* 每期保费
*/
private BigDecimal eachIssuePremium;
/**
* 是否预缴: 0-否, 1-是
*/
private Integer isPrepay;
/**
* 是否追溯: 0-否, 1-是
*/
private Integer isTraceable;
/**
* 回溯日期
*/
private Date retroactiveDate;
/**
* 预缴年期
*/
private Integer prepaidTerm;
/**
* 预付额
*/
private String prepaidAmount;
/**
* 折扣后预付额
*/
private String prepaidAmountAfterDiscount;
/**
* 保单截止日期
*/
private Date policyExpirationDate;
/**
* 缴费编号
*/
private String paymentNumber;
/**
* 产品上架信息表唯一业务ID
*/
private String productLaunchBizId;
/**
* 产品名称
*/
private String productName;
/**
* 产品险种
*/
private String productCate;
/**
* 产品险种代码
*/
private String categoryCode;
/**
* 产品险种业务 id
*/
private String insuranceCategoryBizId;
/**
* 保险公司
*/
private String insuranceCompany;
/**
* 保险公司业务id
*/
private String insuranceCompanyBizId;
/**
* 对账公司
*/
private String reconciliationCompany;
/**
* 对账公司编码
*/
private String reconciliationCompanyCode;
/**
* 对账公司业务id
*/
private String reconciliationCompanyBizId;
/**
* 新单跟进状态
*/
private String status;
/**
* 下一步跟进状态列表
*/
private String nextStatusList;
/**
* 保單持有人
*/
private String policyHolder;
/**
* 受保人
*/
private String insured;
/**
* 受保人业务id
*/
private String insuredBizId;
/**
* 受保人年龄
*/
private Integer insuredAge;
/**
* 宽限期
*/
private Integer gracePeriod;
/**
* 是否参加递增保障权益: 0-否, 1-是(字典)
*/
private Integer isJoin;
/**
* 保单币种
*/
private String policyCurrency;
/**
* 首期付款方式(字典)
*/
private String initialPaymentMethod;
/**
* 首期保费(不含徽费,预缴保费)
*/
private BigDecimal initialPremium;
/**
* 首期已缴保费
*/
private BigDecimal initialPremiumPaid;
/**
* 首期待缴保费
*/
private BigDecimal initialPremiumDue;
/**
* 首期缴费总额
*/
private BigDecimal initialPremiumTotal;
/**
* 首期缴费状态
*/
private String initialPaymentStatus;
/**
* 首期保费优惠金额
*/
private BigDecimal initialPremiumDiscount;
/**
* 寄送方式 字典值:1-自提 2-快递
*/
private String mailingMethod;
/**
* 续期付款方式(字典)
*/
private String renewalPaymentMethod;
/**
* 红利方式(字典)
*/
private String dividendDistributionMethod;
/**
* 快递单号
*/
private String deliveryNo;
/**
* 专业投资者: Yes/No
*/
private String professionalInvestor;
/**
* 邮寄物品
*/
private String mailingItem;
/**
* 保单征费
*/
private String policyLevy;
/**
* 最晚缴费日期
*/
private Date latestPaymentDate;
/**
* 经纪公司签收日期
*/
private Date brokerSignDate;
/**
* 保险公司寄出日期
*/
private Date insurerMailingDate;
/**
* 客户签收日期
*/
private Date customerSignDate;
/**
* 附件地址列表 逗号隔开
*/
private String attachments;
/**
* 通用备注
*/
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建人ID
*/
private String creatorId;
/**
* 更新人ID
*/
private String updaterId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
/**
* 保单类型: 1-电子, 2-纸质
*/
private String policyType;
}
......@@ -85,16 +85,26 @@ public class ApiPremiumReconciliationPageResponse {
private String payingBank;
/**
* 保單持有人(投保人,保单表)
* 保單持有人(投保人,保单表)(中文名)
*/
private String policyHolder;
/**
* 受保人(保单表)
* 保單持有人(投保人,保单表)(英文名)
*/
private String policyHolderEn;
/**
* 受保人(保单表)(中文名)
*/
private String insured;
/**
* 受保人(保单表)(英文名)
*/
private String insuredEn;
/**
* 转介人名称(保单转介人表,多个分号分隔)
*/
private String brokerName;
......
package com.yd.csf.feign.response.salary;
import com.yd.csf.feign.dto.salaryremittance.ApiSalaryRemittanceFzDTO;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import java.math.BigDecimal;
@Data
public class ApiSalaryDetailResponse {
/**
* 薪资单表唯一业务ID
*/
@NotBlank(message = "薪资单表唯一业务ID不能为空")
private String salaryBizId;
/**
* 转介人名称
*/
@NotBlank(message = "转介人名称不能为空")
private String brokerName;
/**
* 转介人业务id
*/
@NotBlank(message = "转介人业务id不能为空")
private String brokerBizId;
/**
* 薪资月份(同出账月,如:202605)
*/
@NotBlank(message = "薪资月份不能为空")
private String month;
/**
* 应发总金额(单位:HKD)(正常情况下,录入转介人和薪资月份去查询出账记录表出账金额和值)
*/
private BigDecimal grossAmount;
/**
* MPF事项总金额(单位:HKD)
*/
private BigDecimal mpfAmount;
/**
* 其他调整总金额(单位:HKD)
*/
private BigDecimal otherAmount;
/**
* 其他调整的备注
*/
private String otherRemark;
/**
* 实发总金额(单位:HKD)
*/
private BigDecimal paidAmount;
/**
* 薪资汇款明细封装的DTO
*/
private ApiSalaryRemittanceFzDTO apiSalaryRemittanceFzDTO;
}
package com.yd.csf.feign.response.salary;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ApiSalaryPageResponse {
/**
* 发放编号
*/
private String salaryNo;
/**
* 薪资单表唯一业务ID
*/
private String salaryBizId;
/**
* 转介人名称
*/
private String brokerName;
/**
* 转介人内部编号
*/
private String internalNumber;
/**
* 团队名称
*/
private String teamName;
/**
* 发放金额(实发总金额)(单位:HKD)
*/
private BigDecimal paidAmount;
/**
* 发放币种(汇款币种,多个用分号分隔)
*/
private String currencyList;
/**
* 薪资月份(同出账月,如:202605)
*/
private String month;
/**
* 薪资单状态:1-待提交 2-待审核 3-审核退回 4-待核对 5-核对退回 6-已核对 7-已推送 8-已取消
*/
private String status;
/**
* 制作人(创建人名称)
*/
private String creatorName;
/**
* 制作时间(创建时间)
*/
private LocalDateTime createTime;
}
package com.yd.csf.feign.response.salary;
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;
@Data
public class ApiSalaryPushPageResponse {
/**
* 转介人名称
*/
private String brokerName;
/**
* 薪资月份(同出账月,如:202605)
*/
private String month;
/**
* 实发总金额(单位:HKD)
*/
private BigDecimal paidAmount;
/**
* 应发总金额(单位:HKD)
*/
private BigDecimal grossAmount;
/**
* 扣款合计(单位:HKD)( 扣款合计 = 应发 - 实发)
*/
private BigDecimal totalDeductions;
/**
* 其他调整的备注
*/
private String otherRemark;
/**
* 薪资单状态:1-待提交 2-待核对 3-已核对 4-退回 5-已推送 6-已取消
*/
private String status;
/**
* 制作人(创建人名称)
*/
private String creatorName;
/**
* 制作时间(创建时间)
*/
private LocalDateTime createTime;
}
......@@ -199,9 +199,15 @@ public class CommissionAsyncService {
paidAmount = paidAmount.add(item.getHkdAmount());
}
// 更新预计来佣已入账金额、已入账比例
// 更新预计来佣已入账金额、已入账比例、达成率缺口
commissionExpected.setPaidAmount(paidAmount);
commissionExpected.setPaidRatio(paidRatio);
commissionExpected.setPendingRatio(
BigDecimal.ONE
.subtract(paidRatio.divide(commissionExpected.getCommissionRatio(), 4, RoundingMode.HALF_UP))
.multiply(BigDecimal.valueOf(100))
);
// endregion 计算预计来佣属性
......@@ -228,6 +234,7 @@ public class CommissionAsyncService {
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.COMPARED.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount)
.set(CommissionExpected::getPaidRatio, paidRatio)
.set(CommissionExpected::getPendingRatio, commissionExpected.getPendingRatio())
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 更新已比对来佣记录
......@@ -248,6 +255,7 @@ public class CommissionAsyncService {
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount)
.set(CommissionExpected::getPaidRatio, paidRatio)
.set(CommissionExpected::getPendingRatio, commissionExpected.getPendingRatio())
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 更新已比对来佣记录
......@@ -378,6 +386,11 @@ public class CommissionAsyncService {
// 更新预计来佣已入账金额、已入账比例
commissionExpected.setPaidAmount(paidAmount);
commissionExpected.setPaidRatio(paidRatio);
commissionExpected.setPendingRatio(
BigDecimal.ONE
.subtract(paidRatio.divide(commissionExpected.getCommissionRatio(), 4, RoundingMode.HALF_UP))
.multiply(BigDecimal.valueOf(100))
);
// endregion 计算预计来佣属性
......@@ -397,6 +410,7 @@ public class CommissionAsyncService {
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.COMPARED.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount.setScale(4, RoundingMode.HALF_UP))
.set(CommissionExpected::getPaidRatio, paidRatio)
.set(CommissionExpected::getPendingRatio, commissionExpected.getPendingRatio())
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 更新已比对来佣记录
......@@ -416,6 +430,7 @@ public class CommissionAsyncService {
.set(CommissionExpected::getStatus, CommissionExpectedStatusEnum.PARTIAL.getItemValue())
.set(CommissionExpected::getPaidAmount, paidAmount)
.set(CommissionExpected::getPaidRatio, paidRatio)
.set(CommissionExpected::getPendingRatio, commissionExpected.getPendingRatio())
.eq(CommissionExpected::getId, commissionExpected.getId())
.update();
// 保存比对记录
......
......@@ -247,8 +247,9 @@ public class PolicyReportPdfService {
// 第五行:年繳金額 | 金額值 | 保費徵費 | 費用值
addTableHeaderCellNoBorder(table, "年繳金額");
addTableCellNoBorder(table, formatAmount(data.getAnnualAmount()));
//保单征费
addTableHeaderCellNoBorder(table, "保費徵費");
addTableCellNoBorder(table, formatAmount(data.getPremiumFee()));
addTableCellNoBorder(table, formatAmount(data.getPolicyLevy()));
// 第六行:首期合計金額 | 金額值 | (空) | (空)
addTableHeaderCellNoBorder(table, "首期合計金額");
......
......@@ -51,7 +51,9 @@ public class CsfMybatisPlusConfig {
if (authUserDto != null) {
//自动注入创建人和创建用户名
this.strictInsertFill(metaObject, "creatorId", String.class, authUserDto.getUserBizId());
this.strictInsertFill(metaObject, "creatorName", String.class, authUserDto.getUsername());
this.strictInsertFill(metaObject, "creatorName", String.class, authUserDto.getRealName());
this.strictUpdateFill(metaObject, "updaterId", String.class, authUserDto.getUserBizId());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getRealName());
}
}
......@@ -68,7 +70,7 @@ public class CsfMybatisPlusConfig {
if (authUserDto != null) {
//自动注入更新人和更新用户名
this.strictUpdateFill(metaObject, "updaterId", String.class, authUserDto.getUserBizId());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getUsername());
this.strictUpdateFill(metaObject, "updaterName", String.class, authUserDto.getRealName());
}
}
};
......
package com.yd.csf.service.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;
@Configuration
public class RestTemplateConfig {
@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
\ No newline at end of file
//package com.yd.csf.service.config;
//
//import com.xxl.job.core.executor.impl.XxlJobSpringExecutor;
//import lombok.extern.slf4j.Slf4j;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Value;
//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
//import org.springframework.context.annotation.Bean;
//import org.springframework.context.annotation.Configuration;
//
//@Slf4j
//@Configuration
//@ConditionalOnClass(XxlJobSpringExecutor.class)
//public class XxlJobConfig {
//
// @Value("${xxl.job.admin.addresses:http://139.224.145.34:8686/xxl-job-admin}")
// private String adminAddresses;
//
// @Value("${xxl.job.executor.appname:csf-executor}")
// private String appname;
//
// @Value("${xxl.job.executor.port:9999}")
// private int port;
//
// @Value("${xxl.job.accessToken:default_token}")
// private String accessToken;
//
// @Bean
// public XxlJobSpringExecutor xxlJobExecutor() {
// log.info(">>>>>>>>>>> xxl-job config init. appname: {}, port: {}, accessToken: {}",
// appname, port, StringUtils.isNotBlank(accessToken) ? "已配置" : "未配置");
//
// XxlJobSpringExecutor xxlJobSpringExecutor = new XxlJobSpringExecutor();
// xxlJobSpringExecutor.setAdminAddresses(adminAddresses);
// xxlJobSpringExecutor.setAppname(appname);
// xxlJobSpringExecutor.setPort(port);
// // 设置accessToken
// xxlJobSpringExecutor.setAccessToken(accessToken);
// xxlJobSpringExecutor.setLogRetentionDays(30);
//
// return xxlJobSpringExecutor;
// }
//}
\ No newline at end of file
package com.yd.csf.service.dao;
import com.yd.csf.service.model.AgentAccumulatedFycLog;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 业务员累计积分表操作日志记录表(每次主表(累计积分表)的操作变化记录) Mapper 接口
* </p>
*
* @author zxm
* @since 2026-04-17
*/
public interface AgentAccumulatedFycLogMapper extends BaseMapper<AgentAccumulatedFycLog> {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.CalmTask;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 保单冷静期定时任务表 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-04-08
*/
public interface CalmTaskMapper extends BaseMapper<CalmTask> {
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.EvaluateRank;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 评定职级表 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-04-20
*/
public interface EvaluateRankMapper extends BaseMapper<EvaluateRank> {
}
package com.yd.csf.service.dao;
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;
......@@ -44,4 +45,27 @@ public interface ExpectedFortuneMapper extends BaseMapper<ExpectedFortune> {
* @param status 出账状态
*/
void updateBatchByBizId(@Param("expectedFortuneBizIdList") List<String> expectedFortuneBizIdList, @Param("status") String status);
/**
* 查询预计发佣和实际发佣的分页列表(手动分页)
* @param pageNo 页码(从 1 开始)
* @param pageSize 每页大小
* @param queryWrapper 查询条件
* @return 列表数据
*/
List<ApiExpectedFortunePageResponse> queryListNew(@Param("pageNo") Integer pageNo, @Param("pageSize") Integer pageSize, @Param("ew") QueryWrapper<ExpectedFortune> queryWrapper);
/**
* 查询预计发佣和实际发佣的总记录数
* @param queryWrapper 查询条件
* @return 总记录数
*/
Long queryListNewCount(@Param("ew") QueryWrapper<ExpectedFortune> queryWrapper);
/**
* 查询预计发佣和实际发佣的统计数据(使用 SQL 聚合)
* @param queryWrapper 查询条件
* @return 统计信息
*/
ExpectedFortuneStatisticsVO queryListStatistics(@Param("ew") QueryWrapper<ExpectedFortune> queryWrapper);
}
......@@ -16,6 +16,8 @@ import java.util.List;
public interface FortuneMapper extends BaseMapper<Fortune> {
List<FortuneStatisticsVO> getFortuneStatistics(@Param("fortuneIdList") List<Long> fortuneIdList);
void removeByIdsPhysical(@Param("fortuneIdList") List<Long> fortuneIdList);
}
......
......@@ -5,6 +5,8 @@ import com.yd.csf.service.dto.PolicyReportData;
import com.yd.csf.service.model.PolicyFollow;
import org.apache.ibatis.annotations.Param;
import java.util.List;
/**
* @author Zhang Jianan
* @description 针对表【policy_follow(新单跟进表)】的数据库操作Mapper
......@@ -14,6 +16,15 @@ import org.apache.ibatis.annotations.Param;
public interface PolicyFollowMapper extends BaseMapper<PolicyFollow> {
PolicyReportData queryPolicyReportData(@Param("policyBizId") String policyBizId);
List<String> queryPolicyNoList(
@Param("policyHolderSc") String policyHolderSc,
@Param("policyHolderEnLc") String policyHolderEnLc,
@Param("signerSc") String signerSc,
@Param("brokerName") String brokerName,
@Param("insuredSc") String insuredSc,
@Param("insuredEnLc") String insuredEnLc
);
}
......
package com.yd.csf.service.dao;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.feign.request.salary.ApiSalaryPageRequest;
import com.yd.csf.feign.request.salary.ApiSalaryPushPageRequest;
import com.yd.csf.feign.response.salary.ApiSalaryPageResponse;
import com.yd.csf.feign.response.salary.ApiSalaryPushPageResponse;
import com.yd.csf.service.model.Salary;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
/**
* <p>
* 薪资单表 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-05-08
*/
public interface SalaryMapper extends BaseMapper<Salary> {
IPage<ApiSalaryPageResponse> page(@Param("page") Page<ApiSalaryPageResponse> page,
@Param("request") ApiSalaryPageRequest request);
IPage<ApiSalaryPushPageResponse> pushPage(@Param("page") Page<ApiSalaryPushPageResponse> page,
@Param("request") ApiSalaryPushPageRequest request);
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.SalaryRemittance;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 薪资汇款明细表 Mapper 接口
* </p>
*
* @author zxm
* @since 2026-05-08
*/
public interface SalaryRemittanceMapper extends BaseMapper<SalaryRemittance> {
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Data
public class BatchEditActualPayoutDateRequest {
@Schema(description = "出账业务ID列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> fortuneBizIdList;
@Schema(description = "实际出账年月(实)", requiredMode = Schema.RequiredMode.REQUIRED)
private String actualPayoutDate;
}
......@@ -81,11 +81,10 @@ public class CommissionAddRequest implements Serializable {
private BigDecimal exchangeRate;
/**
* 入账(实)
* 入账年月(实)
*/
@Schema(description = "入账日(实)", requiredMode = Schema.RequiredMode.REQUIRED, format = "yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDate;
@Schema(description = "入账年月(实)", requiredMode = Schema.RequiredMode.REQUIRED, format = "yyyy-MM")
private String commissionDate;
/**
* 备注
......@@ -93,5 +92,10 @@ public class CommissionAddRequest implements Serializable {
@Schema(description = "备注")
private String remark;
/**
* 人工备注
*/
private String manualRemark;
private static final long serialVersionUID = 1L;
}
......@@ -94,18 +94,24 @@ public class CommissionExpectedAddDto {
private BigDecimal amount;
/**
* 入账日 (估)
* 结算汇率
*/
@Schema(description = "入账日 (估) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date commissionDate;
@Schema(description = "结算汇率")
private BigDecimal exchangeRate;
/**
* 入账日 ()
* 入账日 ()
*/
@Schema(description = "入账日 (实) format:yyyy-MM-dd")
@JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
private Date actualCommissionDate;
@Schema(description = "入账日 (估) format:yyyy-MM")
@JsonFormat(pattern = "yyyy-MM", timezone = "GMT+8")
private Date commissionDate;
// /**
// * 入账日 (实)
// */
// @Schema(description = "入账日 (实) format:yyyy-MM-dd")
// @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
// private Date actualCommissionDate;
/**
* 入账状态 0=待入账 1=完成入账 2=部分入账 3=已失效
......@@ -114,8 +120,8 @@ public class CommissionExpectedAddDto {
private String status;
/**
* 备注
* 人工备注
*/
@Schema(description = "备注")
private String remark;
@Schema(description = "人工备注")
private String manualRemark;
}
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