Browse Source

拆单任务重建中

dist.1.3.0
chenlong 2 months ago
parent
commit
712ef9acb2
  1. 25
      blade-biz-common/src/main/java/org/springblade/common/constant/order/OrderSplitStateConstant.java
  2. 24
      blade-biz-common/src/main/java/org/springblade/common/constant/order/OrderSplitTaskStateConstant.java
  3. 24
      blade-biz-common/src/main/java/org/springblade/common/constant/orderpackage/OrderPackageSplitStateConstant.java
  4. 139
      blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderAllTaskEntity.java
  5. 11
      blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderDetailEntity.java
  6. 22
      blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderTaskEntity.java
  7. 7
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSplitOrderAllTaskMapper.java
  8. 13
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSplitOrderAllTaskService.java
  9. 9
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSplitOrderTaskService.java
  10. 18
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSplitOrderAllTaskServiceImpl.java
  11. 357
      blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSplitOrderTaskServiceImpl.java

25
blade-biz-common/src/main/java/org/springblade/common/constant/order/OrderSplitStateConstant.java

@ -0,0 +1,25 @@
package org.springblade.common.constant.order;
import lombok.Getter;
/**
* 拆单状态
* 状态1=未完成2=已完成3=已撤回
*/
@Getter
public enum OrderSplitStateConstant {
InProgress("未完成",1),
finish("已完成",2),
revoke("已撤回",3);
private final String name;
private final Integer value;
OrderSplitStateConstant(String name, Integer value) {
this.name = name;
this.value = value;
}
}

24
blade-biz-common/src/main/java/org/springblade/common/constant/order/OrderSplitTaskStateConstant.java

@ -0,0 +1,24 @@
package org.springblade.common.constant.order;
import lombok.Getter;
/**
* 拆单总任务状态
* 状态0=未完成1=已完成
*/
@Getter
public enum OrderSplitTaskStateConstant {
InProgress("未完成",0),
finish("已完成",1);
private final String name;
private final Integer value;
OrderSplitTaskStateConstant(String name, Integer value) {
this.name = name;
this.value = value;
}
}

24
blade-biz-common/src/main/java/org/springblade/common/constant/orderpackage/OrderPackageSplitStateConstant.java

