package com.vincent.rsf.server.manager.schedules;
|
|
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
|
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
|
import com.vincent.rsf.framework.common.Cools;
|
import com.vincent.rsf.framework.exception.CoolException;
|
import com.vincent.rsf.server.common.constant.Constants;
|
import com.vincent.rsf.server.manager.constant.LocGroupConstant;
|
import com.vincent.rsf.server.manager.constant.StaGroupConstant;
|
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
|
import com.vincent.rsf.server.manager.entity.*;
|
import com.vincent.rsf.server.manager.enums.*;
|
import com.vincent.rsf.server.manager.service.*;
|
import com.vincent.rsf.server.system.constant.SerialRuleCode;
|
import com.vincent.rsf.server.system.service.ConfigService;
|
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
|
import lombok.extern.slf4j.Slf4j;
|
import org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.BeanUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Component;
|
|
import java.util.*;
|
|
import static com.vincent.rsf.server.system.utils.SystemAuthUtils.getLoginUserId;
|
|
/**
|
* 自动跑库程序
|
*/
|
@Slf4j
|
@Component
|
public class AutoRunSchedules {
|
|
@Autowired
|
private LocService locService;
|
|
@Autowired
|
private ConfigService configService;
|
|
@Autowired
|
private BasStationService stationService;
|
|
@Autowired
|
private TaskService taskService;
|
|
|
@Autowired
|
private TaskItemService taskItemService;
|
|
@Autowired
|
private MatnrService matnrService;
|
|
@Autowired
|
private LocItemService locItemService;
|
|
public void genRun() {
|
String autoRunArea = configService.getVal("AUTO_RUN_AREA", String.class);
|
if (Cools.isEmpty(autoRunArea)) {
|
return;
|
}
|
for (char c : autoRunArea.toCharArray()) {
|
switch (c) {
|
case '1':
|
this.autoRun(LocGroupConstant.FAR_RIGHT_LOC_ROW_LIST, StaGroupConstant.FAR_RIGHT_STA_ROW_LIST);
|
break;
|
case '2':
|
this.autoRun(LocGroupConstant.RIGHT_LOC_ROW_LIST, StaGroupConstant.RIGHT_STA_ROW_LIST);
|
break;
|
case '3':
|
this.autoRun(LocGroupConstant.MIDDLE_LOC_ROW_LIST, StaGroupConstant.MIDDLE_STA_ROW_LIST);
|
break;
|
case '4':
|
this.autoRun(LocGroupConstant.LEFT_LOC_ROW_LIST, StaGroupConstant.LEFT_STA_ROW_LIST);
|
break;
|
case '5':
|
this.autoRun(LocGroupConstant.FAR_LEFT_LOC_ROW_LIST, StaGroupConstant.FAR_LEFT_STA_ROW_LIST);
|
break;
|
default:
|
break;
|
}
|
}
|
|
}
|
|
|
private void autoRun(List<Integer> locGroupList, List<String> staGroupList) {
|
|
List<String> staPreNos = getStaPrefixes(staGroupList);
|
String staTaskMemo = "DEMO_STA_" + String.join("-", staPreNos);
|
|
List<Task> list = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getMemo, staTaskMemo));
|
if (!Cools.isEmpty(list) && list.size() > 30) {
|
return;
|
}
|
// 入库 应该根据工作档回去
|
this.runStaToLoc(locGroupList, staGroupList, staTaskMemo);
|
// 出库,需要校验工作档是否存在,存在就说明站点处于忙碌状态
|
this.runLocToSta(locGroupList, staGroupList, staTaskMemo);
|
|
// 移库
|
this.runLocToLoc(locGroupList, staTaskMemo);
|
}
|
|
|
// 入库
|
private void runStaToLoc(List<Integer> locGroupList, List<String> staGroupList, String memo) {
|
Integer startRow = Collections.min(locGroupList);
|
Integer endRow = Collections.max(locGroupList);
|
|
|
// STA IDLE
|
LambdaQueryWrapper<BasStation> idleWrapper = new LambdaQueryWrapper<BasStation>().eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_F.type).in(BasStation::getStationName, staGroupList);
|
List<BasStation> idleList = stationService.list(idleWrapper);
|
if (Cools.isEmpty(idleList)) {
|
return;
|
}
|
Collections.shuffle(idleList);
|
|
// LOC STOCK
|
LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type);
|
if (null != startRow) {
|
stockWrapper.ge(Loc::getRow, startRow);
|
}
|
if (null != endRow) {
|
stockWrapper.le(Loc::getRow, endRow);
|
}
|
List<Loc> stockList = locService.list(stockWrapper);
|
if (Cools.isEmpty(stockList)) {
|
return;
|
}
|
Collections.shuffle(stockList);
|
|
//生成入库工作档
|
generateTask(idleList.get(0).getStationName(), stockList.get(0).getCode(), idleList.get(0).getBarcode());
|
}
|
|
|
// 出库
|
private void runLocToSta(List<Integer> locGroupList, List<String> staGroupList, String memo) {
|
Integer startRow = Collections.min(locGroupList);
|
Integer endRow = Collections.max(locGroupList);
|
|
|
// STA IDLE
|
LambdaQueryWrapper<BasStation> idleWrapper = new LambdaQueryWrapper<BasStation>().eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_O.type).in(BasStation::getStationName, staGroupList);
|
List<BasStation> idleList = stationService.list(idleWrapper);
|
if (Cools.isEmpty(idleList)) {
|
return;
|
}
|
Collections.shuffle(idleList);
|
|
// LOC STOCK
|
LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type);
|
if (null != startRow) {
|
stockWrapper.ge(Loc::getRow, startRow);
|
}
|
if (null != endRow) {
|
stockWrapper.le(Loc::getRow, endRow);
|
}
|
List<Loc> stockList = locService.list(stockWrapper);
|
if (Cools.isEmpty(stockList)) {
|
return;
|
}
|
Collections.shuffle(stockList);
|
|
|
Loc loc = stockList.get(0);
|
List<LocItem> list = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()));
|
LocToTaskParams param = new LocToTaskParams();
|
param.setType(Constants.TASK_TYPE_OUT_STOCK);
|
param.setTarLoc(loc.getCode());
|
param.setItems(list);
|
param.setSiteNo(idleList.get(0).getStationName());
|
param.setMemo(memo);
|
//生成出库工作档
|
try {
|
locItemService.generateTask(TaskResouceType.TASK_RESOUCE_STOCK_TYPE.val, param, getLoginUserId());
|
} catch (Exception e) {
|
log.info("生成出库任务失败", e);
|
}
|
|
}
|
|
|
// 移库
|
private void runLocToLoc(List<Integer> locGroupList, String staTaskMemo) {
|
Integer startRow = Collections.min(locGroupList);
|
Integer endRow = Collections.max(locGroupList);
|
|
String memo = "DEMO_LOC_" + startRow + "-" + endRow;
|
|
|
// STOCK
|
LambdaQueryWrapper<Loc> stockWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_F.type);
|
if (null != startRow) {
|
stockWrapper.ge(Loc::getRow, startRow);
|
}
|
if (null != endRow) {
|
stockWrapper.le(Loc::getRow, endRow);
|
}
|
List<Loc> stockList = locService.list(stockWrapper);
|
if (Cools.isEmpty(stockList)) {
|
return;
|
}
|
Collections.shuffle(stockList);
|
|
// IDLE
|
LambdaQueryWrapper<Loc> idleWrapper = new LambdaQueryWrapper<Loc>().eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type);
|
if (null != startRow) {
|
idleWrapper.ge(Loc::getRow, startRow);
|
}
|
if (null != endRow) {
|
idleWrapper.le(Loc::getRow, endRow);
|
}
|
List<Loc> idleList = locService.list(idleWrapper);
|
if (Cools.isEmpty(idleList)) {
|
return;
|
}
|
Collections.shuffle(idleList);
|
//生成移库任务
|
Loc loc = stockList.get(0);
|
List<LocItem> list = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()));
|
LocToTaskParams param = new LocToTaskParams();
|
param.setType(Constants.TASK_TYPE_OUT_CHECK);
|
param.setTarLoc(idleList.get(0).getCode());
|
param.setItems(list);
|
param.setOrgLoc(stockList.get(0).getCode());
|
param.setMemo(memo);
|
//生成移库工作档
|
try {
|
locItemService.genMoveTask(param, 6666L);
|
} catch (Exception e) {
|
log.info("生成出库任务失败", e);
|
}
|
|
}
|
|
private void generateTask(String sourceStaNo, String locNo, String barcode) {
|
String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
|
if (StringUtils.isBlank(ruleCode)) {
|
throw new CoolException("编码错误:请确认编码「SYS_TASK_CODE」是否已生成!!");
|
}
|
Task task = new Task();
|
task.setTaskCode(ruleCode)
|
.setTaskStatus(TaskStsType.GENERATE_IN.id)
|
.setTaskType(TaskType.TASK_TYPE_IN.type)
|
.setResource(TaskResouceType.TASK_RESOUCE_PAKIN_TYPE.val)
|
.setTargLoc(locNo)
|
.setBarcode(barcode)
|
.setOrgSite(sourceStaNo)
|
.setCreateBy(6666L)
|
.setUpdateBy(6666L);
|
|
if (!taskService.save(task)) {
|
throw new CoolException("任务保存失败!!");
|
}
|
LambdaQueryWrapper<Matnr> wrapper = new LambdaQueryWrapper<>();
|
wrapper.eq(Matnr::getStatus, 1);
|
wrapper.orderByAsc(Matnr::getUpdateTime);
|
List<Matnr> list = matnrService.page(new Page<>(1, 100), wrapper).getRecords();
|
Collections.shuffle(list);
|
List<TaskItem> taskItems = new ArrayList<>();
|
int i = 0;
|
for (Matnr item : list) {
|
if (i > 5) {
|
break;
|
}
|
TaskItem taskItem = new TaskItem();
|
BeanUtils.copyProperties(item, taskItem);
|
taskItem.setTaskId(task.getId())
|
.setOrderType(OrderType.ORDER_IN.type)
|
.setCreateBy(6666L)
|
.setUpdateBy(6666L)
|
.setExtendFields(item.getExtendFields());
|
taskItems.add(taskItem);
|
item.setUpdateTime(new Date());
|
matnrService.updateById(item);
|
i++;
|
}
|
taskItemService.saveBatch(taskItems);
|
}
|
|
|
public static List<String> getStaPrefixes(List<String> staGroupList) {
|
Set<String> rowSet = new HashSet<>();
|
for (String s : staGroupList) {
|
rowSet.add(s.split("-")[0]);
|
}
|
List<String> result = new ArrayList<>(rowSet);
|
result.sort(Comparator.comparingInt(Integer::parseInt));
|
return result;
|
}
|
}
|