Commit c9bc1d61 by zhangxingmin

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

parents f5097a83 e9dec200
......@@ -4,13 +4,18 @@ import com.alibaba.excel.EasyExcel;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.exception.BusinessException;
import com.yd.common.result.Result;
import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.CommissionQueryRequest;
import com.yd.csf.service.dto.CommissionUpdateRequest;
import com.yd.csf.service.dto.GenerateFortuneRequest;
import com.yd.csf.service.enums.CommissionExpectedStatusEnum;
import com.yd.csf.service.enums.CommissionStatusEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.CommissionService;
import com.yd.csf.service.vo.CommissionVO;
import io.swagger.v3.oas.annotations.Operation;
......@@ -25,8 +30,10 @@ 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.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 保单来佣接口
......@@ -44,16 +51,24 @@ public class ApiCommissionController {
@Resource
private CommissionService commissionService;
@Resource
private CommissionExpectedService commissionExpectedService;
@PostMapping("/upload/excel")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
List<CommissionExcelDTO> dataList = new ArrayList<>();
try {
List<CommissionExcelDTO> dataList = EasyExcel.read(file.getInputStream())
dataList = EasyExcel.read(file.getInputStream())
.head(CommissionExcelDTO.class)
.sheet("来佣")
.doReadSync();
} catch (IOException e) {
throw new RuntimeException("Excel读取失败", e);
}
// 获取当前登录用户的ID
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
......@@ -61,15 +76,11 @@ public class ApiCommissionController {
// 数据验证和处理
processData(dataList, loginUserId);
} catch (IOException e) {
throw new RuntimeException("Excel读取失败", e);
}
return Result.success(true);
}
/**
* 处理导入的数据
* 1.处理导入的数据 2.比对预计来佣 3.保存到数据库
*/
private void processData(List<CommissionExcelDTO> dataList, String loginUserId) {
List<Commission> entities = new ArrayList<>();
......@@ -78,8 +89,50 @@ public class ApiCommissionController {
Commission entity = CommissionExcelDTO.convertToEntity(data, loginUserId);
entities.add(entity);
}
// 批量保存
// 根据导入的来佣获取保单号集合
List<String> policyNoList = entities.stream()
.map(Commission::getPolicyNo)
.collect(Collectors.toList());
// 根据保单号查询预计来佣
List<CommissionExpected> expectedList = commissionExpectedService.lambdaQuery()
.in(CommissionExpected::getPolicyNo, policyNoList)
.list();
// 校验导入的来佣是否与预计来佣一致
for (Commission commission : entities) {
String policyNo = commission.getPolicyNo();
Integer commissionPeriod = commission.getCommissionPeriod();
String commissionName = commission.getCommissionName();
CommissionExpected expected = getCommissionExpected(expectedList, policyNo, commissionPeriod, commissionName);
if (expected != null) {
if (expected.getAmount().compareTo(commission.getAmount()) == 0) {
// 一致,来佣状态设置为 已比对
commission.setStatus(CommissionStatusEnum.COMPARED.getItemValue());
// 预计来佣的状态设置为 已来佣
expected.setStatus(CommissionExpectedStatusEnum.COMPARED.getItemValue());
} else {
// 不一致,来佣状态设置为 部分来佣
commission.setStatus(CommissionStatusEnum.PARTIAL.getItemValue());
expected.setStatus(CommissionExpectedStatusEnum.PARTIAL.getItemValue());
}
}
}
// 保存来佣数据
commissionService.saveBatch(entities);
// 更新预计来佣状态
commissionExpectedService.updateBatchById(expectedList);
}
private static CommissionExpected getCommissionExpected(List<CommissionExpected> expectedList, String policyNo, Integer commissionPeriod, String commissionName) {
return expectedList.stream()
.filter(item -> item.getPolicyNo().equals(policyNo)
&& commissionPeriod.equals(item.getCommissionPeriod())
&& commissionName.equals(item.getCommissionName()))
.findFirst()
.orElse(null);
}
/**
......
......@@ -8,15 +8,12 @@ import com.yd.common.result.Result;
import com.yd.csf.api.service.ApiAppointmentService;
import com.yd.csf.feign.dto.appointment.ApiAppointmentInfoDto;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.Customer;
import com.yd.csf.service.model.Fna;
import com.yd.csf.service.service.CustomerService;
import com.yd.csf.service.service.FnaService;
import com.yd.csf.service.vo.FnaVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
......
package com.yd.csf.api.controller;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelReader;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.read.metadata.ReadSheet;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.google.gson.Gson;
import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.CommonEnum;
import com.yd.common.result.Result;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.api.dto.CommissionExcelDTO;
import com.yd.csf.api.dto.PolicyExcelDTO;
import com.yd.csf.api.dto.PolicyFollowDTO;
import com.yd.csf.api.listener.PolicyDataListener;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.PolicyFollowQueryRequest;
import com.yd.csf.service.dto.PolicyFollowUpdateRequest;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.model.Policy;
import com.yd.csf.service.model.PolicyBroker;
import com.yd.csf.service.model.PolicyFollow;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.service.PolicyBrokerService;
import com.yd.csf.service.service.PolicyFollowService;
import com.yd.csf.service.service.PolicyService;
......@@ -33,9 +43,11 @@ import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* customer接口
* 新单跟进接口
*
* @author jianan
* @since 2025-07-31
......@@ -47,25 +59,63 @@ public class ApiPolicyFollowController {
private static final Logger log = LoggerFactory.getLogger(ApiPolicyFollowController.class);
private final static Gson GSON = new Gson();
@Resource
private PolicyFollowService policyFollowService;
@Resource
private PolicyService policyService;
@Resource
private PolicyBrokerService policyBrokerService;
@Resource
private PolicyDataListener policyDataListener;
@Resource
private CommissionExpectedService commissionExpectedService;
@PostMapping("/upload/excel")
@Transactional(rollbackFor = Exception.class)
public Result<Boolean> uploadExcel(@RequestParam("file") MultipartFile file) throws IOException {
EasyExcel.read(file.getInputStream(), PolicyExcelDTO.class, policyDataListener).sheet("保单").doRead();
public Result<Boolean> uploadExcel(@RequestParam("file") MultipartFile file) throws Exception {
// 创建监听器用于读取保单数据
PolicyDataListener policyDataListener = new PolicyDataListener();
// 一次性读取所有Sheet
ExcelReader excelReader = EasyExcel.read(file.getInputStream()).build();
// 1. 读取保单数据
ReadSheet readSheet1 = EasyExcel.readSheet("保单")
.head(PolicyExcelDTO.class)
.registerReadListener(policyDataListener)
.build();
excelReader.read(readSheet1);
// 2. 读取预计来佣数据
List<CommissionExcelDTO> dataList = new ArrayList<>();
ReadSheet readSheet2 = EasyExcel.readSheet("预计来佣")
.head(CommissionExcelDTO.class)
.registerReadListener(new AnalysisEventListener<CommissionExcelDTO>() {
@Override
public void invoke(CommissionExcelDTO data, AnalysisContext context) {
dataList.add(data);
}
@Override
public void doAfterAllAnalysed(AnalysisContext context) {
// 读取完成
}
})
.build();
excelReader.read(readSheet2);
// 关闭读取器
excelReader.finish();
List<PolicyExcelDTO> dtoList = policyDataListener.getList();
// 预计来佣根据保单号分组
Map<String, List<CommissionExcelDTO>> commissionMap = dataList.stream()
.collect(Collectors.groupingBy(CommissionExcelDTO::getPolicyNo));
// 转换为PolicyFollow对象
List<PolicyFollowDTO> list = convertToObj(dtoList);
......@@ -82,6 +132,17 @@ public class ApiPolicyFollowController {
policyService.saveBatch(policyList);
policyBrokerService.saveBatch(policyBrokerList);
// 获取当前登录用户的ID
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
// 保存预计来佣
List<CommissionExpected> commissionExpectedList = new ArrayList<>();
for (CommissionExcelDTO commissionExcelDTO : dataList) {
CommissionExpected commissionExpected = CommissionExcelDTO.convertToCommissionExpectedObj(commissionExcelDTO, loginUserId);
commissionExpectedList.add(commissionExpected);
}
commissionExpectedService.saveBatch(commissionExpectedList);
return Result.success(true);
}
......
......@@ -5,7 +5,9 @@ import com.yd.common.enums.CommonEnum;
import com.yd.common.utils.RandomStringGenerator;
import com.yd.csf.service.enums.CommissionStatusEnum;
import com.yd.csf.service.model.Commission;
import com.yd.csf.service.model.CommissionExpected;
import lombok.Data;
import org.springframework.beans.BeanUtils;
import java.math.BigDecimal;
import java.util.Date;
......@@ -55,7 +57,35 @@ public class CommissionExcelDTO {
entity.setCurrency(data.getCurrency());
entity.setCommissionDate(data.getCommissionDate());
entity.setRemark(data.getRemark());
entity.setStatus(CommissionStatusEnum.PENDING.getItemValue());
entity.setStatus(null);
entity.setCreatorId(loginUserId);
entity.setUpdaterId(loginUserId);
entity.setCreateTime(new Date());
entity.setUpdateTime(new Date());
return entity;
}
/**
* Excel数据转 预计来佣实体
*
* @param data
* @param loginUserId
* @return
*/
public static CommissionExpected convertToCommissionExpectedObj(CommissionExcelDTO data, String loginUserId) {
CommissionExpected entity = new CommissionExpected();
// 字段映射
entity.setPolicyNo(data.getPolicyNo());
entity.setCommissionBizId(RandomStringGenerator.generateBizId16("commission_expected"));
entity.setReconciliationCompany(data.getReconciliationCompany());
entity.setCommissionPeriod(data.getCommissionPeriod());
entity.setTotalPeriod(data.getTotalPeriod());
entity.setCommissionName(data.getCommissionName());
entity.setAmount(data.getAmount());
entity.setCurrency(data.getCurrency());
entity.setCommissionDate(data.getCommissionDate());
entity.setRemark(data.getRemark());
entity.setStatus("0");
entity.setCreatorId(loginUserId);
entity.setUpdaterId(loginUserId);
entity.setCreateTime(new Date());
......
package com.yd.csf.service.dao;
import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
/**
* @author Zhang Jianan
* @description 针对表【commission_expected(预计来佣表)】的数据库操作Mapper
* @createDate 2025-10-08 19:47:40
* @Entity generator.domain.CommissionExpected
*/
public interface CommissionExpectedMapper extends BaseMapper<CommissionExpected> {
}
......@@ -20,7 +20,7 @@ public class CommissionQueryRequest extends PageDto implements Serializable {
/**
* 来佣状态
*/
@Schema(description = "来佣状态 '0'-'未比对','1'-'已比对', 字典值: csf_commission_status")
@Schema(description = "来佣状态 '1'-'已比对','2'-'部分来佣', 字典值: csf_commission_status")
private String status;
/**
......
package com.yd.csf.service.dto;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.yd.common.dto.PageDto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.io.Serializable;
import java.util.Date;
/**
* 查询customer请求
......@@ -57,6 +59,20 @@ public class PolicyFollowQueryRequest extends PageDto implements Serializable {
@Schema(description = "产品名称")
private String productName;
/**
* 签单日期开始
*/
@Schema(description = "签单日期开始", example = "2023-01-01 00:00:00",format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date signDateStart;
/**
* 签单日期结束
*/
@Schema(description = "签单日期结束", example = "2023-01-01 23:59:59",format = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date signDateEnd;
private static final long serialVersionUID = 1L;
}
\ No newline at end of file
package com.yd.csf.service.enums;
/**
* 预计来佣状态枚举
*/
public enum CommissionExpectedStatusEnum {
PENDING("待来佣","0"),
COMPARED("已比对","1"),
PARTIAL("部分来佣","2"),
;
//字典项标签(名称)
private String itemLabel;
//字典项值
private String itemValue;
//构造函数
CommissionExpectedStatusEnum(String itemLabel, String itemValue) {
this.itemLabel = itemLabel;
this.itemValue = itemValue;
}
public String getItemLabel() {
return itemLabel;
}
public String getItemValue() {
return itemValue;
}
}
......@@ -6,9 +6,9 @@ package com.yd.csf.service.enums;
public enum CommissionStatusEnum {
//来佣状态枚举
PENDING("待来佣","0"),
COMPARED("已比对","1"),
CANCELLED("已退保","2"),
PARTIAL("部分来佣","2"),
;
//字典项标签(名称)
private String itemLabel;
......
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 com.yd.csf.service.vo.FnaVO;
import lombok.Data;
import org.springframework.beans.BeanUtils;
/**
* 预计来佣表
* @TableName commission_expected
*/
@TableName(value ="commission_expected")
@Data
public class CommissionExpected implements Serializable {
/**
* serial id
*/
@TableId(type = IdType.AUTO)
private Long id;
/**
* 保单来佣业务id
*/
private String commissionBizId;
/**
* 保单号
*/
private String policyNo;
/**
* 对账公司
*/
private String reconciliationCompany;
/**
* 对账公司业务id
*/
private String reconciliationCompanyBizId;
/**
* 佣金期数(1=第一年; 2=第二年; 3=第三年; 4=第四年; 5=第五年)
*/
private Integer commissionPeriod;
/**
* 总来佣期数
*/
private Integer totalPeriod;
/**
* 来佣名称(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
private String commissionName;
/**
* 来佣类型(1:销售拥金;2:销售奖金;3:销售津贴;4:续期佣金;5:服务津贴;等等)
*/
private String commissionType;
/**
* 来佣金额
*/
private BigDecimal amount;
/**
* 来佣币种
*/
private String currency;
/**
* 来佣日期
*/
private Date commissionDate;
/**
* 来佣状态 0=待来佣 1=已来佣 2=部分来佣
*/
private String status;
/**
* 通用备注
*/
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
package com.yd.csf.service.service;
import com.yd.csf.service.model.CommissionExpected;
import com.baomidou.mybatisplus.extension.service.IService;
/**
* @author Zhang Jianan
* @description 针对表【commission_expected(预计来佣表)】的数据库操作Service
* @createDate 2025-10-08 19:47:40
*/
public interface CommissionExpectedService extends IService<CommissionExpected> {
}
package com.yd.csf.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.yd.csf.service.model.CommissionExpected;
import com.yd.csf.service.service.CommissionExpectedService;
import com.yd.csf.service.dao.CommissionExpectedMapper;
import org.springframework.stereotype.Service;
/**
* @author Zhang Jianan
* @description 针对表【commission_expected(预计来佣表)】的数据库操作Service实现
* @createDate 2025-10-08 19:47:40
*/
@Service
public class CommissionExpectedServiceImpl extends ServiceImpl<CommissionExpectedMapper, CommissionExpected>
implements CommissionExpectedService{
}
......@@ -151,9 +151,10 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
FortuneAccountExportDTO accountDTO = new FortuneAccountExportDTO();
accountDTO.setBroker(broker);
// 设置团队(取第一个记录的团队
// 设置团队、币种(取第一个记录
if (CollUtil.isNotEmpty(brokerFortunes)) {
accountDTO.setTeam(brokerFortunes.get(0).getTeam());
accountDTO.setCurrency(brokerFortunes.get(0).getCurrency());
}
// 计算出账总额
......@@ -199,6 +200,8 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
List<Object> row = new ArrayList<>();
row.add(dto.getBroker());
row.add(dto.getTeam());
row.add(dto.getCurrency());
row.add(dto.getAmount());
for (String fortuneName : allFortuneNames) {
row.add(dto.getFortuneAmount(fortuneName));
}
......
......@@ -20,6 +20,7 @@ import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
......@@ -53,6 +54,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
String status = policyFollowQueryRequest.getStatus();
String insurer = policyFollowQueryRequest.getInsurer();
String productName = policyFollowQueryRequest.getProductName();
Date signDateStart = policyFollowQueryRequest.getSignDateStart();
Date signDateEnd = policyFollowQueryRequest.getSignDateEnd();
queryWrapper.eq(ObjectUtils.isNotEmpty(policyNo), "policy_no", policyNo);
queryWrapper.eq(ObjectUtils.isNotEmpty(customerName), "customer_name", customerName);
......@@ -60,6 +63,8 @@ public class PolicyFollowServiceImpl extends ServiceImpl<PolicyFollowMapper, Pol
queryWrapper.eq(ObjectUtils.isNotEmpty(status), "status", status);
queryWrapper.eq(ObjectUtils.isNotEmpty(insurer), "insurance", insurer);
queryWrapper.eq(ObjectUtils.isNotEmpty(productName), "product_code", productName);
queryWrapper.ge(ObjectUtils.isNotEmpty(signDateStart), "sign_date", signDateStart);
queryWrapper.le(ObjectUtils.isNotEmpty(signDateEnd), "sign_date", signDateEnd);
// 排序
queryWrapper.orderByDesc("id");
......
......@@ -75,9 +75,9 @@ public class CommissionVO implements Serializable {
private Date commissionDate;
/**
* 来佣状态 0=未比对 1=已比对
* 来佣状态
*/
@Schema(description = "来佣状态 0=待来佣 1=已比对 2=已退保")
@Schema(description = "来佣状态 1=已比对 2=部分来佣")
private String status;
/**
......
<?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.CommissionExpectedMapper">
<resultMap id="BaseResultMap" type="com.yd.csf.service.model.CommissionExpected">
<id property="id" column="id" />
<result property="commissionBizId" column="commission_biz_id" />
<result property="policyNo" column="policy_no" />
<result property="reconciliationCompany" column="reconciliation_company" />
<result property="reconciliationCompanyBizId" column="reconciliation_company_biz_id" />
<result property="commissionPeriod" column="commission_period" />
<result property="totalPeriod" column="total_period" />
<result property="commissionName" column="commission_name" />
<result property="commissionType" column="commission_type" />
<result property="amount" column="amount" />
<result property="currency" column="currency" />
<result property="commissionDate" column="commission_date" />
<result property="status" column="status" />
<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,commission_biz_id,policy_no,reconciliation_company,reconciliation_company_biz_id,commission_period,
total_period,commission_name,commission_type,amount,currency,
commission_date,status,remark,is_deleted,creator_id,
updater_id,create_time,update_time
</sql>
</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