自动化立体仓库 - WMS系统
pang.jiabao
昨天 259e38eb55c12b501427702d551d4de61182406c
接口对接功能完善
2个文件已添加
16个文件已修改
829 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MesController.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastLog.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/TransTask.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/RcsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java 253 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 93 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/JlerScheduler.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 63 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/JlerHandler.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskDetlMapper.xml 96 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastLogMapper.xml 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MesController.java
@@ -12,6 +12,7 @@
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.List;
@RestController
@Slf4j
@@ -28,11 +29,13 @@
    // 物料信息同步
    @PostMapping("/api/mes/synMatInfo")
    @AppAuth(memo = "物料信息同步")
    public MesReturn synMatInfo(@RequestHeader(required = false) String appkey,@RequestBody MesMatRecvForm param, HttpServletRequest request){
    public MesReturn synMatInfo(@RequestHeader(required = false) String appkey, @RequestBody List<MesMatRecvForm> param, HttpServletRequest request){
        auth(appkey, param, request);
        MesReturn mesReturn = new MesReturn();
        try {
            mesReturn = mesService.matInfoAndInBound(param);
            for(MesMatRecvForm matRecvForm:param) {
                mesReturn = mesService.matInfoAndInBound(matRecvForm);
            }
        } catch (Exception e) {
            mesReturn.setSuccess("2");
            mesReturn.setMessage("物料信息同步失败");
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -532,7 +532,16 @@
        if(!param.containsKey("staNo") || !param.containsKey("locType")){ // 1.窄,2.宽
            return R.parse(BaseRes.PARAM);
        }
        return mobileService.callEmptyBinOutBound(param.getString("staNo"),param.getString("locType"),getUserId());
        return mobileService.callEmptyBinOutBound(null,param.getString("staNo"),param.getString("locType"),getUserId());
    }
    @PostMapping("/callEmptyBinInBound")
    @ManagerAuth(memo = "pda呼叫料框回库")
    public synchronized R callEmptyBinInBound(@RequestBody JSONObject param) {
        if(!param.containsKey("site")){ // 搬运起点
            return R.parse(BaseRes.PARAM);
        }
        return mobileService.callEmptyBinInBound(param.getString("site"),getUserId());
    }
}
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -332,6 +332,14 @@
    @TableField("task_no")
    private String taskNo;
    @ApiModelProperty(value= "是否呼叫agv,0.未呼叫,1.已呼叫")
    @TableField("call_agv")
    private Integer callAgv;
    @ApiModelProperty(value= "agv目标站点")
    @TableField("agv_sta")
    private String agvSta;
    public WrkMast() {}
    public String getYmd$(){
src/main/java/com/zy/asrs/entity/WrkMastLog.java
@@ -327,6 +327,17 @@
    @TableField("take_none")
    private String takeNone;
    @TableField("task_no")
    private String taskNo;
    @ApiModelProperty(value= "是否呼叫agv,0.未呼叫,1.已呼叫")
    @TableField("call_agv")
    private Integer callAgv;
    @ApiModelProperty(value= "agv目标站点")
    @TableField("agv_sta")
    private String agvSta;
    public WrkMastLog() {
    }
src/main/java/com/zy/asrs/entity/mes/TransTask.java
@@ -18,7 +18,8 @@
    @JsonProperty("OrderNo")
    @JSONField(name = "OrderNo")
    private String OrderNo;
    // 运输类型,01:空托,02:毛坯,03:成品,04:转序,本接口为转序
    // 运输类型,01上空托 02 下空托,毛坯 03 上毛坯 04 下成品 05 上刀 06 下刀
    //上出立库,下入立库
    @JsonProperty("TransType")
    @JSONField(name = "TransType")
    private String TransType;
src/main/java/com/zy/asrs/service/MobileService.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.mes.MesOutApply;
import com.zy.asrs.entity.param.*;
import java.util.Date;
@@ -106,5 +107,10 @@
     * @param locType 托盘类型 1.窄,2.宽
     * @param userId 用户id
     */
    R callEmptyBinOutBound(String staNo, String locType, Long userId);
    R callEmptyBinOutBound(MesOutApply mesOutApply,String staNo, String locType, Long userId);
    /**
     * pda呼叫料框回库
     */
    R callEmptyBinInBound(String site, Long userId);
}
src/main/java/com/zy/asrs/service/RcsService.java
@@ -20,7 +20,7 @@
     * @param rcsFactory 1 海康;2 华晓;
     * @return
     */
    int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory);
    RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory);
    /**
     * 2.1.3任务继续执行接口
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -4,18 +4,17 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.entity.rcs.RcsReporterTask;
import com.zy.asrs.entity.rcs.RcsTaskContinue;
import com.zy.asrs.entity.rcs.RcsTaskSubmit;
import com.zy.asrs.entity.rcs.RcsTaskTargetRoute;
import com.zy.asrs.entity.rcs.*;
import com.zy.asrs.mapper.AgvInfoMapper;
import com.zy.asrs.mapper.MatItemBarcodeMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import lombok.extern.slf4j.Slf4j;
@@ -86,6 +85,12 @@
    @Resource
    private MobileService mobileService;
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private WrkDetlService wrkDetlService;
    // region MES接口
@@ -267,7 +272,7 @@
                orderDetlPakin.setMaktx(mat.getMaktx());
                orderDetlPakin.setSpecs(mat.getSpecs());
                orderDetlPakin.setModel(mat.getModel());
                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesMat.getItemBarcode()));   // 零件二维码
                orderDetlPakin.setStandby1(barCodeListToStr(mesMat.getItemBarcode()));   // 零件二维码
                orderDetlPakin.setStandby2("1");  //保存齐套性检查标识,1 检查;0 不检查;
                orderDetlPakin.setCreateBy(defaultUserId);
                orderDetlPakin.setCreateTime(now);
@@ -361,48 +366,59 @@
     * @param mesOutApply
     * @return 1 成功;-1 订单重复;
     */
    @Transactional
    public int outBoundOrder(MesOutApply mesOutApply){
        // 空托出库
        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
            // 生成空托出库任务
            mobileService.callEmptyBinOutBound(WMS_TRANS_START_STATION_1,"1",defaultUserId);
            mobileService.callEmptyBinOutBound(mesOutApply,WMS_TRANS_START_STATION_1,"1",defaultUserId);
            try {
                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                    TransTask transTask = new TransTask();
                    transTask.setTaskno(mesOutApply.getTaskno());
                    transTask.setTaskname(mesOutApply.getTaskname());
                    transTask.setOrderNo(mesOutApply.getOrderNo());
                    transTask.setTransType(mesOutApply.getTransType());
                    transTask.setCurStationId(WMS_TRANS_START_STATION_1);
                    transTask.setNextProcess(mesOutApply.getProductLineId());
                    transTask.setNextStationId(mesOutApply.getStationId());
                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                    transTask.setQty(1);    // 空托只出1个
                    transTask.setProductLineId(mesOutApply.getProductLineId());
                    transTask.setOperateType(1);
                    transTask.setAgvFactory(1);
                    JSONObject sendAgvTask = submitTask(transTask);
                    if (!"1".equals(sendAgvTask.getString("Success"))) {
                        log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                    }
                }
            } catch (Exception e) {
                log.error("下发AGV运输任务失败", e);
            }
