New file |
| | |
| | | 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; |
| | | } |
| | | } |