自动化立体仓库 - WMS系统
skyouc
2 天以前 d2b0cd7ae27bb7ea24549d6930a53cbb27c6e44a
no message
22个文件已添加
5个文件已修改
1422 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 372 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/AxisBean.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/CrnStatusType.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/CrnDemoParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/param/SystemSwitchParam.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/BarcodeDataVo.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CommandLogVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CrnDetailVo.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CrnLatestDataVo.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CrnMsgTableVo.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/CrnStateTableVo.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/LocChartPie.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/PlcErrorTableVo.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/ScaleDataVo.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteDetailVo.java 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/QueryCombParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/QueryTaskParam.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/StockOutParam.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 259 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -2,25 +2,25 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.plugins.Page;
import com.core.annotations.AppAuth;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Task;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.domain.dto.AxisBean;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.service.OpenService;
import com.zy.asrs.service.TaskService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.web.BaseController;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
/**
 * Created by vincent on 2022/4/8
@@ -37,89 +37,172 @@
    @Autowired
    private OpenService openService;
    @Autowired
    private TaskService taskService;
    private WrkMastService wrkMastService;
    @Autowired
    private WorkService workService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private LocDetlService locDetlService;
    @Autowired
    private MatService matService;
    @Autowired
    private WaitPakinService waitPakinService;
    @PostMapping("/agvPickupComplete/agvCallback")
    @AppAuth(memo = "AGV取货完成接口")
    public Map<String, Object> agvPickupComplete(@RequestBody AgvTaskParam agvTaskParam, HttpServletRequest request) {
        //        DecimalFormat df = new DecimalFormat("0000");
        //        String wrkNo = "Ctu"+df.format(param.getWrkNo())+date.getTime()/1000;
//        String wrkNo = agvTaskParam.getTaskCode().substring(3,7);
//        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("wrk_no", Integer.parseInt(wrkNo)));
        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("wrk_no", agvTaskParam.getTaskCode()));
        if (Cools.isEmpty(task)) {
            log.error("未查询到任务号对应的数据");
    /**
     * 组托查询接口
     */
    @PostMapping("/queryComb")
    public synchronized R queryComb(@RequestBody QueryCombParam param) {
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        task.setWrkSts(0L);
        taskService.updateById(task);
        if (Cools.isEmpty(param.getBarcode())) {
            return R.error("托盘码[barcode]不能为空");
        }
        List<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
        HashMap<String, Object> map = new HashMap<>();
        map.put("code","0");
        map.put("message","成功");
        map.put("reqCode", "");
        log.info("agv请求取货完成,wms任务号:"+ JSON.toJSONString(agvTaskParam));
        return map;
        map.put("barcode", param.getBarcode());
        map.put("combDetls", waitPakins);
        return R.ok().add(map);
    }
    @PostMapping("/agvTaskComplete/agvCallback")
    @AppAuth(memo = "AGV放货完成接口")
    public Map<String, Object> agvTaskComplete(@RequestBody AgvTaskParam agvTaskParam,HttpServletRequest request) {
        HashMap<String, Object> map = new HashMap<>();
//        String wrkNo = agvTaskParam.getTaskCode().substring(3,7);
//        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("wrk_no", Integer.parseInt(wrkNo)));
        Task task = taskService.selectOne(new EntityWrapper<Task>().eq("wrk_no", agvTaskParam.getTaskCode()));
        if (Cools.isEmpty(task)) {
            log.error("未查询到任务号对应的数据");
        }
        if (task.getIoType() < 100 ){
            task.setWrkSts(4L);
        }else {
            task.setWrkSts(14L);
        }
        taskService.updateById(task);
    /**
     * 库存信息查询接口
     */
    @GetMapping("/queryLoc")
    public synchronized R queryLoc() {
        List<Map<String, Object>> pie = new ArrayList<>();
        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
        map.put("code","0");
        map.put("message","成功");
        map.put("reqCode", "");
        return map;
        if (locUseRate != null) {
            Map<String, Object> map = new HashMap<>();
            map.put("name", "在库");
            map.put("value", locUseRate.getFqty());
            pie.add(map);
            Map<String, Object> map1 = new HashMap<>();
            map1.put("name", "空");
            map1.put("value", locUseRate.getOqty());
            pie.add(map1);
            Map<String, Object> map2 = new HashMap<>();
            map2.put("name", "使用");
            map2.put("value", locUseRate.getUqty());
            pie.add(map2);
            Map<String, Object> map3 = new HashMap<>();
            map3.put("name", "禁用");
            map3.put("value", locUseRate.getXqty());
            pie.add(map3);
    }
    @PostMapping("/order/matSync/default/v2")
//    @AppAuth(memo = "商品信息同步接口")
    public synchronized R syncMatInfoV2(@RequestHeader(required = false) String appkey,
                                      @RequestBody(required = false) MatSyncParam.MatParam param,
        // 总库位数
        Integer total = (int) Arith.add(0, locUseRate.getFqty(), locUseRate.getOqty(), locUseRate.getUqty(), locUseRate.getXqty());
        // 使用中
        Integer used = locUseRate.getFqty() + locUseRate.getUqty();
        // 库位使用率
        double usedDivides = Arith.divides(3, used, total);
        double usedPr = Arith.multiplys(1, usedDivides, 100);
        return R.ok(
                Cools.add("pie", pie)
                        .add("stockCount", locUseRate.getFqty())
                        .add("emptyCount", locUseRate.getOqty())
                        .add("disableCount", locUseRate.getXqty())
                        .add("total", total)
                        .add("used", used)
                        .add("usedPr", usedPr)
        );
    }
    @PostMapping("/order/adjustment/default/v1")
    public synchronized R adjustmentOrderCreate(@RequestHeader(required = false) String appkey,
                                                @RequestBody OpenAdjustmentOrderParam param,
                                      HttpServletRequest request){
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        MatSyncParam matSyncParam = new MatSyncParam();
        List<MatSyncParam.MatParam> objects = new ArrayList<>();
        objects.add(param);
        matSyncParam.matDetails = objects;
        openService.syncMat(matSyncParam);
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.adjustmentOrderCreate(param);
        return R.ok();
    }
    @GetMapping("/line/charts")
    public R locIoLineCharts(){
        Map<String,Object> map=new HashMap<String, Object>();
        List<AxisBean> list = new ArrayList<AxisBean>();
    @PostMapping("/queryTask")
    @ApiOperation("任务执行信息查询")
    public synchronized R queryTaskInfo(@RequestBody TvQueryParam param) {
        if (Objects.isNull(param)) {
            return R.error("参数不能为空!!");
        List<WorkChartAxis> listChart = reportQueryMapper.getChartAxis();
        if(listChart!=null) {
            ArrayList<Integer> data1 = new ArrayList<Integer>();
            ArrayList<Integer> data2 = new ArrayList<Integer>();
            SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd");
            Calendar calendar = Calendar.getInstance();
            calendar.add(Calendar.DATE, -12);
            for(int i=0;i<12;i++) {
                boolean flag = true;
                calendar.add(Calendar.DATE, 1);
                String str = sf.format(calendar.getTime());
                for(WorkChartAxis workChart : listChart) {
                    if(str.equals(workChart.getYmd())) {
                        data1.add(workChart.getInqty());
                        data2.add(workChart.getOutqty());
                        flag = false;
                        break;
        }
        return  openService.queryTaskInfo(param);
                }
                if(flag) {
                    data1.add(0);
                    data2.add(0);
                }
            }
            AxisBean inqty = new AxisBean();
            inqty.setName("入库数量");
            Integer[] array1 = new Integer[data1.size()];
            inqty.setData(data1.toArray(array1));
            list.add(inqty);
            AxisBean outqty = new AxisBean();
            outqty.setName("出库数量");
            Integer[] array2 = new Integer[data2.size()];
            outqty.setData(data2.toArray(array2));
            list.add(outqty);
        }
        map.put("rows",list);
        return R.ok(map);
    }
    @GetMapping("/locDetl/statistics")
    public R locDetlStatistics(){
        HashMap<String, Object> param = new HashMap<>();
        Page<LocDetl> stockStatis = locDetlService.getStockStatis(toPage(1, 100, param, LocDetl.class));
        for (LocDetl locDetl : stockStatis.getRecords()) {
            Mat mat = matService.selectByMatnr(locDetl.getMatnr());
            if (mat != null) {
                locDetl.sync(mat);
            }
        }
        return R.ok(stockStatis);
    }
    @PostMapping("/order/matSync/default/v1")
//    @AppAuth(memo = "商品信息同步接口")
    @AppAuth(memo = "商品信息同步接口")
    public synchronized R syncMatInfo(@RequestHeader(required = false) String appkey,
                                      @RequestBody(required = false) MatSyncParam param,
                                      HttpServletRequest request){
@@ -148,24 +231,6 @@
//        return R.ok();
//    }
    @PostMapping("/order/adjustment/default/v1")
    public synchronized R adjustmentOrderCreate(@RequestHeader(required = false) String appkey,
                                           @RequestBody OpenAdjustmentOrderParam param,
                                           HttpServletRequest request) {
        auth(appkey, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderDetails())) {
            return R.error("单据明细[orderDetails]不能为空");
        }
        openService.adjustmentOrderCreate(param);
        return R.ok();
    }
    /**
     * 添加入库单
     */
@@ -193,7 +258,7 @@
    /**
     * 入库单回写
     */
//    @PostMapping("/order/pakin/complete/default/v1")
    @PostMapping("/order/pakin/complete/default/v1")
    public synchronized R orderPakinComplete(@RequestHeader(required = false) String appkey,
                                             @RequestBody(required = false) OpenOrderCompleteParam param,
                                             HttpServletRequest request) {
@@ -213,6 +278,12 @@
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getLgort())) {
            return R.error("单据编号[lgort]不能为空");
        }
        if (!param.getLgort().equals("5006")) {
            return R.ok();
        }
        if (Cools.isEmpty(param.getOrderNo())) {
            return R.error("单据编号[orderNo]不能为空");
        }
@@ -229,7 +300,7 @@
    /**
     * 出库单回写
     */
//    @PostMapping("/order/pakout/complete/default/v1")
    @PostMapping("/order/pakout/complete/default/v1")
    public synchronized R orderPakoutComplete(@RequestHeader(required = false) String appkey,
                                              @RequestBody(required = false) OpenOrderCompleteParam param,
                                              HttpServletRequest request) {
@@ -301,4 +372,137 @@
        System.out.println(JSON.toJSONString(param1));
    }
    /*********************************同步物料档案和订单****************************************************/
    /*********************************wcs接口对接****************************************************/
    /**
     * 任务开始
     */
    @RequestMapping("/start/task")
    public HashMap<String, Object> startTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = map.get("TaskNo") + "";
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            map1.put("ReturnStatus", "1");
            map1.put("ErrorMessage", "任务号为空");
        } else {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
            if (wrkMast == null) {
                map1.put("ReturnStatus", "1");
                map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
            } else {
                if (wrkMast.getIoType() == 1||wrkMast.getIoType() == 57|| wrkMast.getIoType() == 53) {
                    wrkMast.setWrkSts(3L);//入库开始
                } else if (wrkMast.getIoType() == 11 ||wrkMast.getIoType() == 107|| wrkMast.getIoType() == 103 ) {
                    wrkMast.setWrkSts(13L);//出库开始
                }
                wrkMast.setModiTime(new Date());
                if (wrkMastService.updateById(wrkMast)) {
                    log.info("WMS任务开始更新"+wrkMast);
                    map1.put("ReturnStatus", "0");
                    map1.put("ErrorMessage", "");
                } else {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                }
            }
        }
        return map1;
    }
    /**
     * 搬运到目的地
     */
    @RequestMapping("/destination/task")
    public HashMap<String, Object> destinationTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = map.get("TaskNo") + "";
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            map1.put("ReturnStatus", "1");
            map1.put("ErrorMessage", "任务号为空");
        } else {
            //任务完成
            if (map.get("Result").equals(1)) {
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
                if (wrkMast == null) {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
                } else {
                    if (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10) {
                        wrkMast.setWrkSts(4L);//任务结束
                    } else if (wrkMast.getIoType() == 101) {
                        wrkMast.setWrkSts(13L);//出库到站点上
                    } else if (wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57) {
                        wrkMast.setWrkSts(4L);//4.任务结束
                    } else if (wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110) {
                        wrkMast.setWrkSts(14L);
                    }else if(wrkMast.getIoType() == 11) {
                        wrkMast.setWrkSts(4L);
                    }
                    wrkMast.setModiTime(new Date());
                    if (wrkMastService.update(wrkMast,new EntityWrapper<WrkMast>().eq("wrk_no",wrkMast.getWrkNo()))) {
                        log.info("WMS任务完成更新"+wrkMast);
                        map1.put("ReturnStatus", "0");
                        map1.put("ErrorMessage", "");
                    } else {
                        map1.put("ReturnStatus", "1");
                        map1.put("ErrorMessage", "更新任务状态失败" + wrkMast);
                    }
                }
            } else {
                //任务取消
                WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
                if (wrkMast == null) {
                    map1.put("ReturnStatus", "1");
                    map1.put("ErrorMessage", "没有找到该任务号:" + taskNo);
                    return map1;
                }
                workService.cancelWrkMast(String.valueOf(wrkMast.getWrkNo()),9999L);
                map1.put("ReturnStatus", "0");
                map1.put("ErrorMessage", "");
            }
        }
        return map1;
    }
    /**
     * 出库---目的地搬离
     */
    @RequestMapping("/leave/task")
    public R leaveTask(@RequestBody HashMap<String, Object> map) {
        String taskNo = String.valueOf(map.get("taskNo"));
        String status = String.valueOf(map.get("status"));
        HashMap<String, Object> map1 = new HashMap<>();
        if (Cools.isEmpty(taskNo)) {
            return R.error("任务号为空");
        } else {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", Integer.valueOf(taskNo)));
            if (wrkMast == null) {
                return R.error("没有找到该任务号:" + taskNo);
            }
            if (status.equals("complete")) {
                // 入库 + 库位转移
                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.setWrkSts(14L);//出库到站点上
                wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
                wrkMast.setCrnEndTime(now);
                wrkMast.setModiTime(now);
                wrkMastService.updateById(wrkMast);
                return R.ok();
            } else if (status.equals("cancel")) {
                workService.cancelWrkMast(taskNo, 9527L);
                return R.ok();
            }
        }
        return R.error();
    }
}
src/main/java/com/zy/asrs/domain/dto/AxisBean.java
New file
@@ -0,0 +1,24 @@
package com.zy.asrs.domain.dto;
/**
 * 曲线图表json键
 * @author admin
 *
 */