//            try {
//                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
//                    TransTask transTask = new TransTask();
//                    transTask.setTaskno(mesOutApply.getTaskno());
//                    transTask.setTaskname(mesOutApply.getTaskname());
//                    transTask.setOrderNo(mesOutApply.getOrderNo());
//                    transTask.setTransType(mesOutApply.getTransType());
//                    transTask.setCurStationId(WMS_TRANS_START_STATION_1);
//                    transTask.setNextProcess(mesOutApply.getProductLineId());
//                    transTask.setNextStationId(mesOutApply.getStationId());
//                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
//                    transTask.setQty(1);    // 空托只出1个
//                    transTask.setProductLineId(mesOutApply.getProductLineId());
//                    transTask.setOperateType(1);
//                    transTask.setAgvFactory(1);
//                    JSONObject sendAgvTask = submitTask(transTask);
//                    if (!"1".equals(sendAgvTask.getString("Success"))) {
//                        log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
//                    }
//                }
//            } catch (Exception e) {
//                log.error("下发AGV运输任务失败", e);
//            }
            return 1;
        } else {    // 毛坯(物料)出库
            // docType根据库类型确定
            long docType = 7;
            long settle = 1;
            long settle = 2;
            // 校验订单是否重复
            OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
                log.error("出库订单号重复:{}",mesOutApply.getOrderNo());
                return -1;
            }
            String itemBarcode = barCodeListToStr(mesOutApply.getItemBarcode());
            // 自动出库
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("standby1", itemBarcode));
            if (locDetl == null) {
                throw new CoolException("零件二维码没有匹配到库存:" +itemBarcode );
            }
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetl.getLocNo()));
            if (!locMast.getLocSts().equals("F")) {
                throw new CoolException("库位状态不为F:" +locMast.getLocNo() );
            }
            // 生成订单
@@ -420,6 +436,7 @@
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
            orderPakout.setPakinPakoutStatus(2);
            orderPakout.setNumber(locMast.getBarcode()); // 托盘条码,上报时用
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单主档失败");
                throw new CoolException("保存出库订单主档失败");
@@ -431,12 +448,14 @@
            orderDetlPakout.setOrderId(orderPakout.getId());
            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
            orderDetlPakout.setAnfme(Double.valueOf(mesOutApply.getQty()));
            orderDetlPakout.setWorkQty(orderDetlPakout.getAnfme());
            orderDetlPakout.setQty(0.0);
            orderDetlPakout.setMatnr(mat.getMatnr());
            orderDetlPakout.setMaktx(mat.getMaktx());
            orderDetlPakout.setSpecs(mat.getSpecs());
            orderDetlPakout.setModel(mat.getModel());
            orderDetlPakout.setStandby1(barCodeListToStr(mesOutApply.getItemBarcode()));
            orderDetlPakout.setStandby1(itemBarcode);
            orderDetlPakout.setCreateBy(defaultUserId);
            orderDetlPakout.setCreateTime(now);
            orderDetlPakout.setUpdateBy(defaultUserId);
