pjb
2025-06-23 d8060afba15f67e443bb2f89410313905bdc7ebe
米多泉泉州wcs功能完善
15个文件已修改
1个文件已添加
444 ■■■■■ 已修改文件
src/main/java/com/zy/common/model/CanningLineInLocParam.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/model/protocol/StaProtocol.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensCrnThread.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/LocDetl.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/WrkMast.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/entity/param/StockOutParam.java 79 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/mapper/LocDetlMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/mapper/WrkMastMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/LocDetlService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/LocDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/service/impl/MainServiceImpl.java 225 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/utils/HttpHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/CanningLineInLocParam.java
@@ -28,6 +28,9 @@
    // 复检重量
    private double grossWeight;
    // 罐装量
    private double cannedVolume;
    // 复检合格否
    private boolean reinspection;
src/main/java/com/zy/core/MainProcess.java
@@ -54,22 +54,18 @@
                    // 1090异常口重新入库分配库位
                    mainService.abnormalMouthWarehousing();
                    Thread.sleep(1000);
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile(1); // 组托
                    Thread.sleep(1000);
                    // 生成 空子/母托盘出库任务
                    mainService.generateEmptyPalletStoreWrk();
                    // 入库 ===>> 母托盘叠满入库
                    mainService.autoEmptyIn();
                    Thread.sleep(1000);
                    // 子托盘底下母托盘回叠盘机
//                    mainService.motherTrayReflow();
                    mainService.motherTrayReflow();
                    // 出库  ===>>  堆垛机出库站到出库站
                    mainService.crnStnToOutStn(4);
@@ -80,12 +76,17 @@
                    // 入库  ===>> 执行对工作档的完成操作
                    mainService.storeFinished(6);
                    // 堆垛机回原点
                    mainService.originGo();
                    // 空桶到达罐装线入口 告诉罐装线入库桶信息
                    mainService.inGzxBefore();
                    // 空桶罐装完成到达罐装线出口 完成直供罐装线任务和空桶出库任务,创建成品桶入库任务
                    mainService.canningLineTaskFinish();
                    Thread.sleep(1000);
                    // 读要桶信号,自动出空桶
                    mainService.autoOutEmptyBucket();
                    // 堆垛机异常信息记录
                    mainService.recCrnErr(7);
src/main/java/com/zy/core/model/protocol/StaProtocol.java
@@ -108,6 +108,9 @@
    // 复检合格否
    private boolean reinspection;
    // 罐装量
    private double cannedVolume;
    // 出罐装线任务完成,给罐装线写可放信号 1可放,2不可放-------------------------------------
    private int placeableFlag;
