zjj
2024-05-07 ab18ecb1c25613535c2047467cf8c14d3b41b047
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -24,6 +24,7 @@
import com.zy.common.utils.News;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
import com.zy.core.RgvThread;
import com.zy.core.cache.MessageQueue;
import com.zy.core.cache.SlaveConnection;
import com.zy.core.enums.*;
@@ -46,6 +47,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
@@ -86,9 +88,13 @@
    private BasErrLogService basErrLogService;
    @Autowired
    private BasCrnErrorMapper basCrnErrorMapper;
    @Autowired
    private EmptyBarrelInService emptyBarrelInService;
    @Value("${wms.url}")
    private String wmsUrl;
    public int workNo = 9900;
    /**
     * 组托
@@ -491,6 +497,9 @@
     */
    public synchronized void crnStnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            if (crnSlave.getId() ==5){
                continue;
            }
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                // 获取堆垛机出库站信息
@@ -561,6 +570,9 @@
     */
    public synchronized void crnIoExecute() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            if (crn.getId() == 5){
                continue;
            }
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
@@ -2189,7 +2201,29 @@
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                Crn5InTaskSta(crnSlave,crnProtocol);
//                Crn5InTaskSta(crnSlave,crnProtocol);
                // 如果最近一次是入库模式
                if (crnProtocol.getLastIo().equals("I")) {
                    if (basCrnp.getInEnable().equals("Y")) {
                        this.Crn5InTaskSta(crnSlave,crnProtocol);
                        crnProtocol.setLastIo("O");
                    } else if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrn5Stn(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    }
                }
                // 如果最近一次是出库模式
                else if (crnProtocol.getLastIo().equals("O")) {
                    if (basCrnp.getOutEnable().equals("Y")) {
                        this.locToCrn5Stn(crnSlave, crnProtocol); //  出库
                        crnProtocol.setLastIo("I");
                    } else if (basCrnp.getInEnable().equals("Y")) {
                        this.Crn5InTaskSta(crnSlave,crnProtocol);
                        crnProtocol.setLastIo("O");
                    }
                }
            }