@@ -448,48 +467,102 @@
                throw new CoolException("保存出库订单明细档失败");
            }
            // 立库生成订单后,自动调度AGV运送到站点,目前多托生成多个。
            try {
                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
                    // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
                    String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
                    EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
                    matItemBarcodeEntityWrapper.in("item_barcode", barCode);
                    List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
                     if (barcodes != null) {
                        Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
                        for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
                            List<MatItemBarcode> list = entry.getValue();
                            List<String> codes = new ArrayList<>();
                            for (MatItemBarcode zapllet : list) {
                                codes.add(zapllet.getItemBarcode());
                            }
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(101));
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(101); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(1);
            wrkMast.setSourceStaNo("203"); // 源站
            wrkMast.setStaNo("204"); // 目标站
            wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
            wrkMast.setExitMk("N"); // 退出
            wrkMast.setEmptyMk("N"); // 空板
            wrkMast.setLinkMis("N");
            wrkMast.setBarcode(locMast.getBarcode());
            wrkMast.setAppeUser(defaultUserId); // 操作人员数据
            wrkMast.setAppeTime(now);
            wrkMast.setModiUser(defaultUserId);
            wrkMast.setModiTime(now);
            wrkMast.setMemo(JSONObject.toJSONString(mesOutApply));
            wrkMast.setTaskNo(mesOutApply.getTaskno());
            wrkMast.setAgvSta(mesOutApply.getStationId());
            wrkMastService.insert(wrkMast);
            // 生成工作档明细
                WrkDetl wrkDetl = new WrkDetl();
                wrkDetl.sync(locDetl);
                wrkDetl.setOrderNo(orderPakout.getOrderNo()); // 手动出库不需要带出库存中的单据编号
                wrkDetl.setWrkNo(workNo);
                wrkDetl.setIoTime(now);
                wrkDetl.setAnfme(orderDetlPakout.getAnfme()); // 数量
                wrkDetl.setAppeTime(now);
                wrkDetl.setAppeUser(defaultUserId);
                wrkDetl.setModiTime(now);
                wrkDetl.setModiUser(defaultUserId);
//                wrkDetl.setMatnr(detlDto.getLocDetl().getMatnr());
//                wrkDetl.setMaktx(detlDto.getLocDetl().getMaktx());
//                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
//                wrkDetl.setSpecs(detlDto.getLocDetl().getSpecs());
//                wrkDetl.setUnit(detlDto.getLocDetl().getUnit());
//                wrkDetl.setModel(detlDto.getLocDetl().getModel());
                wrkDetlService.insert(wrkDetl);
                            TransTask transTask = new TransTask();
                            transTask.setTaskno(mesOutApply.getTaskno());
                            transTask.setTaskname(mesOutApply.getTaskname());
                            transTask.setOrderNo(mesOutApply.getOrderNo());
                            transTask.setTransType(mesOutApply.getTransType());
                            transTask.setCurStationId(WMS_TRANS_START_STATION_3);
                            transTask.setNextProcess(mesOutApply.getProductLineId());
                            transTask.setNextStationId(mesOutApply.getStationId());
                            transTask.setItemno(mesOutApply.getItemno());
                            transTask.setQty(list.size());
                            transTask.setProductLineId(mesOutApply.getProductLineId());
                            transTask.setItemBarcode(codes);
                            transTask.setTuoPanId(entry.getKey());
                            transTask.setOperateType(1);
                            transTask.setAgvFactory(1);
                            JSONObject sendAgvTask = submitTask(transTask);
                            if (!"1".equals(sendAgvTask.getString("Success"))) {
                                log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
                            }
                        }
                    }
                }
            } catch (Exception e) {
                log.error("下发AGV运输任务失败", e);
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            if (locMast.getLocSts().equals("F")) {
                locMast.setLocSts("R");
                locMast.setModiUser(defaultUserId);
                locMast.setModiTime(now);
                locMastService.updateById(locMast);
            }
            log.info("出库任务生成成功,任务号:{}",workNo);
            // 立库生成订单后,自动调度AGV运送到站点,目前多托生成多个。
//            try {
//                if (!StringUtils.isEmpty(mesOutApply.getTaskno()) && !StringUtils.isEmpty(mesOutApply.getStationId())) {
//                    // 按零件二维码查询有几个托,多托生成多个任务,每托对应零件二维码
////                    String barCode = barCodeListToStr(mesOutApply.getItemBarcode());
////                    EntityWrapper<MatItemBarcode> matItemBarcodeEntityWrapper = new EntityWrapper<>();
////                    matItemBarcodeEntityWrapper.in("item_barcode", barCode);
////                    List<MatItemBarcode> barcodes = matItemBarcodeMapper.selectList(matItemBarcodeEntityWrapper);
////                     if (barcodes != null) {
////                        Map<String, List<MatItemBarcode>> map = barcodes.stream().collect(Collectors.groupingBy(MatItemBarcode::getZapplet));
////                        for (Map.Entry<String, List<MatItemBarcode>> entry : map.entrySet()) {
////                            List<MatItemBarcode> list = entry.getValue();
////                            List<String> codes = new ArrayList<>();
////                            for (MatItemBarcode zapllet : list) {
////                                codes.add(zapllet.getItemBarcode());
////                            }
//
//                            TransTask transTask = new TransTask();
//                            transTask.setTaskno(mesOutApply.getTaskno());
//                            transTask.setTaskname(mesOutApply.getTaskname());
//                            transTask.setOrderNo(mesOutApply.getOrderNo());
//                            transTask.setTransType(mesOutApply.getTransType());
//                            transTask.setCurStationId(WMS_TRANS_START_STATION_3);
//                            transTask.setNextProcess(mesOutApply.getProductLineId());
//                            transTask.setNextStationId(mesOutApply.getStationId());
//                            transTask.setItemno(mesOutApply.getItemno());
//                            transTask.setQty(mesOutApply.getQty());
//                            transTask.setProductLineId(mesOutApply.getProductLineId());
//                            transTask.setItemBarcode(mesOutApply.getItemBarcode());
//                            transTask.setTuoPanId(locDetl.getZpallet());
//                            transTask.setOperateType(1);
//                            transTask.setAgvFactory(1);
//                            JSONObject sendAgvTask = submitTask(transTask);
//                            if (!"1".equals(sendAgvTask.getString("Success"))) {
//                                log.error("出库下发agv运输任务失败", JSONObject.toJSONString(transTask));
//                            }
////                        }
////                    }
//                }
//            } catch (Exception e) {
//                log.error("下发AGV运输任务失败", e);
//            }
        }
        return 1;
@@ -513,8 +586,8 @@
                    transTask.setOrderNo(mesInApply.getOrderNo());
                    transTask.setTransType(mesInApply.getTransType());
                    transTask.setCurProcess(mesInApply.getProductLineId());
                    transTask.setCurStationId(mesInApply.getStationID());
                    transTask.setNextStationId(WMS_TRANS_START_STATION_2);
                    transTask.setCurStationId("A3");
                    transTask.setNextStationId("A4");
                    transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                    transTask.setQty(1);    // 空托只回1个
                    transTask.setProductLineId(mesInApply.getProductLineId());
