Commit 99a6729f5603bc20cd57f8d4cd1dac676211d667

Authored by 房远帅
1 parent a8e3ad2e

库存合同:生产订货单审核通过后才能锁价

1 package com.lframework.xingyun.sc.bo.contract; 1 package com.lframework.xingyun.sc.bo.contract;
2 2
  3 +import com.baomidou.mybatisplus.annotation.TableField;
3 import com.fasterxml.jackson.annotation.JsonFormat; 4 import com.fasterxml.jackson.annotation.JsonFormat;
4 import com.lframework.starter.common.constants.StringPool; 5 import com.lframework.starter.common.constants.StringPool;
5 import com.lframework.starter.web.core.bo.BaseBo; 6 import com.lframework.starter.web.core.bo.BaseBo;
@@ -480,6 +481,12 @@ public class GetContractDistributorStandardBo extends BaseBo<ContractDistributor @@ -480,6 +481,12 @@ public class GetContractDistributorStandardBo extends BaseBo<ContractDistributor
480 private Boolean canSplit; 481 private Boolean canSplit;
481 482
482 /** 483 /**
  484 + * 是否可锁价
  485 + */
  486 + @ApiModelProperty(value = "是否可锁价")
  487 + private Boolean canPriceLock;
  488 +
  489 + /**
483 * 创建人 490 * 创建人
484 */ 491 */
485 @ApiModelProperty(value = "创建人") 492 @ApiModelProperty(value = "创建人")
@@ -240,6 +240,12 @@ public class QueryContractDistributorStandardBo extends BaseBo<ContractDistribut @@ -240,6 +240,12 @@ public class QueryContractDistributorStandardBo extends BaseBo<ContractDistribut
240 @ApiModelProperty(value = "是否可拆分") 240 @ApiModelProperty(value = "是否可拆分")
241 private Boolean canSplit; 241 private Boolean canSplit;
242 242
  243 + /**
  244 + * 是否可锁价
  245 + */
  246 + @ApiModelProperty(value = "是否可锁价")
  247 + private Boolean canPriceLock;
  248 +
243 249
244 public QueryContractDistributorStandardBo() { 250 public QueryContractDistributorStandardBo() {
245 251
@@ -369,6 +369,12 @@ public class ContractDistributorStandard extends BaseEntity implements BaseDto { @@ -369,6 +369,12 @@ public class ContractDistributorStandard extends BaseEntity implements BaseDto {
369 private Boolean canSplit; 369 private Boolean canSplit;
370 370
371 /** 371 /**
  372 + * 是否可锁价
  373 + */
  374 + @TableField(exist = false)
  375 + private Boolean canPriceLock;
  376 +
  377 + /**
372 * 剩余锁规数量 378 * 剩余锁规数量
373 */ 379 */
374 @TableField(exist = false) 380 @TableField(exist = false)
@@ -216,6 +216,7 @@ public class ContractDistributorStandardServiceImpl extends @@ -216,6 +216,7 @@ public class ContractDistributorStandardServiceImpl extends
216 216
217 List<ContractDistributorStandard> datas = getBaseMapper().query(vo); 217 List<ContractDistributorStandard> datas = getBaseMapper().query(vo);
218 CollectionUtils.emptyIfNull(datas).forEach(data -> data.setCanSplit(isCanSplit(data))); 218 CollectionUtils.emptyIfNull(datas).forEach(data -> data.setCanSplit(isCanSplit(data)));
  219 + fillCanPriceLock(datas);
219 return datas; 220 return datas;
220 } 221 }
221 222
@@ -236,6 +237,7 @@ public class ContractDistributorStandardServiceImpl extends @@ -236,6 +237,7 @@ public class ContractDistributorStandardServiceImpl extends
236 } 237 }
237 data.setCanEdit(canEdit); 238 data.setCanEdit(canEdit);
238 fillRemainingQuantity(data); 239 fillRemainingQuantity(data);
  240 + fillCanPriceLock(data);