public class AxisBean {
    private String name;
    private Integer[] data;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Integer[] getData() {
        return data;
    }
    public void setData(Integer[] data) {
        this.data = data;
    }
}
src/main/java/com/zy/asrs/domain/dto/WorkChartAxis.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.domain.dto;
/**
 * 入出库统计曲线图
 * @author admin
 * @date 2018年12月12日
 */
public class WorkChartAxis {
    private String ymd;
    private int inqty;
    private int outqty;
    public String getYmd() {
        return ymd;
    }
    public void setYmd(String ymd) {
        this.ymd = ymd;
    }
    public int getInqty() {
        return inqty;
    }
    public void setInqty(int inqty) {
        this.inqty = inqty;
    }
    public int getOutqty() {
        return outqty;
    }
    public void setOutqty(int outqty) {
        this.outqty = outqty;
    }
}
src/main/java/com/zy/asrs/domain/enums/CrnStatusType.java
New file
@@ -0,0 +1,53 @@
package com.zy.asrs.domain.enums;
/**
 * 堆垛机状态枚举
 */
public enum CrnStatusType {
    // 入库
    MACHINE_PAKIN("入库"),
    // 出库
    MACHINE_PAKOUT("出库"),
    // 库到库
    MACHINE_STOCK_MOVE("库到库"),
    // 站到站
    MACHINE_SITE_MOVE("站到站"),
    // p to p
    MACHINE_P_MOVE("PToP"),
    // 异常
    MACHINE_ERROR("异常"),
    // 自动
    MACHINE_AUTO("自动"),
    // 非自动/手动
    MACHINE_UN_AUTO("非自动"),
    ;
    private String desc;
    CrnStatusType(String desc){
        this.desc = desc;
    }
    public String getDesc() {
        return desc;
    }
    public void setDesc(String desc) {
        this.desc = desc;
    }
    public static CrnStatusType process(Integer ioType){
        if (ioType>100) {
            return MACHINE_PAKOUT;
        } else if (ioType < 100 && ioType!=3 && ioType!=6 && ioType!=11) {
            return MACHINE_PAKIN;
        } else if (ioType == 3) {
            return MACHINE_SITE_MOVE;
        } else if (ioType == 11) {
            return MACHINE_STOCK_MOVE;
        } else {
            return MACHINE_ERROR;
        }
    }
}
src/main/java/com/zy/asrs/domain/enums/SiteStatusType.java
New file
@@ -0,0 +1,19 @@
package com.zy.asrs.domain.enums;
/**
 * 站点状态枚举
 */