@@ -571,9 +644,9 @@
            orderDetlPakin.setMaktx(mat.getMaktx());
            orderDetlPakin.setSpecs(mat.getSpecs());
            orderDetlPakin.setModel(mat.getModel());
            if (mesInApply.getProductInfo() != null) {
                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesInApply.getProductInfo())); //零件详情存在1
            }
            List<String> itemBarcode = mesInApply.getProductInfo().stream().map(MesInApply.ProductInfo::getItemBarcode).collect(Collectors.toList());
            orderDetlPakin.setStandby1(barCodeListToStr(itemBarcode)); //零件详情存在1
            orderDetlPakin.setStandby2("0");  //保存齐套性检查标识,1 检查;0 不检查;
            orderDetlPakin.setCreateBy(defaultUserId);
            orderDetlPakin.setCreateTime(now);
@@ -597,7 +670,6 @@
            waitPakin.setAppeTime(now);
            waitPakin.setModiUser(defaultUserId);
            waitPakin.setModiTime(now);
            List<String> itemBarcode = mesInApply.getProductInfo().stream().map(MesInApply.ProductInfo::getItemBarcode).collect(Collectors.toList());
            waitPakin.setStandby1(barCodeListToStr(itemBarcode));
            waitPakinService.insert(waitPakin);
            OrderInAndOutUtil.increaseWorkQty(Boolean.TRUE, orderPakin.getId(), orderDetlPakin.getMatnr(), orderDetlPakin.getBatch(),
@@ -770,6 +842,9 @@
     * @return
     */
    public static String barCodeListToStr(List<String> list) {
        if(list.isEmpty()) {
            return "";
        }
        StringBuilder stringBuilder = new StringBuilder();
        for (String str : list) {
            stringBuilder.append(str).append(",");
@@ -1047,8 +1122,14 @@
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (success == 1) {
        RcsReturn rcsReturn = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (rcsReturn.getCode().equals("SUCCESS")) {
            JSONObject data = rcsReturn.getData();
            String robotTaskCode = data.getString("robotTaskCode");
            if (Cools.isEmpty(transTask.getTaskno())) {
                transTask.setTaskno(robotTaskCode);
                result.put("taskno", transTask.getTaskno());
            }
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
@@ -1075,12 +1156,12 @@
            taskDetl.setIoTime(task.getIoTime());
            taskDetl.setMatnr(transTask.getItemno());
            taskDetl.setAnfme(0.0);
            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
//            taskDetl.setStandby1(String.valueOf(transTask.getQty()));
            taskDetl.setMaktx(mat.getMaktx());
            taskDetl.setSpecs(mat.getSpecs());
            taskDetl.setOrderNo(transTask.getOrderNo());
            taskDetl.setZpallet(transTask.getTuoPanId());
            taskDetl.setMemo(JSONObject.toJSONString(transTask.getItemBarcode()));
            taskDetl.setMemo(barCodeListToStr(transTask.getItemBarcode()));
            taskDetl.setModiUser(defaultUserId);
            taskDetl.setModiTime(now);
            taskDetl.setAppeUser(defaultUserId);
@@ -1163,7 +1244,7 @@
     * @return
     */
    public int applyInStation(TransParent apply) {
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "AprsAGVTransportPalletNotice";
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "Aprs/AGVTransportPalletNotice";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
@@ -1195,7 +1276,7 @@
//            rcsTaskContinue.setTriggerType("ROBOT");
//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
            int success = rcsService.continueTask(rcsTaskContinue, 1);
            mesReturn.setSuccess(success == 1 ? "1" : "2");
            mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
        }
@@ -1217,7 +1298,8 @@
            arrivalStation.setOrderNo(null);
        }
        String url = MES_URL + "AGVArrivalCompleted";
        String path = ("LL").equals(arrivalStation.getProductLineId()) ? "AGVArrivalCompleted" : "Aprs/AGVArrivalCompleted";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(arrivalStation));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
@@ -1282,7 +1364,8 @@
     */
    public int outStation(TransParent apply) {
        String url = MES_URL + "AGVDepartureCompleted";
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVDepartureCompleted" : "Aprs/AGVDepartureCompleted";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -7,6 +7,8 @@
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.MesOutApply;
import com.zy.asrs.entity.mes.TransTask;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.enums.CommonEnum;
import com.zy.asrs.enums.LocStsType;
@@ -25,6 +27,7 @@
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -41,6 +44,11 @@
@Slf4j
@Service
public class MobileServiceImpl implements MobileService {
    @Value("${wms.wmsTransStartStation2}")
    public String WMS_TRANS_START_STATION_2;
    @Value("${wms.zpalletId}")
    public String WMS_ZPALLET_ID;
    @Autowired
    private MatService matService;
@@ -114,6 +122,9 @@
    private BasStationService basStationService;
    @Autowired
    private BasContainerService basContainerService;
    @Resource
    private MesService mesService;
    @Override
    @Transactional
@@ -654,6 +665,7 @@
                        elem.getBoxType1(), elem.getBoxType2(), elem.getBoxType3(), elem.getAnfme());
                detlDto.setOrderId(order.getId());
                detlDto.setOrderNo(order.getOrderNo());
                detlDto.setStandby1(detls.getStandby1());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.findDto(detlDtos, detlDto);
                    assert one != null;
@@ -706,6 +718,7 @@
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(detlDto.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setStandby1(detlDto.getStandby1());
                waitPakin.setAppeUser(userId);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
@@ -1274,7 +1287,7 @@
    @Override
    @Transactional
    public R callEmptyBinOutBound(String staNo, String locType, Long userId) {
    public R callEmptyBinOutBound(MesOutApply mesOutApply, String staNo, String locType, Long userId) {
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", 'D').eq("loc_type2", locType));
        if(locMast == null) {
            return R.parse("该类型:" + locType +"空托盘不存在");
@@ -1282,11 +1295,11 @@
        // 获取路径
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 110)
                .eq("stn_no", staNo)
                .eq("stn_no", 204)
                .eq("crn_no", locMast.getCrnNo());
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (staDesc == null) {
            R.parse("出库路径不存在,站点:" + staNo);
            return R.parse("出库路径不存在,站点:" + staNo);
        }
        Date now = new Date();
        // 生成工作档
@@ -1310,6 +1323,14 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (mesOutApply != null) {
            wrkMast.setTaskNo(mesOutApply.getTaskno());
            wrkMast.setAgvSta(mesOutApply.getStationId());
            wrkMast.setMemo(JSONObject.toJSONString(mesOutApply));
        } else {
            wrkMast.setAgvSta(staNo);
        }
        wrkMastService.insert(wrkMast);
        // 更新库位状态
@@ -1319,10 +1340,35 @@
            locMast.setModiTime(now);
            locMastService.updateById(locMast);
        }
        log.info("生成空托出库任务成功,任务号:{}",wrkMast.getWrkNo());
        return R.ok("出库成功");
    }
    @Override
    public R callEmptyBinInBound(String site, Long userId) {
        TransTask transTask = new TransTask();
//        transTask.setTaskno(mesInApply.getTaskno());
//        transTask.setTaskname(mesInApply.getTaskname());
//        transTask.setOrderNo(mesInApply.getOrderNo());
        transTask.setTransType("02"); // 下毛坯
//        transTask.setCurProcess(mesInApply.getProductLineId());
        transTask.setCurStationId(site);
        transTask.setNextStationId(WMS_TRANS_START_STATION_2);
        transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
        transTask.setQty(1);    // 空托只回1个
//        transTask.setProductLineId(mesInApply.getProductLineId());
        transTask.setOperateType(1);
        transTask.setAgvFactory(1);
        JSONObject sendAgvTask = mesService.submitTask(transTask);
        if ("1".equals(sendAgvTask.getString("Success"))) {
            log.info("pda呼叫料框回库成功,{}", JSONObject.toJSONString(transTask));
            return R.ok("成功");
        } else {
            log.error("pda呼叫料框回库失败,{}", JSONObject.toJSONString(transTask));
            return R.parse("失败");
        }
    }
    /**
     * @author Ryan
     * @date 2025/9/25
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -1,10 +1,12 @@
package com.zy.asrs.service.impl;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.TransArrivalStation;
import com.zy.asrs.entity.mes.TransInOutStationAllow;
import com.zy.asrs.entity.mes.TransParent;
import com.zy.asrs.entity.rcs.*;
import com.zy.asrs.enums.RcsRetMethodEnum;
@@ -25,10 +27,7 @@
import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@@ -55,7 +54,7 @@
    @Resource
    private BlockTaskMapper blockTaskMapper;
    @Resource
    private TaskDetlServiceImpl taskDetlService;
    private TaskDetlService taskDetlService;
    @Resource
    private WrkMastService wrkMastService;
@@ -172,7 +171,7 @@
     * @param rcsFactory 1 海康;2 华晓;
     * @return
     */
    public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
    public RcsReturn submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
//        String response = "";
//        boolean success = false;
@@ -218,22 +217,46 @@
//            }
//        }
//        return success ? 1 : 0;
        RcsReturn rcsReturn = new RcsReturn();
        boolean success = false;
        String url = rcsFactory == 2 ? HX_URL : HIK_URL + "api/robot/controller/task/submit";
        String response = "";
        try {
            response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit));
            if (!StringUtils.isEmpty(response) && response.contains("code")) {
                rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
                if ("SUCCESS".equals(rcsReturn.getCode())) {
            // 模拟返回
//            rcsReturn.setCode("SUCCESS");
//            JSONObject jsonObject = new JSONObject();
//            jsonObject.put("robotTaskCode",4);
//            rcsReturn.setData(jsonObject);
                    success = true;
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/submit";
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskSubmit));
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
            if("SUCCESS".equals(rcsReturn.getCode())) {
                JSONObject data = rcsReturn.getData();
                String robotTaskCode = data.getString("robotTaskCode");
                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
                    return 1;
                    log.info("呼叫agv搬运成功!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                } else {
                    log.error("呼叫agv搬运失败!url:{};request:{};response:{}", url, JSON.toJSONString(rcsTaskSubmit), response);
                }
            }
        } catch (Exception e) {
            log.error("呼叫agv搬运异常", e);
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "呼叫agv搬运",
                        url,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(rcsTaskSubmit),
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("呼叫agv搬运保存接口日志异常", e);
            }
        }
        return 0;
        return rcsReturn;
    }
    /**
@@ -333,7 +356,7 @@
        try {
            // q3,q8=1
            if ("1".equals(carrierType)) {    //AGV
//            if ("1".equals(carrierType)) {    //AGV
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
@@ -403,13 +426,20 @@
                            mesService.applyOutStation(apply);
                        } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                            mesService.outStation(apply);
                            // agv继续执行
                            TransInOutStationAllow inOutStationAllow = new TransInOutStationAllow();
                            inOutStationAllow.setTaskno(robotTaskCode);
                            inOutStationAllow.setStatus("Y");
                            inOutStationAllow.setAgvCode("agv001");
                            mesService.allowOutStation(inOutStationAllow);
                        }
                    } break;
                    case ARRIVE_ON_STATION: {
                        // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断
                        if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
                            break;
                        }
//                        if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG") || task.getSourceStaNo().startsWith("LL")) {
//                            break;
//                        }
                        EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
                        wapper2.eq("wrk_no", task.getWrkNo())
@@ -419,7 +449,7 @@
                        TransArrivalStation arrivalStation = new TransArrivalStation();
                        arrivalStation.setTaskno(robotTaskCode);
                        arrivalStation.setTaskname(memo.getString("taskName"));
                        arrivalStation.setTuoPanId(taskDetl.getZpallet());  // memo.getString("TuoPanId")
                        arrivalStation.setTuoPanId(taskDetl == null ? "":taskDetl.getZpallet());  // memo.getString("TuoPanId")
                        arrivalStation.setProductLineId(memo.getString("ProductLineId"));
                        String transType = memo.getString("TransType");
                        arrivalStation.setDaotype(transType);
@@ -431,18 +461,19 @@
                        arrivalStation.setOrderNo(memo.getString("OrderNo"));
                        arrivalStation.setAgvCode(singleRobotCode);
                        arrivalStation.setItemno(memo.getString("Itemno"));
                        String memo2 = taskDetl.getMemo();
                        List<String> itemBarCode = new ArrayList<>();
                        Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2);
                        while (matcher.find()) {
                            itemBarCode.add(matcher.group(1));
                        }
                        arrivalStation.setItemBarcode(itemBarCode);
                        String memo2 = taskDetl == null ? "":taskDetl.getMemo();
                        String[] array = memo2.split(",");
//                        List<String> itemBarCode = new ArrayList<>();
//                        Matcher matcher = Pattern.compile("\"([^\"]*)\"").matcher(memo2);
//                        while (matcher.find()) {
//                            itemBarCode.add(matcher.group(1));
//                        }
                        arrivalStation.setItemBarcode(Arrays.asList(array));
                        mesService.arriveOnStation(arrivalStation);
                    } break;
                    default: {} break;
                }
            }
//            }
//            else if ("CTU".equals(carrierType)) { //CTU
//                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
//                wrapper.eq("task_no", robotTaskCode);
src/main/java/com/zy/asrs/task/JlerScheduler.java
New file
@@ -0,0 +1,65 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.TaskService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.handler.JlerHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
 * @author pang.jiabao
 * @description 济南二机床加工相关定时任务
 * @createDate 2025/11/18 14:18
 */
@Component
public class JlerScheduler {
    @Resource
    private ConfigService configService;
    @Resource
    private JlerHandler jlerHandler;
    @Resource
    private TaskService taskService;
    @Resource
    private WrkMastMapper wrkMastMapper;
    @Resource
    private BasDevpService basDevpService;
    @Resource
    private WrkMastService wrkMastService;
    /**
     * 货物到达出库口,生成agv任务
     */
    @Scheduled(cron = "0/5 * * * * ? ")
    private void createAgvOutTasks() {
        List<BasDevp> devps = basDevpService.selectList(new EntityWrapper<BasDevp>().in("dev_no", 202, 204)
                .gt("wrk_no",0).lt("wrk_no",9990));
        for(BasDevp basDevp:devps) {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", basDevp.getWrkNo()));
            if(wrkMast != null && wrkMast.getCallAgv() == 0 && !Cools.isEmpty(wrkMast.getAgvSta())) {
                jlerHandler.createAgvOutTasks(wrkMast);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -5,9 +5,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.MesInApply;
import com.zy.asrs.entity.mes.MesRecvFeedback;
import com.zy.asrs.entity.mes.MesReturn;
import com.zy.asrs.entity.mes.*;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.RcsServiceImpl;
import com.zy.asrs.task.core.ReturnT;
@@ -180,7 +178,7 @@
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            OrderPakin orderPakin = orderPakinService.selectOne(new EntityWrapper<OrderPakin>().eq("settle", 4)
                    .eq("doc_type", 3).orderBy("update_time"));
                    .in("doc_type", 3).orderBy("update_time"));
            if (orderPakin == null) {
                return;
            }
@@ -189,16 +187,59 @@
                MesInApply result = JSONObject.parseObject(orderPakin.getMemo(), MesInApply.class);
                result.setQty(orderDetl.getQty().intValue());
//                String url = MES_URL + "loadComplete";
//                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
//                if (!StringUtils.isEmpty(response) && response.contains("Success")) {
//                    MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
//                    if ("1".equals(mesReturn.getSuccess())) {
                String url = MES_URL + "loadComplete";
                String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
                if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                    MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                    if ("1".equals(mesReturn.getSuccess())) {
                        orderPakin.setSettle(6L);
                        orderPakinService.updateById(orderPakin);
                        log.info("订单上报成功,orderNo={}", orderPakin.getOrderNo());
//                    }
//                }
                    }
                }
            }
        }
    }
    // 出库完成上报
    @Scheduled(cron = "0/10 * * * * ? ")
    @Async("orderThreadPool")
    void outOrderCompleteReport() {
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<OrderPakout> orderPakoutList = orderPakoutService.selectList(new EntityWrapper<OrderPakout>().eq("settle", 4).orderBy("update_time"));
            if (orderPakoutList.size() == 0) {
                return;
            }
            for(OrderPakout orderPakout:orderPakoutList) {
                try {
                    MesOutApply mesOutApply = JSONObject.parseObject(orderPakout.getMemo(), MesOutApply.class);
                    MesOutFeedback mesOutFeedback = new MesOutFeedback();
                    mesOutFeedback.setTaskno(mesOutApply.getTaskno());
                    mesOutFeedback.setTaskname(mesOutApply.getTaskname());
                    mesOutFeedback.setProductLineId(mesOutApply.getProductLineId());
                    mesOutFeedback.setStationId(mesOutApply.getStationId());
                    mesOutFeedback.setItemno(mesOutApply.getItemno());
                    mesOutFeedback.setTuoPanId(orderPakout.getNumber());
                    mesOutFeedback.setQty(mesOutApply.getQty());
                    mesOutFeedback.setItemBarcode(mesOutApply.getItemBarcode());
                    mesOutFeedback.setOrderNo(mesOutApply.getOrderNo());
                    String url = MES_URL + "Aprs/issueComplete";
                    String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));
                    if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                        MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                        if ("1".equals(mesReturn.getSuccess())) {
                            orderPakout.setSettle(6L);
                            orderPakoutService.updateById(orderPakout);
                            log.info("订单上报成功,orderNo={}", orderPakout.getOrderNo());
                        }
                    }
                }catch (Exception e) {
                    log.error("出库订单上报失败,orderNo:{},exception:{}",orderPakout.getOrderNo(),e);
                }
            }
        }
    }
