Commit 1b7ae743dd761726c009a22b69711c63a825f692

Authored by 曾国涛
1 parent 32e5b9d5

feat(order): 新增订单和项目基础信息锁定功能

- 在 OrderCostInfoServiceImpl 和 ProjectBaseInfoServiceImpl 中添加字段锁定逻辑
- 在 OrderBaseInfoVO 和 ProjectBaseInfoVO 中添加 createTime 字段
- 更新 application-test.yml 中的 Redis配置
- 新增 ProjectFieldEditType 枚举类
src/main/java/com/order/erp/domain/ProjectFieldEditType.java 0 → 100644
  1 +package com.order.erp.domain;
  2 +
  3 +import com.order.erp.domain.vo.order.BusinessProfitInfoVO;
  4 +import lombok.AllArgsConstructor;
  5 +import lombok.Getter;
  6 +import lombok.NoArgsConstructor;
  7 +
  8 +/**
  9 + * @author zgt
  10 + * @project order-erp
  11 + * @description
  12 + * @date 2025/3/27
  13 + */
  14 +@Getter
  15 +@AllArgsConstructor
  16 +@NoArgsConstructor
  17 +public enum ProjectFieldEditType {
  18 + InnerProfitInfo("内部表编辑"),
  19 + BusinessProfitInfo("业务利润表编辑");
  20 + private String Text;
  21 +}
... ...
src/main/java/com/order/erp/domain/vo/order/OrderBaseInfoVO.java
... ... @@ -4,6 +4,7 @@ import lombok.*;
4 4 import lombok.experimental.SuperBuilder;
5 5  
6 6 import java.io.Serializable;
  7 +import java.time.LocalDateTime;
7 8  
8 9 /**
9 10 * 订单基础信息表(OrderBaseInfo)实体类
... ... @@ -26,6 +27,8 @@ public class OrderBaseInfoVO implements Serializable {
26 27 */
27 28 private String invoiceNo;
28 29  
  30 + private LocalDateTime createTime;
  31 +
29 32 /**
30 33 * 生产科对账单号 如果要在首页添加生产科对账单号列数,就需要在这里加上。
31 34 */
... ...
src/main/java/com/order/erp/domain/vo/order/ProjectBaseInfoVO.java
... ... @@ -50,5 +50,7 @@ public class ProjectBaseInfoVO implements Serializable {
50 50  
51 51 private BigDecimal actualExchangeRate;
52 52  
  53 + private String fieldType;
  54 +
53 55  
54 56 }
... ...
src/main/java/com/order/erp/service/order/impl/OrderCostInfoServiceImpl.java
... ... @@ -34,6 +34,7 @@ import com.order.erp.service.order.OrderFieldLockRecordService;
34 34 import org.springframework.beans.BeanUtils;
35 35 import org.springframework.beans.factory.annotation.Autowired;
36 36 import org.springframework.stereotype.Service;
  37 +import org.springframework.transaction.annotation.Transactional;
37 38  
38 39 import javax.annotation.Resource;
39 40 import java.math.BigDecimal;
... ... @@ -65,6 +66,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl<OrderCostInfoMapper, O
65 66 private SystemSettingService systemSettingService;
66 67  
67 68 @Override
  69 + @Transactional(rollbackFor = Exception.class)
