Commit 60a764a9 by zhangxingmin

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

parents fbf2e40f 63e7a263
......@@ -355,7 +355,7 @@ public class ApiCommissionExpectedController {
page.getRecords().forEach(vo -> {
if (StringUtils.isNotBlank(vo.getReconciliationCompanyBizId())) {
String name = nameMap.get(vo.getReconciliationCompanyBizId());
if (StringUtils.isNotBlank(name) && !"CSF".equals(name)) {
if (StringUtils.isNotBlank(name)) {
vo.setReconciliationCompany(name);
}
}
......
......@@ -2,6 +2,8 @@ package com.yd.csf.api.controller;
import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.base.feign.client.relobjectcertificate.ApiRelObjectCertificateFeignClient;
import com.yd.base.feign.request.relobjectcertificate.ApiRelObjectCertificateListAddRequest;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
......@@ -15,7 +17,6 @@ import com.yd.csf.service.dto.CustomerQueryRequest;
import com.yd.csf.service.dto.CustomerUpdateRequest;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.ITaxationService;
import com.yd.csf.service.vo.CustomerVO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -45,6 +46,8 @@ public class ApiCustomerController {
private CustomerService customerService;
@Resource
private ApiTaxationService apiTaxationService;
@Resource
private ApiRelObjectCertificateFeignClient apiRelObjectCertificateFeignClient;
/**
* 创建客户
......@@ -55,10 +58,12 @@ public class ApiCustomerController {
*/
@Operation(summary = "创建客户")
@PostMapping("/add")
@Transactional(rollbackFor = Exception.class)
public Result<Map<String, Object>> addCustomer(@RequestBody CustomerAddRequest customerAddRequest, HttpServletRequest request) {
if (customerAddRequest == null) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), ResultCode.PARAMS_ERROR.getMessage());
}
if (ObjectUtils.isEmpty(customerAddRequest.getFnaBizId())) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "fnaBizId不能为空");
}
Map<String, Object> resultMap = customerService.addCustomer(customerAddRequest);
......@@ -80,6 +85,17 @@ public class ApiCustomerController {
.apiTaxationDtoList(apiTaxationDtoList)
.build());
}
// 添加客户证件列表信息
if (CollUtil.isNotEmpty(customerAddRequest.getApiCertificateDtoList())) {
apiRelObjectCertificateFeignClient.addRelObjectCertificateList(ApiRelObjectCertificateListAddRequest.builder()
.objectBizId(customerBizId)
.objectName(CommonEnum.UID_TYPE_CUSTOMER.getName())
.objectTableName(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.objectType(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.apiCertificateDtoList(customerAddRequest.getApiCertificateDtoList())
.build());
}
return Result.success(resultMap);
}
......@@ -118,11 +134,13 @@ public class ApiCustomerController {
*/
@PostMapping("/update")
@Operation(summary = "更新客户信息")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> updateCustomer(@RequestBody CustomerUpdateRequest customerUpdateRequest) {
String customerBizId = customerUpdateRequest.getCustomerBizId();
if (ObjectUtils.isEmpty(customerBizId)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "customerBizId不能为空");
}
if (ObjectUtils.isEmpty(customerUpdateRequest.getFnaBizId())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "fnaBizId不能为空");
}
boolean result = customerService.updateCustomer(customerUpdateRequest);
......@@ -144,6 +162,17 @@ public class ApiCustomerController {
.build());
}
// 添加客户证件列表信息
if (CollUtil.isNotEmpty(customerUpdateRequest.getApiCertificateDtoList())) {
apiRelObjectCertificateFeignClient.addRelObjectCertificateList(ApiRelObjectCertificateListAddRequest.builder()
.objectBizId(customerBizId)
.objectName(CommonEnum.UID_TYPE_CUSTOMER.getName())
.objectTableName(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.objectType(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.apiCertificateDtoList(customerUpdateRequest.getApiCertificateDtoList())
.build());
}
return Result.success(result);
}
......
package com.yd.csf.api.controller;
import com.yd.common.enums.ResultCode;
import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiTaxationService;
import com.yd.csf.service.model.FnaCustomer;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaCustomerService;
import com.yd.csf.service.vo.CustomerVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
/**
* fna_customer接口
*
* @author jianan
* @since 2025-07-31
*/
@RestController
@RequestMapping("/fna_customer")
@Tag(name = "fna_customer接口")
public class ApiFnaCustomerController {
@Resource
private FnaCustomerService fnaCustomerService;
@Resource
private CustomerService customerService;
@Resource
private ApiTaxationService apiTaxationService;
/**
* 删除fna
*
* @param deleteRequest
* @param request
* @return
*/
// @PostMapping("/delete")
// public Result<Boolean> deleteFna(@RequestBody DeleteRequest deleteRequest, HttpServletRequest request) {
// if (deleteRequest == null || deleteRequest.getId() <= 0) {
// throw new BusinessException(ErrorCode.PARAMS_ERROR);
// }
// User user = userService.getLoginUser(request);
// long id = deleteRequest.getId();
// // 判断是否存在
// Customer oldFna = customerService.getById(id);
// ThrowUtils.throwIf(oldFna == null, ErrorCode.NOT_FOUND_ERROR);
// // 仅本人或管理员可删除
// if (!oldFna.getUserId().equals(user.getId()) && !userService.isAdmin(request)) {
// throw new BusinessException(ErrorCode.NO_AUTH_ERROR);
// }
// // 操作数据库
// boolean result = customerService.removeById(id);
// ThrowUtils.throwIf(!result, ErrorCode.OPERATION_ERROR);
// return Result.success(true);
// }
/**
* 根据 fnaBizId 获取客户(封装类)
*
* @param fnaBizId
* @return
*/
@GetMapping("/get/vo")
@Operation(summary = "根据 fnaBizId 获取客户详情")
public Result<CustomerVO> getCustomerVOByCustomerBizId(@RequestParam("fnaBizId") String fnaBizId, HttpServletRequest request) {
if (fnaBizId == null) {
return Result.fail(ResultCode.PARAMS_ERROR.getCode(), "fnaBizId 不能为空");
}
// 查询数据库
FnaCustomer fnaCustomer = fnaCustomerService.lambdaQuery()
.eq(FnaCustomer::getFnaBizId, fnaBizId)
.one();
if (fnaCustomer == null) {
return Result.fail(ResultCode.NULL_ERROR.getCode(), ResultCode.NULL_ERROR.getMessage());
}
// 获取客户封装类
return Result.success(fnaCustomerService.getCustomerVO(fnaCustomer));
}
/**
* 分页获取客户列表(仅管理员可用)
*
* @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 = customerService.page(new Page<>(current, size),
// customerService.getQueryWrapper(fnaQueryRequest));
// return Result.success(fnaPage);
// }
}
package com.yd.csf.api.controller;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.CommonEnum;
......
......@@ -21,6 +21,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -148,6 +149,7 @@ public class ApiAdditionalServiceImpl implements ApiAdditionalService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result batchAddAdditionalData(ApiProductPlanInfoDto productPlanInfoDto, String planBizId) {
if (Objects.isNull(productPlanInfoDto)
|| ( !Objects.isNull(productPlanInfoDto)
......
......@@ -11,6 +11,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
......@@ -31,6 +32,7 @@ public class ApiAppointmentReferrerServiceImpl implements ApiAppointmentReferrer
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result saveAppointmentReferrerList(List<ApiAppointmentReferrerDto> referrerDtoList,
String appointmentBizId) {
if (CollectionUtils.isEmpty(referrerDtoList)) {
......
......@@ -719,6 +719,12 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
follow.setInsuranceCompany(apiProductPlanMainInfoDto.getCompanyName());
// 保险公司业务ID(从产品计划获取的公司ID)
follow.setInsuranceCompanyBizId(apiProductPlanMainInfoDto.getCompanyId());
// 对账公司
follow.setReconciliationCompany(apiProductPlanMainInfoDto.getReconciliationCompanyName());
// 对账公司业务ID(从产品计划获取的对账公司ID)
follow.setReconciliationCompanyBizId(apiProductPlanMainInfoDto.getReconciliationCompanyId());
follow.setReconciliationCompanyCode(apiProductPlanMainInfoDto.getReconciliationCompanyCode());
// 币种
follow.setPolicyCurrency(apiProductPlanMainInfoDto.getPolicyCurrency());
// 供款年期
......@@ -727,7 +733,7 @@ public class ApiAppointmentServiceImpl implements ApiAppointmentService {
}
// 保障期限
if (StringUtils.isNotBlank(apiProductPlanMainInfoDto.getGuaranteePeriod())) {
follow.setGuaranteePeriod(Integer.parseInt(apiProductPlanMainInfoDto.getGuaranteePeriod()));
follow.setGuaranteePeriod(apiProductPlanMainInfoDto.getGuaranteePeriod());
}
// 保额(重疾险)
follow.setSumInsured(apiProductPlanMainInfoDto.getSumInsured());
......
......@@ -13,6 +13,7 @@ import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
......@@ -33,6 +34,7 @@ public class ApiAppointmentUserSignServiceImpl implements ApiAppointmentUserSign
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result saveAppointmentUserSignList(List<ApiAppointmentUserSignDto> userSignDtoList, String appointmentBizId) {
if (CollectionUtils.isEmpty(userSignDtoList)) {
return Result.success();
......
......@@ -20,6 +20,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.List;
......@@ -145,6 +146,7 @@ public class ApiBeneficiaryServiceImpl implements ApiBeneficiaryService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result batchAddBeneficiaryData(List<ApiBeneficiaryInfoDto> apiBeneficiaryInfoDtoList,
String appointmentBizId) {
if (CollectionUtils.isEmpty(apiBeneficiaryInfoDtoList)){
......
......@@ -28,6 +28,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
......@@ -123,6 +124,7 @@ public class ApiInsurantServiceImpl implements ApiInsurantService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result<Insurant> addInsurantData(ApiInsurantInfoDto dto, String appointmentBizId) {
if (Objects.isNull(dto)){
//为空设置,方便新建暂存公用方法
......
......@@ -23,6 +23,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
......@@ -115,6 +116,7 @@ public class ApiPolicyholderServiceImpl implements ApiPolicyholderService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result<Policyholder> addPolicyholderData(ApiPolicyholderInfoDto dto, String appointmentBizId) {
if (Objects.isNull(dto)){
//为空设置,方便新建暂存公用方法
......
package com.yd.csf.api.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.TypeReference;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.base.feign.client.bank.ApiBankFeignClient;
......@@ -42,7 +44,11 @@ import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.IPremiumReconciliationService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
import com.yd.csf.service.vo.ReceivableReportVO;
import com.yd.feign.config.FeignTokenInterceptor;
import com.yd.insurance.base.feign.client.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyFeignClient;
import com.yd.insurance.base.feign.request.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageRequest;
import com.yd.insurance.base.feign.response.insurancereconciliationcompany.ApiInsuranceReconciliationCompanyPageResponse;
import com.yd.product.feign.response.expectedspecies.ApiExpectedSpeciesListResponse;
import com.yd.user.feign.client.sysdict.ApiSysDictFeignClient;
import com.yd.user.feign.request.sysdict.GetDictTypeListRequest;
......@@ -102,6 +108,9 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
@Resource
private ApiExpectedFortuneService apiExpectedFortuneService;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient companyFeignClient;
@Autowired
private ApplicationContext applicationContext;
......@@ -503,9 +512,87 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
log.info("共更新了 {} 条记录的付款金额", updatedCount);
}
//转换对账公司名称
enrichReceivableReportWithCompanyName(iPage);
return Result.success(iPage);
}
private void enrichReceivableReportWithCompanyName(IPage<ApiPremiumReconciliationPageResponse> page) {
if (page == null || org.apache.commons.collections4.CollectionUtils.isEmpty(page.getRecords())) {
return;
}
// 收集所有非空的对账公司 bizId(去重)
List<String> bizIdList = page.getRecords().stream()
.map(ApiPremiumReconciliationPageResponse::getReconciliationCompanyBizId)
.filter(StringUtils::isNotBlank)
.distinct()
.collect(Collectors.toList());
if (bizIdList.isEmpty()) {
return;
}
// 调用 Feign 批量查询对账公司信息
ApiInsuranceReconciliationCompanyPageRequest request = new ApiInsuranceReconciliationCompanyPageRequest();
request.setReconciliationCompanyBizIdList(bizIdList);
request.setPageNo(1);
request.setPageSize(bizIdList.size());
Result result = companyFeignClient.page(request);
List<ApiInsuranceReconciliationCompanyPageResponse> companyList = extractCompanyListFromResult(result);
if (companyList.isEmpty()) {
return;
}
// 构建 bizId -> name 映射
Map<String, String> nameMap = companyList.stream()
.filter(c -> StringUtils.isNotBlank(c.getReconciliationCompanyBizId()))
.collect(Collectors.toMap(
ApiInsuranceReconciliationCompanyPageResponse::getReconciliationCompanyBizId,
ApiInsuranceReconciliationCompanyPageResponse::getName,
(v1, v2) -> v1 // 重复时保留第一个
));
// 回填名称
page.getRecords().forEach(vo -> {
if (StringUtils.isNotBlank(vo.getReconciliationCompanyBizId())) {
String name = nameMap.get(vo.getReconciliationCompanyBizId());
if (StringUtils.isNotBlank(name)) {
vo.setReconciliationCompany(name);
}
}
});
}
private List<ApiInsuranceReconciliationCompanyPageResponse> extractCompanyListFromResult(Result result) {
if (result == null || result.getCode() != 200 || result.getData() == null) {
return Collections.emptyList();
}
Object data = result.getData();
try {
// 将 data 转为 JSON 字符串再解析为 Map,以便提取 records
Map<String, Object> dataMap = JSON.parseObject(JSON.toJSONString(data), new TypeReference<Map<String, Object>>() {});
Object recordsObj = dataMap.get("records");
if (recordsObj instanceof List) {
List<?> recordsList = (List<?>) recordsObj;
List<ApiInsuranceReconciliationCompanyPageResponse> companyList = new ArrayList<>();
for (Object item : recordsList) {
// 将每个元素转换为目标类型
ApiInsuranceReconciliationCompanyPageResponse company = JSON.parseObject(
JSON.toJSONString(item),
ApiInsuranceReconciliationCompanyPageResponse.class
);
companyList.add(company);
}
return companyList;
}
} catch (Exception e) {
log.error("解析公司列表失败", e);
}
return Collections.emptyList();
}
// 辅助类
private static class ConvertInfo {
String reconciliationBizId;
......@@ -1118,6 +1205,10 @@ public class ApiPremiumReconciliationServiceImpl implements ApiPremiumReconcilia
statusRequest.setUnderwritingDate(request.getUnderwritingDate());
statusRequest.setPolicyBizId(policyFollow.getPolicyBizId());
statusRequest.setStatus("TAKE_EFFECT");
//保单截止日期
statusRequest.setPolicyExpirationDate(request.getPolicyExpirationDate());
//冷静期结束日期
statusRequest.setCoolingOffEndDate(request.getCoolingOffEndDate());
//遍历保单转介人列表信息 -> 调用基本法算出预计发佣列表
// 通过代理对象调用
// getSelf().execute(statusRequest,token);
......
......@@ -18,6 +18,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.Objects;
......@@ -115,6 +116,7 @@ public class ApiProductPlanServiceImpl implements ApiProductPlanService {
* @param appointmentBizId
* @return
*/
@Transactional(rollbackFor = Exception.class)
public Result<ProductPlan> addProductPlanData(ApiProductPlanInfoDto productPlanInfoDto,String appointmentBizId) {
if (Objects.isNull(productPlanInfoDto)) {
//为空设置,方便新建暂存公用方法
......
......@@ -15,6 +15,8 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Objects;
/**
......@@ -71,6 +73,7 @@ public class ApiSecondHolderServiceImpl implements ApiSecondHolderService {
* @return
*/
@Override
@Transactional(rollbackFor = Exception.class)
public Result<SecondHolder> addSecondHolderData(ApiSecondHolderInfoDto dto, String appointmentBizId) {
if (Objects.isNull(dto)){
//为空设置,方便新建暂存公用方法
......
......@@ -38,6 +38,11 @@ public class ApiProductPlanMainInfoDto {
private String reconciliationCompanyName;
/**
* 出单经纪公司(对账公司)编码
*/
private String reconciliationCompanyCode;
/**
* 保险险种ID(产品上架信息绑定的保险险种参数)
*/
private String insuranceTypeId;
......
......@@ -60,4 +60,16 @@ public class ApiPremiumReconciliationResultEditRequest {
*/
private String status;
/**
* 冷静期结束日期
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date coolingOffEndDate;
/**
* 保单截止日期
*/
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date policyExpirationDate;
}
......@@ -229,4 +229,9 @@ public class ApiExpectedFortunePageResponse {
@Schema(description = "更新时间")
private LocalDateTime updateTime;
/**
* 发佣率(对应职级)
*/
@Schema(description = "发佣率(对应职级)")
private String commissionRatio;
}
......@@ -110,7 +110,12 @@ public class ApiPremiumReconciliationPageResponse {
private LocalDateTime updateTime;
/**
* 对账公司(保单表)
* 对账公司ID(保单跟进表)
*/
private String reconciliationCompanyBizId;
/**
* 对账公司名称
*/
private String reconciliationCompany;
......
......@@ -7,6 +7,8 @@ import com.yd.csf.feign.response.conditionconfig.ApiConditionConfigPageResponse;
import com.yd.csf.service.model.ConditionConfig;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -20,4 +22,11 @@ public interface ConditionConfigMapper extends BaseMapper<ConditionConfig> {
IPage<ApiConditionConfigPageResponse> page(@Param("page") Page<ApiConditionConfigPageResponse> page,
@Param("request") ApiConditionConfigPageRequest request);
/**
* 根据业务员ID列表查询每个业务员对应的基础销售积分比例
* @param brokerBizIds 业务员ID列表
* @return 包含 brokerBizId 和 conditional_value 的 Map 列表
*/
List<Map<String, Object>> selectBrokerRatioByBizIds(@Param("list") List<String> brokerBizIds);
}
package com.yd.csf.service.dao;
import com.yd.csf.service.model.FnaCustomer;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【fna_customer(客户信息表)】的数据库操作Mapper
* @createDate 2026-03-09 10:45:37
* @Entity com.yd.csf.service.model.FnaCustomer
*/
public interface FnaCustomerMapper extends BaseMapper<FnaCustomer> {
}
package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import java.util.List;
......@@ -38,4 +40,14 @@ public class ChangePolicyFollowStatusRequest {
*/
@Schema(description = "跟进信息")
private String message;
/**
* 冷静期结束日期
*/
private Date coolingOffEndDate;
/**
* 保单截止日期
*/
private Date policyExpirationDate;
}
......@@ -16,6 +16,12 @@ import java.util.List;
@Data
public class CustomerAddRequest implements Serializable {
/**
* fna业务id
*/
@Schema(description = "fna业务id")
private String fnaBizId;
/**
* 姓名-中文
*/
@Schema(description = "姓名-中文")
......
......@@ -15,6 +15,13 @@ import java.util.List;
*/
@Data
public class CustomerUpdateRequest implements Serializable {
/**
* fna业务id
*/
@Schema(description = "fna业务id", requiredMode = Schema.RequiredMode.REQUIRED)
private String fnaBizId;
/**
* 客户主表业务唯一id
*/
......
......@@ -84,8 +84,14 @@ public class FortuneUpdateRequest implements Serializable {
/**
* 本期出账金额
*/
@Schema(description = "本期出账金额")
private BigDecimal currentPaymentAmount;
// @Schema(description = "本期出账金额")
// private BigDecimal currentPaymentAmount;
/**
* 本期出账港币金额
*/
@Schema(description = "本期出账港币金额")
private BigDecimal currentPaymentHkdAmount;
/**
* 出账币种
......
......@@ -137,6 +137,12 @@ public class ExpectedFortune implements Serializable {
private String brokerRatio;
/**
* 转介人职级比例
*/
@TableField("broker_level_ratio")
private BigDecimal brokerLevelRatio;
/**
* 标准发佣金额
*/
@TableField("standard_amount")
......
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.util.Date;
import lombok.Data;
/**
* 客户信息表
*
* @TableName fna_customer
*/
@TableName(value = "fna_customer")
@Data
public class FnaCustomer implements Serializable {
/**
* id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* fna客户唯一业务ID
*/
private String fnaCustomerBizId;
/**
* customer唯一业务ID
*/
private String customerBizId;
/**
* fna唯一业务ID
*/
private String fnaBizId;
/**
* 姓名-中文
*/
private String nameCn;
/**
* 姓名-(拼音/英文,通过中文自动加载全部大写的拼音)
*/
private String namePyEn;
/**
* 证件类型(字典,下拉选择)
*/
private String documentType;
/**
* 证件号码
*/
private String idNumber;
/**
* 性别(字典,如果是身份证,自动获取性别和生日)
*/
private String gender;
/**
* 出生日期(生日,如果是身份证,自动获取性别和生日)
*/
private Date birthday;
/**
* 年龄(通过生日自动获取年龄)
*/
private String age;
/**
* 国籍(下拉选择)
*/
private String nationality;
/**
* 出生地
*/
private String birthplace;
/**
* 是否拥有其他国家公民身份(如美国、日本等): 0-否, 1-是(字典)
*/
private String isOtherCountry;
/**
* 税务国家
*/
private Object taxList;
/**
* 吸烟情况(字典)
*/
private String smokingStatus;
/**
* 婚姻情况(字典)
*/
private String maritalStatus;
/**
* 教育程度(字典)
*/
private String educationLevel;
/**
* 是否退休(字典)
*/
private String isRetirement;
/**
* 退休年龄(如已退休,再显示)
*/
private String retirementAge;
/**
* 身高(CM)
*/
private String height;
/**
* 体重(KG)
*/
private String weight;
/**
* BMI指数(根据身高和体重自动计算)
*/
private String bmi;
/**
* 风险偏好(字典,下拉选择)
*/
private String riskAppetite;
/**
* 受供养人数目(通过FNA带入)
*/
private Integer dependentsNum;
/**
* 移动电话区号
*/
private String mobileCode;
/**
* 移动电话
*/
private String mobile;
/**
* 住宅电话区号
*/
private String residenceMobileCode;
/**
* 住宅电话
*/
private String residenceMobile;
/**
* 固定电话区号
*/
private String landlineCode;
/**
* 固定电话
*/
private String landline;
/**
* 邮箱
*/
private String email;
/**
* 证件地址
*/
private String certificateAddress;
/**
* 通讯地址
*/
private String mailingAddress;
/**
* 居住地址(住宅地址)
*/
private String residentialAddress;
/**
* 通讯地址邮政编号
*/
private String mailingAddressCode;
/**
* 就业情况(字典,下拉选择)
*/
private String employmentStatus;
/**
* 公司/学校名称
*/
private String csName;
/**
* 行业
*/
private String industry;
/**
* 现时每月收入(HKD)
*/
private BigDecimal currentMonthlyIncome;
/**
* 总工作年期
*/
private BigDecimal totalWorkingYears;
/**
* 受雇于现职年期
*/
private BigDecimal currentTenure;
/**
* 职位
*/
private String position;
/**
* 公司地址
*/
private String companyAddress;
/**
* 公司电话区号
*/
private String companyMobileCode;
/**
* 公司电话
*/
private String companyMobile;
/**
* 公司地址邮政编号
*/
private String companyAddressCode;
/**
* 平均每月收入(HKD)
*/
private BigDecimal monthIncome;
/**
* 平均每月支出(HKD)
*/
private BigDecimal monthExpenditure;
/**
* 总流动资产(HKD)
*/
private BigDecimal totalCurrentAssets;
/**
* 总负债额(HKD)
*/
private BigDecimal totalDebt;
/**
* 旅行(字典)
*/
private String travel;
/**
* 运动(字典,下拉选择)
*/
private String exercise;
/**
* 游戏(字典,下拉选择)
*/
private String game;
/**
* 电影/戏剧(字典,下拉选择)
*/
private String movieDrama;
/**
* 美食(输入)
*/
private String delicacy;
/**
* 地址列表(json串)
*/
private String addressList;
/**
*
*/
private Object certificateList;
/**
* 通用备注
*/
private String remark;
/**
* 删除标识: 0-正常, 1-删除
*/
private Integer isDeleted;
/**
* 创建人ID
*/
private String creatorId;
/**
* 更新人ID
*/
private String updaterId;
/**
* 创建时间
*/
private Date createTime;
/**
* 更新时间
*/
private Date updateTime;
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -49,6 +49,11 @@ public class FortuneAccount implements Serializable {
private BigDecimal amount;
/**
* 港币出账金额
*/
private BigDecimal hkdAmount;
/**
* 出账状态 可出账、待出账、已出账
*/
private String status;
......
......@@ -10,9 +10,12 @@ import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 保单表
*
......
......@@ -7,10 +7,14 @@ import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.Date;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import javax.validation.constraints.NotBlank;
/**
* 新单跟进表
*
......@@ -143,7 +147,7 @@ public class PolicyFollow implements Serializable {
/**
* 保障期限
*/
private Integer guaranteePeriod;
private String guaranteePeriod;
/**
* 保额(重疾险)
......@@ -422,4 +426,5 @@ public class PolicyFollow implements Serializable {
@TableField(exist = false)
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
......@@ -69,6 +69,12 @@ public class ProductPlan implements Serializable {
private String reconciliationCompanyName;
/**
* 出单经纪公司(对账公司)编码 TODO
*/
@TableField("reconciliation_company_code")
private String reconciliationCompanyCode;
/**
* 保险险种ID(产品上架信息绑定的保险险种参数)
*/
@TableField("insurance_type_id")
......
package com.yd.csf.service.service;
import com.yd.csf.service.model.FnaCustomer;
import com.baomidou.mybatisplus.extension.service.IService;
import com.yd.csf.service.vo.CustomerVO;
/**
* @author Zhang Jianan
* @description 针对表【fna_customer(客户信息表)】的数据库操作Service
* @createDate 2026-03-09 10:45:37
*/
public interface FnaCustomerService extends IService<FnaCustomer> {
void validCustomer(FnaCustomer fnaCustomer);
int queryDependentsNum(String fnaBizId);
CustomerVO getCustomerVO(FnaCustomer fnaCustomer);
}
......@@ -9,6 +9,7 @@ import com.yd.csf.service.model.ConditionConfig;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -23,6 +24,8 @@ public interface IConditionConfigService extends IService<ConditionConfig> {
IPage<ApiConditionConfigPageResponse> page(Page<ApiConditionConfigPageResponse> page,
ApiConditionConfigPageRequest request);
List<Map<String, Object>> selectBrokerRatioByBizIds(List<String> brokerBizIds);
ConditionConfig queryOne(String conditionBizId);
List<ConditionConfig> queryList(ConditionConfigDto dto);
......
......@@ -63,6 +63,8 @@ public interface PolicyFollowService extends IService<PolicyFollow> {
PolicyFollow queryOneByPolicyNo(String policyNo);
PolicyFollow queryOneByPolicyBizId(String policyBizId);
/**
* 保存首期缴费信息
*/
......
......@@ -183,7 +183,7 @@ public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpecte
page.getRecords().forEach(vo -> {
if (StringUtils.isNotBlank(vo.getReconciliationCompanyBizId())) {
String name = nameMap.get(vo.getReconciliationCompanyBizId());
if (StringUtils.isNotBlank(name) && !"CSF".equals(name)) {
if (StringUtils.isNotBlank(name)) {
vo.setReconciliationCompany(name);
}
}
......
......@@ -9,6 +9,7 @@ import cn.hutool.core.collection.CollUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.base.feign.client.exchangerate.ApiExchangeRateFeignClient;
import com.yd.common.enums.CommonEnum;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
......@@ -81,8 +82,8 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
private TransactionTemplate transactionTemplate;
@Resource
private ReceivableService receivableService;
@Autowired
private ApiSysDictFeignClient apiSysDictFeignClient;
@Resource
private ApiExchangeRateFeignClient apiExchangeRateFeignClient;
@Resource
private ApiInsuranceReconciliationCompanyFeignClient apiInsuranceReconciliationCompanyFeignClient;
......@@ -677,11 +678,11 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
fortune.setFortuneBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_FORTUNE.getCode()));
fortune.setId(null);
fortune.setFortuneBizType("R");
fortune.setExchangeRate(queryDefaultExchangeRate(fortune.getCurrency()));
fortune.setExchangeRate(expectedFortune.getDefaultExchangeRate());
fortune.setAmount(expectedFortune.getAmount());
fortune.setHkdAmount(expectedFortune.getAmount().multiply(fortune.getExchangeRate()));
fortune.setHkdAmount(expectedFortune.getHkdAmount());
fortune.setCurrentPaymentAmount(expectedFortune.getAmount());
fortune.setCurrentPaymentHkdAmount(fortune.getCurrentPaymentAmount().multiply(fortune.getExchangeRate()));
fortune.setCurrentPaymentHkdAmount(expectedFortune.getHkdAmount());
fortune.setExpectedFortuneBizId(expectedFortune.getExpectedFortuneBizId());
fortune.setStatus(FortuneStatusEnum.CAN_SEND.getItemValue());
fortune.setIsPart(0);
......@@ -705,22 +706,22 @@ public class CommissionServiceImpl extends ServiceImpl<CommissionMapper, Commiss
.collect(Collectors.toList());
}
private BigDecimal queryDefaultExchangeRate(String currency) {
if (StringUtils.isBlank(currency)) {
/**
* 保单币种对预计来佣的结算币种的默认汇率
* @param policyCurrency 保单币种
* @param currency 预计来佣的结算币种
* @return 汇率
*/
private BigDecimal queryExchangeRateByFeign(String policyCurrency, String currency) {
if (policyCurrency.equalsIgnoreCase(currency)) {
return BigDecimal.ONE;
}
if ("HKD".equalsIgnoreCase(currency)) {
return BigDecimal.valueOf(1);
}
Result<List<GetDictItemListByDictTypeResponse>> result = apiSysDictFeignClient.getDictItemListByDictType("csf_exchange_rate_hkd");
if (CollectionUtils.isNotEmpty(result.getData())) {
for (GetDictItemListByDictTypeResponse dictItem : result.getData()) {
if (StringUtils.equalsIgnoreCase(dictItem.getItemLabel(), currency)) {
return new BigDecimal(dictItem.getItemValue());
}
}
// 调用Feign客户端查询汇率
Result<BigDecimal> result = apiExchangeRateFeignClient.getExchangeRate(policyCurrency, currency, "");
if (result != null && result.getData() != null) {
return result.getData();
}
return BigDecimal.ONE;
return null;
}
/**
......
......@@ -12,10 +12,12 @@ import com.yd.csf.service.model.FormulaConfig;
import com.yd.csf.service.service.IConditionConfigService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Map;
/**
* <p>
......@@ -34,6 +36,11 @@ public class ConditionConfigServiceImpl extends ServiceImpl<ConditionConfigMappe
return baseMapper.page(page,request);
}
@Override
public List<Map<String, Object>> selectBrokerRatioByBizIds(List<String> brokerBizIds){
return baseMapper.selectBrokerRatioByBizIds(brokerBizIds);
}
/**
* 查询单个对象
* @param conditionBizId
......
......@@ -8,8 +8,7 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.yd.base.feign.client.relobjectcertificate.ApiRelObjectCertificateFeignClient;
import com.yd.base.feign.request.relobjectcertificate.ApiRelObjectCertificateListAddRequest;
import com.yd.base.feign.dto.ApiCertificateDto;
import com.yd.common.enums.CommonEnum;
import com.yd.common.exception.BusinessException;
import com.yd.common.utils.RandomStringGenerator;
......@@ -17,17 +16,21 @@ import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dao.CustomerMapper;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.model.FnaCustomer;
import com.yd.csf.service.model.FnaForm;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaCustomerService;
import com.yd.csf.service.service.FnaFormService;
import com.yd.csf.service.service.FnaService;
import com.yd.csf.service.utils.GSONUtil;
import com.yd.csf.service.utils.ValidateUtil;
import com.yd.csf.service.vo.CustomerVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
......@@ -46,15 +49,13 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
@Resource
private CustomerService customerService;
@Resource
private FnaService fnaService;
@Resource
private FnaFormService fnaFormService;
@Resource
private ApiRelObjectCertificateFeignClient apiRelObjectCertificateFeignClient;
private FnaCustomerService fnaCustomerService;
@Override
public CustomerVO getCustomerVO(Customer customer) {
......@@ -97,14 +98,21 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
}
@Override
@Transactional(rollbackFor = Exception.class)
public Map<String, Object> addCustomer(CustomerAddRequest customerAddRequest) {
// 校验 请求 对象中,参数是否全部为空
if (ValidateUtil.isAllFieldsNull(customerAddRequest)) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
// 检查字段 certificate_list,根据证件类型、证件号码查询客户是否存在
Customer customer = queryByCertificate(customerAddRequest.getApiCertificateDtoList());
if (customer == null) {
customer = new Customer();
}
// 客户主表信息
Customer customer = new Customer();
BeanUtils.copyProperties(customerAddRequest, customer, "addressList", "apiCertificateDtoList");
BeanUtils.copyProperties(customerAddRequest, customer, "addressList", "apiTaxationDtoList", "apiCertificateDtoList");
// 地址列表
if (CollUtil.isNotEmpty(customerAddRequest.getAddressList())) {
customer.setAddressList(GSON.toJson(customerAddRequest.getAddressList()));
......@@ -122,20 +130,19 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
// 客户主表业务唯一id
customer.setCustomerBizId(RandomStringGenerator.generateBizId16(CommonEnum.UID_TYPE_CUSTOMER.getCode()));
boolean result = customerService.save(customer);
boolean result = customerService.saveOrUpdate(customer);
if (!result) {
throw new BusinessException(ErrorCode.OPERATION_ERROR.getCode(), ErrorCode.OPERATION_ERROR.getMessage());
}
// 添加客户证件列表信息
if (CollUtil.isNotEmpty(customerAddRequest.getApiCertificateDtoList())) {
apiRelObjectCertificateFeignClient.addRelObjectCertificateList(ApiRelObjectCertificateListAddRequest.builder()
.objectBizId(customer.getCustomerBizId())
.objectName(CommonEnum.UID_TYPE_CUSTOMER.getName())
.objectTableName(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.objectType(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.apiCertificateDtoList(customerAddRequest.getApiCertificateDtoList())
.build());
// 保存 fna_customer
FnaCustomer fnaCustomer = new FnaCustomer();
BeanUtils.copyProperties(customer, fnaCustomer);
fnaCustomer.setFnaBizId(customerAddRequest.getFnaBizId());
fnaCustomer.setFnaCustomerBizId(RandomStringGenerator.generateBizId16("fna_customer"));
result = fnaCustomerService.saveOrUpdate(fnaCustomer);
if (!result) {
throw new BusinessException(ErrorCode.OPERATION_ERROR.getCode(), ErrorCode.OPERATION_ERROR.getMessage());
}
Map<String, Object> map = new HashMap<>();
......@@ -143,6 +150,50 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
return map;
}
private Customer queryByCertificate(List<ApiCertificateDto> certificateList) {
if (CollUtil.isNotEmpty(certificateList)) {
for (ApiCertificateDto certificate : certificateList) {
if (StringUtils.isNotBlank(certificate.getDocumentType()) && StringUtils.isNotBlank(certificate.getIdNumber())) {
// 查询所有有 certificateList 的客户
List<Customer> existingCustomers = customerService.lambdaQuery()
.isNotNull(Customer::getCertificateList)
.ne(Customer::getCertificateList, "")
.list();
if (CollUtil.isNotEmpty(existingCustomers)) {
for (Customer existingCustomer : existingCustomers) {
if (ObjectUtils.isNotEmpty(existingCustomer.getCertificateList())) {
try {
// 解析 JSON 中的证件列表
List<ApiCertificateDto> certList = GSON.fromJson(
(String) existingCustomer.getCertificateList(),
new TypeToken<List<ApiCertificateDto>>() {}.getType()
);
if (CollUtil.isNotEmpty(certList)) {
for (ApiCertificateDto cert : certList) {
String docType = cert.getDocumentType();
String idNum = cert.getIdNumber();
// 比对证件类型和证件号码
if (certificate.getDocumentType().equals(docType)
&& certificate.getIdNumber().equals(idNum)) {
return existingCustomer;
}
}
}
} catch (Exception e) {
// JSON 解析失败,跳过该客户
}
}
}
}
}
}
}
return null;
}
@Override
public void validCustomer(Customer customer) {
if (StringUtils.isBlank(customer.getNamePyEn())) {
......@@ -160,6 +211,7 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateCustomer(CustomerUpdateRequest customerUpdateRequest) {
// 判断是否存在
String customerBizId = customerUpdateRequest.getCustomerBizId();
......@@ -189,15 +241,11 @@ public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer>
fnaService.updateCustomerNameByCustomerBizId(customerUpdateRequest.getNamePyEn(), customerBizId);
}
// 添加客户证件列表信息
if (CollUtil.isNotEmpty(customerUpdateRequest.getApiCertificateDtoList())) {
apiRelObjectCertificateFeignClient.addRelObjectCertificateList(ApiRelObjectCertificateListAddRequest.builder()
.objectBizId(customerBizId)
.objectName(CommonEnum.UID_TYPE_CUSTOMER.getName())
.objectTableName(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.objectType(CommonEnum.UID_TYPE_CUSTOMER.getCode())
.apiCertificateDtoList(customerUpdateRequest.getApiCertificateDtoList())
.build());
// 更新 fna_customer 表
FnaCustomer fnaCustomer = fnaCustomerService.lambdaQuery().eq(FnaCustomer::getFnaBizId, customerBizId).one();
if (fnaCustomer != null) {
BeanUtils.copyProperties(oldCustomer, fnaCustomer, "id", "fna_customer_biz_id", "fnaBizId", "customerBizId");
fnaCustomerService.updateById(fnaCustomer);
}
return true;
......
......@@ -10,6 +10,7 @@ import com.yd.csf.service.model.ExpectedFortune;
import com.yd.csf.service.dao.ExpectedFortuneMapper;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.service.IConditionConfigService;
import com.yd.csf.service.service.IExpectedFortuneService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.service.PolicyFollowService;
......@@ -20,8 +21,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
......@@ -42,6 +42,9 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
@Resource
private PolicyFollowService policyFollowService;
@Resource
private IConditionConfigService iConditionConfigService;
@Override
public IPage<ApiExpectedFortunePageResponse> page(Page<ApiExpectedFortunePageResponse> page,
ApiExpectedFortunePageRequest request) {
......@@ -88,35 +91,65 @@ public class ExpectedFortuneServiceImpl extends ServiceImpl<ExpectedFortuneMappe
@Override
public List<ApiExpectedFortunePageResponse> toVOList(List<ExpectedFortune> expectedFortuneList) {
// 关联保单信息
if (CollUtil.isEmpty(expectedFortuneList)) {
return Collections.emptyList();
}
// 收集所有 brokerBizId
List<String> brokerBizIds = expectedFortuneList.stream()
.map(ExpectedFortune::getBrokerBizId)
.filter(Objects::nonNull)
.distinct()
.collect(Collectors.toList());
Map<String, String> brokerRatioMap = new HashMap<>();
if (CollUtil.isNotEmpty(brokerBizIds)) {
List<Map<String, Object>> ratioList = iConditionConfigService.selectBrokerRatioByBizIds(brokerBizIds);
brokerRatioMap = ratioList.stream()
.filter(map -> map.get("conditional_value") != null)
.collect(Collectors.toMap(
map -> (String) map.get("brokerBizId"),
map -> (String) map.get("conditional_value"),
(v1, v2) -> v1
));
}
List<String> policyNos = expectedFortuneList.stream()
.map(ExpectedFortune::getPolicyNo)
.collect(Collectors.toList());
List<Policy> policyList = policyService.lambdaQuery()
.in(Policy::getPolicyNo, expectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toList()))
.list();
.in(Policy::getPolicyNo, policyNos).list();
List<PolicyFollow> policyFollowList = policyFollowService.lambdaQuery()
.in(PolicyFollow::getPolicyNo, expectedFortuneList.stream().map(ExpectedFortune::getPolicyNo).collect(Collectors.toList()))
.list();
.in(PolicyFollow::getPolicyNo, policyNos).list();
Map<String, Policy> policyMap = policyList.stream()
.collect(Collectors.toMap(Policy::getPolicyNo, Function.identity()));
Map<String, PolicyFollow> policyFollowMap = policyFollowList.stream()
.collect(Collectors.toMap(PolicyFollow::getPolicyNo, Function.identity()));
List<ApiExpectedFortunePageResponse> expectedFortuneVOList = expectedFortuneList.stream().map(expectedFortune -> {
ApiExpectedFortunePageResponse expectedFortuneVO = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(expectedFortune, expectedFortuneVO);
// 组装 VO
Map<String, String> finalBrokerRatioMap = brokerRatioMap;
List<ApiExpectedFortunePageResponse> voList = expectedFortuneList.stream().map(ef -> {
ApiExpectedFortunePageResponse vo = new ApiExpectedFortunePageResponse();
BeanUtils.copyProperties(ef, vo);
Policy policy = policyMap.get(expectedFortune.getPolicyNo());
PolicyFollow policyFollow= policyFollowMap.get(expectedFortune.getPolicyNo());
String ratio = finalBrokerRatioMap.get(ef.getBrokerBizId());
vo.setCommissionRatio(ratio);
Policy policy = policyMap.get(ef.getPolicyNo());
PolicyFollow follow = policyFollowMap.get(ef.getPolicyNo());
if (policy != null) {
expectedFortuneVO.setInsuranceCompany(policy.getInsuranceCompany());
expectedFortuneVO.setPremium(policy.getPaymentPremium());
vo.setInsuranceCompany(policy.getInsuranceCompany());
vo.setPremium(policy.getPaymentPremium());
}
if (policyFollow != null) {
expectedFortuneVO.setProductName(policyFollow.getProductName());
expectedFortuneVO.setProductLaunchBizId(policyFollow.getProductLaunchBizId());
if (follow != null) {
vo.setProductName(follow.getProductName());
vo.setProductLaunchBizId(follow.getProductLaunchBizId());
}
return expectedFortuneVO;
return vo;
}).collect(Collectors.toList());
return expectedFortuneVOList;
return voList;
}
@Override
......
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.google.gson.reflect.TypeToken;
import com.yd.base.feign.client.relobjectcertificate.ApiRelObjectCertificateFeignClient;
import com.yd.base.feign.dto.ApiCertificateDto;
import com.yd.common.exception.BusinessException;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.DependantData;
import com.yd.csf.service.dto.TaxCountry;
import com.yd.csf.service.model.Fna;
import com.yd.csf.service.model.FnaCustomer;
import com.yd.csf.service.model.FnaForm;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaCustomerService;
import com.yd.csf.service.dao.FnaCustomerMapper;
import com.yd.csf.service.service.FnaFormService;
import com.yd.csf.service.service.FnaService;
import com.yd.csf.service.utils.GSONUtil;
import com.yd.csf.service.vo.AddressVO;
import com.yd.csf.service.vo.CustomerVO;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.ObjectUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
/**
* @author Zhang Jianan
* @description 针对表【fna_customer(客户信息表)】的数据库操作Service实现
* @createDate 2026-03-09 10:45:37
*/
@Service
public class FnaCustomerServiceImpl extends ServiceImpl<FnaCustomerMapper, FnaCustomer>
implements FnaCustomerService {
@Resource
private FnaCustomerService fnaCustomerService;
@Resource
private CustomerService customerService;
@Resource
private FnaService fnaService;
@Resource
private FnaFormService fnaFormService;
@Resource
private ApiRelObjectCertificateFeignClient apiRelObjectCertificateFeignClient;
@Override
public void validCustomer(FnaCustomer fnaCustomer) {
if (StringUtils.isBlank(fnaCustomer.getNamePyEn())) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), "名字-英文不能为空");
}
if (StringUtils.isBlank(fnaCustomer.getMobile())) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), "客户手机号不能为空");
}
if (StringUtils.isBlank(fnaCustomer.getAge())) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), "年龄不能为空");
}
if (StringUtils.isBlank(fnaCustomer.getNationality())) {
throw new BusinessException(ErrorCode.PARAMS_ERROR.getCode(), "国籍不能为空");
}
}
@Override
public int queryDependentsNum(String fnaBizId) {
Fna fna = fnaService.getByBizId(fnaBizId);
if (fna == null) {
return 0;
}
FnaForm fnaForm = fnaFormService.getByFnaFormBizId(fna.getFnaFormBizId());
if (fnaForm != null) {
if (StringUtils.isNotBlank((CharSequence) fnaForm.getDependantList()) && !"null".equals(fnaForm.getDependantList())) {
List<DependantData> dependantList = GSONUtil.fromJson((String) fnaForm.getDependantList(), new TypeToken<List<DependantData>>() {
}.getType());
return dependantList.size();
}
}
return 0;
}
@Override
public CustomerVO getCustomerVO(FnaCustomer fnaCustomer) {
if (fnaCustomer == null) {
return null;
}
// 查询受供养人数量
int dependentsNum = fnaCustomerService.queryDependentsNum(fnaCustomer.getFnaBizId());
// 获取封装类
CustomerVO customerVO = new CustomerVO();
BeanUtils.copyProperties(fnaCustomer, customerVO);
customerVO.setDependentsNum(dependentsNum);
if (ObjectUtils.isNotEmpty(fnaCustomer.getAddressList())) {
List<AddressVO> addressList = GSONUtil.fromJson(fnaCustomer.getAddressList(), new TypeToken<List<AddressVO>>() {
}.getType());
customerVO.setAddressList(addressList);
}
if (ObjectUtils.isNotEmpty(fnaCustomer.getTaxList())) {
List<TaxCountry> taxList = GSONUtil.fromJson((String) fnaCustomer.getTaxList(), new TypeToken<List<TaxCountry>>() {
}.getType());
customerVO.setApiTaxationDtoList(taxList);
}
if (ObjectUtils.isNotEmpty(fnaCustomer.getCertificateList())) {
List<ApiCertificateDto> certificateList = GSONUtil.fromJson((String) fnaCustomer.getCertificateList(), new TypeToken<List<ApiCertificateDto>>() {
}.getType());
customerVO.setApiCertificateDtoList(certificateList);
}
return customerVO;
}
}
......@@ -124,7 +124,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
fortuneAccount.setBroker(accountExportDTO.getBroker());
fortuneAccount.setTeam(accountExportDTO.getTeam());
fortuneAccount.setCurrency(accountExportDTO.getCurrency());
fortuneAccount.setAmount(accountExportDTO.getAmount());
fortuneAccount.setHkdAmount(accountExportDTO.getAmount());
fortuneAccount.setFortuneAccountDate(currentDate);
// 出账状态默认待出账
fortuneAccount.setStatus(FortuneStatusEnum.CHECKED.getItemValue());
......@@ -361,7 +361,7 @@ public class FortuneAccountServiceImpl extends ServiceImpl<FortuneAccountMapper,
List<FortuneAccount> fortuneAccountList = this.baseMapper.selectBatchIds(fortuneAccountIdList);
BigDecimal totalAmount = fortuneAccountList.stream()
.map(FortuneAccount::getAmount)
.map(FortuneAccount::getHkdAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
int brokerCount = fortuneAccountList.stream()
.map(FortuneAccount::getBroker)
......
......@@ -138,10 +138,6 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<Policy> policyList = policyService.list(queryWrapper);
Map<String, Policy> policyMap = policyList.stream().collect(Collectors.toMap(Policy::getPolicyNo, a -> a, (oldValue, newValue) -> newValue));
// 3.关联查询预计出账信息
List<ExpectedFortune> expectedFortuneList = expectedFortuneService.list(new QueryWrapper<ExpectedFortune>().in("expected_fortune_biz_id", expectedFortuneBizIdSet));
Map<String, ExpectedFortune> expectedFortuneMap = expectedFortuneList.stream().collect(Collectors.toMap(ExpectedFortune::getExpectedFortuneBizId, a -> a, (oldValue, newValue) -> newValue));
fortuneVOList.forEach(fortuneVO -> {
String commissionBizId = fortuneVO.getCommissionExpectedBizId();
// 设置来佣金额和比例
......@@ -185,13 +181,13 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
if (expectedFortune == null) {
throw new BusinessException(ResultCode.NULL_ERROR.getCode(), "预计出账数据不存在");
}
BigDecimal currentPaymentAmount = fortuneUpdateRequest.getCurrentPaymentAmount();
if (currentPaymentAmount != null) {
if (currentPaymentAmount.compareTo(BigDecimal.ZERO) < 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账金额不能小于0");
BigDecimal currentPaymentHkdAmount = fortuneUpdateRequest.getCurrentPaymentHkdAmount();
if (currentPaymentHkdAmount != null) {
if (currentPaymentHkdAmount.compareTo(BigDecimal.ZERO) < 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账港币金额不能小于0");
}
if (currentPaymentAmount.compareTo(expectedFortune.getAmount()) > 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账金额不能大于应付款金额");
if (currentPaymentHkdAmount.compareTo(expectedFortune.getHkdAmount()) > 0) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账港币金额不能大于应付款港币金额");
}
if (StringUtils.isBlank(fortuneUpdateRequest.getCurrency())) {
throw new BusinessException(ResultCode.PARAM_CHECK_ERROR.getCode(), "出账币种不能为空");
......@@ -215,8 +211,8 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
fortune.setReconciliationOperator(currentLoginUser.getUsername());
// 如果传入了金额
if (currentPaymentAmount != null) {
splitFortune(fortune, currentPaymentAmount, expectedFortune, loginUserId, fortuneUpdateRequest);
if (currentPaymentHkdAmount != null && currentPaymentHkdAmount.compareTo(BigDecimal.ZERO) != 0) {
splitFortune(fortune, currentPaymentHkdAmount, expectedFortune, loginUserId, fortuneUpdateRequest);
} else {
// 如果未传入金额,仅更新预计出账状态为已出帐
expectedFortuneService.lambdaUpdate()
......@@ -364,9 +360,9 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 校验发佣记录状态
StringBuilder validateMsg = new StringBuilder();
for (Fortune fortune : fortuneList) {
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.CAN_SEND.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("当前未检核,请检核后再生成出账记录; ");
}
// if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.CAN_SEND.getItemValue())) {
// validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("当前未检核,请检核后再生成出账记录; ");
// }
if (StringUtils.equals(fortune.getStatus(), FortuneStatusEnum.SENT.getItemValue())) {
validateMsg.append(fortune.getPolicyNo()).append("-").append(fortune.getBroker()).append("已完成出账,不能生成出账记录; ");
}
......@@ -406,7 +402,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
// 计算出账总额
BigDecimal totalAmount = brokerFortunes.stream()
.map(Fortune::getCurrentPaymentAmount)
.map(Fortune::getCurrentPaymentHkdAmount)
.reduce(BigDecimal.ZERO, BigDecimal::add);
accountDTO.setAmount(totalAmount);
......@@ -414,7 +410,7 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
Map<String, BigDecimal> fortuneAmountMap = brokerFortunes.stream()
.collect(Collectors.groupingBy(
Fortune::getFortuneName,
Collectors.reducing(BigDecimal.ZERO, Fortune::getCurrentPaymentAmount, BigDecimal::add)
Collectors.reducing(BigDecimal.ZERO, Fortune::getCurrentPaymentHkdAmount, BigDecimal::add)
));
// 设置各个fortune项目的金额
......@@ -645,6 +641,40 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
if (fortuneStatistics.getAvailableOutAmount() == null) {
fortuneStatistics.setAvailableOutAmount(BigDecimal.ZERO);
}
// 计算总保费、入账金额
if (CollectionUtils.isNotEmpty(fortuneIdList)) {
List<Fortune> fortuneList = this.listByIds(fortuneIdList);
Map<String, BigDecimal> exchangeRateMap = new HashMap<>();
for (Fortune fortune : fortuneList) {
exchangeRateMap.put(fortune.getPolicyNo(), fortune.getExchangeRate());
}
Set<String> policyNoSet = fortuneList.stream().map(Fortune::getPolicyNo).collect(Collectors.toSet());
// 查询总保费
List<Policy> policyList = policyService.lambdaQuery().in(Policy::getPolicyNo, policyNoSet).list();
BigDecimal totalPremium = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(policyList)) {
for (Policy policy : policyList) {
BigDecimal exchangeRate = exchangeRateMap.getOrDefault(policy.getPolicyNo(), BigDecimal.ONE);
totalPremium = totalPremium.add(policy.getTotalPaymentPremium().multiply(exchangeRate));
}
fortuneStatistics.setTotalPremium(totalPremium);
}
// 查询总入账金额
List<Commission> commissions = commissionService.lambdaQuery()
.in(Commission::getPolicyNo, policyNoSet)
.select(Commission::getHkdAmount)
.list();
BigDecimal totalInAmount = BigDecimal.ZERO;
if (CollectionUtils.isNotEmpty(commissions)) {
for (Commission commission : commissions) {
totalInAmount = totalInAmount.add(commission.getHkdAmount());
}
fortuneStatistics.setTotalInAmount(totalInAmount);
}
}
return fortuneStatistics;
}
......
......@@ -490,6 +490,10 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
.set(PolicyFollow::getStatus, changePolicyFollowStatusRequest.getStatus())
.set(PolicyFollow::getNextStatusList, getNextStatus(policyFollowStatusEnum))
.set(PolicyFollow::getUpdaterId, loginUserId)
//冷静期结束日期
.set(PolicyFollow::getCoolingOffEndDate, changePolicyFollowStatusRequest.getCoolingOffEndDate() != null ? changePolicyFollowStatusRequest.getCoolingOffEndDate() : policyFollow.getCoolingOffEndDate())
//保单截止日期
.set(PolicyFollow::getPolicyExpirationDate, changePolicyFollowStatusRequest.getPolicyExpirationDate() != null ? changePolicyFollowStatusRequest.getPolicyExpirationDate() : policyFollow.getPolicyExpirationDate())
.eq(PolicyFollow::getId, policyFollow.getId())
.update();
......@@ -512,6 +516,7 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
policy.setCoolingOffEndDate(policyFollow.getCoolingOffEndDate());
policy.setReconciliationCompanyBizId(policyFollow.getReconciliationCompanyBizId());
policy.setReconciliationCompanyCode(policyFollow.getReconciliationCompanyCode());
policy.setReconciliationCompany(policyFollow.getReconciliationCompany());
// 更新保单状态为生效
policy.setStatus(PolicyStatusEnum.INFORCE.getItemValue());
// 手动映射不同名的字段
......@@ -521,6 +526,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
policy.setTotalPaymentPremium(calculateTotalPaymentPremium(policy));
policy.setUnderwritingDate(changePolicyFollowStatusRequest.getUnderwritingDate());
policy.setEffectiveDate(changePolicyFollowStatusRequest.getEffectiveDate());
//冷静期结束日期
policy.setCoolingOffEndDate(changePolicyFollowStatusRequest.getCoolingOffEndDate() != null ? changePolicyFollowStatusRequest.getCoolingOffEndDate() : policy.getCoolingOffEndDate());
if (ObjectUtils.isEmpty(policy.getInsuranceCompany()) || ObjectUtils.isEmpty(policy.getInsuranceCompany())) {
// 获取保单产品信息,填充对账公司相关字段
......@@ -723,6 +730,14 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
}
@Override
public PolicyFollow queryOneByPolicyBizId(String policyBizId) {
return this.getOne(new LambdaQueryWrapper<PolicyFollow>()
.eq(PolicyFollow::getPolicyBizId,policyBizId)
.last(" limit 1 ")
);
}
@Override
public Boolean uploadAttachment(AttachmentUploadRequest attachmentUploadRequest) {
String policyBizId = attachmentUploadRequest.getPolicyBizId();
if (policyBizId == null) {
......
......@@ -28,6 +28,12 @@ public class CustomerVO implements Serializable {
private Long id;
/**
* fna业务id
*/
@Schema(description = "fna业务id")
private String fnaBizId;
/**
* 客户唯一业务ID
*/
@Schema(description = "客户业务ID")
......
......@@ -44,10 +44,10 @@ public class FortuneAccountVO {
private String currency;
/**
* 出账总
* 港币出账金
*/
@Schema(description = "出账总额")
private BigDecimal amount;
@Schema(description = "港币出账金额")
private BigDecimal hkdAmount;
/**
* 出账状态
......
......@@ -53,6 +53,12 @@ public class FortuneVO implements Serializable {
private String policyNo;
/**
* 保单币种
*/
@Schema(description = "保单币种")
private String policyCurrency;
/**
* 期交保费
*/
@Schema(description = "期交保费")
......@@ -161,6 +167,18 @@ public class FortuneVO implements Serializable {
private String currency;
/**
* 结算汇率
*/
@Schema(description = "结算汇率")
private BigDecimal exchangeRate;
/**
* 港币出账金额
*/
@Schema(description = "港币出账金额")
private BigDecimal hkdAmount;
/**
* 已出账金额
*/
@Schema(description = "已出账金额")
......@@ -179,6 +197,12 @@ public class FortuneVO implements Serializable {
private BigDecimal currentPaymentAmount;
/**
* 本次出账港币金额
*/
@Schema(description = "本次出账港币金额")
private BigDecimal currentPaymentHkdAmount;
/**
* 本期出账比例
*/
@Schema(description = "本期出账比例")
......
......@@ -7,6 +7,7 @@ import com.yd.csf.service.model.PolicyBroker;
import com.yd.csf.service.model.PolicyFollow;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import java.io.Serializable;
......@@ -530,6 +531,25 @@ public class PolicyFollowDetailVO implements Serializable {
detailVO.setPolicyBizId(policyFollow.getPolicyBizId());
// 转换PolicyFollow
BeanUtils.copyProperties(policyFollow, detailVO);
Object issueNumberObj = policyFollow.getIssueNumber();
if (issueNumberObj instanceof Integer) {
detailVO.setIssueNumber((Integer) issueNumberObj);
} else if (issueNumberObj instanceof String) {
String str = (String) issueNumberObj;
if (StringUtils.isNotBlank(str)) {
try {
detailVO.setIssueNumber(Integer.parseInt(str.trim()));
} catch (NumberFormatException e) {
// 可记录日志,然后置为 null
detailVO.setIssueNumber(null);
}
} else {
detailVO.setIssueNumber(null);
}
} else {
// 其他类型(如 null 或意外类型)统一置 null
detailVO.setIssueNumber(null);
}
// 处理 nextStatusList 字段
Object nextStatusList = policyFollow.getNextStatusList();
if (nextStatusList != null && !nextStatusList.toString().isEmpty()) {
......
......@@ -120,7 +120,7 @@ public class PolicyFollowVO implements Serializable {
* 缴费年期
*/
@Schema(description = "缴费年期")
private Integer issueNumber;
private Object issueNumber;
/**
* 保险公司
......
......@@ -81,7 +81,7 @@ public class PolicyVO {
* 供款年期
*/
@Schema(description = "供款年期")
private Integer paymentTerm;
private Object paymentTerm;
/**
* 期交保费
......
......@@ -106,7 +106,7 @@
), 0
) as expectePaidAmount,
COUNT(DISTINCT c.policy_no) as totalPolicyCount,
COALESCE(SUM(CAST(c.premium AS DECIMAL(15,2)) * p.payment_term), 0) AS totalPremium,
COALESCE(p.total_payment_premium * e.default_exchange_rate, 0) AS totalPremium,
COUNT(DISTINCT c.reconciliation_company) as reconciliationCompanyCount,
COUNT(DISTINCT c.id) as totalCompareCommissionCount,
SUM(CASE WHEN c.status = '1' THEN 1 ELSE 0 END) as successCompareCommissionCount,
......
......@@ -12,4 +12,20 @@
and cc.is_deleted = 0
</where>
</select>
<select id="selectBrokerRatioByBizIds" resultType="java.util.Map">
SELECT
aaf.agent_id AS brokerBizId,
cc.conditional_value
FROM agent_accumulated_fyc aaf
LEFT JOIN condition_config cc
ON aaf.total_fyc >= cc.min_value
AND (cc.max_value IS NULL OR aaf.total_fyc &lt; cc.max_value)
AND cc.condition_type_biz_id = 'condition_type_sk33eRvu75eF8IRL'
WHERE aaf.agent_id IN
<foreach collection="list" item="item" open="(" separator="," close=")">
#{item}
</foreach>
</select>
</mapper>
<?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.FnaCustomerMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.FnaCustomer">
<id property="id" column="id" />
<result property="fnaCustomerBizId" column="fna_customer_biz_id" />
<result property="customerBizId" column="customer_biz_id" />
<result property="fnaBizId" column="fna_biz_id" />
<result property="nameCn" column="name_cn" />
<result property="namePyEn" column="name_py_en" />
<result property="documentType" column="document_type" />
<result property="idNumber" column="id_number" />
<result property="gender" column="gender" />
<result property="birthday" column="birthday" />
<result property="age" column="age" />
<result property="nationality" column="nationality" />
<result property="birthplace" column="birthplace" />
<result property="isOtherCountry" column="is_other_country" />
<result property="taxList" column="tax_list" />
<result property="smokingStatus" column="smoking_status" />
<result property="maritalStatus" column="marital_status" />
<result property="educationLevel" column="education_level" />
<result property="isRetirement" column="is_retirement" />
<result property="retirementAge" column="retirement_age" />
<result property="height" column="height" />
<result property="weight" column="weight" />
<result property="bmi" column="bmi" />
<result property="riskAppetite" column="risk_appetite" />
<result property="dependentsNum" column="dependents_num" />
<result property="mobileCode" column="mobile_code" />
<result property="mobile" column="mobile" />
<result property="residenceMobileCode" column="residence_mobile_code" />
<result property="residenceMobile" column="residence_mobile" />
<result property="landlineCode" column="landline_code" />
<result property="landline" column="landline" />
<result property="email" column="email" />
<result property="certificateAddress" column="certificate_address" />
<result property="mailingAddress" column="mailing_address" />
<result property="residentialAddress" column="residential_address" />
<result property="mailingAddressCode" column="mailing_address_code" />
<result property="employmentStatus" column="employment_status" />
<result property="csName" column="cs_name" />
<result property="industry" column="industry" />
<result property="currentMonthlyIncome" column="current_monthly_income" />
<result property="totalWorkingYears" column="total_working_years" />
<result property="currentTenure" column="current_tenure" />
<result property="position" column="position" />
<result property="companyAddress" column="company_address" />
<result property="companyMobileCode" column="company_mobile_code" />
<result property="companyMobile" column="company_mobile" />
<result property="companyAddressCode" column="company_address_code" />
<result property="monthIncome" column="month_income" />
<result property="monthExpenditure" column="month_expenditure" />
<result property="totalCurrentAssets" column="total_current_assets" />
<result property="totalDebt" column="total_debt" />
<result property="travel" column="travel" />
<result property="exercise" column="exercise" />
<result property="game" column="game" />
<result property="movieDrama" column="movie_drama" />
<result property="delicacy" column="delicacy" />
<result property="addressList" column="address_list" />
<result property="certificateList" column="certificate_list" />
<result property="remark" column="remark" />
<result property="isDeleted" column="is_deleted" />
<result property="creatorId" column="creator_id" />
<result property="updaterId" column="updater_id" />
<result property="createTime" column="create_time" />
<result property="updateTime" column="update_time" />
</resultMap>
<sql id="Base_Column_List">
id,fna_customer_biz_id,customer_biz_id,fna_biz_id,name_cn,name_py_en,document_type,
id_number,gender,birthday,age,nationality,
birthplace,is_other_country,tax_list,smoking_status,marital_status,
education_level,is_retirement,retirement_age,height,weight,
bmi,risk_appetite,dependents_num,mobile_code,mobile,
residence_mobile_code,residence_mobile,landline_code,landline,email,
certificate_address,mailing_address,residential_address,mailing_address_code,employment_status,
cs_name,industry,current_monthly_income,total_working_years,current_tenure,
position,company_address,company_mobile_code,company_mobile,company_address_code,
month_income,month_expenditure,total_current_assets,total_debt,travel,
exercise,game,movie_drama,delicacy,address_list,
certificate_list,remark,is_deleted,creator_id,updater_id,
create_time,update_time
</sql>
</mapper>
......@@ -8,6 +8,10 @@
<id property="id" column="id" />
<result property="fortuneAccountBizId" column="fortune_account_biz_id" />
<result property="broker" column="broker" />
<result property="currency" column="currency" />
<result property="amount" column="amount" />
<result property="hkdAmount" column="hkd_amount" />
<result property="status" column="status" />
<result property="fortuneAccountDate" column="fortune_account_date" />
<result property="content" column="content" />
<result property="remark" column="remark" />
......@@ -19,7 +23,7 @@
</resultMap>
<sql id="Base_Column_List">
id,fortune_account_biz_id,broker,fortune_account_date,content,remark,
id,fortune_account_biz_id,broker,currency,amount,hkd_amount,status,fortune_account_date,content,remark,
is_deleted,creator_id,updater_id,create_time,update_time
</sql>
</mapper>
......@@ -66,15 +66,12 @@
SUM(CASE WHEN f.is_part = '0' THEN f.hkd_amount ELSE 0 END) AS amount,
SUM(CASE WHEN f.status = '2' THEN f.current_payment_hkd_amount ELSE 0 END) AS sentAmount,
IFNULL(
(select sum(hkd_amount)
(select sum(unpaid_amount)
from expected_fortune where status = '0' and policy_no = f.policy_no
),0) AS pendingOutAmount,
SUM(CASE WHEN f.status in ('6','1') THEN f.current_payment_hkd_amount ELSE 0 END) AS availableOutAmount,
COUNT(DISTINCT f.policy_no) AS totalPolicyCount,
MAX(ce.expected_amount) AS totalInAmount,
MAX(ce.premium) AS totalPremium
COUNT(DISTINCT f.policy_no) AS totalPolicyCount
FROM fortune f
LEFT JOIN commission_expected ce ON f.commission_expected_biz_id = ce.commission_expected_biz_id
WHERE 1 = 1
<if test="fortuneIdList != null and fortuneIdList.size() > 0">
AND f.id IN
......
......@@ -8,7 +8,7 @@
pr.premium_reconciliation_biz_id,
pr.current_issue_number,
pr.reconciliation_type,
p.insurance_company AS insuranceCompany,
pf.insurance_company AS insuranceCompany,
pr.policy_no,
pf.status AS policyFollowStatus,
pr.reconciliation_status,
......@@ -27,7 +27,7 @@
pb.broker_name AS brokerName,
pr.create_time,
pr.update_time,
p.reconciliation_company
pf.reconciliation_company_biz_id
FROM premium_reconciliation pr
LEFT JOIN policy p ON p.policy_no = pr.policy_no AND p.is_deleted = 0
LEFT JOIN policy_follow pf ON pf.policy_no = pr.policy_no AND pf.is_deleted = 0
......
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