public enum SiteStatusType {
    // 自动
    SITE_AUTO,
    // 非自动
    SITE_UNAUTO,
    // 自动+有物+ID
    SITE_AUTO_RUN_ID,
    // 自动+有物
    SITE_AUTO_RUN,
    // 自动+ID
    SITE_AUTO_ID,
}
src/main/java/com/zy/asrs/domain/enums/WorkNoType.java
New file
@@ -0,0 +1,48 @@
package com.zy.asrs.domain.enums;
import com.core.exception.CoolException;
/**
 * 工作号排序规则
 */
public enum WorkNoType {
    PAKIN(0),
    PICK(1),
    PAKOUT(2),
    OTHER(3),
    ;
    public Integer type;
    WorkNoType(Integer type) {
        this.type = type;
    }
    public static Integer getWorkNoType(Integer ioType) {
        switch (ioType) {
            case 1:
                return PAKIN.type;
            case 10:
                return PAKIN.type;
            case 11:
                return PICK.type;
            case 53:
            case 54:
            case 57:
                return PICK.type;
            case 101:
                return PAKOUT.type;
            case 103:
            case 104:
            case 107:
                return PICK.type;
            case 110:
                return PAKOUT.type;
            default:
                break;
        }
        throw new CoolException(ioType + "的任务类型无法生成工作号");
    }
}
src/main/java/com/zy/asrs/domain/param/CrnDemoParam.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.domain.param;
import lombok.Data;
/**
 * 堆垛机演示操作入参
 * Created by vincent on 2020-06-03
 */
