自动化立体仓库 - WMS系统
pang.jiabao
4 天以前 d18505cc87fa30a5b202057bbcc4236986efc80a
纽维盛wms初始化-截至现在wms2.0已完善(带数据库)
10个文件已删除
55个文件已修改
7个文件已添加
2545 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MatController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 194 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderDetlPakinController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OrderPakinController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WaitPakinController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/WorkController.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetlPakin.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetlPakinLog.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetlPakoutLog.java 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderPakinLog.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderPakoutLog.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/TaskLog.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakinLog.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMast.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkMastLog.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java 2 ●●● 补丁 | 查看 | 原始文档 | 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/mapper/LocMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/ApiLogService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WorkService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/ApiLogServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/StaDescServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/BareBoardScheduler.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/CheckDeepScheduler.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/LocMoveAllScheduler.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 24 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/PlcLogScheduler.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WcsScheduler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java 89 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/BareBoardHandler.java 147 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/CheckDeepHandler.java 255 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/LocMoveAllHandler.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakinMoveHistoryHandler.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakinSyncHandler.java 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakoutMoveHistoryHandler.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderPakoutSyncHandler.java 77 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/PlcLogHandler.java 39 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WcsSchedulerHandler.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/Utils.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/config/AdminInterceptor.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/StartupDto.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/service/CommonService.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/AuthController.java 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 352 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/GetLocNoChangeParam.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/NotifyDto.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/SearchLocParam.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/controller/UserController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/AbstractServerInfos.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/timer/LoadingConfigTimer.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application-dev.yml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlPakinMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/apiLog/apiLog.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/waitPakinLog/waitPakinLog.js 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/apiLog/apiLog.html 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/login.html 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
version/bak/nwswms.bak 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MatController.java
@@ -63,8 +63,7 @@
    public R pdaSearch(@RequestParam(required = false) String condition) {
        EntityWrapper<Mat> wrapper = new EntityWrapper<>();
        if (!Cools.isEmpty(condition)) {
//            wrapper.like("matnr", condition).or().like("maktx", condition);
            wrapper.like("matnr", condition).or().like("specs", condition);
            wrapper.like("matnr", condition).or().like("maktx", condition);
        }
        wrapper.orderBy("create_time", false);
        List<Mat> mats = matService.selectList(wrapper);
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,24 +1,25 @@
package com.zy.asrs.controller;
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.param.MatSyncParam;
import com.zy.asrs.entity.param.OpenOrderCompleteParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
import com.zy.asrs.service.OpenService;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.text.SimpleDateFormat;
import java.util.*;
/**
 * Created by vincent on 2022/4/8
@@ -35,6 +36,180 @@
    @Autowired
    private OpenService openService;
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private WrkDetlService wrkDetlService;
    @Resource
    private WaitPakinService waitPakinService;
    @Resource
    private ReportQueryMapper reportQueryMapper;
    @Resource
    private LocDetlService locDetlService;
    @Resource
    private MatService matService;
    /**
     * 任务查询接口
     */
    @PostMapping("/queryTask")
    public synchronized R queryTask(@RequestBody QueryTaskParam param) {
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getTaskNo())) {
            return R.error("任务号[taskNo]不能为空");
        }
        WrkMast wrkMast = wrkMastService.selectById(param.getTaskNo());
        if (wrkMast == null) {
            return R.error("任务不存在");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(Integer.valueOf(param.getTaskNo()));
        HashMap<String, Object> map = new HashMap<>();
        map.put("taskNo", param.getTaskNo());
        map.put("ioType", wrkMast.getIoType());
        map.put("wrkDetls", wrkDetls);
        return R.ok().add(map);
    }
    /**
     * 组托查询接口
     */
    @PostMapping("/queryComb")
    public synchronized R queryComb(@RequestBody QueryCombParam param) {
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        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("barcode", param.getBarcode());
        map.put("combDetls", waitPakins);
        return R.ok().add(map);
    }
    /**
     * 库存信息查询接口
     */
    @GetMapping("/queryLoc")
    public synchronized R queryLoc() {
        List<Map<String, Object>> pie = new ArrayList<>();
        LocChartPie locUseRate = reportQueryMapper.getLocUseRate();
        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);
        }
        // 总库位数
        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)
        );
    }
    @GetMapping("/line/charts")
    public R locIoLineCharts(){
        Map<String,Object> map=new HashMap<String, Object>();
        List<AxisBean> list = new ArrayList<AxisBean>();
        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;
                    }
                }
                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/v2")
//    @AppAuth(memo = "商品信息同步接口")
@@ -55,7 +230,7 @@
    }
    @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) {
@@ -88,6 +263,7 @@
     * 添加入库单
     */
    @PostMapping("/order/pakin/default/v1")
    @AppAuth(memo = "ERP同步入库单")
    public synchronized R pakinOrderCreate(@RequestHeader(required = false) String appkey,
                                           @RequestBody OpenOrderPakinParam param,
                                           HttpServletRequest request) {
src/main/java/com/zy/asrs/controller/OrderController.java
@@ -14,6 +14,8 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.util.*;
@RestController
@@ -38,6 +40,25 @@
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Resource
    private OrderDetlPakinService orderDetlPakinService;
    @RequestMapping(value = "/order/list/orderNo")
    public R orderListorderNo(@RequestParam String orderNo) {
        //数量修改成为完成数量
        List<OrderDetlPakin> orderDetl1 = orderDetlPakinService.selectList(new EntityWrapper<OrderDetlPakin>().eq("order_no", orderNo));
        List<OrderDetlPakin> orderDetls= new ArrayList<>();
        for (OrderDetlPakin o: orderDetl1) {
            BigDecimal c1 = new BigDecimal(o.getEnableQty()).setScale(2,BigDecimal.ROUND_HALF_UP);
            o.setAnfme(c1.doubleValue());
            if (c1.doubleValue() == 0.0){
                continue;
            }
            orderDetls.add(o);
        }
        return R.ok(orderDetls);
    }
    @RequestMapping(value = "/order/nav/list/auth")
    @ManagerAuth
    public R navList(@RequestParam(required = false) String orderNo) {
src/main/java/com/zy/asrs/controller/OrderDetlPakinController.java
@@ -69,7 +69,11 @@
                wrapper.ge(entry.getKey(), DateUtils.convert(dates[0]));
                wrapper.le(entry.getKey(), DateUtils.convert(dates[1]));
            } else {
                wrapper.like(entry.getKey(), val);
                if (entry.getKey().equals("order_id")) {
                    wrapper.eq(entry.getKey(),val);
                } else {
                    wrapper.like(entry.getKey(), val);
                }
            }
        }
    }
src/main/java/com/zy/asrs/controller/OrderPakinController.java
@@ -1,5 +1,6 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
@@ -45,7 +46,7 @@
    @RequestMapping(value = "/order/nav/list/auth")
    @ManagerAuth
    public R navList(@RequestParam(required = false) String orderNo) {
    public R navList(@RequestParam(required = false) String orderNo){
        EntityWrapper<OrderPakin> wrapper = new EntityWrapper<>();
        if (!Cools.isEmpty(orderNo)) {
            wrapper.like("order_no", orderNo);
@@ -53,7 +54,7 @@
        wrapper.le("settle", 2).eq("status", 1);
        wrapper.orderBy("create_time", false);
        List<OrderPakin> orders = orderService.selectList(wrapper);
        // 保留出库单
        // 保留入库单
        if (!Cools.isEmpty(orders)) {
            Iterator<OrderPakin> iterator = orders.iterator();
            while (iterator.hasNext()) {
@@ -61,14 +62,20 @@
                if (order.getDocType() != null) {
                    DocType docType = docTypeService.selectById(order.getDocType());
                    if (docType != null) {
                        if (docType.getPakout() == 0) {
                        if (docType.getPakout() == 1) {
                            iterator.remove();
                        }
                    }
                }
            }
        }
        return R.ok().add(orders);
        JSONArray jsonArray = new JSONArray();
        for(OrderPakin orderPakin: orders) {
            JSONObject object = new JSONObject();
            object.put("order_no",orderPakin.getOrderNo());
            jsonArray.add(object);
        }
        return R.ok().add(jsonArray);
    }
    @RequestMapping(value = "/order/head/page/auth")
src/main/java/com/zy/asrs/controller/OutController.java
@@ -146,7 +146,7 @@
                        locDto.setBoxType2(orderDetl.getBoxType2());
                        locDto.setBoxType3(orderDetl.getBoxType3());
                        locDtos.add(locDto);
                        exist.add(locDetl.getLocNo());
                        exist.add(locDetl.getLocNo() + "_" + locDetl.getMatnr() + "_" + locDetl.getBatch());
                        // 剩余待出数量递减
                        issued = issued - locDetl.getAnfme();
                    } else {
@@ -216,8 +216,8 @@
        }
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId());
//            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(taskDto.getStaNo(), taskDto, getUserId());
        }
        return R.ok();
    }
src/main/java/com/zy/asrs/controller/WaitPakinController.java
@@ -112,7 +112,7 @@
                }
            }
        }
        return R.ok();
        return R.ok("删除成功");
    }
    @RequestMapping(value = "/waitPakin/export/auth")