68 70 public ServerResult edit(OrderCostInfoVO vo) {
69 71 Long id = vo.getOrderId();
70 72 Optional<OrderCostInfoDO> orderCostInfoDOOpt = this.lambdaQuery()
... ... @@ -78,6 +80,26 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
78 80 orderCostInfoDO = orderCostInfoDOOpt.get();
79 81 BeanUtil.copyProperties(vo, orderCostInfoDO, CopyOptions.create().ignoreNullValue());
80 82 }
  83 + Optional<OrderCostFieldLockRecord> orderCostFieldLockRecordOpt = orderCostFieldLockRecordService
  84 + .lambdaQuery()
  85 + .eq(OrderCostFieldLockRecord::getOrderId, id)
  86 + .last(" limit 1 ")
  87 + .oneOpt();
  88 + OrderCostFieldLockRecord orderCostFieldLockRecord = orderCostFieldLockRecordOpt.orElse(
  89 + OrderCostFieldLockRecord.builder()
  90 + .orderId(id)
  91 + .userId(dataScope.getLoginUserId())
  92 + .build()
  93 + );
  94 + OrderCostInfolockFieldVO originOrderCostInfolockFieldVO = JSONObject.parseObject(Optional.ofNullable(orderCostFieldLockRecord.getFields()).orElse("{}"), OrderCostInfolockFieldVO.class);
  95 + if(Objects.nonNull(vo.getPacketActualRmbTotalPrice())){
  96 + originOrderCostInfolockFieldVO.setPacketActualRmbTotalPrice(OrderLockFieldEnum.LOCKED.name());
  97 + }else if(Objects.nonNull(vo.getProductionActualPrice())||Objects.nonNull(vo.getProductionDepartmentPredictPrice())) {
  98 + originOrderCostInfolockFieldVO.setProductionActualPrice(OrderLockFieldEnum.LOCKED.name());
  99 + originOrderCostInfolockFieldVO.setProductionDepartmentPredictPrice(OrderLockFieldEnum.LOCKED.name());
  100 + }
  101 + orderCostFieldLockRecord.setFields(JSONObject.toJSONString(originOrderCostInfolockFieldVO));
  102 + orderCostFieldLockRecordService.saveOrUpdate(orderCostFieldLockRecord);
81 103 return ServerResult.success(this.saveOrUpdate(orderCostInfoDO));
82 104 }
83 105  
... ... @@ -137,6 +159,18 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
137 159 }));
138 160 List<InnerProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> {
139 161 OrderCostInfoVO orderCostInfo = record.getOrderCostInfo();
  162 + OrderCostInfolockFieldVO lockFields = Optional.ofNullable(orderId2fieldMapMap.get(record.getId()))
  163 + .orElse(new OrderCostInfolockFieldVO()
  164 + );
  165 + if(Objects.isNull(lockFields.getPacketActualRmbTotalPrice())){
  166 + lockFields.setPacketActualRmbTotalPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getPacketActualRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  167 + }
  168 + if(Objects.isNull(lockFields.getProductionActualPrice())){
  169 + lockFields.setProductionActualPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionActualPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  170 + }
  171 + if(Objects.isNull(lockFields.getProductionDepartmentPredictPrice())){
  172 + lockFields.setProductionDepartmentPredictPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  173 + }
140 174 InnerProfitDetailVO vo = InnerProfitDetailVO.builder()
141 175 .orderId(record.getId())
142 176 .customerCode(record.getCustomerCode())
... ... @@ -149,14 +183,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
149 183 .productionDepartmentTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getProductionDepartmentTotalPrice())
150 184 .productionDepartmentPredictPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionDepartmentPredictPrice())
151 185 .productionActualPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionActualPrice())
152   - .lockFields(Optional.ofNullable(orderId2fieldMapMap.get(record.getId()))
153   - .orElse(OrderCostInfolockFieldVO
154   - .builder()
155   - .packetActualRmbTotalPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getPacketActualRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
156   - .productionActualPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getProductionActualPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
157   - .productionDepartmentPredictPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
158   - .build()
159   - ))
  186 + .lockFields(lockFields)
160 187 .build();
161 188  
162 189 if (Objects.nonNull(vo.getProductionDepartmentPredictPrice())
... ... @@ -222,8 +249,21 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
222 249 }
223 250 }));
224 251 BigDecimal exchangeRate = systemSettingService.getExchangeRate();
  252 +