src/main/java/com/zy/core/thread/SiemensCrnThread.java
@@ -366,6 +366,12 @@
                    }
                }while (writeCount2<5);
            }
        } else {
            BasCrnpService basCrnpService = SpringUtils.getBean(BasCrnpService.class);
            BasCrnp basCrnp = basCrnpService.selectById(slave.getId());
            basCrnp.setModiTime(new Date());
            basCrnpService.updateById(basCrnp);
            log.info("更新{}号堆垛机执行任务完成复位时间",slave.getId());
        }
        try {
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -63,7 +63,7 @@
    }};
    public static final ArrayList<Integer> rgvSiteBackWrkNo2= new ArrayList<Integer>() {{
        add(1044);
        add(1044);add(1090);
    }};
    public static final ArrayList<Integer> rgvSiteBackWrkNo3= new ArrayList<Integer>() {{
@@ -224,7 +224,7 @@
        // 读罐装线反馈信息
        if (slave.getId() > 3) {
//            log.info("读取{}号罐装线plc信息成功",slave.getId());
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB101.0", (short) 60);
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB101.0", (short) 64);
            if (read.IsSuccess) {
                // 15秒打印一下日志
                if (System.currentTimeMillis() - lastLogTime >= 15000) {
@@ -253,6 +253,7 @@
                    staProtocol.setBatch(siemensS7Net.getByteTransform().TransString(read.Content, 40,10,"UTF-8"));
                    staProtocol.setManuDate(siemensS7Net.getByteTransform().TransString(read.Content, 50,8,"UTF-8"));
                    staProtocol.setReinspection(siemensS7Net.getByteTransform().TransInt16(read.Content, 58) == 1);
                    staProtocol.setCannedVolume(siemensS7Net.getByteTransform().TransSingle(read.Content, 60));
                }
                return;
            }
@@ -504,15 +505,17 @@
        do {
            write = siemensS7Net.Write("DB100.0", common);
            Thread.sleep(200);
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB100.4", (short) 2);
            OperateResultExOne<byte[]> read = siemensS7Net.Read("DB100.0", (short) 6);
            if(write.IsSuccess && read.IsSuccess){
                short i = siemensS7Net.getByteTransform().TransInt16(read.Content, 0);
                if ( i != staProtocol.getWorkNo().shortValue()) {
                short bucketType = siemensS7Net.getByteTransform().TransInt16(read.Content, 0);
                short bucketCount = siemensS7Net.getByteTransform().TransInt16(read.Content, 2);
                short workNo = siemensS7Net.getByteTransform().TransInt16(read.Content, 4);
                if ( workNo != common[2] || bucketCount != common[1] || bucketType != common[0]) {
                    writeCount++;
                    log.error("给罐装线写入桶型信息成功,但回读失败:写入任务号:{},回读任务号:{},输送线plc编号={},写入次数={}",staProtocol.getWorkNo().shortValue(), i, slave.getId(), writeCount);
                    log.error("给罐装线写入桶型信息成功,但回读失败:写入任务号:{},回读任务号:{},输送线plc编号={},写入次数={}", Arrays.toString(common), bucketType +"-" + bucketCount + "-" + workNo, slave.getId(), writeCount);
                    continue;
                }
                log.info("给罐装线写入桶型信息成功,回读成功:任务号:{},回读任务号:{},输送线plc编号={},写入次数={}",staProtocol.getWorkNo().shortValue(), i, slave.getId(), writeCount);
                log.info("给罐装线写入桶型信息成功,回读成功:任务号:{},回读任务号:{},输送线plc编号={},写入次数={}",staProtocol.getWorkNo().shortValue(), Arrays.toString(common), slave.getId(), writeCount);
                break;
            }
            else {
src/main/java/com/zy/entity/LocDetl.java
@@ -98,9 +98,11 @@
    private Double weight;
    @ApiModelProperty(value= "长度")
    private Double length;
    @TableField("man_length")
    private Double manLength;
    @ApiModelProperty(value= "体积")
    @TableField("volume")
    private Double volume;
    @ApiModelProperty(value= "三方编码")
@@ -154,6 +156,45 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    /**
     * 备用1
     */
    @ApiModelProperty(value= "备用1")
    private String standby1 = "";
    /**
     * 备用2
     */
    @ApiModelProperty(value= "备用2")
    private String standby2 = "";
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    private String standby3 = "";
    /**
     * 备用1
     */
    @ApiModelProperty(value= "备用1")
    @TableField("box_type1")
    private String boxType1 = "1";
    /**
     * 备用2
     */
    @ApiModelProperty(value= "备用2")
    @TableField("box_type2")
    private String boxType2 = "1";
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    @TableField("box_type3")
    private String boxType3 = "1";
    public String getLocNo$(){
        LocMastService service = SpringUtils.getBean(LocMastService.class);
        LocMast locMast = service.selectById(this.locNo);
src/main/java/com/zy/entity/WrkMast.java
@@ -310,6 +310,14 @@
    @TableField("rgv_dsta_no")
    private Integer rgvDstaNo;
    @ApiModelProperty(value= "rgv命令下发时间")
    @TableField("rgv_create_time")
    private Date rgvCreateTime;
    @ApiModelProperty(value= "rgv任务完成时间")
    @TableField("rgv_finish_time")
    private Date rgvFinishTime;
    @TableField("work_no_other")
    private Integer workNoOther;
src/main/java/com/zy/entity/param/StockOutParam.java
New file
@@ -0,0 +1,79 @@
package com.zy.entity.param;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
/**
 * Created by vincent on 2020/6/13
 */
@Data
public class StockOutParam {
    // 出站口
    private Integer outSite;
    // 物料编号集合
    private List<LocDetl> locDetls;
    @Data
    public static class LocDetl {
        // 库位号
        private String locNo;
        // 商品编号
        private String matnr;
        // 序列码
        private String batch;
        // 数量
        private Double count;
        private String brand;
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        private String standby1 = "";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        private String standby2 = "";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        private String standby3 = "";
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        @TableField("box_type1")
        private String boxType1 = "1";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        @TableField("box_type2")
        private String boxType2 = "1";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        @TableField("box_type3")
        private String boxType3 = "1";
    }
}
src/main/java/com/zy/mapper/LocDetlMapper.java
@@ -28,4 +28,5 @@
    @Select("SELECT ld.loc_no FROM asr_loc_detl ld LEFT JOIN asr_loc_mast lm ON ld.loc_no = lm.loc_no WHERE (1 = 1 AND ld.matnr = #{matnr} AND (lm.row1 >= #{start} AND lm.row1 <= #{end})  AND lm.loc_sts = 'F' AND DateDiff(dd, lm.modi_time, getdate()) = 0) ORDER BY lm.modi_time ASC")
    List<String> selectSameDetlToday(@Param("matnr") String matnr, @Param("start") Integer start, @Param("end") Integer end);
    List<LocDetl> selectListByMatnr(@Param("bucketType") int bucketType);
}
src/main/java/com/zy/mapper/WrkMastMapper.java
@@ -11,6 +11,12 @@
@Repository
public interface WrkMastMapper extends BaseMapper<WrkMast> {
    /**
     * 查询入灌装线站点在途任务数(未进罐装线里面)
     * @param site 入罐装线站点
     */
    int selectInGzxCount(@Param("site") int site);
    WrkMast selectByLocNo(@Param("sourceLocNo") String sourceLocNo);
    WrkMast selectByLocNo1(@Param("sourceLocNo") String sourceLocNo);
src/main/java/com/zy/service/LocDetlService.java
@@ -24,4 +24,5 @@
     */
    List<String> getSameDetlToday(String matnr, Integer start, Integer end);
    List<LocDetl> selectListByMatnr(int bucketType);
}
src/main/java/com/zy/service/impl/LocDetlServiceImpl.java
@@ -40,4 +40,9 @@
        return this.baseMapper.selectSameDetlToday(matnr, start, end);
    }
    @Override
    public List<LocDetl> selectListByMatnr(int bucketType) {
        return this.baseMapper.selectListByMatnr(bucketType);
    }
}
src/main/java/com/zy/service/impl/MainServiceImpl.java
@@ -26,8 +26,11 @@
import com.zy.core.thread.LedThread;
import com.zy.core.thread.SiemensDevpThread;
import com.zy.entity.*;
import com.zy.entity.param.StockOutParam;
import com.zy.mapper.*;
import com.zy.service.*;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import com.zy.utils.*;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +39,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.*;
import java.util.stream.Collectors;
@@ -136,6 +140,9 @@
    private WrkMastService wrkMastService;
    @Autowired
    private BasRgvMapService basRgvMapService;
    @Resource
    private ConfigService configService;
    @Value("${wms.url}")
    private String wmsUrl;
@@ -884,7 +891,7 @@
                        }
                        newLocNo = newLocNo + locNo.substring(2);
                        // 对应库位有无任务
                        WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo));
                        WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("source_loc_no", newLocNo).eq("wrk_sts",11));
                        if(wrkMast1 == null) {
                             if(locNo.startsWith("10") || locNo.startsWith("11")){ // 浅库位
@@ -1075,7 +1082,7 @@
            //  状态:等待确认 并且  任务完成位 = 1
            if (crnProtocol.statusType == CrnStatusType.WAITING && crnProtocol.getTaskNo() != 0) {
                News.warnNoLog(""+mark+" - 0"+" - 开始执行对工作档的完成操作");
                if (crnProtocol.getTaskNo() == 9999) {
                if (crnProtocol.getTaskNo() == 9999) { // 回原点任务号
                    // 堆垛机复位
                    crnThread.setResetFlag(true);
                } else {
@@ -1121,6 +1128,51 @@
//        News.infoNoLog(""+mark+" - 0"+" - 对工作档的完成操作执行完成");
    }
    /**
     * 堆垛机回原点
     */
    public synchronized void originGo() {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            // 获取堆垛机信息
            CrnThread crnThread = (CrnThread) SlaveConnection.get(SlaveType.Crn, crn.getId());
            CrnProtocol crnProtocol = crnThread.getCrnProtocol();
            if (crnProtocol == null) {
                continue;
            }
            if (crnProtocol.getStatusType() == CrnStatusType.IDLE && crnProtocol.getTaskNo() == 0 && crnProtocol.getModeType() == CrnModeType.AUTO
                    && crnProtocol.getLoaded() == 0 && crnProtocol.getForkPos() == 0) {
                // 判断是不是已在原点
                if(crnProtocol.getBay() == 0 && crnProtocol.getLevel() == 1) {
                    continue;
                }
                // 判断是不是空闲三分钟
                BasCrnp basCrnp = basCrnpService.selectById(crn.getId());
                Date now = new Date();
                Date modiTime = basCrnp.getModiTime();
                long diffInMillis = now.getTime()-modiTime.getTime();
                if(diffInMillis < 3 * 60 * 1000) {
                    continue;
                }
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(crn.getId()); // 堆垛机编号
                crnCommand.setTaskNo((short) 9999); // 工作号
                crnCommand.setTaskMode(CrnTaskModeType.GO_ORIGIN); // 任务模式:  回原点
                crnCommand.setSourcePosX((short) (crn.getId() == 1 ? 4 : crn.getId() == 2 ? 6 : crn.getId() == 3 ? 7 : 11));     // 源库位排
                crnCommand.setSourcePosY((short) 0);     // 源库位列
                crnCommand.setSourcePosZ((short) 1);     // 源库位层
                crnCommand.setDestinationPosX((short) 0);     // 目标库位排
                crnCommand.setDestinationPosY((short) 0);     // 目标库位列
                crnCommand.setDestinationPosZ((short) 0);     // 目标库位层
                if (!MessageQueue.offer(SlaveType.Crn, crn.getId(), new Task(2, crnCommand))) {
                    News.error("回原点任务下发失败", crn.getId(), JSON.toJSON(crnCommand));
                } else {
                    log.info("{}号堆垛机回原点任务下发成功:{}", crn.getId(), JSON.toJSON(crnCommand));
                }
            }
        }
    }
    /**
     * 堆垛机异常信息记录
     */
@@ -1565,6 +1617,9 @@
                    case 1019:dismantlingMachine = 1020;break;
                    case 1034:dismantlingMachine = 1035;break;
                }
                if(staProtocol.getSiteId() == 1034 && staProtocol.isHigh()) {
                    continue;
                }
                if (wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 110).eq("sta_no", dismantlingMachine)).size() > 0) {
//                    log.warn("{}站点已经存在两个空板出库任务", entry.getKey());
                    continue;
@@ -1584,7 +1639,7 @@
                    if (jsonObject.getInteger("code").equals(200)) {
                        log.info("空托出库请求成功:请求参数{},返回值:{}", map, response);
                    } else {
                        log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
//                        log.error("空拖出库请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
                    }
                } catch (Exception e) {
                    log.error("空拖出库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/auto/emptyOut/v1", map, response);
@@ -1615,10 +1670,17 @@
                    log.error("呼叫rgv,任务号不存在:{}",staProtocol.getWorkNo());
                    continue;
                }
                if (staProtocol.getSiteId() == 1090 && wrkMast.getLocNo() == null) {
                if (staProtocol.getSiteId() == 1090 && wrkMast.getStaNo() == 1090) {
                    continue;
                }
                if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && wrkMast.getRgvNo() == null) {
                if ((wrkMast.getWrkSts() == 2 || wrkMast.getWrkSts() == 15) && (wrkMast.getRgvNo() == null || wrkMast.getRgvDstaNo() == 1090)) {
                    // 有1090的任务跳过rgv分配
                    if(wrkMast.getStaNo() == 1090) {
                        int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>().where("sta_no = 1090 or source_sta_no = 1090 "));
                        if (count > 1) {
                            continue;
                        }
                    }
                    wrkMast.setRgvNo(0);
                    wrkMast.setRgvSstaNo(site);
                    wrkMast.setRgvDstaNo(taskStaNoToRgvStaNoMap.get(wrkMast.getStaNo()));
@@ -1655,15 +1717,18 @@
                if(wrkMast.getIoType() == 3 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) { // 到1024出库口,放到输送线后任务完成
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        log.warn("rgv放货完成3,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(5L);
//                    if(wrkMast.getStaNo() == 1090) {
//                        wrkMast.setWrkSts(3L);
//                    }
                    wrkMast.setModiTime(new Date());
                    wrkMastService.updateById(wrkMast);
                } else if(wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 1024 || wrkMast.getStaNo() == 1016 || wrkMast.getStaNo() == 1043)) {
                    if(wrkMast.getWrkSts() != 2 ) {
                        log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts());
                        log.warn("rgv放货完成101,rgv未复位:rgv号{},任务号:{},任务状态{}", wrkMast.getRgvNo(), wrkMast.getWrkNo(), wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
@@ -1671,7 +1736,7 @@
                    wrkMastService.updateById(wrkMast);
                } else if(wrkMast.getIoType() == 110 && (wrkMast.getStaNo() == 1002 || wrkMast.getStaNo() == 1020 ||wrkMast.getStaNo() == 1035)) {
                    if(wrkMast.getWrkSts() != 2 ){
                        log.warn("rgv放货完成,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        log.warn("rgv放货完成110,rgv未复位:rgv号{},任务号:{},任务状态{}",wrkMast.getRgvNo(),wrkMast.getWrkNo(),wrkMast.getWrkSts());
                        continue;
                    }
                    wrkMast.setWrkSts(15L);
@@ -1709,16 +1774,16 @@
                log.error("异常口入库任务号无任务:{}", staProtocol.getWorkNo());
                return;
            } else if (wrkMast.getLocNo() != null) {
                log.info("异常口入库库位已分配:{}", wrkMast.getLocNo());
//                log.info("异常口入库库位已分配:{}", wrkMast.getLocNo());
                return;
            } else if(wrkMast.getStaNo() != 1090) {
                log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo());
//                log.info("异常口入库入库目标站点已分配:{}", wrkMast.getStaNo());
                return;
            }
            try {
                CanningLineInLocParam param = new CanningLineInLocParam();
                param.setWrkNo(staProtocol.getWrkNo());
                param.setWrkNo(staProtocol.getWorkNo());
                param.setSourceStaNo(1090);
                param.setTbFlag(staProtocol.isInEnable()); // true入成品库,false入空桶库
@@ -1731,19 +1796,7 @@
                log.info("异常口入库请求wms原始返回:" + response);
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
//                    StartupDto dto = jsonObject.getObject("data", StartupDto.class);
//                    staProtocol.setWorkNo(dto.getWorkNo());
//                    staProtocol.setStaNo(dto.getStaNo().shortValue());
//                    devpThread.setPakMk(staProtocol.getSiteId(), false);
//                    boolean result = MessageQueue.offer(SlaveType.Devp, 2, new Task(2, staProtocol));
//                    if (result) {
//                        log.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        News.info("异常口入库推送输送线命令成功:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                    } else {
//                        log.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        News.error("异常口入库推送输送线命令失败:" + dto.getWorkNo() + "," + 1090 + "," + dto.getStaNo());
//                        throw new CoolException("异常口入库推送输送线命令失败:" + 1090);
//                    }
                    log.error("异常口入库请求接口成功常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                } else {
                    log.error("异常口入库请求接口异常,url:{},request:{},response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
                    News.error("异常口入库请求接口异常!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/CanningLine/loc/v1", JSON.toJSONString(param), response);
@@ -1821,7 +1874,12 @@
        }
        // 站点条件判断
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.getWrkNo() == 0) {
        if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable()
                 && staProtocol.getWorkNo() == 0 && staProtocol.isHigh()) {
            WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 3).eq("source_sta_no", 1034).eq("sta_no", 1024));
            if (wrkMast1 != null) {
                return;
            }
            Date now = new Date();
            // 保存工作档
@@ -1830,6 +1888,7 @@
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(2L);
            wrkMast.setIoType(3);
            wrkMast.setIoPri(15D);
            wrkMast.setSourceStaNo(1034); // 源站
            wrkMast.setStaNo(1024); // 目标站
            wrkMast.setAppeTime(now);
@@ -1845,6 +1904,116 @@
                log.error("子托盘底座母托盘回流命令推送队列失败:" + wrkMast.getWrkNo() + "," + staProtocol.getSiteId());
            }
        }
    }
    public synchronized void autoOutEmptyBucket() {
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code","autoOutEmptyBucket").eq("status",1));
        if (config == null || Cools.isEmpty(config.getValue())) {
            return;
        }
        // 需要自动补空桶的站点
        String[] split = config.getValue().split("=");
        for (SearchLocParam.WantBucket wantBucket : getWantBucketFlag()) {
            if (wantBucket.getBucketType() != 0) { // 罐装线有要桶信号
                boolean flag = true; // 是否需要自动补,true不需要,false需要
                for(String item: split) {
                    if(String.valueOf(wantBucket.getSite()).equals(item)) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    return;
                }
                // <4 < 2 < 4
                int count = wrkMastMapper.selectInGzxCount(wantBucket.getSite());
                if (wantBucket.getSite() == 1071 && count <= 2 || wantBucket.getSite() == 1064 && count == 0 || wantBucket.getSite() == 1078 && count <= 2) {
                    // 判断库里有无空桶组
                    List<LocDetl> locDetlList = locDetlService.selectListByMatnr(wantBucket.getBucketType());
                    for (int i = 0; i < locDetlList.size(); i++) {
                        LocDetl locDetl = locDetlList.get(i);
                        String loc1 = locDetl.getLocNo();
                        String aisle1 = loc1.substring(0, 2);
                        String column1 = loc1.substring(2, 5);
                        String level1 = loc1.substring(5, 7);
                        for (int j = i + 1; j < locDetlList.size(); j++) {
                            LocDetl locDetl1 = locDetlList.get(j);
                            String loc2 = locDetl1.getLocNo();
                            String aisle2 = loc2.substring(0, 2);
                            String column2 = loc2.substring(2, 5);
                            String level2 = loc2.substring(5, 7);
                            // 检查是否满足组队条件
                            if (isSameAisleGroup(aisle1, aisle2) && column1.equals(column2) && level1.equals(level2)) {
                                // 创建空桶出库任务
                                try {
                                    StockOutParam param = new StockOutParam();
                                    param.setOutSite(wantBucket.getSite());
                                    List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                                    StockOutParam.LocDetl locDetl2 = new StockOutParam.LocDetl();
                                    locDetl2.setLocNo(locDetl.getLocNo());
                                    locDetl2.setMatnr(locDetl.getMatnr());
                                    locDetl2.setBatch(locDetl.getBatch());
                                    locDetl2.setBrand(locDetl.getBrand());
                                    locDetl2.setCount(locDetl.getAnfme());
                                    locDetl2.setBoxType1(locDetl.getBoxType1());
                                    locDetl2.setBoxType2(locDetl.getBoxType2());
                                    locDetl2.setBoxType3(locDetl.getBoxType3());
                                    locDetl2.setStandby1(locDetl.getStandby1());
                                    locDetl2.setStandby2(locDetl.getStandby2());
                                    locDetl2.setStandby3(locDetl.getStandby3());
                                    locDetls.add(locDetl2);
                                    StockOutParam.LocDetl locDetl3 = new StockOutParam.LocDetl();
                                    locDetl3.setLocNo(locDetl1.getLocNo());
                                    locDetl3.setMatnr(locDetl1.getMatnr());
                                    locDetl3.setBatch(locDetl1.getBatch());
                                    locDetl3.setBrand(locDetl1.getBrand());
                                    locDetl3.setCount(locDetl1.getAnfme());
                                    locDetl3.setBoxType1(locDetl1.getBoxType1());
                                    locDetl3.setBoxType2(locDetl1.getBoxType2());
                                    locDetl3.setBoxType3(locDetl1.getBoxType3());
                                    locDetl3.setStandby1(locDetl1.getStandby1());
                                    locDetl3.setStandby2(locDetl1.getStandby2());
                                    locDetl3.setStandby3(locDetl1.getStandby3());
                                    locDetls.add(locDetl3);
                                    param.setLocDetls(locDetls);
                                    String response = new HttpHandler.Builder()
                                            .setUri(wmsUrl)
                                            .setPath("/rpc/autoOutEmptyBucket")
                                            .setJson(JSON.toJSONString(param))
                                            .build()
                                            .doPost();
                                    log.info("自动出空桶请求wms原始返回:" + response);
                                    JSONObject jsonObject = JSON.parseObject(response);
                                    if (jsonObject.getInteger("code").equals(200)) {
                                        log.info("自动出空桶成功:{}",wantBucket.getSite());
                                        return;
                                    } else {
                                        News.error("自动空桶出库" + ":请求接口失败!!!url:{};request:{};response:{}", wmsUrl + "/rpc/pakin/loc/v1", JSON.toJSONString(param), response);
                                    }
                                } catch (Exception e) {
                                    e.printStackTrace();
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    // 判断两个排是否属于同一组
    private static boolean isSameAisleGroup(String aisle1, String aisle2) {
        return (aisle1.equals("09") && aisle2.equals("10")) ||
                (aisle1.equals("10") && aisle2.equals("09")) ||
                (aisle1.equals("11") && aisle2.equals("12")) ||
                (aisle1.equals("12") && aisle2.equals("11"));
    }
    /**
@@ -1885,12 +2054,12 @@
                    param.setMatnr(staProtocol.getMatnr().trim());
                    param.setBatch(staProtocol.getBatch().trim());
                    param.setManuDate(staProtocol.getManuDate());
                    param.setWeight(staProtocol.getWeight());
                    param.setGrossWeight(staProtocol.getGrossWeight());
                    param.setWeight(Math.round(staProtocol.getWeight() * 100.0) / 100.0);
                    param.setGrossWeight(Math.round(staProtocol.getGrossWeight() * 100.0) / 100.0);
                    param.setReinspection(staProtocol.isReinspection());
                    param.setSourceStaNo(site + 2);
                    param.setTbFlag(staProtocol2.isBarcodeErr());
                    param.setCannedVolume(Math.round(staProtocol.getCannedVolume() * 100.0) / 100.0);
//                    param.setWrkNo(57);
//                    param.setMatnr("101");
//                    param.setBatch("tt1");
src/main/java/com/zy/utils/HttpHandler.java
@@ -15,7 +15,7 @@
 */
public class HttpHandler {
    private static final Integer DEFAULT_TIMEOUT_SECONDS = 5;
    private static final Integer DEFAULT_TIMEOUT_SECONDS = 30;
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json;charset=utf-8");
    private String uri;
src/main/resources/mapper/LocDetlMapper.xml
@@ -27,7 +27,7 @@
        <result column="item_num" property="itemNum" />
        <result column="safe_qty" property="safeQty" />
        <result column="weight" property="weight" />
        <result column="length" property="length" />
        <result column="man_length" property="manLength" />
        <result column="volume" property="volume" />
        <result column="three_code" property="threeCode" />
        <result column="supp" property="supp" />
@@ -44,6 +44,14 @@
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
        <result column="memo" property="memo" />
        <result column="standby1" property="standby1" />
        <result column="standby2" property="standby2" />
        <result column="standby3" property="standby3" />
        <result column="box_type1" property="boxType1" />
        <result column="box_type2" property="boxType2" />
        <result column="box_type3" property="boxType3" />
        <result column="box_type2" property="boxType2" />
        <result column="box_type3" property="boxType3" />
    </resultMap>
    <sql id="stockOutCondition">
@@ -81,6 +89,10 @@
        ) t where t.row between ((#{pageNumber}-1)*#{pageSize}+1) and (#{pageNumber}*#{pageSize})
    </select>
    <select id="selectListByMatnr" resultMap="BaseResultMap">
        select * from asr_loc_detl ald left join asr_loc_mast alm on ald.loc_no = alm.loc_no where alm.loc_sts = 'F' and ald.matnr = #{bucketType}
    </select>
    <select id="getStockOutPageCount" parameterType="java.util.Map" resultType="java.lang.Integer">
        select
        count(1)
src/main/resources/mapper/WrkMastMapper.xml
@@ -63,9 +63,27 @@
        <result column="rgv_no" property="rgvNo" />
        <result column="rgv_ssta_no" property="rgvSstaNo" />
        <result column="rgv_dsta_no" property="rgvDstaNo" />
        <result column="rgv_create_time" property="rgvCreateTime" />
        <result column="rgv_finish_time" property="rgvFinishTime" />
        <result column="work_no_other" property="workNoOther" />
    </resultMap>
    <select id="selectInGzxCount" resultType="java.lang.Integer">
        SELECT
            count(DISTINCT m.wrk_no)
        FROM
            asr_wrk_mast m
                LEFT JOIN asr_bas_devp d ON
                m.wrk_no = d.wrk_no
        WHERE
            (m.wrk_sts IN (2, 9 ,10,14)
                AND m.sta_no = #{site}
                AND d.wrk_no IS NOT NULL)
           OR (m.wrk_sts IN(10,11,12,14)
            AND m.sta_no = #{site}
            AND d.wrk_no IS NULL)
    </select>
    <select id="selectByLocNo"  resultMap="BaseResultMap">
        select top 1 * from asr_wrk_mast where source_loc_no = #{sourceLocNo} and  (ctn_no is null or ctn_no != 'Y')
    </select>