zhang
13 小时以前 f73dad756121e3e12df88adeed0132342ddf115e
跑酷
2个文件已修改
3个文件已添加
436 ■■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/manager/constant/LocGroupConstant.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/constant/StaGroupConstant.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AutoRunSchedules.java 293 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/constant/LocGroupConstant.java
New file
@@ -0,0 +1,81 @@
package com.vincent.rsf.server.manager.constant;
import java.util.ArrayList;
public class LocGroupConstant {
    public static final ArrayList<Integer> FAR_LEFT_LOC_ROW_LIST  = new ArrayList<Integer>(){{
        add(49);
        add(50);
        add(51);
        add(52);
        add(53);
        add(54);
        add(55);
        add(56);
        add(57);
        add(58);
        add(59);
    }};
    public static final ArrayList<Integer> LEFT_LOC_ROW_LIST  = new ArrayList<Integer>(){{
        add(37);
        add(38);
        add(39);
        add(40);
        add(41);
        add(42);
        add(43);
        add(44);
        add(45);
        add(46);
        add(47);
        add(48);
    }};
    public static final ArrayList<Integer> MIDDLE_LOC_ROW_LIST  = new ArrayList<Integer>(){{
        add(25);
        add(26);
        add(27);
        add(28);
        add(29);
        add(30);
        add(31);
        add(32);
        add(33);
        add(34);
        add(35);
        add(36);
    }};
    public static final ArrayList<Integer> RIGHT_LOC_ROW_LIST  = new ArrayList<Integer>(){{
        add(13);
        add(14);
        add(15);
        add(16);
        add(17);
        add(18);
        add(19);
        add(20);
        add(21);
        add(22);
        add(23);
        add(24);
    }};
    public static final ArrayList<Integer> FAR_RIGHT_LOC_ROW_LIST  = new ArrayList<Integer>(){{
        add(1);
        add(2);
        add(3);
        add(4);
        add(5);
        add(6);
        add(7);
        add(8);
        add(9);
        add(10);
        add(11);
        add(12);
    }};
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/constant/StaGroupConstant.java
New file
@@ -0,0 +1,54 @@
package com.vincent.rsf.server.manager.constant;
import java.util.ArrayList;
public class StaGroupConstant {
    public static final ArrayList<String> FAR_LEFT_STA_ROW_LIST  = new ArrayList<String>(){{
        add("9-1");
        add("9-2");
        add("9-3");
        add("10-1");
        add("10-2");
        add("10-3");
        add("1001");
        add("1007");
    }};
    public static final ArrayList<String> LEFT_STA_ROW_LIST  = new ArrayList<String>(){{
        add("7-1");
        add("7-2");
        add("7-3");
        add("8-1");
        add("8-2");
        add("8-3");
    }};
    public static final ArrayList<String> MIDDLE_STA_ROW_LIST  = new ArrayList<String>(){{
        add("5-1");
        add("5-2");
        add("5-3");
        add("6-1");
        add("6-2");
        add("6-3");
    }};
    public static final ArrayList<String> RIGHT_STA_ROW_LIST  = new ArrayList<String>(){{
        add("3-1");
        add("3-2");
        add("3-3");
        add("4-1");
        add("4-2");
        add("4-3");
    }};
    public static final ArrayList<String> FAR_RIGHT_STA_ROW_LIST  = new ArrayList<String>(){{
        add("1-1");
        add("1-2");
        add("1-3");
        add("2-1");
        add("2-2");
        add("2-3");
    }};
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java
@@ -32,4 +32,6 @@
    @ApiModelProperty("目标库位")
    private String tarLoc;
    @ApiModelProperty("备注")
    private String memo;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AutoRunSchedules.java
New file
@@ -0,0 +1,293 @@
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;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -117,7 +117,8 @@
                    .setCreateTime(new Date())
                    .setUpdateTime(new Date())
                    .setTaskStatus(TaskStsType.GENERATE_OUT.id)
                    .setBarcode(loc.getBarcode());
                    .setBarcode(loc.getBarcode())
                    .setMemo(map.getMemo());
            List<LocItem> locItems = this.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, key));
            if (locItems.isEmpty()) {
@@ -334,7 +335,8 @@
                .setSort(Constants.TASK_SORT_DEFAULT_VALUE)
                .setUpdateTime(new Date())
                .setTaskStatus(TaskStsType.GENERATE_IN.id)
                .setBarcode(orgLoc.getBarcode());
                .setBarcode(orgLoc.getBarcode())
                .setMemo(map.getMemo());
        if (!taskService.save(task)) {
            throw new CoolException("新建移库任务失败!!");