src/main/java/com/zy/asrs/controller/WorkController.java
@@ -18,10 +18,7 @@
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.*;
/**
 * 工作流接口控制器
@@ -51,20 +48,23 @@
    @ManagerAuth()
    public R availableTakeSite() {
        List<Map<String, Object>> result = new ArrayList<>();
        List<Integer> outSite = basDevpService.getAvailableOutSite(101);
        for (Integer siteId : outSite) {
//        List<Integer> outSite = basDevpService.getAvailableOutSite(101);
//        for (Integer siteId : outSite) {
        List<Integer> siteList = Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408);
        for (Integer site : siteList) {
            Map<String, Object> map = new HashMap<>();
            map.put("siteId", siteId);
            map.put("desc", siteId + "(全板出库口)");
            map.put("siteId", site);
            map.put("desc", site + "(出库口)");
            result.add(map);
        }
        List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103);
        for (Integer siteId : pickOutSite) {
            Map<String, Object> map = new HashMap<>();
            map.put("siteId", siteId);
            map.put("desc", siteId + "(拣料出库口)");
            result.add(map);
        }
//        }
//        List<Integer> pickOutSite = basDevpService.getAvailableOutSite(103);
//        for (Integer siteId : pickOutSite) {
//            Map<String, Object> map = new HashMap<>();
//            map.put("siteId", siteId);
//            map.put("desc", siteId + "(拣料出库口)");
//            result.add(map);
//        }
        return R.ok().add(result);
    }
@@ -78,13 +78,15 @@
    @RequestMapping("/available/take/check/site")
    @ManagerAuth()
    public R availableTakeCheckSite() {
        return R.ok().add(basDevpService.getAvailableOutSite(107));
          return R.ok(Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408));
//        return R.ok().add(basDevpService.getAvailableOutSite(107));
    }
    @RequestMapping("/available/empty/take/site")
    @ManagerAuth()
    public R availableEmptyTakeSite() {
        return R.ok().add(basDevpService.getAvailableEmptyOutSite());
        return R.ok(Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408));
//        return R.ok().add(basDevpService.getAvailableEmptyOutSite());
    }
    @RequestMapping("/full/store/put/start")
@@ -174,7 +176,7 @@
    @ManagerAuth(memo = "生成任务")
    public R createWaitPainWrkMastStart(@RequestBody List<WaitPakin> list) {
        StartupDto startupDto = workService.createWaitPainWrkMastStart(list, getUserId());
        return R.ok("任务号:" + startupDto.getWorkNo() + ";目标库位:" + startupDto.getLocNo());
        return R.ok("任务号:" + startupDto.getTaskNo() + ";目标库位:" + startupDto.getLocNo());
    }
    @RequestMapping("/deal/preHave/start")
src/main/java/com/zy/asrs/entity/OrderDetlPakin.java
@@ -529,7 +529,7 @@
    public Double getEnableQty() {
        if (null != this.anfme && this.workQty != null) {
            return this.anfme - this.workQty;
            return this.anfme - this.workQty - this.qty;
        }
        return null;
    }
src/main/java/com/zy/asrs/entity/OrderDetlPakinLog.java
@@ -23,7 +23,7 @@
import java.util.Objects;
@Data
@TableName("man_order_detl_pakin_log")
@TableName("man_order_detl_log_pakin")
public class OrderDetlPakinLog implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -32,7 +32,7 @@
     * ID
     */
    @ApiModelProperty(value = "ID")
    @TableId(value = "id", type = IdType.AUTO)
    @TableId(value = "id")
    private Long id;
    /**
@@ -186,12 +186,12 @@
    @ApiModelProperty(value = "重量")
    private Double weight;
    /**
     * 长度
     */
    @ApiModelProperty(value = "长度")
    @TableField("man_length")
    private Double manLength;
//    /**
//     * 长度
//     */
//    @ApiModelProperty(value = "长度")
//    @TableField("man_length")
//    private Double manLength;
    /**
     * 体积
@@ -379,7 +379,7 @@
        this.itemNum = itemNum;
        this.safeQty = safeQty;
        this.weight = weight;
        this.manLength = manLength;
//        this.manLength = manLength;
        this.volume = volume;
        this.threeCode = threeCode;
        this.supp = supp;
src/main/java/com/zy/asrs/entity/OrderDetlPakoutLog.java
@@ -22,7 +22,7 @@
import java.util.Date;
@Data
@TableName("man_order_detl_pakout_log")
@TableName("man_order_detl_log_pakout")
public class OrderDetlPakoutLog implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -31,7 +31,7 @@
     * ID
     */
    @ApiModelProperty(value = "ID")
    @TableId(value = "id", type = IdType.AUTO)
    @TableId(value = "id")
    private Long id;
    /**
@@ -185,12 +185,12 @@
    @ApiModelProperty(value = "重量")
    private Double weight;
    /**
     * 长度
     */
    @ApiModelProperty(value = "长度")
    @TableField("man_length")
    private Double manLength;
//    /**
//     * 长度
//     */
//    @ApiModelProperty(value = "长度")
//    @TableField("man_length")
//    private Double manLength;
    /**
     * 体积
@@ -378,7 +378,7 @@
        this.itemNum = itemNum;
        this.safeQty = safeQty;
        this.weight = weight;
        this.manLength = manLength;
//        this.manLength = manLength;
        this.volume = volume;
        this.threeCode = threeCode;
        this.supp = supp;
src/main/java/com/zy/asrs/entity/OrderPakinLog.java
@@ -20,7 +20,7 @@
import java.util.Date;
@Data
@TableName("man_order_pakin_log")
@TableName("man_order_log_pakin")
public class OrderPakinLog implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -29,7 +29,7 @@
     * ID
     */
    @ApiModelProperty(value = "ID")
    @TableId(value = "id", type = IdType.AUTO)
    @TableId(value = "id")
    private Long id;
    /**
src/main/java/com/zy/asrs/entity/OrderPakoutLog.java
@@ -20,7 +20,7 @@
import java.util.Date;
@Data
@TableName("man_order_pakout_log")
@TableName("man_order_log_pakout")
public class OrderPakoutLog implements Serializable {
    private static final long serialVersionUID = 1L;
@@ -29,7 +29,7 @@
     * ID
     */
    @ApiModelProperty(value = "ID")
    @TableId(value = "id", type = IdType.AUTO)
    @TableId(value = "id")
    private Long id;
    /**
src/main/java/com/zy/asrs/entity/TaskLog.java
@@ -466,7 +466,7 @@
        WrkMastService service = SpringUtils.getBean(WrkMastService.class);
        WrkMast wrkMast = service.selectById(this.wrkNo);
        if (!Cools.isEmpty(wrkMast)) {
            return String.valueOf(wrkMast.getId());
            return String.valueOf(wrkMast.getWrkNo());
        }
        return null;
    }
src/main/java/com/zy/asrs/entity/WaitPakinLog.java
@@ -7,6 +7,8 @@
import com.core.common.SpringUtils;
import com.zy.asrs.service.BasProcessProceduresService;
import com.zy.asrs.service.BasQualityTestingService;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -275,6 +277,15 @@
        return this.boxType1;
    }
    public String getAppeUser$() {
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)) {
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public String getBoxType2$() {
        BasQualityTestingService service = SpringUtils.getBean(BasQualityTestingService.class);
        BasQualityTesting basQualityTesting = service.selectOne(new EntityWrapper<BasQualityTesting>().eq("box_type", this.boxType1));
src/main/java/com/zy/asrs/entity/WrkMast.java
@@ -22,14 +22,11 @@
    private static final long serialVersionUID = 1L;
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 工作号
     */
    @ApiModelProperty(value = "工作号")
    @TableField("wrk_no")
    @TableId(value = "wrk_no", type = IdType.INPUT)
    private Integer wrkNo;
    @ApiModelProperty("任务类型: agv, crn")
@@ -398,7 +395,7 @@
        if (!Cools.isEmpty(basDevp)) {
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
        return this.staNo;
    }
    public String getSourceStaNo$() {
@@ -407,7 +404,7 @@
        if (!Cools.isEmpty(basDevp)) {
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
        return this.sourceStaNo;
    }
    public String getSourceLocNo$() {
src/main/java/com/zy/asrs/entity/WrkMastLog.java
@@ -403,7 +403,7 @@
        if (!Cools.isEmpty(basDevp)) {
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
        return String.valueOf(this.staNo);
    }
    public String getSourceStaNo$() {
@@ -412,7 +412,7 @@
        if (!Cools.isEmpty(basDevp)) {
            return String.valueOf(basDevp.getDevNo());
        }
        return null;
        return String.valueOf(this.sourceStaNo);
    }
    public String getSourceLocNo$() {
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java
@@ -33,7 +33,7 @@
        /**
         * 商品分类
         */
        private String groupCode;
        private String groupCode = "全部";
        /**
         * 分类名称
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/mapper/LocMastMapper.java
@@ -64,4 +64,6 @@
     * @return 库位号
     */
    String findFirstFrozenLocNo(@Param("locNoList") List<String> locNoList);
    List<LocMast> selectLocByTypeAndRowsToList(@Param("locType") Integer locType,@Param("rows") List<Integer> rows);
}
src/main/java/com/zy/asrs/service/ApiLogService.java
@@ -7,6 +7,8 @@
    void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success);
    void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success, String error);
    boolean clearWeekBefore();
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -19,7 +19,7 @@
    List<OpenOrderCompeteResult> pakinOrderComplete(OpenOrderCompleteParam param);
    /**
     * 添加入库单
     * 添加出库单
     */
    void pakoutOrderCreate(OpenOrderPakoutParam param);
