自动化立体仓库 - WMS系统
zwl
2025-12-17 29d3f24dc43df41103bc5f483bfc439494a80971
对接mes
对接华晓agv
对接海康agv
初始化开发
2个文件已添加
44个文件已修改
2657 ■■■■■ 已修改文件
pom.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MesController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/RcsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/LocMast.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetlPakout.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderPakout.java 27 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Task.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkDetlLog.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/MesOutApply.java 87 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/TransParent.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/mes/TransTask.java 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/RcsService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/TaskService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java 752 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 69 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java 508 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java 124 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java 126 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/BareBoardScheduler.java 28 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 71 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkLogScheduler.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkMastScheduler.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java 66 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/LocTypeDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/AuthController.java 163 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 60 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkDetlMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/login.html 13 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pom.xml
@@ -124,7 +124,7 @@
    </dependencies>
    <build>
        <finalName>jgwms</finalName>
        <finalName>ljqwms</finalName>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
src/main/java/com/zy/asrs/controller/MesController.java
@@ -41,16 +41,16 @@
        return mesReturn;
    }
    // 出库申请
    @PostMapping("/api/mes/outBoundOrder")
    public MesReturn outBoundOrder(@RequestBody MesOutApply param){
//    // 出库申请
//    @PostMapping("/api/mes/outBoundOrder")
//    public MesReturn outBoundOrder(@RequestBody MesOutApply param){
//
//        MesReturn mesReturn = new MesReturn();
//        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
//        return mesReturn;
//    }
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess(mesService.outBoundOrder(param) == 1 ? "1" : "2");
        return mesReturn;
    }
    // 出库申请(叫料),装配库、滑块库
//    // 出库入库订单申请
    @PostMapping("/api/mes/callOutBoundOrder")
    public MesReturn callOutBoundOrder(@RequestBody MesCallOutApply param){
@@ -71,14 +71,12 @@
    // 入站允许
    @PostMapping("/api/mes/allowInStation")
    public MesReturn allowInStation(@RequestBody TransInOutStationAllow param){
        return mesService.allowInStation(param);
    }
    // 离站允许,装配库、滑块库
    @PostMapping("/api/mes/allowOutStation")
    public MesReturn allowOutStation(@RequestBody TransInOutStationAllow param){
        return mesService.allowOutStation(param);
    }
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -1,5 +1,6 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -15,6 +16,7 @@
import com.zy.asrs.service.*;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.model.WrkDto;
import com.zy.common.utils.HttpHandler;
import com.zy.common.web.BaseController;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
@@ -525,14 +527,26 @@
        return R.ok("出库成功");
    }
    /**
     * 补空板
     *
     * @param locNo 目标站点
     * @param size  托盘大小 1:小托盘  2:大托盘
     * @return
     */
    // pda呼叫空料框出库
    @PostMapping("/callEmptyBinOutBound")
    @ManagerAuth(memo = "pda呼叫空料框出库")
    public synchronized R callEmptyBinOutBound(@RequestBody JSONObject param) {
        if(!param.containsKey("staNo") || !param.containsKey("locType")){ // 1.窄,2.宽
            return R.parse(BaseRes.PARAM);
    public synchronized R callEmptyBinOutBound(@RequestParam(required = false) String locNo
            , @RequestParam(required = false) String size) {
        if (Cools.isEmpty(locNo) || Cools.isEmpty(size)) {
            return R.error("站点或者大小不能为空");
        }
        return mobileService.callEmptyBinOutBound(param.getString("staNo"),param.getString("locType"),getUserId());
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 110).eq("memo", locNo));
        if (wrkMast != null) {
            return R.error("该站点="+locNo+"已经有空板出库任务,为了不堵塞堆垛机接驳站点,禁止下发多个空板出库任务");
        }
        return mobileService.callEmptyBinOutBound(locNo,size,getUserId());
    }
}
src/main/java/com/zy/asrs/controller/OutController.java
@@ -6,6 +6,7 @@
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
@@ -126,8 +127,9 @@
                if (issued <= 0.0D) {
                    continue;
                }
                List<LocDetl> locDetls = locDetlService.queryStockAll(null, exist,orderDetl.getMatnr(), orderDetl.getBatch(),
                        orderDetl.getBrand(),orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                        orderDetl.getBrand(),orderPakOut.getDocType()==11?null:orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3());
                for (LocDetl locDetl : locDetls) {
                    if (issued > 0) {
                        LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
@@ -212,10 +214,75 @@
                taskDtos.add(taskDto);
            }
        }
        OrderPakout orderPakout = orderPakOutService.selectByNo(locDtos.get(0).getOrderNo());
        //配盘出库单用, i=5时或者出库到最后时下发空板出库任务
        int i = 0;
        //需要出库的托盘数量
        int size = taskDtos.size();
        //优先级
        int ioPri = 50;
        //已下空板出库任务数量
        int j=1;
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId());
            workService.stockOut(staNo, taskDto, getUserId(),ioPri);
            ioPri--;
            i++;
            //配盘出库单使用,下发需要出的空板任务
            if (orderPakout.getDocType() == 11) {
                if (size<5&&i==size){
                    for (;j<=orderPakout.getPayType();j++){
                        String bar="";
                        if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
                            bar = "A01";
                        }
                        LocMast locMast = new  LocMast();
                        if(Cools.isEmpty(bar)){
                            locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D"));
                        }else {
                            locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                    .eq("loc_sts", "D").like("barcode", bar));
                        }
                        if (Cools.isEmpty(locMast)) {
                            return R.error("库存没有空板");
                        }
                        String locNo = locMast.getLocNo();
                        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
                        emptyPlateOutParam.setOutSite(303);
                        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}});
                        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri);
                        ioPri--;
                    }
                }else if(i == 5){
                    String bar="";
                    if(!Cools.isEmpty(orderPakout.getShipCode())&&orderPakout.getShipCode().equals("A01")){
                        bar = "A01";
                    }
                    LocMast locMast = null;
                    if(Cools.isEmpty(bar)){
                        locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D"));
                    }else {
                        locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                                .eq("loc_sts", "D").like("barcode", bar));
                    }
                    if (Cools.isEmpty(locMast)) {
                        return R.error("库存没有空板");
                    }
                    String locNo = locMast.getLocNo();
                    EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
                    emptyPlateOutParam.setOutSite(303);
                    emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locNo);}});
                    WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,ioPri);
                    ioPri--;
                }
            }
        }
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/RcsController.java
@@ -36,7 +36,7 @@
    // 华晓AGV申请进入产线(光幕)
    @PostMapping("/api/robot/apply/inLine")
    public JSONObject hxApplyInLine(@RequestBody TransParent param){
    public RcsReturn hxApplyInLine(@RequestBody TransParent param){
        return rcsService.hxApplyInLine(param);
    }
src/main/java/com/zy/asrs/entity/LocMast.java
@@ -96,15 +96,29 @@
    @TableField("loc_type")
    private String locType;
    /**
     * 1.低库位
     * 2.高库位
     *
     */
    @ApiModelProperty(value= "高低类型{0:未知,1:低库位,2:高库位}")
    @TableField("loc_type1")
    private Short locType1;
    @ApiModelProperty(value= "宽窄类型{0:未知,1:窄库位,2:宽库位}")
    /**
     * 1.小托盘
     * 2.大托盘
     */
    @ApiModelProperty(value= "")
    @TableField("loc_type2")
    private Short locType2;
    @ApiModelProperty(value= "轻重类型{0:未知,1:轻库位,2:重库位}")
    /**
     * 滑块和连接器库区分
     * 1.滑块库
     * 2.链接器库
     */
    @ApiModelProperty(value= "")
    @TableField("loc_type3")
    private Short locType3;
src/main/java/com/zy/asrs/entity/OrderDetlPakout.java
@@ -93,6 +93,12 @@
    private String batch;
    /**
     * 料架号
     */
    @ApiModelProperty(value= "料架号")
    private String sku;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
@@ -128,11 +134,7 @@
    @ApiModelProperty(value= "单价")
    private Double price;
    /**
     * sku
     */
    @ApiModelProperty(value= "sku")
    private String sku;
    /**
     * 单位量
src/main/java/com/zy/asrs/entity/OrderPakout.java
@@ -60,6 +60,20 @@
    private Long docType;
    /**
     * 空板出库数量
     */
    @ApiModelProperty(value= "空板出库数量")
    @TableField("pay_type")
    private Integer payType;
    /**
     * 区域地址
     */
    @ApiModelProperty(value= "区域地址")
    @TableField("ship_code")
    private String shipCode;
    /**
     * 项目编号
     */
    @ApiModelProperty(value= "项目编号")
@@ -150,12 +164,6 @@
    @TableField("act_fee")
    private Double actFee;
    /**
     * 付款类型 1: 现金  2: 记账
     */
    @ApiModelProperty(value= "付款类型 1: 现金  2: 记账  ")
    @TableField("pay_type")
    private Integer payType;
    /**
     * 业务员
@@ -206,13 +214,6 @@
    @ApiModelProperty(value= "物流名称")
    @TableField("ship_name")
    private String shipName;
    /**
     * 物流单号
     */
    @ApiModelProperty(value= "物流单号")
    @TableField("ship_code")
    private String shipCode;
    /**
     * 订单状态
src/main/java/com/zy/asrs/entity/Task.java
@@ -66,6 +66,9 @@
    /**
     * 入出库类型
     * 3.站到站
     * 4.站到区域
     * 5.区域到站
     */
    @ApiModelProperty(value= "入出库类型")
    @TableField("io_type")
@@ -125,6 +128,13 @@
    @TableField("loc_sts")
    private String locSts;
    @ApiModelProperty(value= "1.海康AGV  2.华晓AGV   默认是1.海康")
    @TableField("plt_type")
    private Integer pltType=1;
    @ApiModelProperty(value= "料架号")
    private String packed;
    /**
     * 拣料
     */
@@ -139,7 +149,7 @@
    @TableField("online_yn")
    private String onlineYn;
    @ApiModelProperty(value= "")
    @ApiModelProperty(value= "是否任务报错")
    @TableField("upd_mk")
    private String updMk;
@@ -149,10 +159,6 @@
    @ApiModelProperty(value= "退出")
    @TableField("exit_mk")
    private String exitMk;
    @ApiModelProperty(value= "")
    @TableField("plt_type")
    private Integer pltType;
    /**
     * 空板
@@ -171,9 +177,6 @@
    @ApiModelProperty(value= "")
    @TableField("ctn_type")
    private Integer ctnType;
    @ApiModelProperty(value= "")
    private String packed;
    @ApiModelProperty(value= "")
    @TableField("ove_mk")
src/main/java/com/zy/asrs/entity/WrkDetlLog.java
@@ -72,6 +72,12 @@
    private String orderNo;
    /**
     * 取消任务标记 1
     */
    @ApiModelProperty(value= "取消任务标记")
    private Integer danger;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
@@ -229,12 +235,6 @@
     */
    @ApiModelProperty(value= "要求检验 1: 是  0: 否  ")
    private Integer inspect;
    /**
     * 危险品 1: 是  0: 否
     */
    @ApiModelProperty(value= "危险品 1: 是  0: 否  ")
    private Integer danger;
    /**
     * 修改人员
src/main/java/com/zy/asrs/entity/mes/MesCallOutApply.java
@@ -12,23 +12,23 @@
@Data
public class MesCallOutApply extends MesParent {
//    // 任务编号
//    private String taskno;
//    // 任务名称
//    private String taskname;
//    // 生产订单号
//    @JsonProperty("OrderNo")
//    private String OrderNo;
    // 任务编号
    private String taskno;
    // 任务名称
    private String taskname;
    // 生产订单号
    @JsonProperty("OrderNo")
    private String OrderNo;
    // 运输类型,字典值(wms_tranfs_type) 06 装配领料;01:空托
    @JsonProperty("TransType")
    @JSONField(name = "TransType")
    private String TransType;
//    // 生产线编码
//    @JsonProperty("ProductLineId")
//    private String ProductLineId;
//    // 工位编码
//    @JsonProperty("StationId")
//    private String StationId;
    // 生产线编码
    @JsonProperty("ProductLineId")
    private String ProductLineId;
    // 工位编码
    @JsonProperty("StationId")
    private String StationId;
    // 当前工序
    @JsonProperty("CurProcess")
    @JSONField(name = "CurProcess")
@@ -37,6 +37,11 @@
    @JsonProperty("Itemdata")
    @JSONField(name = "Itemdata")
    private List<MesOutApplyItem> Itemdata;
    // 空托盘数量
    @JsonProperty("EmptyCount")
    @JSONField(name = "EmptyCount")
    private List<MesOutApplyItem> EmptyCount;
    // (sfc_shop_route_consume)mes中配盘表名
    @Data
@@ -56,6 +61,17 @@
        @JsonProperty("ItemBarcode")
        @JSONField(name = "ItemBarcode")
        private String ItemBarcode;
        // 物料二维码
        @JsonProperty("stationAGV")
        @JSONField(name = "stationAGV")
        private String stationAGV;
        //托盘码
        private String wmsBarcode;
        //料架号
        private String rackNumber;
    }
}
src/main/java/com/zy/asrs/entity/mes/MesOutApply.java
@@ -12,37 +12,66 @@
@Data
public class MesOutApply extends MesParent {
//    // 任务编号
//    private String taskno;
//    // 任务名称
//    private String taskname;
//    // 生产订单号
//    @JsonProperty("OrderNo")
//    @JSONField(name = "OrderNo")
//    private String OrderNo;
    // 运输类型,字典值(wms_tranfs_type) 01:立库出空托;02 立库入空托;03 立库出毛坯; 04 立库回毛坯; 05 立库出成品;06 立库入成品;
    // 任务编号
    private String taskno;
    // 任务名称
    private String taskname;
    // 生产订单号
    @JsonProperty("OrderNo")
    private String OrderNo;
    // 运输类型,字典值(wms_tranfs_type) 06 装配领料;01:空托
    @JsonProperty("TransType")
    @JSONField(name = "TransType")
    private String TransType;
    // 零件编码
    @JsonProperty("Itemno")
    @JSONField(name = "Itemno")
    private String Itemno;
    // 数量
    @JsonProperty("Qty")
    @JSONField(name = "Qty")
    private Integer Qty;
//    // 生产线编码
//    @JsonProperty("ProductLineId")
//    @JSONField(name = "ProductLineId")
//    private String ProductLineId;
//    // 工位编码
//    @JsonProperty("StationId")
//    @JSONField(name = "StationId")
//    private String StationId;
    // 物料二维码
    @JsonProperty("ItemBarcode")
    @JSONField(name = "ItemBarcode")
    private List<String> ItemBarcode;
    // 生产线编码
    @JsonProperty("ProductLineId")
    private String ProductLineId;
    // 工位编码
    @JsonProperty("StationId")
    private String StationId;
    // 当前工序
    @JsonProperty("CurProcess")
    @JSONField(name = "CurProcess")
    private String CurProcess;
    // 配盘信息
    @JsonProperty("Itemdata")
    @JSONField(name = "Itemdata")
    private List<MesOutApply.MesOutApplyItem> Itemdata;
    // 空托盘数量
    @JsonProperty("EmptyCount")
    @JSONField(name = "EmptyCount")
    private Integer EmptyCount;
    // (sfc_shop_route_consume)mes中配盘表名
    @Data
    public static class MesOutApplyItem {
        // 配盘号
        private String trayid;
        // 零件编码
        @JsonProperty("Itemno")
        @JSONField(name = "Itemno")
        private String Itemno;
        // 数量
        @JsonProperty("Qty")
        @JSONField(name = "Qty")
        private Integer Qty;
        // 物料二维码
        @JsonProperty("ItemBarcode")
        @JSONField(name = "ItemBarcode")
        private String ItemBarcode;
        // 物料二维码
        @JsonProperty("stationAGV")
        @JSONField(name = "stationAGV")
        private String stationAGV;
        //托盘码
        private String wmsBarcode;
        //料架号
        private String rackNumber;
    }
}
src/main/java/com/zy/asrs/entity/mes/TransInOutStationAllow.java
@@ -7,6 +7,22 @@
@EqualsAndHashCode(callSuper = true)
@Data
public class TransInOutStationAllow extends TransParent {
    //任务编号
    private String taskno;
    //任务名称
    private String taskname;
    //AGV编号
    private String AgvCode;
    //运输类型
    private String TransType;
    //生产线编号
    private String ProductLineId;
    //工位编号
    private String StationId;
    //任务类型
    private String taskType;
    // 是否允许,Y 允许;N,不允许
    private String status;
src/main/java/com/zy/asrs/entity/mes/TransParent.java
@@ -28,4 +28,12 @@
    @JsonProperty("StationId")
    @JSONField(name = "StationId")
    private String StationId;
    // 任务类型
    @JsonProperty("TaskType")
    @JSONField(name = "TaskType")
    private String TaskType;
    //请求类型
    private String method;
}
src/main/java/com/zy/asrs/entity/mes/TransTask.java
@@ -58,10 +58,17 @@
    @JsonProperty("OperateType")
    @JSONField(name = "OperateType")
    private Integer OperateType;
    // 指定AGV厂家,1 海康;2 华晓;华晓与海康AGV运载能力不同,MES可按需求指定
    @JsonProperty("AgvFactory")
    @JSONField(name = "AgvFactory")
    private Integer AgvFactory;
//    @JsonProperty("AgvFactory")
//    @JSONField(name = "AgvFactory")
    private Integer agvFactory;
    //托盘码
    private String barcode;
    //料架号
    private String rackNumber;
    // 托盘ID
    @JsonProperty("TuoPanId")
src/main/java/com/zy/asrs/entity/rcs/RcsReporterTask.java
@@ -15,4 +15,7 @@
    private Integer currentSeq;
    // 详细信息
    private JSONObject extra;
    //华晓AGV任务状态及请求
    private String method;
}
src/main/java/com/zy/asrs/service/MobileService.java
@@ -6,6 +6,7 @@
import com.zy.asrs.entity.LocDetl;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.*;
import org.springframework.web.bind.annotation.RequestParam;
import java.util.Date;
@@ -107,4 +108,5 @@
     * @param userId 用户id
     */
    R callEmptyBinOutBound(String staNo, String locType, Long userId);
}
src/main/java/com/zy/asrs/service/RcsService.java
@@ -29,7 +29,7 @@
     * @param rcsFactory
     * @return
     */
    int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory);
    int continueTask(Object rcsTaskContinue, int rcsFactory);
    /**
     * 2.1.4任务取消接口
@@ -62,5 +62,5 @@
     * @param apply
     * @return
     */
    JSONObject hxApplyInLine(TransParent apply);
    RcsReturn hxApplyInLine(TransParent apply);
}
src/main/java/com/zy/asrs/service/TaskService.java
@@ -14,4 +14,5 @@
    void pickWrkMast(String workNo, Long userId);
    List<Task> selectToBeCompleteData();
}
src/main/java/com/zy/asrs/service/WorkService.java
@@ -40,7 +40,7 @@
     */
    void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId,Integer ioPri);
    /**
     * 空板入库
@@ -58,7 +58,7 @@
     * @param param
     * @return
     */
    public WrkMast emptyPlateOut(EmptyPlateOutParam param);
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri);
    /**
     * 盘点出库
src/main/java/com/zy/asrs/service/impl/MesServiceImpl.java
@@ -22,6 +22,7 @@
import com.zy.common.service.CommonService;
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;
@@ -90,6 +91,10 @@
    @Resource
    private MobileService mobileService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderService orderService;
    // region MES接口
@@ -124,7 +129,8 @@
        } else {
            throw new CoolException("同步物料信息,生成入库单失败");
        }
        mesReturn.setSuccess("1");
        mesReturn.setMessage("");
        return mesReturn;
    }
@@ -189,20 +195,6 @@
            if (mat == null) {
                if (!matService.insert(newMat))
                    return -2;
            } else {
                JSONObject dbMemo = JSONObject.parseObject(mat.getMemo());
                dbMemo.remove("OrderNo");
                dbMemo.remove("qty");
                dbMemo.remove("ItemBarcode");
                JSONObject newMemo = JSONObject.parseObject(newMat.getMemo());
                newMemo.remove("OrderNo");
                newMemo.remove("qty");
                dbMemo.remove("ItemBarcode");
                if (!dbMemo.equals(newMemo)) {
                    newMat.setId(mat.getId());
                    if (!matService.updateById(newMat))
                        return -2;
                }
            }
        } else {
            return -1;
@@ -214,13 +206,12 @@
    /**
     * 物料同步入库单,按OrderNo生成多个订单
     *
     *
     * @param matRecvForm
     * @return
     */
    public int inBoundOrder_List(MesMatRecvForm matRecvForm){
    public int inBoundOrder_List(MesMatRecvForm matRecvForm) {
        long docType = 4;   // docType根据库类型确定
        long docType = 1;   // docType根据库类型确定  来料申请单
        long settle = 1;
        Date now = new Date();
@@ -232,8 +223,12 @@
            // 校验订单是否重复
            OrderPakin order = orderPakinService.selectByNo(entry.getKey());
            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
                return -1;
            // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据
            if (!Cools.isEmpty(order)) {
                if (order.getSettle() > 1L) {
                    throw new CoolException(entry.getKey() + "正在出库,无法修改单据");
                }
                orderPakinService.remove(order.getId());
            }
            // 生成订单
@@ -243,52 +238,56 @@
            newMemo.put("operuser", matRecvForm.getOperuser());
            newMemo.put("itemdata", list);
            // 生成订单
            OrderPakin orderPakin = new OrderPakin();
            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
            orderPakin.setOrderNo(entry.getKey());
            orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));
            orderPakin.setDocType(docType);
            orderPakin.setSettle(settle);
            orderPakin.setSettle(1L);
            orderPakin.setStatus(1);
            orderPakin.setCreateBy(defaultUserId);
            orderPakin.setCreateTime(now);
            orderPakin.setUpdateBy(defaultUserId);
            orderPakin.setUpdateTime(now);
            orderPakin.setMemo(newMemo.toJSONString());  //为领料入库完成反馈保存   JSONObject.toJSONString(matRecvForm)
            orderPakin.setMemo(JSONObject.toJSONString(newMemo));  //为出库完成反馈保存
            orderPakin.setPakinPakoutStatus(1);
            if (!orderPakinService.insert(orderPakin)) {
                log.error("MES保存入库订单主档失败");
                throw new CoolException("保存入库订单主档失败");
            }
            orderPakinService.insert(orderPakin);
            if (list != null && !list.isEmpty()) {
                for (MesMatInfo mesMatInfo : list) {
            // 生成明细
            for (MesMatInfo mesMat : list) {
                Mat mat = matService.selectByMatnr(mesMat.getItemNo());
                OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
                orderDetlPakin.setOrderId(orderPakin.getId());
                orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
                orderDetlPakin.setAnfme(Double.valueOf(mesMat.getQty()));
                orderDetlPakin.setQty(0.0);
                orderDetlPakin.setMatnr(mat.getMatnr());
                orderDetlPakin.setMaktx(mat.getMaktx());
                orderDetlPakin.setSpecs(mat.getSpecs());
                orderDetlPakin.setModel(mat.getModel());
                orderDetlPakin.setStandby1(JSONObject.toJSONString(mesMat.getItemBarcode()));   // 零件二维码
                orderDetlPakin.setStandby2("1");  //保存齐套性检查标识,1 检查;0 不检查;
                orderDetlPakin.setCreateBy(defaultUserId);
                orderDetlPakin.setCreateTime(now);
                orderDetlPakin.setUpdateBy(defaultUserId);
                orderDetlPakin.setUpdateTime(now);
                orderDetlPakin.setStatus(1);
                orderDetlPakin.setPakinPakoutStatus(1);
                if (!orderDetlPakinService.insert(orderDetlPakin)) {
                    log.error("MES保存入库订单明细档失败1");
                    throw new CoolException("保存入库订单明细档失败1");
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesMatInfo.getItemNo());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesMatInfo.getItemNo());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
                    orderDetlPakin.setOrderId(orderPakin.getId());
                    orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
                    orderDetlPakin.setAnfme(Double.valueOf(mesMatInfo.getQty()));
                    orderDetlPakin.setQty(0.0);
                    orderDetlPakin.setMatnr(mat.getMatnr());
                    orderDetlPakin.setMaktx(mat.getMaktx());
                    orderDetlPakin.setSpecs(mat.getSpecs());
                    orderDetlPakin.setModel(mat.getModel());
//                    orderDetlPakin.setThreeCode(mesOutApplyItem.getItemBarcode());
//                    orderDetlPakin.setStandby1(mesOutApplyItem.getTrayid());   //保存配盘号,非托盘号
                    orderDetlPakin.setStandby2("0");  //保存齐套性检查标识,1 检查;0 不检查;
                    orderDetlPakin.setCreateBy(defaultUserId);
                    orderDetlPakin.setCreateTime(now);
                    orderDetlPakin.setUpdateBy(defaultUserId);
                    orderDetlPakin.setUpdateTime(now);
                    orderDetlPakin.setStatus(1);
                    orderDetlPakin.setPakinPakoutStatus(1);
                    orderDetlPakinService.insert(orderDetlPakin);
                }
            }
        }
        return 1;
    }
    /**
@@ -348,9 +347,9 @@
            String url = MES_URL + "MaterialReceiptAndReturn";
            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesRecvFeedback));
            if (!StringUtils.isEmpty(response) && response.contains("Success")){
            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                if("1".equals(mesReturn.getSuccess())) {
                if ("1".equals(mesReturn.getSuccess())) {
                    return 1;
                }
            }
@@ -367,137 +366,137 @@
     * @param mesOutApply
     * @return 1 成功;-1 订单重复;
     */
    public int outBoundOrder(MesOutApply mesOutApply){
    public int outBoundOrder(MesOutApply mesOutApply) {
        // 空托出库
        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
            // 生成空托出库任务
            mobileService.callEmptyBinOutBound(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);
            }
            return 1;
        } else {    // 毛坯(物料)出库
            // docType根据库类型确定
            long docType = 7;
            long settle = 1;
            // 校验订单是否重复
            OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
                log.error("出库订单号重复:{}",mesOutApply.getOrderNo());
                return -1;
            }
            // 生成订单
            Date now = new Date();
            OrderPakout orderPakout = new OrderPakout();
            orderPakout.setUuid( String.valueOf(snowflakeIdWorker.nextId()));
            orderPakout.setOrderNo(mesOutApply.getOrderNo());
            orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
            orderPakout.setDocType(docType);
            orderPakout.setSettle(settle);
            orderPakout.setStatus(1);
            orderPakout.setCreateBy(defaultUserId);
            orderPakout.setCreateTime(now);
            orderPakout.setUpdateBy(defaultUserId);
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
            orderPakout.setPakinPakoutStatus(2);
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单主档失败");
                throw new CoolException("保存出库订单主档失败");
            }
            // 生成明细
            Mat mat = matService.selectByMatnr(mesOutApply.getItemno());
            OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
            orderDetlPakout.setOrderId(orderPakout.getId());
            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
            orderDetlPakout.setAnfme(Double.valueOf(mesOutApply.getQty()));
            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.setCreateBy(defaultUserId);
            orderDetlPakout.setCreateTime(now);
            orderDetlPakout.setUpdateBy(defaultUserId);
            orderDetlPakout.setUpdateTime(now);
            orderDetlPakout.setStatus(1);
            orderDetlPakout.setPakinPakoutStatus(2);
            if (!orderDetlPakoutService.insert(orderDetlPakout)) {
                log.error("MES保存出库订单明细档失败");
                throw new CoolException("保存出库订单明细档失败");
            }
            // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。
            // 立库生成订单后,自动调度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(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);
            }
        }
