自动化立体仓库 - WMS系统
#
Junjie
19 小时以前 c82b47020ff5b0e76609454ab915afd0e27db199
#
10个文件已修改
280 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/InventoryCheckOrderDetl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/MobileService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/ReportToThirdService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/ReportToThirdServiceImpl.java 115 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ReportInventoryCheckOrdersScheduler.java 69 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/inventoryCheckOrder/inventoryCheckOrder.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pakStore/locDetlCheckQuery.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -683,4 +683,11 @@
        return R.ok("出库成功");
    }
    @RequestMapping("/checkOut/submit/auth")
    @ManagerAuth(memo = "盘点上报ERP")
    public R checkOutSubmit(@RequestParam("orderId") Integer orderId) {
        mobileService.checkOutSubmit(orderId, getUserId());
        return R.ok("上报ERP成功");
    }
}
src/main/java/com/zy/asrs/entity/InventoryCheckOrderDetl.java
@@ -58,6 +58,10 @@
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date ioTime;
    @ApiModelProperty(value = "")
    @TableField("cwarehouseid")
    private String cwarehouseid;
    public InventoryCheckOrderDetl() {
    }
src/main/java/com/zy/asrs/service/MobileService.java
@@ -67,4 +67,6 @@
    void stockOut(OrderDetl orderDetl, BasDevp staNo, LocDetl locDetl,
                  Double curOutQty, Integer ioType, Long userId, Date now);
    void checkOutSubmit(Integer orderId, Long userId);
}
src/main/java/com/zy/asrs/service/ReportToThirdService.java
@@ -13,6 +13,7 @@
    boolean reportTkrk(String matnr, String batch, String orderNo, Double anfme);
    boolean reportCheckOrder(InventoryCheckOrder checkOrder);
    boolean reportCheckOrder(String matnr, String batch);
}
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -78,6 +78,8 @@
    private ManLocDetlService manLocDetlService;
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Autowired
    private ReportToThirdService reportToThirdService;
    @Autowired
    private InventoryCheckOrderService inventoryCheckOrderService;
