This commit is contained in:
李文飞 2025-12-15 23:16:21 +08:00
parent e6457b4846
commit 94288657d9
3 changed files with 291 additions and 156 deletions

View File

@ -75,7 +75,7 @@ spring:
basename: i18n/messages
profiles:
# active: dev
active: prod
active: dev
# 文件上传
servlet:
multipart:

View File

@ -3,6 +3,8 @@ package com.ruoyi.contract.controller;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.poi.excel.ExcelReader;
import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.excel.EasyExcel;
import com.ruoyi.common.annotation.Log;
import com.ruoyi.common.annotation.RepeatSubmit;
@ -18,10 +20,10 @@ import com.ruoyi.common.utils.MathCompute;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.contract.domain.bo.*;
import com.ruoyi.contract.domain.bo.consale.*;
import com.ruoyi.contract.domain.dto.ConSaleImportNewDto;
import com.ruoyi.contract.domain.vo.*;
import com.ruoyi.contract.service.*;
import lombok.RequiredArgsConstructor;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
@ -30,7 +32,6 @@ import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.ParseException;
@ -195,18 +196,21 @@ public class ConSaleController extends BaseController {
@Log(title = "销售汇总导入", businessType = BusinessType.IMPORT)
@PostMapping("/import" )
public R<List<ConSaleImportVo>> importExcel(MultipartFile file) {
public R<List<ConSaleImportNewDto>> importExcel(MultipartFile file) {
// 获取上传的文件输入流
try (InputStream inputStream = file.getInputStream()) {
// 使用 EasyExcel 解析 Excel 文件并将数据转换为 ExcelRowData 实体类对象
List<ConSaleImportVo> data = EasyExcel.read(inputStream)
.head(ConSaleImportVo.class) // 指定 Excel 对应的实体类
.sheet(0) // 指定解析第一个 sheet
.doReadSync(); // 同步读取文件
SimpleDateFormat sdf = new SimpleDateFormat("yyyy/M/d" );
// // 使用 EasyExcel 解析 Excel 文件并将数据转换为 ExcelRowData 实体类对象
// List<ConSaleImportNewDto> data = EasyExcel.read(inputStream)
// .head(ConSaleImportNewDto.class) // 指定 Excel 对应的实体类
// .sheet(0) // 指定解析第一个 sheet
// .doReadSync(); // 同步读取文件
ExcelReader reader = ExcelUtil.getReader(file.getInputStream());
List<ConSaleImportNewDto> data = reader.readAll(ConSaleImportNewDto.class);
reader.close();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd" );
List<ConSaleImportVo> filteredData = data.stream()
.filter(conSaleImportVo -> conSaleImportVo.getOrderCode() != null)
List<ConSaleImportNewDto> filteredData = data.stream()
.filter(conSaleImportVo -> conSaleImportVo.getProjectNo() != null)
.collect(Collectors.toList());
if (CollUtil.isEmpty(filteredData)){
return R.fail("导入没有数据");
@ -214,24 +218,24 @@ public class ConSaleController extends BaseController {
//处理排序问题
List<String> orderCodeList = new ArrayList<>();
filteredData.stream().forEach(item -> {
if (!orderCodeList.contains(item.getOrderCode())){
orderCodeList.add(item.getOrderCode());
if (!orderCodeList.contains(item.getProjectNo())){
orderCodeList.add(item.getProjectNo());
}
});
//之后将顺序翻转过来
Map<String, List<ConSaleImportVo>> conSaleImportMap = filteredData.stream().collect(Collectors.groupingBy(ConSaleImportVo::getOrderCode));
List<ConSaleImportVo> failList= new ArrayList<>();
Map<String, List<ConSaleImportNewDto>> conSaleImportMap = filteredData.stream().collect(Collectors.groupingBy(ConSaleImportNewDto::getProjectNo));
List<ConSaleImportNewDto> failList= new ArrayList<>();
//数据合并
List<ConSaleBo> conSaleBoList = new ArrayList<>();
orderCodeList.forEach(item -> {
String projectCodeKey = item;
List<ConSaleImportVo> salesList = conSaleImportMap.get(projectCodeKey);
List<ConSaleImportNewDto> salesList = conSaleImportMap.get(projectCodeKey);
if (CollectionUtils.isEmpty(salesList)) {
return;
}
ConSaleImportVo datum = salesList.get(0);
ConSaleImportNewDto datum = salesList.get(0);
datum.setStatus("1" );
ConSaleBo conSaleBo = new ConSaleBo();
@ -244,6 +248,23 @@ public class ConSaleController extends BaseController {
//项目执行人
conSaleBo.setProjExecutor(projectExecutor);
//媒体费
String totalAmount = datum.getTotalAmount();
if (org.apache.commons.lang3.StringUtils.isBlank(totalAmount)) {
datum.setStatus("0" );
datum.setNotes("媒体费未填写" );
return;
}
if(totalAmount.equals("#VALUE!")){
totalAmount = "0";
}
totalAmount = totalAmount.replaceAll(",","");
try {
conSaleBo.setContractMoney(MathCompute.formatFourStringToDouble(totalAmount));
} catch (Exception ex) {
conSaleBo.setContractMoney(0.0);
}
String department = datum.getDepartment();
if (org.apache.commons.lang3.StringUtils.isBlank(department)) {
@ -263,7 +284,7 @@ public class ConSaleController extends BaseController {
}
//项目编号
String projectCode = datum.getProjectCode();
String projectCode = datum.getContractNo();
if (org.apache.commons.lang3.StringUtils.isBlank(projectCode)) {
datum.setStatus("0" );
datum.setNotes("项目编号未填写" );
@ -271,7 +292,7 @@ public class ConSaleController extends BaseController {
}
conSaleBo.setContractNumber(projectCode);
//订单编号
String orderCode = datum.getOrderCode();
String orderCode = datum.getProjectNo();
if (org.apache.commons.lang3.StringUtils.isBlank(orderCode)) {
datum.setStatus("0" );
datum.setNotes("订单编号未填写" );
@ -310,7 +331,7 @@ public class ConSaleController extends BaseController {
//合同签订日期
String contractSignDate = datum.getContractSignDate();
String contractSignDate = datum.getSignDate();
if (org.apache.commons.lang3.StringUtils.isBlank(contractSignDate)) {
datum.setStatus("0" );
datum.setNotes("合同签订日期未填写" );
@ -322,13 +343,13 @@ public class ConSaleController extends BaseController {
conSaleBo.setSignTime(date);
} catch (ParseException e) {
datum.setStatus("0" );
datum.setNotes("合同签订日期格式错误,正确格式yyyy/M/d" );
datum.setNotes("合同签订日期格式错误,正确格式yyyy-MM-dd" );
return;
}
//实际开票日期
String actualInvoiceDate = datum.getActualInvoiceDate();
String actualInvoiceDate = datum.getInvoiceDate();
if (org.apache.commons.lang3.StringUtils.isBlank(actualInvoiceDate)) {
}else {
@ -337,7 +358,7 @@ public class ConSaleController extends BaseController {
conSaleBo.setBillingTime(date);
} catch (ParseException e) {
datum.setStatus("0" );
datum.setNotes("实际开票日期格式错误,正确格式yyyy/M/d" );
datum.setNotes("实际开票日期格式错误,正确格式yyyy-MM-dd" );
return;
}
}
@ -381,7 +402,7 @@ public class ConSaleController extends BaseController {
conSaleBo.setSecondName(partyB);
List<ConSaleMediaBo> conSaleMediaBoList = new ArrayList<>();
for (ConSaleImportVo conSaleImportVo : salesList) {
for (ConSaleImportNewDto conSaleImportVo : salesList) {
conSaleImportVo.setStatus("1" );
ConSaleMediaBo conSaleMediaBo = new ConSaleMediaBo();
//城市
@ -472,7 +493,7 @@ public class ConSaleController extends BaseController {
conSaleMediaBo.setMediaPosition(mediaPosition);
//数量
String quantity = conSaleImportVo.getQuantity();
String quantity = conSaleImportVo.getQuantity().toString();
if (org.apache.commons.lang3.StringUtils.isBlank(quantity)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("数量未填写" );
@ -504,7 +525,7 @@ public class ConSaleController extends BaseController {
//刊例价
String listPrice = conSaleImportVo.getListPrice();
String listPrice = conSaleImportVo.getListPrice().toString();
if (org.apache.commons.lang3.StringUtils.isBlank(listPrice)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("刊例价未填写" );
@ -544,7 +565,7 @@ public class ConSaleController extends BaseController {
conSaleMediaBo.setDiscount(discount);
//媒体费
String mediaCost = conSaleImportVo.getMediaCost();
String mediaCost = conSaleImportVo.getMediaFee();
if (org.apache.commons.lang3.StringUtils.isBlank(mediaCost)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("媒体费未填写" );
@ -564,7 +585,7 @@ public class ConSaleController extends BaseController {
//制作费
String productionCost = conSaleImportVo.getProductionCost();
String productionCost = conSaleImportVo.getProductionFee();
if (org.apache.commons.lang3.StringUtils.isBlank(productionCost)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("制作费未填写" );
@ -606,15 +627,12 @@ public class ConSaleController extends BaseController {
conSaleMediaBo.setCompetReverPoit(bidRebate);
//比稿金额
String bidAmount = conSaleImportVo.getBidAmount();
if (org.apache.commons.lang3.StringUtils.isBlank(bidAmount)) {
String bidAmount = conSaleImportVo.getBidRebateAmount();
if (bidAmount == null) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("比稿金额未填写" );
return;
}
if(bidAmount.equals("#VALUE!")){
bidAmount = "0";
}
bidAmount = bidAmount.replace("","").replaceAll(",","");;
try {
@ -626,40 +644,40 @@ public class ConSaleController extends BaseController {
conSaleImportVo.setNotes("比稿金额填写错误" );
return;
}
//
// //YK给群邑返点比例
// String ykToQunYiRebateRate = conSaleImportVo.getYkToQunYiRebateRate();
// if (org.apache.commons.lang3.StringUtils.isBlank(ykToQunYiRebateRate)) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("YK给群邑返点比例未填写" );
// return;
// }
//
// //优客返点给群邑
// String yuKeRebateToQunYi = conSaleImportVo.getYuKeRebateToQunYi();
// if (org.apache.commons.lang3.StringUtils.isBlank(yuKeRebateToQunYi)) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("优客返点给群邑未填写" );
// return;
// }
// //YK给YYX返点比例
// String ykToYYXRebateRate = conSaleImportVo.getYkToYYXRebateRate();
// if (org.apache.commons.lang3.StringUtils.isBlank(ykToYYXRebateRate)) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("YK给YYX返点比例未填写" );
// return;
// }
//
// //优客返点给YYX
// String yuKeRebateToYYX = conSaleImportVo.getYuKeRebateToYYX();
// if (org.apache.commons.lang3.StringUtils.isBlank(yuKeRebateToYYX)) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("优客返点给YYX未填写" );
// return;
// }
//YK给群邑返点比例
String ykToQunYiRebateRate = conSaleImportVo.getYkToQunYiRebateRate();
if (org.apache.commons.lang3.StringUtils.isBlank(ykToQunYiRebateRate)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("YK给群邑返点比例未填写" );
return;
}
//优客返点给群邑
String yuKeRebateToQunYi = conSaleImportVo.getYuKeRebateToQunYi();
if (org.apache.commons.lang3.StringUtils.isBlank(yuKeRebateToQunYi)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("优客返点给群邑未填写" );
return;
}
//YK给YYX返点比例
String ykToYYXRebateRate = conSaleImportVo.getYkToYYXRebateRate();
if (org.apache.commons.lang3.StringUtils.isBlank(ykToYYXRebateRate)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("YK给YYX返点比例未填写" );
return;
}
//优客返点给YYX
String yuKeRebateToYYX = conSaleImportVo.getYuKeRebateToYYX();
if (org.apache.commons.lang3.StringUtils.isBlank(yuKeRebateToYYX)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("优客返点给YYX未填写" );
return;
}
String ykToQunYiRebateRateReplace = ykToQunYiRebateRate.replace("%", "" );
String ykToYYXRebateRateReplace = ykToYYXRebateRate.replace("%", "" );
// String ykToQunYiRebateRateReplace = ykToQunYiRebateRate.replace("%", "" );
// String ykToYYXRebateRateReplace = ykToYYXRebateRate.replace("%", "" );
//其他返点
double otherRebates = 0;
@ -667,37 +685,37 @@ public class ConSaleController extends BaseController {
double otherRebateAmounts = 0;
try {
double ykToQunYiRebateRateDouble = Double.parseDouble(ykToQunYiRebateRateReplace);
double ykToYYXRebateRateDouble = Double.parseDouble(ykToYYXRebateRateReplace);
otherRebates = ykToQunYiRebateRateDouble + ykToYYXRebateRateDouble;
} catch (Exception ex) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("YK给群邑返点比例 or YK给YYX返点比例错误" );
return;
}
String yuKeRebateToQunYiReplace = yuKeRebateToQunYi.replace("", "" ).replaceAll(",","");
String yuKeRebateToYYXReplace = yuKeRebateToYYX.replace("", "" ).replaceAll(",","");
if(yuKeRebateToQunYiReplace.equals("#VALUE!")){
yuKeRebateToQunYiReplace = "0";
}
if(yuKeRebateToYYXReplace.equals("#VALUE!")){
yuKeRebateToYYXReplace = "0";
}
try {
double yuKeRebateToQunYiDouble = Double.parseDouble(yuKeRebateToQunYiReplace);
double yuKeRebateToYYXDouble = Double.parseDouble(yuKeRebateToYYXReplace);
otherRebateAmounts = yuKeRebateToQunYiDouble + yuKeRebateToYYXDouble;
} catch (Exception ex) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("优客返点给群邑 or 优客返点给YYX" );
return;
}
// try {
// double ykToQunYiRebateRateDouble = Double.parseDouble(ykToQunYiRebateRateReplace);
// double ykToYYXRebateRateDouble = Double.parseDouble(ykToYYXRebateRateReplace);
// otherRebates = ykToQunYiRebateRateDouble + ykToYYXRebateRateDouble;
// } catch (Exception ex) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("YK给群邑返点比例 or YK给YYX返点比例错误" );
// return;
// }
//
//
// String yuKeRebateToQunYiReplace = yuKeRebateToQunYi.replace("", "" ).replaceAll(",","");
// String yuKeRebateToYYXReplace = yuKeRebateToYYX.replace("", "" ).replaceAll(",","");
// if(yuKeRebateToQunYiReplace.equals("#VALUE!")){
// yuKeRebateToQunYiReplace = "0";
// }
// if(yuKeRebateToYYXReplace.equals("#VALUE!")){
// yuKeRebateToYYXReplace = "0";
// }
// try {
// double yuKeRebateToQunYiDouble = Double.parseDouble(yuKeRebateToQunYiReplace);
// double yuKeRebateToYYXDouble = Double.parseDouble(yuKeRebateToYYXReplace);
// otherRebateAmounts = yuKeRebateToQunYiDouble + yuKeRebateToYYXDouble;
// } catch (Exception ex) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("优客返点给群邑 or 优客返点给YYX" );
// return;
// }
//补充说明 其实是媒体信息中的备注
String additionalNotes = conSaleImportVo.getAdditionalNotes();
String additionalNotes = conSaleImportVo.getNotes();
conSaleMediaBo.setRemark(additionalNotes);
// conSaleMediaBo.setOtherReverPoit(String.valueOf(otherRebates).concat("%" ));
@ -713,65 +731,65 @@ public class ConSaleController extends BaseController {
List<ConSaleCollectBo> conSaleCollectBoList = new ArrayList<>();
int size = 1;
for (ConSaleImportVo conSaleImportVo : salesList) {
ConSaleCollectBo conSaleCollectBo = new ConSaleCollectBo();
conSaleCollectBo.setTransactionsNumber("" + size + "" );
//每笔订单金额
String orderAmountPerTransaction = conSaleImportVo.getOrderAmountPerTransaction();
if (org.apache.commons.lang3.StringUtils.isBlank(orderAmountPerTransaction)) {
}else {
if(orderAmountPerTransaction.equals("#VALUE!")){
orderAmountPerTransaction = "0";
}
orderAmountPerTransaction = orderAmountPerTransaction.replace("","").replaceAll(",","");
try {
double value = Double.parseDouble(orderAmountPerTransaction);
// conSaleCollectBo.setActualArrivalMoney(value);
conSaleCollectBo.setConventionArrivalMoney(value);
} catch (Exception ex) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("每笔订单金额填写错误" );
return;
}
}
//约定回款日期
String agreedPaymentDate = conSaleImportVo.getAgreedPaymentDate();
if (org.apache.commons.lang3.StringUtils.isBlank(agreedPaymentDate)) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("约定回款日期未填写" );
return;
}
try {
Date date = sdf.parse(agreedPaymentDate);
conSaleCollectBo.setPayTime(date);
} catch (ParseException e) {
conSaleImportVo.setStatus("0" );
conSaleImportVo.setNotes("约定回款日期格式错误,正确格式yyyy/M/d" );
return;
}
//实际回款日期
String actualPaymentDate = conSaleImportVo.getActualPaymentDate();
if (org.apache.commons.lang3.StringUtils.isBlank(actualPaymentDate)) {
}else {
try {
Date date = sdf.parse(actualPaymentDate);
conSaleCollectBo.setArrivalTime(date);
} catch (ParseException e) {
conSaleImportVo.setStatus("0");
conSaleImportVo.setNotes("约定回款日期格式错误,正确格式yyyy/M/d");
return;
}
}
conSaleCollectBoList.add(conSaleCollectBo);
size++;
}
// for (ConSaleImportNewDto conSaleImportVo : salesList) {
// ConSaleCollectBo conSaleCollectBo = new ConSaleCollectBo();
// conSaleCollectBo.setTransactionsNumber("" + size + "" );
// //每笔订单金额
// String orderAmountPerTransaction = conSaleImportVo.getOrderAmountPerTransaction();
// if (org.apache.commons.lang3.StringUtils.isBlank(orderAmountPerTransaction)) {
//
// }else {
// if(orderAmountPerTransaction.equals("#VALUE!")){
// orderAmountPerTransaction = "0";
// }
//
// orderAmountPerTransaction = orderAmountPerTransaction.replace("","").replaceAll(",","");
// try {
// double value = Double.parseDouble(orderAmountPerTransaction);
//// conSaleCollectBo.setActualArrivalMoney(value);
// conSaleCollectBo.setConventionArrivalMoney(value);
// } catch (Exception ex) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("每笔订单金额填写错误" );
// return;
// }
// }
//
//
// //约定回款日期
// String agreedPaymentDate = conSaleImportVo.getAgreedPaymentDate();
// if (org.apache.commons.lang3.StringUtils.isBlank(agreedPaymentDate)) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("约定回款日期未填写" );
// return;
// }
// try {
// Date date = sdf.parse(agreedPaymentDate);
// conSaleCollectBo.setPayTime(date);
// } catch (ParseException e) {
// conSaleImportVo.setStatus("0" );
// conSaleImportVo.setNotes("约定回款日期格式错误,正确格式yyyy/M/d" );
// return;
// }
//
//
// //实际回款日期
// String actualPaymentDate = conSaleImportVo.getActualPaymentDate();
// if (org.apache.commons.lang3.StringUtils.isBlank(actualPaymentDate)) {
//
// }else {
// try {
// Date date = sdf.parse(actualPaymentDate);
// conSaleCollectBo.setArrivalTime(date);
// } catch (ParseException e) {
// conSaleImportVo.setStatus("0");
// conSaleImportVo.setNotes("约定回款日期格式错误,正确格式yyyy/M/d");
// return;
// }
// }
// conSaleCollectBoList.add(conSaleCollectBo);
// size++;
// }
conSaleBo.setConSaleCollectBoList(conSaleCollectBoList);
conSaleBoList.add(conSaleBo);
@ -781,7 +799,7 @@ public class ConSaleController extends BaseController {
AtomicBoolean flag = new AtomicBoolean(true);
conSaleImportMap.forEach((projectCodeKey, salesList) -> {
for (ConSaleImportVo conSaleImportVo : salesList) {
for (ConSaleImportNewDto conSaleImportVo : salesList) {
if (BigDecimal.ZERO.toString().equals(conSaleImportVo.getStatus())){
flag.set(false);
failList.add(conSaleImportVo);

View File

@ -0,0 +1,117 @@
package com.ruoyi.contract.domain.dto;
import cn.hutool.core.annotation.Alias;
import lombok.Data;
import java.io.Serializable;
/**
* 销售合同导入DTO
* 用于接收Hutool Excel读取的数据
*/
@Data
public class ConSaleImportNewDto implements Serializable {
private static final long serialVersionUID = 1L;
@Alias("序号")
private String no;
@Alias("客户名称")
private String clientName;
@Alias("项目编号")
private String contractNo;
@Alias("订单编号")
private String projectNo;
@Alias("媒介部门")
private String department;
@Alias("项目名称")
private String projectName;
@Alias("城市")
private String city;
@Alias("上刊时间")
private String publishStartDate;
@Alias("下刊时间")
private String publishEndDate;
@Alias("周期")
private String publishCycle;
@Alias("媒体类型")
private String mediaType;
@Alias("媒体位置")
private String mediaPosition;
@Alias("数量")
private String quantity;
@Alias("发布频次")
private String frequency;
@Alias("刊例价")
private String listPrice;
@Alias("刊例价单位")
private String listPriceUnit;
@Alias("折扣")
private String discount;
@Alias("订单发布费")
private String mediaFee;
@Alias("订单制作费")
private String productionFee;
@Alias("合同金额")
private String totalAmount;
@Alias("比稿")
private String isBid;
@Alias("比稿返点")
private String bidRebate;
@Alias("比稿返点金额")
private String bidRebateAmount;
@Alias("其他返点1")
private String otherReverPoit = "0";
@Alias("其他返点金额1")
private String otherReverMoney;
@Alias("其他返点2")
private String otherReverPoit2 = "0";
@Alias("其他返点金额2")
private String otherReverMoney2;
@Alias("开票时间")
private String invoiceDate;
@Alias("甲方名称")
private String partyA;
@Alias("乙方名称")
private String partyB;
@Alias("签订日期")
private String signDate;
@Alias("补充说明")
private String notes;
@Alias("状态")
private String status;
@Alias("项目执行人")
private String projectExecutor;
}