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,6 +4,7 @@ import lombok.*;
4 import lombok.experimental.SuperBuilder; 4 import lombok.experimental.SuperBuilder;
5 5
6 import java.io.Serializable; 6 import java.io.Serializable;
  7 +import java.time.LocalDateTime;
7 8
8 /** 9 /**
9 * 订单基础信息表(OrderBaseInfo)实体类 10 * 订单基础信息表(OrderBaseInfo)实体类
@@ -26,6 +27,8 @@ public class OrderBaseInfoVO implements Serializable { @@ -26,6 +27,8 @@ public class OrderBaseInfoVO implements Serializable {
26 */ 27 */
27 private String invoiceNo; 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,5 +50,7 @@ public class ProjectBaseInfoVO implements Serializable {
50 50
51 private BigDecimal actualExchangeRate; 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,6 +34,7 @@ import com.order.erp.service.order.OrderFieldLockRecordService;
34 import org.springframework.beans.BeanUtils; 34 import org.springframework.beans.BeanUtils;
35 import org.springframework.beans.factory.annotation.Autowired; 35 import org.springframework.beans.factory.annotation.Autowired;
36 import org.springframework.stereotype.Service; 36 import org.springframework.stereotype.Service;
  37 +import org.springframework.transaction.annotation.Transactional;
37 38
38 import javax.annotation.Resource; 39 import javax.annotation.Resource;
39 import java.math.BigDecimal; 40 import java.math.BigDecimal;
@@ -65,6 +66,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl<OrderCostInfoMapper, O @@ -65,6 +66,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl<OrderCostInfoMapper, O
65 private SystemSettingService systemSettingService; 66 private SystemSettingService systemSettingService;
66 67
67 @Override 68 @Override
  69 + @Transactional(rollbackFor = Exception.class)
68 public ServerResult edit(OrderCostInfoVO vo) { 70 public ServerResult edit(OrderCostInfoVO vo) {
69 Long id = vo.getOrderId(); 71 Long id = vo.getOrderId();
70 Optional<OrderCostInfoDO> orderCostInfoDOOpt = this.lambdaQuery() 72 Optional<OrderCostInfoDO> orderCostInfoDOOpt = this.lambdaQuery()
@@ -78,6 +80,26 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -78,6 +80,26 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
78 orderCostInfoDO = orderCostInfoDOOpt.get(); 80 orderCostInfoDO = orderCostInfoDOOpt.get();
79 BeanUtil.copyProperties(vo, orderCostInfoDO, CopyOptions.create().ignoreNullValue()); 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 return ServerResult.success(this.saveOrUpdate(orderCostInfoDO)); 103 return ServerResult.success(this.saveOrUpdate(orderCostInfoDO));
82 } 104 }
83 105
@@ -137,6 +159,18 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -137,6 +159,18 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
137 })); 159 }));
138 List<InnerProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> { 160 List<InnerProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> {
139 OrderCostInfoVO orderCostInfo = record.getOrderCostInfo(); 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 InnerProfitDetailVO vo = InnerProfitDetailVO.builder() 174 InnerProfitDetailVO vo = InnerProfitDetailVO.builder()
141 .orderId(record.getId()) 175 .orderId(record.getId())
142 .customerCode(record.getCustomerCode()) 176 .customerCode(record.getCustomerCode())
@@ -149,14 +183,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -149,14 +183,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
149 .productionDepartmentTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getProductionDepartmentTotalPrice()) 183 .productionDepartmentTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getProductionDepartmentTotalPrice())
150 .productionDepartmentPredictPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionDepartmentPredictPrice()) 184 .productionDepartmentPredictPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionDepartmentPredictPrice())
151 .productionActualPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getProductionActualPrice()) 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 .build(); 187 .build();
161 188
162 if (Objects.nonNull(vo.getProductionDepartmentPredictPrice()) 189 if (Objects.nonNull(vo.getProductionDepartmentPredictPrice())
@@ -222,8 +249,21 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -222,8 +249,21 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
222 } 249 }
223 })); 250 }));
224 BigDecimal exchangeRate = systemSettingService.getExchangeRate(); 251 BigDecimal exchangeRate = systemSettingService.getExchangeRate();
  252 +