@@ -851,7 +853,10 @@
        List<WrkDetl> paramWrkDetls = JSON.parseArray(JSON.toJSONString(param.getWrkDetls()), WrkDetl.class);
        for (WrkDetl wrkDetl : paramWrkDetls) {
            String locNo = Cools.isEmpty(wrkMast.getLocNo()) ? wrkMast.getSourceLocNo() : wrkMast.getLocNo();
            List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>().eq("loc_no", locNo));
            List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                    .eq("loc_no", locNo)
                    .eq("area", wrkDetl.getWrkNo())
            );
            for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) {
                if (wrkDetl.getMatnr().equals(checkOrderDetl.getMatnr()) && Cools.eq(wrkDetl.getBatch(), checkOrderDetl.getBatch())) {
                    checkOrderDetl.setCheckAnfme(wrkDetl.getAnfme());
@@ -1182,4 +1187,45 @@
            throw new CoolException(locDetl.getLocNo() + "库位不是在库状态");
        }
    }
    @Override
    public void checkOutSubmit(Integer orderId, Long userId) {
        InventoryCheckOrder inventoryCheckOrder = inventoryCheckOrderService.selectOne(new EntityWrapper<InventoryCheckOrder>()
                .eq("id", orderId));
        if (inventoryCheckOrder == null) {
            throw new CoolException("盘点单不存在");
        }
        if (!inventoryCheckOrder.getStatus().equals("1")) {
            throw new CoolException("盘点单状态已上报");
        }
        List<InventoryCheckOrderDetl> checkOrderDetlList = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("order_no", inventoryCheckOrder.getOrderNo())
        );
        if (checkOrderDetlList.isEmpty()) {
            throw new CoolException("盘点单无物料明细");
        }
        InventoryCheckOrderDetl orderDetl = checkOrderDetlList.get(0);
        List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("matnr", orderDetl.getMatnr())
                .eq("batch", orderDetl.getBatch())
        );
        boolean complete = true;
        for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) {
            if (!checkOrderDetl.getStatus().equals("2")) {
                complete = false;
            }
        }
        if (complete) {
            boolean result = reportToThirdService.reportCheckOrder(orderDetl.getMatnr(), orderDetl.getBatch());
            if (!result) {
                throw new CoolException("盘点单上报失败");
            }
        }else {
            throw new CoolException("盘点未完成无法上报");
        }
    }
}
src/main/java/com/zy/asrs/service/impl/ReportToThirdServiceImpl.java
@@ -20,6 +20,7 @@
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
@@ -223,18 +224,49 @@
    }
    @Override
    public boolean reportCheckOrder(InventoryCheckOrder checkOrder) {
        Object process1 = processInvcount(checkOrder);
        //发送请求
        NcResultMessage response = SendUtil.sendDataToNc(SendUtil.token, nyncIp + ":" + port, invcountAdd, JSONObject.toJSONString(process1));
        log.info("盘点单response:{}", response);
        if (!Cools.isEmpty(response) && response.isSuccess()) {
            log.info("盘点单response:{}", response);
            return true;
        } else {
//            remark = response.getMessage() + "--" + response.getErrorStack().substring(0, 100);
            return false;
    public boolean reportCheckOrder(String matnr, String batch) {
        List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("matnr", matnr)
                .eq("batch", batch)
        );
        ArrayList<String> warehouseIdList = new ArrayList<>();
        ArrayList<String> orderNoList = new ArrayList<>();
        for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) {
            if (!warehouseIdList.contains(checkOrderDetl.getCwarehouseid())) {
                warehouseIdList.add(checkOrderDetl.getCwarehouseid());
            }
            if (!orderNoList.contains(checkOrderDetl.getOrderNo())) {
                orderNoList.add(checkOrderDetl.getOrderNo());
            }
        }
        boolean result = true;
        for (String cwarehouseid : warehouseIdList) {
            Object process1 = processInvcount(matnr, batch, cwarehouseid);
            //发送请求
            NcResultMessage response = SendUtil.sendDataToNc(SendUtil.token, nyncIp + ":" + port, invcountAdd, JSONObject.toJSONString(process1));
            log.info("盘点单response:{}", response);
            if (!Cools.isEmpty(response) && response.isSuccess()) {
                log.info("盘点单response:{}", response);
            } else {
                result = false;
            }
        }
        if (result) {
            List<InventoryCheckOrder> inventoryCheckOrders = inventoryCheckOrderService.selectList(new EntityWrapper<InventoryCheckOrder>()
                    .in("orderNo", orderNoList)
                    .eq("status", 1)
            );
            for (InventoryCheckOrder inventoryCheckOrder : inventoryCheckOrders) {
                inventoryCheckOrder.setStatus("2");
                inventoryCheckOrderService.updateById(inventoryCheckOrder);
            }
        }
        return result;
    }
    private Object processXSFH(List<OrderDetl> orderDetls, Boolean flag) {
@@ -314,50 +346,45 @@
        return data;
    }
    private Object processInvcount(InventoryCheckOrder checkOrder) {
    private Object processInvcount(String matnr, String batch, String cwarehouseid) {
        List<InventoryCheckOrderDetl> inventoryCheckOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("order_no", checkOrder.getOrderNo()));
                .eq("matnr", matnr)
                .eq("batch", batch)
                .eq("cwarehouseid", cwarehouseid)
        );
        if (inventoryCheckOrderDetls.isEmpty()) {
            throw new CoolException("盘点明细不存在");
        }
        //合并数量
        BigDecimal checkAnfmeDecimal = new BigDecimal(0);
        for (InventoryCheckOrderDetl checkOrderDetl : inventoryCheckOrderDetls) {
            checkAnfmeDecimal = checkAnfmeDecimal.add(BigDecimal.valueOf(checkOrderDetl.getCheckAnfme()));
        }
        //计算辅数量
        Double weight = MatUtils.calcWeight(matnr, checkAnfmeDecimal.doubleValue());
        //组装对象数据
        Map<String, Object> data = new HashMap<String, Object>();
        //仓库id
        String cwarehouseid = null;
        List<InvCountBodyVO> invCountBodyVOList = new ArrayList<>();
        for (InventoryCheckOrderDetl inventoryCheckOrderDetl : inventoryCheckOrderDetls) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>()
                    .eq("matnr", inventoryCheckOrderDetl.getMatnr())
                    .eq("batch", inventoryCheckOrderDetl.getBatch())
            );
            if (wrkDetls.isEmpty()) {
                throw new CoolException("工作档明细不存在");
            }
            NccScPcdaWms nccScPcdaWms = nccScPcdaWmsService.selectOne(new EntityWrapper<NccScPcdaWms>()
                    .eq("WLBM", inventoryCheckOrderDetl.getMatnr())
                    .eq("VBATCHCODE", inventoryCheckOrderDetl.getBatch())
            );
            if(null == nccScPcdaWms) {
                throw new CoolException("ERP数据库无法查询到盘点上报数据");
            }
            cwarehouseid = wrkDetls.get(0).getStandby1();
            //计算辅数量
            Double weight = MatUtils.calcWeight(inventoryCheckOrderDetl.getMatnr(), inventoryCheckOrderDetl.getCheckAnfme());
            InvCountBodyVO invCountBodyVO = new InvCountBodyVO();
            invCountBodyVO.setCmaterialoid(inventoryCheckOrderDetl.getMatnr());
            invCountBodyVO.setVbatchcode(inventoryCheckOrderDetl.getBatch());
            invCountBodyVO.setNcountnum(inventoryCheckOrderDetl.getCheckAnfme());
            invCountBodyVO.setNcountastnum(weight);
            invCountBodyVO.setCstateid(nccScPcdaWms.getPkStorestate());
            invCountBodyVO.setPk_batchcode(nccScPcdaWms.getPkBatchcode());
            invCountBodyVOList.add(invCountBodyVO);
        NccScPcdaWms nccScPcdaWms = nccScPcdaWmsService.selectOne(new EntityWrapper<NccScPcdaWms>()
                .eq("WLBM", matnr)
                .eq("VBATCHCODE", batch)
        );
        if (null == nccScPcdaWms) {
            throw new CoolException("ERP数据库无法查询到盘点上报数据");
        }
        InvCountBodyVO invCountBodyVO = new InvCountBodyVO();
        invCountBodyVO.setCmaterialoid(matnr);
        invCountBodyVO.setVbatchcode(batch);
        invCountBodyVO.setNcountnum(checkAnfmeDecimal.doubleValue());
        invCountBodyVO.setNcountastnum(weight);
        invCountBodyVO.setCstateid(nccScPcdaWms.getPkStorestate());
        invCountBodyVO.setPk_batchcode(nccScPcdaWms.getPkBatchcode());
        invCountBodyVOList.add(invCountBodyVO);
        InvCountHeaderVO invCountHeaderVO = new InvCountHeaderVO();
        invCountHeaderVO.setPk_org("FYT");
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -326,15 +326,6 @@
                ioType = dto.isAll() ? 101 : 103;
            } else if (ioWorkType.equals(IoWorkType.CHECK_OUT)) {
                ioType = 107;
                if (Cools.isEmpty(checkOrderNo)) {
                    checkOrderNo = DateUtils.createTimeStamp();
                    InventoryCheckOrder checkOrder = new InventoryCheckOrder();
                    checkOrder.setCreateBy(userId);
                    checkOrder.setStatus("1");
                    checkOrder.setCreateTime(new Date());
                    checkOrder.setOrderNo(checkOrderNo);
                    checkOrderService.insert(checkOrder);
                }
            }
            assert ioType != null;
            // 获取库位