//        // 空托出库
//        if (StringUtils.isEmpty(mesOutApply.getOrderNo()) && "01".equals(mesOutApply.getTransType())) {
//            // 生成空托出库任务
//            mobileService.callEmptyBinOutBound(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);
//            }
//
//            return 1;
//        } else {    // 毛坯(物料)出库
//            // docType根据库类型确定
//            long docType = 7;
//            long settle = 1;
//
//            // 校验订单是否重复
//            OrderPakout order = orderPakoutService.selectByNo(mesOutApply.getOrderNo());
//            if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
//                log.error("出库订单号重复:{}", mesOutApply.getOrderNo());
//                return -1;
//            }
//
//            // 生成订单
//            Date now = new Date();
//            OrderPakout orderPakout = new OrderPakout();
//            orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
//            orderPakout.setOrderNo(mesOutApply.getOrderNo());
//            orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
//            orderPakout.setDocType(docType);
//            orderPakout.setSettle(settle);
//            orderPakout.setStatus(1);
//            orderPakout.setCreateBy(defaultUserId);
//            orderPakout.setCreateTime(now);
//            orderPakout.setUpdateBy(defaultUserId);
//            orderPakout.setUpdateTime(now);
//            orderPakout.setMemo(JSONObject.toJSONString(mesOutApply));
//            orderPakout.setPakinPakoutStatus(2);
//            if (!orderPakoutService.insert(orderPakout)) {
//                log.error("MES保存出库订单主档失败");
//                throw new CoolException("保存出库订单主档失败");
//            }
//
//            // 生成明细
//            Mat mat = matService.selectByMatnr(mesOutApply.getItemno());
//            OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
//            orderDetlPakout.setOrderId(orderPakout.getId());
//            orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
//            orderDetlPakout.setAnfme(Double.valueOf(mesOutApply.getQty()));
//            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.setCreateBy(defaultUserId);
//            orderDetlPakout.setCreateTime(now);
//            orderDetlPakout.setUpdateBy(defaultUserId);
//            orderDetlPakout.setUpdateTime(now);
//            orderDetlPakout.setStatus(1);
//            orderDetlPakout.setPakinPakoutStatus(2);
//            if (!orderDetlPakoutService.insert(orderDetlPakout)) {
//                log.error("MES保存出库订单明细档失败");
//                throw new CoolException("保存出库订单明细档失败");
//            }
//
//            // TODO:若AGV和输送线没有安全交互,则要保证立库出货完成后再呼叫AGV。
//            // 立库生成订单后,自动调度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(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);
//            }
//        }
        return 1;
    }
