Commit ec378a2e by jianan

来佣接口6

parent eee772fa
......@@ -11,16 +11,13 @@ import com.yd.csf.api.dto.FortuneImportDTO;
import com.yd.csf.service.common.ErrorCode;
import com.yd.csf.service.dto.FortuneDownloadRequest;
import com.yd.csf.service.dto.FortuneQueryRequest;
import com.yd.csf.service.dto.FortuneStatusUpdateRequest;
import com.yd.csf.service.dto.FortuneUpdateRequest;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.service.FortuneService;
import com.yd.csf.service.vo.FortuneVO;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.media.Content;
import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.servers.Server;
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.models.annotations.OpenAPI30;
import org.apache.commons.collections4.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
......@@ -99,7 +96,7 @@ public class ApiFortuneController {
* @return
*/
@Operation(summary = "下载选中的发佣数据")
@PostMapping("/download")
@PostMapping("/download/raw")
public void downloadFortune(@RequestBody FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws IOException {
if (CollectionUtils.isEmpty(fortuneDownloadRequest.getFortuneBizIdList())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "请选择要下载的发佣数据");
......@@ -108,6 +105,22 @@ public class ApiFortuneController {
}
/**
* 生成出账清单(按人)
*
* @param fortuneDownloadRequest
* @param response
* @return
*/
@Operation(summary = "生成出账清单")
@PostMapping("/download/account")
public void downloadAccount(@RequestBody FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws IOException {
if (CollectionUtils.isEmpty(fortuneDownloadRequest.getFortuneBizIdList())) {
throw new BusinessException(ResultCode.PARAMS_ERROR.getCode(), "请选择要出账的发佣数据");
}
fortuneService.downloadAccount(fortuneDownloadRequest, response);
}
/**
* 删除fna
*
* @param deleteRequest
......@@ -150,6 +163,22 @@ public class ApiFortuneController {
}
/**
* 修改状态
*
* @param fortuneStatusUpdateRequest
* @return
*/
@PostMapping("/update/status")
@Operation(summary = "修改保单发佣状态")
public Result<Boolean> updateFortuneStatus(@RequestBody FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
if (fortuneStatusUpdateRequest == null || CollectionUtils.isEmpty(fortuneStatusUpdateRequest.getFortuneBizIdList())) {
return Result.fail(ErrorCode.PARAMS_ERROR.getCode(), ErrorCode.PARAMS_ERROR.getMessage());
}
return Result.success(fortuneService.updateFortuneStatus(fortuneStatusUpdateRequest));
}
/**
* 根据 fortuneBizId 获取保单发佣(封装类)
*
* @param fortuneBizId
......
package com.yd.csf.service.dto;
import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;
@Data
public class FortuneAccountExportDTO implements Serializable {
private static final long serialVersionUID = 1L;
@ExcelProperty("转介人")
private String broker;
@ExcelProperty("所属团队")
private String team;
// 动态字段,用于存储不同的fortune项目
private Map<String, BigDecimal> fortuneAmounts = new HashMap<>();
// 添加fortune项目金额
public void addFortuneAmount(String fortuneName, BigDecimal amount) {
fortuneAmounts.put(fortuneName, amount);
}
// 获取fortune项目金额
public BigDecimal getFortuneAmount(String fortuneName) {
return fortuneAmounts.getOrDefault(fortuneName, BigDecimal.ZERO);
}
}
package com.yd.csf.service.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
@Data
public class FortuneStatusUpdateRequest {
@Schema(description = "发佣数据业务Id列表", requiredMode = Schema.RequiredMode.REQUIRED)
private List<String> fortuneBizIdList;
/**
* 发佣状态
*/
@Schema(description = "发佣状态 '0'-'暂不可发','1'-'可发放','2'-'已发并关账', 字典值: csf_fortune_status")
private String status;
}
......@@ -4,6 +4,7 @@ import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.yd.csf.service.dto.FortuneDownloadRequest;
import com.yd.csf.service.dto.FortuneQueryRequest;
import com.yd.csf.service.dto.FortuneStatusUpdateRequest;
import com.yd.csf.service.dto.FortuneUpdateRequest;
import com.yd.csf.service.model.Fortune;
import com.baomidou.mybatisplus.extension.service.IService;
......@@ -11,6 +12,7 @@ import com.yd.csf.service.vo.FortuneVO;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
/**
* @author Zhang Jianan
......@@ -26,4 +28,8 @@ public interface FortuneService extends IService<Fortune> {
Boolean updateFortune(FortuneUpdateRequest fortuneUpdateRequest);
void downloadFortune(FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws IOException;
void downloadAccount(FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws UnsupportedEncodingException;
Boolean updateFortuneStatus(FortuneStatusUpdateRequest fortuneStatusUpdateRequest);
}
......@@ -10,10 +10,7 @@ import com.yd.auth.core.dto.AuthUserDto;
import com.yd.auth.core.utils.SecurityUtil;
import com.yd.common.enums.ResultCode;
import com.yd.common.exception.BusinessException;
import com.yd.csf.service.dto.FortuneDownloadRequest;
import com.yd.csf.service.dto.FortuneExportDTO;
import com.yd.csf.service.dto.FortuneQueryRequest;
import com.yd.csf.service.dto.FortuneUpdateRequest;
import com.yd.csf.service.dto.*;
import com.yd.csf.service.model.Fortune;
import com.yd.csf.service.service.FortuneService;
import com.yd.csf.service.dao.FortuneMapper;
......@@ -21,12 +18,15 @@ import com.yd.csf.service.vo.FortuneVO;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.math.BigDecimal;
import java.net.URLEncoder;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
......@@ -119,6 +119,120 @@ public class FortuneServiceImpl extends ServiceImpl<FortuneMapper, Fortune>
}
}
}
@Override
public void downloadAccount(FortuneDownloadRequest fortuneDownloadRequest, HttpServletResponse response) throws UnsupportedEncodingException {
List<String> fortuneBizIdList = fortuneDownloadRequest.getFortuneBizIdList();
if (CollUtil.isNotEmpty(fortuneBizIdList)) {
List<Fortune> fortuneList = this.list(new QueryWrapper<Fortune>().in("fortune_biz_id", fortuneBizIdList));
if (CollUtil.isNotEmpty(fortuneList)) {
// 按人分组
Map<String, List<Fortune>> fortuneMap = fortuneList.stream().collect(Collectors.groupingBy(Fortune::getBroker));
// 创建按人分组的导出DTO列表
List<FortuneAccountExportDTO> accountExportDTOList = new ArrayList<>();
// 收集所有不同的fortune项目名称
Set<String> allFortuneNames = fortuneList.stream()
.map(Fortune::getFortuneName)
.filter(StringUtils::isNotBlank)
.collect(Collectors.toSet());
// 处理每个人的数据
for (Map.Entry<String, List<Fortune>> entry : fortuneMap.entrySet()) {
String broker = entry.getKey();
List<Fortune> brokerFortunes = entry.getValue();
FortuneAccountExportDTO accountDTO = new FortuneAccountExportDTO();
accountDTO.setBroker(broker);
// 设置团队(取第一个记录的团队)
if (CollUtil.isNotEmpty(brokerFortunes)) {
accountDTO.setTeam(brokerFortunes.get(0).getTeam());
}
// 按fortune项目分组并累加金额
Map<String, BigDecimal> fortuneAmountMap = brokerFortunes.stream()
.collect(Collectors.groupingBy(
Fortune::getFortuneName,
Collectors.reducing(BigDecimal.ZERO, Fortune::getAmount, BigDecimal::add)
));
// 设置各个fortune项目的金额
fortuneAmountMap.forEach(accountDTO::addFortuneAmount);
accountExportDTOList.add(accountDTO);
}
// 设置响应头
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
response.setCharacterEncoding("utf-8");
String fileName = "fortune_account_" + System.currentTimeMillis() + ".xlsx";
response.setHeader("Content-Disposition", "attachment;filename=" + fileName);
// 创建动态表头
List<List<String>> head = new ArrayList<>();
head.add(Collections.singletonList("转介人"));
head.add(Collections.singletonList("所属团队"));
// 添加所有fortune项目作为表头
for (String fortuneName : allFortuneNames) {
head.add(Collections.singletonList(fortuneName + "金额"));
}
// 构建数据行
List<List<Object>> dataList = new ArrayList<>();
for (FortuneAccountExportDTO dto : accountExportDTOList) {
List<Object> row = new ArrayList<>();
row.add(dto.getBroker());
row.add(dto.getTeam());
for (String fortuneName : allFortuneNames) {
row.add(dto.getFortuneAmount(fortuneName));
}
dataList.add(row);
}
// 使用try-with-resources确保流正确关闭
try (ServletOutputStream outputStream = response.getOutputStream()) {
// 写入 Excel
EasyExcel.write(outputStream)
.head(head)
.sheet("出账清单")
.doWrite(dataList);
outputStream.flush();
} catch (Exception e) {
log.error("导出失败", e);
throw new BusinessException(ResultCode.FAIL.getCode(), "导出失败");
}
}
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateFortuneStatus(FortuneStatusUpdateRequest fortuneStatusUpdateRequest) {
List<String> fortuneBizIdList = fortuneStatusUpdateRequest.getFortuneBizIdList();
List<Fortune> fortuneList = this.list(new QueryWrapper<Fortune>().in("fortune_biz_id", fortuneBizIdList));
// 获取当前登录用户
AuthUserDto currentLoginUser = SecurityUtil.getCurrentLoginUser();
String loginUserId = currentLoginUser.getId().toString();
Date now = new Date();
List<Fortune> updateList = new ArrayList<>();
for (Fortune fortune : fortuneList) {
Fortune updateFortune = new Fortune();
updateFortune.setId(fortune.getId());
updateFortune.setUpdaterId(loginUserId);
updateFortune.setUpdateTime(now);
updateFortune.setStatus(fortuneStatusUpdateRequest.getStatus());
updateList.add(updateFortune);
}
return this.updateBatchById(updateList);
}
}
......
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