@Data
public class CrnDemoParam {
    // 操作类型 1: 打开;  0: 关闭
    private Integer crnId;
    // 密码口令
    private String password;
    private Boolean opt;
}
src/main/java/com/zy/asrs/domain/param/CrnOperatorParam.java
New file
@@ -0,0 +1,38 @@
package com.zy.asrs.domain.param;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class CrnOperatorParam {
    // 堆垛机号
    private Integer crnNo;
    // 源站
    private Short sourceStaNo;
    // 源库位-排
    private Short sourceRow;
    // 源库位-列
    private Short sourceBay;
    // 源库位-层
    private Short sourceLev;
    // 目标站
    private Short staNo;
    // 目标库位-排
    private Short row;
    // 目标库位-列
    private Short bay;
    // 目标库位-层
    private Short lev;
}
src/main/java/com/zy/asrs/domain/param/SystemSwitchParam.java
New file
@@ -0,0 +1,30 @@
package com.zy.asrs.domain.param;
/**
 * 系统运行状态操作入参
 * Created by vincent on 2020-06-03
 */
public class SystemSwitchParam {
    // 操作类型 1: 打开;  0: 关闭
    private Integer operatorType;
    // 密码口令
    private String password;
    public Integer getOperatorType() {
        return operatorType;
    }
    public void setOperatorType(Integer operatorType) {
        this.operatorType = operatorType;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
}
src/main/java/com/zy/asrs/domain/vo/BarcodeDataVo.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * 扫码器实时数据视图对象
 * Created by vincent on 2020-06-03
 */
@Data
public class BarcodeDataVo {
    // 扫码器编号
    private Integer barcodeId;
    // 扫码器内容
    private String codeValue;
}
src/main/java/com/zy/asrs/domain/vo/CommandLogVo.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class CommandLogVo {
    // 堆垛机编号
    private Integer crnNo;
    // 状态
    private Integer status;
    // 命令报文
    private String command;
}
src/main/java/com/zy/asrs/domain/vo/CrnDetailVo.java
New file
@@ -0,0 +1,42 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * 堆垛机详情视图对象
 * Created by vincent on 2020-06-03
 */
@Data
public class CrnDetailVo {
    // 堆垛机号
    private Integer crnNo;
    // 工作号
    private Short workNo;
    // 源站
    private String sourceStaNo = "";
    // 目标站
    private String staNo = "";
    // 工作状态
    private String wrkSts = "";
    // 出入类型
    private String ioType = "";
    // 源库位
    private String sourceLocNo = "";
    // 目标库位
    private String locNo = "";
    // 堆垛机状态
    private String crnStatus = "";
    // 异常
    private String error = "";
}
src/main/java/com/zy/asrs/domain/vo/CrnLatestDataVo.java
New file
@@ -0,0 +1,28 @@
package com.zy.asrs.domain.vo;
import com.zy.asrs.domain.enums.CrnStatusType;
import lombok.Data;
/**
 * 堆垛机最新数据视图对象
 * Created by vincent on 2020-06-01
 */
@Data
public class CrnLatestDataVo {
    // 堆垛机编号
    private Integer crnId;
    // 偏移量
    private Double offset;
    // 当前列
    private Short bay;
    private CrnStatusType crnStatus;
    public String getCrnStatus(){
        return crnStatus.toString().toLowerCase().replaceAll("_", "-");
    }
}
src/main/java/com/zy/asrs/domain/vo/CrnMsgTableVo.java
New file
@@ -0,0 +1,90 @@
package com.zy.asrs.domain.vo;
import com.zy.asrs.utils.Utils;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class CrnMsgTableVo {
    // 堆垛机号
    private Integer crnNo;
    // 工作号
    private Short workNo = 0;
    // 状态
    private String status = "-";
    // 源站
    private String sourceStaNo = "-";
    // 目标站
    private String staNo = "-";
    // 源库位
    private String sourceLocNo = "-";
    // 目标库位
    private String locNo = "-";
    // 异常
    private String error = "";
    // 原点
    private String origin = "";
    // 命令
    private String command = "";
    // 走行速度(m/min)
    private Float xspeed = 0.0F;
    // 升降速度(m/min)
    private Float yspeed = 0.0F;
    // 叉牙速度(m/min)
    private Float zspeed = 0.0F;
    // 走行距离(Km)
    private Float xdistance = 0.0F;
    // 升降距离(Km)
    private Float ydistance = 0.0F;
    // 走行时长(H)
    private Float xduration = 0.0F;
    // 升降时长(H)
    private Float yduration = 0.0F;
    public void setXspeed(Float xspeed) {
        this.xspeed = Utils.scale(xspeed);
    }
    public void setYspeed(Float yspeed) {
        this.yspeed = Utils.scale(yspeed);
    }
    public void setZspeed(Float zspeed) {
        this.zspeed = Utils.scale(zspeed);
    }
    public void setXdistance(Float xdistance) {
        this.xdistance = Utils.scale(xdistance);
    }
    public void setYdistance(Float ydistance) {
        this.ydistance = Utils.scale(ydistance);
    }
    public void setXduration(Float xduration) {
        this.xduration = Utils.scale(xduration);
    }
    public void setYduration(Float yduration) {
        this.yduration = Utils.scale(yduration);
    }
}
src/main/java/com/zy/asrs/domain/vo/CrnStateTableVo.java
New file
@@ -0,0 +1,65 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class CrnStateTableVo {
    // 堆垛机号
    private Integer crnNo;
    // 模式
    private String statusType = "-";
    // 有物
    private String loading = "-";
    // 列
    private Short bay;
    // 层
    private Short lev;
    // 走行原点
    private String xOrigin = "-";
    // 升降原点
    private String yOrigin = "-";
    // 货叉位置
    private String forkOffset = "-";
    // 载货台位置
    private String liftPos = "-";
    // 走行定位
    private String walkPos = "-";
    // 急停
    private String stop = "-";
    // 列坐标
    private String bayCoor = "-";
    // 层坐标
    private String levCoor = "-";
    // 完成
    private String complete = "-";
    // 任务号
    private Short workNo = 0;
    // 状态
    private String status = "-";
    // 异常码
    private String warnCode = "-";
    // 垂直故障码
    private String alarm = "-";
}
src/main/java/com/zy/asrs/domain/vo/LocChartPie.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.domain.vo;
/**
 * 库位占用百分比
 * @author admin
 * @date 2018年12月12日
 */
public class LocChartPie {
    private int fqty;
    private int oqty;
    private int uqty;
    private int xqty;
    public int getFqty() {
        return fqty;
    }
    public void setFqty(int fqty) {
        this.fqty = fqty;
    }
    public int getOqty() {
        return oqty;
    }
    public void setOqty(int oqty) {
        this.oqty = oqty;
    }
    public int getUqty() {
        return uqty;
    }
    public void setUqty(int uqty) {
        this.uqty = uqty;
    }
    public int getXqty() {
        return xqty;
    }
    public void setXqty(int xqty) {
        this.xqty = xqty;
    }
}
src/main/java/com/zy/asrs/domain/vo/PlcErrorTableVo.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class PlcErrorTableVo {
    // 序号
    private Integer no;
    // plc异常描述
    private String plcDesc;
    // 异常
    private String error;
}
src/main/java/com/zy/asrs/domain/vo/ScaleDataVo.java
New file
@@ -0,0 +1,18 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * 磅秤实时数据视图对象
 * Created by vincent on 2020-06-03
 */
@Data
public class ScaleDataVo {
    // 磅秤编号
    private Integer scaleId;
    // 磅秤内容
    private String value;
}
src/main/java/com/zy/asrs/domain/vo/SiteDetailVo.java
New file
@@ -0,0 +1,47 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * 输送设备详情视图对象
 * Created by vincent on 2020-06-03
 */
@Data
public class SiteDetailVo {
    // 站点编号
    private Integer siteId;
    // 工作号
    private Short workNo;
    // 工作状态
    private String wrkSts = "";
    // 自动
    private String autoing;
    // 有物
    private String loading;
    // 能入
    private String canining;
    // 能出
    private String canouting;
    // 出入类型
    private String ioType = "";
    // 源站
    private String sourceStaNo = "";
    // 目标站
    private String staNo = "";
    // 源库位
    private String sourceLocNo = "";
    // 目标库位
    private String locNo = "";
}
src/main/java/com/zy/asrs/domain/vo/SiteLatestDataVo.java
New file
@@ -0,0 +1,29 @@
package com.zy.asrs.domain.vo;
import com.zy.asrs.domain.enums.SiteStatusType;
import lombok.Data;
/**
 * 站点最新数据视图对象
 * Created by vincent on 2020-06-01
 */
@Data
public class SiteLatestDataVo {
    // 站点编号
    private String siteId;
    // 工作号
    private Short workNo;
    // 站点状态
    private SiteStatusType siteStatus;
    // 隔壁站点(台车特性)
    private String nearbySta;
    public String getSiteStatus() {
        return siteStatus.toString().toLowerCase().replaceAll("_", "-");
    }
}
src/main/java/com/zy/asrs/domain/vo/SiteTableVo.java
New file
@@ -0,0 +1,40 @@
package com.zy.asrs.domain.vo;
import lombok.Data;
/**
 * Created by vincent on 2020-06-02
 */
@Data
public class SiteTableVo {
    // 站号
    private Integer devNo;
    // 工作号
    private Short workNo = 0;
    // 自动
    private String autoing = "-";
    // 有物
    private String loading = "-";
    // 可入
    private String inEnable = "-";
    // 可出
    private String outEnable = "-";
    // 需求1
    private String pakMk = "-";
    // 空板信号
    private String emptyMk = "-";
    // 目标站
    private Short staNo = 0;
    //高低库位
    private String locType1 = "-";
}
src/main/java/com/zy/asrs/entity/param/QueryCombParam.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class QueryCombParam {
    private String barcode;
}
src/main/java/com/zy/asrs/entity/param/QueryTaskParam.java
New file
@@ -0,0 +1,10 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class QueryTaskParam {
    private String taskNo;
}
src/main/java/com/zy/asrs/entity/param/StockOutParam.java
@@ -1,7 +1,5 @@
package com.zy.asrs.entity.param;
import com.baomidou.mybatisplus.annotations.TableField;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@@ -32,47 +30,6 @@
        // 数量
        private Double count;
        private String brand;
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        private String standby1 = "";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        private String standby2 = "";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        private String standby3 = "";
        /**
         * 备用1
         */
        @ApiModelProperty(value= "备用1")
        @TableField("box_type1")
        private String boxType1 = "1";
        /**
         * 备用2
         */
        @ApiModelProperty(value= "备用2")
        @TableField("box_type2")
        private String boxType2 = "1";
        /**
         * 备用3
         */
        @ApiModelProperty(value= "备用3")
        @TableField("box_type3")
        private String boxType3 = "1";
    }