src/main/java/com/zy/asrs/task/handler/JlerHandler.java
New file
@@ -0,0 +1,140 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.mes.MesInApply;
import com.zy.asrs.entity.mes.MesOutApply;
import com.zy.asrs.entity.mes.TransTask;
import com.zy.asrs.service.MesService;
import com.zy.asrs.service.WrkMastService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
/**
 * @author pang.jiabao
 * @description 济南二机床加工相关定时任务
 * @createDate 2025/12/10 14:25
 */
@Slf4j
@Service
public class JlerHandler {
    @Resource
    private MesService mesService;
    @Value("${wms.wmsTransStartStation3}")
    public String WMS_TRANS_START_STATION_3;
    @Value("${wms.zpalletId}")
    public String WMS_ZPALLET_ID;
    @Resource
    private WrkMastService wrkMastService;
    @Transactional
    public void createAgvOutTasks(WrkMast wrkMast) {
        String memo = wrkMast.getMemo();
        MesOutApply mesOutApply = null;
        if(!Cools.isEmpty(memo)) {
            mesOutApply = JSONObject.parseObject(memo, MesOutApply.class);
        }
        // 空托出库
        if(wrkMast.getIoType() == 110) {
            if(mesOutApply == null) { // 不是mes下发的空托出库
                TransTask transTask = new TransTask();
//                transTask.setTaskno(mesOutApply.getTaskno());
//                transTask.setTaskname(mesOutApply.getTaskname());
//                transTask.setOrderNo(mesOutApply.getOrderNo());
                transTask.setTransType("01");
                transTask.setCurStationId(WMS_TRANS_START_STATION_3);
//                transTask.setNextProcess(mesOutApply.getProductLineId());
                transTask.setNextStationId(wrkMast.getAgvSta());
                transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                transTask.setQty(1);    // 空托只出1个
//                transTask.setProductLineId(mesOutApply.getProductLineId());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                JSONObject sendAgvTask = mesService.submitTask(transTask);
                if ("1".equals(sendAgvTask.getString("Success"))) {
                    String taskno = sendAgvTask.getString("taskno");
                    if(Cools.isEmpty(wrkMast.getTaskNo())) {
                        wrkMast.setTaskNo(taskno);
                    }
                    wrkMast.setCallAgv(1);
                    wrkMastService.updateById(wrkMast);
                }else {
                    log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                }
            } else {
                TransTask transTask = new TransTask();
                transTask.setTaskno(mesOutApply.getTaskno());
                transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setOrderNo(mesOutApply.getOrderNo());
                transTask.setTransType(mesOutApply.getTransType());
                transTask.setCurStationId(WMS_TRANS_START_STATION_3);
                transTask.setNextProcess(mesOutApply.getProductLineId());
                transTask.setNextStationId(mesOutApply.getStationId());
                transTask.setItemno(WMS_ZPALLET_ID);  // 固定为空托的编码
                transTask.setItemBarcode(new ArrayList<>()); // 没有零件二维码
                transTask.setQty(1);    // 空托只出1个
                transTask.setProductLineId(mesOutApply.getProductLineId());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                JSONObject sendAgvTask = mesService.submitTask(transTask);
                if ("1".equals(sendAgvTask.getString("Success"))) {
//                    String taskno = sendAgvTask.getString("taskno");
//                    if(Cools.isEmpty(wrkMast.getTaskNo())) {
//                        wrkMast.setTaskNo(taskno);
//                    }
                    wrkMast.setCallAgv(1);
                    wrkMastService.updateById(wrkMast);
                }else {
                    log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                }
            }
        } else if(wrkMast.getIoType() == 101) { // 满托出库
            if(mesOutApply == null) {
                log.error("满托出库呼叫agv无transTask,任务号:{}",wrkMast.getWrkNo());
            } else {
                TransTask transTask = new TransTask();
                transTask.setTaskno(mesOutApply.getTaskno());
                transTask.setTaskname(mesOutApply.getTaskname());
                transTask.setOrderNo(mesOutApply.getOrderNo());
                transTask.setTransType(mesOutApply.getTransType());
                transTask.setCurStationId(WMS_TRANS_START_STATION_3);
                transTask.setNextProcess(mesOutApply.getProductLineId());
                transTask.setNextStationId(mesOutApply.getStationId());
                transTask.setItemno(mesOutApply.getItemno());
                transTask.setQty(mesOutApply.getQty());
                transTask.setProductLineId(mesOutApply.getProductLineId());
                transTask.setItemBarcode(mesOutApply.getItemBarcode());
                transTask.setTuoPanId(wrkMast.getBarcode());
                transTask.setOperateType(1);
                transTask.setAgvFactory(1);
                JSONObject sendAgvTask = mesService.submitTask(transTask);
                if ("1".equals(sendAgvTask.getString("Success"))) {
//                    String taskno = sendAgvTask.getString("taskno");
//                    if(Cools.isEmpty(wrkMast.getTaskNo())) {
//                        wrkMast.setTaskNo(taskno);
//                    }
                    wrkMast.setCallAgv(1);
                    wrkMastService.updateById(wrkMast);
                }else {
                    log.error("出库下发agv运输任务失败:{}", JSONObject.toJSONString(transTask));
                }
            }
        } else {
            log.error("出库呼叫agv任务类型错误,任务号:{}",wrkMast.getWrkNo());
        }
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -82,13 +82,13 @@
                return R.error(CodeRes.EXIST_500);
            }
        }
        if (Cools.isEmpty(param.getLocType1(),param.getLocType2())){
        if (Cools.isEmpty(param.getLocType2())){ //  param.getLocType1(),
            return R.error("高低/长短检测信号不能为空");
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType1(param.getLocType1());
        sourceStaNo.setLocType1((short) 1); // todo 先默认低库位
        sourceStaNo.setLocType2(param.getLocType2());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
src/main/resources/application-dev.yml
@@ -121,7 +121,7 @@
  #当前库名称
  currentName: 加工库
  #立库AGV自动运货出库口编码
  wmsTransStartStation1: 205
  wmsTransStartStation1: 204
  #立库AGV自动运货入库口编码(输送线)
  wmsTransStartStation2: 202
  #立库AGV自动运货出库口编码(输送线)
@@ -132,6 +132,7 @@
#mes对接
mes:
  url: http://172.26.11.250/dev-api/basicmodel/Api/WMS/
#  url: http://192.9.100.173:8088/prod-api/basicmodel/Api/WMS/
  #默认接口操作人员id
  defaultUserId: 30
src/main/resources/mapper/TaskDetlMapper.xml
@@ -3,54 +3,54 @@
<mapper namespace="com.zy.asrs.mapper.TaskDetlMapper">
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.TaskDetl">
        <result column="wrk_no" property="wrkNo" />
        <result column="io_time" property="ioTime" />
        <result column="anfme" property="anfme" />
        <result column="zpallet" property="zpallet" />
        <result column="matnr" property="matnr" />
        <result column="maktx" property="maktx" />
        <result column="batch" property="batch" />
        <result column="order_no" property="orderNo" />
        <result column="specs" property="specs" />
        <result column="model" property="model" />
        <result column="color" property="color" />
        <result column="brand" property="brand" />
        <result column="unit" property="unit" />
        <result column="price" property="price" />
        <result column="sku" property="sku" />
        <result column="units" property="units" />
        <result column="barcode" property="barcode" />
        <result column="origin" property="origin" />
        <result column="manu" property="manu" />
        <result column="manu_date" property="manuDate" />
        <result column="item_num" property="itemNum" />
        <result column="safe_qty" property="safeQty" />
        <result column="weight" property="weight" />
        <result column="man_length" property="manLength" />
        <result column="volume" property="volume" />
        <result column="three_code" property="threeCode" />
        <result column="supp" property="supp" />
        <result column="supp_code" property="suppCode" />
        <result column="be_batch" property="beBatch" />
        <result column="dead_time" property="deadTime" />
        <result column="dead_warn" property="deadWarn" />
        <result column="source" property="source" />
        <result column="inspect" property="inspect" />
        <result column="danger" property="danger" />
        <result column="modi_user" property="modiUser" />
        <result column="modi_time" property="modiTime" />
        <result column="appe_user" property="appeUser" />
        <result column="appe_time" property="appeTime" />
        <result column="memo" property="memo" />
        <result column="line_number" property="lineNumber" />
        <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" />
<!--    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.TaskDetl">-->
<!--        <result column="wrk_no" property="wrkNo" />-->
<!--        <result column="io_time" property="ioTime" />-->
<!--        <result column="anfme" property="anfme" />-->
<!--        <result column="zpallet" property="zpallet" />-->
<!--        <result column="matnr" property="matnr" />-->
<!--        <result column="maktx" property="maktx" />-->
<!--        <result column="batch" property="batch" />-->
<!--        <result column="order_no" property="orderNo" />-->
<!--        <result column="specs" property="specs" />-->
<!--        <result column="model" property="model" />-->
<!--        <result column="color" property="color" />-->
<!--        <result column="brand" property="brand" />-->
<!--        <result column="unit" property="unit" />-->
<!--        <result column="price" property="price" />-->
<!--        <result column="sku" property="sku" />-->
<!--        <result column="units" property="units" />-->
<!--        <result column="barcode" property="barcode" />-->
<!--        <result column="origin" property="origin" />-->
<!--        <result column="manu" property="manu" />-->
<!--        <result column="manu_date" property="manuDate" />-->
<!--        <result column="item_num" property="itemNum" />-->
<!--        <result column="safe_qty" property="safeQty" />-->
<!--        <result column="weight" property="weight" />-->
<!--        <result column="man_length" property="manLength" />-->
<!--        <result column="volume" property="volume" />-->
<!--        <result column="three_code" property="threeCode" />-->
<!--        <result column="supp" property="supp" />-->
<!--        <result column="supp_code" property="suppCode" />-->
<!--        <result column="be_batch" property="beBatch" />-->
<!--        <result column="dead_time" property="deadTime" />-->
<!--        <result column="dead_warn" property="deadWarn" />-->
<!--        <result column="source" property="source" />-->
<!--        <result column="inspect" property="inspect" />-->
<!--        <result column="danger" property="danger" />-->
<!--        <result column="modi_user" property="modiUser" />-->
<!--        <result column="modi_time" property="modiTime" />-->
<!--        <result column="appe_user" property="appeUser" />-->
<!--        <result column="appe_time" property="appeTime" />-->
<!--        <result column="memo" property="memo" />-->
<!--        <result column="line_number" property="lineNumber" />-->
<!--        <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" />-->
    </resultMap>
<!--    </resultMap>-->
</mapper>
src/main/resources/mapper/WrkMastLogMapper.xml
@@ -61,6 +61,9 @@
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
        <result column="take_none" property="takeNone" />
        <result column="task_no" property="taskNo" />
        <result column="call_agv" property="callAgv" />
        <result column="agv_sta" property="agvSta" />
    </resultMap>
    <sql id="queryWhere">
        <where>
src/main/resources/mapper/WrkMastMapper.xml
@@ -60,6 +60,9 @@
        <result column="full_plt" property="fullPlt" />
        <result column="pre_have" property="preHave" />
        <result column="take_none" property="takeNone" />
        <result column="task_no" property="taskNo" />
        <result column="call_agv" property="callAgv" />
        <result column="agv_sta" property="agvSta" />
    </resultMap>
    <select id="selectToBeCompleteData" resultMap="BaseResultMap">
@@ -70,7 +73,7 @@
        select * from asr_wrk_mast
        where wrk_sts=5
        or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,3,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,1,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
        order by io_time,wrk_no asc
    </select>