@@ -350,6 +341,20 @@
            StaDesc staDesc = staDescService.queryCrnStn(ioType, locMast.getCrnNo(), outSta);
            // 生成工作号
            int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(ioType));
            if (ioType == 107) {
                if (Cools.isEmpty(checkOrderNo)) {
                    checkOrderNo = DateUtils.createTimeStamp() + "_" + workNo;
                    InventoryCheckOrder checkOrder = new InventoryCheckOrder();
                    checkOrder.setCreateBy(userId);
                    checkOrder.setStatus("1");
                    checkOrder.setArea(String.valueOf(workNo));
                    checkOrder.setCreateTime(new Date());
                    checkOrder.setOrderNo(checkOrderNo);
                    checkOrderService.insert(checkOrder);
                }
            }
            // 生成工作档
            WrkMast wrkMast = new WrkMast();
            wrkMast.setWrkNo(workNo);
@@ -406,6 +411,8 @@
                    checkOrderDetl.setBatch(detlDto.getLocDetl().getBatch());
                    checkOrderDetl.setLocNo(detlDto.getLocDetl().getLocNo());
                    checkOrderDetl.setAnfme(detlDto.getLocDetl().getAnfme());
                    checkOrderDetl.setArea(String.valueOf(workNo));
                    checkOrderDetl.setCwarehouseid(wrkDetl.getStandby1());
                    checkOrderDetl.setIoTime(new Date());
                    checkOrderDetl.setStatus("0");
                    checkOrderDetlService.insert(checkOrderDetl);