239 241
240 // 获取当前人员的待办任务数据 242 // 获取当前人员的待办任务数据
241 List<FlowTaskDto> flowTaskList = flowTaskWrapperMapper.queryTodoList(new QueryTodoTaskListVo(), SecurityUtil.getCurrentUser().getId()); 243 List<FlowTaskDto> flowTaskList = flowTaskWrapperMapper.queryTodoList(new QueryTodoTaskListVo(), SecurityUtil.getCurrentUser().getId());
@@ -305,6 +307,102 @@ public class ContractDistributorStandardServiceImpl extends @@ -305,6 +307,102 @@ public class ContractDistributorStandardServiceImpl extends
305 return true; 307 return true;
306 } 308 }
307 309
  310 + /**
  311 + * 批量回填是否可锁价
  312 + *
  313 + * @param datas 合同列表
  314 + */
  315 + private void fillCanPriceLock(List<ContractDistributorStandard> datas) {
  316 + if (CollectionUtils.isEmpty(datas)) {
  317 + return;
  318 + }
  319 +
  320 + List<ContractDistributorStandard> inventoryContracts = CollectionUtils.emptyIfNull(datas).stream()
  321 + .filter(Objects::nonNull)
  322 + .filter(this::isInventoryContract)
  323 + .collect(Collectors.toList());
  324 + if (CollectionUtils.isEmpty(inventoryContracts)) {
  325 + CollectionUtils.emptyIfNull(datas).stream()
  326 + .filter(Objects::nonNull)
  327 + .forEach(data -> data.setCanPriceLock(false));
  328 + return;
  329 + }
  330 +
  331 + Set<String> contractIds = inventoryContracts.stream()
  332 + .map(ContractDistributorStandard::getId)
  333 + .filter(StringUtils::isNotBlank)
  334 + .collect(Collectors.toSet());
  335 + Set<String> approvedProductionOrderContractIds = Collections.emptySet();
  336 + if (CollectionUtils.isNotEmpty(contractIds)) {
  337 + Wrapper<PurchaseOrderInfo> orderInfoWrapper = Wrappers.lambdaQuery(PurchaseOrderInfo.class)
  338 + .in(PurchaseOrderInfo::getContractId, contractIds)
  339 + .eq(PurchaseOrderInfo::getType, "PRODUCTION")
  340 + .eq(PurchaseOrderInfo::getExamineStatus, "PASS");
  341 + approvedProductionOrderContractIds = CollectionUtils.emptyIfNull(purchaseOrderInfoService.list(orderInfoWrapper)).stream()
  342 + .map(PurchaseOrderInfo::getContractId)
  343 + .filter(StringUtils::isNotBlank)
  344 + .collect(Collectors.toSet());
  345 + }
  346 +
  347 + Set<String> finalApprovedProductionOrderContractIds = approvedProductionOrderContractIds;
  348 + CollectionUtils.emptyIfNull(datas).stream()
  349 + .filter(Objects::nonNull)
  350 + .forEach(data -> data.setCanPriceLock(
  351 + isCanPriceLock(data, finalApprovedProductionOrderContractIds.contains(data.getId()))));
  352 + }
  353 +
  354 + /**
  355 + * 回填是否可锁价
  356 + *
  357 + * @param data 合同
  358 + */
  359 + private void fillCanPriceLock(ContractDistributorStandard data) {
  360 + if (data == null || StringUtils.isBlank(data.getId())) {
  361 + return;
  362 + }
  363 +
  364 + boolean hasApprovedProductionOrder = false;
  365 + if (isInventoryContract(data)) {
  366 + Wrapper<PurchaseOrderInfo> orderInfoWrapper = Wrappers.lambdaQuery(PurchaseOrderInfo.class)
  367 + .eq(PurchaseOrderInfo::getContractId, data.getId())
  368 + .eq(PurchaseOrderInfo::getType, "PRODUCTION")
  369 + .eq(PurchaseOrderInfo::getExamineStatus, "PASS");
  370 + hasApprovedProductionOrder = CollectionUtils.isNotEmpty(purchaseOrderInfoService.list(orderInfoWrapper));
  371 + }
  372 + data.setCanPriceLock(isCanPriceLock(data, hasApprovedProductionOrder));
  373 + }
  374 +
  375 + /**
  376 + * 判断是否可锁价
  377 + *
  378 + * @param data 合同
  379 + * @param hasApprovedProductionOrder 是否存在已审核通过的生产订货单
  380 + * @return 是否可锁价
  381 + */
  382 + private boolean isCanPriceLock(ContractDistributorStandard data, boolean hasApprovedProductionOrder) {
  383 + if (data == null || !isInventoryContract(data)) {
  384 + return false;
  385 + }
  386 + if (Boolean.TRUE.equals(data.getPriceSpecLocked())) {
  387 + return false;
  388 + }
  389 + if (!CustomerDevelopStatus.PASS.name().equals(data.getFormalApproved())) {
  390 + return false;
  391 + }
  392 + return hasApprovedProductionOrder;
  393 + }
  394 +
  395 + /**
  396 + * 判断是否为库存合同
  397 + *
  398 + * @param data 合同
  399 + * @return 是否为库存合同
  400 + */
  401 + private boolean isInventoryContract(ContractDistributorStandard data) {
  402 + return data != null && ("DIST_STOCK_CONTRACT".equals(data.getType())
  403 + || "INTL_INVENTORY_AGMT".equals(data.getType()));
  404 + }
  405 +
308 @OpLog(type = OtherOpLogType.class, name = "新增合同,ID:{}", params = {"#id"}) 406 @OpLog(type = OtherOpLogType.class, name = "新增合同,ID:{}", params = {"#id"})
309 @Transactional(rollbackFor = Exception.class) 407 @Transactional(rollbackFor = Exception.class)
310 @Override 408 @Override