src/main/java/com/zy/asrs/service/WorkService.java
@@ -40,9 +40,9 @@
     * @param locDetls 待出库物料
     * @param ioType   入出库类型
     */
    void stockOut(BasDevp staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
    void stockOut(Integer staNo, List<LocDetlDto> locDetls, IoWorkType ioWorkType, Long userId);
    void stockOut(BasDevp staNo, TaskDto taskDto, Long userId);
    void stockOut(Integer staNo, TaskDto taskDto, Long userId);
    /**
     * 空板入库
src/main/java/com/zy/asrs/service/impl/ApiLogServiceImpl.java
@@ -44,6 +44,31 @@
        }
    }
    @Async
    @Override
    public void save(String namespace, String url, String appkey, String ip, String request, String response, boolean success,String error) {
        Date now = new Date();
        ApiLog apiLog = new ApiLog(
                String.valueOf(snowflakeIdWorker.nextId()),    // 日志编号
                namespace,    // 名称空间
                url,    // 接口地址
                appkey,    // 平台密钥
                String.valueOf(now.getTime()),    // 时间戳
                ip,    // 客户端IP
                request,    // 请求内容
                response,
                error,    // 异常内容
                success ? 1 : 0,    // 结果
                1,    // 状态
                now,    // 添加时间
                null,    // 修改时间
                null    // 备注
        );
        if (!this.insert(apiLog)) {
            log.error("接口调用日志保存失败!");
        }
    }
    @Override
    public boolean clearWeekBefore() {
        return this.baseMapper.clearWeekBefore() > 0;
src/main/java/com/zy/asrs/service/impl/BasDevpServiceImpl.java
@@ -49,21 +49,24 @@
            throw new CoolException(devpNo + "站点不存在");
        }
        if (pakin) {
            if (station.getAutoing() == null || !station.getAutoing().equals("Y")) {
                throw new CoolException(devpNo + "站点不是自动状态");
            if(station.getCanining()==null || !station.getAutoing().equals("Y")) {
                throw new CoolException(devpNo+"站点不是能入状态");
            }
            if (station.getLoading() == null || !station.getLoading().equals("Y")) {
                throw new CoolException(devpNo + "站点无物");
            }
            if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) {
                throw new CoolException(devpNo + "站点已有工作号");
            }
//            if (station.getAutoing() == null || !station.getAutoing().equals("Y")) {
//                throw new CoolException(devpNo + "站点不是自动状态");
//            }
//            if (station.getLoading() == null || !station.getLoading().equals("Y")) {
//                throw new CoolException(devpNo + "站点无物");
//            }
//            if (station.getWrkNo() != null && station.getWrkNo() > 0 && station.getWrkNo() < 9990) {
//                throw new CoolException(devpNo + "站点已有工作号");
//            }
//            if(!station.getInEnable().equals("Y")) {
//                throw new CoolException(devpNo+"站点不是可入状态");
//            }
            if (wrkMastService.getWorkingMast(devpNo) > 0) {
                throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档");
            }
//            if (wrkMastService.getWorkingMast(devpNo) > 0) {
//                throw new CoolException(devpNo + "站点不能同时生成两笔入库工作档");
//            }
        }
        return station;
    }
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -562,22 +562,22 @@
            throw new CoolException(BaseRes.PARAM);
        }
        Integer suplus = null;
        if (loadingConfigTimer.getZpalletManage()) {
            BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode()));
            if (Objects.isNull(container)) {
                throw new CoolException("数据错误:容器码不存在!!");
            }
            if (container.getMixMax() < param.getCombMats().size()) {
                throw new CoolException("超出容器最大混装数量,当前容器最大数量为:" + container.getMixMax() + "!!");
            }
            Set<String> matnrs = param.getCombMats().stream().map(CombParam.CombMat::getMatnr).collect(Collectors.toSet());
            List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs));
            Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet());
            if (tagIds.size() > 1) {
                throw new CoolException("组托物料类型不一致,只有相同的物料分类才可以组托!!");
            }
            suplus = container.getMixMax();
        }
//        if (loadingConfigTimer.getZpalletManage()) {
//            BasContainer container = basContainerService.selectOne(new EntityWrapper<BasContainer>().eq("barcode", param.getBarcode()));
//            if (Objects.isNull(container)) {
//                throw new CoolException("数据错误:容器码不存在!!");
//            }
//            if (container.getMixMax() < param.getCombMats().size()) {
//                throw new CoolException("超出容器最大混装数量,当前容器最大数量为:" + container.getMixMax() + "!!");
//            }
//            Set<String> matnrs = param.getCombMats().stream().map(CombParam.CombMat::getMatnr).collect(Collectors.toSet());
//            List<Mat> mats = matService.selectList(new EntityWrapper<Mat>().in("matnr", matnrs));
//            Set<Long> tagIds = mats.stream().map(Mat::getTagId).collect(Collectors.toSet());
//            if (tagIds.size() > 1) {
//                throw new CoolException("组托物料类型不一致,只有相同的物料分类才可以组托!!");
//            }
//            suplus = container.getMixMax();
//        }
        // 判断是否有相同条码的数据
        if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
@@ -599,7 +599,7 @@
        Date now = new Date();
        // 无单组托
        if (Cools.isEmpty(param.getOrderNo())) {
        if (Cools.isEmpty(param.getCombMats().get(0).getOrderNo())) {
            // 生成入库通知档
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
@@ -619,9 +619,9 @@
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
                }
//                if (mat.getUpQty().compareTo(detlDto.getAnfme()) < 0) {
//                    throw new CoolException("物料:" + detlDto.getMatnr() + "单次最大组托上限为:" + mat.getUpQty());
//                }
                WaitPakin waitPakin = new WaitPakin();
                BeanUtils.copyProperties(mat, waitPakin);
                waitPakin.setBatch(detlDto.getBatch());
@@ -646,10 +646,14 @@
                if (Cools.isEmpty(order) || order.getSettle() > 2) {
                    throw new CoolException("单据编号已过期");
                }
                // 订单明细数量校验
                OrderDetlPakin detls = orderDetlPakinService.selectOne(new EntityWrapper<OrderDetlPakin>()
                Wrapper<OrderDetlPakin> wrapper = new EntityWrapper<OrderDetlPakin>()
                        .eq("order_id", order.getId())
                        .eq("matnr", elem.getMatnr()));
                        .eq("matnr", elem.getMatnr());
                if(!Cools.isEmpty(elem.getBatch())) {
                    wrapper.eq("batch",elem.getBatch());
                }
                // 订单明细数量校验
                OrderDetlPakin detls = orderDetlPakinService.selectOne(wrapper);
                if (Objects.isNull(detls)) {
                    throw new CoolException("数据错误:单据明细不存在!!");
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -489,15 +489,15 @@
                // 分类
                Long tagId;
                // 一级分类
                if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) {
                    Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2);
                if (!Cools.isEmpty(matParam.getGroupName())) {
                    Tag priTag = tagService.selectByName(matParam.getGroupName(), 2);
                    if (priTag == null) {
                        Tag top = tagService.getTop();
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(top.getId());
                        priTag = new Tag(
                                null,    // 编号
                                matParam.getGroupCode(),    // 名称
                                matParam.getGroupName(),    // 名称
                                top.getId(),    // 父级
                                top.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
@@ -521,36 +521,36 @@
                        }
                    }
                    // 二级分类
                    Tag secTag = tagService.selectByName(matParam.getGroupName(), 3);
                    if (secTag == null) {
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(priTag.getId());
                        secTag = new Tag(
                                null,    // 编号
                                matParam.getGroupName(),    // 名称
                                priTag.getId(),    // 父级
                                priTag.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
                                nodeUtils.pathName.toString(),    // 关联路径名
                                0,    // 类型
                                null,    // 负责人
                                null,    // 图片
                                null,    // 简要描述
                                null,    // 数量
                                3,    // 等级
                                null,    // 排序
                                1,    // 状态
                                now,    // 添加时间
                                null,    // 添加人员
                                now,    // 修改时间
                                null,    // 修改人员
                                null    // 备注
                        );
                        if (tagMapper.insert(secTag) == 0) {
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                    }
                    tagId = secTag.getId();
//                    Tag secTag = tagService.selectByName(matParam.getGroupName(), 3);
//                    if (secTag == null) {
//                        NodeUtils nodeUtils = new NodeUtils();
//                        nodeUtils.executePath(priTag.getId());
//                        secTag = new Tag(
//                                null,    // 编号
//                                matParam.getGroupName(),    // 名称
//                                priTag.getId(),    // 父级
//                                priTag.getName(),    // 父级名称
//                                nodeUtils.path.toString(),    // 关联路径
//                                nodeUtils.pathName.toString(),    // 关联路径名
//                                0,    // 类型
//                                null,    // 负责人
//                                null,    // 图片
//                                null,    // 简要描述
//                                null,    // 数量
//                                3,    // 等级
//                                null,    // 排序
//                                1,    // 状态
//                                now,    // 添加时间
//                                null,    // 添加人员
//                                now,    // 修改时间
//                                null,    // 修改人员
//                                null    // 备注
//                        );
//                        if (tagMapper.insert(secTag) == 0) {
//                            throw new CoolException("服务器内部错误,请联系管理员");
//                        }
//                    }
                    tagId = priTag.getId();
                } else {
                    tagId = tagService.getTop().getId();
                }
src/main/java/com/zy/asrs/service/impl/StaDescServiceImpl.java
@@ -10,6 +10,7 @@
import com.zy.asrs.service.StaDescService;
import org.springframework.stereotype.Service;
import java.util.Arrays;
import java.util.List;
@Service("staDescService")
@@ -17,7 +18,8 @@
    @Override
    public List<Integer> queryOutStaNosByLocNo(String locNo, Integer typeNo) {
        return this.baseMapper.queryOutStaNosByLocNo(locNo, typeNo);
        return Arrays.asList(1101, 1201, 1206, 1301, 1306, 1408);
//        return this.baseMapper.queryOutStaNosByLocNo(locNo, typeNo);
    }
    @Override
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -119,7 +119,7 @@
            throw new CoolException("查询库位失败!!==》startupFullPutStore ==》 commonService.getLocNo");
        }
        // 生成工作号
        int workNo = dto.getWorkNo();
        int workNo = dto.getTaskNo();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
@@ -184,7 +184,7 @@
    @Transactional
    public void startupFullTakeStore(StockOutParam param, Long userId) {
        // 目标站点状态检测
        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
//        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
@@ -204,7 +204,7 @@
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
            if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D")) {
                // 启动出库开始 101.出库
                stockOut(staNo, locDetlDtos, null, userId);
                stockOut(param.getOutSite(), locDetlDtos, null, userId);
            } else {
                throw new CoolException("所选库位存在状态不为F、D的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$());
            }
@@ -293,7 +293,7 @@
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
    public void stockOut(Integer outSta, List<LocDetlDto> locDetlDtos, IoWorkType ioWorkType, Long userId) {
        Date now = new Date();
        // 合并同类项
        Set<String> locNos = new HashSet<>();
@@ -325,14 +325,14 @@
            // 获取库位
            LocMast locMast = locMastService.selectById(dto.getLocNo());
            Integer outSta = staNo.getDevNo();
//            Integer outSta = staNo.getDevNo();
//            //2号堆垛机全板出库站指定为204站,拣料站指定为202
//            if(locMast.getCrnNo()==2){
//                outSta = ioType == 101 ? 204 : 202;
//            }
            // 获取路径
            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
//            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            // 生成工作档
@@ -343,8 +343,8 @@
            wrkMast.setIoType(ioType); // 入出库状态
            wrkMast.setIoPri(13D); // 优先级:13
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
            wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
            wrkMast.setSourceStaNo("0"); // 源站
            wrkMast.setStaNo(String.valueOf(outSta)); // 目标站
            wrkMast.setSourceLocNo(dto.getLocNo()); // 源库位
            wrkMast.setFullPlt("Y"); // 满板:Y
            wrkMast.setPicking("N"); // 拣料
@@ -396,7 +396,7 @@
    @Override
    @Transactional
    public void stockOut(BasDevp staNo, TaskDto taskDto, Long userId) {
    public void stockOut(Integer staNo, TaskDto taskDto, Long userId) {
        Date now = new Date();
        List<LocDto> locDtos = taskDto.getLocDtos();
        for (LocDto locDto : locDtos) {
@@ -410,7 +410,7 @@
        String orderNo = taskDto.getLocDtos().get(0).getOrderNo();
        OrderPakout orderPakout = orderPakoutService.selectByNo(orderNo);
        int ioType = orderPakout.getDocType() == 8 ? 107 : (taskDto.isAll() ? 101 : 103);
        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
//        StaDesc staDesc = staDescService.queryCrnStnAuto(ioType, locMast.getCrnNo(), staNo.getDevNo());
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
        // 生成工作档
@@ -421,8 +421,8 @@
        wrkMast.setIoType(ioType); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(locMast.getCrnNo());
        wrkMast.setSourceStaNo(staDesc.getCrnStn() + ""); // 源站
        wrkMast.setStaNo(staDesc.getStnNo() + ""); // 目标站
        wrkMast.setSourceStaNo("0"); // 源站
        wrkMast.setStaNo(String.valueOf(staNo)); // 目标站
        wrkMast.setSourceLocNo(taskDto.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
@@ -494,7 +494,7 @@
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
        int workNo = dto.getTaskNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -569,15 +569,15 @@
                throw new CoolException("所选库位存在状态不为D的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$());
            }
            // 获取源站
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", 110)
                    .eq("stn_no", param.getOutSite())
                    .eq("crn_no", locMast.getCrnNo());
            StaDesc staDesc = staDescService.selectOne(wrapper);
            Integer sourceStaNo = staDesc.getCrnStn();
            if (Cools.isEmpty(sourceStaNo)) {
                throw new CoolException("检索源站失败");
            }
//            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                    .eq("type_no", 110)
//                    .eq("stn_no", param.getOutSite())
//                    .eq("crn_no", locMast.getCrnNo());
//            StaDesc staDesc = staDescService.selectOne(wrapper);
//            Integer sourceStaNo = staDesc.getCrnStn();
//            if (Cools.isEmpty(sourceStaNo)) {
//                throw new CoolException("检索源站失败");
//            }
            Date now = new Date();
            // 保存工作档
            WrkMast wrkMast = new WrkMast();
@@ -586,7 +586,7 @@
            wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
            wrkMast.setIoType(110); // 入出库状态: 110.空板出库
            wrkMast.setIoPri(10D);
            wrkMast.setSourceStaNo(sourceStaNo + ""); // 源站
            wrkMast.setSourceStaNo("0"); // 源站
            wrkMast.setStaNo(param.getOutSite() + ""); // 目标站
            wrkMast.setCrnNo(locMast.getCrnNo());
            wrkMast.setSourceLocNo(locNo); // 源库位
@@ -683,7 +683,7 @@
    @Transactional
    public void locCheckOut(StockOutParam param, Long userId) {
        // 目标站点状态检测
        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
//        BasDevp staNo = basDevpService.checkSiteStatus(param.getOutSite());
        // 获取库位明细
        List<LocDetlDto> locDetlDtos = new ArrayList<>();
        for (StockOutParam.LocDetl paramLocDetl : param.getLocDetls()) {
@@ -703,7 +703,7 @@
            LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
            if (locMast.getLocSts().equals("F")) {
                // 启动出库开始 107.盘点出库
                stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId);
                stockOut(param.getOutSite(), locDetlDtos, IoWorkType.CHECK_OUT, userId);
            } else {
                throw new CoolException("所选库位存在状态不为F的库位,库位号:" + locMast.getLocNo() + " 、当前状态:" + locMast.getLocSts() + "-" + locMast.getLocSts$());
            }
@@ -1239,22 +1239,22 @@
            throw new CoolException("保存工作主档历史档失败");
        }
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", wrkMast.getIoType() - 50)
                .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站
                .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            throw new CoolException("入库路径不存在");
        }
//        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
//                .eq("type_no", wrkMast.getIoType() - 50)
//                .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站
//                .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
//        StaDesc staDesc = staDescService.selectOne(wrapper);
//        if (Cools.isEmpty(staDesc)) {
//            throw new CoolException("入库路径不存在");
//        }
        Date now = new Date();
        // 堆垛机站点(目标站)
        Integer staNo = staDesc.getCrnStn();
//        Integer staNo = staDesc.getCrnStn();
        // 更新工作档数据状态
        wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
        wrkMast.setWrkSts(2L); // 工作状态: 2.设备上走
        wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
        wrkMast.setStaNo(staNo + ""); // 目标站
        wrkMast.setStaNo("0"); // 目标站
        wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
        wrkMast.setSourceLocNo(""); // 源库位清空
        wrkMast.setModiTime(now);
@@ -1279,7 +1279,7 @@
        }
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1((short) 1);
        return wcsController.startupFullPutStore(301, list.get(0).getZpallet(), locTypeDto, list);
        return wcsController.startupFullPutStore(301, list.get(0).getZpallet(), locTypeDto, list, null);
    }
    @Override
src/main/java/com/zy/asrs/task/AutoLocMoveScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/BareBoardScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/CheckDeepScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/LocMoveAllScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -48,41 +48,25 @@
    }
    @Scheduled(cron = "0/30 * * * * ? ")
    @Scheduled(cron = "0/15 * * * * ? ")
    @Async("orderThreadPool")
    public void completeOrderPakin() {
        if (loadingConfigTimer.getErpReport()) {
            List<OrderPakin> orders = orderPakinService.selectComplete();
            for (OrderPakin order : orders) {
                try {
                    ReturnT<String> result = orderPakinSyncHandler.startOrderReport(order);
                    if (!result.isSuccess()) {
                        log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                    }
                } catch (Exception e) {
                    log.error(e.getMessage());
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                }
                orderPakinSyncHandler.startOrderReport(order);
            }
        }
    }
    @Scheduled(cron = "0/30 * * * * ? ")
    @Scheduled(cron = "0/15 * * * * ? ")
    @Async("orderThreadPool")
    public void completeOrderPakout() {
        if (loadingConfigTimer.getErpReport()) {
            List<OrderPakout> orders = orderPakoutService.selectComplete();
            for (OrderPakout order : orders) {
                try {
                    ReturnT<String> result = orderPakoutSyncHandler.startOrderReport(order);
                    if (!result.isSuccess()) {
                        log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                    }
                } catch (Exception e) {
                    log.error(e.getMessage());
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                }
                orderPakoutSyncHandler.startOrderReport(order);
            }
        }
    }
src/main/java/com/zy/asrs/task/PlcLogScheduler.java
File was deleted
src/main/java/com/zy/asrs/task/WcsScheduler.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.task;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.task.handler.WcsSchedulerHandler;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.List;
/**
 * @author pang.jiabao
 * @description 下位WCS系统相关定时任务
 * @createDate 2026/3/4 15:04
 */
@Component
public class WcsScheduler {
    @Resource
    private WrkMastService wrkMastService;
    @Resource
    private WcsSchedulerHandler wcsSchedulerHandler;
    /**
     * 定时任务读取出库任务派发给WCS
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    private void outboundTaskDispatch() {
        List<WrkMast> wrkMastList = wrkMastService.selectList(new EntityWrapper<WrkMast>().in("io_type", 11, 101, 103, 107, 110).eq("wrk_sts", 11));
        for (WrkMast wrkMast : wrkMastList) {
            wcsSchedulerHandler.outboundTaskDispatch(wrkMast);
        }
    }
}
src/main/java/com/zy/asrs/task/handler/AutoLocMoveHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/BareBoardHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/CheckDeepHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/LocMoveAllHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/OrderPakinMoveHistoryHandler.java
@@ -43,7 +43,7 @@
        for (OrderPakin order : settleEqual6) {
            List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId());
            moveBoth(order, orderDetls);
            log.info("已完成单据移动至历史表成功 =====>" + order);
            log.info("已完成单据移动至历史表成功 =====>" + order.getOrderNo());
        }
        return SUCCESS;
    }
@@ -57,7 +57,7 @@
                orderDetl.setUpdateTime(now);
                OrderDetlPakinLog orderDetlLog = new OrderDetlPakinLog();
                Synchro.Copy(orderDetl, orderDetlLog);
                orderDetlLog.setId(null);
                orderDetlLog.setId(orderDetl.getId());
                orderDetlPakinLogMapper.insert(orderDetlLog);
                orderDetlPakinService.deleteById(orderDetl.getId());
            }
@@ -67,7 +67,7 @@
            order.setUpdateTime(now);
            OrderPakinLog orderPakinLog = new OrderPakinLog();
            Synchro.Copy(order, orderPakinLog);
            orderPakinLog.setId(null);
            orderPakinLog.setId(order.getId());
            orderPakinLogMapper.insert(orderPakinLog);
            orderPakinService.deleteById(order.getId());
        }
src/main/java/com/zy/asrs/task/handler/OrderPakinSyncHandler.java
@@ -1,5 +1,8 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.OrderDetlPakin;
import com.zy.asrs.entity.OrderPakin;
@@ -9,11 +12,15 @@
import com.zy.asrs.service.OrderPakinService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.utils.HttpHandler;
import com.zy.system.timer.LoadingConfigTimer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
/**
@@ -29,20 +36,70 @@
    private OrderDetlPakinService orderDetlPakinService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private DocTypeService docTypeService;
    @Resource
    private LoadingConfigTimer loadingConfigTimer;
    @Transactional
    public ReturnT<String> startOrderReport(OrderPakin order) {
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        long settle = 6L;
        List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId());
    public void startOrderReport(OrderPakin order) {
        return SUCCESS;
        // 构造请求体
        JSONObject param = new JSONObject();
        param.put("orderNo", order.getOrderNo());
        List<OrderDetlPakin> orderDetls = orderDetlPakinService.selectByOrderId(order.getId());
        JSONArray detl = new JSONArray();
        for (OrderDetlPakin orderDetlPakin : orderDetls) {
            JSONObject object = new JSONObject();
            object.put("matnr", orderDetlPakin.getMatnr());
            object.put("batch", orderDetlPakin.getBatch());
            object.put("anfme", orderDetlPakin.getQty());
            detl.add(object);
        }
        param.put("matList", detl);
        String response = "";
        boolean success = false;
        String errorMsg = null;
        String requestJson = param.toJSONString();
        String url = loadingConfigTimer.getErpReportURL() + loadingConfigTimer.getErpInReportPath();
        String nameSpaces = "入库单上报";
        try {
//            response = new HttpHandler.Builder()
//                    .setUri(loadingConfigTimer.getErpReportURL())
//                    .setPath(loadingConfigTimer.getErpInReportPath())
//                    .setJson(requestJson)
//                    .build()
//                    .doPost();
//            JSONObject jsonObject = JSON.parseObject(response);
//            if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) {
                orderPakinService.updateSettle(order.getId(), 6L, null);
                log.info("入库单据上报成功,单据编号:{}", order.getOrderNo());
                success = true;
//            } else {
//                errorMsg = response;
//                log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response);
//            }
        } catch (Exception e) {
            errorMsg = e.getMessage();
            log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e);
        } finally {
            try {
                apiLogService.save(
                        nameSpaces,
                        url,
                        null,
                        "127.0.0.1",
                        requestJson,
                        response,
                        success,
                        errorMsg
                );
            } catch (Exception e) {
                log.error(nameSpaces + "保存接口日志失败", e);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/OrderPakoutMoveHistoryHandler.java
@@ -51,24 +51,24 @@
    private void moveBoth(OrderPakout order, List<OrderDetlPakout> orderDetls) {
        Date now = new Date();
//        Date now = new Date();
        if (!Cools.isEmpty(orderDetls)) {
            for (OrderDetlPakout orderDetl : orderDetls) {
                orderDetl.setUpdateBy(0L);
                orderDetl.setUpdateTime(now);
//                orderDetl.setUpdateBy(0L);
//                orderDetl.setUpdateTime(now);
                OrderDetlPakoutLog orderDetlLog = new OrderDetlPakoutLog();
                Synchro.Copy(orderDetl, orderDetlLog);
                orderDetlLog.setId(null);
//                orderDetlLog.setId(orderDetl.getId());
                orderDetlPakoutLogMapper.insert(orderDetlLog);
                orderDetlPakoutService.deleteById(orderDetl.getId());
            }
        }
        if (!Cools.isEmpty(order)) {
            order.setUpdateBy(0L);
            order.setUpdateTime(now);
//            order.setUpdateBy(0L);
//            order.setUpdateTime(now);
            OrderPakoutLog orderPakinLog = new OrderPakoutLog();
            Synchro.Copy(order, orderPakinLog);
            orderPakinLog.setId(null);
//            orderPakinLog.setId(order.getId());
            orderPakoutLogMapper.insert(orderPakinLog);
            orderPakoutService.deleteById(order.getId());
        }
src/main/java/com/zy/asrs/task/handler/OrderPakoutSyncHandler.java
@@ -1,6 +1,10 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.OrderDetlPakin;
import com.zy.asrs.entity.OrderDetlPakout;
import com.zy.asrs.entity.OrderPakout;
import com.zy.asrs.service.ApiLogService;
@@ -9,11 +13,14 @@
import com.zy.asrs.service.OrderPakoutService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.utils.HttpHandler;
import com.zy.system.timer.LoadingConfigTimer;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
/**
@@ -29,20 +36,70 @@
    private OrderDetlPakoutService orderDetlPakoutService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private DocTypeService docTypeService;
    @Resource
    private LoadingConfigTimer loadingConfigTimer;
    @Transactional
    public ReturnT<String> startOrderReport(OrderPakout order) {
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        long settle = 6L;
        List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectByOrderId(order.getId());
    public void startOrderReport(OrderPakout order) {
        return SUCCESS;
        // 构造请求体
        JSONObject param = new JSONObject();
        param.put("orderNo", order.getOrderNo());
        List<OrderDetlPakout> orderDetls = orderDetlPakoutService.selectByOrderId(order.getId());
        JSONArray detl = new JSONArray();
        for (OrderDetlPakout orderDetlPakout : orderDetls) {
            JSONObject object = new JSONObject();
            object.put("matnr", orderDetlPakout.getMatnr());
            object.put("batch", orderDetlPakout.getBatch());
            object.put("anfme", orderDetlPakout.getQty());
            detl.add(object);
        }
        param.put("matList", detl);
        String response = "";
        boolean success = false;
        String errorMsg = null;
        String requestJson = param.toJSONString();
        String url = loadingConfigTimer.getErpReportURL() + loadingConfigTimer.getErpOutReportPath();
        String nameSpaces = "出库单上报";
        try {
//            response = new HttpHandler.Builder()
//                    .setUri(loadingConfigTimer.getErpReportURL())
//                    .setPath(loadingConfigTimer.getErpOutReportPath())
//                    .setJson(requestJson)
//                    .build()
//                    .doPost();
//            JSONObject jsonObject = JSON.parseObject(response);
//            if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) {
                orderPakoutService.updateSettle(order.getId(), 6L, null);
                log.info("出库单据上报成功,单据编号:{}", order.getOrderNo());
                success = true;
//            } else {
//                errorMsg = response;
//                log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response);
//            }
        } catch (Exception e) {
            errorMsg = e.getMessage();
            log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e);
        } finally {
            try {
                apiLogService.save(
                        nameSpaces,
                        url,
                        null,
                        "127.0.0.1",
                        requestJson,
                        response,
                        success,
                        errorMsg
                );
            } catch (Exception e) {
                log.error(nameSpaces + "保存接口日志失败", e);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/PlcLogHandler.java
File was deleted
src/main/java/com/zy/asrs/task/handler/WcsSchedulerHandler.java
New file
@@ -0,0 +1,103 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WrkMastService;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.StartupDto;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
import java.util.Date;
/**
 * @author pang.jiabao
 * @description 下位WCS系统相关定时任务处理
 * @createDate 2026/3/4 15:23
 */
@Component
@Slf4j
public class WcsSchedulerHandler {
    @Value("${wcs.URL}")
    private String wcsAddress;
    @Value("${wcs.createOutTask}")
    private String createOutTask;
    @Value("${wcs.createLocMoveTask}")
    private String createLocMoveTask;
    @Resource
    private ApiLogService apiLogService;
    @Resource
    private WrkMastService wrkMastService;
    public void outboundTaskDispatch(WrkMast wrkMast) {
        StartupDto startupDto = new StartupDto();
        startupDto.setTaskNo(wrkMast.getWrkNo());
        startupDto.setTaskPri(wrkMast.getIoPri());
        String nameSpaces = "出库任务派发";
        String path = createOutTask;
        if (wrkMast.getIoType() == 11 ) {
            path = createLocMoveTask;
            nameSpaces = "移库任务派发";
            startupDto.setSourceLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo()));
            startupDto.setLocNo(Utils.locToLocNo(wrkMast.getLocNo()));
        } else {
            startupDto.setStaNo(Integer.valueOf(wrkMast.getStaNo()));
            startupDto.setLocNo(Utils.locToLocNo(wrkMast.getSourceLocNo()));
        }
        String response = "";
        boolean success = false;
        String errorMsg = null;
        String requestJson = JSON.toJSONString(startupDto);
        String url = wcsAddress + "/" + path;
        try {
            response = new HttpHandler.Builder()
                    .setUri(wcsAddress)
                    .setPath(path)
                    .setJson(requestJson)
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getString("code") != null && jsonObject.getString("code").equals("200")) {
                wrkMast.setWrkSts(12L);
                wrkMast.setCrnStrTime(new Date());
                wrkMastService.updateById(wrkMast);
                success = true;
            } else {
                errorMsg = response;
                log.error(nameSpaces + "调用外部接口失败,url:{},request:{},response:{}", url, requestJson, response);
            }
        } catch (Exception e) {
            errorMsg = e.getMessage();
            log.error(nameSpaces + "调用外部接口异常,url:{},request:{},response:{}", url, requestJson, response, e);
        } finally {
            try {
                apiLogService.save(
                        nameSpaces,
                        url,
                        null,
                        "127.0.0.1",
                        requestJson,
                        response,
                        success,
                        errorMsg
                );
            } catch (Exception e) {
                log.error(nameSpaces + "保存接口日志失败", e);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/WorkLogHandler.java
@@ -64,7 +64,7 @@
            // 入库 --------------------------------------------------------------------------------
            if (wrkMast.getWrkSts() == 5) {
                // 全板入库
                if (wrkMast.getIoType() == 1) {
                if (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10) {
                    // 入库通知单
                    if (!Cools.isEmpty(wrkMast.getBarcode())) {
                        // 保存入库通知档历史档
src/main/java/com/zy/asrs/utils/Utils.java
@@ -625,4 +625,14 @@
        return result;
    }
    public static String locToLocNo(String locNo){//0100203
        int row = Integer.parseInt(locNo.substring(0, 2));
        int bay = Integer.parseInt(locNo.substring(2, 5));
        int lev = Integer.parseInt(locNo.substring(5, 7));
        return row + "-" +bay + "-" + lev;
    }
    public static String getLocNo(Number row, Number bay, Number lev) {
        return zerofill(String.valueOf(row), 2) + zerofill(String.valueOf(bay), 3) + zerofill(String.valueOf(lev), 2);
    }
}
src/main/java/com/zy/common/config/AdminInterceptor.java
@@ -128,8 +128,8 @@
            User user = userService.selectById(userLogin.getUserId());
//            String deToken = Cools.deTokn(token, user.getPassword());
//            long timestamp = Long.parseLong(deToken.substring(0, 13));
            // 15分钟后过期
            if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 900000) {
            // 60分钟后过期
            if (System.currentTimeMillis() - userLogin.getCreateTime().getTime() > 3600000) {
                Http.response(response, BaseRes.DENIED);
                return false;
            }
src/main/java/com/zy/common/model/StartupDto.java
@@ -16,6 +16,10 @@
    private String locNo;
    private Integer workNo;
    private Integer taskNo;
    private Double taskPri;
    private String sourceLocNo;
}
src/main/java/com/zy/common/service/CommonService.java
@@ -7,6 +7,7 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.asrs.utils.VersionUtils;
@@ -18,7 +19,9 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.List;
import java.util.Optional;
/**
 * 货架核心功能
@@ -445,7 +448,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setTaskNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -890,7 +893,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setTaskNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -1003,7 +1006,7 @@
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        startupDto.setWorkNo(workNo);
        startupDto.setTaskNo(workNo);
        startupDto.setCrnNo(crnNo);
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setLocNo(locNo);
@@ -1024,4 +1027,66 @@
        }
    }
    @Resource
    private LocMastMapper locMastMapper;
    public StartupDto getLocNoNew(int ioType, Integer sourceStaNo, Integer locType, List<Integer> rows) {
        // 寻找到的库位
        LocMast locMast = null;
        // 按库位类型获取库位
        List<LocMast> locMasts = locMastMapper.selectLocByTypeAndRowsToList(locType,rows);
        // todo 如果当前类型库位剩余不多,是一直放满,还是兼容到下一种库位类型
        // 考虑移库需要同类型库位,这里限制不能放满,兼容下一种库位类型
        if (locMasts.size() <= 4) {
            switch (locType) {
                case 0:
                    return getLocNoNew(ioType, sourceStaNo, 1,rows);
                case 1:
                    return getLocNoNew(ioType, sourceStaNo, 2,rows);
                case 2:
                    return getLocNoNew(ioType, sourceStaNo, 3,rows);
                case 3:
                    log.warn("当前库位排:{},剩余{}个用于移库,无法占用",rows,locMasts.size());
                    return null;
                default:
            }
        }
        // 先取深库位
        Optional<LocMast> first = locMasts.stream().filter(o -> o.getRow1() == 1 || o.getRow1() == 4 || o.getRow1() == 5 || o.getRow1() == 8|| o.getRow1() == 9 || o.getRow1() == 12).findFirst();
        if (first.isPresent()) {
            locMast = first.get();
        } else {
            // 深库位里面没有从浅库位里面取
            Optional<LocMast> first2 = locMasts.stream().filter(o -> o.getRow1() == 2 || o.getRow1() == 3 || o.getRow1() == 6 || o.getRow1() == 7 || o.getRow1() == 10 || o.getRow1() == 11).findFirst();
            if(first2.isPresent()) {
                locMast = first2.get();
            }
        }
        if (locMast == null) {
            return null;
        }
        // 根据入库类型和源站点获取工作路径
//        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>().eq("type_no", ioType).eq("stn_no", sourceStaNo).eq("crn_no",locMast.getCrnNo()));
//        if (staDesc == null) {
//            log.error("获取工作路径异常,类型:{},源站点:{},库位:{}",ioType,sourceStaNo,locMast.getLocNo());
//            return null;
//        }
        // 生成工作号
        int workNo = getWorkNo(0);
        // 返回dto
        StartupDto startupDto = new StartupDto();
        startupDto.setTaskNo(workNo);
        startupDto.setCrnNo(locMast.getCrnNo());
        startupDto.setSourceStaNo(sourceStaNo);
        startupDto.setStaNo(0);
        startupDto.setLocNo(locMast.getLocNo());
        startupDto.setTaskPri(13D);
        return startupDto;
    }
}
src/main/java/com/zy/common/web/AuthController.java
@@ -52,40 +52,37 @@
    @Autowired
    private LoadingConfigTimer loadingConfigTimer;
    @PostMapping("/login.action")
    @RequestMapping("/login.action")
    @ManagerAuth(value = ManagerAuth.Auth.NONE, memo = "登录")
    public R loginAction(@RequestBody Map<String, String> param) {
    public R loginAction(String username, String password){
        //验证许可证是否有效
        if (!licenseTimer.getSystemSupport()) {
        if (!licenseTimer.getSystemSupport()){
            return R.parse(CodeRes.SYSTEM_20001);
        }
        if (username.equals("super") && password.equals(Cools.md5(superPwd))) {
            Map<String, Object> res = new HashMap<>();
            res.put("username", username);
            res.put("token", Cools.enToken(System.currentTimeMillis() + username, superPwd));
            return R.ok(res);
        }
        EntityWrapper<User> userWrapper = new EntityWrapper<>();
        userWrapper.eq("username", param.get("username"));
        userWrapper.eq("username", username);
        User user = userService.selectOne(userWrapper);
        if (Cools.isEmpty(user)) {
            if (param.get("username").equals("super") && param.get("password").equals(Cools.md5(superPwd))) {
                Map<String, Object> res = new HashMap<>();
                res.put("username", param.get("username"));
                res.put("token", Cools.enToken(System.currentTimeMillis() + param.get("username"), superPwd));
                return R.ok(res);
            }
        if (Cools.isEmpty(user)){
            return R.parse(CodeRes.USER_10001);
        }
        if (user.getStatus() != 1) {
        if (user.getStatus()!=1){
            return R.parse(CodeRes.USER_10002);
        }
        if (!user.getPassword().equals(param.get("password"))) {
        if (!user.getPassword().equals(password)){
            return R.parse(CodeRes.USER_10003);
        }
        String token = Cools.enToken(System.currentTimeMillis() + param.get("username"), user.getPassword());
        if (loadingConfigTimer.getTokenNumber() == 1) {
            userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()).eq("system", "WMS"));
        }
        String token = Cools.enToken(System.currentTimeMillis() + username, user.getPassword());
        userLoginService.delete(new EntityWrapper<UserLogin>().eq("user_id", user.getId()));
        UserLogin userLogin = new UserLogin();
        userLogin.setUserId(user.getId());
        userLogin.setToken(token);
        userLogin.setCreateTime(new Date());
        userLogin.setSystem("WMS");
        userLoginService.insert(userLogin);
        Map<String, Object> res = new HashMap<>();
        res.put("username", user.getUsername());
src/main/java/com/zy/common/web/WcsController.java
@@ -8,18 +8,25 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.mapper.LocMastMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.GetLocNoChangeParam;
import com.zy.common.web.param.NotifyDto;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
@@ -50,22 +57,83 @@
    @Autowired
    private WorkService workService;
    @Resource
    private WrkMastLogService wrkMastLogService;
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
    public synchronized R getLocNo(@RequestBody SearchLocParam param) {
        log.info("收到WCS入库接口请求====>>入参:{}", param);
        if (Cools.isEmpty(param.getIoType())) {
            return R.error("入出库类型不能为空");
        }
//        if (Cools.isEmpty(param.getIoType())) {
//            return R.error("入出库类型不能为空");
//        }
        if (Cools.isEmpty(param.getSourceStaNo())) {
            return R.error("源站编号不能为空");
        }
        List<WaitPakin> waitPakins = null;
        if (param.getRow().length == 0) {
            return R.error("WCS上报无可用设备");
        }
//        //wcs调用此接口向组托表插入一条数据模拟组托
//        WaitPakin waitPakin = new WaitPakin();
//        waitPakin.setZpallet(param.getBarcode());
//        waitPakin.setBatch("20260305002");
//        waitPakin.setAnfme(100.0D);
//        waitPakin.setMatnr("YJ2026030509353203");
//        waitPakin.setMaktx("上拉杆_左前右后毛坯");
//        waitPakin.setSpecs("50001LR-71");
//        waitPakin.setModel("skv");
//        waitPakinService.insert(waitPakin);
//
//        WaitPakin waitPakin2 = new WaitPakin();
//        waitPakin2.setZpallet(param.getBarcode());
//        waitPakin2.setBatch("20260305002");
//        waitPakin2.setAnfme(100.0D);
//        waitPakin2.setMatnr("YJ2026030509494873");
//        waitPakin2.setMaktx("螺杆先");
//        waitPakin2.setSpecs("50001LR-71");
//        waitPakin2.setModel("skv");
//        waitPakinService.insert(waitPakin2);
        List<WaitPakin> waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
        if (param.getIoType() == 1) {
            if (Cools.isEmpty(param.getBarcode())) {
                return R.error("条码不能为空");
            }
            waitPakins = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", param.getBarcode()));
            WrkMast wrkMast1 = wrkMastService.selectByBarcode(param.getBarcode());
            if (wrkMast1 != null) {
                Integer ioType = wrkMast1.getIoType();
                if ((ioType == 103 || ioType == 107) && wrkMast1.getWrkSts() == 14) {
                    // 转换工作档
                    if (!wrkMastLogService.save(wrkMast1.getWrkNo())) {
                        throw new CoolException("保存工作主档历史档失败");
                    }
                    Date now = new Date();
                    // 更新工作档数据状态
                    wrkMast1.setIoType(wrkMast1.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
                    wrkMast1.setWrkSts(2L); // 工作状态: 2.设备上走
                    wrkMast1.setSourceStaNo(String.valueOf(param.getSourceStaNo())); // 源站
                    wrkMast1.setStaNo("0"); // 目标站
                    wrkMast1.setLocNo(wrkMast1.getSourceLocNo());
                    wrkMast1.setSourceLocNo(""); // 源库位清空
                    wrkMast1.setModiTime(now);
                    if (!wrkMastService.updateById(wrkMast1)) {
                        throw new CoolException("更新工作档数据状态失败");
                    }
                    // 修改库位状态 Q.拣料/盘点/并板再入库
                    LocMast locMast = locMastService.selectById(wrkMast1.getLocNo());
                    locMast.setLocSts("Q");
                    locMast.setModiTime(now);
                    if (!locMastService.updateById(locMast)) {
                        throw new CoolException("修改库位状态失败");
                    }
                }
                StartupDto startupDto = new StartupDto();
                startupDto.setTaskNo(wrkMast1.getWrkNo());
                startupDto.setSourceStaNo(Integer.valueOf(wrkMast1.getSourceStaNo()));
                startupDto.setTaskPri(wrkMast1.getIoPri());
                startupDto.setCrnNo(wrkMast1.getCrnNo());
                startupDto.setLocNo(Utils.locToLocNo(wrkMast1.getLocNo()));
                return R.ok().add(startupDto);
            }
            if (Cools.isEmpty(waitPakins)) {
                WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
                if (wrkMast != null && wrkMast.getIoType() == 103) {
@@ -84,24 +152,192 @@
        }
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto(sourceStaNo);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(param.getSourceStaNo(), true);
//        sourceStaNo.setLocType1(param.getLocType1());
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1(param.getLocType1());
        if(!waitPakins.isEmpty()) { // 判断是否是空托盘
            if (waitPakins.get(0).getMatnr().equals("1") ) {
                param.setIoType(10);
            }
        }
        StartupDto dto = null;
        switch (param.getIoType()) {
            case 1://满托盘入库
                assert waitPakins != null;
                dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins);
                dto = startupFullPutStore(param.getSourceStaNo(), param.getBarcode(), locTypeDto, waitPakins, param.getRow());
                break;
            case 10://空托盘入库
                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode());
                dto = emptyPlateIn(param.getSourceStaNo(), locTypeDto, param.getBarcode(),param.getRow());
                break;
            default:
                break;
        }
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode());
        return R.ok().add(dto);
    }
    @PostMapping("/taskWrk/state")
    @ResponseBody
    public R taskWrkState(@RequestBody(required = false) NotifyDto notifyDto){
        log.info("收到WCS请求上报接口======>>工作号:{},入参:{}",notifyDto.getSuperTaskNo(),notifyDto);
        if (Cools.isEmpty(notifyDto.getNotifyType())){
            return R.error("通知类型不能为空");
        }
        if (Cools.isEmpty(notifyDto.getTaskNo())){
            return R.error("任务号不能为空");
        }
        WrkMast wrkMast = wrkMastService.selectById(notifyDto.getSuperTaskNo());
        switch (notifyDto.getMsgType()){
            case "task_complete":
                if (wrkMast != null && (wrkMast.getIoType() == 1 || wrkMast.getIoType() == 10 || wrkMast.getIoType() == 53 || wrkMast.getIoType() == 57 || wrkMast.getIoType() == 11)){
                    wrkMast.setWrkSts(4L);
                    if (!wrkMastService.updateById(wrkMast)){
                        return R.error("修改工作档失败====>4");
                    }
                }else if (wrkMast != null && (wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 ||wrkMast.getIoType() == 107 || wrkMast.getIoType() == 110)){
                    wrkMast.setWrkSts(14L);
                    if (!wrkMastService.updateById(wrkMast)){
                        return R.error("修改工作档失败====>14");
                    }
                }
                break;
            case "task_cancel":
                if(wrkMast == null) {
                    return R.ok("任务不存在");
                }
                workService.cancelWrkMast(notifyDto.getSuperTaskNo(), 9527L);
        }
        return R.ok();
    }
    @PostMapping("/change/loc/v1")
    @ResponseBody
    @Transactional
    public synchronized R getLocNoChange(@RequestBody(required = false) GetLocNoChangeParam param) {
        log.info("收到WCS申请在库库位更换库位请求====>>入参:{}", param);
        StartupDto dto = applyChangeLocNo(param.getLocNo(), param.getRow());
        log.info("WCS申请在库库位更换库位接口返参:{}", dto);
        return R.ok().add(dto);
    }
    @Transactional
    public StartupDto applyChangeLocNo(String wcsLocNo, int[] row) {
        if (row.length == 0) {
            throw new CoolException(wcsLocNo + "库位,WCS上报无可用设备");
        }
        String sourceLocNo = loc(wcsLocNo);
        LocMast sourceLocMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", sourceLocNo));
        if (sourceLocMast == null) {
            throw new CoolException("源库位不存在");
        }
        if(!sourceLocMast.getLocSts().equals("F")) {
            throw new CoolException("源库位不处于在库状态");
        }
        List<LocDetl> locDetlList = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", sourceLocNo));
        LocTypeDto locTypeDto = new LocTypeDto();
        locTypeDto.setLocType1(sourceLocMast.getLocType1());
        StartupDto dto = null;
        // 根据库位排映射堆垛机
        for(int i = 0; i < row.length/4 ; i ++) {
            ArrayList<Integer> rows = new ArrayList<>();
            rows.add(row[i * 4]);
            rows.add(row[i * 4 + 1]);
            rows.add(row[i * 4 + 2]);
            rows.add(row[i * 4 + 3]);
            dto = commonService.getLocNoNew(1, 0, Integer.valueOf(locTypeDto.getLocType1()),rows);
            if (dto != null) {
                break;
            }
        }
        if (dto == null) {
            throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警");
        }
        LocMast loc = locMastService.selectById(dto.getLocNo());
        if (Cools.isEmpty(loc)){
            throw new CoolException("未找到库位");
        }
        Date now = new Date();
        // 获取工作号
        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
        dto.setTaskNo(workNo);
        // 保存工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(12L); // 工作状态
        wrkMast.setIoType(11); // 入出库状态: 11.库格移载
        wrkMast.setIoPri(10D);
        wrkMast.setSourceLocNo(sourceLocNo); // 源库位
        wrkMast.setLocNo(dto.getLocNo()); // 目标库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setBarcode(sourceLocMast.getBarcode()); // 托盘码
        wrkMast.setEmptyMk(sourceLocMast.getLocSts().equals("D") ? "Y" : "N");
        wrkMast.setLinkMis("N");
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 工作档明细保存
        for (LocDetl locDetl : locDetlList) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(locDetl);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(locDetl.getAnfme());
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
        }
        // 修改源库位状态
        if (sourceLocMast.getLocSts().equals("D") || sourceLocMast.getLocSts().equals("F")) {
            sourceLocMast.setLocSts("R"); // R.出库预约
            sourceLocMast.setModiTime(now);
            if (!locMastService.updateById(sourceLocMast)){
                throw new CoolException("更新源库位状态失败");
            }
        } else {
            throw new CoolException("源库位出库失败,状态:" + sourceLocMast.getLocSts$());
        }
        // 修改目标库位状态
        if (loc.getLocSts().equals("O")) {
            loc.setLocSts("S"); // S.入库预约
            loc.setModiTime(now);
            if (!locMastService.updateById(loc)) {
                throw new CoolException("更新目标库位状态失败");
            }
        } else {
            throw new CoolException("移转失败,目标库位状态:"+loc.getLocSts$());
        }
        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
        return dto;
    }
    public String loc(String locNo){
        String[] split = locNo.split("-");
        return Utils.getLocNo(Integer.parseInt(split[0]),Integer.parseInt(split[1]),Integer.parseInt(split[2]));
    }
    @Resource
    private LocMastMapper locMastMapper;
    @RequestMapping("/auto21")
    public R auto21(@RequestBody List<Integer> rows) {
        List<LocMast> locMastList = locMastMapper.selectLocByTypeAndRowsToList(1, rows);
        return R.ok(locMastList);
    }
    @PostMapping("/auto/emptyIn/v1")
@@ -117,7 +353,7 @@
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(dto.getWorkNo());
        wrkMast.setWrkNo(dto.getTaskNo());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(1L);
        wrkMast.setIoPri(13D);
@@ -160,16 +396,29 @@
     * 全板入库
     */
    @Transactional
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins) {
    public StartupDto startupFullPutStore(Integer devpNo, String barcode, LocTypeDto locTypeDto, List<WaitPakin> waitPakins, int[] row) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
//        List<String> matnrs = waitPakins.stream().map(WaitPakin::getMatnr).distinct().collect(Collectors.toList());
//        List<String> batchs = waitPakins.stream().map(WaitPakin::getBatch).distinct().collect(Collectors.toList());
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(matnrs.get(0), batchs.get(0));
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo(waitPakins.get(0));
//        StartupDto dto = commonService.getLocNo(1, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = null;
        // 根据库位排映射堆垛机
        for(int i = 0; i < row.length/4 ; i ++) {
            ArrayList<Integer> rows = new ArrayList<>();
            rows.add(row[i * 4]);
            rows.add(row[i * 4 + 1]);
            rows.add(row[i * 4 + 2]);
            rows.add(row[i * 4 + 3]);
            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
            if (dto != null) {
                break;
            }
        }
        if (dto == null) {
            throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警");
        }
        int workNo = dto.getTaskNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
@@ -188,7 +437,7 @@
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
//        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
@@ -219,11 +468,11 @@
            throw new CoolException("更新通知档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(now);
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        }
//        sourceStaNo.setWrkNo(workNo);
//        sourceStaNo.setModiTime(now);
//        if (!basDevpService.updateById(sourceStaNo)) {
//            throw new CoolException("更新源站失败");
//        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
@@ -235,22 +484,40 @@
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
        return dto;
    }
    @Transactional
    public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode) {
    public StartupDto emptyPlateIn(Integer devpNo, LocTypeDto locTypeDto, String barcode, int[] row) {
        // 源站点状态检测
        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
//        BasDevp sourceStaNo = basDevpService.checkSiteStatus(devpNo, true);
        // 检索库位
        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
//        FindLocNoAttributeVo findLocNoAttributeVo = new FindLocNoAttributeVo();
        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        int workNo = dto.getWorkNo();
//        StartupDto dto = commonService.getLocNo(10, devpNo, findLocNoAttributeVo, locTypeDto);
        StartupDto dto = null;
        // 根据库位排映射堆垛机
        for(int i = 0; i < row.length/4 ; i ++) {
            ArrayList<Integer> rows = new ArrayList<>();
            rows.add(row[i * 4]);
            rows.add(row[i * 4 + 1]);
            rows.add(row[i * 4 + 2]);
            rows.add(row[i * 4 + 3]);
            dto = commonService.getLocNoNew(1, devpNo, Integer.valueOf(locTypeDto.getLocType1()),rows);
            if (dto != null) {
                break;
            }
        }
        if (dto == null) {
            throw new CoolException("没有匹配到库位,检查可用库位/堆垛机报警");
        }
        int workNo = dto.getTaskNo();
        Date now = new Date();
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(new Date());
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(2L); // 工作状态:生成入库ID
        wrkMast.setIoType(10); // 入出库状态:10.空板入库
        wrkMast.setIoPri(13D); // 优先级
@@ -264,31 +531,36 @@
        wrkMast.setEmptyMk("Y"); // 空板
        wrkMast.setLinkMis("Y");
        wrkMast.setBarcode(barcode);
        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
//        wrkMast.setCtnType(sourceStaNo.getCtnType()); // 容器类型
        // 操作人员数据
        wrkMast.setAppeTime(new Date());
        wrkMast.setModiTime(new Date());
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        boolean res = wrkMastService.insert(wrkMast);
        if (!res) {
            throw new CoolException("保存工作档失败");
        }
        // 更新源站点信息
        sourceStaNo.setWrkNo(workNo);
        sourceStaNo.setModiTime(new Date());
        if (!basDevpService.updateById(sourceStaNo)) {
            throw new CoolException("更新源站失败");
        // 更新入库通知档 ioStatus ===>> Y
        Wrapper<WaitPakin> wrapper = new EntityWrapper<WaitPakin>()
                .eq("zpallet", barcode);
        WaitPakin setParam = new WaitPakin();
        setParam.setLocNo(dto.getLocNo());
        setParam.setIoStatus("Y");
        setParam.setModiTime(now);
        if (!waitPakinService.update(setParam, wrapper)) {
            throw new CoolException("更新通知档失败");
        }
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
            locMast.setLocSts("S"); // S.入库预约
            locMast.setModiTime(new Date());
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("改变库位状态失败");
            }
        } else {
            throw new CoolException(dto.getLocNo() + "目标库位已被占用");
        }
        dto.setLocNo(Utils.locToLocNo(dto.getLocNo()));
        return dto;
    }
src/main/java/com/zy/common/web/param/GetLocNoChangeParam.java
New file
@@ -0,0 +1,13 @@
package com.zy.common.web.param;
import lombok.Data;
@Data
public class GetLocNoChangeParam {
    private String locNo;
    //库位排
    private int[] row;
}
src/main/java/com/zy/common/web/param/NotifyDto.java
New file
@@ -0,0 +1,42 @@
package com.zy.common.web.param;
import lombok.Data;
@Data
public class NotifyDto {
    private Long id;
    //通知类型
    private String notifyType;
    //设备号
    private Integer device;
    //工作号
    private String taskNo;
    //上级系统工作号
    private String superTaskNo;
    //消息类型
    private String msgType;
    //消息描述
    private String msgDesc;
    //消息数据
    private String data;
    //失败重试次数
    private Integer failTimes = 3;
    //重试次数
    private Integer retryTimes = 0;
    //重试间隔默认30s
    private Integer retryTime = 30;
    //上次重试时间
    private Long lastRetryTime = 0L;
}
src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -8,13 +8,16 @@
@Data
public class SearchLocParam {
    private Integer ioType;
    private Integer ioType = 1;
    private Integer sourceStaNo;
    private String barcode;
    // 库位规格( 0:未知, 1:低库位, 2:高库位)
    // 库位规格( 0:未知, 1:低库位, 2:中库位,3.高库位)
    private Short locType1;
    //库位排
    private int[] row;
}
src/main/java/com/zy/system/controller/UserController.java
@@ -117,6 +117,9 @@
        if (user.getMobile() != null) {
            entity.setMobile(user.getMobile());
        }
        if (user.getRoleId() != null) {
            entity.setRoleId(user.getRoleId());
        }
        userService.updateById(entity);
        return R.ok();
    }
src/main/java/com/zy/system/entity/license/AbstractServerInfos.java
@@ -24,9 +24,9 @@
        try {
//            result.setIpAddress(this.getIpAddress());
            result.setMacAddress(this.getMacAddress());
            result.setCpuSerial(this.getCPUSerial());
            result.setMainBoardSerial(this.getMainBoardSerial());
//            result.setMacAddress(this.getMacAddress());
//            result.setCpuSerial(this.getCPUSerial());
//            result.setMainBoardSerial(this.getMainBoardSerial());
        } catch (Exception e) {
            logger.error("获取服务器硬件信息失败", e);
        }
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -127,25 +127,25 @@
        LicenseCheck serverCheckModel = getServerInfos();
        if (expectedCheckModel != null && serverCheckModel != null) {
            //校验IP地址
            if (!checkIpAddress(expectedCheckModel.getIpAddress(), serverCheckModel.getIpAddress())) {
                throw new LicenseContentException("当前服务器的IP没在授权范围内");
            }
            //校验Mac地址
            if (!checkIpAddress(expectedCheckModel.getMacAddress(), serverCheckModel.getMacAddress())) {
                throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
            }
            //校验主板序列号
            if (!checkSerial(expectedCheckModel.getMainBoardSerial(), serverCheckModel.getMainBoardSerial())) {
                throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
            }
            //校验CPU序列号
            if (!checkSerial(expectedCheckModel.getCpuSerial(), serverCheckModel.getCpuSerial())) {
                throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
            }
//            //校验IP地址
//            if (!checkIpAddress(expectedCheckModel.getIpAddress(), serverCheckModel.getIpAddress())) {
//                throw new LicenseContentException("当前服务器的IP没在授权范围内");
//            }
//
//            //校验Mac地址
//            if (!checkIpAddress(expectedCheckModel.getMacAddress(), serverCheckModel.getMacAddress())) {
//                throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
//            }
//
//            //校验主板序列号
//            if (!checkSerial(expectedCheckModel.getMainBoardSerial(), serverCheckModel.getMainBoardSerial())) {
//                throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
//            }
//
//            //校验CPU序列号
//            if (!checkSerial(expectedCheckModel.getCpuSerial(), serverCheckModel.getCpuSerial())) {
//                throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
//            }
        } else {
            throw new LicenseContentException("不能获取服务器硬件信息");
        }
src/main/java/com/zy/system/timer/LoadingConfigTimer.java
@@ -35,6 +35,12 @@
    // erp上报
    private Boolean erpReport = false;
    private String erpInReportPath;
    private String erpOutReportPath;
    private String erpReportURL;
    @Autowired
    private ConfigService configService;
@@ -46,6 +52,9 @@
        logDeleteDays = configService.getVal("logDeleteDays", Integer.class, logDeleteDays);
        erpReport = configService.getVal("erpReport", Boolean.class, erpReport);
        zpalletManage = configService.getVal("zpalletManage", Boolean.class, zpalletManage);
        erpOutReportPath = configService.getVal("erpOutReportPath", String.class, erpOutReportPath);
        erpInReportPath = configService.getVal("erpInReportPath", String.class, erpInReportPath);
        erpReportURL = configService.getVal("erpReportURL", String.class, erpReportURL);
    }
