|
|
|
|
@ -10,15 +10,26 @@ import com.github.yulichang.wrapper.MPJLambdaWrapper;
|
|
|
|
|
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
|
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
|
import org.springframework.stereotype.Service;
|
|
|
|
|
import org.springframework.transaction.annotation.Transactional;
|
|
|
|
|
import org.dromara.wms.domain.bo.WmsAllocateTaskBo;
|
|
|
|
|
import org.dromara.wms.domain.vo.WmsAllocateTaskVo;
|
|
|
|
|
import org.dromara.wms.domain.WmsAllocateTask;
|
|
|
|
|
import org.dromara.wms.domain.WmsAllocateOrderDetail;
|
|
|
|
|
import org.dromara.wms.domain.BaseMaterialInfo;
|
|
|
|
|
import org.dromara.wms.mapper.WmsAllocateTaskMapper;
|
|
|
|
|
import org.dromara.wms.service.IWmsAllocateTaskService;
|
|
|
|
|
import org.dromara.wms.service.IWmsAllocateOrderDetailService;
|
|
|
|
|
import org.dromara.wms.service.IBaseMaterialInfoService;
|
|
|
|
|
import org.dromara.common.satoken.utils.LoginHelper;
|
|
|
|
|
import org.dromara.common.core.exception.ServiceException;
|
|
|
|
|
import org.springframework.beans.BeanUtils;
|
|
|
|
|
|
|
|
|
|
import java.util.List;
|
|
|
|
|
import java.util.Map;
|
|
|
|
|
import java.util.Collection;
|
|
|
|
|
import java.util.Date;
|
|
|
|
|
import java.math.BigDecimal;
|
|
|
|
|
import java.util.concurrent.atomic.AtomicInteger;
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 调拨打印Service业务层处理
|
|
|
|
|
@ -31,6 +42,14 @@ import java.util.Collection;
|
|
|
|
|
public class WmsAllocateTaskServiceImpl implements IWmsAllocateTaskService {
|
|
|
|
|
|
|
|
|
|
private final WmsAllocateTaskMapper baseMapper;
|
|
|
|
|
private final IWmsAllocateOrderDetailService allocateOrderDetailService;
|
|
|
|
|
private final IBaseMaterialInfoService baseMaterialInfoService;
|
|
|
|
|
|
|
|
|
|
private static final AtomicInteger sequence = new AtomicInteger(1);
|
|
|
|
|
|
|
|
|
|
public static Integer nextSequence() {
|
|
|
|
|
return sequence.incrementAndGet();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询调拨打印
|
|
|
|
|
@ -140,8 +159,295 @@ public class WmsAllocateTaskServiceImpl implements IWmsAllocateTaskService {
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid) {
|
|
|
|
|
if(isValid){
|
|
|
|
|
//TODO 做一些业务上的校验,判断是否需要校验
|
|
|
|
|
// 校验调拨任务是否已开始执行
|
|
|
|
|
List<WmsAllocateTask> tasks = baseMapper.selectByIds(ids);
|
|
|
|
|
for (WmsAllocateTask task : tasks) {
|
|
|
|
|
if ("1".equals(task.getInboundStatus()) || "2".equals(task.getInboundStatus())) {//入库状态(0-待入库,1-已入库,2-入库中)
|
|
|
|
|
throw new ServiceException("调拨任务[" + task.getAllocateCode() + "]已开始执行,不允许删除");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return baseMapper.deleteByIds(ids) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 调拨分包打印
|
|
|
|
|
*
|
|
|
|
|
* @param allocateCode 调拨单号
|
|
|
|
|
* @param aoDId 调拨明细ID
|
|
|
|
|
* @param packageQtyList 分包数量列表
|
|
|
|
|
* @param splitPackageCount 分包数量
|
|
|
|
|
* @param printCopies 打印份数
|
|
|
|
|
* @return 是否打印成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public Boolean allocatePackagePrint(String allocateCode, Long aoDId, List<Integer> packageQtyList,
|
|
|
|
|
Integer splitPackageCount, Integer printCopies) {
|
|
|
|
|
// 获取调拨明细
|
|
|
|
|
org.dromara.wms.domain.vo.WmsAllocateOrderDetailVo detailVo = allocateOrderDetailService.queryById(aoDId);
|
|
|
|
|
if (detailVo == null) {
|
|
|
|
|
throw new ServiceException("调拨明细不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 获取物料信息
|
|
|
|
|
org.dromara.wms.domain.vo.BaseMaterialInfoVo materialInfoVo = null;
|
|
|
|
|
if (detailVo.getMaterialId() != null) {
|
|
|
|
|
materialInfoVo = baseMaterialInfoService.queryById(detailVo.getMaterialId());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查是否已经打印过
|
|
|
|
|
List<WmsAllocateTaskVo> existingTasks = queryTasksByDetailId(aoDId);
|
|
|
|
|
if (!existingTasks.isEmpty()) {
|
|
|
|
|
throw new ServiceException("该调拨明细已经打印过,不允许重复打印");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int splitInt = splitPackageCount != null ? splitPackageCount : 1;
|
|
|
|
|
int copiesInt = printCopies != null ? printCopies : 1;
|
|
|
|
|
|
|
|
|
|
// 获取当前打印序列
|
|
|
|
|
Integer printSeq = nextSequence();
|
|
|
|
|
String baseOrder = generateOrder(printSeq);
|
|
|
|
|
|
|
|
|
|
BigDecimal totalPackaged = BigDecimal.ZERO;
|
|
|
|
|
|
|
|
|
|
if (splitInt > 1) {
|
|
|
|
|
// 分包逻辑 - 统一处理模式
|
|
|
|
|
if (packageQtyList == null || packageQtyList.size() != splitInt) {
|
|
|
|
|
throw new ServiceException("分包数量列表与分包数量不匹配");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 验证每包数量总计是否等于调拨数量
|
|
|
|
|
BigDecimal totalCustomQty = packageQtyList.stream()
|
|
|
|
|
.map(BigDecimal::valueOf)
|
|
|
|
|
.reduce(BigDecimal.ZERO, BigDecimal::add);
|
|
|
|
|
|
|
|
|
|
if (totalCustomQty.compareTo(detailVo.getAllocateOrderQty()) != 0) {
|
|
|
|
|
throw new ServiceException("分包数量总计必须等于调拨数量" + detailVo.getAllocateOrderQty() + ",当前总计:" + totalCustomQty);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 遍历packageQtyList创建打印记录
|
|
|
|
|
for (int i = 1; i <= splitInt; i++) {
|
|
|
|
|
String order = baseOrder + String.format("%03d", i);
|
|
|
|
|
String batchCode = generateBatchCode(allocateCode, materialInfoVo != null ? materialInfoVo.getMaterialCode() : "", order);
|
|
|
|
|
|
|
|
|
|
BigDecimal currentPackageQty = BigDecimal.valueOf(packageQtyList.get(i - 1)); // 当前包的物料数量
|
|
|
|
|
|
|
|
|
|
WmsAllocateTask task = createAllocateTask(detailVo, materialInfoVo, allocateCode, batchCode, currentPackageQty.longValue(), 1L, aoDId);
|
|
|
|
|
baseMapper.insert(task);
|
|
|
|
|
totalPackaged = totalPackaged.add(currentPackageQty);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
// 重复打印逻辑(split == 1)
|
|
|
|
|
if (copiesInt < 1) {
|
|
|
|
|
copiesInt = 1;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
String batchCode = generateBatchCode(allocateCode, materialInfoVo != null ? materialInfoVo.getMaterialCode() : "", baseOrder);
|
|
|
|
|
|
|
|
|
|
WmsAllocateTask task = createAllocateTask(detailVo, materialInfoVo, allocateCode, batchCode,
|
|
|
|
|
detailVo.getAllocateOrderQty().longValue(), (long) copiesInt, aoDId);
|
|
|
|
|
baseMapper.insert(task);
|
|
|
|
|
totalPackaged = detailVo.getAllocateOrderQty(); // 全部调拨数量都被打印
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新调拨明细的已分包数量
|
|
|
|
|
org.dromara.wms.domain.bo.WmsAllocateOrderDetailBo detailBo = new org.dromara.wms.domain.bo.WmsAllocateOrderDetailBo();
|
|
|
|
|
detailBo.setAoDId(detailVo.getAoDId());
|
|
|
|
|
detailBo.setPrintedQty(totalPackaged);
|
|
|
|
|
allocateOrderDetailService.updateByBo(detailBo);
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 创建调拨任务对象
|
|
|
|
|
*/
|
|
|
|
|
private WmsAllocateTask createAllocateTask(org.dromara.wms.domain.vo.WmsAllocateOrderDetailVo detailVo,
|
|
|
|
|
org.dromara.wms.domain.vo.BaseMaterialInfoVo materialInfoVo,
|
|
|
|
|
String allocateCode, String batchCode, Long materialQty,
|
|
|
|
|
Long apportionQty, Long aoDId) {
|
|
|
|
|
WmsAllocateTask task = new WmsAllocateTask();
|
|
|
|
|
task.setAllocateCode(allocateCode);
|
|
|
|
|
task.setBatchCode(batchCode);
|
|
|
|
|
task.setMaterialQty(materialQty); // 每包的物料数量
|
|
|
|
|
task.setApportionQty(apportionQty); // 打印的包数
|
|
|
|
|
task.setMaterialId(detailVo.getMaterialId());
|
|
|
|
|
task.setInboundStatus("0"); // 入库状态(0-待入库,1-已入库,2-入库中)
|
|
|
|
|
task.setAoDId(aoDId);
|
|
|
|
|
|
|
|
|
|
// 填充物料信息
|
|
|
|
|
if (materialInfoVo != null) {
|
|
|
|
|
task.setMaterialId(materialInfoVo.getMaterialId());
|
|
|
|
|
task.setMaterialCode(materialInfoVo.getMaterialCode());
|
|
|
|
|
task.setMaterialName(materialInfoVo.getMaterialName());
|
|
|
|
|
task.setMaterialSpe(materialInfoVo.getMaterialSpec());
|
|
|
|
|
task.setUnitName(materialInfoVo.getUnitName());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return task;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 查询调拨明细的已打印任务
|
|
|
|
|
*
|
|
|
|
|
* @param aoDId 调拨明细ID
|
|
|
|
|
* @return 调拨任务列表
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public List<WmsAllocateTaskVo> queryTasksByDetailId(Long aoDId) {
|
|
|
|
|
MPJLambdaWrapper<WmsAllocateTask> lqw = JoinWrappers.lambda(WmsAllocateTask.class)
|
|
|
|
|
.selectAll(WmsAllocateTask.class)
|
|
|
|
|
.eq(WmsAllocateTask::getAoDId, aoDId)
|
|
|
|
|
.orderByDesc(WmsAllocateTask::getCreateTime);
|
|
|
|
|
return baseMapper.selectVoList(lqw);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 验证调拨明细是否可以打印
|
|
|
|
|
*
|
|
|
|
|
* @param aoDId 调拨明细ID
|
|
|
|
|
* @return 是否可以打印
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean validatePrintable(Long aoDId) {
|
|
|
|
|
// 检查是否已经打印过
|
|
|
|
|
List<WmsAllocateTaskVo> existingTasks = queryTasksByDetailId(aoDId);
|
|
|
|
|
return existingTasks.isEmpty();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 触发打印条码
|
|
|
|
|
*
|
|
|
|
|
* @param allocateTaskId 调拨任务ID
|
|
|
|
|
* @return 是否打印成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean triggerPrint(Long allocateTaskId) {
|
|
|
|
|
WmsAllocateTask task = baseMapper.selectById(allocateTaskId);
|
|
|
|
|
if (task == null) {
|
|
|
|
|
throw new ServiceException("调拨任务不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查任务状态
|
|
|
|
|
if ("1".equals(task.getInboundStatus()) || "2".equals(task.getInboundStatus())) {//入库状态(0-待入库,1-已入库,2-入库中)
|
|
|
|
|
throw new ServiceException("该任务已开始执行,不允许重复打印");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// TODO: 这里可以集成实际的打印机接口
|
|
|
|
|
// 暂时只记录日志
|
|
|
|
|
System.out.println("触发打印任务: " + task.getBatchCode() + ", 数量: " + task.getMaterialQty());
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 重新创建调拨任务(删除旧的,创建新的)
|
|
|
|
|
*
|
|
|
|
|
* @param aoDId 调拨明细ID
|
|
|
|
|
* @param packageQtyList 分包数量列表
|
|
|
|
|
* @param splitPackageCount 分包数量
|
|
|
|
|
* @return 是否创建成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public Boolean recreateAllocateTasks(Long aoDId, List<Integer> packageQtyList, Integer splitPackageCount) {
|
|
|
|
|
// 先删除现有的任务
|
|
|
|
|
deleteTasksByDetailId(aoDId);
|
|
|
|
|
|
|
|
|
|
// 获取调拨明细
|
|
|
|
|
org.dromara.wms.domain.vo.WmsAllocateOrderDetailVo detailVo = allocateOrderDetailService.queryById(aoDId);
|
|
|
|
|
if (detailVo == null) {
|
|
|
|
|
throw new ServiceException("调拨明细不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 重新创建任务
|
|
|
|
|
return allocatePackagePrint(detailVo.getAllocateCode(), aoDId, packageQtyList, splitPackageCount, 1);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 修改调拨任务的条码和分包数量
|
|
|
|
|
*
|
|
|
|
|
* @param allocateTaskId 调拨任务ID
|
|
|
|
|
* @param batchCode 新条码
|
|
|
|
|
* @param materialQty 新的每包数量
|
|
|
|
|
* @return 是否修改成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
public Boolean updateTaskBarcode(Long allocateTaskId, String batchCode, Long materialQty) {
|
|
|
|
|
WmsAllocateTask task = baseMapper.selectById(allocateTaskId);
|
|
|
|
|
if (task == null) {
|
|
|
|
|
throw new ServiceException("调拨任务不存在");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 检查任务状态
|
|
|
|
|
if ("1".equals(task.getInboundStatus()) || "2".equals(task.getInboundStatus())) {//入库状态(0-待入库,1-已入库,2-入库中)
|
|
|
|
|
throw new ServiceException("该任务已开始执行,不允许修改");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新任务信息
|
|
|
|
|
task.setBatchCode(batchCode);
|
|
|
|
|
task.setMaterialQty(materialQty);
|
|
|
|
|
|
|
|
|
|
return baseMapper.updateById(task) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 删除调拨明细的所有打印任务
|
|
|
|
|
*
|
|
|
|
|
* @param aoDId 调拨明细ID
|
|
|
|
|
* @return 是否删除成功
|
|
|
|
|
*/
|
|
|
|
|
@Override
|
|
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
|
|
public Boolean deleteTasksByDetailId(Long aoDId) {
|
|
|
|
|
MPJLambdaWrapper<WmsAllocateTask> wrapper = JoinWrappers.lambda(WmsAllocateTask.class)
|
|
|
|
|
.eq(WmsAllocateTask::getAoDId, aoDId);
|
|
|
|
|
|
|
|
|
|
List<WmsAllocateTask> tasks = baseMapper.selectList(wrapper);
|
|
|
|
|
|
|
|
|
|
// 检查是否有已开始执行的任务
|
|
|
|
|
for (WmsAllocateTask task : tasks) {
|
|
|
|
|
if ("1".equals(task.getInboundStatus()) || "2".equals(task.getInboundStatus())) {//入库状态(0-待入库,1-已入库,2-入库中)
|
|
|
|
|
throw new ServiceException("存在已开始执行的任务,不允许删除");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (!tasks.isEmpty()) {
|
|
|
|
|
List<Long> taskIds = tasks.stream().map(WmsAllocateTask::getAllocateTaskId).toList();
|
|
|
|
|
int deleteCount = baseMapper.deleteByIds(taskIds);
|
|
|
|
|
|
|
|
|
|
// 更新调拨明细的已分包数量
|
|
|
|
|
org.dromara.wms.domain.vo.WmsAllocateOrderDetailVo detailVo = allocateOrderDetailService.queryById(aoDId);
|
|
|
|
|
if (detailVo != null) {
|
|
|
|
|
org.dromara.wms.domain.bo.WmsAllocateOrderDetailBo detailBo = new org.dromara.wms.domain.bo.WmsAllocateOrderDetailBo();
|
|
|
|
|
detailBo.setAoDId(detailVo.getAoDId());
|
|
|
|
|
detailBo.setPrintedQty(BigDecimal.ZERO);
|
|
|
|
|
allocateOrderDetailService.updateByBo(detailBo);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return deleteCount > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成订单号
|
|
|
|
|
*/
|
|
|
|
|
private String generateOrder(Integer value) {
|
|
|
|
|
if (value.toString().length() < 3) {
|
|
|
|
|
return String.format("%03d", value);
|
|
|
|
|
} else if (value.toString().length() == 3) {
|
|
|
|
|
return value.toString();
|
|
|
|
|
}
|
|
|
|
|
return value.toString();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* 生成批次码
|
|
|
|
|
*/
|
|
|
|
|
private String generateBatchCode(String allocateCode, String materialCode, String order) {
|
|
|
|
|
return allocateCode + materialCode + order;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|