|
@@ -4,30 +4,34 @@ import cn.hutool.core.codec.Base64;
|
|
|
import cn.hutool.core.collection.CollUtil;
|
|
|
import cn.hutool.core.io.FileUtil;
|
|
|
import cn.hutool.core.util.StrUtil;
|
|
|
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
|
|
|
import com.ruoyi.common.utils.DateUtils;
|
|
|
import com.ruoyi.common.utils.WordUtil;
|
|
|
import com.ruoyi.common.utils.office.doc.CommonDocUtils;
|
|
|
import com.ruoyi.framework.config.RuoYiConfig;
|
|
|
+import com.ruoyi.project.business.domain.TqBargainPrice;
|
|
|
import com.ruoyi.project.business.domain.TqQuotation;
|
|
|
import com.ruoyi.project.business.domain.bo.quotation.QuotationExportBO;
|
|
|
import com.ruoyi.project.business.domain.vo.quotation.ElevatorExportVO;
|
|
|
import com.ruoyi.project.business.domain.vo.quotation.QuotationExportVO;
|
|
|
import com.ruoyi.project.business.domain.vo.quotation.WParam;
|
|
|
-import com.ruoyi.project.business.domain.vo.quotation.WPrice;
|
|
|
import com.ruoyi.project.business.mapper.quotation.TqQuotationMapper;
|
|
|
import com.ruoyi.project.business.service.ITbCurrencyService;
|
|
|
import com.ruoyi.project.business.service.ITcProjectService;
|
|
|
import com.ruoyi.project.business.service.quotation.IQuotationConstantService;
|
|
|
import com.ruoyi.project.business.service.quotation.IQuotationExportService;
|
|
|
+import com.ruoyi.project.business.service.quotation.ITqBargainPriceService;
|
|
|
import com.ruoyi.project.business.service.quotation.ITqSpecificationService;
|
|
|
import java.io.File;
|
|
|
import java.io.IOException;
|
|
|
import java.math.BigDecimal;
|
|
|
+import java.math.RoundingMode;
|
|
|
import java.util.ArrayList;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.List;
|
|
|
import java.util.Map;
|
|
|
+import java.util.Objects;
|
|
|
import java.util.stream.Collectors;
|
|
|
import javax.servlet.http.HttpServletResponse;
|
|
|
import lombok.RequiredArgsConstructor;
|
|
@@ -45,6 +49,8 @@ public class QuotationExportServiceImpl
|
|
|
|
|
|
public final ITbCurrencyService tbCurrencyService;
|
|
|
|
|
|
+ public final ITqBargainPriceService tqBargainPriceService;
|
|
|
+
|
|
|
public final ITqSpecificationService specificationService;
|
|
|
|
|
|
@Override
|
|
@@ -58,6 +64,7 @@ public class QuotationExportServiceImpl
|
|
|
List<ElevatorExportVO> specificationList = specificationService.listElevatorExport(quotationIdList);
|
|
|
Map<Long, List<ElevatorExportVO>> elevatorMap = specificationList.stream()
|
|
|
.collect(Collectors.groupingBy(ElevatorExportVO::getQuotationId));
|
|
|
+
|
|
|
// 多个报价单文件
|
|
|
List<File> fileList = new ArrayList<>();
|
|
|
for (Long quotationId : quotationIdList) {
|
|
@@ -67,65 +74,78 @@ public class QuotationExportServiceImpl
|
|
|
List<ElevatorExportVO> elevatorDataList = elevatorMap.get(quotationId);
|
|
|
|
|
|
Map<String, Object> map = new HashMap<>();
|
|
|
- List<Map<String, Object>> elevatorList = new ArrayList<>();
|
|
|
// 首页
|
|
|
map.put(QUOTATION_NO, getStr(quotation.getQuotationNo()));
|
|
|
+ // 项目
|
|
|
map.put(PROJECT, getStr(quotation.getProjectName()));
|
|
|
+ // 地址
|
|
|
map.put(ADDRESS, getStr(quotation.getAddress()));
|
|
|
+ // 客户
|
|
|
map.put(CLIENT, getStr(quotation.getClient()));
|
|
|
+ // 邮箱
|
|
|
map.put(EMAIL, getStr(quotation.getEmail()));
|
|
|
+ // 日期
|
|
|
map.put(DATE, getStr(DateUtils.parseDateToStr(MM_DD_YYYY, quotation.getSubmitDate())));
|
|
|
- map.put(IS_ELEVATOR, true);
|
|
|
+ // 运费
|
|
|
+ map.put(FREIGHT_PRICE, formatNum(quotation.getFreightPrice()));
|
|
|
+ // 总价
|
|
|
+ map.put(PRICE_TOTAL, formatNum(quotation.getFinalPrice()));
|
|
|
+ // 币种汇率
|
|
|
+ BigDecimal divide1 = BigDecimal.ONE.divide(quotation.getExchangeRate(), 2, RoundingMode.HALF_UP);
|
|
|
+ map.put(CURRENCY, formatNum2(divide1));
|
|
|
|
|
|
- File file = new CommonDocUtils().loadFromClasspath("/wordTemplate/KW2600模版.docx")
|
|
|
- .replaceData(map).genFile(getStr(quotation.getQuotationNo()));
|
|
|
- fileList.add(file);
|
|
|
- WordUtil.exportZip(response, fileList);
|
|
|
+ // TODO: 2024/7/31
|
|
|
+ // 目的地
|
|
|
+ map.put(DESTINATION, "unknown");
|
|
|
+ // 集装箱信息
|
|
|
+ map.put(CONTAINER, "unknown");
|
|
|
|
|
|
- if (true) {
|
|
|
- return;
|
|
|
+ // 议价数据(折扣)
|
|
|
+ // 整单折扣没存,需要算
|
|
|
+ map.put(DISCOUNT, "0%");
|
|
|
+ List<TqBargainPrice> list = tqBargainPriceService.list(
|
|
|
+ Wrappers.<TqBargainPrice>lambdaQuery().eq(TqBargainPrice::getQuotationId, quotationId)
|
|
|
+ .orderByDesc(TqBargainPrice::getId));
|
|
|
+ if (CollUtil.isNotEmpty(list)) {
|
|
|
+ TqBargainPrice tqBargainPrice = list.get(0);
|
|
|
+ BigDecimal discountBasicPrice = tqBargainPrice.getAcceptPrice().subtract(quotation.getOptionalPrice());
|
|
|
+ BigDecimal divide = discountBasicPrice.divide(quotation.getOriginalBasicPrice(), 2, RoundingMode.DOWN);
|
|
|
+ map.put(DISCOUNT, formatNum(divide.multiply(new BigDecimal(100))) + "%");
|
|
|
}
|
|
|
|
|
|
// 电梯价格表
|
|
|
- List<WPrice> priceList = new ArrayList<>();
|
|
|
for (ElevatorExportVO elevator : elevatorDataList) {
|
|
|
- // 规格
|
|
|
- String equipment = "";
|
|
|
- String elevatorCode = elevator.getElevatorCode();
|
|
|
- if (StringUtils.isNotBlank(elevatorCode)) {
|
|
|
- String[] split = elevatorCode.split(COMMA);
|
|
|
- if (split.length == 1) {
|
|
|
- equipment = split[0];
|
|
|
- } else if (split.length == 2) {
|
|
|
- equipment = elevatorCode;
|
|
|
- } else if (split.length > 2) {
|
|
|
- equipment = split[0] + TILDE + split[split.length - 1];
|
|
|
- }
|
|
|
- }
|
|
|
- // 电梯类型
|
|
|
- priceList.add(new WPrice(equipment,
|
|
|
- elevator.getElevatorTypeName(),
|
|
|
- elevator.getSpecification(),
|
|
|
- elevator.getElevatorNumber().toString(),
|
|
|
- quotation.getCurrencyName(),
|
|
|
- format.format(elevator.getPrice()),
|
|
|
- format.format(
|
|
|
- elevator.getPrice().multiply(BigDecimal.valueOf(elevator.getElevatorNumber())))));
|
|
|
- // 电梯参数
|
|
|
- elevatorList.add(getMap(elevator));
|
|
|
+ // 电梯规格单价
|
|
|
+ map.put(UNIT_PRICE, formatNum(elevator.getPrice()));
|
|
|
+ // 电梯规格数量
|
|
|
+ map.put(QTY, elevator.getElevatorNumber());
|
|
|
+ // 电梯规格总价
|
|
|
+ BigDecimal multiply = elevator.getPrice().multiply(new BigDecimal(elevator.getElevatorNumber()));
|
|
|
+ map.put(T_PRICE, formatNum(multiply));
|
|
|
|
|
|
- return;
|
|
|
+ map.put(SPECIFICATION, getStr("1111111"));
|
|
|
+ map.put(PRODUCT_TYPE, getStr("1111111"));
|
|
|
+ map.put(STAND, getStr("1111111"));
|
|
|
+ map.put(LOAD, getStr("1111111"));
|
|
|
+ map.put(P, getStr("1111111"));
|
|
|
+ map.put(SPEED, getStr("1111111"));
|
|
|
+ map.put(FLOORS, getStr("1111111"));
|
|
|
+ map.put(STOPS, getStr("1111111"));
|
|
|
+ map.put(DOORS, getStr("1111111"));
|
|
|
+ map.put(MAIN_FLOOR, getStr("1111111"));
|
|
|
+ map.put(CABIN, getStr("1111111"));
|
|
|
+ map.put(DOOR, getStr("1111111"));
|
|
|
+ map.put(SHAFT, getStr("1111111"));
|
|
|
+ map.put(PIT, getStr("1111111"));
|
|
|
+ map.put(OH, getStr("1111111"));
|
|
|
+ map.put(TR, getStr("1111111"));
|
|
|
+
|
|
|
+ // 电梯参数
|
|
|
+ File file = new CommonDocUtils().loadFromClasspath("/wordTemplate/KW2600模版.docx")
|
|
|
+ .replaceData(map).genFile(getStr(quotation.getQuotationNo()));
|
|
|
+ fileList.add(file);
|
|
|
}
|
|
|
- map.put(PRICE_LIST, priceList);
|
|
|
- map.put(FREIGHT_PRICE, quotation.getFreightPrice());
|
|
|
- map.put(PRICE_TOTAL, quotation.getFinalPrice());
|
|
|
- // 电梯参数
|
|
|
- map.put(DATA_LIST, elevatorList);
|
|
|
- // 测试图片
|
|
|
- String path = "/profile/upload/2024/07/02/狮子_20240702165437A001.jpg";
|
|
|
- map.put("testPic", getPicBase64(path));
|
|
|
- map.put("needPic", false);
|
|
|
- fileList.add(WordUtil.genFile(map, QUOTATION_FTL));
|
|
|
+
|
|
|
}
|
|
|
WordUtil.exportZip(response, fileList);
|
|
|
}
|
|
@@ -134,6 +154,14 @@ public class QuotationExportServiceImpl
|
|
|
return StrUtil.isBlank(str) ? " " : str;
|
|
|
}
|
|
|
|
|
|
+ private static String formatNum(Object decimal) {
|
|
|
+ return Objects.isNull(decimal) ? " " : format.format(decimal);
|
|
|
+ }
|
|
|
+
|
|
|
+ private static String formatNum2(Object decimal) {
|
|
|
+ return Objects.isNull(decimal) ? " " : format2.format(decimal);
|
|
|
+ }
|
|
|
+
|
|
|
private static String getPicBase64(String path) {
|
|
|
String encode = "";
|
|
|
if (StringUtils.isBlank(path)) {
|