src/main/java/com/zy/asrs/task/ReportInventoryCheckOrdersScheduler.java
@@ -31,42 +31,43 @@
    /**
     * 上报盘点结果
     * 不自动上报,采用人工手动上报方案
     */
    @Scheduled(cron = "0/3 * * * * ? ")
//    @Scheduled(cron = "0/3 * * * * ? ")
    public void execute() {
        String erpReport = Parameter.get().getErpReport();
        if (Cools.isEmpty(erpReport) || !erpReport.equals("true")) {
            return;
        }
        List<InventoryCheckOrder> inventoryCheckOrders = inventoryCheckOrderService.selectList(new EntityWrapper<InventoryCheckOrder>()
                .eq("status", 1));
        if (inventoryCheckOrders.isEmpty()) {
            return;
        }
        for (InventoryCheckOrder checkOrder : inventoryCheckOrders) {
            List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>().eq("order_no", checkOrder.getOrderNo()));
            boolean complete = true;
            for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) {
                if (!checkOrderDetl.getStatus().equals("2")) {
                    complete = false;
                }
            }
            if (complete) {
                boolean result = reportToThirdService.reportCheckOrder(checkOrder);
                if (!result) {
                    continue;
                }
                checkOrder.setStatus("2");
                if (!inventoryCheckOrderService.updateById(checkOrder)) {
                    log.error("盘点单[orderNo={}]更新状态失败", checkOrder.getOrderNo());
                } else {
                    log.info("盘点单[orderNo={}]更新状态成功", checkOrder.getOrderNo());
                }
            }
        }
//        String erpReport = Parameter.get().getErpReport();
//        if (Cools.isEmpty(erpReport) || !erpReport.equals("true")) {
//            return;
//        }
//
//        List<InventoryCheckOrder> inventoryCheckOrders = inventoryCheckOrderService.selectList(new EntityWrapper<InventoryCheckOrder>()
//                .eq("status", 1));
//        if (inventoryCheckOrders.isEmpty()) {
//            return;
//        }
//
//        for (InventoryCheckOrder checkOrder : inventoryCheckOrders) {
//            List<InventoryCheckOrderDetl> checkOrderDetls = inventoryCheckOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>().eq("order_no", checkOrder.getOrderNo()));
//            boolean complete = true;
//            for (InventoryCheckOrderDetl checkOrderDetl : checkOrderDetls) {
//                if (!checkOrderDetl.getStatus().equals("2")) {
//                    complete = false;
//                }
//            }
//            if (complete) {
//                boolean result = reportToThirdService.reportCheckOrder(checkOrder);
//                if (!result) {
//                    continue;
//                }
//
//                checkOrder.setStatus("2");
//                if (!inventoryCheckOrderService.updateById(checkOrder)) {
//                    log.error("盘点单[orderNo={}]更新状态失败", checkOrder.getOrderNo());
//                } else {
//                    log.info("盘点单[orderNo={}]更新状态成功", checkOrder.getOrderNo());
//                }
//            }
//        }
    }
    /**
src/main/webapp/static/js/inventoryCheckOrder/inventoryCheckOrder.js
@@ -48,7 +48,7 @@
            // ,{field: 'itemNum', align: 'center',title: '品项数'}
            // ,{field: 'count', align: 'center',title: '数量'}
            // ,{field: 'weight', align: 'center',title: '重量'}
            ,{field: 'profit$', align: 'center',title: '盈亏',templet: '#profitTpl'}
            // ,{field: 'profit$', align: 'center',title: '盈亏',templet: '#profitTpl'}
            ,{field: 'status$', align: 'center',title: '状态'}
            // ,{field: 'createBy$', align: 'center',title: '添加人员'}
            // ,{field: 'createTime$', align: 'center',title: '添加时间'}
src/main/webapp/views/pakStore/locDetlCheckQuery.html
@@ -78,6 +78,11 @@
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="batch" placeholder="批号"  autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="specs" placeholder="规格"  autocomplete="off">
            </div>
        </div>