@@ -509,33 +508,33 @@
     * @param mesInApply
     */
    @Transactional
    public int inBoundOrder(MesInApply mesInApply){
    public int inBoundOrder(MesInApply mesInApply) {
        // 空托回库
        if (StringUtils.isEmpty(mesInApply.getOrderNo()) && StringUtils.isEmpty(mesInApply.getItemno())) {
                if (!StringUtils.isEmpty(mesInApply.getTaskno()) && !StringUtils.isEmpty(mesInApply.getStationID())) {
                    TransTask transTask = new TransTask();
                    transTask.setTaskno(mesInApply.getTaskno());
                    transTask.setTaskname(mesInApply.getTaskname());
                    transTask.setOrderNo(mesInApply.getOrderNo());
                    transTask.setTransType(mesInApply.getTransType());
                    transTask.setCurProcess(mesInApply.getProductLineId());
                    transTask.setCurStationId(mesInApply.getStationID());
                    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 = submitTask(transTask);
                    if (!"1".equals(sendAgvTask.getString("Success"))) {
                        log.error("出库下发agv运输任务失败,{}", JSONObject.toJSONString(transTask));
                        return 2;
                    }
                } else {
                    log.error("无任务号:{},或无物料编码:{}",mesInApply.getTaskno(),mesInApply.getItemno() );
            if (!StringUtils.isEmpty(mesInApply.getTaskno()) && !StringUtils.isEmpty(mesInApply.getStationID())) {
                TransTask transTask = new TransTask();
                transTask.setTaskno(mesInApply.getTaskno());
                transTask.setTaskname(mesInApply.getTaskname());
                transTask.setOrderNo(mesInApply.getOrderNo());
                transTask.setTransType(mesInApply.getTransType());
                transTask.setCurProcess(mesInApply.getProductLineId());
                transTask.setCurStationId(mesInApply.getStationID());
                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 = submitTask(transTask);
                if (!"1".equals(sendAgvTask.getString("Success"))) {
                    log.error("出库下发agv运输任务失败,{}", JSONObject.toJSONString(transTask));
                    return 2;
                }
            } else {
                log.error("无任务号:{},或无物料编码:{}", mesInApply.getTaskno(), mesInApply.getItemno());
                return 2;
            }
            return 1;
        } else {    // 毛坯、成品回库
@@ -716,9 +715,9 @@
            String url = MES_URL + "issueComplete";
            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));
            if (!StringUtils.isEmpty(response) && response.contains("Success")){
            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                if("1".equals(mesReturn.getSuccess())) {
                if ("1".equals(mesReturn.getSuccess())) {
                    success = 1;
                }
            }
@@ -759,9 +758,9 @@
            String url = MES_URL + "loadComplete";
            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
            if (!StringUtils.isEmpty(response) && response.contains("Success")){
            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                if("1".equals(mesReturn.getSuccess())) {
                if ("1".equals(mesReturn.getSuccess())) {
                    success = 1;
                }
            }
@@ -819,9 +818,9 @@
                    String url = MES_URL + "loadComplete";
                    String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(result));
                    if (!StringUtils.isEmpty(response) && response.contains("Success")){
                    if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                        MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                        if("1".equals(mesReturn.getSuccess())) {
                        if ("1".equals(mesReturn.getSuccess())) {
                            success++;
                        }
                    }
@@ -885,9 +884,9 @@
                    String url = MES_URL + "issueComplete";
                    String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesOutFeedback));
                    if (!StringUtils.isEmpty(response) && response.contains("Success")){
                    if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                        MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                        if("1".equals(mesReturn.getSuccess())) {
                        if ("1".equals(mesReturn.getSuccess())) {
                            success++;
                        }
                    }
@@ -934,67 +933,144 @@
     * @param mesCallOutApply
     * @return
     */
    public int callOutBoundOrder(MesCallOutApply mesCallOutApply){
        // docType根据库类型确定
        long docType = 7;
        long settle = 1;
        // 校验订单是否重复
        OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo());
        if (order != null && !StringUtils.isEmpty(order.getOrderNo())) {
            return -1;
    public int callOutBoundOrder(MesCallOutApply mesCallOutApply) {
        DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", mesCallOutApply.getTransType()));
        if (docType == null) {
            return 0;
        }
        //生成出库单
        if (docType.getPakout() == 1) {
            long settle = 1;
        // 生成订单
        Date now = new Date();
        OrderPakout orderPakout = new OrderPakout();
        orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        orderPakout.setOrderNo(mesCallOutApply.getOrderNo());
        orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
        orderPakout.setDocType(docType);
        orderPakout.setSettle(settle);
        orderPakout.setStatus(1);
        orderPakout.setCreateBy(defaultUserId);
        orderPakout.setCreateTime(now);
        orderPakout.setUpdateBy(defaultUserId);
        orderPakout.setUpdateTime(now);
        orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
        orderPakout.setPakinPakoutStatus(2);
        if (!orderPakoutService.insert(orderPakout)) {
            log.error("MES保存出库订单(叫料)主档失败");
            throw new CoolException("保存出库订单(叫料)主档失败");
        }
            // 校验订单是否重复
            OrderPakout order = orderPakoutService.selectByNo(mesCallOutApply.getOrderNo());
            // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据
            if (!Cools.isEmpty(order)) {
                if (order.getSettle() > 1L) {
                    throw new CoolException(mesCallOutApply.getOrderNo() + "正在出库,无法修改单据");
                }
                orderPakoutService.remove(order.getId());
            }
        // 生成明细
        if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
            for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
                Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
                orderDetlPakout.setOrderId(orderPakout.getId());
                orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
                orderDetlPakout.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));
                orderDetlPakout.setQty(0.0);
                orderDetlPakout.setMatnr(mat.getMatnr());
                orderDetlPakout.setMaktx(mat.getMaktx());
                orderDetlPakout.setSpecs(mat.getSpecs());
                orderDetlPakout.setModel(mat.getModel());
                orderDetlPakout.setThreeCode(mesOutApplyItem.getItemBarcode());
                orderDetlPakout.setStandby1(mesOutApplyItem.getTrayid());   //保存配盘号,非托盘号
                orderDetlPakout.setCreateBy(defaultUserId);
                orderDetlPakout.setCreateTime(now);
                orderDetlPakout.setUpdateBy(defaultUserId);
                orderDetlPakout.setUpdateTime(now);
                orderDetlPakout.setStatus(1);
                orderDetlPakout.setPakinPakoutStatus(2);
                if (!orderDetlPakoutService.insert(orderDetlPakout)) {
                    log.error("MES保存出库订单(叫料)明细档失败");
                    throw new CoolException("保存出库订单(叫料)明细档失败");
            // 生成订单
            Date now = new Date();
            OrderPakout orderPakout = new OrderPakout();
            orderPakout.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
            orderPakout.setOrderNo(mesCallOutApply.getOrderNo());
            orderPakout.setOrderTime(com.core.common.DateUtils.convert(now));
            orderPakout.setDocType(docType.getDocId());
            orderPakout.setSettle(settle);
            orderPakout.setStatus(1);
            orderPakout.setCreateBy(defaultUserId);
            orderPakout.setCreateTime(now);
            orderPakout.setUpdateBy(defaultUserId);
            orderPakout.setUpdateTime(now);
            orderPakout.setMemo(JSONObject.toJSONString(mesCallOutApply));
            orderPakout.setPakinPakoutStatus(2);
            if (!orderPakoutService.insert(orderPakout)) {
                log.error("MES保存出库订单(叫料)主档失败");
                throw new CoolException("保存出库订单(叫料)主档失败");
            }
            Set<String> set = new HashSet<>();
            // 生成明细
            if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()) {
                    set.add(mesOutApplyItem.getTrayid());
                    Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                    OrderDetlPakout orderDetlPakout = new OrderDetlPakout();
                    orderDetlPakout.setOrderId(orderPakout.getId());
                    orderDetlPakout.setOrderNo(orderPakout.getOrderNo());
                    orderDetlPakout.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));
                    orderDetlPakout.setQty(0.0);
                    orderDetlPakout.setMatnr(mat.getMatnr());
                    orderDetlPakout.setMaktx(mat.getMaktx());
                    orderDetlPakout.setSpecs(mat.getSpecs());
                    orderDetlPakout.setModel(mat.getModel());
                    orderDetlPakout.setThreeCode(mesOutApplyItem.getItemBarcode());
                    orderDetlPakout.setStandby1(mesOutApplyItem.getTrayid());   //保存配盘号,非托盘号
                    orderDetlPakout.setCreateBy(defaultUserId);
                    orderDetlPakout.setCreateTime(now);
                    orderDetlPakout.setUpdateBy(defaultUserId);
                    orderDetlPakout.setUpdateTime(now);
                    orderDetlPakout.setStatus(1);
                    orderDetlPakout.setPakinPakoutStatus(2);
                    if (!orderDetlPakoutService.insert(orderDetlPakout)) {
                        log.error("MES保存出库订单(叫料)明细档失败");
                        throw new CoolException("保存出库订单(叫料)明细档失败");
                    }
                }
            }
            //有多少种不同的配盘号   只有配盘出库单需要知道
            if (mesCallOutApply.getTransType().equals("配盘出库单")){
                orderPakout.setPayType(set.size());
                String shipCode =mesCallOutApply.getItemdata().get(0).getTrayid().split("-")[2];
                orderPakout.setShipCode(shipCode);//区域  是否是特殊托盘
                orderPakoutService.updateById(orderPakout);
            }
            return 1;
        } else {
            // 校验订单是否重复
            OrderPakin order = orderPakinService.selectByNo(mesCallOutApply.getOrderNo());
            // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据
            if (!Cools.isEmpty(order)) {
                if (order.getSettle() > 1L) {
                    throw new CoolException(mesCallOutApply.getOrderNo() + "正在出库,无法修改单据");
                }
                orderPakinService.remove(order.getId());
            }
            // 生成订单
            Date now = new Date();
            OrderPakin orderPakin = new OrderPakin();
            orderPakin.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
            orderPakin.setOrderNo(mesCallOutApply.getOrderNo());
            orderPakin.setOrderTime(com.core.common.DateUtils.convert(now));
            orderPakin.setDocType(docType.getDocId());
            orderPakin.setSettle(1L);
            orderPakin.setStatus(1);
            orderPakin.setCreateBy(defaultUserId);
            orderPakin.setCreateTime(now);
            orderPakin.setUpdateBy(defaultUserId);
            orderPakin.setUpdateTime(now);
            orderPakin.setMemo(JSONObject.toJSONString(mesCallOutApply));  //为出库完成反馈保存
            orderPakin.setPakinPakoutStatus(1);
            orderPakinService.insert(orderPakin);
            if (mesCallOutApply.getItemdata() != null && !mesCallOutApply.getItemdata().isEmpty()) {
                for (MesCallOutApply.MesOutApplyItem mesOutApplyItem : mesCallOutApply.getItemdata()){
                    // 生成明细
                    Mat mat = matService.selectByMatnr(mesOutApplyItem.getItemno());
                    if(Cools.isEmpty(mat)){
                        log.error("该物料编号立库没有="+mesOutApplyItem.getItemno());
                        continue;
                    }
                    OrderDetlPakin orderDetlPakin = new OrderDetlPakin();
                    orderDetlPakin.setOrderId(orderPakin.getId());
                    orderDetlPakin.setOrderNo(orderPakin.getOrderNo());
                    orderDetlPakin.setAnfme(Double.valueOf(mesOutApplyItem.getQty()));
                    orderDetlPakin.setQty(0.0);
                    orderDetlPakin.setMatnr(mat.getMatnr());
                    orderDetlPakin.setMaktx(mat.getMaktx());
                    orderDetlPakin.setSpecs(mat.getSpecs());
                    orderDetlPakin.setModel(mat.getModel());
                    orderDetlPakin.setThreeCode(mesOutApplyItem.getItemBarcode());
                    orderDetlPakin.setStandby1(mesOutApplyItem.getTrayid());   //保存配盘号,非托盘号
                    orderDetlPakin.setStandby2("0");  //保存齐套性检查标识,1 检查;0 不检查;
                    orderDetlPakin.setCreateBy(defaultUserId);
                    orderDetlPakin.setCreateTime(now);
                    orderDetlPakin.setUpdateBy(defaultUserId);
                    orderDetlPakin.setUpdateTime(now);
                    orderDetlPakin.setStatus(1);
                    orderDetlPakin.setPakinPakoutStatus(1);
                    orderDetlPakinService.insert(orderDetlPakin);
                }
            }
            return 1;
        }
        return 1;
    }
    // endregion
@@ -1046,18 +1122,18 @@
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
//        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        int success = 1;
        int success = rcsService.submitTask(rcsTaskSubmit, transTask.getAgvFactory());
        if (success == 1) {
            int workNo = commonService.getWorkNo(WorkNoType.OTHER.type);
            Date now = new Date();
            Task task = new Task();
            task.setWrkNo(workNo);
            task.setTaskType("AGV");
            task.setWrkSts(301L);
            task.setIoType(3);
            task.setTaskType("ZX-AGV");
            task.setWrkSts(302L);//302.AGV任务执行中
            task.setIoType(3);//3.站到站
            task.setIoPri(10.00);
            task.setWrkDate(now);
            task.setBarcode(transTask.getBarcode());
            task.setSourceStaNo(transTask.getCurStationId());
            task.setStaNo(transTask.getNextStationId());
            task.setBarcode(transTask.getTuoPanId());
@@ -1067,25 +1143,27 @@
            task.setAppeTime(now);
            task.setTaskNo(transTask.getTaskno());
            task.setMemo(JSONObject.toJSONString(transTask));
            task.setPltType(transTask.getAgvFactory());//华晓AGV
            task.setPacked(transTask.getRackNumber());//料架号
            taskService.insert(task);
            Mat mat = matService.selectByMatnr(transTask.getItemno());
            TaskDetl taskDetl = new TaskDetl();
            taskDetl.setWrkNo(task.getWrkNo());
            taskDetl.setIoTime(task.getIoTime());
            taskDetl.setMatnr(transTask.getItemno());
            taskDetl.setAnfme(0.0);
            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.setModiUser(defaultUserId);
            taskDetl.setModiTime(now);
            taskDetl.setAppeUser(defaultUserId);
            taskDetl.setAppeTime(now);
            taskDetlService.insert(taskDetl);
//            Mat mat = matService.selectByMatnr(transTask.getItemno());
//            TaskDetl taskDetl = new TaskDetl();
//            taskDetl.setWrkNo(task.getWrkNo());
//            taskDetl.setIoTime(task.getIoTime());
//            taskDetl.setMatnr(transTask.getItemno());
//            taskDetl.setAnfme(0.0);
//            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.setModiUser(defaultUserId);
//            taskDetl.setModiTime(now);
//            taskDetl.setAppeUser(defaultUserId);
//            taskDetl.setAppeTime(now);
//            taskDetlService.insert(taskDetl);
            result.put("Success", "1");
            result.put("Message", "任务接收成功");
        } else {
@@ -1125,9 +1203,9 @@
            String url = MES_URL + "api/task/reporter";
            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(transTaskFeedback));
            if (!StringUtils.isEmpty(response) && response.contains("Success")){
            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                if("1".equals(mesReturn.getSuccess())) {
                if ("1".equals(mesReturn.getSuccess())) {
                    return 1;
                }
            }
@@ -1146,9 +1224,9 @@
        String url = MES_URL + "api/apply/inLine";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            JSONObject jsonObject = JSONObject.parseObject(response);
            if("1".equals(jsonObject.getString("Success"))) {
            if ("1".equals(jsonObject.getString("Success"))) {
                return jsonObject.getJSONObject("Data").getString("status");
            }
        }
@@ -1163,12 +1241,12 @@
     * @return
     */
    public int applyInStation(TransParent apply) {
        String path = ("LL").equals(apply.getProductLineId()) ? "AGVTransportPalletNotice" : "AprsAGVTransportPalletNotice";
        String path = "AGVTransportPalletNotice";
        String url = MES_URL + path;
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if("1".equals(mesReturn.getSuccess())) {
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
@@ -1185,19 +1263,34 @@
    public MesReturn allowInStation(TransInOutStationAllow allow) {
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess("1");
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
            rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
            rcsTaskContinue.setTriggerType("TASK");
            rcsTaskContinue.setTriggerCode(allow.getTaskno());
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                    rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
                    rcsTaskContinue.setTriggerType("TASK");
                    rcsTaskContinue.setTriggerCode(allow.getTaskno());
//            rcsTaskContinue.setTriggerType("ROBOT");
//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
            mesReturn.setSuccess(success == 1 ? "1" : "2");
            mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                    int success = rcsService.continueTask(rcsTaskContinue, 1);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                } else {
                    allow.setMethod("APPLY_IN_STATION");
                    int success = rcsService.continueTask(allow, 2);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                }
            }
        }
        return mesReturn;
@@ -1219,9 +1312,9 @@
        String url = MES_URL + "AGVArrivalCompleted";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(arrivalStation));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if("1".equals(mesReturn.getSuccess())) {
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
@@ -1237,11 +1330,11 @@
     */
    public int applyOutStation(TransParent apply) {
        String url = MES_URL + "api/apply/outStation";
        String url = MES_URL + "AGVDepartureRequest";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if("1".equals(mesReturn.getSuccess())) {
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
@@ -1258,17 +1351,34 @@
    public MesReturn allowOutStation(TransInOutStationAllow allow) {
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess("1");
        mesReturn.setSuccess("2");
        if ("Y".equals(allow.getStatus())) {
            RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
            rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
            rcsTaskContinue.setTriggerType("TASK");
            rcsTaskContinue.setTriggerCode(allow.getTaskno());
            Task task = taskService.selectOne(new EntityWrapper<Task>().eq("task_no", allow.getTaskno()));
            if (Cools.isEmpty(task)) {
                mesReturn.setMessage("没有找个该任务编号=" + allow.getTaskno() + "的AGV移动任务");
            } else {
                //查看申请站点的是海康还是华晓
                //海康
                if (Cools.isEmpty(task.getPltType()) || task.getPltType() == 1) {
                    RcsTaskContinue rcsTaskContinue = new RcsTaskContinue();
                    rcsTaskContinue.setRobotTaskCode(allow.getTaskno());
                    rcsTaskContinue.setTriggerType("TASK");
                    rcsTaskContinue.setTriggerCode(allow.getTaskno());
//            rcsTaskContinue.setTriggerType("ROBOT");
//            rcsTaskContinue.setTriggerCode(allow.getAgvCode());
            int success = rcsService.continueTask(rcsTaskContinue, checkRcsFactory(allow.getAgvCode()));
            mesReturn.setSuccess(success == 1 ? "1" : "2");
            mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                    int success = rcsService.continueTask(rcsTaskContinue, 1);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                } else {
                    allow.setMethod("APPLY_OFF_STATION");
                    int success = rcsService.continueTask(allow, 2);
                    mesReturn.setSuccess(success == 1 ? "1" : "2");
                    mesReturn.setMessage(success == 1 ? "" : "转发给RCS失败");
                }
            }
        }
        return mesReturn;
@@ -1284,9 +1394,9 @@
        String url = MES_URL + "AGVDepartureCompleted";
        String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(apply));
        if (!StringUtils.isEmpty(response) && response.contains("Success")){
        if (!StringUtils.isEmpty(response) && response.contains("Success")) {
            MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
            if("1".equals(mesReturn.getSuccess())) {
            if ("1".equals(mesReturn.getSuccess())) {
                return 1;
            }
        }
@@ -1295,13 +1405,13 @@
    }
    @Override
    public MesReturn queryInventory(String itemno,String orderNo) {
    public MesReturn queryInventory(String itemno, String orderNo) {
        MesReturn mesReturn = new MesReturn();
        mesReturn.setSuccess("1");
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", itemno).eq("order_no",orderNo));
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("matnr", itemno).eq("order_no", orderNo));
        int count = 0;
        for(LocDetl locDetl:locDetls) {
        for (LocDetl locDetl : locDetls) {
            count += locDetl.getAnfme();
        }
        mesReturn.setMessage(String.valueOf(count));
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -622,6 +622,15 @@
                waitPakin.setModiTime(now);
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }else {
                    WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                            .eq("barcode", param.getBarcode())
                            .eq("io_type",110));
                    if (wrkMast != null) {
                        wrkMast.setWrkSts(15L);//空板出库任务转历史档
                        wrkMast.setModiTime(new Date());
                        wrkMastService.updateById(wrkMast);
                    }
                }
            }
            // 关联组托
@@ -720,8 +729,46 @@
                Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE, orderNo);
                OrderInAndOutUtil.updateOrder(Boolean.TRUE, order.getId(), 2L, userId);
            });
        }
            if(!Cools.isEmpty(param.getLocNo())){
                //生成AGV搬运任务
                //生成AGV搬运出库任务
                // 保存工作档
                Task task = new Task();
                Date date = new Date();
                String s = "";
                if (param.getBarcode().charAt(0) == '3'){
                    s = "307";
                }else if (param.getBarcode().charAt(0) == '4'){
                    s = "401";
                }else if (param.getBarcode().charAt(0) == '5'){
                    s = "402";
                }
                String TaskNo = param.getBarcode()+"-"+date.getTime();
                task.setWrkNo(Integer.getInteger(param.getBarcode()))
                        .setTaskNo(TaskNo)
                        .setIoTime(date)
                        .setWrkSts(301L) // 工作状态:301.任务下发
                        .setIoType(3) // 入出库状态: 3.站到站
                        .setTaskType("agv")
                        .setIoPri(10D)
                        .setFullPlt("Y") // 满板:Y
                        .setPicking("N") // 拣料
                        .setExitMk("N")// 退出
                        .setStaNo(s)
                        .setSourceStaNo(param.getLocNo())//空料架缓存区E1
                        .setEmptyMk("N")// 空板
                        .setBarcode(param.getBarcode())// 托盘码
                        .setLinkMis("N")
                        .setAppeUser(9945L)
                        .setAppeTime(date)
                        .setModiUser(9945L)
                        .setModiTime(date);
                if (!taskService.insert(task)) {
                    throw new CoolException("保存工作档失败");
                }
            }
        }
    }
    // 商品上架
@@ -1279,14 +1326,25 @@
        if(locMast == null) {
            return R.parse("该类型:" + locType +"空托盘不存在");
        }
        String sta="";
        //滑块库
        if(locMast.getLocType3()==1){
            if(locMast.getLocType2()==1){
            }
        }else if(locMast.getLocType3()==2){
            sta="307";
        }
        // 获取路径
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 110)
                .eq("stn_no", staNo)
                .eq("stn_no", sta)
                .eq("crn_no", locMast.getCrnNo());
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (staDesc == null) {
            R.parse("出库路径不存在,站点:" + staNo);
            R.parse("出库路径不存在,站点:" + sta);
        }
        Date now = new Date();
        // 生成工作档
@@ -1297,8 +1355,8 @@
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(110); // 入出库状态: 110.空板出库
        wrkMast.setIoPri(10D);
        wrkMast.setSourceStaNo(staDesc.getCrnStn$()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo$()); // 目标站
        wrkMast.setSourceStaNo(sta); // 源站
        wrkMast.setStaNo(sta); // 目标站
        wrkMast.setCrnNo(staDesc.getCrnNo());
        wrkMast.setSourceLocNo(locMast.getLocNo()); // 源库位
        wrkMast.setFullPlt("N"); // 满板:Y
@@ -1310,6 +1368,7 @@
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        wrkMast.setMemo(staNo);
        wrkMastService.insert(wrkMast);
        // 更新库位状态