src/main/java/com/zy/asrs/mapper/ReportQueryMapper.java
@@ -23,6 +23,9 @@
    //不分页查询所有信息,用于excel导出
    public List<ViewStayTimeBean> getViewStayTimeAll(ViewStayTimeBean viewStayTime);
////    // 库位Map
//    @Select("select distinct row1 from asr_loc_mast order by row1 asc")
//    List<Integer> getViewLocRowTotal();
//    // 库位Map
    @Select("select distinct row1 from asr_loc_mast order by row1 asc")
    List<Integer> getViewLocRowTotal();
src/main/java/com/zy/asrs/service/OpenService.java
@@ -1,6 +1,5 @@
package com.zy.asrs.service;
import com.core.common.R;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
@@ -46,11 +45,4 @@
    void syncMat(MatSyncParam param);
    void adjustmentOrderCreate(OpenAdjustmentOrderParam param);
    /**
     * 查询执行任务信息
     * @param param
     * @return
     */
    R queryTaskInfo(TvQueryParam param);
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -3,7 +3,6 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.R;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
@@ -15,7 +14,6 @@
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.OrderInAndOutUtil;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
import lombok.extern.slf4j.Slf4j;
@@ -23,8 +21,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.math.BigDecimal;
import java.util.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
 * Created by vincent on 2022/4/9
