Commit 97d8e5b0 by zhangxingmin

产品公告比例

parent e59fbf72
......@@ -43,6 +43,7 @@ public class ApiInsuranceAdditionalProductController implements ApiInsuranceAddi
}
/**
*
* 获取保险附加产品详情
* @param additionalProductBizId 保险附加产品唯一标识(业务ID)
* @return
......
package com.yd.insurance.base.api.controller;
import com.yd.common.result.Result;
import com.yd.insurance.base.api.service.ApiRelProductAnnouncementService;
import com.yd.insurance.base.feign.client.ApiRelProductAnnouncementFeignClient;
import com.yd.insurance.base.feign.request.ApiQueryRatioRequest;
import com.yd.insurance.base.feign.response.ApiQueryRatioResponse;
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;
/**
* 产品和公告比例关系信息
*
* @author zxm
* @since 2025-10-28
*/
@RestController
@RequestMapping("/relProductAnnouncement")
@Validated
public class ApiRelProductAnnouncementController implements ApiRelProductAnnouncementFeignClient {
@Autowired
private ApiRelProductAnnouncementService apiRelProductAnnouncementService;
/**
* 查询-产品公告比例
* @param request
* @return
*/
@Override
public Result<ApiQueryRatioResponse> queryRatio(ApiQueryRatioRequest request) {
return apiRelProductAnnouncementService.queryRatio(request);
}
}
package com.yd.insurance.base.api.service;
import com.yd.common.result.Result;
import com.yd.insurance.base.feign.request.ApiQueryRatioRequest;
import com.yd.insurance.base.feign.response.ApiQueryRatioResponse;
public interface ApiRelProductAnnouncementService {
Result<ApiQueryRatioResponse> queryRatio(ApiQueryRatioRequest request);
}
package com.yd.insurance.base.api.service.impl;
import com.yd.common.result.Result;
import com.yd.insurance.base.api.service.ApiRelProductAnnouncementService;
import com.yd.insurance.base.feign.dto.ApiProductRatioDto;
import com.yd.insurance.base.feign.request.ApiQueryRatioRequest;
import com.yd.insurance.base.feign.response.ApiQueryRatioResponse;
import com.yd.insurance.base.service.dto.RelProductAnnouncementDto;
import com.yd.insurance.base.service.model.RelProductAnnouncement;
import com.yd.insurance.base.service.service.IRelProductAnnouncementService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Slf4j
@Service
public class ApiRelProductAnnouncementServiceImpl implements ApiRelProductAnnouncementService {
@Autowired
private IRelProductAnnouncementService iRelProductAnnouncementService;
/**
* 查询-产品公告比例
* @param request
* @return
*/
@Override
public Result<ApiQueryRatioResponse> queryRatio(ApiQueryRatioRequest request) {
LocalDateTime now = LocalDateTime.now();
ApiQueryRatioResponse ratioResponse = new ApiQueryRatioResponse();
List<ApiProductRatioDto> apiProductRatioDtoList = request.getApiProductRatioDtoList();
if (!CollectionUtils.isEmpty(apiProductRatioDtoList)) {
//产品代码列表
List<String> productCodeList = apiProductRatioDtoList.stream()
.map(ApiProductRatioDto::getProductCode)
.collect(Collectors.toList());
//产品业务ID列表
List<String> productBizIdList = apiProductRatioDtoList.stream()
.map(ApiProductRatioDto::getProductBizId)
.collect(Collectors.toList());
List<RelProductAnnouncement> productAnnouncementDtoList = new ArrayList<>();
//查询产品和公告比例关系列表信息
if (!CollectionUtils.isEmpty(productCodeList)) {
productAnnouncementDtoList = iRelProductAnnouncementService.queryList(RelProductAnnouncementDto.builder()
.productCodeList(productCodeList)
.build());
}else {
productAnnouncementDtoList = iRelProductAnnouncementService.queryList(RelProductAnnouncementDto.builder()
.productBizIdList(productBizIdList)
.build());
}
if (!CollectionUtils.isEmpty(productAnnouncementDtoList)) {
List<RelProductAnnouncement> finalProductAnnouncementDtoList = productAnnouncementDtoList;
apiProductRatioDtoList.stream().map(dto -> {
//根据产品代码或者产品业务ID获取产品和公告比例关系列表信息
List<RelProductAnnouncement> announcementList = finalProductAnnouncementDtoList.stream()
.filter(d -> d.getProductCode().equals(dto.getProductCode())
|| d.getProductBizId().equals(dto.getProductBizId())).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(announcementList)) {
//先判断当前计算的产品时间是否在有效期内,如果在有效期内,用有效期内的公告比例
List<RelProductAnnouncement> announcements = announcementList.stream()
.filter(d -> d.getStartPayment() <= dto.getCommissionPeriod()
&& d.getEndPayment() > dto.getCommissionPeriod()).collect(Collectors.toList());
if (!CollectionUtils.isEmpty(announcements)) {
//当前计算获取的产品公告比例对象
RelProductAnnouncement announcement = announcements.get(0);
//先判断当前时间是否在有效期内,在有效期内,公告比例取值有效期内公告比例字段值, 否则取公告比例字段
if ((!Objects.isNull(announcement.getEffectiveStart()) && now.compareTo(announcement.getEffectiveStart()) >= 0)
&& (!Objects.isNull(announcement.getEffectiveEnd()) && now.compareTo(announcement.getEffectiveEnd()) <= 0)) {
dto.setRatio(announcement.getRatio());
}else {
dto.setRatio(announcement.getAnnouncementRatio());
}
}
}
return dto;
}).collect(Collectors.toList());
}
}
ratioResponse.setApiProductRatioDtoList(apiProductRatioDtoList);
return Result.success(ratioResponse);
}
}
<?xml version="1.0" encoding="UTF-8"?>
<module type="JAVA_MODULE" version="4" />
\ No newline at end of file
package com.yd.insurance.base.feign.client;
import com.yd.common.result.Result;
import com.yd.insurance.base.feign.fallback.ApiRelProductAnnouncementFeignFallbackFactory;
import com.yd.insurance.base.feign.request.ApiQueryRatioRequest;
import com.yd.insurance.base.feign.response.ApiQueryRatioResponse;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
/**
* 保险基础数据服务-产品和公告比例关系信息Feign客户端
*/
@FeignClient(name = "yd-insurance-base-api", fallbackFactory = ApiRelProductAnnouncementFeignFallbackFactory.class)
public interface ApiRelProductAnnouncementFeignClient {
/**
* 查询-产品公告比例
* @param request
* @return
*/
@PostMapping("/query/ratio")
Result<ApiQueryRatioResponse> queryRatio(@RequestBody ApiQueryRatioRequest request);
}
package com.yd.insurance.base.feign.dto;
import lombok.Data;
import java.math.BigDecimal;
/**
* 产品对应的公告比例对象
*/
@Data
public class ApiProductRatioDto {
/**
* 保险产品唯一业务ID
*/
private String productBizId;
/**
* 保险产品名称
*/
private String productName;
/**
* 保险产品代码
*/
private String productCode;
/**
* 公告比例
*/
private BigDecimal ratio;
/**
* 当前佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年。。)
*/
private Integer commissionPeriod;
}
package com.yd.insurance.base.feign.fallback;
import com.yd.common.result.Result;
import com.yd.insurance.base.feign.client.ApiRelProductAnnouncementFeignClient;
import com.yd.insurance.base.feign.request.ApiQueryRatioRequest;
import com.yd.insurance.base.feign.response.ApiQueryRatioResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.cloud.openfeign.FallbackFactory;
import org.springframework.stereotype.Component;
/**
* 保险基础数据服务-产品和公告比例关系信息Feign降级处理
*/
@Slf4j
@Component
public class ApiRelProductAnnouncementFeignFallbackFactory implements FallbackFactory<ApiRelProductAnnouncementFeignClient> {
@Override
public ApiRelProductAnnouncementFeignClient create(Throwable cause) {
return new ApiRelProductAnnouncementFeignClient() {
@Override
public Result<ApiQueryRatioResponse> queryRatio(ApiQueryRatioRequest request) {
return null;
}
};
}
}
package com.yd.insurance.base.feign.request;
import com.yd.insurance.base.feign.dto.ApiProductRatioDto;
import lombok.Data;
import javax.validation.constraints.NotEmpty;
import java.util.List;
@Data
public class ApiQueryRatioRequest {
/**
* 查询产品对应的公告比例入参参数(多个产品)
*/
@NotEmpty(message = "查询产品对应的公告比例入参参数不能为空")
private List<ApiProductRatioDto> apiProductRatioDtoList;
}
package com.yd.insurance.base.feign.response;
import com.yd.insurance.base.feign.dto.ApiProductRatioDto;
import lombok.Data;
import java.util.List;
@Data
public class ApiQueryRatioResponse {
/**
* 查询产品对应的公告比例出参参数(多个产品)
*/
private List<ApiProductRatioDto> apiProductRatioDtoList;
}
package com.yd.insurance.base.service.dao;
import com.yd.insurance.base.service.model.RelProductAnnouncement;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* <p>
* 产品和公告比例关系表 Mapper 接口
* </p>
*
* @author zxm
* @since 2025-10-28
*/
public interface RelProductAnnouncementMapper extends BaseMapper<RelProductAnnouncement> {
}
......@@ -28,6 +28,11 @@ public class InsuranceProductDto {
private List<String> productBizIdList;
/**
* 保险产品代码集合
*/
private List<String> productCodeList;
/**
* 保险产品名称
*/
private String productName;
......
package com.yd.insurance.base.service.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class RelProductAnnouncementDto {
/**
* 保险产品唯一标识(业务ID)集合
*/
private List<String> productBizIdList;
/**
* 保险产品代码集合
*/
private List<String> productCodeList;
}
......@@ -41,6 +41,12 @@ public class InsuranceAdditionalProduct implements Serializable {
private String productName;
/**
* 保险附加产品代码
*/
@TableField("product_code")
private String productCode;
/**
* 保险附加产品类型
*/
@TableField("product_type")
......
......@@ -47,6 +47,12 @@ public class InsuranceProduct implements Serializable {
private String productType;
/**
* 保险产品代码
*/
@TableField("product_code")
private String productCode;
/**
* 支持货币
*/
@TableField("currency")
......
package com.yd.insurance.base.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>
* 产品和公告比例关系表
* </p>
*
* @author zxm
* @since 2025-10-28
*/
@Getter
@Setter
@TableName("rel_product_announcement")
public class RelProductAnnouncement implements Serializable {
private static final long serialVersionUID = 1L;
/**
* 主键ID
*/
@TableId(value = "id", type = IdType.AUTO)
private Long id;
/**
* 保险产品唯一业务ID
*/
@TableField("product_biz_id")
private String productBizId;
/**
* 保险产品代码
*/
@TableField("product_code")
private String productCode;
/**
* 缴费期范围开始期数(例:1-第一年)
*/
@TableField("start_payment")
private Integer startPayment;
/**
* 缴费期范围结束期数(例:2- 第一年到第二年,不包含结束期数,例: 当前缴费来佣期是第一期,那么就是1-2第一年到第二年)
*/
@TableField("end_payment")
private Integer endPayment;
/**
* 公告比例
*/
@TableField("announcement_ratio")
private BigDecimal announcementRatio;
/**
* 有效开始时间
*/
@TableField("effective_start")
private LocalDateTime effectiveStart;
/**
* 有效结束时间(不在这个时间区间内,公告比例按照announcement_ratio算,在这个区间内公告比例按照有效期内公告比例算)
*/
@TableField("effective_end")
private LocalDateTime effectiveEnd;
/**
* 有效期内公告比例
*/
@TableField("ratio")
private BigDecimal ratio;
/**
* 状态(0:停用 1:启用)
*/
@TableField("status")
private Integer 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 Integer 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.insurance.base.service.service;
import com.yd.insurance.base.service.dto.RelProductAnnouncementDto;
import com.yd.insurance.base.service.model.RelProductAnnouncement;
import com.baomidou.mybatisplus.extension.service.IService;
import java.util.List;
/**
* <p>
* 产品和公告比例关系表 服务类
* </p>
*
* @author zxm
* @since 2025-10-28
*/
public interface IRelProductAnnouncementService extends IService<RelProductAnnouncement> {
List<RelProductAnnouncement> queryList(RelProductAnnouncementDto dto);
}
......@@ -61,6 +61,7 @@ public class InsuranceProductServiceImpl extends ServiceImpl<InsuranceProductMap
.eq(StringUtils.isNotBlank(dto.getProductBizId()) && !dto.getIsExcludeMy(),InsuranceProduct::getProductBizId,dto.getProductBizId())
.eq(StringUtils.isNotBlank(dto.getProductName()),InsuranceProduct::getProductName,dto.getProductName())
.in(!CollectionUtils.isEmpty(dto.getProductBizIdList()),InsuranceProduct::getProductBizId,dto.getProductBizIdList())
.in(!CollectionUtils.isEmpty(dto.getProductCodeList()),InsuranceProduct::getProductCode,dto.getProductCodeList())
.ne(dto.getIsExcludeMy(),InsuranceProduct::getProductBizId,dto.getProductBizId())
);
return list;
......
package com.yd.insurance.base.service.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.yd.insurance.base.service.dto.RelProductAnnouncementDto;
import com.yd.insurance.base.service.model.InsuranceProduct;
import com.yd.insurance.base.service.model.RelProductAnnouncement;
import com.yd.insurance.base.service.dao.RelProductAnnouncementMapper;
import com.yd.insurance.base.service.service.IRelProductAnnouncementService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.commons.lang3.StringUtils;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.List;
import java.util.Objects;
/**
* <p>
* 产品和公告比例关系表 服务实现类
* </p>
*
* @author zxm
* @since 2025-10-28
*/
@Service
public class RelProductAnnouncementServiceImpl extends ServiceImpl<RelProductAnnouncementMapper, RelProductAnnouncement> implements IRelProductAnnouncementService {
/**
* 查询列表
* @param dto
* @return
*/
@Override
public List<RelProductAnnouncement> queryList(RelProductAnnouncementDto dto) {
List<RelProductAnnouncement> list = baseMapper.selectList(new LambdaQueryWrapper<RelProductAnnouncement>()
.in(!CollectionUtils.isEmpty(dto.getProductBizIdList()),RelProductAnnouncement::getProductBizId,dto.getProductBizIdList())
.in(!CollectionUtils.isEmpty(dto.getProductCodeList()),RelProductAnnouncement::getProductCode,dto.getProductCodeList())
);
return list;
}
}
......@@ -21,7 +21,7 @@ public class MyBatisPlusCodeGenerator {
})
.strategyConfig(builder -> {
builder.addInclude(
"rel_insurance_additional_product_dept"
"rel_product_announcement"
)
.entityBuilder()
.enableLombok()
......
<?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.insurance.base.service.dao.RelProductAnnouncementMapper">
</mapper>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment