#
zwl
2025-06-08 91eca979b480dff62809368a5c6563c9e0fcc851
#
28个文件已修改
2个文件已添加
1999 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 241 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/TaskWrkController.java 197 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/BasShuttle.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskWrk.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/CarryParam.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/GetShuttleStatusParam.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/StorageEscalationParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/TaskWrkService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java 671 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 73 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java 88 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 310 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AssignTasksRCSScheduler.java 30 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoReportStartHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/GetshuttlerStatusScheduler.java 94 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/RepositionLED.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/TaskLogScheduler.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/TaskMastScheduler.java 61 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/RedisConfig.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/utils/HttpHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/MainProcess.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/core/thread/SiemensDevpThread.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-prod.yml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/BasShuttleMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/TaskWrkMapper.xml 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wcs/images/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/wms/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -12,6 +12,7 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.BasShuttleServiceImpl;
import com.zy.asrs.utils.Utils;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
@@ -61,155 +62,8 @@
    public static final ArrayList<String> APP_KEY_LIST = new ArrayList<String>() {{
        add("ea1f0459efc02a79f046f982767939ae");
    }};
    //agv任务完成
    @PostMapping("/toAgvTaskOver")
    @AppAuth(memo = "agv任务完成接口")
    public R getAgvTaskOver(@RequestHeader String appkey,
                           @RequestBody TaskOverParam param,
                           HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getWharfCode())){
            return R.error("码头[wharfCode]不能为空");
        }
        if (Cools.isEmpty(param.getStatus())){
            return R.error("完成标记[status]不能为空");
        }
        openService.getAgvTaskOver(param);
        return R.ok();
    }
    //创建任务
    @PostMapping("/taskCreate")
    @Transactional
    public R taskCreate(@RequestHeader String appkey,
                          @RequestBody List<TaskCreateParam> param1,
                          HttpServletRequest request) {
        auth(appkey, param1, request);
        try{
            List<TaskCreateParam> paramList = new ArrayList<>();
            List<String> locNoList = new ArrayList<>();
            for (TaskCreateParam param : param1) {
                if (Cools.isEmpty(param)) {
                    return R.parse(BaseRes.PARAM);
                }
                if (Cools.isEmpty(param.getTaskNo())) {
                    return R.error("任务号[taskNo]不能为空");
                }
                if (Cools.isEmpty(param.getIoType())) {
                    return R.error("任务类型[ioType]不能为空");
                }
                if (Cools.isEmpty(param.getBarcode())) {
                    return R.error("条码[barcode]不能为空");
                }
                String locNo=null;
                if(param.getIoType()==1){
                    locNo=param.getTargetPoint();
                }else{
                    locNo=param.getStartPoint();
                }
                try{
                    LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>()
                            .eq("loc_no", locNo).ne("loc_sts","X"));
                    if (Cools.isEmpty(locMast)){
                        log.error("库位号不存在"+locNo);
                        return R.error("库位号不存在"+locNo).add("库位号不存在"+locNo);
                    }
                }catch (Exception e){
                    log.error("库位号检测程序异常==》异常信息"+e);
                    return R.error("库位号检测程序异常").add("库位号检测程序异常==》异常信息"+e);
                }
                LocMast locMast=locMastService.selectOne(new EntityWrapper<LocMast>()
                        .eq("loc_sts","F")
                        .eq("loc_no",locNo)
                        .eq("barcode",param.getBarcode()));
                if(Cools.isEmpty(locMast)){
                    return R.error("该库位不满足出库条件"+param.getTargetPoint());
                }
                if (!locNoList.contains(locMast.getLocNo())){
                    locNoList.add(locMast.getLocNo());
                    paramList.add(param);
                }else {
                    return R.error("该库位不能同时下发两笔任务"+locMast.getLocNo());
                }
            }
            for (TaskCreateParam param : paramList){
                openService.taskCreate(param);
            }
        }catch (Exception e){
            log.error("任务下发异常"+e);
            return R.error();
        }
        return R.ok();
    }
    //查询任务详情
    @GetMapping("/queryTask")
    public R queryTask(@RequestHeader String appkey,
                       @RequestParam String taskNo,
                       HttpServletRequest request) {
        auth(appkey, taskNo, request);
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (taskWrk == null) {
            return R.error("任务不存在");
        }
        return R.ok().add(taskWrk);
    }
    //取放货申请
    @PostMapping("/pick/and/place/v1")
    @AppAuth(memo = "agv取放货申请")
    public R getAgvPickAndPlaceV1(@RequestHeader String appkey,
                            @RequestBody TaskOverParam param,
                            HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getStaNo())){
            return R.error("码头[staNo]不能为空");
        }
        if (Cools.isEmpty(param.getType())){
            return R.error("类型[type]不能为空");
        }
        return openService.getAgvPickAndPlaceV1(param);
    }
    //取放货完成反馈
    @PostMapping("/pick/and/place/v2")
    @AppAuth(memo = "agv取放货完成反馈")
    public R getAgvPickAndPlaceV2(@RequestHeader String appkey,
                                  @RequestBody TaskOverParam param,
                                  HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getStaNo())){
            return R.error("码头[staNo]不能为空");
        }
        if (Cools.isEmpty(param.getType())){
            return R.error("类型[type]不能为空");
        }
        return openService.getAgvPickAndPlaceV2(param);
    }
    //查询任务指令集合
    @GetMapping("/queryTaskCommand")
    public R queryTaskCommand(@RequestHeader String appkey,
                              @RequestParam String taskNo,
                              HttpServletRequest request) {
        auth(appkey, taskNo, request);
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (taskWrk == null) {
            return R.error("任务不存在");
        }
        List<CommandInfo> commandInfos = commandInfoService.selectByTaskNo(taskNo);
        return R.ok().add(commandInfos);
    }
    @Autowired
    private BasShuttleServiceImpl basShuttleService;
    private void auth(String appkey, Object obj, HttpServletRequest request) {
        log.info("{}接口被访问;appkey:{};请求数据:{}", request.getServletPath(), appkey, JSON.toJSONString(obj));
@@ -224,12 +78,11 @@
    //任务下发接口
    @PostMapping("/outboundTaskSend")
    @Transactional
//    @Transactional
    public HashMap<String, Object> outboundTaskSend(@RequestBody HashMap<String,Object> hashMap) {
        String jsonString = JSON.toJSONString(hashMap.get("TaskList"));
        List<CarryParam> params= JSONObject.parseArray(jsonString,CarryParam.class);
        HashMap<String, Object> map = new HashMap<>();
        List<WMSAndAGVInterfaceParam> params1 =new ArrayList<>();
        for (CarryParam param:params){
            if (Cools.isEmpty(param)){
                map.put("Code","0");
@@ -245,8 +98,8 @@
                return map;
            }
            String fusion = Utils.Fusion(param.getOriginalRowNo(), param.getOriginalFloorNo(), param.getOriginalColumnNo());
            param.setStartPoint(fusion);
            LocMast locMast = locMastService.selectByLocNo(param.getStartPoint());
            param.setOriginStartPoint(fusion);
            LocMast locMast = locMastService.selectByLocNo(fusion);
            if(Cools.isEmpty(locMast)){
                map.put("Code","0");
                map.put("Msg","初始库位无法找到!");
@@ -259,14 +112,13 @@
                //出库任务创建
                StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                        .eq("type_no",2)
                        .eq("crn_no",locMast.getCrnNo())
                        .eq("stn_no",param.getTerminalNo()));
                if(Cools.isEmpty(staDesc)){
                    map.put("Code","0");
                    map.put("Msg","出库路劲不存在!");
                    return map;
                }
                r = openService.taskCreate(new TaskCreateParam(param,staDesc.getCrnNo()));
                r = openService.taskCreate(param);
                if(r.get("Code").equals("0")){
                    return r;
                }
@@ -274,7 +126,7 @@
                String fusion1 = Utils.Fusion(param.getGoalRowNo(), param.getGoalFloorNo(), param.getGoalColumnNo());
                param.setTerminalNo(fusion1);
                //移库任务创建
                r = openService.taskCreate(new TaskCreateParam(param,locMast.getCrnNo()));
                r = openService.taskCreate(param);
                if(r.get("Code").equals("0")){
                    return r;
                }
@@ -352,22 +204,12 @@
    @GetMapping("/deviceStatus")
    @Transactional
    public R deviceStatus() {
        List<CrnStatusParam> crnStatusParams=new ArrayList<>();
        List<BasCrnp> basCrnps = basCrnpService.selectList(new EntityWrapper<>());
        for (BasCrnp basCrnp:basCrnps){
            CrnStatusParam crnStatusParam=new CrnStatusParam();
            crnStatusParam.setCrnNo(basCrnp.getCrnNo());
            crnStatusParam.setCrnSts(basCrnp.getCrnSts());
            crnStatusParam.setErrorCode(basCrnp.getCrnErr());
            BasCrnError error=basCrnErrorService.selectOne(new EntityWrapper<BasCrnError>().eq("error_code",basCrnp.getCrnErr()));
            if(Cools.isEmpty(error)){
                crnStatusParam.setErrorMsg("");
            }else {
                crnStatusParam.setErrorMsg(error.getErrName());
            }
            crnStatusParams.add(crnStatusParam);
        }
        return R.ok(crnStatusParams);
        HashMap<String,Object> map = new HashMap<>();
        List<BasShuttle> basShuttle = basShuttleService.selectList(null);
        List<BasDevp> basDevp = basDevpService.selectList(null);
        map.put("basShuttle",basShuttle);
        map.put("basDevp",basDevp);
        return R.ok(map);
    }
    //设备状态查询接口
@@ -381,50 +223,19 @@
        return "ok";
    }
    public static <T> List<T> convertListMapToListObject(List<HashMap<String, Object>> listMap, Class<T> clazz) throws Exception {
        List<T> list = new ArrayList<>();
        for (Map<String, Object> map : listMap) {
            T obj = clazz.getDeclaredConstructor().newInstance();
            for (Map.Entry<String, Object> entry : map.entrySet()) {
                String key = entry.getKey();
                Object value = entry.getValue();
                try {
                    Field field = clazz.getDeclaredField(key);
                    field.setAccessible(true);
                    setFieldValue(obj, field, value);
                } catch (NoSuchFieldException e) {
                    System.out.println("No such field: " + key + " in class " + clazz.getName());
                }
            }
            list.add(obj);
    //rcs和wcs校验入库工作号是否一致
    //设备状态查询接口
    @PostMapping("/devpdeviceStatusTaskNo")
    @Transactional
    public String devpDeviceStatusTaskNo(@RequestBody HashMap staNo) {
        BasDevp basDevp=basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("dev_no",staNo.get("staNo")));
        String taskNo=staNo.get("superTaskNo").toString();
        if(Cools.isEmpty(basDevp)&&Cools.isEmpty(taskNo)){
            return "no";
        }else if(!basDevp.getWrkNo().equals(Integer.valueOf(taskNo))){
            return "no";
        }
        return list;
    }
    private static void setFieldValue(Object obj, Field field, Object value) throws IllegalAccessException {
        Class<?> fieldType = field.getType();
        if (fieldType.isAssignableFrom(value.getClass())) {
            field.set(obj, value);
        } else if (fieldType == int.class || fieldType == Integer.class) {
            field.set(obj, ((Number) value).intValue());
        } else if (fieldType == long.class || fieldType == Long.class) {
            field.set(obj, ((Number) value).longValue());
        } else if (fieldType == double.class || fieldType == Double.class) {
            field.set(obj, ((Number) value).doubleValue());
        } else if (fieldType == float.class || fieldType == Float.class) {
            field.set(obj, ((Number) value).floatValue());
        } else if (fieldType == boolean.class || fieldType == Boolean.class) {
            field.set(obj, (Boolean) value);
        } else if (fieldType == String.class) {
            field.set(obj, String.valueOf(value));
        } else {
            System.out.println("Unsupported field type: " + fieldType.getName());
        }
        return "ok";
    }
}
src/main/java/com/zy/asrs/controller/TaskWrkController.java
@@ -61,22 +61,24 @@
    @RequestMapping(value = "/taskWrk/list/auth")
    @ManagerAuth
    public R list(@RequestParam(defaultValue = "1")Integer curr,
                  @RequestParam(defaultValue = "10")Integer limit,
                  @RequestParam(required = false)String orderByField,
                  @RequestParam(required = false)String orderByType,
                  @RequestParam Map<String, Object> param){
    public R list(@RequestParam(defaultValue = "1") Integer curr,
                  @RequestParam(defaultValue = "10") Integer limit,
                  @RequestParam(required = false) String orderByField,
                  @RequestParam(required = false) String orderByType,
                  @RequestParam Map<String, Object> param) {
        EntityWrapper<TaskWrk> wrapper = new EntityWrapper<>();
        excludeTrash(param);
        convert(param, wrapper);
        if (!Cools.isEmpty(orderByField)){wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));}
        if (!Cools.isEmpty(orderByField)) {
            wrapper.orderBy(humpToLine(orderByField), "asc".equals(orderByType));
        }
        return R.ok(taskWrkService.selectPage(new Page<>(curr, limit), wrapper));
    }
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper){
        for (Map.Entry<String, Object> entry : map.entrySet()){
    private <T> void convert(Map<String, Object> map, EntityWrapper<T> wrapper) {
        for (Map.Entry<String, Object> entry : map.entrySet()) {
            String val = String.valueOf(entry.getValue());
            if (val.contains(RANGE_TIME_LINK)){
            if (val.contains(RANGE_TIME_LINK)) {
                String[] dates = val.split(RANGE_TIME_LINK);
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
@@ -93,9 +95,9 @@
        return R.ok();
    }
    @RequestMapping(value = "/taskWrk/update/auth")
    @ManagerAuth
    public R update(TaskWrk taskWrk){
    @RequestMapping(value = "/taskWrk/update/auth")
    @ManagerAuth
    public R update(TaskWrk taskWrk) {
        if (Cools.isEmpty(taskWrk) || null == taskWrk.getTaskNo()) {
            return R.error();
        }
@@ -105,7 +107,7 @@
    @RequestMapping(value = "/taskWrk/updatePoint/auth")
    @ManagerAuth
    public R updatePoint(TaskWrk taskWrk){
    public R updatePoint(TaskWrk taskWrk) {
        if (Cools.isEmpty(taskWrk) || null == taskWrk.getTaskNo()) {
            return R.error();
        }
@@ -123,8 +125,8 @@
    @RequestMapping(value = "/taskWrk/delete/auth")
    @ManagerAuth
    public R delete(@RequestParam(value="ids[]") Long[] ids){
         for (Long id : ids){
    public R delete(@RequestParam(value = "ids[]") Long[] ids) {
        for (Long id : ids) {
            taskWrkService.deleteById(id);
        }
        return R.ok();
@@ -132,7 +134,7 @@
    @RequestMapping(value = "/taskWrk/export/auth")
    @ManagerAuth
    public R export(@RequestBody JSONObject param){
    public R export(@RequestBody JSONObject param) {
        EntityWrapper<TaskWrk> wrapper = new EntityWrapper<>();
        List<String> fields = JSONObject.parseArray(param.getJSONArray("fields").toJSONString(), String.class);
        Map<String, Object> map = excludeTrash(param.getJSONObject("taskWrk"));
@@ -148,7 +150,7 @@
        wrapper.like("id", condition);
        Page<TaskWrk> page = taskWrkService.selectPage(new Page<>(0, 10), wrapper);
        List<Map<String, Object>> result = new ArrayList<>();
        for (TaskWrk taskWrk : page.getRecords()){
        for (TaskWrk taskWrk : page.getRecords()) {
            Map<String, Object> map = new HashMap<>();
            map.put("id", taskWrk.getTaskNo());
            map.put("value", taskWrk.getTaskNo());
@@ -161,7 +163,7 @@
    @ManagerAuth
    public R query(@RequestBody JSONObject param) {
        Wrapper<TaskWrk> wrapper = new EntityWrapper<TaskWrk>().eq(humpToLine(String.valueOf(param.get("key"))), param.get("val"));
        if (null != taskWrkService.selectOne(wrapper)){
        if (null != taskWrkService.selectOne(wrapper)) {
            return R.parse(BaseRes.REPEAT).add(getComment(TaskWrk.class, String.valueOf(param.get("key"))));
        }
        return R.ok();
@@ -178,72 +180,44 @@
    @ManagerAuth(memo = "手动完成任务")
    public R complete(@RequestParam String taskNo) {
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (Cools.isEmpty(taskWrk) || taskWrk.getStatus()>=3){
            return R.error("已完结或已取消") ;
        if (Cools.isEmpty(taskWrk) || taskWrk.getStatus() >= 3) {
            return R.error("已完结或已取消");
        }
        LocMast locMast=new LocMast();
        if(taskWrk.getIoType()==1){//入库任务完成库位为F
            locMast=locMastService.selectByLocNo(taskWrk.getTargetPoint());
            if(Cools.isEmpty(locMast)){
              R.error("没有找到该库位") ;
        LocMast locMast = new LocMast();
        if (taskWrk.getIoType() == 1) {//入库任务完成库位为F
            locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
            if (Cools.isEmpty(locMast)) {
                R.error("没有找到该库位");
            }
            locMast.setLocSts("F");
            locMast.setModiTime(new Date());
            locMast.setBarcode(taskWrk.getBarcode());
        }else if(taskWrk.getIoType()==2){//出库任务完成库位为O
            locMast=locMastService.selectByLocNo(taskWrk.getStartPoint());
            if(Cools.isEmpty(locMast)){
                R.error("没有找到该库位") ;
        } else if (taskWrk.getIoType() == 2) {//出库任务完成库位为O
            locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
            if (Cools.isEmpty(locMast)) {
                R.error("没有找到该库位");
            }
            locMast.setLocSts("O");
            locMast.setModiTime(new Date());
        }else if(taskWrk.getIoType()==3){
            locMast=locMastService.selectByLocNo(taskWrk.getStartPoint());
            if(Cools.isEmpty(locMast)){
                R.error("没有找到该库位") ;
        } else if (taskWrk.getIoType() == 3) {
            locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
            if (Cools.isEmpty(locMast)) {
                R.error("没有找到该库位");
            }
            locMast.setLocSts("O");
            locMast.setModiTime(new Date());
            locMastService.updateById(locMast);
            locMast=locMastService.selectByLocNo(taskWrk.getTargetPoint());
            if(Cools.isEmpty(locMast)){
                R.error("没有找到该库位") ;
            locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());
            if (Cools.isEmpty(locMast)) {
                R.error("没有找到该库位");
            }
            locMast.setLocSts("F");
            locMast.setModiTime(new Date());
            locMast.setBarcode(taskWrk.getBarcode());
        }
        String response="";
        try{
            HashMap<String, Object> headParam = new HashMap<>();
            headParam.put("TaskNo",taskWrk.getTaskNo());
            headParam.put("Result",1);
//            headParam.put("reportTime",new Date());
            log.info("wcs手动完成任务上报wms={}", taskWrk);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(wmsUrl)
                    .setPath(TaskExecCallback)
                    .setJson(JSON.toJSONString(headParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            apiLogService.save("wcs手动完成任务上报wms"
                    ,wmsUrl+TaskExecCallback
                    ,null
                    ,"127.0.0.1"
                    ,JSON.toJSONString(headParam)
                    ,response
                    ,true
            );
        }catch (Exception e){
            log.error("wcs手动完成任务上报wms失{},返回值={}", taskWrk,response);
//            throw new CoolException(e);
        }
        locMastService.updateById(locMast);
        taskWrk.setStatus(7);//手动完成任务
        taskWrk.setStatus(6);//手动完成任务
        taskWrk.setModiTime(new Date());
        taskWrkService.updateById(taskWrk);
        return R.ok();
@@ -253,20 +227,20 @@
    @ManagerAuth(memo = "重新给堆垛机下发任务")
    public R returnWorkingCondition(@RequestParam String taskNo) {
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);
        if (!Cools.isEmpty(taskWrk) && taskWrk.getWrkSts()==12){
        if (!Cools.isEmpty(taskWrk) && taskWrk.getWrkSts() == 12) {
            taskWrk.setWrkSts(11);
            if(!taskWrkService.updateById(taskWrk)){
            if (!taskWrkService.updateById(taskWrk)) {
                return R.error("更新任务状态失败");
            }
            return R.ok();
        } else if (!Cools.isEmpty(taskWrk) && taskWrk.getWrkSts()==3) {
        } else if (!Cools.isEmpty(taskWrk) && taskWrk.getWrkSts() == 3) {
            taskWrk.setWrkSts(2);
            taskWrkService.updateById(taskWrk);
            if(!taskWrkService.updateById(taskWrk)){
            if (!taskWrkService.updateById(taskWrk)) {
                return R.error("更新任务状态失败");
            }
            return R.ok();
        }else{
        } else {
            return R.error("任务状态不对无法重新给堆垛机下发任务");
        }
@@ -285,39 +259,12 @@
        Date now = new Date();
        taskWrk.setStatus(TaskStatusType.CANCEL.id);
        taskWrk.setModiTime(now);//操作时间
        try{
        try {
            taskWrk.setModiUser(getUserId());//操作员
        }catch (Exception e){
        } catch (Exception e) {
            taskWrk.setModiUser(9999L);//操作员
        }
        String response="";
        try{
            HashMap<String, Object> headParam = new HashMap<>();
            headParam.put("TaskNo",taskWrk.getTaskNo());
            headParam.put("Result",0);
//            headParam.put("reportTime",new Date());
            log.info("wcs手动取消任务上报wm={}", taskWrk);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(wmsUrl)
                    .setPath(TaskExecCallback)
                    .setJson(JSON.toJSONString(headParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            apiLogService.save("wcs手动取消任务上报wms"
                    ,wmsUrl+TaskExecCallback
                    ,null
                    ,"127.0.0.1"
                    ,JSON.toJSONString(headParam)
                    ,response
                    ,true
            );
        }catch (Exception e){
            log.error("wcs手动取消任务上报wms失败={},返回值={}", taskWrk,response);
//            throw new CoolException(e);
        }
        taskWrk.setStatus(4);//手动取消
        taskWrk.setCompleteTime(now);//完结时间
        taskWrkService.updateById(taskWrk);
        return R.ok();
@@ -338,8 +285,8 @@
        return R.ok();
    }
    public static String getTaskType(Integer paramIoType){
        switch (paramIoType){
    public static String getTaskType(Integer paramIoType) {
        switch (paramIoType) {
            case 1:
                return "RK";
            case 2:
@@ -354,32 +301,40 @@
    @PostMapping(value = "/taskWrk/state")
//    @ManagerAuth(memo = "接收RCS任务状态")
    public R taskWrkState(@RequestBody NotifyDto notifyDto) {
        R r = R.ok();
        log.info("接收RCS任务状态={}", notifyDto);
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(notifyDto.getSuperTaskNo());//wms任务号
        if (taskWrk == null) {
            return R.error("没有找到该任务={"+notifyDto+"}");
            return R.error("没有找到该任务={" + notifyDto + "}");
        }
        Date now = new Date();
        if(notifyDto.getMsgType().equals("task_complete")){
        /**
         * 任务完成
         */
        switch (notifyDto.getMsgType()) {
            case "task_complete":
                r = taskWrkService.taskComplete(taskWrk);
                break;
        }
        if(notifyDto.getMsgType().equals("task_complete")&&taskWrk.getIoType()==3){
            taskWrk.setWrkSts(7);//更新数据完成,直接转历史档
            //更新源库位状态为空库位
            LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
            locMast.setLocSts("O");
            locMastService.updateById(locMast);
            //更新目标库状态为在库
            LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getTargetPoint());
            locMast2.setLocSts("F");
            locMastService.updateById(locMast2);
            taskWrk.setModiTime(now);//操作时间
            taskWrk.setModiUser(9998L);//操作员
            taskWrkService.updateById(taskWrk);
        }
        return R.ok();
//        if (notifyDto.getMsgType().equals("task_complete") && taskWrk.getIoType() == 3) {//移库
//            taskWrk.setWrkSts(7);//更新数据完成,直接转历史档
//
//            //更新源库位状态为空库位
//            LocMast locMast = locMastService.selectByLocNo(taskWrk.getStartPoint());
//            locMast.setLocSts("O");
//            locMastService.updateById(locMast);
//
//            //更新目标库状态为在库
//            LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getTargetPoint());
//            locMast2.setLocSts("F");
//            locMastService.updateById(locMast2);
//            taskWrk.setModiTime(now);//操作时间
//            taskWrk.setModiUser(9998L);//操作员
//            taskWrkService.updateById(taskWrk);
//        }
        return r;
    }
}
src/main/java/com/zy/asrs/entity/BasShuttle.java
@@ -31,9 +31,9 @@
    private Integer shuttleNo;
    /**
     * 状态 1: 正常  0: 禁用
     * 状态 0: 手动  1: 正常 2.充电中
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 禁用  ")
    @ApiModelProperty(value= "状态 0: 手动  1: 正常 2.充电中  ")
    private Integer status;
    /**
@@ -42,6 +42,20 @@
    @ApiModelProperty(value= "当前小车状态(内部自我维护)")
    @TableField("shuttle_status")
    private Integer shuttleStatus;
    /**
     * 小车所在层
     */
    @ApiModelProperty(value= "小车所在层")
    @TableField("charge_line")
    private Integer chargeLine;
    /**
     * 是否充电状态
     */
    @ApiModelProperty(value= "是否充电状态")
    @TableField("auto_charge")
    private Integer autoCharge;
    /**
     * 任务号
@@ -56,20 +70,6 @@
    @ApiModelProperty(value= "暂存库位")
    @TableField("idle_loc")
    private String idleLoc;
    /**
     * 自动充电
     */
    @ApiModelProperty(value= "自动充电")
    @TableField("auto_charge")
    private Integer autoCharge;
    /**
     * 电量线
     */
    @ApiModelProperty(value= "电量线")
    @TableField("charge_line")
    private Integer chargeLine;
    /**
     * 添加人员
@@ -135,6 +135,13 @@
    @TableField("disable_lev")
    private String disableLev;
    /**
     * 小车异常码
     */
    @ApiModelProperty(value= "小车异常码")
    @TableField("errorCode")
    private Integer errorCode;
    public BasShuttle() {}
    public BasShuttle(Integer shuttleNo, Integer status, Integer shuttleStatus, Integer wrkNo, String idleLoc, Integer autoCharge, Integer chargeLine, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo, Boolean pakMk, String deviceStatus) {
src/main/java/com/zy/asrs/entity/TaskWrk.java
@@ -48,9 +48,9 @@
    private String taskNo;
    /**
     * 任务状态 1: 接收  2: 派发  3: 完结  4: 取消
     * 任务状态 1: 接收  2: 派发 4: 取消任务上报wms 5.取消任务 6: 完结任务上报wms 7.完结
     */
    @ApiModelProperty(value= "任务状态 1: 接收  2: 派发  4: 取消  5: 完结 ")
    @ApiModelProperty(value= "任务状态 1: 接收  2: 派发   4: 取消任务上报wms   5.取消任务   6: 完结任务上报wms   7.完结 ")
    private Integer status;
    /**
@@ -87,14 +87,14 @@
    /**
     * 起点
     */
    @ApiModelProperty(value= "起点")
    @ApiModelProperty(value= "源站点")
    @TableField("start_point")
    private String startPoint;
    /**
     * 终点
     * 目标站点
     */
    @ApiModelProperty(value= "终点")
    @ApiModelProperty(value= "目标站点")
    @TableField("target_point")
    private String targetPoint;
@@ -182,11 +182,11 @@
    @TableField("transfer_mark")
    private Integer transferMark;
    @ApiModelProperty(value = "原始起点")
    @ApiModelProperty(value = "源库位")
    @TableField("origin_start_point")
    private String originStartPoint;
    @ApiModelProperty(value = "原始终点")
    @ApiModelProperty(value = "目标库位")
    @TableField("origin_target_point")
    private String originTargetPoint;
src/main/java/com/zy/asrs/entity/param/CarryParam.java
@@ -16,6 +16,12 @@
    //容器编码
    private String BoxNo;
    //源库位
    private String originStartPoint;
    //目标库位
    private String originTargetPoint;
    //源货位排编号
    private Integer OriginalRowNo;
@@ -34,7 +40,7 @@
    //目标库位列编号
    private Integer GoalColumnNo;
    //起点
    //源站点
    private String startPoint;
    //终端编号(输送线上某一点位)
src/main/java/com/zy/asrs/entity/param/GetShuttleStatusParam.java
New file
@@ -0,0 +1,73 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class GetShuttleStatusParam {
    /**
     * 小车号
     */
    private Integer shuttleNo;
    /**
     * 小车模式 0:手动 1:自动
     */
    private Integer mode;
    /**
     * 小车状态
     * <p>
     * IDLE(1, "空闲"),
     * WORKING(2, "作业中"),
     * WAITING(3, "等待确认"),
     * CHARGING(4, "充电中"),
     * CHARGING_WAITING(5, "充电任务等待确认"),
     * FIXING(6, "故障修复中"),
     * OFFLINE(7, "离线"),
     */
    private Integer protocolStatus;
    /**
     * 当前二维码
     * 0为空
     */
    private String currentCode;
    /**
     * 是否为充电状态
     */
    private Boolean hasCharge;
    private Integer errorCode;
    public String getProtocolStatus$() {
        String protocolStatus$ = "";
        switch (this.protocolStatus) {
            case 1:
                protocolStatus$ = "空闲";
                break;
            case 2:
                protocolStatus$ = "作业中";
                break;
            case 3:
                protocolStatus$ = "等待确认";
                break;
            case 4:
                protocolStatus$ = "充电中";
                break;
            case 5:
                protocolStatus$ = "充电任务等待确认";
                break;
            case 6:
                protocolStatus$ = "故障修复中";
                break;
            case 7:
                protocolStatus$ = "离线";
                break;
        }
        return protocolStatus$;
    }
}
src/main/java/com/zy/asrs/entity/param/StorageEscalationParam.java
@@ -5,6 +5,7 @@
@Data
public class StorageEscalationParam {
    private Integer taskNo;
    //托盘码
    private String boxNo;
    //执行状态   0:成功 1:失败
src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,6 +1,7 @@
package com.zy.asrs.service;
import com.core.common.R;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.entity.param.TaskOverParam;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.entity.param.TaskCreateParam;
@@ -11,7 +12,7 @@
public interface OpenService {
    //创建任务
    HashMap<String,Object> taskCreate(TaskCreateParam param);
    HashMap<String,Object> taskCreate(CarryParam param);
    R AgvToWCSToWms(WMSAndAGVInterfaceParam param) throws IOException;
src/main/java/com/zy/asrs/service/TaskWrkService.java
@@ -1,5 +1,6 @@
package com.zy.asrs.service;
import com.core.common.R;
import com.zy.asrs.entity.TaskWrk;
import com.baomidou.mybatisplus.service.IService;
@@ -30,4 +31,7 @@
    int saveToHistory(String taskNo);//将任务转历史日志
    //RCS上报任务完成,对完成任务进行处理
    R taskComplete(TaskWrk taskWrk);
}
src/main/java/com/zy/asrs/service/impl/MainServiceImpl.java
@@ -22,6 +22,7 @@
import com.zy.asrs.utils.Utils;
import com.zy.common.service.CommonService;
import com.zy.common.utils.HttpHandler;
import com.zy.common.utils.RedisUtil;
import com.zy.core.CrnThread;
import com.zy.core.DevpThread;
import com.zy.core.cache.MessageQueue;
@@ -103,15 +104,21 @@
    private String TaskExecCallback;
    @Value("${wms.taskStatusFeedbackPath}")
    private String taskStatusFeedbackPath;
    @Value("${wms.returnWarehouse}")
    private String returnWarehouse;
    @Value("${wcs.urlWcs}")
    private String wcsUrl;
    @Value("${wcs.inboundTaskApplyPathWcs}")
    private String wcsInboundTaskApplyPath;
    @Value("${wcs.outboundTaskRequest}")
    private String outboundTaskRequest;
    @Autowired
    private CrnController crnController;
    @Autowired
    private SiteController siteController;
    @Autowired
    private RedisUtil redisUtil;
    public synchronized void generateStoreWrkFile1() throws IOException, InterruptedException {
@@ -134,7 +141,7 @@
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && !staProtocol.isEmptyMk() && workNo >= 9790
                            && !staProtocol.isEmptyMk() && workNo >= 9998
                            && staProtocol.isPakMk()) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
@@ -145,17 +152,17 @@
                        if (BoxNo.equals("00000000")) {
                            storageEscalationParam.setWCSStatus(1);
                            storageEscalationParam.setWCSErrorMessage("没有扫到码");
                            BasDevp basDevp= basDevpService.selectOne(new EntityWrapper<BasDevp>()
                                    .eq("dev_no",staProtocol.getSiteId()));
                            if(Cools.isEmpty(basDevp)){
                                log.error("扫码失败并且没有找到该站点---"+staProtocol.getSiteId());
                            }else{
                            BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>()
                                    .eq("dev_no", staProtocol.getSiteId()));
                            if (Cools.isEmpty(basDevp)) {
                                log.error("扫码失败并且没有找到该站点---" + staProtocol.getSiteId());
                            } else {
                                basDevp.setStaErr(1);//没有扫到码
                                basDevp.setStaErrMsg("没有扫到码!");
                                basDevpService.updateById(basDevp);
                            }
                            continue;
                        }else{
                        } else {
                            TaskWrk taskWrk1 = taskWrkService.selectOne(new EntityWrapper<TaskWrk>().eq("barcode", BoxNo));
                            if (!Cools.isEmpty(taskWrk1)) {
                                log.info("托盘码:" + BoxNo + "任务档存在");
@@ -185,24 +192,26 @@
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("ReturnStatus")) && jsonObject.get("ReturnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("Result").toString())) {
                                Result result = JSON.parseObject(jsonObject.get("Result").toString(), Result.class);
                            if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("returnStatus")) && jsonObject.get("returnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("results").toString())) {
                                Result result = JSON.parseObject(jsonObject.get("results").toString(), Result.class);
                                // 创新一个入库工作档
                                TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo()+"");
                                TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo() + "");
                                if (Cools.isEmpty(taskWrk)) {
                                    taskWrk = createTask1(result, BoxNo,staProtocol.getSiteId());
                                    taskWrk = createTask1(result, BoxNo, staProtocol.getSiteId());
                                    if (Cools.isEmpty(taskWrk)) {
                                        log.error("库位异常,库位号:={}", taskWrk.getOriginTargetPoint());
                                    } else {
                                        taskWrkService.insert(taskWrk);
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId()));
                                        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                                        staProtocol.setStaNo(staDesc.getCrnStn().shortValue());
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        HashMap<String, Object> hashMap = new HashMap<>();
                                        hashMap.put("TaskNo", taskWrk.getTaskNo());
                                        Boolean bool = false;
                                        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                                        staProtocol.setStaNo((short) 0);
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        try {
                                            //开始上报,任务开始时,WCS回调WMS
                                            response = new HttpHandler.Builder()
@@ -212,9 +221,139 @@
                                                    .build()
                                                    .doPost();
                                            JSONObject jsonObject1 = JSON.parseObject(response);
                                            if (jsonObject1.get("ReturnStatus").equals(0)) {
                                                bool = true;
                                            }
                                        } catch (Exception e) {
                                        } finally {
                                            apiLogService.save("wcs开始入库任务上报wms"
                                                    , wmsUrl + TaskExecCallback
                                                    , null
                                                    , "127.0.0.1"
                                                    , JSON.toJSONString(hashMap)
                                                    , response
                                                    , bool
                                            );
                                        }
                                    }
                                }
                            }
                        } catch (Exception e) {
                            log.error("请求入库调用接口失败");
                            log.error("异常信息打印:" + e);
                            try {
                                BasDevp basDevp = basDevpService.selectById(inSta.getStaNo());
                                if (Cools.isEmpty(basDevp)) {
                                    log.error("站点号异常" + inSta.getStaNo());
                                } else if (basDevp.getStaErr() != 0) {
                                    basDevp.setStaErr(2);
                                    basDevpService.updateById(basDevp);
                                }
                            } catch (Exception e1) {
                                // 退回
                                log.error("扫码检测程序异常" + inSta.getStaNo() + "异常信息" + e1);
                            }
                        } finally {
                            apiLogService.save("wms请求入库货位接口"
                                    , wmsUrl + inboundTaskApplyPath
                                    , null
                                    , "127.0.0.1"
                                    , JSON.toJSONString(storageEscalationParam)
                                    , response
                                    , success
                            );
                        }
                        log.info("入库请求参数=" + JSON.toJSONString(BoxNo));
                        log.info("入库请求返回参数=" + JSON.toJSONString(response));
                    }
                }
            }
        } catch (Exception e) {
            log.error("generateStoreWrkFile e", e);
            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
        }
    }
    public synchronized void EmptyPlates() throws IOException, InterruptedException {
        try {
            // 根据输送线plc遍历
            for (DevpSlave devp : slaveProperties.getDevp()) {
                // 遍历入库口
                for (DevpSlave.Sta inSta : devp.getInSta()) {
                    StorageEscalationParam storageEscalationParam = new StorageEscalationParam();
                    // 获取入库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    Short workNo = staProtocol.getWorkNo();
                    Short stano = staProtocol.getStaNo();
                    // 判断是否满足入库条件
                    if (staProtocol.isAutoing() && staProtocol.isLoading()
                            && staProtocol.isInEnable()
                            && staProtocol.isEmptyMk() && workNo ==9999
                            && staProtocol.isPakMk()) {
                        // 获取条码扫描仪信息
                        BarcodeThread barcodeThread = (BarcodeThread) SlaveConnection.get(SlaveType.Barcode, inSta.getBarcode());
                        if (barcodeThread == null) {
                            continue;
                        }
                        String BoxNo = barcodeThread.getBarcode();
                        log.info("组托入库={}", storageEscalationParam);
                        storageEscalationParam.setBoxNo(BoxNo);
                        storageEscalationParam.setWcsIoType(2);//空板
                        storageEscalationParam.setWcsSourceStaNo(staProtocol.getSiteId());
                        String response = "";
                        Boolean success = false;
                        try {
                            response = new HttpHandler.Builder()
                                    .setUri(wmsUrl)
                                    .setPath(inboundTaskApplyPath)
                                    .setJson(JSON.toJSONString(storageEscalationParam))
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("returnStatus")) && jsonObject.get("returnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("results").toString())) {
                                Result result = JSON.parseObject(jsonObject.get("results").toString(), Result.class);
                                // 创新一个入库工作档
                                TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo() + "");
                                if (Cools.isEmpty(taskWrk)) {
                                    taskWrk = createTask1(result, BoxNo, staProtocol.getSiteId());
                                    if (Cools.isEmpty(taskWrk)) {
                                        log.error("库位异常,库位号:={}", taskWrk.getOriginTargetPoint());
                                    } else {
                                        devpThread.setPakMk(staProtocol.getSiteId(), false);
                                        taskWrkService.insert(taskWrk);
                                        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                                .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId()));
                                        HashMap<String, Object> hashMap = new HashMap<>();
                                        hashMap.put("TaskNo", taskWrk.getTaskNo());
                                        Boolean bool = false;
                                        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                                        staProtocol.setStaNo((short) 0);
                                        MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                        try {
                                            //开始上报,任务开始时,WCS回调WMS
                                            response = new HttpHandler.Builder()
                                                    .setUri(wmsUrl)
                                                    .setPath(taskStatusFeedbackPath)
                                                    .setJson(JSON.toJSONString(hashMap))
                                                    .build()
                                                    .doPost();
                                            JSONObject jsonObject1 = JSON.parseObject(response);
                                            if (jsonObject1.get("ReturnStatus").equals(0)) {
                                                bool = true;
                                            }
                                        } catch (Exception e) {
@@ -272,55 +411,56 @@
     * 堆垛机站出库到出库站
     */
    public synchronized void crnStnToOutStn() {
        for (CrnSlave crnSlave : slaveProperties.getCrn()) {
            // 遍历堆垛机出库站
            for (CrnSlave.CrnStn crnStn : crnSlave.getCrnOutStn()) {
                List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", crnSlave.getId()).eq("crn_stn", crnStn.getStaNo()));
                for (StaDesc staDesc : staDescs) {
                    try {
                        // 获取堆垛机出库站信息
                        DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                        StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                        if (staProtocol == null) {
                            continue;
                        } else {
                            staProtocol = staProtocol.clone();
                        }
                        if (staProtocol.isAutoing() && staProtocol.isLoading() && (staProtocol.getWorkNo() == 0 || staProtocol.getStaNo() == 0)) {
                            // 查询工作档
                            TaskWrk taskWrk = taskWrkMapper.selectCrnStaWorking(crnSlave.getId(), staDesc.getStnNo().toString());
                            if (taskWrk == null) {
                                continue;
                            }
                            log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                            staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                            staProtocol.setStaNo(staDesc.getStnNo().shortValue());
                            boolean offer = false;
                            try {
                                offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                            } catch (Exception e) {
                                log.error("下发输送线任务失败:异常:" + e);
                                log.error("下发输送线任务失败:异常:offer:" + offer);
                            }
//                            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(r));
                            if (offer) {
                                log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
                                taskWrk.setStatus(5);
                                taskWrk.setWrkSts(16);
                                taskWrkService.updateById(taskWrk);
                            } else {
                                log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk));
//                                log.error("下发输送线任务失败:异常信息:"+JSON.toJSONString(r));
                            }
                        }
                    } catch (Exception e) {
                        log.error("出库到出库站异常:异常信息:" + e);
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历出库口
            for (DevpSlave.Sta outSta : devp.getOutSta()) {
                try {
                    // 获取堆垛机出库站信息
                    DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                    StaProtocol staProtocol = devpThread.getStation().get(outSta.getStaNo());
                    if (staProtocol == null) {
                        continue;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                }
                    if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() == 0) {
                        // 查询工作档
                        TaskWrk taskWrk = taskWrkService.selectOne(new EntityWrapper<TaskWrk>()
                                .eq("target_point", staProtocol.getSiteId())
                                .eq("wrk_sts", 15));
                        if (taskWrk == null) {
                            continue;
                        }
                        log.info("下发输送线任务:taskWrk:" + JSON.toJSONString(taskWrk));
//                            R r = siteController.siteDetlUpdate(Integer.valueOf(taskWrk.getTargetPoint()), taskWrk.getWrkNo().shortValue(), (short) 0, "Y", false, false);
                        staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                        staProtocol.setStaNo((short) 0);
                        boolean offer = false;
                        try {
                            offer = MessageQueue.offer(SlaveType.Devp, 1, new Task(2, staProtocol));
                        } catch (Exception e) {
                            log.error("下发输送线任务失败:异常:" + e);
                            log.error("下发输送线任务失败:异常:offer:" + offer);
                        }
//                            JSONObject jsonObject = JSON.parseObject(JSON.toJSONString(r));
                        if (offer) {
                            log.info("下发输送线任务成功:taskWrk:" + JSON.toJSONString(taskWrk));
//                            taskWrk.setStatus(5);
                            taskWrk.setWrkSts(16);
                            taskWrkService.updateById(taskWrk);
                        } else {
                            log.error("下发输送线任务失败:taskWrk:" + JSON.toJSONString(taskWrk));
//                                log.error("下发输送线任务失败:异常信息:"+JSON.toJSONString(r));
                        }
                    }
                } catch (Exception e) {
                    log.error("出库到出库站异常:异常信息:" + e);
                }
            }
        }
    }
@@ -328,89 +468,82 @@
     * 入出库  ===>>  调用RCS进行入出库
     */
    public synchronized void crnIoExecute() throws IOException {
        for (CrnSlave crn : slaveProperties.getCrn()) {
            this.crnStnToLoc(crn); //  入库
            this.locToCrnStn(crn); //  出库
            // 库位移转
        this.crnStnToLoc(); //  入库
        this.locToCrnStn(); //  出库
        // 库位移转
//            this.locToLoc(crn, crnProtocol);
        }
    }
    /**
     * 入库  ===>>  堆垛机站到库位
     */
    public synchronized void crnStnToLoc(CrnSlave slave) throws IOException {
        for (CrnSlave.CrnStn crnStn : slave.getCrnInStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                boolean flag = false;
                // 获取堆垛机入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
    public synchronized void crnStnToLoc() throws IOException {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta inSta : devp.getInSta()) {
                StorageEscalationParam storageEscalationParam = new StorageEscalationParam();
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(inSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                // 查询站点详细信息
                BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                BasDevp staDetl = basDevpService.selectById(staProtocol.getSiteId());
                if (staDetl == null) {
                    log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                    log.error("入库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", staProtocol.getSiteId());
                    continue;
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() > 0 && staProtocol.isInEnable()
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.getWorkNo() < 9990
                        && staDetl.getCanining() != null && staDetl.getCanining().equals("Y")) {
                    flag = true;
                }
                if (!flag) {
                    continue;
                }
                // 获取工作状态为2(设备上走)的入库工作档
                TaskWrk taskWrk = taskWrkMapper.selectPakIn(slave.getId(), staProtocol.getWorkNo().intValue(), staDesc.getStnNo().toString());
                if (null == taskWrk) {
                    continue;
                }
                String mbz = taskWrk.getTargetPoint().substring(5);
                HashMap<String, Object> hashMap = new HashMap<>();
                hashMap.put("taskNo", taskWrk.getTaskNo());//wms任务号
                hashMap.put("sourceStaNo", staDetl.getDevNo());//源站点
                hashMap.put("staNo", Integer.parseInt(mbz) + "");//目标站
                hashMap.put("locNo", taskWrk.getTargetPoint());//目标库位
                String response = "";
                Boolean bool = false;
                try {
                    //开始上报,出库任务开始时,WCS回调WMS
                    response = new HttpHandler.Builder()
                            .setUri(wcsUrl)
                            .setPath(wcsInboundTaskApplyPath)
                            .setJson(JSON.toJSONString(hashMap))
                            .build()
                            .doPost();
                    JSONObject jsonObject = JSON.parseObject(response);
                    if (jsonObject.get("code").equals(200)) {
                        bool = true;
//                        taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
                        taskWrk.setAssignTime(new Date());//派发时间
                        taskWrk.setWrkSts(3);//工作状态 3.成功下发入库任务给RCS
                        taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
                        taskWrk.setModiTime(new Date());
                        taskWrk.setModiUser(9988L);
                    // 获取工作状态为2(设备上走)的入库工作档
                    TaskWrk taskWrk = taskWrkMapper.selectPakIn(null, staProtocol.getWorkNo().intValue(), staProtocol.getSiteId().toString());
                    if (null == taskWrk) {
                        continue;
                    }
                } catch (Exception e) {
                } finally {
                    apiLogService.save("wcs派发入库任务给RCS"
                            , wcsUrl + wcsInboundTaskApplyPath
                            , null
                            , "127.0.0.1"
                            , JSON.toJSONString(hashMap)
                            , response
                            , bool
                    );
                    HashMap<String, Object> hashMap = new HashMap<>();
                    hashMap.put("taskNo", taskWrk.getTaskNo());//wms任务号
                    hashMap.put("sourceStaNo", staDetl.getDevNo());//源站点
                    hashMap.put("staNo", taskWrk.getTargetPoint());//目标站
                    hashMap.put("locNo", taskWrk.getOriginTargetPoint());//目标库位
                    String response = "";
                    Boolean bool = false;
                    try {
                        //开始上报,出库任务开始时,WCS回调WMS
                        response = new HttpHandler.Builder()
                                .setUri(wcsUrl)
                                .setPath(wcsInboundTaskApplyPath)
                                .setJson(JSON.toJSONString(hashMap))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("code").equals(200)) {
                            bool = true;
//                        taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
                            taskWrk.setAssignTime(new Date());//派发时间
                            taskWrk.setWrkSts(3);//工作状态 3.成功下发入库任务给RCS
                            taskWrk.setModiTime(new Date());
                            taskWrk.setModiUser(9988L);
                        }
                    } catch (Exception e) {
                    } finally {
                        apiLogService.save("wcs派发入库任务给RCS"
                                , wcsUrl + wcsInboundTaskApplyPath
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(hashMap)
                                , response
                                , bool
                        );
                    }
                }
            }
        }
    }
@@ -419,16 +552,24 @@
     * 出库  ===>>  库位到堆垛机站
     * 2022-06-09 TQS修改,查询工作档LIST,遍历下发,防止第一个任务堵塞出库
     */
    public synchronized void locToCrnStn(CrnSlave slave) {
        List<TaskWrk> taskWrksInitial = taskWrkMapper.selectPakOut(slave.getId(), null);
        if (taskWrksInitial.size() == 0) {
            return;
        }
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            List<StaDesc> staDescs = staDescMapper.selectList(new EntityWrapper<StaDesc>().eq("crn_no", slave.getId()).eq("crn_stn", crnStn.getStaNo()));
            for (StaDesc staDesc : staDescs) {
                // 获取工作状态为11(生成出库ID)的出库工作档
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(slave.getId(), staDesc.getStnNo().toString());
    public synchronized void locToCrnStn() {
        // 根据输送线plc遍历
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历入库口
            for (DevpSlave.Sta outSta : devp.getOutSta()) {
                StorageEscalationParam storageEscalationParam = new StorageEscalationParam();
                // 获取入库站信息
                DevpThread devpThread = (DevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(outSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                } else {
                    staProtocol = staProtocol.clone();
                }
                List<TaskWrk> taskWrks = taskWrkMapper.selectPakOut(1, staProtocol.getSiteId().toString());
                if (taskWrks.size() == 0) {
                    continue;
                }
                for (TaskWrk taskWrk : taskWrks) {
                    if (taskWrk == null) {
                        continue;
@@ -444,19 +585,10 @@
                    //预留
                    // 获取堆垛机出库站信息
                    SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, crnStn.getDevpPlcId());
                    StaProtocol staProtocol = devpThread.getStation().get(crnStn.getStaNo());
                    if (staProtocol == null) {
                        break;
                    } else {
                        staProtocol = staProtocol.clone();
                    }
                    // 查询站点详细信息
                    BasDevp staDetl = basDevpService.selectById(crnStn.getStaNo());
                    BasDevp staDetl = basDevpService.selectById(staProtocol.getSiteId());
                    if (staDetl == null) {
                        log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", crnStn.getStaNo());
                        log.error("出库 ===>> 堆垛机站点在数据库不存在, 站点编号={}", staProtocol.getSiteId());
                        break;
                    }
@@ -464,44 +596,35 @@
                    if (staProtocol.isAutoing() && !staProtocol.isLoading() && staDetl.getCanouting() != null && staDetl.getCanouting().equals("Y")
                            && staProtocol.getWorkNo() == 0 && staProtocol.isOutEnable()) {
                        // 命令下发区 --------------------------------------------------------------------------
                        // 已经存在吊车执行任务时,则过滤
                        if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                            break;
                        }
                        String mbz = taskWrk.getTargetPoint().substring(5);
                        HashMap<String, Object> hashMap = new HashMap<>();
                        hashMap.put("taskNo", taskWrk.getTaskNo());//wms任务号
                        hashMap.put("sourceStaNo", staDetl.getDevNo());//源站点
                        hashMap.put("staNo", Integer.parseInt(mbz) + "");//目标站
                        hashMap.put("locNo", taskWrk.getTargetPoint());//目标库位
                        hashMap.put("sourceLocNo", taskWrk.getOriginStartPoint());//源库位
                        hashMap.put("staNo", taskWrk.getTargetPoint());//目标站
                        String response = "";
                        Boolean bool = false;
                        try {
                            //开始上报,出库任务开始时,WCS回调WMS
                            response = new HttpHandler.Builder()
                                    .setUri(wcsUrl)
                                    .setPath(wcsInboundTaskApplyPath)
                                    .setPath(outboundTaskRequest)
                                    .setJson(JSON.toJSONString(hashMap))
                                    .build()
                                    .doPost();
                            JSONObject jsonObject = JSON.parseObject(response);
                            if (jsonObject.get("code").equals(200)) {
                            if (jsonObject.getInteger("code").equals(200)) {
                                bool = true;
//                        taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//派发状态
                                taskWrk.setAssignTime(new Date());//派发时间
                                taskWrk.setWrkSts(3);//工作状态 3.成功下发入库任务给RCS
                                taskWrk.setCrnNo(staDesc.getCrnNo());//堆垛机号
                                taskWrk.setWrkSts(12);//工作状态 12.成功下发出库任务
                                taskWrk.setModiTime(new Date());
                                taskWrk.setModiUser(9988L);
                                taskWrkService.updateById(taskWrk);
                            }
                        } catch (Exception e) {
                        } finally {
                            apiLogService.save("wcs派发出库任务给RCS"
                                    , wcsUrl + wcsInboundTaskApplyPath
                                    , wcsUrl + outboundTaskRequest
                                    , null
                                    , "127.0.0.1"
                                    , JSON.toJSONString(hashMap)
@@ -509,47 +632,6 @@
                                    , bool
                            );
                        }
                        try {
                            // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                            Date now = new Date();
                            taskWrk.setWrkSts(12);
                            taskWrk.setModiTime(now);
                            if (taskWrkMapper.updateById(taskWrk) == 0) {
                                log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                            }
                        } catch (Exception e) {
                            log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                            log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,异常:" + e);
                        }
//                            try {
//                                HashMap<String, Object> headParam = new HashMap<>();
//                                headParam.put("taskNo", taskWrk.getTaskNo());
//                                headParam.put("status", taskWrk.getStatus());
//                                headParam.put("ioType", taskWrk.getIoType());
//                                headParam.put("barcode", taskWrk.getBarcode());
//                                String response;
//                                response = new HttpHandler.Builder()
//                                        // .setHeaders(headParam)
//                                        .setUri(wmsUrl)
//                                        .setPath(taskStatusFeedbackPath)
//                                        .setJson(JSON.toJSONString(headParam))
//                                        .build()
//                                        .doPost();
//                                JSONObject jsonObject = JSON.parseObject(response);
//                                apiLogService.save("wcs派发出库任务上报wms"
//                                        , wmsUrl + taskStatusFeedbackPath
//                                        , null
//                                        , "127.0.0.1"
//                                        , JSON.toJSONString(headParam)
//                                        , response
//                                        , true
//                                );
//                            } catch (Exception e) {
//                                log.error("wcs派发出库任务上报wms失败", JSON.toJSONString(taskWrk));
////                                throw new CoolException("wcs派发入库任务上报wms失败");
//                            }
                    }
                }
            }
@@ -557,99 +639,117 @@
    }
    /**
     * 库位移转
     * 拣料、并板、盘点再入库
     */
    public synchronized void locToLoc(CrnSlave slave, CrnProtocol crnProtocol) {
        for (CrnSlave.CrnStn crnStn : slave.getCrnOutStn()) {
            // 获取工作状态为11(生成出库ID)的移库工作档
            List<TaskWrk> taskWrks = taskWrkMapper.selectList(new EntityWrapper<TaskWrk>()
                    .eq("crn_no", slave.getId())
                    .eq("wrk_sts", 11)
                    .eq("io_type", 3)
                    .orderBy("io_pri", false));
            for (TaskWrk taskWrk : taskWrks) {
                // 双深库位且浅库位有货,则需先对浅库位进行库位移转
//                if (Utils.isDeepLoc(slaveProperties, taskWrk.getStartPoint())) {
//                    String shallowLocNo = Utils.getShallowLoc(slaveProperties, taskWrk.getStartPoint());
//                    TaskWrk hallowLocNoTask = taskWrkMapper.selectByStartPoint(shallowLocNo);
//                    if (!Cools.isEmpty(hallowLocNoTask)){
//                        continue;
//                    }
//                }
                // 堆垛机控制过滤
                if (!crnProtocol.getStatusType().equals(CrnStatusType.IDLE) || crnProtocol.getTaskNo() != 0) {
    public synchronized void stnToCrnStnPick(Integer mark) {
        for (DevpSlave devp : slaveProperties.getDevp()) {
            // 遍历拣料入库口
            for (DevpSlave.Sta pickSta : devp.getPickSta()) {
                StorageEscalationParam storageEscalationParam = new StorageEscalationParam();
                // 获取拣料入库站信息
                SiemensDevpThread devpThread = (SiemensDevpThread) SlaveConnection.get(SlaveType.Devp, devp.getId());
                StaProtocol staProtocol = devpThread.getStation().get(pickSta.getStaNo());
                if (staProtocol == null) {
                    continue;
                }
                // 已经存在吊车执行任务时,则过滤
                if (taskWrkMapper.selectCrnWorking(slave.getId()) != null) {
                    continue;
                }
                if (taskWrk == null || Cools.isEmpty(taskWrk.getTargetPoint()) || taskWrk.getTargetPoint().equals("") || taskWrk.getWrkNo() == null) {
                    continue;
                }
                // 工作档状态判断
                if (taskWrk.getIoType() != 3 || taskWrk.getTargetPoint() == null) {
                    log.error("查询工作档数据不符合条件--入出类型/目标库位号, 工作号={},源库位={},入出类型={}", taskWrk.getWrkNo(), taskWrk.getTargetPoint(), taskWrk.getIoType());
                    continue;
                }
                // 命令下发区 --------------------------------------------------------------------------
                // 1.堆垛机开始移动
                CrnCommand crnCommand = new CrnCommand();
                crnCommand.setCrnNo(slave.getId()); // 堆垛机编号
                crnCommand.setTaskNo(taskWrk.getWrkNo().shortValue()); // 工作号
                crnCommand.setAckFinish((short) 0);  // 任务完成确认位
                crnCommand.setTaskMode(CrnTaskModeType.LOC_MOVE); // 任务模式:  库位移转
                crnCommand.setSourcePosX(Utils.getRowShort(taskWrk.getStartPoint()));     // 源库位排
                crnCommand.setSourcePosY(Utils.getBayShort(taskWrk.getStartPoint()));     // 源库位列
                crnCommand.setSourcePosZ(Utils.getLevShort(taskWrk.getStartPoint()));     // 源库位层
                crnCommand.setDestinationPosX(Utils.getRowShort(taskWrk.getTargetPoint()));     // 目标库位排
                crnCommand.setDestinationPosY(Utils.getBayShort(taskWrk.getTargetPoint()));     // 目标库位列
                crnCommand.setDestinationPosZ(Utils.getLevShort(taskWrk.getTargetPoint()));     // 目标库位层
                crnCommand.setCommand((short) 1);
                if (!CommandUtils.offer(SlaveType.Crn, taskWrk.getCrnNo(), new Task(2, crnCommand), false)) {
                    log.error("堆垛机命令下发失败,堆垛机号={},任务数据={}", taskWrk.getCrnNo(), JSON.toJSON(crnCommand));
                } else {
                    // 修改工作档状态 11.生成出库ID => 12.吊车出库中
                    Date now = new Date();
                    taskWrk.setWrkSts(12);
                    taskWrk.setStatus(2);
                    taskWrk.setModiTime(now);
                    if (taskWrkMapper.updateById(taskWrk) == 0) {
                        log.error("修改工作档状态 11.生成出库ID => 12.吊车出库中 失败!!,工作号={}", taskWrk.getWrkNo());
                    }
                    staProtocol = staProtocol.clone();
                }
                if (staProtocol.isAutoing() && staProtocol.isLoading() && staProtocol.isInEnable() && staProtocol.isPakMk()
                        && staProtocol.getWorkNo() >= 3001 && staProtocol.getWorkNo() <= 6000) {
                    storageEscalationParam.setTaskNo(Integer.valueOf(staProtocol.getWorkNo()));
                    String response = "";
                    Boolean success = false;
                    try {
                        HashMap<String, Object> headParam = new HashMap<>();
                        headParam.put("TaskNo", taskWrk.getTaskNo());
                        String response;
                        //开始上报,拣料、并板、盘点再入库,WCS回调WMS
                        response = new HttpHandler.Builder()
                                // .setHeaders(headParam)
                                .setUri(wmsUrl)
                                .setPath(taskStatusFeedbackPath)
                                .setJson(JSON.toJSONString(headParam))
                                .setPath(returnWarehouse)
                                .setJson(JSON.toJSONString(storageEscalationParam))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        apiLogService.save("wcs派发移库任务上报wms"
                                , wmsUrl + taskStatusFeedbackPath
                        if (!Cools.isEmpty(response) && !Cools.isEmpty(jsonObject.get("returnStatus")) && jsonObject.get("returnStatus").equals(0) && !Cools.isEmpty(jsonObject.get("results").toString())) {
                            Result result = JSON.parseObject(jsonObject.get("results").toString(), Result.class);
                            // 创新一个入库工作档
                            TaskWrk taskWrk = taskWrkService.selectByTaskNo(result.getTaskNo() + "");
                            if (Cools.isEmpty(taskWrk)) {
                                taskWrk = createTask1(result, result.getBarcode(), staProtocol.getSiteId());
                                if (Cools.isEmpty(taskWrk)) {
                                    log.error("库位异常,库位号:={}", taskWrk.getOriginTargetPoint());
                                } else {
                                    taskWrkService.insert(taskWrk);
                                    StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                                            .eq("crn_no", taskWrk.getCrnNo()).eq("type_no", 1).eq("stn_no", staProtocol.getSiteId()));
                                    HashMap<String, Object> hashMap = new HashMap<>();
                                    hashMap.put("TaskNo", taskWrk.getTaskNo());
                                    Boolean bool = false;
                                    staProtocol.setWorkNo(taskWrk.getWrkNo().shortValue());
                                    staProtocol.setStaNo((short) 0);
                                    MessageQueue.offer(SlaveType.Devp, devp.getId(), new Task(2, staProtocol));
                                    try {
                                        //开始上报,任务开始时,WCS回调WMS
                                        response = new HttpHandler.Builder()
                                                .setUri(wmsUrl)
                                                .setPath(taskStatusFeedbackPath)
                                                .setJson(JSON.toJSONString(hashMap))
                                                .build()
                                                .doPost();
                                        JSONObject jsonObject1 = JSON.parseObject(response);
                                        if (jsonObject1.get("ReturnStatus").equals(0)) {
                                            bool = true;
                                        }
                                    } catch (Exception e) {
                                    } finally {
                                        apiLogService.save("wcs拣料、并板、盘点再入库上报wms"
                                                , wmsUrl + TaskExecCallback
                                                , null
                                                , "127.0.0.1"
                                                , JSON.toJSONString(hashMap)
                                                , response
                                                , bool
                                        );
                                    }
                                }
                            }
                        }
                    } catch (Exception e) {
                    } finally {
                        apiLogService.save("wcs派发出库任务给RCS"
                                , wcsUrl + outboundTaskRequest
                                , null
                                , "127.0.0.1"
                                , JSON.toJSONString(headParam)
                                , JSON.toJSONString(storageEscalationParam)
                                , response
                                , true
                                , success
                        );
                    } catch (Exception e) {
                        log.error("wcs派发移库库任务上报wms失败", taskWrk);
//                        throw new CoolException("wcs派发移库库任务上报wms失败");
                    }
                }
                return;
            }
        }
    }
    public void scanForkLift() {
        for (int i = 1; i <= 2; i++) {
            Object object = redisUtil.get("fork_lift_put_complete_" + i);
            if(object != null) {
                String taskNo = object.toString();
                TaskWrk taskWrk = taskWrkService.selectByTaskNo(taskNo);//wms任务号
                if (taskWrk == null) {
                    log.info("没有找到该任务");
                }else{
                    log.info("提前完成出库任务={}", taskWrk);
                    taskWrkService.taskComplete(taskWrk);
                    redisUtil.del("fork_lift_put_complete_" + i);
                }
            }
        }
@@ -1089,19 +1189,20 @@
        return response;
    }
    private TaskWrk createTask1(Result result, String barcode,Integer devNo) {
    private TaskWrk createTask1(Result result, String barcode, Integer devNo) {
        Date now = new Date();
        TaskWrk taskWrk = new TaskWrk();
//        int workNo1 = commonService.getWorkNo(WorkNoType.PAKIN.type);//获取入库工作号
        taskWrk.setTaskNo(result.getTaskNo()+"");//任务号
        taskWrk.setTaskNo(result.getTaskNo() + "");//任务号
        taskWrk.setWrkNo(result.getTaskNo());
        taskWrk.setStatus(TaskStatusType.DISTRIBUTE.id);//任务状态:派发
        taskWrk.setCreateTime(now);
        taskWrk.setIoType(1);//任务类型
        taskWrk.setIoPri(13);//优先级
        taskWrk.setWrkSts(2);//2.派发入库任务给RCS
        taskWrk.setBarcode(barcode);//条码
        taskWrk.setTargetPoint(devNo+"");//站点终点
        taskWrk.setStartPoint(devNo+"");//站点起点
        taskWrk.setTargetPoint(devNo + result.getShelfUnitId().substring(6));//站点终点
        taskWrk.setStartPoint(devNo + "");//站点起点
        taskWrk.setOriginStartPoint("");//源库位
        taskWrk.setOriginTargetPoint(result.getShelfUnitId());//目标库位
        return taskWrk;
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -9,6 +9,7 @@
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.domain.enums.WorkNoType;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CarryParam;
import com.zy.asrs.entity.param.TaskOverParam;
import com.zy.asrs.entity.param.WMSAndAGVInterfaceParam;
import com.zy.asrs.entity.param.TaskCreateParam;
@@ -66,69 +67,47 @@
    @Override
    public HashMap<String, Object> taskCreate(TaskCreateParam param) {
        HashMap<String,Object> map=new HashMap<>();
    public HashMap<String, Object> taskCreate(CarryParam param) {
        HashMap<String, Object> map = new HashMap<>();
        TaskWrk taskWrk = taskWrkService.selectByTaskNo(param.getTaskNo());
        if (taskWrk != null) {
            map.put("Code","0");
            map.put("Msg",param.getTaskNo()+"任务已经生成!");
            map.put("Code", "0");
            map.put("Msg", param.getTaskNo() + "任务已经生成!");
            return map;
        }
        Date now = new Date();
        taskWrk = new TaskWrk();
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getStartPoint()));
        int workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);//获取入库工作号
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getOriginStartPoint()));
//        int workNo1 = commonService.getWorkNo(WorkNoType.PAKOUT.type);//获取入库工作号
        taskWrk.setTaskNo(param.getTaskNo());//任务号
        taskWrk.setWrkNo(workNo1);
        taskWrk.setWrkNo(Integer.valueOf(param.getTaskNo()));
        taskWrk.setStatus(TaskStatusType.RECEIVE.id);//任务状态:接收
        taskWrk.setCreateTime(now);
        try {
            if (param.getIoType() > 1) {
                if (Utils.locNoRowBoolean(locMast.getRow1())) {
                    param.setTaskPriority(11);
                }
            }
        } catch (Exception e) {
        }
        taskWrk.setIoType(param.getIoType());//任务类型
        taskWrk.setIoPri(param.getTaskPriority());//优先级
        taskWrk.setBarcode(param.getBarcode());//条码
        taskWrk.setIoType(param.getStereoscopicTaskType());//任务类型
        taskWrk.setIoPri(param.getPriority());//优先级
        taskWrk.setBarcode(param.getBoxNo());//条码
        taskWrk.setCrnNo(locMast.getCrnNo());
        if (param.getIoType() == 1) {
            taskWrk.setWrkSts(1);
            if (!Cools.isEmpty(param.getTargetPoint())) {
                taskWrk.setTargetPoint(Utils.getWcsLocNo(param.getTargetPoint()));//终点
                taskWrk.setOriginTargetPoint(param.getTargetPoint());
            }
        } else if (param.getIoType() == 2) {
        if (param.getStereoscopicTaskType() == 2) {
            taskWrk.setWrkSts(11);
            if (!Cools.isEmpty(param.getStartPoint())) {
                taskWrk.setStartPoint(param.getStartPoint());//起点
                taskWrk.setTargetPoint(param.getTargetPoint());
            }
            taskWrk.setTargetPoint(param.getTargetPoint());
        } else if (param.getIoType() == 3) {
            taskWrk.setWrkSts(11);
            if (!Cools.isEmpty(param.getStartPoint())) {
                taskWrk.setStartPoint(param.getStartPoint());//起点
                taskWrk.setTargetPoint(param.getTargetPoint());
            }
        }
        if (!Cools.isEmpty(param.getMemo())) {
            taskWrk.setMemo(param.getMemo());//备注
            taskWrk.setStartPoint(param.getStartPoint());//源站点
            taskWrk.setTargetPoint(param.getTerminalNo());//目标站
            taskWrk.setOriginStartPoint(param.getOriginStartPoint());//源库位
        } else if (param.getStereoscopicTaskType() == 3) {
//            taskWrk.setWrkSts(11);
//            if (!Cools.isEmpty(param.getStartPoint())) {
//                taskWrk.setStartPoint(param.getStartPoint());//起点
//                taskWrk.setTargetPoint(param.getTargetPoint());
//            }
        }
        if (!taskWrkService.insert(taskWrk)) {
            map.put("Code","0");
            map.put("Msg",param.getTaskNo()+"创建任务失败!");
            map.put("Code", "0");
            map.put("Msg", param.getTaskNo() + "创建任务失败!");
            return map;
        }
        map.put("Code","1");
        map.put("Msg","ok");
        map.put("Code", "1");
        map.put("Msg", "ok");
        return map;
    }
@@ -182,7 +161,7 @@
            WMSAndAGVInterfaceParam data = JSONObject.parseObject(jsonObject.get("data").toString(), WMSAndAGVInterfaceParam.class);
            String msg = null;
            try {
                taskCreate(new TaskCreateParam(data));
//                taskCreate(new TaskCreateParam(data));
            } catch (Exception e) {
                msg = e.getMessage();
            }
src/main/java/com/zy/asrs/service/impl/TaskWrkServiceImpl.java
@@ -3,13 +3,16 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.domain.enums.TaskStatusType;
import com.zy.asrs.domain.enums.WorkNoType;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.StaDesc;
import com.zy.asrs.mapper.TaskWrkMapper;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.StaDescService;
import com.zy.asrs.service.TaskWrkService;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
@@ -50,6 +53,10 @@
    private String taskStatusFeedbackPath;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private TaskWrkService taskWrkService;
    @Override
    public TaskWrk selectByTaskNo(String taskNo) {
@@ -74,29 +81,7 @@
    @Override
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void distribute(String taskNo, Long userId) {
        TaskWrk taskWrk = this.selectByTaskNo(taskNo);
        if (taskWrk == null) {
            throw new CoolException("WMS任务不存在");
        }
        if (taskWrk.getStatus() != 1) {
            throw new CoolException("任务已派发");
        }
        //创建任务
        if (taskWrk.getIoType() == 1) {
            //1.入库
            if (taskWrk.getStartPoint() == null || taskWrk.getTargetPoint() == null) {
                throw new CoolException("未接收到起点和终点,不进行派发");
            }
            startup(taskWrk, userId);
        }else if(taskWrk.getIoType() == 2){
            //2.出库
            stockOut(taskWrk, userId);
        } else if (taskWrk.getIoType() == 3) {
            //3.库格移载
            locMove(taskWrk, userId);
        }
    }
    @Override
@@ -247,4 +232,63 @@
    public int saveToHistory(String taskNo) {
        return this.baseMapper.saveToHistory(taskNo);
    }
    @Override
    public R taskComplete(TaskWrk taskWrk) {
        LocMast locMast = new LocMast();
        switch (taskWrk.getIoType()) {
                //入库
            case 1:
                taskWrk.setModiTime(new Date());
                taskWrk.setWrkSts(6);//入库完成--准备上报wms
                locMast = locMastService.selectByLocNo(taskWrk.getOriginTargetPoint());
                if (locMast == null) {
                    return R.error("没有找到该库位="+taskWrk.getOriginTargetPoint());
                }
                locMast.setLocSts("F");
                locMastService.updateById(locMast);
                break;
                //出库
            case 2:
                if(taskWrk.getWrkSts()>=15){
                    return R.ok();
                }
                taskWrk.setModiTime(new Date());
                taskWrk.setWrkSts(15);//RCS出库完成--》写入输送线工作号
                locMast = locMastService.selectByLocNo(taskWrk.getOriginStartPoint());
                if (locMast == null) {
                    return R.error("没有找到该库位="+taskWrk.getOriginStartPoint());
                }
                locMast.setLocSts("O");
                locMastService.updateById(locMast);
                log.info("RCS出库任务完成更新WCS任务状态={}",taskWrk);
                break;
                //移库
//            case 3:
//                taskWrk.setModiTime(new Date());
//                taskWrk.setWrkSts(6);//入库完成--准备上报wms
//                //源库位
//                locMast = locMastService.selectByLocNo(taskWrk.getOriginTargetPoint());
//                if (locMast == null) {
//                    return R.error("没有找到该库位="+taskWrk.getOriginTargetPoint());
//                }
//                locMast.setLocSts("F");
//                locMastService.updateById(locMast);
//                //目标库位
//                locMast = locMastService.selectByLocNo(taskWrk.getOriginStartPoint());
//                if (locMast == null) {
//                    return R.error("没有找到该库位="+taskWrk.getOriginStartPoint());
//                }
//                locMast.setLocSts("0");
//                locMastService.updateById(locMast);
//                return R.ok();
//
        }
        if(taskWrkService.updateById(taskWrk)){
            return R.ok();
        }else {
            return R.error("RCS任务上报完成更新WCS任务状态失败"+taskWrk);
        }
    }
}
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -47,165 +47,165 @@
    @Override
    @Transactional
    public void completeWrkMast(String workNo, Long userId) {
        WrkMast wrkMast = wrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)) {
            throw new CoolException(workNo + "工作档不存在");
        }
        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
            throw new CoolException("当前工作档已完成");
        }
        // 入库 + 库位转移
        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType() == 11)) {
            wrkMast.setWrkSts(4L);
            // 出库
        } else if (wrkMast.getWrkSts() > 10) {
            wrkMast.setWrkSts(14L);
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
        wrkMast.setCrnEndTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setModiUser(userId);
        // 完成操作人员记录
        wrkMast.setManuType("手动完成");
        if (!wrkMastService.updateById(wrkMast)) {
            throw new CoolException("修改工作档失败");
        }
        HashMap<String,Object> headParam = new HashMap<>();
        headParam.put("TaskNo",wrkMast.getTaskNo());
        headParam.put("Result",0);//完成
        try {
            String response;
            log.error("wcs手动完结任务上报wms={}", wrkMast);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(wmsUrl)
                    .setPath(taskStatusFeedbackPath)
                    .setJson(JSON.toJSONString(headParam))
                    .build()
                    .doPost();
            apiLogService.save("wcs手动完成任务上报wms"
                    , wmsUrl + taskStatusFeedbackPath
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(headParam)
                    , response
                    , true
            );
        } catch (Exception e) {
            log.error("wcs手动完结任务上报wms失败={}", wrkMast);
            log.error("wcs手动完结任务上报wms失败,报错信息:", e);
//                        throw new CoolException("wcs派发入库任务上报wms失败");
        }
//        WrkMast wrkMast = wrkMastService.selectById(workNo);
//        if (Cools.isEmpty(wrkMast)) {
//            throw new CoolException(workNo + "工作档不存在");
//        }
//        if (wrkMast.getWrkSts() == 4 || wrkMast.getWrkSts() == 14) {
//            throw new CoolException("当前工作档已完成");
//        }
//        // 入库 + 库位转移
//        if (wrkMast.getWrkSts() < 4 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType() == 11)) {
//            wrkMast.setWrkSts(4L);
//            // 出库
//        } else if (wrkMast.getWrkSts() > 10) {
//            wrkMast.setWrkSts(14L);
//        }
//        Date now = new Date();
//        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
//        wrkMast.setCrnEndTime(now);
//        wrkMast.setModiTime(now);
//        wrkMast.setModiUser(userId);
//        // 完成操作人员记录
//        wrkMast.setManuType("手动完成");
//        if (!wrkMastService.updateById(wrkMast)) {
//            throw new CoolException("修改工作档失败");
//        }
//
//        HashMap<String,Object> headParam = new HashMap<>();
//        headParam.put("TaskNo",wrkMast.getTaskNo());
//        headParam.put("Result",0);//完成
//
//        try {
//            String response;
//            log.error("wcs手动完结任务上报wms={}", wrkMast);
//
//            response = new HttpHandler.Builder()
//                    // .setHeaders(headParam)
//                    .setUri(wmsUrl)
//                    .setPath(taskStatusFeedbackPath)
//                    .setJson(JSON.toJSONString(headParam))
//                    .build()
//                    .doPost();
//            apiLogService.save("wcs手动完成任务上报wms"
//                    , wmsUrl + taskStatusFeedbackPath
//                    , null
//                    , "127.0.0.1"
//                    , JSON.toJSONString(headParam)
//                    , response
//                    , true
//            );
//        } catch (Exception e) {
//            log.error("wcs手动完结任务上报wms失败={}", wrkMast);
//            log.error("wcs手动完结任务上报wms失败,报错信息:", e);
////                        throw new CoolException("wcs派发入库任务上报wms失败");
//        }
    }
    @Override
    @Transactional
    public void cancelWrkMast(String workNo, Long userId) {
        Date now = new Date();
        WrkMast wrkMast = wrkMastService.selectById(workNo);
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)
        if (wrkMast.getWrkSts() < 4) {
            locNo = wrkMast.getLocNo();
            locSts = "O";
            // 库位转移
            if (wrkMast.getIoType() == 11) {
                // 库位转移:源库位
                LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,源库位不存在:" + wrkMast.getSourceLocNo());
                }
                locMast.setLocSts(wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F");
                locMast.setModiTime(now);
                locMast.setModiUser(userId);
                locMastService.updateById(locMast);
            }
            // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
                locSts = "F";
                // 空板出库 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 110) {
                locSts = "D";
                // 库位转移 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 11) {
                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F";
                // 库位转移:目标库位
                LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,目标库位不存在:" + wrkMast.getSourceLocNo());
                }
                locMast.setLocSts("O");
                locMast.setModiTime(now);
                locMast.setModiUser(userId);
                locMastService.updateById(locMast);
            }
        } else {
            throw new CoolException("当前工作状态无法取消");
        }
        // 取消操作人员记录
        wrkMast.setManuType("手动取消");
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        if (!wrkMastService.updateById(wrkMast)) {
            throw new CoolException("取消任务失败");
        }
        // 保存工作主档历史档
        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
            throw new CoolException("保存任务历史档失败, workNo = " + wrkMast.getWrkNo());
        }
        // 删除工作主档
        boolean wrkMastRes = wrkMastService.deleteById(wrkMast);
        // 修改库位状态
        LocMast locMast = locMastService.selectById(locNo);
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("取消任务失败,库位不存在:" + locNo);
        }
        locMast.setLocSts(locSts);
        locMast.setModiTime(now);
        locMast.setModiUser(userId);
        boolean locMastRes = locMastService.updateById(locMast);
        if (!wrkMastRes || !locMastRes) {
            throw new CoolException("保存数据失败");
        }
        HashMap<String,Object> headParam = new HashMap<>();
        headParam.put("TaskNo",wrkMast.getTaskNo());
        headParam.put("Result",1);//取消
        try {
            String response;
            log.error("wcs手动取消任务上报wms={}", wrkMast);
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(wmsUrl)
                    .setPath(taskStatusFeedbackPath)
                    .setJson(JSON.toJSONString(headParam))
                    .build()
                    .doPost();
            apiLogService.save("wcs手动取消任务上报wms"
                    , wmsUrl + taskStatusFeedbackPath
                    , null
                    , "127.0.0.1"
                    , JSON.toJSONString(headParam)
                    , response
                    , true
            );
        } catch (Exception e) {
            log.error("wcs手动取消任务上报wms失败={}", wrkMast);
            log.error("wcs手动取消任务上报wms失败,报错信息:", e);
//                        throw new CoolException("wcs派发入库任务上报wms失败");
        }
//        Date now = new Date();
//        WrkMast wrkMast = wrkMastService.selectById(workNo);
//
//        String locNo = ""; // 待修改目标库位
//        String locSts = ""; // 待修改目标库位状态
//        // 入库取消(修改目标库位)
//        if (wrkMast.getWrkSts() < 4) {
//            locNo = wrkMast.getLocNo();
//            locSts = "O";
//
//            // 库位转移
//            if (wrkMast.getIoType() == 11) {
//                // 库位转移:源库位
//                LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
//                if (Cools.isEmpty(locMast)) {
//                    throw new CoolException("取消库位转移失败,源库位不存在:" + wrkMast.getSourceLocNo());
//                }
//                locMast.setLocSts(wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F");
//                locMast.setModiTime(now);
//                locMast.setModiUser(userId);
//                locMastService.updateById(locMast);
//            }
//            // 出库取消(修改源库位)
//        } else if (wrkMast.getWrkSts() > 10 && wrkMast.getWrkSts() != 14) {
//            locNo = wrkMast.getSourceLocNo();
//            // 出库 ===>> F.在库
//            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
//                locSts = "F";
//                // 空板出库 ===>> D.空桶/空栈板
//            } else if (wrkMast.getIoType() == 110) {
//                locSts = "D";
//                // 库位转移 ===>> D.空桶/空栈板
//            } else if (wrkMast.getIoType() == 11) {
//                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N") ? "D" : "F";
//                // 库位转移:目标库位
//                LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
//                if (Cools.isEmpty(locMast)) {
//                    throw new CoolException("取消库位转移失败,目标库位不存在:" + wrkMast.getSourceLocNo());
//                }
//                locMast.setLocSts("O");
//                locMast.setModiTime(now);
//                locMast.setModiUser(userId);
//                locMastService.updateById(locMast);
//            }
//        } else {
//            throw new CoolException("当前工作状态无法取消");
//        }
//        // 取消操作人员记录
//        wrkMast.setManuType("手动取消");
//        wrkMast.setModiUser(userId);
//        wrkMast.setModiTime(now);
//        if (!wrkMastService.updateById(wrkMast)) {
//            throw new CoolException("取消任务失败");
//        }
//        // 保存工作主档历史档
//        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
//            throw new CoolException("保存任务历史档失败, workNo = " + wrkMast.getWrkNo());
//        }
//
//        // 删除工作主档
//        boolean wrkMastRes = wrkMastService.deleteById(wrkMast);
//
//        // 修改库位状态
//        LocMast locMast = locMastService.selectById(locNo);
//        if (Cools.isEmpty(locMast)) {
//            throw new CoolException("取消任务失败,库位不存在:" + locNo);
//        }
//        locMast.setLocSts(locSts);
//        locMast.setModiTime(now);
//        locMast.setModiUser(userId);
//        boolean locMastRes = locMastService.updateById(locMast);
//        if (!wrkMastRes || !locMastRes) {
//            throw new CoolException("保存数据失败");
//        }
//        HashMap<String,Object> headParam = new HashMap<>();
//        headParam.put("TaskNo",wrkMast.getTaskNo());
//        headParam.put("Result",1);//取消
//
//        try {
//            String response;
//            log.error("wcs手动取消任务上报wms={}", wrkMast);
//
//            response = new HttpHandler.Builder()
//                    // .setHeaders(headParam)
//                    .setUri(wmsUrl)
//                    .setPath(taskStatusFeedbackPath)
//                    .setJson(JSON.toJSONString(headParam))
//                    .build()
//                    .doPost();
//            apiLogService.save("wcs手动取消任务上报wms"
//                    , wmsUrl + taskStatusFeedbackPath
//                    , null
//                    , "127.0.0.1"
//                    , JSON.toJSONString(headParam)
//                    , response
//                    , true
//            );
//        } catch (Exception e) {
//            log.error("wcs手动取消任务上报wms失败={}", wrkMast);
//            log.error("wcs手动取消任务上报wms失败,报错信息:", e);
////                        throw new CoolException("wcs派发入库任务上报wms失败");
//        }
    }
}
src/main/java/com/zy/asrs/task/AssignTasksRCSScheduler.java
@@ -32,35 +32,41 @@
    private String wcsmovePath;
    @Value("${wcs.outboundTaskRequest}")
    private String wcsoutboundTaskRequest;
    @Value("${wcs.inboundTaskApplyPathWcs}")
    private String inboundTaskApplyPathWcs;
    @Value("${wms.TaskExecCallback}")
    private String TaskExecCallback;
    @Value("${wms.taskStatusFeedbackPath}")
    private String taskStatusFeedbackPath;
    /**
     * 自动派发出库任务给RCS
     * 自动派发任务给RCS
     *
     * @throws IOException
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() throws IOException {
        if(true){
        if(false){
            List<TaskWrk> taskWrks=taskWrkService.selectList(new EntityWrapper<TaskWrk>()
                    .eq("wrk_sts",1).eq("io_type",3));
                    .eq("wrk_sts",1));
            for(TaskWrk taskWrk:taskWrks){
                HashMap<String, Object> headParam = new HashMap<>();
                String response = "";
                Boolean bool = false;
                String dz="";
                if(taskWrk.getIoType()==2){
                if(taskWrk.getIoType()==1){//入库
                    dz=inboundTaskApplyPathWcs;
                    headParam.put("sourceStaNo", taskWrk.getStartPoint());//源站
                    headParam.put("staNo", taskWrk.getTargetPoint());//目标站
                }else if(taskWrk.getIoType()==2){//出库
                    dz=wcsoutboundTaskRequest;
                }else{
                }else if(taskWrk.getIoType()==3){//移库
                    dz=wcsmovePath;
                    headParam.put("sourceLocNo",taskWrk.getStartPoint());//源库位
                }
                try {
                    headParam.put("taskNo", taskWrk.getTaskNo());
                    headParam.put("sourceLocNo",taskWrk.getStartPoint());//源库位
                    headParam.put("locNo",taskWrk.getTargetPoint());//目标库位
                    headParam.put("locNo",taskWrk.getOriginTargetPoint());//目标库位
                    log.info("wcs派发任务给RCS出库={}", taskWrk);
                    response = new HttpHandler.Builder()
                            // .setHeaders(headParam)
@@ -71,8 +77,14 @@
                            .doPost();
                    JSONObject jsonObject = JSON.parseObject(response);
                    if(jsonObject.get("code").equals(200)){
                        //派发出库任务给RCS==>成功下发出库任务
                        taskWrk.setWrkSts(2);
                        //派发任务给RCS==>成功下发出库任务
                        if(taskWrk.getIoType()==1){
                            taskWrk.setWrkSts(3);
                        }else if(taskWrk.getIoType()==2){
                            taskWrk.setWrkSts(12);
                        }else if(taskWrk.getIoType()==3){
                            taskWrk.setWrkSts(3);
                        }
                        taskWrkService.updateById(taskWrk);
                        bool = true;
                    }
src/main/java/com/zy/asrs/task/AutoReportStartHandler.java
@@ -102,7 +102,7 @@
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        Boolean bool = false;
                        if(jsonObject.get("ReturnStatus").equals(0)){
                        if(jsonObject.get("ReturnStatus").equals("0")){
                            bool = true;
                            taskWrk.setMarkStart(1);
                            taskWrk.setStatus(2);
src/main/java/com/zy/asrs/task/GetshuttlerStatusScheduler.java
New file
@@ -0,0 +1,94 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.BasDevp;
import com.zy.asrs.entity.BasShuttle;
import com.zy.asrs.entity.TaskWrk;
import com.zy.asrs.entity.param.GetShuttleStatusParam;
import com.zy.asrs.entity.param.Result;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.BasDevpService;
import com.zy.asrs.service.BasShuttleService;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
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.io.IOException;
import java.util.HashMap;
import java.util.List;
@Slf4j
@Component
public class GetshuttlerStatusScheduler {
    @Value("${wcs.urlWcs}")
    private String wcsUrl;
    @Value("${wcs.shuttleStatus}")
    private String shuttleStatus;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private BasShuttleService basShuttleService;
    /**
     * 获取rcs小车信息
     *
     * @throws IOException
     */
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() throws IOException {
        String response = "";
        Boolean bool = false;
        try {
//            log.info("wcs获取rcs小车信息");
            response = new HttpHandler.Builder()
                    // .setHeaders(headParam)
                    .setUri(wcsUrl)
                    .setPath(shuttleStatus)
                    .setJson(JSON.toJSONString(""))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.get("code").equals(200)) {
                JSONObject data = JSON.parseObject(jsonObject.get("data").toString());
                List<GetShuttleStatusParam> shuttles = JSON.parseArray(data.get("shuttle").toString(), GetShuttleStatusParam.class);
                for (GetShuttleStatusParam shuttle : shuttles) {
                    //对小车二维码进行处理
                    Integer lev=1;
                    //小车模式
                    Integer mode=0;
                    //小车是否在充电
                    Integer autoCharge=0;
                    if(!Cools.isEmpty(shuttle.getCurrentCode())){
                        JSONObject jsonObject1 = JSON.parseObject(shuttle.getCurrentCode());
                        lev=jsonObject1.getInteger("z");
                    }
                    if(!Cools.isEmpty(shuttle.getMode())){
                        mode=shuttle.getMode();
                    }
                    if(!Cools.isEmpty(shuttle.getHasCharge())&&shuttle.getHasCharge()){
                        mode=2;
                    }
                    BasShuttle shuttle1 = basShuttleService.selectOne(new EntityWrapper<BasShuttle>().eq("shuttle_no", shuttle.getShuttleNo()));
                    shuttle1.setStatus(mode);//小车模式
                    shuttle1.setShuttleStatus(shuttle.getProtocolStatus());//小车状态
                    shuttle1.setDeviceStatus(shuttle.getProtocolStatus$());//小车状态中文版
                    shuttle1.setChargeLine(lev);//小车所在层
                    shuttle1.setErrorCode(shuttle.getErrorCode());//异常码
                    basShuttleService.updateById(shuttle1);
                }
                bool = true;
            }
        } catch (Exception e) {
            log.error("wcs获取小车状态失败");
        }
    }
}
src/main/java/com/zy/asrs/task/RepositionLED.java
@@ -84,7 +84,7 @@
     * 上报WMS货物搬离
     * @throws IOException
     */
    @Scheduled(cron = "0/3 * * * * ? ")
//    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() throws IOException {
        List<TaskWrk> taskWrks=taskWrkService.selectList(new EntityWrapper<TaskWrk>().eq("wrk_sts",17));
        for(TaskWrk taskWrk:taskWrks){
src/main/java/com/zy/asrs/task/TaskLogScheduler.java
@@ -65,7 +65,13 @@
    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() throws IOException {
        //入库7转历史档,移库7转历史档,出库18转
        List<TaskWrk> taskWrkList = taskWrkService.selectList(new EntityWrapper<TaskWrk>().in("wrk_sts", 7,18));
        List<TaskWrk> taskWrkList = taskWrkService.selectList(new EntityWrapper<TaskWrk>()
                .in("wrk_sts", 7,17)
                .or()
                .in("status",5,7));//取消或者完结
        if(taskWrkList.size() == 0){
            return;
        }
        for (TaskWrk taskWrk : taskWrkList) {
            TaskWrkLog taskWrkLog = new TaskWrkLog(taskWrk);
            if(taskWrkLog.getIoType().equals(1)){
@@ -79,6 +85,16 @@
                }
            }else if(taskWrkLog.getIoType().equals(2)){
                BasDevp basDevp = basDevpService.selectOne(new EntityWrapper<BasDevp>().eq("wrk_no",taskWrk.getWrkNo()));
                if(taskWrk.getWrkNo()>=3001&&taskWrk.getWrkNo()<=6000){
                    taskWrkLog.setWrkSts(18);
                    taskWrkLog.setModiTime(new Date());
                    if (!wrkLogService.insert(taskWrkLog)) {
                        throw new CoolException("转历史档失败" + taskWrkLog);
                    }
                    if (!taskWrkService.deleteById(taskWrk)) {
                        throw new CoolException("任务档删除失败" + taskWrkLog);
                    }
                }
                if(basDevp==null){
                    HashMap<Object, Object> headParam = new HashMap<>();
                    String response = "";
@@ -95,6 +111,14 @@
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if(jsonObject.get("ReturnStatus").equals(0)){
                            taskWrkLog.setWrkSts(18);
                            taskWrkLog.setModiTime(new Date());
                            if (!wrkLogService.insert(taskWrkLog)) {
                                throw new CoolException("转历史档失败" + taskWrkLog);
                            }
                            if (!taskWrkService.deleteById(taskWrk)) {
                                throw new CoolException("任务档删除失败" + taskWrkLog);
                            }
                        }
                    } catch (Exception e){
                        log.error("wcs搬离出库给wms失败{},返回值={}", taskWrk, response);
src/main/java/com/zy/asrs/task/TaskMastScheduler.java
@@ -61,74 +61,45 @@
    public void execute() throws IOException {
        for (TaskWrk taskWrk : taskWrkService.selectToBeHistoryData()) {
            HashMap<String, Object> headParam = new HashMap<>();
            String s="";//日志标识
            String s = "";//日志标识
            if (taskWrk.getWrkSts() == 6) {//入库完成
                headParam.put("Result", 1);
                s="入库完成";
                taskWrk.setStatus(7);//入库任务转历史档6--》7
                s = "入库完成";
                taskWrk.setWrkSts(7);//入库任务转历史档6--》7
            } else if (taskWrk.getWrkSts() == 16) {//出库完成-待搬离
                headParam.put("Result", 1);
                s="出库完成-待搬离";
                s = "出库完成-待搬离";
                taskWrk.setWrkSts(17);//出库任务16--》17
            } else if (taskWrk.getWrkSts().equals(30)) {//取消
                s="取消";
            } else if (taskWrk.getStatus().equals(4)) {//取消任务上报wms
                s = "取消";
                taskWrk.setStatus(5);//取消任务
                headParam.put("Result", 2);
                taskWrk.setWrkSts(31);//取消任务30--》31
            } else if (taskWrk.getStatus().equals(6)) {//完结任务上报wms
                s = "手动完成";
                taskWrk.setStatus(7);//完结
                headParam.put("Result", 1);
            }
            String response = "";
            Boolean bool = false;
            try {
                headParam.put("TaskNo", taskWrk.getTaskNo());
                log.info("wcs"+s+"任务上报wms={}", taskWrk);
                log.info("wcs" + s + "任务上报wms={}", taskWrk);
                response = new HttpHandler.Builder()
                        // .setHeaders(headParam)
                        // .setHeaders(headPraam)
                        .setUri(wmsUrl)
                        .setPath(TaskExecCallback)
                        .setJson(JSON.toJSONString(headParam))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                Date date=new Date();
                if(jsonObject.get("ReturnStatus").equals(0)){
                    if(taskWrk.getIoType().equals(1)){//入库
                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());//目标库位
                        if(locMast != null){
                            locMast.setLocSts("F");
                            locMast.setBarcode(taskWrk.getBarcode());
                            locMast.setModiTime(date);
                            locMastService.updateById(locMast);
                        }
                    }else if(taskWrk.getIoType().equals(3)){//移库
                        LocMast locMast = locMastService.selectByLocNo(taskWrk.getTargetPoint());//目标库位
                        if(locMast != null){
                            locMast.setLocSts("F");
                            locMast.setBarcode(taskWrk.getBarcode());
                            locMast.setModiTime(date);
                            locMastService.updateById(locMast);
                        }
                        LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getStartPoint());//原始库位
                        if(locMast2 != null){
                            locMast2.setLocSts("O");
                            locMast2.setBarcode("");
                            locMast.setModiTime(date);
                            locMastService.updateById(locMast2);
                        }
                    }else if(taskWrk.getIoType().equals(2)){//出库
                        LocMast locMast2 = locMastService.selectByLocNo(taskWrk.getStartPoint());//原始库位
                        if(locMast2 != null){
                            locMast2.setLocSts("O");
                            locMast2.setBarcode("");
                            locMast2.setModiTime(date);
                            locMastService.updateById(locMast2);
                        }
                    }
                if (jsonObject.get("ReturnStatus").equals("0")) {
                    taskWrkService.updateById(taskWrk);
                    bool = true;
                }
            } catch (Exception e) {
                log.error("wcs"+s+"任务上报wms失败={},返回值={}", taskWrk, response);
                log.error("wcs" + s + "任务上报wms失败={},返回值={}", taskWrk, response);
            } finally {
                apiLogService.save("wcs"+s+"任务上报wms"
                apiLogService.save("wcs" + s + "任务上报wms"
                        , wmsUrl + TaskExecCallback
                        , null
                        , "127.0.0.1"
src/main/java/com/zy/asrs/utils/Utils.java
@@ -427,7 +427,12 @@
    }
    public static String Fusion(int x, int y, int z){
        String locNo="0"+x;
        String locNo ="";
        if(x>=10){
            locNo=x+"";
        }else{
            locNo="0"+x;
        }
        if(z>=10){
            locNo=locNo+"0"+z;
        }else{
src/main/java/com/zy/common/config/RedisConfig.java
@@ -5,6 +5,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
@@ -14,7 +15,7 @@
 * Redis配置类
 * Created by vincent on 2019-12-23
 */
//@Configuration
@Configuration
//@EnableCaching // 开启数据缓存机制
public class RedisConfig extends CachingConfigurerSupport {
src/main/java/com/zy/common/utils/HttpHandler.java
@@ -15,7 +15,7 @@
 */
public class HttpHandler {
    private static final Integer DEFAULT_TIMEOUT_SECONDS = 5;
    private static final Integer DEFAULT_TIMEOUT_SECONDS = 10;
    private static final MediaType MEDIA_TYPE = MediaType.parse("application/json");
    private String uri;
src/main/java/com/zy/core/MainProcess.java
@@ -36,7 +36,7 @@
                try {
                    // 间隔
                    Thread.sleep(1000);
                    Thread.sleep(500);
                    // 系统运行状态判断
                    if (!SystemProperties.WCS_RUNNING_STATUS.get()) {
@@ -47,12 +47,19 @@
//                    mainService.crnDemoOfLocMove1();
                    // 入库  ===>> 入库站到堆垛机站,根据条码扫描生成入库工作档
                    mainService.generateStoreWrkFile1(); // 组托
                    //入库  ===>> 空板入库
                    mainService.EmptyPlates();//空板入库
                    // 入出库  ===>>  调用RCS进行入出库
                    mainService.crnIoExecute();
                    // 出库  ===>>  堆垛机出库站到出库站
//                    mainService.crnStnToOutStn();
                    // 出库  ===>>  提升机出库站到出库站
                    mainService.crnStnToOutStn();
                    // 入库  ===>> 执行对工作档的完成操作
//                    mainService.storeFinished();
                    mainService.storeFinished();
                    // 入库  ===>> 拣料盘点再入库
                    mainService.stnToCrnStnPick(1);
                    mainService.scanForkLift();
                    // 堆垛机异常信息记录
//                    mainService.recCrnErr();
src/main/java/com/zy/core/thread/SiemensDevpThread.java
@@ -373,11 +373,11 @@
        //任务下发成功标识
        boolean writeFlag = false;
        while(writeCount < 5){
            OperateResult writeResult1 = siemensS7Net.Write("DB100." + index*6,  staProtocol.getWorkNo().intValue());    // 工作号
            OperateResult writeResult2 = siemensS7Net.Write("DB100." + (index*6+4), staProtocol.getStaNo());    // 目标站
            OperateResult writeResult1 = siemensS7Net.Write("DB1000." + index*8,  staProtocol.getWorkNo().intValue());    // 工作号
            OperateResult writeResult2 = siemensS7Net.Write("DB1000." + (index*8+4), staProtocol.getStaNo());    // 目标站
            if(writeResult1.IsSuccess && writeResult2.IsSuccess){
                Thread.sleep(200);
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB100." + index*6, (short)6);
                OperateResultExOne<byte[]> readResult = siemensS7Net.Read("DB1000." + index*8, (short)6);
                if(readResult.IsSuccess){
                    Integer workNo = siemensS7Net.getByteTransform().TransInt32(readResult.Content, 0);
                    short staNo = siemensS7Net.getByteTransform().TransInt16(readResult.Content, 4);
src/main/resources/application-prod.yml
@@ -21,6 +21,10 @@
      staNo: 100
    outSta[1]: #出库口2
      staNo: 200
    pickSta[0]:
      staNo: 100
    pickSta[1]:
      staNo: 200
  barcode[0]: #条码扫描仪
    port: 51236
    ip: 172.17.91.39
src/main/resources/application.yml
@@ -8,7 +8,7 @@
    name: @pom.build.finalName@
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=lfdwcs_sxc
    url: jdbc:sqlserver://192.168.0.17:1433;databasename=lfdwcs_sxc
    username: sa
    password: sa@123
  mvc:
@@ -16,7 +16,7 @@
  redis:
    host: localhost
    port: 6379
    database: 0
    database: 6
#    password: xltys1995
  profiles:
    active: prod
@@ -50,7 +50,7 @@
  #url: 10.32.53.195:8080
  # WMS系统ip
  #  url: 10.210.157.109:8090
  url: 127.0.0.1:8081
  url: 127.0.0.1:8081/lfdsxkwms
  # 入库任务申请接口
  #inboundTaskApplyPath: api/InterFace/inboundTaskApply
  inboundTaskApplyPath: rpc/pakin/loc/v1
@@ -63,11 +63,15 @@
  taskLeave : open/asrs/leave/task
  # 移库申请接口
  movePath: api/InterFace/get_InterFace_TestStorage
  # 拣料盘点回库上报
  returnWarehouse : rpc/pakin/loc/returnWarehouse
wcs:
  urlWcs: 127.0.0.1:9091/wcs
  urlWcs: 127.0.0.1:9091/rcs
  #入库任务申请
  inboundTaskApplyPathWcs: openapi/createInTask
  #出库任务申请
  outboundTaskRequest : openapi/createOutTask
  # 移库申请接口
  movePathWcs: openapi/createLocMoveTask
  # 获取小车信息
  shuttleStatus: openapi/deviceStatus
src/main/resources/mapper/BasShuttleMapper.xml
@@ -21,6 +21,7 @@
        <result column="run_speed" property="runSpeed" />
        <result column="device_status" property="deviceStatus" />
        <result column="disable_lev" property="disableLev" />
        <result column="errorCode" property="errorCode" />
    </resultMap>
src/main/resources/mapper/TaskWrkMapper.xml
@@ -25,6 +25,8 @@
        <result column="command_step" property="commandStep" />
        <result column="transfer_mark" property="transferMark" />
        <result column="mark_start" property="markStart"/>
        <result column="origin_start_point" property="originStartPoint"/>
        <result column="origin_target_point" property="originTargetPoint"/>
    </resultMap>
    
@@ -50,10 +52,10 @@
    <select id="selectPakIn" resultMap="BaseResultMap">
        select top 1 * from dbo.wcs_task_wrk
        where status=2
        and crn_no=#{crnNo}
        and wrk_no=#{workNo}
        and start_point=#{startPoint}
        and io_type=1
        and wrk_sts= 2
        order by io_pri desc,create_time,wrk_no ASC
    </select>
@@ -81,10 +83,8 @@
    <select id="selectPakOut" resultMap="BaseResultMap">
        select * from dbo.wcs_task_wrk
        where crn_no=#{crnNo}
        <if test="targetPoint!=null and targetPoint!='' ">
            and target_point=#{targetPoint}
        </if>
        where
            target_point=#{targetPoint}
        and wrk_sts=11
        and io_type = 2
        order by io_pri desc,create_time,wrk_no ASC
@@ -119,7 +119,7 @@
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
        select * from dbo.wcs_task_wrk
        where 1=1
        and (wrk_sts=16 or wrk_sts=7 or wrk_sts=30)
        and (wrk_sts=6 or wrk_sts=16 or status=4 or status=5)
        order by io_pri desc,create_time,wrk_no ASC
    </select>
src/main/webapp/static/wcs/images/logo.png

src/main/webapp/static/wms/image/logo.png