package com.zy.asrs.wms.asrs.timer;
|
|
import com.alibaba.fastjson.JSON;
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.core.plugins.IgnoreStrategy;
|
import com.baomidou.mybatisplus.core.plugins.InterceptorIgnoreHelper;
|
import com.zy.asrs.framework.exception.CoolException;
|
import com.zy.asrs.wms.asrs.entity.*;
|
import com.zy.asrs.wms.asrs.entity.enums.CacheSiteStatusType;
|
import com.zy.asrs.wms.asrs.entity.enums.OrderSettleType;
|
import com.zy.asrs.wms.asrs.entity.enums.TaskStsType;
|
import com.zy.asrs.wms.asrs.service.*;
|
import com.zy.asrs.wms.system.entity.Dict;
|
import com.zy.asrs.wms.system.service.DictService;
|
import com.zy.asrs.wms.utils.OrderUtils;
|
import com.zy.asrs.wms.utils.Utils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.stereotype.Component;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.interceptor.TransactionAspectSupport;
|
|
import java.util.*;
|
import java.util.stream.Collectors;
|
|
@Component
|
public class TaskWaveTimer {
|
|
@Autowired
|
private TaskService taskService;
|
@Autowired
|
private TaskDetlService taskDetlService;
|
@Autowired
|
private OrderService orderService;
|
@Autowired
|
private OrderDetlService orderDetlService;
|
@Autowired
|
private OrderUtils orderUtils;
|
@Autowired
|
private CacheSiteService cacheSiteService;
|
@Autowired
|
private WaveSeedService waveSeedService;
|
@Autowired
|
private DictService dictService;
|
|
/**
|
* modifty:
|
* original : fetch datasource of task type on WCS_EXECUTE_OUT_TASK_DONE
|
* now: Fetch datasource of task type on WCS_EXECUTE_OUT_ARRIVED, After completing the task and for setting the task type equal to GENERATE_WAVE_SEED
|
*/
|
@Scheduled(cron = "0/3 * * * * ? ")
|
@Transactional(rollbackFor = Exception.class)
|
public void taskWave() {
|
InterceptorIgnoreHelper.handle(IgnoreStrategy.builder().tenantLine(true).build());
|
try {
|
Dict dict = dictService.getOne(new LambdaQueryWrapper<Dict>().eq(Dict::getFlag, "autoCreateWaveSeed").eq(Dict::getStatus, 1));
|
if (dict == null) {
|
return;
|
}
|
String autoCreateWaveSeed = dict.getValue();
|
if (!autoCreateWaveSeed.equals("true")) {
|
return;
|
}
|
//查询状态为RCS任务完成所有任务单据
|
// List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WAVE_SEED.id));
|
List<Task> taskList = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskSts, TaskStsType.WCS_EXECUTE_OUT.id)); HashSet<String> sycMatnrs = new HashSet<>();
|
if (taskList.isEmpty()) {
|
// throw new CoolException("没有可播种任务!!");
|
} else {
|
for (Task task : taskList) {
|
Long hostId = task.getHostId();
|
|
List<TaskDetl> taskDetls = taskDetlService.list(new LambdaQueryWrapper<TaskDetl>().eq(TaskDetl::getTaskId, task.getId()).eq(TaskDetl::getHostId, hostId));
|
if (taskDetls.isEmpty()) {
|
continue;
|
}
|
// 过滤已经生成波次播种数据的任务 该任务的任务明细号不能在播种数据表里面
|
long count = waveSeedService.count(new LambdaQueryWrapper<WaveSeed>().in(WaveSeed::getTaskDetlId, taskDetls.stream().map(TaskDetl::getId).collect(Collectors.toList())).eq(WaveSeed::getHostId, hostId));
|
if (count > 0) {
|
continue;
|
}
|
|
for (TaskDetl taskDetl : taskDetls) {
|
//分配订单
|
Long waveId = taskDetl.getWaveId();
|
//同一个物料只添加一次播种任务
|
if(sycMatnrs.contains(taskDetl.getMatnr())) {
|
continue;
|
}
|
sycMatnrs.add(taskDetl.getMatnr());
|
|
List<Order> list = orderService.list(new LambdaQueryWrapper<Order>().eq(Order::getWaveId, waveId));
|
if (list.isEmpty()) {
|
continue;
|
}
|
|
ArrayList<Long> orderIds = new ArrayList<>();
|
for (Order order : list) {
|
orderIds.add(order.getId());
|
}
|
|
String matUniqueKey = Utils.getMatUniqueKey(taskDetl.getMatnr(), taskDetl.getBatch(), taskDetl.getUniqueField());
|
List<OrderDetl> orderDetls = orderDetlService.list(new LambdaQueryWrapper<OrderDetl>()
|
.in(OrderDetl::getOrderId, orderIds)
|
.eq(OrderDetl::getStockIndex, matUniqueKey)
|
.eq(OrderDetl::getHostId, hostId));
|
if(orderDetls.isEmpty()){
|
throw new CoolException("订单明细不存在");
|
}
|
|
Double anfme = taskDetl.getAnfme();
|
for (OrderDetl orderDetl : orderDetls) {
|
//fixme 作业中数量调整放至,生成出库任务成功后
|
double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getQty() - orderDetl.getWorkQty()).orElse(0.0D);
|
if (issued <= 0.0D) { continue; }
|
if (anfme <= 0.0D) { break; }
|
|
double workQty = issued;
|
if(anfme - issued < 0){
|
workQty = anfme;
|
}
|
anfme -= workQty;
|
|
orderUtils.updateWorkQty(orderDetl.getId(), workQty, true);
|
//
|
//fixme 生成波次播种数据时,不自动添加站点绑定,站点绑定调整至出库绑定播种库位时更新
|
// CacheSite cacheSite = cacheSiteService.getOne(new LambdaQueryWrapper<CacheSite>().eq(CacheSite::getOrderId, orderDetl.getOrderId()).eq(CacheSite::getHostId, hostId));
|
// if (cacheSite == null) {
|
// throw new CoolException("缓存站空间不存在");
|
// }
|
|
WaveSeed waveSeed = new WaveSeed();
|
// waveSeed.setSiteId(cacheSite.getId());
|
// waveSeed.setSiteNo(cacheSite.getSiteNo());
|
waveSeed.setOrderNo(orderDetl.getOrderNo());
|
waveSeed.setOrderId(orderDetl.getOrderId());
|
waveSeed.setOrderDetlId(orderDetl.getId());
|
waveSeed.setWaveId(taskDetl.getWaveId()).setWaveNo(taskDetl.getWaveNo());
|
waveSeed.setTaskDetlId(taskDetl.getId());
|
//为满足当前需求,经确认,改成订单数量
|
waveSeed.setAnfme(orderDetl.getAnfme());
|
waveSeed.setWorkQty(0D);
|
waveSeed.setMatnr(taskDetl.getMatnr());
|
waveSeed.setBatch(taskDetl.getBatch());
|
waveSeed.setFieldParams(JSON.toJSONString(taskDetl.getUniqueField()));
|
waveSeed.setHostId(hostId);
|
if (!waveSeedService.save(waveSeed)) {
|
throw new CoolException("波次播种创建失败");
|
}
|
// cacheSite.setOrderId(orderDetl.getOrderId());
|
// cacheSite.setOrderNo(orderDetl.getOrderNo());
|
// cacheSite.setSiteStatus(CacheSiteStatusType.R.id);
|
// cacheSite.setUpdateTime(new Date());
|
// if (!cacheSiteService.updateById(cacheSite)) {
|
// throw new CoolException("缓存站更新失败");
|
// }
|
|
}
|
}
|
|
// task.setTaskSts(TaskStsType.GENERATE_WAVE_SEED.id);
|
// task.setUpdateTime(new Date());
|
// if (!taskService.updateById(task)) {
|
// throw new CoolException("任务更新失败");
|
// }
|
}
|
}
|
} catch (Exception e) {
|
e.printStackTrace();
|
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
|
}finally {
|
InterceptorIgnoreHelper.clearIgnoreStrategy();
|
}
|
}
|
|
}
|