src/main/java/com/zy/asrs/service/impl/OrderPakinServiceImpl.java
@@ -36,6 +36,8 @@
    private DocTypeService docTypeService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderDetlPakinServiceImpl orderDetlPakinService;
    @Override
    public OrderPakin selectByNo(String orderNo) {
@@ -71,7 +73,7 @@
        if (Cools.isEmpty(order) || order.getSettle() >= 4L) {
            return;
        }
        List<OrderDetlPakin> orderDetls = orderDetlMapper.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_id", order.getId()));
        List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_id", order.getId()));
        boolean complete = true;
        for (OrderDetlPakin orderDetl : orderDetls) {
            if (orderDetl.getAnfme() > orderDetl.getQty()) {
@@ -83,7 +85,7 @@
            // 出库订单重新整理明细
            DocType docType = docTypeService.selectById(order.getDocType());
            if (null != docType && docType.getPakout() == 1) {
                if (!orderDetlService.delete(new EntityWrapper<OrderDetlPakin>().eq("order_id", order.getId()))) {
                if (!orderDetlPakinService.delete(new EntityWrapper<OrderDetlPakin>().eq("order_id", order.getId()))) {
                    throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                }
                List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNo(orderNo);
@@ -98,7 +100,7 @@
                    orderDetl.setCreateBy(order.getCreateBy());
                    orderDetl.setUpdateTime(order.getUpdateTime());
                    orderDetl.setUpdateBy(order.getUpdateBy());
                    if (!orderDetlService.insert(orderDetl)) {
                    if (!orderDetlPakinService.insert(orderDetl)) {
                        throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                    }
                }
@@ -169,7 +171,7 @@
        if (!this.deleteById(orderId)) {
            throw new CoolException("删除单据失败");
        }
        orderDetlService.delete(new EntityWrapper<OrderDetlPakin>().eq("order_id", orderId));
        orderDetlPakinService.delete(new EntityWrapper<OrderDetlPakin>().eq("order_id", orderId));
    }
    @Override
src/main/java/com/zy/asrs/service/impl/OrderPakoutServiceImpl.java
@@ -36,6 +36,8 @@
    private DocTypeService docTypeService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderDetlPakoutServiceImpl orderDetlPakoutService;
    @Override
    public OrderPakout selectByNo(String orderNo) {
@@ -71,7 +73,7 @@
        if (Cools.isEmpty(order) || order.getSettle() >= 4L) {
            return;
        }
        List<OrderDetlPakout> orderDetls = orderDetlMapper.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_id", order.getId()));
        List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectList(new EntityWrapper<OrderDetlPakout>().eq("order_id", order.getId()));
        boolean complete = true;
        for (OrderDetlPakout orderDetl : orderDetls) {
            if (orderDetl.getAnfme() > orderDetl.getQty()) {
@@ -83,7 +85,7 @@
            // 出库订单重新整理明细
            DocType docType = docTypeService.selectById(order.getDocType());
            if (null != docType && docType.getPakout() == 1) {
                if (!orderDetlService.delete(new EntityWrapper<OrderDetlPakout>().eq("order_id", order.getId()))) {
                if (!orderDetlPakoutService.delete(new EntityWrapper<OrderDetlPakout>().eq("order_id", order.getId()))) {
                    throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                }
                List<WrkDetl> wrkDetls = wrkDetlService.selectAndLogByOrderNo(orderNo);
@@ -98,7 +100,8 @@
                    orderDetl.setCreateBy(order.getCreateBy());
                    orderDetl.setUpdateTime(order.getUpdateTime());
                    orderDetl.setUpdateBy(order.getUpdateBy());
                    if (!orderDetlService.insert(orderDetl)) {
                    orderDetl.setBarcode(wrkDetl.getZpallet());
                    if (!orderDetlPakoutService.insert(orderDetl)) {
                        throw new CoolException("重整出库订单【orderNo = " + order.getOrderNo() + "】明细失败");
                    }
                }
@@ -168,7 +171,7 @@
        if (!this.deleteById(orderId)) {
            throw new CoolException("删除单据失败");
        }
        orderDetlService.delete(new EntityWrapper<OrderDetlPakout>().eq("order_id", orderId));
        orderDetlPakoutService.delete(new EntityWrapper<OrderDetlPakout>().eq("order_id", orderId));
    }
    @Override
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -37,6 +37,15 @@
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderPakinService orderPakinService;
    @Autowired
    private OrderPakoutService orderPakoutService;
    @Autowired
    private OrderDetlPakinService orderDetlPakinService;
    @Autowired
    private OrderDetlPakoutService orderDetlPakoutService;
    @Override
    public Order selectByNo(String orderNo) {
        List<Order> orderList = this.selectList(new EntityWrapper<Order>().eq("order_no", orderNo));
src/main/java/com/zy/asrs/service/impl/RcsServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.TransArrivalStation;
import com.zy.asrs.entity.mes.TransParent;
@@ -16,7 +17,10 @@
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URL;
@@ -39,6 +43,12 @@
    // 华晓RCS地址
    @Value("${hx.url}")
    private String HX_URL;
    // 华晓RCS地址
    @Value("${hx.taskNo}")
    private String taskNo;
    // 华晓RCS地址
    @Value("${hx.inOk}")
    private String inOk;
    @Value("${mes.defaultUserId}")
    public long defaultUserId;
@@ -55,6 +65,9 @@
    private TaskDetlServiceImpl taskDetlService;
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private ApiLogService apiLogService;
    // region 封锁区逻辑,目前只有一个大封锁区,任务全部转到滑块库处理,或直接写到滑块库
@@ -85,40 +98,40 @@
     */
    public void managerBlock() {
       try {
           BlockTask firstTask = blockTaskMapper.findTop();
           if (firstTask == null) {
               return;
           }
           EntityWrapper<BlockStation> wrapper = new EntityWrapper<>();
           wrapper.eq("block_no", firstTask.getBlockNo());
           List<BlockStation> stations = blockStationMapper.selectList(wrapper);
           if (!stations.isEmpty()) {
               boolean locked = false;
               for (BlockStation station : stations) {
                   // 只允许1个厂家设备进入封锁区,status状态:0 空闲;1 海康封锁中;2 华晓封锁中;-1 异常;
                   if (station.getStatus() > 0 && !station.getStatus().equals(firstTask.getAgvFactory())) {
                       locked = true;
                       break;
                   }
               }
        try {
            BlockTask firstTask = blockTaskMapper.findTop();
            if (firstTask == null) {
                return;
            }
            EntityWrapper<BlockStation> wrapper = new EntityWrapper<>();
            wrapper.eq("block_no", firstTask.getBlockNo());
            List<BlockStation> stations = blockStationMapper.selectList(wrapper);
            if (!stations.isEmpty()) {
                boolean locked = false;
                for (BlockStation station : stations) {
                    // 只允许1个厂家设备进入封锁区,status状态:0 空闲;1 海康封锁中;2 华晓封锁中;-1 异常;
                    if (station.getStatus() > 0 && !station.getStatus().equals(firstTask.getAgvFactory())) {
                        locked = true;
                        break;
                    }
                }
               if (!locked) {
                   // 封锁状态
                   int success = blockStationMapper.addByBlockNo(firstTask.getBlockNo(), firstTask.getAgvFactory());
                   if (success > 0) {
                       // 通知RCS
                       RcsEqptNotify notify = new RcsEqptNotify();
                       notify.setEqptCode(firstTask.getBlockNo());
                       notify.setTaskCode(firstTask.getTaskCode());
                       notify.setActionStatus("1");
                       notifyEqpt(notify, firstTask.getAgvFactory());
                   }
               }
           }
       } catch (Exception e) {
           log.error("管理封锁区异常", e);
       }
                if (!locked) {
                    // 封锁状态
                    int success = blockStationMapper.addByBlockNo(firstTask.getBlockNo(), firstTask.getAgvFactory());
                    if (success > 0) {
                        // 通知RCS
                        RcsEqptNotify notify = new RcsEqptNotify();
                        notify.setEqptCode(firstTask.getBlockNo());
                        notify.setTaskCode(firstTask.getTaskCode());
                        notify.setActionStatus("1");
                        notifyEqpt(notify, firstTask.getAgvFactory());
                    }
                }
            }
        } catch (Exception e) {
            log.error("管理封锁区异常", e);
        }
    }
    /**
@@ -168,13 +181,59 @@
     */
    public int submitTask(RcsTaskSubmit rcsTaskSubmit, int rcsFactory){
        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/submit";
        String response = sendPost(url, rcsTaskSubmit.toString());
//        String response = "";
//        boolean success = false;
//        Map<String,Object> headers = new HashMap<>();
//        headers.put("Content-Type","application/json");
//        headers.put("Content-Length","<calculated when request is sent>");
//        headers.put("Host","<calculated when request is sent>");
////        headers.put("Connection","keep-alive");
////        headers.put("Accept","*/*");
////        headers.put("Accept-Encoding","gzip, deflate, br");
//        headers.put("X-lr-request-id","123");
//        headers.put("X-lr-version","4.3");
//        try {
//            response = new HttpHandler.Builder()
//                    .setUri(HIK_URL)
//                    .setPath("api/robot/controller/task/submit")
//                    .setHeaders(headers)
//                    .setJson(JSON.toJSONString(rcsTaskSubmit))
//                    .build()
//                    .doPost();
//            JSONObject jsonObject = JSON.parseObject(response);
//            if (jsonObject.getBoolean("success")) {
//                success = true;
//            } else {
//                log.error("下发agv任务失败!url:{};request:{};response:{}", HIK_URL + "api/robot/controller/task/submit", JSON.toJSONString(rcsTaskSubmit), response);
//            }
//        } catch (Exception e) {
//            log.error("下发agv任务异常", e);
//        } finally {
//            try {
//                // 保存接口日志
//                apiLogService.save(
//                        "下发agv任务",
//                        HIK_URL + "api/robot/controller/task/submit",
//                        null,
//                        "127.0.0.1",
//                        JSON.toJSONString(rcsTaskSubmit),
//                        response,
//                        success
//                );
//            } catch (Exception e) {
//                log.error("下发agv任务保存接口日志异常", e);
//            }
//        }
//        return success ? 1 : 0;
        String url = rcsFactory == 2 ? HX_URL+taskNo :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())) {
            if("SUCCESS".equals(rcsReturn.getCode())||"200".equals(rcsReturn.getCode())) {
                JSONObject data = rcsReturn.getData();
                String robotTaskCode = data.getString("robotTaskCode");
                String robotTaskCode = data.getString("RobotTaskCode");
                if (robotTaskCode.equals(rcsTaskSubmit.getRobotTaskCode())){
                    return 1;
                }
@@ -191,18 +250,14 @@
     * @param rcsFactory
     * @return
     */
    public int continueTask(RcsTaskContinue rcsTaskContinue, int rcsFactory){
    public int continueTask(Object rcsTaskContinue, int rcsFactory){
        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/extend/continue";
        String response = sendPost(url, rcsTaskContinue.toString());
        String url = rcsFactory == 2 ? HX_URL+inOk :HIK_URL + "api/robot/controller/task/extend/continue";
        String response = sendPost(url, JSONObject.toJSONString(rcsTaskContinue));
        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(rcsTaskContinue.getRobotTaskCode())) {
                    return 1;
                }
            if("200".equals(rcsReturn.getCode())) {
                return 1;
            }
        }
@@ -218,7 +273,7 @@
     */
    public int cancelTask(RcsTaskCancel rcsTaskCancel, int rcsFactory){
        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/robot/controller/task/cancel";
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/robot/controller/task/cancel";
        String response = sendPost(url, rcsTaskCancel.toString());
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
@@ -243,7 +298,7 @@
     */
    private int notifyEqpt(RcsEqptNotify rcsEqptNotify, int rcsFactory){
        String url = rcsFactory == 2 ? HIK_URL : HX_URL + "api/wcs/robot/eqpt/notify";
        String url = rcsFactory == 2 ? HX_URL :HIK_URL + "api/wcs/robot/eqpt/notify";
        String response = sendPost(url, rcsEqptNotify.toString());
        if (!StringUtils.isEmpty(response) && response.contains("code")){
            RcsReturn rcsReturn = JSONObject.parseObject(response, RcsReturn.class);
@@ -272,65 +327,51 @@
        String robotTaskCode = rcsReporterTask.getRobotTaskCode();
        String singleRobotCode = rcsReporterTask.getSingleRobotCode();
        JSONObject values = rcsReporterTask.getExtra().getJSONObject("values");
        // start : 任务开始;outbin : 走出储位;end : 任务完成
        String method = values.getString("method");
        String carrierType = values.getString("carrierType");
        String slotCategory = values.getString("slotCategory");
        String slotCode = values.getString("slotCode");
        try {
            if ("Q3".equals(carrierType) || "Q8".equals(carrierType)) {    //AGV
        //华晓AGV状态反馈,及申请
        if(Cools.isEmpty(rcsReporterTask.getExtra())){
            if(Cools.isEmpty(rcsReporterTask.getMethod())){
                log.error("华晓AGV上报状态Method为空!");
                rcsReturn.setCode("Err_Internal");
                rcsReturn.setMessage("华晓AGV上报状态Method为空");
                JSONObject data = new JSONObject();
                data.put("robotTaskCode", robotTaskCode);
                rcsReturn.setData(data);
            }else {
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                    rcsReturn.setCode("Err_RobotCodeNotMatch");
                    rcsReturn.setMessage("");
                    JSONObject data = new JSONObject();
                    data.put("robotTaskCode", robotTaskCode);
                    rcsReturn.setData(data);
                    return rcsReturn;
                }
                JSONObject memo = JSONObject.parseObject(task.getMemo());
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
                String method = rcsReporterTask.getMethod();
                JSONObject memo = Cools.isEmpty(task) ? null : JSONObject.parseObject(task.getMemo());
                switch (method) {
                    case "TASK_START": {
                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                    } break;
                    case TASK_OUT_BIN: {
                    case "TASK_OUT_BIN": {
                        // TODO:立库出库一托,AGV开始运输后,给MES发送出库完成(一托发一次)
                        JSONObject taskMemo = JSONObject.parseObject(task.getMemo());
                        mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task);
//                        JSONObject taskMemo = JSONObject.parseObject(task.getMemo());
//                        mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task);
                    } break;
                    case TASK_END: {
                    case "TASK_END": {
                        if(Cools.isEmpty(task)){
                            rcsReturn.setCode("Err_RobotCodeNotMatch");
                            rcsReturn.setMessage("");
                            JSONObject data = new JSONObject();
                            data.put("robotTaskCode", robotTaskCode);
                            rcsReturn.setData(data);
                            return rcsReturn;
                        }
                        // 更新任务状态等内部逻辑
                        task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        taskService.updateById(task);
                        // 任务完成
//                        mesService.reporterTask(rcsReporterTask);
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
//                    wapper2.eq("wrk_no", task.getWrkNo())
//                            .eq("matnr", memo.getString("ItemNo"))
//                            .eq("order_no", memo.getString("OrderNo"));
//                    TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
//                    taskDetl.setAnfme()
//                    taskDetlService.updateById();
//                    // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
//                    taskService.completeWrkMast();
//                    taskDetlService.
                    } break;
                    case APPLY_IN_STATION:
                    case APPLY_OFF_STATION:
                    case ARRIVE_OFF_STATION: {
                    case "APPLY_IN_STATION":
                    case "APPLY_OFF_STATION":
                    case "ARRIVE_OFF_STATION": {
                        TransParent apply = new TransParent();
                        apply.setTaskno(robotTaskCode);
                        apply.setTaskname(memo.getString("taskName"));
@@ -338,21 +379,19 @@
                        String transType = memo.getString("TransType");
                        apply.setTransType(transType);
                        apply.setProductLineId(memo.getString("ProductLineId"));
                        if(transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                            apply.setStationId(task.getSourceStaNo());
                        } else {
                            apply.setStationId(task.getStaNo());
                        }
                        if (RcsRetMethodEnum.APPLY_IN_STATION.getCode().equals(method)) {
                        apply.setStationId(task.getSourceStaNo());
                        //agv入站申请
                        if ("APPLY_IN_STATION".equals(method)) {
                            mesService.applyInStation(apply);
                        } else if (RcsRetMethodEnum.APPLY_OFF_STATION.getCode().equals(method)) {
                            //agv离站请求
                        } else if ("APPLY_OFF_STATION".equals(method)) {
                            mesService.applyOutStation(apply);
                        } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                            //agv离站完成
                        } else {
                            mesService.outStation(apply);
                        }
                    } break;
                    case ARRIVE_ON_STATION: {
                    case "ARRIVE_ON_STATION": {
                        // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断
                        if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
                            break;
@@ -389,67 +428,155 @@
                    } break;
                    default: {} break;
                }
            } else if ("CTU".equals(carrierType)) { //CTU
                EntityWrapper<WrkMast> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                WrkMast task = wrkMastService.selectOne(wrapper);
                if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                    rcsReturn.setCode("Err_RobotCodeNotMatch");
                    rcsReturn.setMessage("");
                    JSONObject data = new JSONObject();
                    data.put("robotTaskCode", robotTaskCode);
                    rcsReturn.setData(data);
                    return rcsReturn;
                }
//                JSONObject memo = JSONObject.parseObject(task.getMemo());
                switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                    case TASK_START: {
//                        task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
//                        task.setModiTime(new Date());
//                        task.setModiUser(defaultUserId);
//                        taskService.updateById(task);
                    } break;
//                    case TASK_OUT_BIN: {} break;
                    case TASK_END: {
                        // 更新任务状态等内部逻辑
                        long wrkSts = task.getWrkSts(); // 1.入库;101.出库;
                        if (task.getIoType() == 1) {
                            wrkSts = 4L;
                        } else if (task.getIoType() == 101) {
                            wrkSts = 14L;
                        }
                        task.setWrkSts(wrkSts); // 4.入库完成;14.已出库未确认;
                        task.setModiTime(new Date());
                        task.setModiUser(defaultUserId);
                        wrkMastService.updateById(task);
                        // TODO:任务完成触发出入库变更操作
//                        // 入库完成
//                        mesService.inFeedback(memo.getString("OrderNo"));
//                        // 出库完成
//                        mesService.outFeedback(memo.getString("OrderNo"));
                    } break;
                    default: {} break;
                }
            }
            // 返回RCS
            rcsReturn.setCode("SUCCESS");
            rcsReturn.setMessage("");
            JSONObject data = new JSONObject();
            data.put("robotTaskCode", robotTaskCode);
            rcsReturn.setData(data);
        } catch (Exception e) {
            log.error("RCS反馈任务进度处理异常 - {}", rcsReporterTask, e);
            rcsReturn.setCode("Err_Internal");
            rcsReturn.setMessage("内部处理异常");
            JSONObject data = new JSONObject();
            data.put("robotTaskCode", robotTaskCode);
            rcsReturn.setData(data);
            //海康AGV状态反馈,及申请
        }else {
            JSONObject values = rcsReporterTask.getExtra().getJSONObject("values");
            // start : 任务开始;outbin : 走出储位;end : 任务完成
            String method = values.getString("method");
            String carrierType = values.getString("carrierType");
            String slotCategory = values.getString("slotCategory");
            String slotCode = values.getString("slotCode");
            try {
                // q3,q8=1
                if ("1".equals(carrierType)) {    //AGV
                    EntityWrapper<Task> wrapper = new EntityWrapper<>();
                    wrapper.eq("task_no", robotTaskCode);
                    Task task = taskService.selectOne(wrapper);
                    if (task == null || !task.getTaskNo().equals(robotTaskCode)) {
                        rcsReturn.setCode("Err_RobotCodeNotMatch");
                        rcsReturn.setMessage("");
                        JSONObject data = new JSONObject();
                        data.put("robotTaskCode", robotTaskCode);
                        rcsReturn.setData(data);
                        return rcsReturn;
                    }
                    JSONObject memo = JSONObject.parseObject(task.getMemo());
                    switch (Objects.requireNonNull(RcsRetMethodEnum.getEnum(method))) {
                        case TASK_START: {
                            task.setWrkSts(302L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            task.setModiUser(defaultUserId);
                            taskService.updateById(task);
                        }
                        break;
                        case TASK_OUT_BIN: {
                            // TODO:立库出库一托,AGV开始运输后,给MES发送出库完成(一托发一次)
//                        JSONObject taskMemo = JSONObject.parseObject(task.getMemo());
//                        mesService.outFeedbackByTuo(taskMemo.getString("OrderNo"), task);
                        }
                        break;
                        case TASK_END: {
                            // 更新任务状态等内部逻辑
                            task.setWrkSts(304L);   // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
                            task.setModiTime(new Date());
                            task.setModiUser(defaultUserId);
                            taskService.updateById(task);
                            // 任务完成
//                        mesService.reporterTask(rcsReporterTask);
//                    EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
//                    wapper2.eq("wrk_no", task.getWrkNo())
//                            .eq("matnr", memo.getString("ItemNo"))
//                            .eq("order_no", memo.getString("OrderNo"));
//                    TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
//                    taskDetl.setAnfme()
//                    taskDetlService.updateById();
//                    // 301 任务下发、302 任务执行、303 任务中断、304 任务结束
//                    taskService.completeWrkMast();
//                    taskDetlService.
                        }
                        break;
                        case APPLY_IN_STATION:
                        case APPLY_OFF_STATION:
                        case ARRIVE_OFF_STATION: {
                            TransParent apply = new TransParent();
                            apply.setTaskno(robotTaskCode);
                            apply.setTaskname(memo.getString("taskName"));
                            apply.setAgvCode(singleRobotCode);
                            String transType = memo.getString("TransType");
                            apply.setTransType(transType);
                            apply.setProductLineId(memo.getString("ProductLineId"));
                            if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                                apply.setStationId(task.getSourceStaNo());
                            } else {
                                apply.setStationId(task.getStaNo());
                            }
                            if (RcsRetMethodEnum.APPLY_IN_STATION.getCode().equals(method)) {
                                mesService.applyInStation(apply);
                            } else if (RcsRetMethodEnum.APPLY_OFF_STATION.getCode().equals(method)) {
                                mesService.applyOutStation(apply);
                            } else if (RcsRetMethodEnum.ARRIVE_OFF_STATION.getCode().equals(method)) {
                                mesService.outStation(apply);
                            }
                        }
                        break;
                        case ARRIVE_ON_STATION: {
                            // TODO: 如果产线是运输起点,则不发送到站完成,暂时调试使用lG,未实现判断
                            if (rcsReporterTask.getCurrentSeq() == 0 && task.getSourceStaNo().startsWith("LG")) {
                                break;
                            }
                            EntityWrapper<TaskDetl> wapper2 = new EntityWrapper<>();
                            wapper2.eq("wrk_no", task.getWrkNo())
                                    .eq("matnr", memo.getString("Itemno"))
                                    .eq("order_no", memo.getString("OrderNo"));
                            TaskDetl taskDetl = taskDetlService.selectOne(wapper2);
                            TransArrivalStation arrivalStation = new TransArrivalStation();
                            arrivalStation.setTaskno(robotTaskCode);
                            arrivalStation.setTaskname(memo.getString("taskName"));
                            arrivalStation.setTuoPanId(taskDetl.getZpallet());  // memo.getString("TuoPanId")
                            arrivalStation.setProductLineId(memo.getString("ProductLineId"));
                            String transType = memo.getString("TransType");
                            arrivalStation.setDaotype(transType);
                            if (transType.equals("02") || transType.equals("04") || transType.equals("06")) {
                                arrivalStation.setStationID(task.getSourceStaNo());
                            } else {
                                arrivalStation.setStationID(task.getStaNo());
                            }
                            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);
                            mesService.arriveOnStation(arrivalStation);
                        }
                        break;
                        default: {
                        }
                        break;
                    }
                }
                // 返回RCS
                rcsReturn.setCode("SUCCESS");
                rcsReturn.setMessage("");
                JSONObject data = new JSONObject();
                data.put("robotTaskCode", robotTaskCode);
                rcsReturn.setData(data);
            } catch (Exception e) {
                log.error("RCS反馈任务进度处理异常 - {}", rcsReporterTask, e);
                rcsReturn.setCode("Err_Internal");
                rcsReturn.setMessage("内部处理异常");
                JSONObject data = new JSONObject();
                data.put("robotTaskCode", robotTaskCode);
                rcsReturn.setData(data);
            }
        }
        return rcsReturn;
@@ -530,17 +657,53 @@
     * @param apply
     * @return
     */
    public JSONObject hxApplyInLine(TransParent apply) {
    public RcsReturn hxApplyInLine(TransParent apply) {
        String status = mesService.applyInLine(apply);
        JSONObject result = new JSONObject();
        result.put("Success", 1);
        result.put("Message", status);
        JSONObject data = new JSONObject();
        data.put("status", status);
        result.put("Data", data);
        RcsReturn rcsReturn = new RcsReturn();
        return result;
        String robotTaskCode = apply.getTaskno();
        String singleRobotCode = apply.getAgvCode();
        //华晓AGV申请
            if(Cools.isEmpty(apply.getMethod())){
                log.error("华晓AGV上报状态Method为空!");
                rcsReturn.setCode("Err_Internal");
                rcsReturn.setMessage("华晓AGV上报状态Method为空");
                JSONObject data = new JSONObject();
                data.put("robotTaskCode", robotTaskCode);
                rcsReturn.setData(data);
            }else {
                EntityWrapper<Task> wrapper = new EntityWrapper<>();
                wrapper.eq("task_no", robotTaskCode);
                Task task = taskService.selectOne(wrapper);
                String method = apply.getMethod();
                JSONObject memo = Cools.isEmpty(task) ? null : JSONObject.parseObject(task.getMemo());
                switch (method) {
                    case "APPLY_IN_STATION":
                    case "APPLY_OFF_STATION":
                    case "ARRIVE_OFF_STATION": {
                        //agv入站申请
                        if ("APPLY_IN_STATION".equals(method)) {
                            mesService.applyInStation(apply);
                            //agv离站请求
                        } else if ("APPLY_OFF_STATION".equals(method)) {
                            mesService.applyOutStation(apply);
                            //agv离站完成
                        } else {
                            mesService.outStation(apply);
                        }
                    } break;
                    default: {} break;
                }
            }
            // 返回RCS
            rcsReturn.setCode("SUCCESS");
            rcsReturn.setMessage("");
            JSONObject data = new JSONObject();
            data.put("robotTaskCode", robotTaskCode);
            rcsReturn.setData(data);
            //海康AGV状态反馈,及申请
        return rcsReturn;
    }
    // endregion
@@ -563,11 +726,16 @@
            log.info("sendPost - {} - {}", url, param);
            URL realUrl = new URL(url);
            URLConnection conn = realUrl.openConnection();
            conn.setRequestProperty("accept", "*/*");
            conn.setRequestProperty("connection", "Keep-Alive");
            conn.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
            conn.setRequestProperty("Accept-Charset", "utf-8");
            conn.setRequestProperty("Content-Type", "application/json;charset=utf-8");
            conn.setRequestProperty("Content-Type", "application/json");
            conn.setRequestProperty("Content-Length", "<calculated when request is sent>");
            conn.setRequestProperty("Host", "<calculated when request is sent>");
            conn.setRequestProperty("Accept", "*/*");
            conn.setRequestProperty("Accept-Encoding", "gzip, deflate, br");
            conn.setRequestProperty("Connection", "keep-alive");
            conn.setRequestProperty("X-lr-request-id", String.valueOf(new Date().getTime()));
            conn.setRequestProperty("X-lr-version", "4.3");
            conn.setConnectTimeout(5000);
            conn.setReadTimeout(5000);
            conn.setDoOutput(true);
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -397,7 +397,7 @@
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) {
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId,Integer ioPri) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
        for (LocDto locDto : locDtos) {
@@ -420,7 +420,7 @@
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setIoPri(ioPri+0.0); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
@@ -629,7 +629,7 @@
    @Override
    @Transactional
    public WrkMast emptyPlateOut(EmptyPlateOutParam param) {
    public WrkMast emptyPlateOut(EmptyPlateOutParam param,Integer ioPri) {
        WrkMast wrkMast = new WrkMast();
        if (Cools.isEmpty(param.getOutSite())) {
            throw new CoolException("站点不存在");
@@ -659,7 +659,7 @@
            wrkMast.setIoTime(now);
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setIoPri(ioPri+0.0);
            wrkMast.setSourceStaNo(sourceStaNo + ""); // 源站
            wrkMast.setStaNo(param.getOutSite() + ""); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
@@ -1079,7 +1079,7 @@
    @Transactional
    public void cancelWrkMast(String workNo, Long userId) {
        Date now = new Date();
        WrkMast wrkMast = wrkMastService.selectById(workNo);
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", workNo));
        if (Cools.isEmpty(wrkMast)) {
            throw new CoolException(workNo + "工作档不存在");
        }
@@ -1210,6 +1210,9 @@
        boolean wrkMastRes = wrkMastService.deleteById(wrkMast);
        if (wrkMast.getIoType() != 10 && wrkMast.getIoType() != 110) {
            //取消标记,订单完成后反写订单明细时过滤掉danger = 1的数据
            wrkDetlService.updateForSet("danger = 1" ,new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
            // 保存工作明细档历史档
            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
//                throw new CoolException("保存工作明细历史档失败, workNo = " + wrkMast.getWrkNo());
src/main/java/com/zy/asrs/task/AGVTaskReportScheduler.java
New file
@@ -0,0 +1,124 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.TaskService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.AGVTaskReportHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
@Component
public class AGVTaskReportScheduler {
    private static final Logger log = LoggerFactory.getLogger(WorkMastScheduler.class);
    @Autowired
    private TaskService taskService;
    @Autowired
    private AGVTaskReportHandler AGVTaskReportHandler;
    @Value("${hik.switch}")
    private Boolean switchErpReportOld;
    @Autowired
    private WrkMastService wrkMastService;
    /**
     * 满板和空板出库任务,出到输送线后创建AGV搬运任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void createAGVTask(){
        if (!switchErpReportOld){
            return;
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 300));
        if (wrkMasts.isEmpty()){
            return;
        }
        for (WrkMast wrkMast : wrkMasts){
            //查询是否有源站和目标站有一样的agv搬运任务
            //如果有则跳过本次agv搬运任务下发
            Task task1 = taskService.selectOne(new EntityWrapper<Task>()
                    .in("source_sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo())
                    .in("sta_no", wrkMast.getSourceStaNo(), wrkMast.getMemo()));
            if (Cools.isEmpty(task1)) {
            //生成AGV搬运出库任务
            // 保存工作档
            Task task = new Task();
            Date date = new Date();
            String TaskNo = wrkMast.getWrkNo()+"-"+date.getTime();
            task.setWrkNo(wrkMast.getWrkNo())
                    .setTaskNo(TaskNo)
                    .setIoTime(date)
                    .setWrkSts(301L) // 工作状态:301.任务下发
                    .setIoType(3) // 入出库状态: 3.站到站
                    .setTaskType("agv")
                    .setIoPri(10D)
                    .setFullPlt("Y") // 满板:Y
                    .setPicking("N") // 拣料
                    .setExitMk("N")// 退出
                    .setStaNo(wrkMast.getMemo())
                    .setSourceStaNo(wrkMast.getSourceStaNo())//空料架缓存区E1
                    .setEmptyMk("N")// 空板
                    .setBarcode(wrkMast.getBarcode())// 托盘码
                    .setLinkMis("N")
                    .setAppeUser(9945L)
                    .setAppeTime(date)
                    .setModiUser(9945L)
                    .setModiTime(date);
            if (!taskService.insert(task)) {
                throw new CoolException("保存工作档失败");
            }else {
                wrkMast.setWrkSts(31L);//31.AGV搬运任务创建成功
                wrkMast.setModiTime(date);
                wrkMastService.updateById(wrkMast);
            }
            }
        }
    }
    /**
     * AGV 任务下发接口,定时给AGV下发任务
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
        if (!switchErpReportOld){
            return;
        }
        //查询所有agv待下发任务
        List<Task> wrkSts = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 301));
        if (wrkSts!=null&& !wrkSts.isEmpty()){
            for (Task task:wrkSts){
                //查询是否有正在作业的源站和目标站有一样的agv搬运任务
                //如果有则跳过本次agv搬运任务下发
                Task task1 = taskService.selectOne(new EntityWrapper<Task>()
                        .eq("wrk_sts", 302)
                        .andNew()
                        .in("source_sta_no", task.getSourceStaNo(), task.getStaNo())
                        .in("sta_no", task.getStaNo(), task.getSourceStaNo()));
                if (Cools.isEmpty(task1)) {
                    //AGV任务下发
                    ReturnT<String> start = AGVTaskReportHandler.start(task);
                    if (!start.isSuccess()){
                        task.setUpdMk("X");
                        task.setErrorMemo(start.getMsg());
                        task.setModiTime(new Date());
                        if (!taskService.updateById(task)) {
                            log.error("工作档[workNo={}]标记待处理失败", task.getWrkNo());
                        }
                    }
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java
@@ -40,67 +40,67 @@
    @Autowired
    private AutoMoveService autoMoveService;
    //定时出库   经典双伸
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLocAutoLocMove(){
        if (slaveWmsParameterProperties.isAutoLocMoveBoolean()){
            Config config = configService.selectConfigByCode("AutoLocMove");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            OrderPakout orderPakout = orderPakoutService.selectOrderMoveStatus();
            if (!Cools.isEmpty(orderPakout)){
//                autoMoveService.selectList()
            }else {
                orderPakout = orderPakoutService.selectOrderMoveStatusInitial();
                if (Cools.isEmpty(orderPakout)){
                    return;
                }
                orderPakout.setMoveStatus(2);
                orderPakoutService.updateById(orderPakout);
            }
        }
    }
    //定时出库
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLoc11(){
        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
            Config config = configService.selectConfigByCode("AutoLocMoveUnilateral");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
            for (int crnNo = 1;crnNo < crnCount;crnNo++){
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
                if (Cools.isEmpty(wrkMast) && Cools.isEmpty(wrkMast1)){
                    autoLocMoveHandler.start(crnNo,11);
                }
            }
        }
    }
    //定时入库
    @Scheduled(cron = "0/3 * * * * ? ")
    public void locToLoc111() {
        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
            Config config = configService.selectConfigByCode("AutoLocMoveUnilateral");
            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
                return;
            }
            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
            for (int crnNo = 1;crnNo < crnCount;crnNo++){
                BasCrnp basCrnp = basCrnpService.selectById(crnNo);
                if (basCrnp == null) {
                    continue;
                }
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
                if (Cools.isEmpty(wrkMast)  && Cools.isEmpty(wrkMast1)){
                    autoLocMoveHandler.start(crnNo,111);
                }
            }
        }
    }
//    //定时出库   经典双伸
//    @Scheduled(cron = "0/3 * * * * ? ")
//    public void locToLocAutoLocMove(){
//        if (slaveWmsParameterProperties.isAutoLocMoveBoolean()){
//            Config config = configService.selectConfigByCode("AutoLocMove");
//            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
//                return;
//            }
//            OrderPakout orderPakout = orderPakoutService.selectOrderMoveStatus();
//            if (!Cools.isEmpty(orderPakout)){
////                autoMoveService.selectList()
//            }else {
//                orderPakout = orderPakoutService.selectOrderMoveStatusInitial();
//                if (Cools.isEmpty(orderPakout)){
//                    return;
//                }
//                orderPakout.setMoveStatus(2);
//                orderPakoutService.updateById(orderPakout);
//            }
//        }
//    }
//
//    //定时出库
//    @Scheduled(cron = "0/3 * * * * ? ")
//    public void locToLoc11(){
//        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
//            Config config = configService.selectConfigByCode("AutoLocMoveUnilateral");
//            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
//                return;
//            }
//            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
//            for (int crnNo = 1;crnNo < crnCount;crnNo++){
//                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
//                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
//                if (Cools.isEmpty(wrkMast) && Cools.isEmpty(wrkMast1)){
//                    autoLocMoveHandler.start(crnNo,11);
//                }
//            }
//        }
//    }
//
//    //定时入库
//    @Scheduled(cron = "0/3 * * * * ? ")
//    public void locToLoc111() {
//        if (slaveWmsParameterProperties.isAutoLocMoveUnilateralBoolean()){
//            Config config = configService.selectConfigByCode("AutoLocMoveUnilateral");
//            if (Cools.isEmpty(config) || config.getValue().equals("false")) {
//                return;
//            }
//            int crnCount = basCrnpService.selectCount(new EntityWrapper<>());
//            for (int crnNo = 1;crnNo < crnCount;crnNo++){
//                BasCrnp basCrnp = basCrnpService.selectById(crnNo);
//                if (basCrnp == null) {
//                    continue;
//                }
//                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 111).eq("crn_no", crnNo));
//                WrkMast wrkMast1 = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("io_type", 11).eq("crn_no", crnNo));
//                if (Cools.isEmpty(wrkMast)  && Cools.isEmpty(wrkMast1)){
//                    autoLocMoveHandler.start(crnNo,111);
//                }
//            }
//        }
//    }
}
src/main/java/com/zy/asrs/task/BareBoardScheduler.java
@@ -25,18 +25,18 @@
    @Autowired
    private SlaveWmsParameterProperties slaveWmsParameterProperties;
    /*
    * 自动调空板出库
    * */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
        if (slaveWmsParameterProperties.isAutomaticFillingBoardStaNosBoolean()){
            Config config = configService.selectConfigByCode("AutomaticFillingBoard");
            if (!Cools.isEmpty(config) && !Cools.isEmpty(config.getValue()) && config.getValue().equals("true")){
                for (Integer staNo : slaveWmsParameterProperties.getAutomaticFillingBoardStaNos()){
                    bareBoardHandler.start(110,staNo,"D");
                }
            }
        }
    }
//    /*
//    * 自动调空板出库
//    * */
//    @Scheduled(cron = "0/3 * * * * ? ")
//    private void execute(){
//        if (slaveWmsParameterProperties.isAutomaticFillingBoardStaNosBoolean()){
//            Config config = configService.selectConfigByCode("AutomaticFillingBoard");
//            if (!Cools.isEmpty(config) && !Cools.isEmpty(config.getValue()) && config.getValue().equals("true")){
//                for (Integer staNo : slaveWmsParameterProperties.getAutomaticFillingBoardStaNos()){
//                    bareBoardHandler.start(110,staNo,"D");
//                }
//            }
//        }
//    }
}
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;
@@ -49,6 +47,8 @@
    @Resource
    private OrderDetlPakinService orderDetlPakinService;
    @Resource
    private OrderDetlPakoutService orderDetlPakoutService;
    @Value("${mes.url}")
    public String MES_URL;
@@ -130,7 +130,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",4).orderBy("update_time"));
                    .eq("doc_type",1).orderBy("update_time"));
            if (orderPakin == null) {
                return;
            }
@@ -160,7 +160,7 @@
            mesRecvFeedback.setOperuser(dbMemo.getString("operuser"));
            mesRecvFeedback.setItemdata(list);
            String url = MES_URL + "MaterialReceiptAndReturn";
            String url = MES_URL + "ActualInventoryFeedback";
            String response = RcsServiceImpl.sendPost(url, JSONObject.toJSONString(mesRecvFeedback));
            if (!StringUtils.isEmpty(response) && response.contains("Success")) {
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
@@ -173,32 +173,71 @@
        }
    }
    // 其他入库单上报
    // 配盘入库单上报
    @Scheduled(cron = "0/30 * * * * ? ")
    @Async("orderThreadPool")
    void otherInOrderCompleteReport() {
        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"));
                    .ne("doc_type", 1).orderBy("update_time"));
            if (orderPakin == null) {
                return;
            }
            List<OrderDetlPakin> orderDetlPakins = orderDetlPakinService.selectByOrderId(orderPakin.getId());
            for (OrderDetlPakin orderDetl : orderDetlPakins) {
                MesInApply result = JSONObject.parseObject(orderPakin.getMemo(), MesInApply.class);
                result.setQty(orderDetl.getQty().intValue());
                MesOutApply result = JSONObject.parseObject(orderPakin.getMemo(), MesOutApply.class);
                for(MesOutApply.MesOutApplyItem mes:result.getItemdata()){
                    if (orderDetl.getMatnr().equals(mes.getItemno())){
                        mes.setWmsBarcode(orderDetl.getBarcode());
                        mes.setRackNumber(orderDetl.getSku());
                    }
                }
//                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/30 * * * * ? ")
    @Async("orderThreadPool")
    void otherOutOrderCompleteReport() {
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            OrderPakout orderPakout = orderPakoutService.selectOne(new EntityWrapper<OrderPakout>().eq("settle", 4).orderBy("update_time"));
            if (orderPakout == null) {
                return;
            }
            List<OrderDetlPakout> orderDetlPakouts = orderDetlPakoutService.selectByOrderId(orderPakout.getId());
            for (OrderDetlPakout orderDetl : orderDetlPakouts) {
                MesOutApply result = JSONObject.parseObject(orderPakout.getMemo(), MesOutApply.class);
                for(MesOutApply.MesOutApplyItem mes:result.getItemdata()){
                    if (orderDetl.getMatnr().equals(mes.getItemno())){
                        mes.setWmsBarcode(orderDetl.getBarcode());
                        mes.setRackNumber(orderDetl.getSku());
                    }
                }
                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())) {
                        orderPakout.setSettle(6L);
                        orderPakoutService.updateById(orderPakout);
                        log.info("订单上报成功,orderNo={}", orderPakout.getOrderNo());
                    }
                }
            }
        }
    }
src/main/java/com/zy/asrs/task/WorkLogScheduler.java
@@ -1,6 +1,8 @@
package com.zy.asrs.task;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.TaskService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.WorkLogHandler;
@@ -22,6 +24,8 @@
    private WorkLogHandler workLogHandler;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private TaskService taskService;
    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute(){
@@ -37,4 +41,18 @@
        }
    }
    @Scheduled(cron = "0/3 * * * * ? ")
    private void AGVexecute(){
        List<Task> tasks = taskService.selectToBeCompleteData();
        if (tasks.isEmpty()) {
            return;
        }
        for (Task task : tasks) {
            ReturnT<String> result = workLogHandler.AGVstart(task);
            if (!result.isSuccess()) {
                log.error("工作档[workNo={}]历史档处理失败", task.getTaskNo());
            }
        }
    }
}
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -1,5 +1,6 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.MesService;
@@ -54,9 +55,12 @@
        }
    }
    /**
     * AGV 304任务完成,有和WMS关联任务,对关联任务做对应处理,任务状态从304--》305;没有关联任务,任务状态从304--》305
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    private void executeTask(){
        List<Task> wrkMasts = taskService.selectToBeCompleteData();
        List<Task> wrkMasts = taskService.selectList(new EntityWrapper<Task>().eq("wrk_sts", 304));
        if (wrkMasts.isEmpty()) {
            return;
        }
src/main/java/com/zy/asrs/task/handler/AGVTaskReportHandler.java
New file
@@ -0,0 +1,66 @@
package com.zy.asrs.task.handler;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.entity.rcs.RcsTaskSubmit;
import com.zy.asrs.entity.rcs.RcsTaskTargetRoute;
import com.zy.asrs.service.RcsService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
@Transactional
public class AGVTaskReportHandler extends AbstractHandler<String> {
    @Resource
    private RcsService rcsService;
    public ReturnT<String> start(Task task) {
        String SourceStaNoType = "SITE";
        String TargetStaNoType = "SITE";
        //给agv下发的任务类型,默认站到站
        //任务类型 4.站到区域
        if(task.getIoType()==4){
            TargetStaNoType = "ZONE";
            //任务类型 5.区域到站
        }else if(task.getIoType()==5){
            SourceStaNoType = "ZONE";
        }
        // 下发给RCS
        RcsTaskSubmit rcsTaskSubmit = new RcsTaskSubmit();
        rcsTaskSubmit.setRobotTaskCode(task.getTaskNo());
        rcsTaskSubmit.setInitPriority(10);  //默认10
        List<RcsTaskTargetRoute> targetRouteList = new ArrayList<>();
        RcsTaskTargetRoute startRoute = new RcsTaskTargetRoute();
        startRoute.setSeq(0);
        startRoute.setType(SourceStaNoType);
        startRoute.setCode(task.getSourceStaNo());
        startRoute.setOperation("COLLECT");
        targetRouteList.add(startRoute);
        RcsTaskTargetRoute endRoute = new RcsTaskTargetRoute();
        endRoute.setSeq(1);
        endRoute.setType(TargetStaNoType);
        endRoute.setCode(task.getStaNo());
        endRoute.setOperation("DELIVERY");
        targetRouteList.add(endRoute);
        rcsTaskSubmit.setTargetRoute(targetRouteList);
        // 转发给海康或华晓RCS
        int success = rcsService.submitTask(rcsTaskSubmit, task.getPltType());
        if (success == 0){
            return FAIL;
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -2,10 +2,13 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WaitPakin;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.OrderPakinServiceImpl;
import com.zy.asrs.service.impl.OrderPakoutServiceImpl;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.OrderInAndOutUtil;
@@ -39,6 +42,14 @@
    private WaitPakinLogService waitPakinLogService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private TaskLogService taskLogService;
    @Autowired
    private OrderPakoutServiceImpl orderPakoutService;
    @Autowired
    private OrderPakinServiceImpl orderPakinService;
    @Transactional
    public ReturnT<String> start(WrkMast wrkMast) {
@@ -50,12 +61,19 @@
                while (iterator.hasNext()) {
                    WrkDetl wrkDetl = iterator.next();
                    if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
//                        orderService.checkComplete(wrkDetl.getOrderNo());
                        if (wrkMast.getIoType() ==  1 || wrkMast.getIoType() == 8 ||  wrkMast.getIoType() == 54 ||  wrkMast.getIoType() == 104){
                            OrderInAndOutUtil.checkComplete(Boolean.TRUE,wrkDetl.getOrderNo());
                        } else {
                            OrderInAndOutUtil.checkComplete(Boolean.FALSE,wrkDetl.getOrderNo());
                        //出库单
                        if(wrkMast.getIoType()>100){
                            orderPakoutService.checkComplete(wrkDetl.getOrderNo());
                            //入库单
                        }else {
                            orderPakinService.checkComplete(wrkDetl.getOrderNo());
                        }
//                        if (wrkMast.getIoType() ==  1 || wrkMast.getIoType() == 8 ||  wrkMast.getIoType() == 54 ||  wrkMast.getIoType() == 104){
//                            OrderInAndOutUtil.checkComplete(Boolean.TRUE,wrkDetl.getOrderNo());
//                        } else {
//                            OrderInAndOutUtil.checkComplete(Boolean.FALSE,wrkDetl.getOrderNo());
//                        }
                        iterator.remove();
                    }
                }
@@ -125,4 +143,17 @@
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> AGVstart(Task task) {
        // 保存工作主档历史档
        if (!taskLogService.save(task.getWrkNo())) {
            exceptionHandle("保存工作历史档[workNo={0}]失败", task.getWrkNo());
        }
        // 删除工作主档
        if (!taskService.deleteById(task.getId())) {
            exceptionHandle("删除工作主档[workNo={0}]失败",task.getWrkNo());
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -1,20 +1,21 @@
package com.zy.asrs.task.handler;
import com.alibaba.excel.util.StringUtils;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.mes.MesReturn;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.BasStationServiceImpl;
import com.zy.asrs.service.impl.LocCacheServiceImpl;
import com.zy.asrs.service.impl.OrderPakinServiceImpl;
import com.zy.asrs.service.impl.TaskDetlServiceImpl;
import com.zy.asrs.service.impl.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
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;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
@@ -56,6 +57,8 @@
    private TaskDetlService taskDetlService;
    @Autowired
    private BasStationServiceImpl basStationService;
    @Value("${mes.url}")
    private String url;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
@@ -568,8 +571,13 @@
                default:
                    break;
            }
            // 修改工作主档状态
            wrkMast.setWrkSts(15L);
            if(!Cools.isEmpty(wrkMast.getMemo())){
                // 修改工作主档状态
                wrkMast.setWrkSts(30L);//30.等待创建AGV搬运任务
            }else {
                // 修改工作主档状态
                wrkMast.setWrkSts(15L);
            }
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
//                exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
@@ -593,12 +601,40 @@
     */
    @Transactional(rollbackFor = Exception.class)
    public ReturnT<String> AgvStart(Task task) {
        // 4.入库完成
        if (task.getWrkSts() == 4) {
            return agvDoIn(task);
            // 14.出库完成
        } else if (task.getWrkSts() == 14) {
            return agvDoOut(task);
        //查询是否有关联的WrkMast任务
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", task.getWrkNo()));
        if (wrkMast != null) {
            if (wrkMast.getIoType()==110){
                wrkMast.setWrkSts(32L);//32.等待组托
            }else if (wrkMast.getIoType()==101){
                wrkMast.setWrkSts(15L);//15.出库更新完成
            }
            wrkMast.setModiTime(new Date());
            wrkMastService.updateById(wrkMast);
            task.setWrkSts(305L);//任务状态从304--》305
            task.setModiTime(new Date());
            taskService.updateById(task);
            //对转序搬运完成的任务结果反馈给mes
        }else if(task.getTaskType().equals("ZX-AGV")){
            HashMap<String,Object> map = new HashMap<>();
            map.put("taskno", task.getTaskNo());
            String mesUrl = url+"AGVArrivalCompletedFit";
            String response = RcsServiceImpl.sendPost(mesUrl, JSONObject.toJSONString(map));
            if (!StringUtils.isEmpty(response) && response.contains("Success")){
                MesReturn mesReturn = JSONObject.parseObject(response, MesReturn.class);
                if("1".equals(mesReturn.getSuccess())) {
                    task.setWrkSts(305L);//任务状态从304--》305
                    task.setModiTime(new Date());
                    taskService.updateById(task);
                }else {
                    return new ReturnT<>(500, mesReturn.getMessage());
                }
            }
        }else {
            task.setWrkSts(305L);//任务状态从304--》305
            task.setModiTime(new Date());
            taskService.updateById(task);
        }
        return SUCCESS;
    }
src/main/java/com/zy/common/model/LocTypeDto.java
@@ -14,7 +14,7 @@
public class LocTypeDto {
    // 高低类型{0:未知,1:低库位,2:高库位}
    private Short locType1;
    private Short locType1=1;
    // 宽窄类型{0:未知,1:窄库位,2:宽库位}
    private Short locType2;
@@ -30,9 +30,9 @@
            throw new CoolException("plc高低检测异常");
        }
        if (basDevp.getLocType2() == 1) {
            this.locType2 = 1; // 低库位
            this.locType1 = 1; // 低库位
        } else {
            this.locType2 = 2; // 高库位
            this.locType1 = 2; // 高库位
        }
        log.info(JSON.toJSONString(this));
    }
src/main/java/com/zy/common/service/CommonService.java
@@ -158,11 +158,11 @@
    @Transactional
    public StartupDto getLocNoNew(Integer staDescId,Integer sourceStaNo, LocTypeDto locTypeDto) {
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable", "Y"));
        if(basCrnps.size() == 0) {
            log.error("入库请求库位失败:堆垛机报警/无可用/无可入");
            throw new CoolException("入库请求库位失败:堆垛机报警/无可用/无可入");
        }
//        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<BasCrnp>().eq("crn_sts", 3).eq("crn_err", 0).eq("in_enable", "Y"));
//        if(basCrnps.size() == 0) {
//            log.error("入库请求库位失败:堆垛机报警/无可用/无可入");
//            throw new CoolException("入库请求库位失败:堆垛机报警/无可用/无可入");
//        }
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", staDescId).eq("stn_no", sourceStaNo).eq("crn_no", 1));
        if (staDesc == null) {
@@ -170,11 +170,11 @@
            throw new CoolException("入库请求库位失败:路径不存在" + staDescId +"," + sourceStaNo);
        }
        Short locType2 = locTypeDto.getLocType2();
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("loc_type2", locType2).orderBy("lev1").orderBy("bay1").orderBy("row1"));
        Short locType1 = 1;
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_sts", "O").eq("loc_type1", locType1).orderBy("lev1").orderBy("bay1").orderBy("row1"));
        if (locMast == null) {
            log.error("入库请求库位失败:无库位" + locType2);
            throw new CoolException("入库请求库位失败:无库位" + locType2);
            log.error("入库请求库位失败:无库位" + locType1);
            throw new CoolException("入库请求库位失败:无库位" + locType1);
        }
        StartupDto startupDto = new StartupDto();
src/main/java/com/zy/common/web/AuthController.java
@@ -14,10 +14,8 @@
import com.zy.common.properties.SystemProperties;
import com.zy.common.utils.RandomValidateCodeUtil;
import com.zy.system.entity.*;
import com.zy.system.entity.license.LicenseVerify;
import com.zy.system.service.*;
import com.zy.system.timer.LicenseTimer;
import com.zy.system.timer.LoadingConfigTimer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.transaction.annotation.Transactional;
@@ -50,42 +48,37 @@
    private RolePermissionService rolePermissionService;
    @Autowired
    private LicenseTimer licenseTimer;
    @Autowired
    private LoadingConfigTimer loadingConfigTimer;
    @PostMapping("/login.action")
    @RequestMapping("/login.action")
    @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "登录")
    public R loginAction(@RequestBody Map<String, String> param) {
    public R loginAction(String username, String password){
        //验证许可证是否有效
        if (!licenseTimer.getSystemSupport()) {
        if (!licenseTimer.getSystemSupport()){
            return R.parse(CodeRes.SYSTEM_20001);
        }
        if (username.equals("super") && password.equals(Cools.md5(superPwd))) {
            Map<String, Object> res = new HashMap<>();
            res.put("username", username);
            res.put("token", Cools.enToken(System.currentTimeMillis() + username, superPwd));
            return R.ok(res);
        }
        EntityWrapper<User> userWrapper = new EntityWrapper<>();
        userWrapper.eq("username", param.get("username"));
        userWrapper.eq("username", username);
        User user = userService.selectOne(userWrapper);
        if (Cools.isEmpty(user)) {
            if (param.get("username").equals("super") && param.get("password").equals(Cools.md5(superPwd))) {
                Map<String, Object> res = new HashMap<>();
                res.put("username", param.get("username"));
                res.put("token", Cools.enToken(System.currentTimeMillis() + param.get("username"), superPwd));
                return R.ok(res);
            }
        if (Cools.isEmpty(user)){
            return R.parse(CodeRes.USER_10001);
        }
        if (user.getStatus() != 1) {
        if (user.getStatus()!=1){
            return R.parse(CodeRes.USER_10002);
        }
        if (!user.getPassword().equals(param.get("password"))) {
        if (!user.getPassword().equals(password)){
            return R.parse(CodeRes.USER_10003);
        }
        String token = Cools.enToken(System.currentTimeMillis() + param.get("username"), user.getPassword());
        if (loadingConfigTimer.getTokenNumber() == 1) {
            userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()).eq("system", "WMS"));
        }        UserLogin userLogin = new UserLogin();
        String token = Cools.enToken(System.currentTimeMillis() + username, user.getPassword());
        userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()));
        UserLogin userLogin = new UserLogin();
        userLogin.setUserId(user.getId());
        userLogin.setToken(token);
        userLogin.setCreateTime(new Date());
        userLogin.setSystem("WMS");
        userLoginService.insert(userLogin);
        Map<String, Object> res = new HashMap<>();
        res.put("username", user.getUsername());
@@ -109,7 +102,7 @@
        int time = 0;
        while (time < 3000) {
            code = RandomValidateCodeUtil.code.get(sd);
            if (!Cools.isEmpty(code)) {
            if (!Cools.isEmpty(code)){
                break;
            } else {
                Thread.sleep(10);
@@ -122,13 +115,13 @@
    @RequestMapping("/user/detail/auth")
    @ManagerAuth
    public R userDetail() {
    public R userDetail(){
        return R.ok(userService.selectById(getUserId()));
    }
    @RequestMapping("/menu/auth")
    @ManagerAuth
    public R menu() {
    public R menu(){
        // 获取所有一级菜单
        List<Resource> oneLevel;
        User user = null;
@@ -147,7 +140,7 @@
            List<RoleResource> roleResources = roleResourceService.selectList(new EntityWrapper<RoleResource>().eq("role_id", user.getRoleId()));
            List<Long> resourceIds = new ArrayList<>();
            roleResources.forEach(roleResource -> resourceIds.add(roleResource.getResourceId()));
            if (resourceIds.isEmpty()) {
            if (resourceIds.isEmpty()){
                return R.ok();
            }
            resourceWrapper = new EntityWrapper<Resource>().in("id", resourceIds).eq("level", 2).eq("status", 1).orderBy("sort");
@@ -165,11 +158,11 @@
                    // 是否拥有查看权限
                    if (getUserId() != 9527) {
                        Resource view = resourceService.selectOne(new EntityWrapper<Resource>().eq("resource_id", resource.getId()).like("code", "#view"));
                        if (!Cools.isEmpty(view)) {
                        if (!Cools.isEmpty(view)){
                            RoleResource param = new RoleResource();
                            param.setResourceId(view.getId());
                            param.setRoleId(user.getRoleId());
                            if (null == roleResourceService.selectOne(new EntityWrapper<>(param))) {
                            if (null == roleResourceService.selectOne(new EntityWrapper<>(param))){
                                continue;
                            }
                        }
@@ -194,11 +187,11 @@
    @RequestMapping("/power/list/auth")
    @ManagerAuth
    public R powerList() {
    public R powerList(){
        List<Resource> oneLevels = resourceService.selectList(new EntityWrapper<Resource>().eq("level", 1).eq("status", 1).orderBy("sort"));
        List<Map> result = new ArrayList<>();
        // 一级
        for (Resource oneLevel : oneLevels) {
        for (Resource oneLevel : oneLevels){
            List<Map> twoLevelsList = new ArrayList<>();
            Map<String, Object> oneLevelMap = new HashMap<>();
            oneLevelMap.put("title", oneLevel.getName());
@@ -207,7 +200,7 @@
            oneLevelMap.put("children", twoLevelsList);
            List<Resource> twoLevels = resourceService.selectList(new EntityWrapper<Resource>().eq("resource_id", oneLevel.getId()).eq("level", 2).eq("status", 1).orderBy("sort"));
            // 二级
            for (Resource twoLevel : twoLevels) {
            for (Resource twoLevel : twoLevels){
                Map<String, Object> twoLevelMap = new HashMap<>();
                twoLevelMap.put("title", twoLevel.getName());
                twoLevelMap.put("id", twoLevel.getId());
@@ -217,7 +210,7 @@
                twoLevelMap.put("children", threeLevelsList);
                // 三级
                List<Resource> threeLevels = resourceService.selectList(new EntityWrapper<Resource>().eq("resource_id", twoLevel.getId()).eq("level", 3).eq("status", 1).orderBy("sort"));
                for (Resource threeLevel : threeLevels) {
                for (Resource threeLevel : threeLevels){
                    Map<String, Object> threeLevelMap = new HashMap<>();
                    threeLevelMap.put("title", threeLevel.getName());
                    threeLevelMap.put("id", threeLevel.getId());
@@ -256,19 +249,19 @@
        List<Object> result = new ArrayList<>();
        // 菜单
        List<RoleResource> roleResources = roleResourceService.selectList(new EntityWrapper<RoleResource>().eq("role_id", roleId));
        for (RoleResource roleResource : roleResources) {
        for (RoleResource roleResource : roleResources){
            Resource resource = resourceService.selectById(roleResource.getResourceId());
            if (!Cools.isEmpty(resource)) {
                if (resource.getLevel() == 3) {
            if (!Cools.isEmpty(resource)){
                if (resource.getLevel() == 3){
                    result.add(resource.getId());
                }
            }
        }
        // 功能
        List<RolePermission> rolePermissions = rolePermissionService.selectList(new EntityWrapper<RolePermission>().eq("role_id", roleId));
        for (RolePermission rolePermission : rolePermissions) {
        for (RolePermission rolePermission : rolePermissions){
            Permission permission = permissionService.selectById(rolePermission.getPermissionId());
            if (!Cools.isEmpty(permission)) {
            if (!Cools.isEmpty(permission)){
                result.add(permission.getAction());
            }
        }
@@ -278,12 +271,12 @@
    @RequestMapping("/power/auth")
    @ManagerAuth(memo = "授权")
    @Transactional
    public R power(Long roleId, String powers) {
    public R power(Long roleId, String powers){
        Role role = roleService.selectById(roleId);
        Long leaderId = role.getLeader();
        roleResourceService.delete(new EntityWrapper<RoleResource>().eq("role_id", roleId));
        rolePermissionService.delete(new EntityWrapper<RolePermission>().eq("role_id", roleId));
        if (!Cools.isEmpty(powers)) {
        if (!Cools.isEmpty(powers)){
            List<PowerDto> dtos = JSON.parseArray(powers, PowerDto.class);
            for (PowerDto dto : dtos) {
                Resource resource = resourceService.selectOne(new EntityWrapper<Resource>().eq("id", dto.getTwo()).eq("level", 2));
@@ -301,14 +294,14 @@
                    roleResourceService.insert(roleResource);
                } else {
                    Permission permission = permissionService.selectOne(new EntityWrapper<Permission>().eq("action", dto.getTwo()));
                    if (!Cools.isEmpty(permission)) {
                    if (!Cools.isEmpty(permission)){
                        RolePermission rolePermission = new RolePermission();
                        rolePermission.setRoleId(roleId);
                        rolePermission.setPermissionId(permission.getId());
                        rolePermissionService.insert(rolePermission);
                    }
                }
                for (String three : dto.getThree()) {
                for (String three : dto.getThree()){
                    Resource resource1 = resourceService.selectOne(new EntityWrapper<Resource>().eq("id", three).eq("level", 3));
                    if (!Cools.isEmpty(resource1)) {
                        // 校验上级权限
@@ -344,48 +337,48 @@
        return R.ok(resources);
    }
//    @GetMapping(value = "/system/activation/auth")
//    public R activation() {
//        if (SystemProperties.SYSTEM_ACTIVATION) {
//            String activationCode = SystemProperties.getActivationCode(OSinfo.getOSname().getActivationCodePath());
//            String timeStr = AesUtils.decrypt(activationCode, SystemProperties.SALT);
//            if (null == timeStr) {
//                SystemProperties.SYSTEM_ACTIVATION = Boolean.FALSE;
//                return R.error();
//            }
//            Date exprTime = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss);
//            if (new Date().getTime() < exprTime.getTime()) {
//                return R.ok().add(DateUtils.convert(exprTime));
//            } else {
//                SystemProperties.SYSTEM_ACTIVATION = Boolean.FALSE;
//                return R.error();
//            }
//        } else {
//            return R.error();
//        }
//    }
//
//    @PostMapping(value = "/system/secret/auth")
//    @ManagerAuth
//    public R systemSecret(@RequestParam(value = "secret") String secret) {
//        if (Cools.isEmpty(secret)) {
//            return R.error("请输入激活码");
//        }
//        // 验证激活码
//        String timeStr = AesUtils.decrypt(secret, SystemProperties.SALT);
//        if (null == timeStr) {
//            return R.error("激活码错误");
//        }
//        Date exprTime = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss);
//        if (new Date().getTime() >= exprTime.getTime()) {
//            return R.error("激活码已失效");
//        }
//        boolean result = SystemProperties.saveActivationCode(OSinfo.getOSname().getActivationCodePath(), secret);
//        if (!result) {
//            return R.error("激活失败");
//        }
//        SystemProperties.SYSTEM_ACTIVATION = Boolean.TRUE;
//        return R.ok("激活成功,有效期至" + DateUtils.convert(exprTime));
//    }
    @GetMapping(value = "/system/activation/auth")
    public R activation() {
        if (SystemProperties.SYSTEM_ACTIVATION) {
            String activationCode = SystemProperties.getActivationCode(OSinfo.getOSname().getActivationCodePath());
            String timeStr = AesUtils.decrypt(activationCode, SystemProperties.SALT);
            if (null == timeStr) {
                SystemProperties.SYSTEM_ACTIVATION = Boolean.FALSE;
                return R.error();
            }
            Date exprTime = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss);
            if (new Date().getTime() < exprTime.getTime()) {
                return R.ok().add(DateUtils.convert(exprTime));
            } else {
                SystemProperties.SYSTEM_ACTIVATION = Boolean.FALSE;
                return R.error();
            }
        } else {
            return R.error();
        }
    }
    @PostMapping(value = "/system/secret/auth")
    @ManagerAuth
    public R systemSecret(@RequestParam(value = "secret") String secret) {
        if (Cools.isEmpty(secret)) {
            return R.error("请输入激活码");
        }
        // 验证激活码
        String timeStr = AesUtils.decrypt(secret, SystemProperties.SALT);
        if (null == timeStr) {
            return R.error("激活码错误");
        }
        Date exprTime = DateUtils.convert(timeStr, DateUtils.yyyyMMddHHmmss);
        if (new Date().getTime() >= exprTime.getTime()) {
            return R.error("激活码已失效");
        }
        boolean result = SystemProperties.saveActivationCode(OSinfo.getOSname().getActivationCodePath(), secret);
        if (!result) {
            return R.error("激活失败");
        }
        SystemProperties.SYSTEM_ACTIVATION = Boolean.TRUE;
        return R.ok("激活成功,有效期至"+DateUtils.convert(exprTime));
    }
}
src/main/java/com/zy/common/web/WcsController.java
@@ -12,6 +12,7 @@
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
@@ -50,6 +51,8 @@
    private RowLastnoService rowLastnoService;
    @Autowired
    private WorkService workService;
    @Autowired
    private TaskService taskService;
    // TODO:称重、拍照上报存储,CTU料箱运转
@@ -87,9 +90,9 @@
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType2(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
//        sourceStaNo.setLocType2(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto();
        StartupDto dto = null;
        switch (param.getIoType()) {
@@ -153,7 +156,7 @@
        EmptyPlateOutParam emptyPlateOutParam = new EmptyPlateOutParam();
        emptyPlateOutParam.setOutSite(12);
        emptyPlateOutParam.setLocNos(new ArrayList<String>(){{add(locMast.getLocNo()+"");}});
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam);
        WrkMast wrkMast = workService.emptyPlateOut(emptyPlateOutParam,50);
        return R.ok(!Cools.isEmpty(wrkMast)? R.ok("自动空托出库成功,工作号:" + wrkMast.getWrkNo()) : R.error("生成自动空托出库失败"));
    }
@@ -163,7 +166,7 @@
    @Transactional
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
//        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
@@ -190,7 +193,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        wrkMast.setCtnType(1); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
@@ -221,11 +224,11 @@
            throw new CoolException("更新通知档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)){
            throw new CoolException("更新源站失败");
        }
//        sourceStaNo.setWrkNo(workNo);
//        sourceStaNo.setModiTime(now);
//        if (!basDevpService.updateById(sourceStaNo)){
//            throw new CoolException("更新源站失败");
//        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")){
@@ -294,4 +297,48 @@
        return dto;
    }
    @PostMapping("/createAGVMoveTask")
    @ResponseBody
    public synchronized R createAGVMoveTask(@RequestBody WrkMast wrkMast){
        if (Cools.isEmpty(wrkMast)){
            return R.error("出库时创建AGV搬运空料架任务不能为空");
        }
        //查看是否有相关的AGV搬运任务存在
        List<Task> tasks = taskService.selectList(new EntityWrapper<Task>()
                .in("sta_no", wrkMast.getStaNo(),wrkMast.getMemo())
                .or()
                .in("source_sta_no", wrkMast.getStaNo(),wrkMast.getMemo()));
        if (!tasks.isEmpty()){
            return R.error("有对堆垛机接驳站点的AGV搬运任务,暂时无法生成AGV搬运任务");
        }
        //生成AGV搬运空料架任务
        // 保存工作档
        Task task = new Task();
        Date date = new Date();
        String TaskNo = wrkMast.getWrkNo()+"-"+date.getTime();
        task.setWrkNo(wrkMast.getWrkNo())
                .setTaskNo(TaskNo)
                .setIoTime(date)
                .setWrkSts(301L) // 工作状态:301.任务下发
                .setIoType(5) // 入出库状态: 5.区域到站
                .setTaskType("agv")
                .setIoPri(10D)
                .setFullPlt("N") // 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setStaNo(wrkMast.getStaNo())
                .setSourceStaNo("E1")//空料架缓存区E1
                .setEmptyMk("Y")// 空板
                .setBarcode("")// 托盘码
                .setLinkMis("N")
                .setAppeUser(9945L)
                .setAppeTime(date)
                .setModiUser(9945L)
                .setModiTime(date);
        if (!taskService.insert(task)) {
            throw new CoolException("保存工作档失败");
        }
        return R.ok();
    }
}
src/main/resources/application-dev.yml
@@ -1,5 +1,5 @@
server:
  port: 8089
  port: 8083
  servlet:
    context-path: /@pom.build.finalName@
@@ -12,7 +12,7 @@
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    username: sa
    password: sa@123
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jgwms
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=jnejc-ljqwms
#    username: sa
#    password: Skyouc#23
#    url: jdbc:sqlserver://192.168.4.24:1433;databasename=jsxswms
@@ -43,14 +43,14 @@
    path: /stock/out/@pom.build.finalName@/logs
super:
  pwd: asrs2023
  pwd: xltys1995
swagger:
  enable: false
#License相关配置
license:
  subject: integrationasrs
  subject: jnejc-ljqasrs
  publicAlias: publicCert
  storePass: public_zhongyang_123456789
  licensePath: license.lic
@@ -131,15 +131,24 @@
#mes对接
mes:
  url: http://172.26.11.250/dev-api/basicmodel/Api/WMS/
  url: http://172.26.160.5:80/dev-api/basicmodel/WmsFit/Api/
  #默认接口操作人员id
  defaultUserId: 30
#海康对接
hik:
  url: http://127.0.0.1:8089/hik/
  switch: false
  url: http://172.26.11.98:80/
#华晓对接
hx:
  url: http://127.0.0.1:8089/hx/
  url: http://172.26.3.131:8300/api/robot/
  #转序任务下发
  taskNo: controller/task/submit
  #入站允许
  inOk: eqpt/notify/product
  #离站允许
  #离站完成
src/main/resources/mapper/LocDetlMapper.xml
@@ -125,65 +125,65 @@
            <when test="batch != null and batch != ''">
                and a.batch = #{batch}
            </when>
            <otherwise>
                and (a.batch IS NULL OR a.batch = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.batch IS NULL OR a.batch = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="brand != null and brand != ''">
                and a.brand = #{brand}
            </when>
            <otherwise>
                and (a.brand IS NULL OR a.brand = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.brand IS NULL OR a.brand = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="standby1 != null and standby1 != ''">
                and a.standby1 = #{standby1}
            </when>
            <otherwise>
                and (a.standby1 IS NULL OR a.standby1 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.standby1 IS NULL OR a.standby1 = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="standby2 != null and standby2 != ''">
                and a.standby2 = #{standby2}
            </when>
            <otherwise>
                and (a.standby2 IS NULL OR a.standby2 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.standby2 IS NULL OR a.standby2 = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="standby3 != null and standby3 != ''">
                and a.standby3 = #{standby3}
            </when>
            <otherwise>
                and (a.standby3 IS NULL OR a.standby3 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.standby3 IS NULL OR a.standby3 = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="boxType1 != null and boxType1 != ''">
                and a.box_type1 = #{boxType1}
            </when>
            <otherwise>
                and (a.box_type1 IS NULL OR a.box_type1 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.box_type1 IS NULL OR a.box_type1 = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="boxType2 != null and boxType2 != ''">
                and a.box_type2 = #{boxType2}
            </when>
            <otherwise>
                and (a.box_type2 IS NULL OR a.box_type2 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.box_type2 IS NULL OR a.box_type2 = '')-->
<!--            </otherwise>-->
        </choose>
        <choose>
            <when test="boxType3 != null and boxType3 != ''">
                and a.box_type3 = #{boxType3}
            </when>
            <otherwise>
                and (a.box_type3 IS NULL OR a.box_type3 = '')
            </otherwise>
<!--            <otherwise>-->
<!--                and (a.box_type3 IS NULL OR a.box_type3 = '')-->
<!--            </otherwise>-->
        </choose>
    </sql>
    <sql id="batchSeqNew">
@@ -545,12 +545,12 @@
        <include refid="batchSeqA"></include>
        <if test="locNos != null and locNos.size > 0">
            and b.loc_no not in
            <foreach item="item" collection="locNos" index="index"  separator="," open="(" close=")">
                #{item}
            </foreach>
        </if>
<!--        <if test="locNos != null and locNos.size > 0">-->
<!--            and b.loc_no not in-->
<!--            <foreach item="item" collection="locNos" index="index"  separator="," open="(" close=")">-->
<!--                #{item}-->
<!--            </foreach>-->
<!--        </if>-->
        order by
        DATEPART(yyyy,a.modi_time),DATEPART(mm,a.modi_time),DATEPART(dd,a.modi_time), a.anfme
src/main/resources/mapper/TaskMapper.xml
@@ -9,7 +9,7 @@
    </resultMap>
    <select id="selectToBeCompleteData" resultType="com.zy.asrs.entity.Task">
        select * from agv_task where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
        select * from agv_task where wrk_sts = 305 order by upd_mk,error_time,io_time,wrk_no
    </select>
</mapper>
src/main/resources/mapper/WrkDetlMapper.xml
@@ -88,9 +88,9 @@
    </update>
    <select id="selectAndLogByOrderNo" resultMap="BaseResultMap">
        select * from asr_wrk_detl where order_no = #{orderNo}
        select * from asr_wrk_detl where order_no = #{orderNo} and danger != 1
        union
        select * from asr_wrk_detl_log where order_no = #{orderNo}
        select * from asr_wrk_detl_log where order_no = #{orderNo} and danger != 1
    </select>
    <update id="updateInspect">
src/main/webapp/static/js/common.js
@@ -1,4 +1,4 @@
var baseUrl = "/jgwms";
var baseUrl = "/ljqwms";
// 详情窗口-高度
var detailHeight = '80%';
src/main/webapp/views/login.html
@@ -134,12 +134,14 @@
        }
        let params = {username: username, password: hex_md5(password)}
        $.ajax({
            url: baseUrl + "/login.action",
            headers: {'Content-Type': 'application/json'},
            data: JSON.stringify(params),
            url: baseUrl+"/login.action",
            data: {
                username: username,
                password: hex_md5(password)
            },
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {
                if (res.code === 200){
                    localStorage.setItem("token", res.data.token);
                    localStorage.setItem("username", res.data.username);
                    window.location.href = "index.html";
@@ -149,9 +151,6 @@
                    layer.tips(res.msg, '#username', {tips: [4, '#ff0000']});
                } else if (res.code === 10003) {
                    layer.tips(res.msg, '#password', {tips: [4, '#ff0000']});
                } else if (res.code == 20001) {
                    layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
                    $("#updateLicense").show()
                } else {
                    layer.tips(res.msg, '.login-btn', {tips: [3, '#ff0000']});
                }