@@ -53,12 +52,8 @@
    private TagMapper tagMapper;
    @Autowired
    private CheckOrderDetlService checkOrderDetlService;
    @Autowired
    private CheckOrderService checkOrderService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Override
    @Transactional
@@ -104,8 +99,7 @@
                now,    // 添加时间
                9527L,    // 修改人员
                now,    // 修改时间
                null,   // 备注
                1
                null    // 备注
        );
        if (!orderService.insert(order)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
@@ -114,9 +108,9 @@
        List<DetlDto> list = new ArrayList<>();
        List<DetlDto> orderDetails = param.getOrderDetails();
        for (DetlDto detail : orderDetails) {
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(),detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme(), detail.getThreeCode());
            if (DetlDto.hasLineNumber(list, dto)) {
                DetlDto detlDto = DetlDto.findLineNumber(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getStandby1(),dto.getStandby2(),dto.getStandby3(),dto.getLineNumber(),dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
            } else {
@@ -130,13 +124,8 @@
            }
            OrderDetl orderDetl = new OrderDetl();
            orderDetl.sync(mat);
            orderDetl.setLineNumber(detlDto.getLineNumber());
            orderDetl.setBatch(detlDto.getBatch());
            orderDetl.setAnfme(detlDto.getAnfme());
            orderDetl.setBrand(detlDto.getBrand());
            orderDetl.setStandby1(detlDto.getStandby1());
            orderDetl.setStandby2(detlDto.getStandby2());
            orderDetl.setStandby3(detlDto.getStandby3());
            orderDetl.setOrderId(order.getId());
            orderDetl.setOrderNo(order.getOrderNo());
            orderDetl.setCreateBy(9527L);
@@ -145,7 +134,6 @@
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
            orderDetl.setPakinPakoutStatus(1);
            if (!orderDetlService.insert(orderDetl)) {
                throw new CoolException("生成单据明细失败,请联系管理员");
            }
@@ -159,9 +147,6 @@
        if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) {
            // 指定订单
            Order order = orderService.selectByNo(param.getOrderNo());
//            Order order = OrderInAndOutUtil.selectByNo(Boolean.TRUE,param.getOrderNo());
            if (null != order) {
                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
                results.add(result);
@@ -169,27 +154,19 @@
                result.setOrderTime(order.getOrderTime());
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
//                List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),
                            orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getLineNumber(),
                            orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3(), orderDetl.getQty(), orderDetl.getThreeCode()));
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                if (order.getSettle() == 4L) {
                    // 修改订单状态 4.完成 ===>> 6.已上报
//                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
//                        throw new CoolException("服务器内部错误,请联系管理员");
//                    }
                    OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(), 6L, null);
                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                }
            }
        } else {
            // 所有订单
//            List<Order> orders = orderService.selectBySettle(4L);
            List<Order> orders = OrderInAndOutUtil.selectBySettle(null, 4L);
            if (orders.isEmpty()){
                orders = new ArrayList<>();
            }
            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
            for (Order order : orders) {
                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
                results.add(result);
@@ -197,20 +174,13 @@
                result.setOrderTime(order.getOrderTime());
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
//                List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),
                            orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getLineNumber(),
                            orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3(),
                            orderDetl.getQty(), orderDetl.getThreeCode()));
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
//                // 修改订单状态 4.完成 ===>> 6.已上报
//                if (!orderService.updateSettle(order.getId(), 6L, null)) {
//                    throw new CoolException("服务器内部错误,请联系管理员");
//                }
                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(),6L,null);
                // 修改订单状态 4.完成 ===>> 6.已上报
                if (!orderService.updateSettle(order.getId(), 6L, null)) {
                    throw new CoolException("服务器内部错误,请联系管理员");
                }
            }
        }
        return results;