@@ -2249,4 +2283,319 @@
    }
    public synchronized void crn5StnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            if (crnSlave.getId() != 5){
                continue;
            }
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                // 获取堆垛机出库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()) {
                    // 查询工作档
                    WrkMast wrkMast = wrkMastMapper.selectPakOutStep2(crnStn.getStaNo());
                    if (wrkMast == null) {
                        continue;
                    }
                    // 判断工作档条件
                    if (wrkMast.getIoType() < 100 || wrkMast.getStaNo() == null || wrkMast.getSourceStaNo() == null) {
                        continue;
                    }
                    // 判断吊车是否实际已完成,且电脑状态在move中,以备电脑进行更新工作档
                    CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, wrkMast.getCrnNo());
                    CrnProtocol crnProtocol = crnThread.getCrnProtocol();
                    if (crnProtocol.statusType == CrnStatusType.FETCHING || crnProtocol.statusType == CrnStatusType.PUTTING) {
                        // 移动中
                        continue;
                    }
                    //  判断堆垛机状态等待确认
                    if (crnProtocol.modeType == CrnModeType.AUTO && crnProtocol.getTaskNo().equals(wrkMast.getWrkNo().shortValue())
                            && crnProtocol.statusType == CrnStatusType.WAITING
                            && crnProtocol.forkPosType == CrnForkPosType.HOME) {
                            // 更新工作档状态为14
                            wrkMast.setWrkSts(14L);
                        wrkMast.setCrnEndTime(new Date());
                        if (wrkMastMapper.updateById(wrkMast) != 0) {
                            // 复位堆垛机
                            crnThread.setResetFlag(true);
                        } else {
                            log.error("更新工作档的工作状态为14失败!!! [工作号:{}]", wrkMast.getWrkNo());
                        }
                    }
                }
            }
        }
    }
    public synchronized void locToCrn5Stn(CrnSlave slave, CrnProtocol crnProtocol) {
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的出库工作档
//            WrkMast wrkMast = wrkMastMapper.selectPakOutStep1(slave.getId(), crnStn.getStaNo());
            List<WrkMast> wrkMasts = wrkMastMapper.selectPakOutStep11(slave.getId(), crnStn.getStaNo());
            //            获取工作状态为14的工作档
            WrkMast wrkMast1 = wrkMastMapper.selectPakOutStep14(slave.getId(), crnStn.getStaNo());
            if ( wrkMast1 !=null) {
                continue;
            }
            for (WrkMast wrkMast : wrkMasts) {
                if (wrkMast == null) {
                    continue;
                }
                // 工作档状态判断
                if (wrkMast.getIoType() < 100 || wrkMast.getSourceStaNo() == null) {
                    log.error("查询工作档数据不符合条件--入出类型/站点, 工作号={},源库位={},入出类型={}", wrkMast.getWrkNo(), wrkMast.getSourceLocNo(), wrkMast.getIoType());
                    continue;
                }
                // 获取源库位信息
                LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
                if (!locMast.getLocSts().equals("R") && !locMast.getLocSts().equals("P")) {
                    log.error("出库操作库位状态不符合--状态, 库位号={},库位状态={}", wrkMast.getLocNo(), locMast.getLocSts());
                    continue;
                }
                // 获取堆垛机出库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    break;
//                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 查询站点详细信息
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                if (staDetl == null) {
                    log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    break;
//                    continue;
                }
                // 判断堆垛机出库站状态
                if (staProtocol.isAutoing() && !staProtocol.isLoading() && staProtocol.isOutEnable()) {
                    // 命令下发区 --------------------------------------------------------------------------
                    // 堆垛机控制过滤
                    if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
//                        continue;
                        break;
                    }
                    // 已经存在吊车执行任务时,则过滤
                    if (wrkMastMapper.selectWorking(slave.getId()) != null) {
                        break;
//                        return;
                    }
                    // 1.堆垛机开始移动
                    CrnCommand crnCommand = new CrnCommand();
                    crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                    crnCommand.setTaskNo(wrkMast.getWrkNo().shortValue()); // 工作号
                    crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                    crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                    crnCommand.setSourcePosX(locMast.getRow1()==9?(short)4:(short)5);     // 源库位排
                    crnCommand.setSourcePosY(locMast.getBay1().shortValue());     // 源库位列
                    crnCommand.setSourcePosZ(locMast.getLev1().shortValue());     // 源库位层
                    crnCommand.setDestinationPosX(crnStn.getRow().shortValue());     // 目标库位排
                    crnCommand.setDestinationPosY(crnStn.getBay().shortValue());     // 目标库位列
                    crnCommand.setDestinationPosZ(crnStn.getLev().shortValue());     // 目标库位层
                    crnCommand.setLocType1(locMast.getLocType1().shortValue());     // 货物类型
                    if (!MessageQueue.offer(SlaveType.Crn, wrkMast.getCrnNo(), new Task(2, crnCommand))) {
                        log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", wrkMast.getCrnNo(), JSON.toJSON(crnCommand));
                    } else {
                        // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                        Date now = new Date();
                        wrkMast.setWrkSts(12L);
                        wrkMast.setCrnStrTime(now);
                        wrkMast.setModiTime(now);
                        if (wrkMastMapper.updateById(wrkMast) == 0) {
                            log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", wrkMast.getWrkNo());
                        }
                        break;
                    }
                }
            }
        }
    }
    public synchronized void crn5TaskCreate() throws IOException {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            if (crnSlave.getId() != 5){
                continue;
            }
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnInStn()) {
                // 获取堆垛机出库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                if (staProtocol == null) {
                    break;
//                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()){
                    EmptyBarrelIn emptyBarrelIn = emptyBarrelInService.selectOne(new EntityWrapper<>());
                    if (Cools.isEmpty(emptyBarrelIn)){
                        continue;
                    }
                    FullStoreParam fullStoreParam = new FullStoreParam();
                    fullStoreParam.setDevpNo(crnStn.getStaNo());
                    FullStoreParam.MatCodeStore matCodeStore = new FullStoreParam.MatCodeStore();
                    matCodeStore.setMatnr(emptyBarrelIn.getMatnr());
                    matCodeStore.setBatch(emptyBarrelIn.getBatch());
                    if (staProtocol.isForce()){
                        log.info("空桶强制入库:"+staProtocol.getAmount());
                        matCodeStore.setAnfme(Double.valueOf(staProtocol.getAmount()));
                    }else {
                        matCodeStore.setAnfme(8d) ;
                    }
                    ArrayList<FullStoreParam.MatCodeStore> matCodeStores = new ArrayList<>();
                    matCodeStores.add(matCodeStore);
                    fullStoreParam.setList(matCodeStores);
                    try {
                        String response = new HttpHandler.Builder()
                                .setUri(wmsUrl)
                                .setPath("/full/store/put/start")
                                .setJson(JSON.toJSONString(fullStoreParam))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            devpThread.setPakMk(crnStn.getStaNo(),false);
                        }
                    }catch (CoolException e){
                    }
                }
            }
        }
    }
    public synchronized void RGVTaskPut(){
        for (RgvSlave rgvSlave:slaveProperties.getRgv()){
            ZyRgvThread rgvThread = (ZyRgvThread)SlaveConnection.get(SlaveType.Rgv, rgvSlave.getId());
            RgvProtocol rgvProtocol = rgvThread.getRgvProtocol();
            if (rgvProtocol.getModeType() != RgvModeType.AUTO){
                continue;
            }
            int workNo1 = 0;
            int workNo2 = 0;
            short souSta1 = 0;
            short sta1 = 0;
            short souSta2 = 0;
            short sta2 = 0;
            //工位一任务
            for (RgvSlave.Sta inStn :  rgvSlave.getInStn()){
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId());
                StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo());
                if (staProtocol == null) {
                    break;
//                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){
                    if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){
                        WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo());
                        if (Cools.isEmpty(wrkMast)){
                            log.error("未找到工作档");
                            continue;
                        }
                        workNo1 = wrkMast.getWrkNo();
                        souSta1 = inStn.getSourceStaNo().shortValue();
                        sta1 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo());
                        break;
                    }
                    workNo1 = workNo++;
                    souSta1 = inStn.getSourceStaNo().shortValue();
                    sta1 = inStn.getStaNo().shortValue();
                    break;
                }
            }
            //工位二任务
            for (RgvSlave.Sta inStn :  rgvSlave.getInStn()){
                if (souSta1 == inStn.getSourceStaNo()){
                    continue;
                }
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, inStn.getSourcePlcId());
                StaProtocol staProtocol = devpThread.getStation().get(inStn.getSourceStaNo());
                if (staProtocol == null) {
                    break;
//                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isLoading() && staProtocol.isLoading() && staProtocol.isInEnable()){
                    if (staProtocol.getWorkNo() > 0 && staProtocol.getWorkNo() <9900){
                        WrkMast wrkMast = wrkMastService.selectByworkNo(staProtocol.getWorkNo());
                        if (Cools.isEmpty(wrkMast)){
                            log.error("未找到工作档");
                            continue;
                        }
                        workNo2 = wrkMast.getWrkNo();
                        souSta2 = inStn.getSourceStaNo().shortValue();
                        sta2 = Utils.getRgvEndStaNo(rgvSlave.getId(),wrkMast.getStaNo());
                        break;
                    }
                    workNo2 = workNo++;
                    souSta2 = inStn.getSourceStaNo().shortValue();
                    sta2 = inStn.getStaNo().shortValue();
                    break;
                }
            }
            //rgv任务下发--------------------------------------------------------------
            RgvCommand command = new RgvCommand();
            command.setRgvNo(rgvSlave.getId()); // RGV编号
            //工位1
            command.setTaskNo1(workNo1); // 工作号
            command.setSourceStaNo1(souSta1); // 源站
            command.setDestinationStaNo1(sta1);  // 目标站
            command.setAckFinish1(false);  // 任务完成确认位
            //工位2
            command.setTaskNo2(workNo2); // 工作号
            command.setSourceStaNo2(souSta2); // 源站
            command.setDestinationStaNo2(sta2);  // 目标站
            command.setAckFinish2(false);  // 任务完成确认位
            if (workNo1 != 0 && workNo2 ==0){
                command.setTaskMode(RgvTaskModeType.FETCH_PUT2); // 任务模式: 取放货
            } else if (workNo1 == 0 && workNo2 !=0) {
                command.setTaskMode(RgvTaskModeType.FETCH_PUT1); // 任务模式: 取放货
            }else {
                command.setTaskMode(RgvTaskModeType.FETCH_PUT_ALL); // 任务模式: 取放货
            }
            command.setCommand(false);
            MessageQueue.offer(SlaveType.Rgv, rgvSlave.getId(), new Task(2, command));
            log.info("rgv任务下发:"+JSON.toJSONString(command));
        }
    }
    public synchronized void RGVTaskOver() {
    }
}