225 253 List<BusinessProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> {
226 254 OrderCostInfoVO orderCostInfo = record.getOrderCostInfo();
  255 + OrderCostInfolockFieldVO lockFields = Optional.ofNullable(orderId2fieldMapMap.get(record.getId())).orElse(
  256 + new OrderCostInfolockFieldVO()
  257 + );
  258 + if(Objects.isNull(lockFields.getPacketActualRmbTotalPrice())){
  259 + lockFields.setPacketActualRmbTotalPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getPacketActualRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  260 + }
  261 + if(Objects.isNull(lockFields.getProductionActualPrice())){
  262 + lockFields.setProductionActualPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionActualPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  263 + }
  264 + if(Objects.isNull(lockFields.getProductionDepartmentPredictPrice())){
  265 + lockFields.setProductionDepartmentPredictPrice(Objects.isNull(orderCostInfo) || Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  266 + }
227 267 BusinessProfitDetailVO vo = BusinessProfitDetailVO.builder()
228 268 .orderId(record.getId())
229 269 .customerCode(record.getCustomerCode())
... ... @@ -235,12 +275,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
235 275 .packetPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketPrice())
236 276 .packetTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketTotalPrice())
237 277 .packetActualRmbTotalPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getPacketActualRmbTotalPrice())
238   - .lockFields(Optional.ofNullable(orderId2fieldMapMap.get(record.getId())).orElse(OrderCostInfolockFieldVO.builder()
239   - .packetActualRmbTotalPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getPacketActualRmbTotalPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
240   - .productionActualPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getProductionActualPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
241   - .productionDepartmentPredictPrice(Objects.isNull(orderCostInfo)||Objects.isNull(orderCostInfo.getProductionDepartmentPredictPrice()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
242   - .build()
243   - ))
  278 + .lockFields(lockFields)
244 279 .build();
245 280 if (Objects.nonNull(vo.getPacketTotalPrice())) {
246 281 //包装费用合计 = 包装费合计*汇率
... ...
src/main/java/com/order/erp/service/order/impl/ProjectBaseInfoServiceImpl.java
... ... @@ -18,6 +18,7 @@ import com.order.erp.config.DataScope;
18 18 import com.order.erp.domain.ApplyStatusEnum;
19 19 import com.order.erp.domain.OrderLockFieldEnum;
20 20 import com.order.erp.domain.ProjectApplyTypeEnum;
  21 +import com.order.erp.domain.ProjectFieldEditType;
21 22 import com.order.erp.domain.dto.BaseDO;
22 23 import com.order.erp.domain.dto.SystemSettingDO;
23 24 import com.order.erp.domain.dto.order.OrderBaseInfoDO;
... ... @@ -91,6 +92,41 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
91 92 } else {
92 93 projectBaseInfoDO = BeanUtil.copyProperties(vo, ProjectBaseInfoDO.class);
93 94 }
  95 + ProjectFieldLockRecord recordDO = projectionFieldLockRecordService.getOne(new LambdaQueryWrapper<ProjectFieldLockRecord>()
  96 + .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
  97 + .eq(ProjectFieldLockRecord::getProjectNoPrefix, projectNoPrefix)
  98 + .eq(ProjectFieldLockRecord::getUserId, dataScope.getLoginUserId())
  99 + .orderByDesc(ProjectFieldLockRecord::getId)
  100 + .last("limit 1"));
  101 + if (Objects.isNull(recordDO)) {
  102 + recordDO = ProjectFieldLockRecord.builder()
  103 + .projectNoPrefix(projectNoPrefix)
  104 + .userId(dataScope.getLoginUserId())
  105 + .build();
  106 + }
  107 + ProjectBaseInfoLockFieldVO recordLockFieldVO = JSONObject.parseObject(Optional.ofNullable(recordDO.getFields()).orElse("{}"), ProjectBaseInfoLockFieldVO.class);
  108 + if (Objects.nonNull(vo.getProjectStartTime())||
  109 + Objects.nonNull(vo.getProjectEndTime())||
  110 + Objects.nonNull(vo.getDevelopmentCopyRmbTotalPrice())||
  111 + Objects.nonNull(vo.getSpainPaidRmbCommission())||
  112 + Objects.nonNull(vo.getPaidRmbCommission())||
  113 + Objects.nonNull(vo.getActualExchangeRate())) {
  114 + recordLockFieldVO.setProjectStartTime("LOCKED");
  115 + recordLockFieldVO.setProjectEndTime("LOCKED");
  116 + recordLockFieldVO.setDevelopmentCopyRmbTotalPrice("LOCKED");
  117 + recordLockFieldVO.setSpainPaidRmbCommission("LOCKED");
  118 + recordLockFieldVO.setPaidRmbCommission("LOCKED");
  119 + recordLockFieldVO.setActualExchangeRate("LOCKED");
  120 + } else if (Objects.nonNull(vo.getProjectInnerProfitInfoStartTime()) || Objects.nonNull(vo.getProjectInnerProfitInfoEndTime())) {
  121 + recordLockFieldVO.setProjectInnerProfitInfoStartTime("LOCKED");
  122 + recordLockFieldVO.setProjectInnerProfitInfoEndTime("LOCKED");
  123 + }
  124 + recordDO.setFields(JSONObject.toJSONString(recordLockFieldVO));
  125 + if (Objects.isNull(recordDO.getId())) {
  126 + projectionFieldLockRecordService.save(recordDO);
  127 + } else {
  128 + projectionFieldLockRecordService.updateById(recordDO);
  129 + }
94 130 return ServerResult.success(this.saveOrUpdate(projectBaseInfoDO));
95 131 }
96 132  
... ... @@ -98,7 +134,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
98 134 public ServerResult applyEditFileds(ProjectBaseInfoLockFieldVO vo) {
99 135 List<ProjectApplyDO> applyDOS = projectFieldLockApplyService.list(new LambdaQueryWrapper<ProjectApplyDO>()
100 136 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
101   - .eq(ProjectApplyDO::getType,vo.getType())
  137 + .eq(ProjectApplyDO::getType, vo.getType())
102 138 .eq(ProjectApplyDO::getProjectNoPrefix, vo.getProjectNoPrefix())
103 139 .eq(ProjectApplyDO::getApplyUserId, dataScope.getLoginUserId())
104 140 .eq(ProjectApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT.getStatus()));
... ... @@ -132,7 +168,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
132 168 public ServerResult pageProjectLockFieldApply(QueryProjectLockFieldVO vo) {
133 169 Page<ProjectApplyDO> page = projectFieldLockApplyService.lambdaQuery()
134 170 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
135   - .eq(Objects.nonNull(vo.getType()),ProjectApplyDO::getType, vo.getType())
  171 + .eq(Objects.nonNull(vo.getType()), ProjectApplyDO::getType, vo.getType())
136 172 .eq(ProjectApplyDO::getStatus, StringUtils.isBlank(vo.getStatus()) ? ApplyStatusEnum.WAIT_AUDIT.getStatus() : vo.getStatus())
137 173 .orderByDesc(ProjectApplyDO::getCreateTime)
138 174 .page(new Page<>(vo.getPage(), vo.getPageSize()));
... ... @@ -168,11 +204,11 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
168 204 }
169 205 ProjectBaseInfoLockFieldVO applyLockFieldVO = JSONObject.parseObject(applyDO.getFields(), ProjectBaseInfoLockFieldVO.class);
170 206 ProjectBaseInfoLockFieldVO recordLockFieldVO = JSONObject.parseObject(Optional.ofNullable(recordDO.getFields()).orElse("{}"), ProjectBaseInfoLockFieldVO.class);
171   - if(ProjectApplyTypeEnum.FIELD_EDIT_APPLY.name().equals(applyDO.getType())){
  207 + if (ProjectApplyTypeEnum.FIELD_EDIT_APPLY.name().equals(applyDO.getType())) {
172 208 ProjectBaseInfoLockFieldVO projectBaseInfoLockFieldVO = Optional.ofNullable(recordLockFieldVO).orElse(new ProjectBaseInfoLockFieldVO());
173   - BeanUtil.copyProperties(applyLockFieldVO, projectBaseInfoLockFieldVO, CopyOptions.create().setIgnoreProperties("projectInnerProfitInfoStartTime","projectInnerProfitInfoEndTime").ignoreNullValue());
  209 + BeanUtil.copyProperties(applyLockFieldVO, projectBaseInfoLockFieldVO, CopyOptions.create().setIgnoreProperties("projectInnerProfitInfoStartTime", "projectInnerProfitInfoEndTime").ignoreNullValue());
174 210 recordLockFieldVO = projectBaseInfoLockFieldVO;
175   - }else if(ProjectApplyTypeEnum.INNER_PROFIT_FIELD_EDIT_APPLY.name().equals(applyDO.getType())){
  211 + } else if (ProjectApplyTypeEnum.INNER_PROFIT_FIELD_EDIT_APPLY.name().equals(applyDO.getType())) {
176 212 recordLockFieldVO.setProjectInnerProfitInfoStartTime(applyLockFieldVO.getProjectInnerProfitInfoStartTime());
177 213 recordLockFieldVO.setProjectInnerProfitInfoEndTime(applyLockFieldVO.getProjectInnerProfitInfoEndTime());
178 214 }
... ... @@ -245,7 +281,6 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
245 281 }
246 282  
247 283  
248   -
249 284 /**
250 285 * 查询订单列表
251 286 */
... ... @@ -356,15 +391,19 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
356 391 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> {
357 392 ProjectBaseInfoDO projectBaseInfoDO = no2ProjectInfoMap.get(entry.getKey());
358 393 List<OrderInfoResultVO> details = entry.getValue();
  394 + ProjectBaseInfoLockFieldVO lockFields = Optional.ofNullable(prjectNo2LockRecordMap.get(entry.getKey())).orElse(
  395 + new ProjectBaseInfoLockFieldVO());
  396 + if(Objects.isNull(lockFields.getProjectInnerProfitInfoStartTime())){
  397 + lockFields.setProjectInnerProfitInfoStartTime(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getProjectInnerProfitInfoStartTime()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  398 + }
  399 + if(Objects.isNull(lockFields.getProjectInnerProfitInfoEndTime())){
  400 + lockFields.setProjectInnerProfitInfoEndTime(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getProjectInnerProfitInfoEndTime()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name());
  401 + }
359 402 InnerProfitInfoVO innerProfitInfoVO = InnerProfitInfoVO.builder()
360 403 .customerCode(details.get(0).getCustomerCode())
361 404 .projectNoPrefix(entry.getKey())
362 405 .productionDepartment(details.get(0).getProductionDepartment())
363   - .lockFields(Optional.ofNullable(prjectNo2LockRecordMap.get(entry.getKey())).orElse(
364   - ProjectBaseInfoLockFieldVO.builder()
365   - .projectInnerProfitInfoStartTime(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getProjectInnerProfitInfoStartTime()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
366   - .projectInnerProfitInfoEndTime(Objects.isNull(projectBaseInfoDO) || Objects.isNull(projectBaseInfoDO.getProjectInnerProfitInfoEndTime()) ? OrderLockFieldEnum.UN_LOCKED.name() : OrderLockFieldEnum.LOCKED.name())
367   - .build()))
  406 + .lockFields(lockFields)
368 407 .build();
369 408  
370 409 //数量
... ... @@ -445,7 +484,8 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
445 484  
446 485 //hod时间差
447 486 LocalDateTime earliest = Optional.ofNullable(no2ProjectInfoMap.get(entry.getKey())).map(ProjectBaseInfoDO::getProjectInnerProfitInfoStartTime).orElse(null);
448   - LocalDateTime latest = Optional.ofNullable(no2ProjectInfoMap.get(entry.getKey())).map(ProjectBaseInfoDO::getProjectInnerProfitInfoEndTime).orElse(null);;
  487 + LocalDateTime latest = Optional.ofNullable(no2ProjectInfoMap.get(entry.getKey())).map(ProjectBaseInfoDO::getProjectInnerProfitInfoEndTime).orElse(null);
  488 + ;
449 489 innerProfitInfoVO.setProduceStartTime(earliest);
450 490 innerProfitInfoVO.setProduceEndTime(latest);
451 491 SystemSettingDO systemSettingDO = systemSettingDOSMap.get(innerProfitInfoVO.getCustomerCode());
... ... @@ -470,16 +510,17 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
470 510 && Objects.nonNull(latest)) {
471 511 Duration duration = Duration.between(earliest, latest);
472 512 //内部生产固定成本¥
473   - innerProfitInfoVO.setInnerProductionFixedCost(BigDecimal.valueOf((duration.toDays()+1) * Double.parseDouble(fixCostValue)));
  513 + innerProfitInfoVO.setInnerProductionFixedCost(BigDecimal.valueOf((duration.toDays() + 1) * Double.parseDouble(fixCostValue)));
474 514 }
475 515 if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(ratioValue)
476 516 && Objects.nonNull(innerProfitInfoVO.getPredictRatio())
477 517 && innerProfitInfoVO.getPredictRatio().compareTo(BigDecimal.valueOf(1.05)) < 0) {
478 518 //内部生产提成¥
  519 + String finalRatioValue = ratioValue;
479 520 innerProfitInfoVO.setInnerProductionCommission(
480 521 details.stream()
481 522 .map(detail -> BigDecimal.valueOf(detail.getOrderCount())
482   - .multiply(BigDecimal.valueOf(Optional.ofNullable(detail.getProfitAnalysisInfo()).map(OrderProfitAnalysisVO::getCustomerRmbPrice).orElse(0.0))))
  523 + .multiply(BigDecimal.valueOf(Optional.ofNullable(finalRatioValue).map(Double::valueOf).orElse(0.0))))
483 524 .reduce(BigDecimal.ZERO, BigDecimal::add)
484 525 );
485 526 }
... ... @@ -657,8 +698,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
657 698  
658 699 //hod时间差
659 700 LocalDateTime earliest = details.stream()
660   - .map(OrderInfoResultVO::getOrderHodTime)
661   - .map(hodTime -> LocalDateTime.parse(hodTime, DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss")))
  701 + .map(OrderInfoResultVO::getCreateTime)
662 702 .min(Comparator.naturalOrder())
663 703 .orElse(null);
664 704 LocalDateTime latest = details.stream()
... ... @@ -710,7 +750,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
710 750 }
711 751 }
712 752 //固定成本
713   - businessProfitInfoVO.setFixedCost(BigDecimal.valueOf((between+1) * Double.parseDouble(fixCostValue)).setScale(2, RoundingMode.HALF_UP));
  753 + businessProfitInfoVO.setFixedCost(BigDecimal.valueOf((between + 1) * Double.parseDouble(fixCostValue)).setScale(2, RoundingMode.HALF_UP));
714 754 if (Objects.nonNull(spainRatio)
715 755 && Objects.nonNull(businessProfitInfoVO.getCustomerRmbTotalPrice())) {
716 756 //西班牙提成
... ... @@ -944,7 +984,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
944 984 String projectStartTime = Optional.ofNullable(vo.getProduceStartTime()).map(dateTimeFormatter::format).orElse("-");
945 985 String projectEndTime = Optional.ofNullable(vo.getProduceEndTime()).map(dateTimeFormatter::format).orElse("-");
946 986 String duration = (vo.getProduceStartTime() != null && vo.getProduceEndTime() != null)
947   - ? String.valueOf(Duration.between(vo.getProduceStartTime(), vo.getProduceEndTime()).toDays()+1)
  987 + ? String.valueOf(Duration.between(vo.getProduceStartTime(), vo.getProduceEndTime()).toDays() + 1)
948 988 : "-";
949 989 createMergedRow(sheet, cellStyle, 6, 7, 0, 1, "");
950 990 createMergedRow(sheet, cellStyle, 6, 7, 2, 3, "生产起止时间");
... ... @@ -978,7 +1018,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
978 1018  
979 1019 // 第六部分:毛利润
980 1020 createMergedRow(sheet, cellStyle, 16, 17, 0, 3, "内部生产毛利润");
981   - createMergedRow(sheet, cellStyle, 16, 17, 4, 5, "¥" + Optional.ofNullable(vo.getBeforeGrossProfit()).orElse(BigDecimal.ZERO));
  1021 + createMergedRow(sheet, cellStyle, 16, 17, 4, 5, "¥" + Optional.ofNullable(vo.getGrossProfit()).orElse(BigDecimal.ZERO));
982 1022 createMergedRow(sheet, cellStyle, 16, 16, 6, 7, "事前毛利润");
983 1023 createMergedRow(sheet, cellStyle, 16, 16, 8, 9, "事前毛利率");
984 1024 createMergedRow(sheet, cellStyle, 17, 17, 6, 7, Optional.ofNullable(vo.getBeforeGrossProfit()).orElse(BigDecimal.ZERO).toString());
... ...
src/main/resources/application-test.yml
... ... @@ -63,7 +63,7 @@ spring:
63 63 username: root
64 64 redis:
65 65 database: 0
66   - host: 47.104.8.35
  66 + host: 39.108.227.113
67 67 lettuce:
68 68 pool:
69 69 max-active: 2000
... ... @@ -72,7 +72,7 @@ spring:
72 72 min-idle: 3
73 73 time-between-eviction-runs: 100
74 74 password: ''
75   - port: 6380
  75 + port: 6379
76 76 timeout: 2000
77 77 mail:
78 78 # 配置 SMTP 服务器地址
... ...