src/main/resources/application-dev.yml
@@ -12,7 +12,7 @@
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    username: sa
    password: sa@123
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=wms
    url: jdbc:sqlserver://127.0.0.1:1433;databasename=nwswms
  mvc:
    static-path-pattern: /**
  redis:
@@ -27,13 +27,6 @@
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
    #  global-config:
    #    field-strategy: 0
    #  configuration:
  #    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#    map-underscore-to-camel-case: true
#    cache-enabled: true
#    call-setters-on-nulls: true
super:
@@ -44,12 +37,22 @@
#License相关配置
license:
  subject: asrs2.0
  subject: nwsasrs
  publicAlias: publicCert
  storePass: public_zhongyang_123456789
  licensePath: license.lic
  publicKeysStorePath: publicCerts.keystore
#wcs对接
wcs:
  URL: http://127.0.0.1:9090/wcs
  outboundTaskSend: open/outboundTaskSend
  deviceStatus : open/deviceStatus
  createOutTask: openapi/createOutTask
  createLocMoveTask: openapi/createLocMoveTask
  devicesStatus: openapi/devicesStatus
  getAllLocInformation: openapi/getAllLocInformation
# 下位机配置
wcs-slave:
  # 双深
src/main/resources/mapper/LocDetlMapper.xml
@@ -545,7 +545,7 @@
        <if test="locNos != null and locNos.size > 0">
            and b.loc_no not in
            and (b.loc_no + '_' + a.matnr + '_' + a.batch) not in
            <foreach item="item" collection="locNos" index="index"  separator="," open="(" close=")">
                #{item}
            </foreach>
src/main/resources/mapper/LocMastMapper.xml
@@ -203,5 +203,19 @@
            #{item}
        </foreach>
    </select>
    <select id="selectLocByTypeAndRowsToList" resultType="com.zy.asrs.entity.LocMast">
        select
        loc_no as locNo,
        crn_no as crnNo,
        row1
        from asr_loc_mast
        where loc_sts = 'O'
        and loc_type1 = #{locType}
        and row1 in
        <foreach collection="rows" item="row" open="(" separator="," close=")">
            #{row}
        </foreach>
        order by lev1, bay1, row1
    </select>
</mapper>
src/main/resources/mapper/OrderDetlMapper.xml
@@ -149,7 +149,7 @@
    </update>
    <update id="decrease">
        update man_order_detl
        update man_order_detl_pakin
        set work_qty = work_qty - #{qty}
        where 1=1
        and order_no = #{orderNo}
src/main/resources/mapper/OrderDetlPakinMapper.xml
@@ -226,7 +226,7 @@
    <update id="increaseQtyByOrderNo">
        update man_order_detl_pakin
        set qty = qty + #{qty}
        set qty = qty + #{qty},work_qty = work_qty - #{qty}
        where 1=1
        and order_no = #{orderNo}
        and matnr = #{matnr}
src/main/resources/mapper/WrkMastMapper.xml
@@ -4,7 +4,6 @@
    <!-- 通用查询映射结果 -->
    <resultMap id="BaseResultMap" type="com.zy.asrs.entity.WrkMast">
        <id column="id" property="id" />
        <result column="wrk_no" property="wrkNo" />
        <result column="task_type" property="taskType" />
        <result column="inv_wh" property="invWh" />
@@ -72,7 +71,7 @@
        select * from asr_wrk_mast
        where wrk_sts=5
        or (wrk_sts=15 and ove_mk='Y' and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,3,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and dateadd(mi,1,crn_end_time) &lt;= getdate() and wrk_no not in (select wrk_no from asr_bas_devp))
        or (wrk_sts=15 and crn_end_time is null and wrk_no not in (select wrk_no from asr_bas_devp))
        order by io_time,wrk_no asc
    </select>
src/main/webapp/static/js/apiLog/apiLog.js
@@ -22,6 +22,7 @@
        height: 'full-120',
        cols: [[
            {type: 'checkbox'}
            ,{field: 'createTime$', align: 'center',title: '添加时间'}
            // ,{field: 'id', align: 'center',title: 'ID'}
            // ,{field: 'uuid', align: 'center',title: '日志编号'}
            ,{field: 'namespace', align: 'center',title: '名称空间'}
@@ -30,15 +31,14 @@
            // ,{field: 'timestamp', align: 'center',title: '时间戳'}
            ,{field: 'clientIp', align: 'center',title: 'URL',hide: true}
            ,{field: 'request', align: 'center',title: '请求内容'}
            ,{field: 'response', align: 'center',title: '操作内容'}
            // ,{field: 'err', align: 'center',title: '异常内容'}
            ,{field: 'response', align: 'center',title: '返回内容'}
            ,{field: 'err', align: 'center',title: '异常内容'}
            ,{field: 'result$', align: 'center',title: '结果', templet: '#resTpl', width: 80}
            // ,{field: 'status$', align: 'center',title: '状态'}
            ,{field: 'createTime$', align: 'center',title: '添加时间'}
            // ,{field: 'updateTime$', align: 'center',title: '修改时间'}
            ,{field: 'memo', align: 'center',title: '备注', hide: true}
            ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80}
            // ,{fixed: 'right', title:'操作', align: 'center', toolbar: '#operate', width: 80}
        ]],
        request: {
            pageName: 'curr',
src/main/webapp/static/js/waitPakinLog/waitPakinLog.js
@@ -15,8 +15,9 @@
                html += ">";
                return html;
            }}
        ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true}
        ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true})
        ,{field: 'appeUser$', align: 'center',title: '创建人员'}
        ,{field: 'appeTime$', align: 'center',title: '创建时间'}
        ,{field: 'modiTime$', align: 'center',title: '修改时间'})
    return cols;
}
layui.use(['table','laydate', 'form'], function(){
src/main/webapp/views/apiLog/apiLog.html
@@ -26,7 +26,7 @@
                    <div class="layui-inline">
                        <label class="layui-form-label">请求内容:</label>
                        <div class="layui-input-inline">
                            <input class="layui-input" type="text" name="request" placeholder="请输入(订单号或品号)" autocomplete="off">
                            <input class="layui-input" type="text" name="request" placeholder="请输入" autocomplete="off">
                        </div>
                    </div>
                    <div class="layui-inline">&emsp;
@@ -47,8 +47,8 @@
<script type="text/html" id="toolbar">
    <div class="layui-btn-container">
<!--        <button class="layui-btn layui-btn-sm" id="btn-add" lay-event="addData">新增</button>-->
        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData" style="float: right">导出</button>
<!--        <button class="layui-btn layui-btn-sm layui-btn-danger" id="btn-delete" lay-event="deleteData">删除</button>-->
        <button class="layui-btn layui-btn-primary layui-btn-sm" id="btn-export" lay-event="exportData">导出</button>
    </div>
</script>
src/main/webapp/views/login.html
@@ -135,8 +135,7 @@
        let params = {username: username, password: hex_md5(password)}
        $.ajax({
            url: baseUrl + "/login.action",
            headers: {'Content-Type': 'application/json'},
            data: JSON.stringify(params),
            data:params,
            method: 'POST',
            success: function (res) {
                if (res.code === 200) {
version/bak/nwswms.bak
Binary files differ