@ -4,31 +4,19 @@ import lombok.Getter;
/**
* 包件拆单明细的状态
* 状态1=待拆单2=已拆单3=驳回拆单4=已撤回
* 状态1=已拆单2=已撤回
*/
@Getter
public enum OrderPackageSplitStateConstant {
finish("已拆单",1),
cancel("已撤回",2);
wait("待拆单",1),
finish("已拆单",2),
reject("驳回拆单",3),
cancel("已撤回",4);
private final String name;
private final Integer value;
private String name;
private Integer value;
private OrderPackageSplitStateConstant(String name, Integer value) {
this.name = name;
this.value = value;
}
public void setName(String name) {
OrderPackageSplitStateConstant(String name, Integer value) {
this.name = name;
}
public void setValue(Integer value) {
this.value = value;
}
}

139
blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderAllTaskEntity.java

@ -0,0 +1,139 @@
/*
* Copyright (c) 2018-2028, Chill Zhuang All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* Neither the name of the dreamlu.net developer nor the names of its
* contributors may be used to endorse or promote products derived from
* this software without specific prior written permission.
* Author: Chill 庄骞 (smallchill@163.com)
*/
package com.logpm.distribution.entity;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.springblade.core.tenant.mp.TenantEntity;
import javax.validation.constraints.NotBlank;
/**
* 常规订单拆单总任务 实体类
*
* @author TJJ
* @since 2023-09-11
*/
@Data
@TableName("logpm_distribution_split_order_all_task")
@ApiModel(value = "logpmDistributionSplitOrderAllTask对象", description = "常规订单拆单总任务表")
@EqualsAndHashCode(callSuper = true)
public class DistributionSplitOrderAllTaskEntity extends TenantEntity {
private static final long serialVersionUID = 1L;
/**
* 主键
*/
@JsonSerialize(using = ToStringSerializer.class)
@ApiModelProperty(value = "主键")
@TableId(value = "id", type = IdType.ASSIGN_ID)
private Long id;
/**
* 预留1
*/
@ApiModelProperty(value = "预留1")
private String reserve1;
/**
* 预留2
*/
@ApiModelProperty(value = "预留2")
private String reserve2;
/**
* 预留3
*/
@ApiModelProperty(value = "预留3")
private String reserve3;
/**
* 预留4
*/
@ApiModelProperty(value = "预留4")
private String reserve4;
/**
* 预留5
*/
@ApiModelProperty(value = "预留5")
private String reserve5;
/**
* 拆单总任务单号
*/
@ApiModelProperty(value = "总任务单号")
private String no;
/**
* 被拆订单ID
*/
@NotBlank(message = "被拆订单ID不能为空")
@ApiModelProperty(value = "被拆订单ID")
private Long stockArticleId;
/**
* 被拆订单
*/
@ApiModelProperty(value = "被拆订单")
private String orderCode;
/**
* 商场名称
*/
@ApiModelProperty(value = "商场名称")
private String mallName;
/**
* 状态0=未完成1=已完成
*/
@ApiModelProperty(value = "状态:0=未完成,1=已完成")
private Integer state;
/**
* 审核人
*/
@ApiModelProperty(value = "审核人")
private Long finishUser;
/**
* 审核人名字
*/
@ApiModelProperty(value = "审核人名字")
private String finishUsername;
/**
* 审核时间
*/
@ApiModelProperty(value = "审核时间")
private String finishTime;
/**
* 拆单数量
*/
@ApiModelProperty(value = "拆单数量")
private Integer number;
/**
* 拆单件数
*/
@ApiModelProperty(value = "拆单件数")
private Integer orderPackageNumber;
}

11
blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderDetailEntity.java

@ -87,9 +87,9 @@ public class DistributionSplitOrderDetailEntity extends TenantEntity {
private String orderPackageCode;
/**
* 状态1=待拆单2=已拆单3=驳回拆单4=已撤回
* 状态1=已拆单2=已撤回
*/
@ApiModelProperty(value = "状态:1=待拆单,2=已拆单,3=驳回拆单,4=已撤回")
@ApiModelProperty(value = "状态:1=已拆单,2=已撤回")
private Integer state;
/**
@ -103,4 +103,11 @@ public class DistributionSplitOrderDetailEntity extends TenantEntity {
*/
@ApiModelProperty(value = "撤回人员")
private String cancelUsername;
/**
* 拆单总任务ID
*/
@ApiModelProperty(value = "拆单总任务ID")
private Long splitOrderAllTaskId;
}

22
blade-service-api/logpm-distribution-api/src/main/java/com/logpm/distribution/entity/DistributionSplitOrderTaskEntity.java

@ -77,6 +77,18 @@ public class DistributionSplitOrderTaskEntity extends TenantEntity {
@ApiModelProperty(value = "预留5")
private String reserve5;
/**
* 拆单总任务ID
*/
@ApiModelProperty(value = "拆单总任务ID")
private Long splitOrderAllTaskId;
/**
* 拆单总任务单号
*/
@ApiModelProperty(value = "拆单总任务单号")
private String splitOrderAllTaskNo;
/**
* 被拆订单ID
*/
@ -97,9 +109,9 @@ public class DistributionSplitOrderTaskEntity extends TenantEntity {
private String mallName;
/**
* 状态1=待审核2=同意拆单3=驳回拆单4=撤回
* 状态1=未完成2=已完成3=撤回
*/
@ApiModelProperty(value = "状态:1=待审核,2=同意拆单,3=驳回拆单,4=撤回")
@ApiModelProperty(value = "状态:1=未完成,2=已完成,3=已撤回")
private Integer state;
/**
@ -126,6 +138,12 @@ public class DistributionSplitOrderTaskEntity extends TenantEntity {
@ApiModelProperty(value = "审核时间")
private String reviewTime;
/**
* 任务拆单数量
*/
@ApiModelProperty(value = "任务拆单数量")
private Integer taskNumber;
/**
* 拆单数量
*/

7
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/mapper/DistributionSplitOrderAllTaskMapper.java

@ -0,0 +1,7 @@
package com.logpm.distribution.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.logpm.distribution.entity.DistributionSplitOrderAllTaskEntity;
public interface DistributionSplitOrderAllTaskMapper extends BaseMapper<DistributionSplitOrderAllTaskEntity> {
}

13
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSplitOrderAllTaskService.java

@ -0,0 +1,13 @@
package com.logpm.distribution.service;
import com.logpm.distribution.entity.DistributionSplitOrderAllTaskEntity;
import org.springblade.core.mp.base.BaseService;
/**
* 拆单总任务详情接口
*/
public interface IDistributionSplitOrderAllTaskService extends BaseService<DistributionSplitOrderAllTaskEntity> {
}

9
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/IDistributionSplitOrderTaskService.java

@ -28,6 +28,13 @@ public interface IDistributionSplitOrderTaskService extends BaseService<Distribu
*/
R<String> createTask(DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity, List<String> packageCodeList);
/**
* 批量创建任务
* @param distributionSplitOrderTaskList
* @return
*/
R<String> batchCreateTask(List<DistributionSplitOrderTaskEntity> distributionSplitOrderTaskList);
/**
* 更新任务
* @param distributionSplitOrderTaskEntity
@ -55,7 +62,7 @@ public interface IDistributionSplitOrderTaskService extends BaseService<Distribu
* @param taskId
* @return
*/
R<String> reviewTask(Long taskId);
R<String> reviewTask(Long taskId, Integer reviewStatus, String reason);
/**
* 获取任务详情

18
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSplitOrderAllTaskServiceImpl.java

@ -0,0 +1,18 @@
package com.logpm.distribution.service.impl;
import com.logpm.distribution.entity.DistributionSplitOrderAllTaskEntity;
import com.logpm.distribution.entity.DistributionSplitOrderDetailEntity;
import com.logpm.distribution.mapper.DistributionSplitOrderAllTaskMapper;
import com.logpm.distribution.mapper.DistributionSplitOrderDetailMapper;
import com.logpm.distribution.service.IDistributionSplitOrderAllTaskService;
import com.logpm.distribution.service.IDistributionSplitOrderDetailService;
import groovy.util.logging.Slf4j;
import lombok.AllArgsConstructor;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springframework.stereotype.Service;
@AllArgsConstructor
@Slf4j
@Service
public class DistributionSplitOrderAllTaskServiceImpl extends BaseServiceImpl<DistributionSplitOrderAllTaskMapper, DistributionSplitOrderAllTaskEntity> implements IDistributionSplitOrderAllTaskService {
}

357
blade-service/logpm-distribution/src/main/java/com/logpm/distribution/service/impl/DistributionSplitOrderTaskServiceImpl.java

@ -12,6 +12,7 @@ import groovy.util.logging.Slf4j;
import lombok.AllArgsConstructor;
import org.springblade.common.constant.orderpackage.OrderPackageReservationStatusConstant;
import org.springblade.common.constant.orderpackage.OrderPackageSplitStateConstant;
import org.springblade.common.exception.CustomerException;
import org.springblade.core.mp.base.BaseServiceImpl;
import org.springblade.core.mp.support.Query;
import org.springblade.core.redis.lock.LockType;
@ -31,6 +32,7 @@ import java.util.stream.Collectors;
@Slf4j
public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<DistributionSplitOrderTaskMapper, DistributionSplitOrderTaskEntity> implements IDistributionSplitOrderTaskService {
private final IDistributionSplitOrderAllTaskService distributionSplitOrderAllTaskService;
private final IDistributionStockArticleService distributionStockArticleService;
private final IDistributionParcelListService distributionParcelListService;
private final IDistributionSplitOrderDetailService distributionSplitOrderDetailService;
@ -45,65 +47,124 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
@Transactional
@Override
public R<String> createTask(DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity, List<String> packageCodeList) {
public R<String> batchCreateTask(List<DistributionSplitOrderTaskEntity> distributionSplitOrderTaskList) {
try {
DistributionStockArticleEntity distributionStockArticle = distributionStockArticleService.getById(distributionSplitOrderTaskEntity.getStockArticleId());
if (distributionSplitOrderTaskList.isEmpty()) {
return R.fail("拆单任务不能为空");
}
long count = distributionSplitOrderTaskList.stream().map(DistributionSplitOrderTaskEntity::getStockArticleId).distinct().count();
if (count > 1) {
return R.fail("拆单任务只能对一个订单进行拆单");
}
Long stockArticleId = distributionSplitOrderTaskList.get(0).getStockArticleId();
DistributionStockArticleEntity distributionStockArticle = distributionStockArticleService.getById(stockArticleId);
if (distributionStockArticle == null) {
return R.fail("原订单信息错误");
}
List<DistributionParcelListEntity> belongsToOrder = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, distributionSplitOrderTaskEntity.getStockArticleId())
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodeList)
);
if (belongsToOrder.size() != packageCodeList.size()) {
List<String> belongsToOrderPackage = belongsToOrder.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList());
return R.fail(String.format("订单包件信息错误,选择的包件(%s)不属于该订单", packageCodeList.stream()
.filter(packageCode -> !belongsToOrderPackage.contains(packageCode))
.collect(Collectors.joining(","))
));
}
taskLock(stockArticleId, () -> {
int currentNumber = getCurrentOrderCodeNumber(stockArticleId);
List<DistributionParcelListEntity> reservationsPackageList = belongsToOrder.stream()
.filter(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))
.collect(Collectors.toList());
for (DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity : distributionSplitOrderTaskList) {
String newOrderCode = getNewOrderCode(distributionSplitOrderTaskEntity.getOrderCode(), currentNumber++);
if (!reservationsPackageList.isEmpty()) {
return R.fail(String.format("订单包件:%s,已被预约,无法拆单", reservationsPackageList.stream()
.map(DistributionParcelListEntity::getOrderPackageCode)
.collect(Collectors.joining(","))
));
}
DistributionStockArticleEntity newStockArticle = SerializationUtils.clone(distributionStockArticle);
newStockArticle.setId(null);
newStockArticle.setOrderCode(newOrderCode);
newStockArticle.setTotalNumber(0);
newStockArticle.setHandQuantity(0);
distributionStockArticleService.save(newStockArticle);
int leaseTime = 10000;
String key = "lock:splitOrderTask:create" + distributionSplitOrderTaskEntity.getStockArticleId();
distributionSplitOrderTaskEntity.setNewOrderCode(newOrderCode);
distributionSplitOrderTaskEntity.setNewStockArticleId(newStockArticle.getId());
save(distributionSplitOrderTaskEntity);
distributionSplitOrderLogService.record(distributionSplitOrderTaskEntity, "创建拆单任务", AuthUtil.getUser().getUserName());
}
});
boolean lockRes = redisLockClient.tryLock(key, LockType.FAIR, 5000, leaseTime, TimeUnit.MILLISECONDS);
if (!lockRes) {
return R.fail("拆单任务繁忙,请重试");
} catch (Exception e) {
if (e instanceof CustomerException) {
throw new CustomerException(e.getMessage());
}
long currentTimeMillis = System.currentTimeMillis();
log.error("创建拆单系统错误", e);
throw new CustomerException("系统错误");
}
saveNewTask(distributionSplitOrderTaskEntity, distributionStockArticle, belongsToOrder);
distributionSplitOrderLogService.record(distributionSplitOrderTaskEntity, "拆单任务创建", AuthUtil.getUser().getUserName());
return R.success("success");
}
@Transactional
@Override
public R<String> createTask(DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity, List<String> packageCodeList) {
DistributionStockArticleEntity distributionStockArticle = distributionStockArticleService.getById(distributionSplitOrderTaskEntity.getStockArticleId());
if (distributionStockArticle == null) {
return R.fail("原订单信息错误");
}
List<DistributionParcelListEntity> belongsToOrder = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, distributionSplitOrderTaskEntity.getStockArticleId())
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodeList)
);
if (belongsToOrder.size() != packageCodeList.size()) {
List<String> belongsToOrderPackage = belongsToOrder.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList());
return R.fail(String.format("订单包件信息错误,选择的包件(%s)不属于该订单", packageCodeList.stream()
.filter(packageCode -> !belongsToOrderPackage.contains(packageCode))
.collect(Collectors.joining(","))
));
}
List<DistributionParcelListEntity> reservationsPackageList = belongsToOrder.stream()
.filter(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))
.collect(Collectors.toList());
if (!reservationsPackageList.isEmpty()) {
return R.fail(String.format("订单包件:%s,已被预约,无法拆单", reservationsPackageList.stream()
.map(DistributionParcelListEntity::getOrderPackageCode)
.collect(Collectors.joining(","))
));
}
try {
taskLock(distributionSplitOrderTaskEntity.getStockArticleId(), () -> {
saveNewTask(distributionSplitOrderTaskEntity, distributionStockArticle, belongsToOrder);
distributionSplitOrderLogService.record(distributionSplitOrderTaskEntity, "拆单任务创建", AuthUtil.getUser().getUserName());
});
if (System.currentTimeMillis() - currentTimeMillis < leaseTime) {
redisLockClient.unLock(key, LockType.FAIR);
}
return R.data("success");
} catch (Exception e) {
log.error("createTask error", e);
return R.fail("createTask error");
if (e instanceof CustomerException) {
throw new CustomerException(e.getMessage());
}
log.error("创建拆单系统错误", e);
throw new CustomerException("系统错误");
}
}
private void taskLock(Long stockArticleId, Runnable callback) throws InterruptedException {
int leaseTime = 10000;
String key = "lock:splitOrderTask:create" + stockArticleId;
boolean lockRes = redisLockClient.tryLock(key, LockType.FAIR, 5000, leaseTime, TimeUnit.MILLISECONDS);
if (!lockRes) {
throw new CustomerException("拆单任务繁忙,请重试");
}
long currentTimeMillis = System.currentTimeMillis();
callback.run();
if (System.currentTimeMillis() - currentTimeMillis < leaseTime) {
redisLockClient.unLock(key, LockType.FAIR);
}
}
public void saveNewTask(DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity, DistributionStockArticleEntity distributionStockArticle, List<DistributionParcelListEntity> belongsToOrder){
/*
* 避免审核期间的数据被操作且无法去其他节点修改所以第一时间分配新的订单
*/
String newOrderCode = getNewOrderCode(distributionStockArticle.getOrderCode(), distributionStockArticle.getId());
int currentNumber = getCurrentOrderCodeNumber(distributionStockArticle.getId());
String newOrderCode = getNewOrderCode(distributionStockArticle.getOrderCode(), currentNumber);
DistributionStockArticleEntity newStockArticle = SerializationUtils.clone(distributionStockArticle);
newStockArticle.setId(null);
newStockArticle.setOrderCode(newOrderCode);
@ -137,12 +198,16 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
DistributionSplitOrderDetailEntity detail = new DistributionSplitOrderDetailEntity();
detail.setOrderPackageCode(distributionParcelListEntity.getOrderPackageCode());
detail.setSplitOrderTaskId(distributionSplitOrderTaskEntity.getId());
detail.setState(OrderPackageSplitStateConstant.wait.getValue());
detail.setState(OrderPackageSplitStateConstant.finish.getValue());
details.add(detail);
});
distributionSplitOrderDetailService.saveBatch(details);
}
private String getNewOrderCode(String OrderCode, int currentNumber) {
return OrderCode + "-拆" + currentNumber;
}
@Transactional
@Override
public R<String> updateTask(DistributionSplitOrderTaskEntity distributionSplitOrderTaskEntity, List<String> packageCodeList) {
@ -161,31 +226,35 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
return R.fail("原订单信息错误");
}
ArrayList<Long> StockArticleIds = new ArrayList<>();
StockArticleIds.add(distributionSplitOrderTaskEntity.getStockArticleId());
StockArticleIds.add(task.getNewStockArticleId());
List<DistributionParcelListEntity> belongsToOrder = new ArrayList<>();
if (!packageCodeList.isEmpty()) {
ArrayList<Long> StockArticleIds = new ArrayList<>();
StockArticleIds.add(distributionSplitOrderTaskEntity.getStockArticleId());
StockArticleIds.add(task.getNewStockArticleId());
List<DistributionParcelListEntity> belongsToOrder = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.in(DistributionParcelListEntity::getStockArticleId, StockArticleIds)
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodeList)
);
if (belongsToOrder.size() != packageCodeList.size()) {
List<String> belongsToOrderPackage = belongsToOrder.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList());
return R.fail(String.format("订单包件信息错误,选择的包件(%s)不属于该订单", packageCodeList.stream()
.filter(packageCode -> !belongsToOrderPackage.contains(packageCode))
.collect(Collectors.joining(","))
));
}
belongsToOrder = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.in(DistributionParcelListEntity::getStockArticleId, StockArticleIds)
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodeList)
);
if (belongsToOrder.size() != packageCodeList.size()) {
List<String> belongsToOrderPackage = belongsToOrder.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList());
return R.fail(String.format("订单包件信息错误,选择的包件(%s)不属于该订单", packageCodeList.stream()
.filter(packageCode -> !belongsToOrderPackage.contains(packageCode))
.collect(Collectors.joining(","))
));
}
List<DistributionParcelListEntity> reservationsPackageList = belongsToOrder.stream()
.filter(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))
.collect(Collectors.toList());
List<DistributionParcelListEntity> reservationsPackageList = belongsToOrder.stream()
.filter(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))
.collect(Collectors.toList());
if (!reservationsPackageList.isEmpty()) {
return R.fail(String.format("订单包件:%s,已被预约,无法拆单", reservationsPackageList.stream()
.map(DistributionParcelListEntity::getOrderPackageCode)
.collect(Collectors.joining(","))
));
if (!reservationsPackageList.isEmpty()) {
return R.fail(String.format("订单包件:%s,已被预约,无法拆单", reservationsPackageList.stream()
.map(DistributionParcelListEntity::getOrderPackageCode)
.collect(Collectors.joining(","))
));
}
}
DistributionStockArticleEntity newStockArticle = distributionStockArticleService.getById(distributionSplitOrderTaskEntity.getNewStockArticleId());
@ -198,8 +267,8 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
return R.data("success");
} catch (Exception e) {
log.error("updateTask error", e);
return R.fail("修改失败");
log.error("更新拆单信息系统错误", e);
throw new CustomerException("系统错误");
}
}
@ -213,7 +282,9 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
newStockArticle.setHandQuantity(belongsToOrder.size());
distributionStockArticleService.save(newStockArticle);
packageUpdate(distributionSplitOrderTaskEntity, distributionStockArticle, belongsToOrder);
if (!belongsToOrder.isEmpty()) {
packageUpdate(distributionSplitOrderTaskEntity, distributionStockArticle, belongsToOrder);
}
distributionStockArticle.setTotalNumber(distributionStockArticle.getTotalNumber() - belongsToOrder.size());
distributionStockArticle.setHandQuantity(distributionStockArticle.getHandQuantity() - belongsToOrder.size());
@ -248,7 +319,7 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
DistributionSplitOrderDetailEntity detail = new DistributionSplitOrderDetailEntity();
detail.setOrderPackageCode(distributionParcelListEntity.getOrderPackageCode());
detail.setSplitOrderTaskId(distributionSplitOrderTaskEntity.getId());
detail.setState(OrderPackageSplitStateConstant.wait.getValue());
detail.setState(OrderPackageSplitStateConstant.finish.getValue());
details.add(detail);
});
distributionSplitOrderDetailService.saveBatch(details);
@ -269,7 +340,7 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
distributionSplitOrderDetailService.update(Wrappers.<DistributionSplitOrderDetailEntity>lambdaUpdate()
.eq(DistributionSplitOrderDetailEntity::getSplitOrderTaskId, distributionSplitOrderTaskEntity.getId())
.in(DistributionSplitOrderDetailEntity::getOrderPackageCode, recover.stream().map(DistributionParcelListEntity::getOrderPackageCode).collect(Collectors.toList()))
.set(DistributionSplitOrderDetailEntity::getState, OrderPackageSplitStateConstant.wait.getValue())
.set(DistributionSplitOrderDetailEntity::getState, OrderPackageSplitStateConstant.finish.getValue())
);
}
@ -277,7 +348,7 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
List<DistributionSplitOrderDetailEntity> remove = taskJoinPackage.stream().filter(distributionSplitOrderDetailEntity ->
!currentPackage.contains(distributionSplitOrderDetailEntity.getOrderPackageCode())
&& !OrderPackageSplitStateConstant.wait.getValue().equals(distributionSplitOrderDetailEntity.getState())
&& !OrderPackageSplitStateConstant.finish.getValue().equals(distributionSplitOrderDetailEntity.getState())
).collect(Collectors.toList());
if (!remove.isEmpty()) {
@ -291,37 +362,37 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
@Transactional
@Override
public R<String> cancelTask(Long taskId) {
try {
DistributionSplitOrderTaskEntity task = getById(taskId);
if (task == null) {
return R.fail("任务不存在");
}
DistributionSplitOrderTaskEntity task = getById(taskId);
if (task == null) {
return R.fail("任务不存在");
}
DistributionStockArticleEntity oldStockArticle = distributionStockArticleService.getById(task.getStockArticleId());
DistributionStockArticleEntity newStockArticle = distributionStockArticleService.getById(task.getNewStockArticleId());
if (newStockArticle == null) {
return R.fail("订单错误,无法取消");
}
DistributionStockArticleEntity oldStockArticle = distributionStockArticleService.getById(task.getStockArticleId());
DistributionStockArticleEntity newStockArticle = distributionStockArticleService.getById(task.getNewStockArticleId());
if (newStockArticle == null) {
return R.fail("订单错误,无法取消");
}
if (oldStockArticle == null) {
oldStockArticle = distributionStockArticleService.getOne(Wrappers.<DistributionStockArticleEntity>lambdaQuery()
.eq(DistributionStockArticleEntity::getId, task.getStockArticleId())
.eq(DistributionStockArticleEntity::getIsDeleted, 1)
);
if (oldStockArticle == null) {
oldStockArticle = distributionStockArticleService.getOne(Wrappers.<DistributionStockArticleEntity>lambdaQuery()
.eq(DistributionStockArticleEntity::getId, task.getStockArticleId())
.eq(DistributionStockArticleEntity::getIsDeleted, 1)
);
if (oldStockArticle == null) {
return R.fail("订单错误,无法取消");
}
oldStockArticle.setIsDeleted(0);
return R.fail("订单错误,无法取消");
}
oldStockArticle.setIsDeleted(0);
}
List<DistributionParcelListEntity> packageList = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId()));
if (packageList.isEmpty()) {
return R.fail("无可取消包件,无法取消");
}
if (packageList.stream().anyMatch(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))) {
return R.fail("新的订单包件已预约,无法取消");
}
List<DistributionParcelListEntity> packageList = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId()));
if (packageList.isEmpty()) {
return R.fail("无可取消包件,无法取消");
}
if (packageList.stream().anyMatch(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))) {
return R.fail("新的订单包件已预约,无法取消");
}
try {
distributionParcelListService.update(Wrappers.<DistributionParcelListEntity>lambdaUpdate()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId())
@ -351,61 +422,61 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
return R.success("success");
} catch (Exception e) {
log.error("取消拆单任务失败", e);
return R.fail("取消拆单任务失败");
log.error("取消拆单任务系统错误", e);
throw new CustomerException("系统错误");
}
}
@Transactional
@Override
public R<String> cancelPackageCode(Long taskId, List<String> packageCodes) {
try {
DistributionSplitOrderTaskEntity task = getById(taskId);
if (task == null) {
return R.fail("拆单任务不存在");
}
DistributionSplitOrderTaskEntity task = getById(taskId);
if (task == null) {
return R.fail("拆单任务不存在");
}
if (task.getNumber() == packageCodes.size()) {
return cancelTask(taskId);
}
if (task.getNumber() == packageCodes.size()) {
distributionSplitOrderLogService.record(task, String.format("取消包件:%s", String.join(",", packageCodes)), AuthUtil.getUser().getUserName());
return cancelTask(taskId);
}
List<DistributionParcelListEntity> packageList = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId())
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodes)
);
if (packageList.stream().anyMatch(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))) {
return R.fail("新的订单包件已预约,无法取消");
}
List<DistributionParcelListEntity> packageList = distributionParcelListService.list(Wrappers.<DistributionParcelListEntity>lambdaQuery()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId())
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodes)
);
if (packageList.stream().anyMatch(distributionParcelListEntity -> OrderPackageReservationStatusConstant.yiyueyue.getValue().equals(distributionParcelListEntity.getOrderPackageReservationStatus()))) {
return R.fail("新的订单包件已预约,无法取消");
}
List<DistributionSplitOrderDetailEntity> detail = distributionSplitOrderDetailService.list(Wrappers.<DistributionSplitOrderDetailEntity>lambdaQuery()
.eq(DistributionSplitOrderDetailEntity::getSplitOrderTaskId, taskId)
.in(DistributionSplitOrderDetailEntity::getOrderPackageCode, packageCodes)
);
List<DistributionSplitOrderDetailEntity> detail = distributionSplitOrderDetailService.list(Wrappers.<DistributionSplitOrderDetailEntity>lambdaQuery()
.eq(DistributionSplitOrderDetailEntity::getSplitOrderTaskId, taskId)
.in(DistributionSplitOrderDetailEntity::getOrderPackageCode, packageCodes)
);
long cancelCount = detail.stream().filter(distributionSplitOrderDetailEntity ->
OrderPackageSplitStateConstant.cancel.getValue().equals(distributionSplitOrderDetailEntity.getState())
|| OrderPackageSplitStateConstant.reject.getValue().equals(distributionSplitOrderDetailEntity.getState())
).count();
if (cancelCount > 0) {
return R.fail("选择部分包件已取消,请重新选择");
}
long cancelCount = detail.stream().filter(distributionSplitOrderDetailEntity ->
OrderPackageSplitStateConstant.cancel.getValue().equals(distributionSplitOrderDetailEntity.getState())
).count();
if (cancelCount > 0) {
return R.fail("选择部分包件已取消,请重新选择");
}
DistributionStockArticleEntity oldStockArticle = distributionStockArticleService.getById(task.getStockArticleId());
DistributionStockArticleEntity newStockArticle = distributionStockArticleService.getById(task.getNewStockArticleId());
if (newStockArticle == null) {
return R.fail("订单错误,无法取消");
}
DistributionStockArticleEntity oldStockArticle = distributionStockArticleService.getById(task.getStockArticleId());
DistributionStockArticleEntity newStockArticle = distributionStockArticleService.getById(task.getNewStockArticleId());
if (newStockArticle == null) {
return R.fail("订单错误,无法取消");
}
if (oldStockArticle == null) {
oldStockArticle = distributionStockArticleService.getOne(Wrappers.<DistributionStockArticleEntity>lambdaQuery()
.eq(DistributionStockArticleEntity::getId, task.getStockArticleId())
.eq(DistributionStockArticleEntity::getIsDeleted, 1)
);
if (oldStockArticle == null) {
oldStockArticle = distributionStockArticleService.getOne(Wrappers.<DistributionStockArticleEntity>lambdaQuery()
.eq(DistributionStockArticleEntity::getId, task.getStockArticleId())
.eq(DistributionStockArticleEntity::getIsDeleted, 1)
);
if (oldStockArticle == null) {
return R.fail("订单错误,无法取消");
}
oldStockArticle.setIsDeleted(0);
return R.fail("订单错误,无法取消");
}
oldStockArticle.setIsDeleted(0);
}
try {
distributionParcelListService.update(Wrappers.<DistributionParcelListEntity>lambdaUpdate()
.eq(DistributionParcelListEntity::getStockArticleId, task.getNewStockArticleId())
.in(DistributionParcelListEntity::getOrderPackageCode, packageCodes)
@ -433,13 +504,19 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
return R.success("success");
} catch (Exception e) {
log.error("拆单任务不存在", e);
return R.fail("系统错误");
log.error("撤销包件系统错误", e);
throw new CustomerException("系统错误");
}
}
@Deprecated
@Transactional
@Override
public R<String> reviewTask(Long taskId) {
public R<String> reviewTask(Long taskId, Integer reviewStatus, String reason) {
return null;
}
@ -449,12 +526,12 @@ public class DistributionSplitOrderTaskServiceImpl extends BaseServiceImpl<Distr
}
private String getNewOrderCode(String oldOrderCode, Long oldStockArticleId) {
private int getCurrentOrderCodeNumber(Long oldStockArticleId) {
long count = count(Wrappers.<DistributionSplitOrderTaskEntity>lambdaQuery().eq(
DistributionSplitOrderTaskEntity::getStockArticleId, oldStockArticleId
));
return oldOrderCode + "-拆" + (count + 1);
return (int)(count + 1);
}
}

Loading…
Cancel
Save