225 List<BusinessProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> { 253 List<BusinessProfitDetailVO> innerProfitRatioResultVOs = records.stream().map(record -> {
226 OrderCostInfoVO orderCostInfo = record.getOrderCostInfo(); 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 BusinessProfitDetailVO vo = BusinessProfitDetailVO.builder() 267 BusinessProfitDetailVO vo = BusinessProfitDetailVO.builder()
228 .orderId(record.getId()) 268 .orderId(record.getId())
229 .customerCode(record.getCustomerCode()) 269 .customerCode(record.getCustomerCode())
@@ -235,12 +275,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O @@ -235,12 +275,7 @@ public class OrderCostInfoServiceImpl extends ServiceImpl&lt;OrderCostInfoMapper, O
235 .packetPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketPrice()) 275 .packetPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketPrice())
236 .packetTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketTotalPrice()) 276 .packetTotalPrice(Objects.isNull(record.getProfitAnalysisInfo()) ? null : record.getProfitAnalysisInfo().getPacketTotalPrice())
237 .packetActualRmbTotalPrice(Objects.isNull(record.getOrderCostInfo()) ? null : record.getOrderCostInfo().getPacketActualRmbTotalPrice()) 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 .build(); 279 .build();
245 if (Objects.nonNull(vo.getPacketTotalPrice())) { 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,6 +18,7 @@ import com.order.erp.config.DataScope;
18 import com.order.erp.domain.ApplyStatusEnum; 18 import com.order.erp.domain.ApplyStatusEnum;
19 import com.order.erp.domain.OrderLockFieldEnum; 19 import com.order.erp.domain.OrderLockFieldEnum;
20 import com.order.erp.domain.ProjectApplyTypeEnum; 20 import com.order.erp.domain.ProjectApplyTypeEnum;
  21 +import com.order.erp.domain.ProjectFieldEditType;
21 import com.order.erp.domain.dto.BaseDO; 22 import com.order.erp.domain.dto.BaseDO;
22 import com.order.erp.domain.dto.SystemSettingDO; 23 import com.order.erp.domain.dto.SystemSettingDO;
23 import com.order.erp.domain.dto.order.OrderBaseInfoDO; 24 import com.order.erp.domain.dto.order.OrderBaseInfoDO;
@@ -91,6 +92,41 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -91,6 +92,41 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
91 } else { 92 } else {
92 projectBaseInfoDO = BeanUtil.copyProperties(vo, ProjectBaseInfoDO.class); 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 return ServerResult.success(this.saveOrUpdate(projectBaseInfoDO)); 130 return ServerResult.success(this.saveOrUpdate(projectBaseInfoDO));
95 } 131 }
96 132
@@ -98,7 +134,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -98,7 +134,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
98 public ServerResult applyEditFileds(ProjectBaseInfoLockFieldVO vo) { 134 public ServerResult applyEditFileds(ProjectBaseInfoLockFieldVO vo) {
99 List<ProjectApplyDO> applyDOS = projectFieldLockApplyService.list(new LambdaQueryWrapper<ProjectApplyDO>() 135 List<ProjectApplyDO> applyDOS = projectFieldLockApplyService.list(new LambdaQueryWrapper<ProjectApplyDO>()
100 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) 136 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN)
101 - .eq(ProjectApplyDO::getType,vo.getType()) 137 + .eq(ProjectApplyDO::getType, vo.getType())
102 .eq(ProjectApplyDO::getProjectNoPrefix, vo.getProjectNoPrefix()) 138 .eq(ProjectApplyDO::getProjectNoPrefix, vo.getProjectNoPrefix())
103 .eq(ProjectApplyDO::getApplyUserId, dataScope.getLoginUserId()) 139 .eq(ProjectApplyDO::getApplyUserId, dataScope.getLoginUserId())
104 .eq(ProjectApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT.getStatus())); 140 .eq(ProjectApplyDO::getStatus, ApplyStatusEnum.WAIT_AUDIT.getStatus()));
@@ -132,7 +168,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -132,7 +168,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
132 public ServerResult pageProjectLockFieldApply(QueryProjectLockFieldVO vo) { 168 public ServerResult pageProjectLockFieldApply(QueryProjectLockFieldVO vo) {
133 Page<ProjectApplyDO> page = projectFieldLockApplyService.lambdaQuery() 169 Page<ProjectApplyDO> page = projectFieldLockApplyService.lambdaQuery()
134 .eq(BaseDO::getEnableFlag, Constant.ENABLE_TEN) 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 .eq(ProjectApplyDO::getStatus, StringUtils.isBlank(vo.getStatus()) ? ApplyStatusEnum.WAIT_AUDIT.getStatus() : vo.getStatus()) 172 .eq(ProjectApplyDO::getStatus, StringUtils.isBlank(vo.getStatus()) ? ApplyStatusEnum.WAIT_AUDIT.getStatus() : vo.getStatus())
137 .orderByDesc(ProjectApplyDO::getCreateTime) 173 .orderByDesc(ProjectApplyDO::getCreateTime)
138 .page(new Page<>(vo.getPage(), vo.getPageSize())); 174 .page(new Page<>(vo.getPage(), vo.getPageSize()));
@@ -168,11 +204,11 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -168,11 +204,11 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
168 } 204 }
169 ProjectBaseInfoLockFieldVO applyLockFieldVO = JSONObject.parseObject(applyDO.getFields(), ProjectBaseInfoLockFieldVO.class); 205 ProjectBaseInfoLockFieldVO applyLockFieldVO = JSONObject.parseObject(applyDO.getFields(), ProjectBaseInfoLockFieldVO.class);
170 ProjectBaseInfoLockFieldVO recordLockFieldVO = JSONObject.parseObject(Optional.ofNullable(recordDO.getFields()).orElse("{}"), ProjectBaseInfoLockFieldVO.class); 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 ProjectBaseInfoLockFieldVO projectBaseInfoLockFieldVO = Optional.ofNullable(recordLockFieldVO).orElse(new ProjectBaseInfoLockFieldVO()); 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 recordLockFieldVO = projectBaseInfoLockFieldVO; 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 recordLockFieldVO.setProjectInnerProfitInfoStartTime(applyLockFieldVO.getProjectInnerProfitInfoStartTime()); 212 recordLockFieldVO.setProjectInnerProfitInfoStartTime(applyLockFieldVO.getProjectInnerProfitInfoStartTime());
177 recordLockFieldVO.setProjectInnerProfitInfoEndTime(applyLockFieldVO.getProjectInnerProfitInfoEndTime()); 213 recordLockFieldVO.setProjectInnerProfitInfoEndTime(applyLockFieldVO.getProjectInnerProfitInfoEndTime());
178 } 214 }
@@ -245,7 +281,6 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -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,15 +391,19 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
356 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> { 391 return orderBaseInfoDOSGroupByProjectNoPre.entrySet().stream().map(entry -> {
357 ProjectBaseInfoDO projectBaseInfoDO = no2ProjectInfoMap.get(entry.getKey()); 392 ProjectBaseInfoDO projectBaseInfoDO = no2ProjectInfoMap.get(entry.getKey());
358 List<OrderInfoResultVO> details = entry.getValue(); 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 InnerProfitInfoVO innerProfitInfoVO = InnerProfitInfoVO.builder() 402 InnerProfitInfoVO innerProfitInfoVO = InnerProfitInfoVO.builder()
360 .customerCode(details.get(0).getCustomerCode()) 403 .customerCode(details.get(0).getCustomerCode())
361 .projectNoPrefix(entry.getKey()) 404 .projectNoPrefix(entry.getKey())
362 .productionDepartment(details.get(0).getProductionDepartment()) 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 .build(); 407 .build();
369 408
370 //数量 409 //数量
@@ -445,7 +484,8 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -445,7 +484,8 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
445 484
446 //hod时间差 485 //hod时间差
447 LocalDateTime earliest = Optional.ofNullable(no2ProjectInfoMap.get(entry.getKey())).map(ProjectBaseInfoDO::getProjectInnerProfitInfoStartTime).orElse(null); 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 innerProfitInfoVO.setProduceStartTime(earliest); 489 innerProfitInfoVO.setProduceStartTime(earliest);
450 innerProfitInfoVO.setProduceEndTime(latest); 490 innerProfitInfoVO.setProduceEndTime(latest);
451 SystemSettingDO systemSettingDO = systemSettingDOSMap.get(innerProfitInfoVO.getCustomerCode()); 491 SystemSettingDO systemSettingDO = systemSettingDOSMap.get(innerProfitInfoVO.getCustomerCode());
@@ -470,16 +510,17 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -470,16 +510,17 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
470 && Objects.nonNull(latest)) { 510 && Objects.nonNull(latest)) {
471 Duration duration = Duration.between(earliest, latest); 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 if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(ratioValue) 515 if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(ratioValue)
476 && Objects.nonNull(innerProfitInfoVO.getPredictRatio()) 516 && Objects.nonNull(innerProfitInfoVO.getPredictRatio())
477 && innerProfitInfoVO.getPredictRatio().compareTo(BigDecimal.valueOf(1.05)) < 0) { 517 && innerProfitInfoVO.getPredictRatio().compareTo(BigDecimal.valueOf(1.05)) < 0) {
478 //内部生产提成¥ 518 //内部生产提成¥
  519 + String finalRatioValue = ratioValue;
479 innerProfitInfoVO.setInnerProductionCommission( 520 innerProfitInfoVO.setInnerProductionCommission(
480 details.stream() 521 details.stream()
481 .map(detail -> BigDecimal.valueOf(detail.getOrderCount()) 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 .reduce(BigDecimal.ZERO, BigDecimal::add) 524 .reduce(BigDecimal.ZERO, BigDecimal::add)
484 ); 525 );
485 } 526 }
@@ -657,8 +698,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -657,8 +698,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
657 698
658 //hod时间差 699 //hod时间差
659 LocalDateTime earliest = details.stream() 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 .min(Comparator.naturalOrder()) 702 .min(Comparator.naturalOrder())
663 .orElse(null); 703 .orElse(null);
664 LocalDateTime latest = details.stream() 704 LocalDateTime latest = details.stream()
@@ -710,7 +750,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -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 if (Objects.nonNull(spainRatio) 754 if (Objects.nonNull(spainRatio)
715 && Objects.nonNull(businessProfitInfoVO.getCustomerRmbTotalPrice())) { 755 && Objects.nonNull(businessProfitInfoVO.getCustomerRmbTotalPrice())) {
716 //西班牙提成 756 //西班牙提成
@@ -944,7 +984,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -944,7 +984,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
944 String projectStartTime = Optional.ofNullable(vo.getProduceStartTime()).map(dateTimeFormatter::format).orElse("-"); 984 String projectStartTime = Optional.ofNullable(vo.getProduceStartTime()).map(dateTimeFormatter::format).orElse("-");
945 String projectEndTime = Optional.ofNullable(vo.getProduceEndTime()).map(dateTimeFormatter::format).orElse("-"); 985 String projectEndTime = Optional.ofNullable(vo.getProduceEndTime()).map(dateTimeFormatter::format).orElse("-");
946 String duration = (vo.getProduceStartTime() != null && vo.getProduceEndTime() != null) 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 createMergedRow(sheet, cellStyle, 6, 7, 0, 1, ""); 989 createMergedRow(sheet, cellStyle, 6, 7, 0, 1, "");
950 createMergedRow(sheet, cellStyle, 6, 7, 2, 3, "生产起止时间"); 990 createMergedRow(sheet, cellStyle, 6, 7, 2, 3, "生产起止时间");
@@ -978,7 +1018,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe @@ -978,7 +1018,7 @@ public class ProjectBaseInfoServiceImpl extends ServiceImpl&lt;ProjectBaseInfoMappe
978 1018
979 // 第六部分:毛利润 1019 // 第六部分:毛利润
980 createMergedRow(sheet, cellStyle, 16, 17, 0, 3, "内部生产毛利润"); 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 createMergedRow(sheet, cellStyle, 16, 16, 6, 7, "事前毛利润"); 1022 createMergedRow(sheet, cellStyle, 16, 16, 6, 7, "事前毛利润");
983 createMergedRow(sheet, cellStyle, 16, 16, 8, 9, "事前毛利率"); 1023 createMergedRow(sheet, cellStyle, 16, 16, 8, 9, "事前毛利率");
984 createMergedRow(sheet, cellStyle, 17, 17, 6, 7, Optional.ofNullable(vo.getBeforeGrossProfit()).orElse(BigDecimal.ZERO).toString()); 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,7 +63,7 @@ spring:
63 username: root 63 username: root
64 redis: 64 redis:
65 database: 0 65 database: 0
66 - host: 47.104.8.35 66 + host: 39.108.227.113
67 lettuce: 67 lettuce:
68 pool: 68 pool:
69 max-active: 2000 69 max-active: 2000
@@ -72,7 +72,7 @@ spring: @@ -72,7 +72,7 @@ spring:
72 min-idle: 3 72 min-idle: 3
73 time-between-eviction-runs: 100 73 time-between-eviction-runs: 100
74 password: '' 74 password: ''
75 - port: 6380 75 + port: 6379
76 timeout: 2000 76 timeout: 2000
77 mail: 77 mail:
78 # 配置 SMTP 服务器地址 78 # 配置 SMTP 服务器地址