@@ -264,8 +234,7 @@
                now,    // 添加时间
                9527L,    // 修改人员
                now,    // 修改时间
                null,    // 备注
                2
                null    // 备注
        );
        if (!orderService.insert(order)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
@@ -274,11 +243,9 @@
        List<DetlDto> list = new ArrayList<>();
        List<DetlDto> orderDetails = param.getOrderDetails();
        for (DetlDto detail : orderDetails) {
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(),detail.getBrand(),detail.getStandby1(),detail.getStandby2(),detail.getStandby3(),detail.getLineNumber(),
                    detail.getBoxType1(),detail.getBoxType2(),detail.getBoxType3(), detail.getAnfme(), detail.getThreeCode());
            if (DetlDto.hasLineNumber(list, dto)) {
                DetlDto detlDto = DetlDto.findLineNumber(list, dto.getMatnr(), dto.getBatch(),dto.getBrand(),dto.getStandby1(),dto.getStandby2(),dto.getStandby3(),dto.getLineNumber(),
                        dto.getBoxType1(),dto.getBoxType2(),dto.getBoxType3());
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
            } else {
@@ -292,13 +259,8 @@
            }
            OrderDetl orderDetl = new OrderDetl();
            orderDetl.sync(mat);
            orderDetl.setLineNumber(detlDto.getLineNumber());
            orderDetl.setBatch(detlDto.getBatch());
            orderDetl.setAnfme(detlDto.getAnfme());
            orderDetl.setBrand(detlDto.getBrand());
            orderDetl.setStandby1(detlDto.getStandby1());
            orderDetl.setStandby2(detlDto.getStandby2());
            orderDetl.setStandby3(detlDto.getStandby3());
            orderDetl.setOrderId(order.getId());
            orderDetl.setOrderNo(order.getOrderNo());
            orderDetl.setCreateBy(9527L);
@@ -307,7 +269,6 @@
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
            orderDetl.setPakinPakoutStatus(2);
            if (!orderDetlService.insert(orderDetl)) {
                throw new CoolException("生成单据明细失败,请联系管理员");
            }
@@ -320,7 +281,6 @@
        if (!Cools.isEmpty(param) && !Cools.isEmpty(param.getOrderNo())) {
            // 指定订单
            Order order = orderService.selectByNo(param.getOrderNo());
//            Order order = OrderInAndOutUtil.selectByNo(Boolean.FALSE, param.getOrderNo());
            if (null != order) {
                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
                results.add(result);
@@ -328,24 +288,19 @@
                result.setOrderTime(order.getOrderTime());
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
//                List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(),order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getBrand(),
                            orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getLineNumber(),
                            orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3(), orderDetl.getQty(), orderDetl.getThreeCode()));
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                if (order.getSettle() == 4L) {
                    // 修改订单状态 4.完成 ===>> 6.已上报
//                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
//                        throw new CoolException("服务器内部错误,请联系管理员");
//                    }
                    OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(),6L,null);
                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                }
            }
        } else {
            // 所有订单
//            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
            List<Order> orders = OrderInAndOutUtil.selectBySettle(null, 4L);
            List<Order> orders = orderService.selectList(new EntityWrapper<Order>().eq("settle", 4L));
            for (Order order : orders) {
                OpenOrderCompeteResult result = new OpenOrderCompeteResult();
                results.add(result);
@@ -353,17 +308,13 @@
                result.setOrderTime(order.getOrderTime());
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
//                List<OrderDetl> orderDetls = OrderInAndOutUtil.selectByOrderId(order.getPakinPakoutStatus$(), order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(),orderDetl.getBrand(),
                            orderDetl.getStandby1(),orderDetl.getStandby2(),orderDetl.getStandby3(),orderDetl.getLineNumber(),
                            orderDetl.getBoxType1(),orderDetl.getBoxType2(),orderDetl.getBoxType3(), orderDetl.getQty(), orderDetl.getThreeCode()));
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                // 修改订单状态 4.完成 ===>> 6.已上报
//                if (!orderService.updateSettle(order.getId(), 6L, null)) {
//                    throw new CoolException("服务器内部错误,请联系管理员");
//                }
                OrderInAndOutUtil.updateOrder(order.getPakinPakoutStatus$(),order.getId(),6L,null);
                if (!orderService.updateSettle(order.getId(), 6L, null)) {
                    throw new CoolException("服务器内部错误,请联系管理员");
                }
            }
        }
        return results;
@@ -475,7 +426,6 @@
                tagId = tagService.getTop().getId();
            }
            mat.setTagId(tagId);
            mat.setLocType(tagId);
            mat.setMatnr(analyse.getMatnr());
            mat.setMaktx(param.getMaterialName());
            mat.setSpecs(param.getConfigureDesc());
@@ -487,6 +437,65 @@
                throw new CoolException("服务器内部错误,请联系管理员");
            } else {
                log.info("打包上线添加新物料[商品编号:{}]", mat.getMatnr());
            }
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void adjustmentOrderCreate(OpenAdjustmentOrderParam param) {
        if(Cools.isEmpty(param.getOrderNo())){
            String prefix = "";
            DocType docType = docTypeService.selectById(param.getOrderNo());
            if(!Cools.isEmpty(docType)){
                prefix = "Adjust";
            }
            param.setOrderNo(prefix + snowflakeIdWorker.nextId());
        }
        CheckOrder checkOrder = checkOrderService.selectOne(new EntityWrapper<CheckOrder>().eq("order_no", param.getOrderNo()) );
        if (checkOrder != null) {
            throw new CoolException("单据已存在");
        }
        Date now = new Date();
        checkOrder = new CheckOrder();
        checkOrder.setOrderNo(param.getOrderNo());
        checkOrder.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        checkOrder.setOrderTime( DateUtils.convert(now));
        checkOrder.setDocType(Long.valueOf(OrderTypeEnum.ADJUSTMENT.type));
        checkOrder.setSettle(1L);
        checkOrder.setCreateBy(9527L);
        checkOrder.setCreateTime(now);
        checkOrder.setUpdateBy(9527L);
        checkOrder.setUpdateTime(now);
        checkOrder.setStatus(1);
        if (!checkOrderService.insert(checkOrder)) {
            throw new CoolException("保存调整单主单失败");
        }
        for (CheckOrderDetl checkOrderDetl1 : param.getOrderDetails()) {
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>()
                    .eq("matnr", checkOrderDetl1.getMatnr())
                    .eq("loc_no", checkOrderDetl1.getLocNo())
                    .eq("batch", checkOrderDetl1.getBatch())
            );
            if (Cools.isEmpty(locDetl)) {
                throw new CoolException("未找到库存明细,请检查库存");
            }
            CheckOrderDetl checkOrderDetl = new CheckOrderDetl();
            checkOrderDetl.sync(locDetl);
            checkOrderDetl.setLocDetlId(locDetl.getId());
            checkOrderDetl.setOrderId(checkOrder.getId());
            checkOrderDetl.setOrderNo(checkOrder.getOrderNo());
            checkOrderDetl.setAnfme(checkOrderDetl1.getAnfme());
            checkOrderDetl.setDiffQty(checkOrderDetl1.getDiffQty());
            checkOrderDetl.setWorkQty(checkOrderDetl1.getWorkQty());
            checkOrderDetl.setStatus(checkOrderDetl1.getStatus().equals(1)? CheckStatusEnum.ALLOW.type:CheckStatusEnum.FORBID.type);
            checkOrderDetl.setZpallet(locDetl.getZpallet());
            checkOrderDetl.setCreateTime(now);
            checkOrderDetl.setUpdateTime(now);
            if (!checkOrderDetlService.insert(checkOrderDetl)) {
                throw new CoolException("保存调整单明细失败");
            }
        }
    }
@@ -575,14 +584,13 @@
                } else {
                    tagId = tagService.getTop().getId();
                }
                mat.sync(matParam);
                mat.sync(param);
//            mat.setMatnr(param.getMatnr());
//            mat.setMaktx(param.getMaktx());
//            mat.setSpecs(param.getSpecs());
//            mat.setModel(param.getModel());
                mat.setTagId(tagId);
                mat.setLocType(tagId);
                mat.setStatus(1);
                mat.setCreateTime(now);
                mat.setUpdateTime(now);
@@ -592,94 +600,13 @@
                    log.info("同步新物料[商品编号:{}]", mat.getMatnr());
                }
            } else {
                mat.sync(matParam);
                mat.sync(param);
                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr",matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                }
            }
        }
    }
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void adjustmentOrderCreate(OpenAdjustmentOrderParam param) {
        if(Cools.isEmpty(param.getOrderNo())){
            String prefix = "";
            DocType docType = docTypeService.selectById(param.getOrderNo());
            if(!Cools.isEmpty(docType)){
                prefix = "Adjust";
            }
            param.setOrderNo(prefix + snowflakeIdWorker.nextId());
        }
        CheckOrder checkOrder = checkOrderService.selectOne(new EntityWrapper<CheckOrder>().eq("order_no", param.getOrderNo()) );
        if (checkOrder != null) {
            throw new CoolException("单据已存在");
        }
        Date now = new Date();
        checkOrder = new CheckOrder();
        checkOrder.setOrderNo(param.getOrderNo());
        checkOrder.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        checkOrder.setOrderTime( DateUtils.convert(now));
        checkOrder.setDocType(Long.valueOf(OrderTypeEnum.ADJUSTMENT.type));
        checkOrder.setSettle(1L);
        checkOrder.setCreateBy(9527L);
        checkOrder.setCreateTime(now);
        checkOrder.setUpdateBy(9527L);
        checkOrder.setUpdateTime(now);
        checkOrder.setStatus(1);
        if (!checkOrderService.insert(checkOrder)) {
            throw new CoolException("保存调整单主单失败");
        }
        for (CheckOrderDetl checkOrderDetl1 : param.getOrderDetails()) {
            LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>()
                    .eq("matnr", checkOrderDetl1.getMatnr())
                    .eq("loc_no", checkOrderDetl1.getLocNo())
                    .eq("batch", checkOrderDetl1.getBatch())
            );
            if (Cools.isEmpty(locDetl)) {
                throw new CoolException("未找到库存明细,请检查库存");
            }
            CheckOrderDetl checkOrderDetl = new CheckOrderDetl();
            checkOrderDetl.sync(locDetl);
            checkOrderDetl.setLocDetlId(locDetl.getId());
            checkOrderDetl.setOrderId(checkOrder.getId());
            checkOrderDetl.setOrderNo(checkOrder.getOrderNo());
            checkOrderDetl.setAnfme(checkOrderDetl1.getAnfme());
            checkOrderDetl.setDiffQty(checkOrderDetl1.getDiffQty());
            checkOrderDetl.setWorkQty(checkOrderDetl1.getWorkQty());
            checkOrderDetl.setStatus(checkOrderDetl1.getStatus().equals(1)?CheckStatusEnum.ALLOW.type:CheckStatusEnum.FORBID.type);
            checkOrderDetl.setZpallet(locDetl.getZpallet());
            checkOrderDetl.setCreateTime(now);
            checkOrderDetl.setUpdateTime(now);
            if (!checkOrderDetlService.insert(checkOrderDetl)) {
                throw new CoolException("保存调整单明细失败");
            }
        }
    }
    /**
     * 查询任务档信息
     * @param param
     * @return
     */
    @Override
    public R queryTaskInfo(TvQueryParam param) {
        if (param.getTaskNo().equals("agv")) {
            return R.ok();
        } else {
            WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>().eq("wrk_no", param.getTaskNo()));
            if (Objects.isNull(wrkMast)) {
                throw new CoolException("任务信息不存在!!");
            }
            List<WrkDetl> detls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
            Map<String, Object> wrkast =  new HashMap<>();
            wrkast.put("wrkDetls", detls);
            return R.ok().add(wrkast);
        }
    }
}