自动化立体仓库 - WMS系统
pang.jiabao
2024-08-27 2d0226ea3dd2116cfcc9ec307f17edf191458aad
mes对接单据相关
16个文件已修改
1个文件已添加
615 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OutController.java 188 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/ReportMesOrderResult.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ZwmsOutLocWorkDto.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java 64 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 140 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 66 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/constant/MesConstant.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderTable.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -92,7 +92,7 @@
                                         @RequestBody ZwmsOutLocWorkDto param,
                                         HttpServletRequest request) {
        auth(appkey, param, request);
        return R.ok(openService.zwmsOutLocWork(param));
        return openService.zwmsOutLocWork(param);
    }
    @PostMapping("/ckjgsb")
src/main/java/com/zy/asrs/controller/OutController.java
@@ -5,9 +5,11 @@
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDetlDto;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.model.enums.IoWorkType;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
@@ -60,66 +62,68 @@
        if (Cools.isEmpty(ids)) {
            return R.parse(BaseRes.PARAM);
        }
        // 订单明细
        List<OrderDetl> orderDetls = orderDetlService.selectBatchIds(ids);
        if (orderDetls.isEmpty()) {
            return R.parse("请选择数据");
        }
        // 获取订单主表
        Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", orderDetls.get(0).getOrderNo()));
        if (order == null) {
            return R.parse("订单数据为空");
        }
        List<LocDto> locDtos = new ArrayList<>();
//        for (OrderDetl orderDetl : orderDetls) {
//            if (orderDetl.getAnfme()-orderDetl.getWorkQty()-orderDetl.getQty()==0.0){
//                continue;
//            }
//            LocDto locDto = new LocDto(orderDetl.getManu(), orderDetl.getMatnr(), orderDetl.getMaktx(),orderDetl.getModel(),orderDetl.getSpecs(),
//                    orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getBarcode(), orderDetl.getOrderNo(),orderDetl.getAnfme());
//            locDto.setOrderDetlId(orderDetl.getId());
//            locDto.setTkType(orderDetl.getTkType());
//            locDtos.add(locDto);
//        }
        Set<String> exist = new HashSet<>();
        for (OrderDetl orderDetl : orderDetls) {
            double issued = Optional.of(orderDetl.getAnfme() - orderDetl.getWorkQty()).orElse(0.0D);
            if (issued <= 0.0D) { continue; }
//            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(), orderDetl.getBatch(), null, exist);
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("batch",orderDetl.getBatch()).eq("model",orderDetl.getModel()));
            for (LocDetl locDetl : locDetls) {
                if (issued > 0) {
                    LocDto locDto = new LocDto(orderDetl.getManu(), orderDetl.getMatnr(), orderDetl.getMaktx(),orderDetl.getModel(),orderDetl.getSpecs(),
                    orderDetl.getBatch(),orderDetl.getBrand(),orderDetl.getBarcode(), orderDetl.getOrderNo(),orderDetl.getAnfme());
//                    LocDto locDto = new LocDto(locDetl.getLocNo(), locDetl.getMatnr(), locDetl.getMaktx(), locDetl.getBatch(), orderDetl.getOrderNo(),
//                            issued >= locDetl.getAnfme() ? locDetl.getAnfme() : issued);
//                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                    List<Integer> staNos = staDescService.queryOutStaNosByLocNo(locDetl.getLocNo(), issued >= locDetl.getAnfme() ? 101 : 103);
                    locDto.setLocNo(locDetl.getLocNo());
            List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("brand",orderDetl.getBrand()));
                if (issued > 0 && !locDetls.isEmpty()) {
                    // 根据单据类型返回出库口列表 21出库口,22盘点口,23反修品出库口
                    List<Integer> staNos  = new ArrayList<>();
                    if (order.getDocType() == 21) {
                      staNos.add(3077);
                      staNos.add(3106);
                    } else if(order.getDocType() == 22) {
                        staNos.add(3092);
                        staNos.add(3102);
                        staNos.add(3095);
                    } else if(order.getDocType() == 23) {
                        staNos.add(3041);
                    }
                    LocDto locDto = new LocDto();
                    locDto.setLocNo(locDetls.get(0).getLocNo());
//                    wrkDetl.setMatnr(roll.getSpecs()); // 规格
//                    wrkDetl.setMaktx(roll.getSpecs()); //规格
                    locDto.setBatch(locDetl.getBatch()); // 箱号
                    locDto.setModel(locDetl.getModel()); // 卷号
                    locDto.setBrand(""); // 木箱类型
                    locDto.setOrigin(locDetl.getOrigin()); // 木箱在托盘位置
                    locDto.setWeight(locDetl.getWeight()); // 净重
                    locDto.setVolume(locDetl.getVolume()); // 毛重
                    locDto.setPrice(locDetl.getPrice());
                    locDto.setSpecs(locDetl.getSpecs());
                    locDto.setZpallet(locDetl.getZpallet());
//                    locDto.setBatch(locDetl.getBatch()); // 箱号
//                    locDto.setModel(locDetl.getModel()); // 卷号
                    locDto.setBrand(orderDetl.getBrand()); // 包装组号
//                    locDto.setOrigin(locDetl.getOrigin()); // 木箱在托盘位置
//                    locDto.setWeight(locDetl.getWeight()); // 净重
//                    locDto.setVolume(locDetl.getVolume()); // 毛重
//                    locDto.setPrice(locDetl.getPrice());
//                    locDto.setSpecs(locDetl.getSpecs());
//                    locDto.setZpallet(locDetl.getZpallet());
                    locDto.setOrderNo(orderDetl.getOrderNo());
                    locDto.setStaNos(staNos);
                    locDto.setOrderDetlId(orderDetl.getId());
                    locDtos.add(locDto);
                    exist.add(locDetl.getLocNo());
                    // 剩余待出数量递减
                    issued = issued - locDetl.getAnfme();
//                    exist.add(locDetl.getLocNo());
//                    // 剩余待出数量递减
//                    issued = issued - locDetl.getAnfme();
                } else {
                    break;
                }
            }
            if (issued > 0) {
                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
                locDto.setLack(Boolean.TRUE);
                locDtos.add(locDto);
            }
//            if (issued > 0) {
//                LocDto locDto = new LocDto(null, orderDetl.getMatnr(), orderDetl.getMaktx(), orderDetl.getBatch(), orderDetl.getOrderNo(), issued);
//                locDto.setLack(Boolean.TRUE);
//                locDtos.add(locDto);
//            }
        }
        return R.ok().add(locDtos);
    }
@@ -201,24 +205,90 @@
        Thread.sleep(1000L);
        List<TaskDto> taskDtos = new ArrayList<>();
        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务
        List<StockOutParam> stockOutParams = new ArrayList<>();
        for (LocDto locDto : locDtos) {
            if (locDto.isLack()) { continue; }
            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto);
            if (TaskDto.has(taskDtos, taskDto)) {
                TaskDto dto = TaskDto.find(taskDtos, taskDto);
                assert dto != null;
                dto.getLocDtos().addAll(taskDto.getLocDtos());
            } else {
                taskDtos.add(taskDto);
            boolean flag1 = true;
            for(StockOutParam stockOutParam: stockOutParams) {
                if(stockOutParam.getOutSite().equals(locDto.getStaNo())) { // 有一样的出库口
                    List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                    List<LocDetl> locDetls1 = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("brand", locDto.getBrand()));
                    for(LocDetl locDetl:locDetls1) {
                        StockOutParam.LocDetl  locDetl1 = new StockOutParam.LocDetl();
                        locDetl1.setLocNo(locDetl.getLocNo());
                        locDetl1.setBrand(locDetl.getBrand());
                        locDetl1.setModel(locDetl.getModel());
                        locDetl1.setCount(locDetl.getAnfme());
                        locDetls.add(locDetl1);
                    }
                    stockOutParam.getLocDetls().addAll(locDetls);
                    flag1 = false;
                    break;
                }
            }
            if(flag1) { // 没有一样的出库口
                StockOutParam stockOutParam = new StockOutParam();
                stockOutParam.setOutSite(locDto.getStaNo());
                stockOutParam.setOrderNo(locDto.getOrderNo());
                List<StockOutParam.LocDetl> locDetls = new ArrayList<>();
                List<LocDetl> locDetls1 = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("brand", locDto.getBrand()));
                for(LocDetl locDetl:locDetls1) {
                    StockOutParam.LocDetl  locDetl1 = new StockOutParam.LocDetl();
                    locDetl1.setLocNo(locDetl.getLocNo());
                    locDetl1.setBrand(locDetl.getBrand());
                    locDetl1.setModel(locDetl.getModel());
                    locDetl1.setCount(locDetl.getAnfme());
                    locDetls.add(locDetl1);
                }
                stockOutParam.setLocDetls(locDetls);
                stockOutParams.add(stockOutParam);
            }
        }
        // -----------------------------------------------------------------------------------------------
        for (TaskDto taskDto : taskDtos) {
            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
            workService.stockOut(staNo, taskDto, getUserId());
        for(StockOutParam stockOutParam :stockOutParams) {
            BasDevp staNo = basDevpService.checkSiteStatus(stockOutParam.getOutSite());
            // 获取库位明细
            List<LocDetlDto> locDetlDtos = new ArrayList<>();
            for (StockOutParam.LocDetl paramLocDetl : stockOutParam.getLocDetls()) {
                LocDetl one = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no",paramLocDetl.getLocNo())
                        .eq("brand",paramLocDetl.getBrand()).eq("model",paramLocDetl.getModel()));
                if (null != one) locDetlDtos.add(new LocDetlDto(one, paramLocDetl.getCount(), stockOutParam.getOrderNo()));
            }
            if (!locDetlDtos.isEmpty()) {
                LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", locDetlDtos.get(0).getLocDetl().getLocNo()));
                if (locMast.getLocSts().equals("F") || locMast.getLocSts().equals("D") ){
                    // 根据订单类型判断出库类型
                    Order order = orderService.selectByNo(stockOutParam.getOrderNo());
                    // 启动出库开始
                    workService.stockOut(staNo, locDetlDtos, order.getDocType() ==  22 ? IoWorkType.CHECK_OUT : null, getUserId());
                }else {
                    throw new CoolException("所选库位存在状态不为F、D的库位,库位号:"+locMast.getLocNo()+" 、当前状态:"+locMast.getLocSts()+"-"+locMast.getLocSts$());
                }
            } else {
                throw new CoolException("库存不存在");
            }
        }
//        List<TaskDto> taskDtos = new ArrayList<>();
//        // 根据 (库位 & 出库站) 分组; 理想状态:一组为一次出库任务
//        for (LocDto locDto : locDtos) {
//            if (locDto.isLack()) { continue; }
//            TaskDto taskDto = new TaskDto(locDto.getLocNo(), locDto.getStaNo(), locDto);
//            if (TaskDto.has(taskDtos, taskDto)) {
//                TaskDto dto = TaskDto.find(taskDtos, taskDto);
//                assert dto != null;
//                dto.getLocDtos().addAll(taskDto.getLocDtos());
//            } else {
//                taskDtos.add(taskDto);
//            }
//        }
        // -----------------------------------------------------------------------------------------------
//        for (TaskDto taskDto : taskDtos) {
//            BasDevp staNo = basDevpService.checkSiteStatus(taskDto.getStaNo());
//            workService.stockOut(staNo, taskDto, getUserId());
//        }
//
//        stockOut(staNo, locDetlDtos, IoWorkType.CHECK_OUT, userId);
        return R.ok();
    }
src/main/java/com/zy/asrs/entity/ReportMesOrderResult.java
New file
@@ -0,0 +1,19 @@
package com.zy.asrs.entity;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 上报单据出库结果给MES
 * @createDate 2024/8/27 16:48
 */
@Data
public class ReportMesOrderResult {
    private String groupNo;
    private Integer qty;
    public ReportMesOrderResult(String brand, Integer qty) {
        this.groupNo = brand;
        this.qty = qty;
    }
}
src/main/java/com/zy/asrs/entity/param/ZwmsOutLocWorkDto.java
@@ -16,14 +16,16 @@
    private String orderType; // 订单类型
    private List<Rolls> matDetails;
    List<String> groups; // 包装组号列表
    @Data
    public static class Rolls{
        private String rollNo; // 卷号
        private String boxNo; // 箱号
        private String specs; // 规格
        private Integer splices; // 接头/个
    }
//    private List<Rolls> matDetails;
//
//    @Data
//    public static class Rolls{
//        private String rollNo; // 卷号
//        private String boxNo; // 箱号
//        private String specs; // 规格
//        private Integer splices; // 接头/个
//    }
}
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -34,4 +34,8 @@
    int increaseQtyByOrderNo(@Param("orderNo")String orderNo, @Param("matnr")String matnr, @Param("batch")String batch, @Param("qty")Double qty);
    int increaseWorkQty(@Param("orderId")Long orderId, @Param("matnr")String matnr, @Param("batch")String batch, @Param("workQty")Double workQty);
    void updateOrderDetlByGroupNo(@Param("orderNo") String orderNo,@Param("brand") String brand, @Param("count") double count);
    void updateOrderDetlQtyByGroupNo(@Param("orderNo") String orderNo,@Param("brand") String brand);
}
src/main/java/com/zy/asrs/mapper/OrderMapper.java
@@ -19,4 +19,6 @@
    int addToLogTable(Order order);
    List<Order> selectorderNoL(@Param("orderNo")String orderNo);
    void updateSettleByOrderNo(@Param("orderNo") String orderNo, @Param("status") long status, @Param("userId") Long userId);
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -48,7 +48,7 @@
    /**
     * ZWMS接收MES下发出库任务
     */
    String zwmsOutLocWork(ZwmsOutLocWorkDto param);
    R zwmsOutLocWork(ZwmsOutLocWorkDto param);
    /**
     * 货物到达出库口以后,上报出库结果
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -1423,7 +1423,8 @@
    public R pdaFxprk(FxprkParam param, Long userId) {
        // 根据包装组号获取到木箱卷信息
        List<Mat> list = matService.selectList(new EntityWrapper<Mat>().in("brand", param.getBoxList().stream().map(FxprkParam.Box::getPackageGroupNo).collect(Collectors.toList())));
        List<String> groupNos = param.getBoxList().stream().map(FxprkParam.Box::getPackageGroupNo).collect(Collectors.toList());
        List<Mat> list = matService.selectList(new EntityWrapper<Mat>().in("brand", groupNos));
        if (list.isEmpty()) {
            throw new CoolException("没有查询到该包装组号信息:" + param.getBoxList().toString());
        }
@@ -1493,6 +1494,9 @@
            }
        }
        // 一楼反修品入库的木箱通过包装组号需给mes推送待判
        pushDpToMes(groupNos);
        // 更新目标库位状态
        LocMast locMast = locMastService.selectById(dto.getLocNo());
        if (locMast.getLocSts().equals("O")) {
@@ -1506,6 +1510,64 @@
        }
        return R.ok("入库成功");
    }
    /**
     * 一楼反修品入库的木箱通过包装组号需给mes推送待判
     */
    private void pushDpToMes(List<String> groupNos) {
        boolean success = false;
        // 获取请求头
        Map<String,Object> headers = new HashMap<>();
        headers.put("digi-type","sync ");
        headers.put("digi-protocol","raw");
        headers.put("digi-datakey"," XCommon.ImportData");
        // 构造请求体
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("groupNos", groupNos);
        String body = jsonObject.toJSONString();
        String response = "";
        try {
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.MES_IP_PORT)
                    .setPath(MesConstant.MES_DP_URL)
                    .setHeaders(headers)
                    .setJson(body)
                    .build()
                    .doPost();
            if (!Cools.isEmpty(response)) {
                JSONObject jsonObject1 = JSONObject.parseObject(response);
                int code = (int) jsonObject1.get("code");
                String msg = (String) jsonObject1.get("msg");
                if (code != 200) {
                    throw new CoolException(msg);
                }
                success = true;
            } else {
                log.error("返修品入库给mes推送待判失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKIN_URL, body, response);
                throw new CoolException("返修品入库给mes推送待判失败");
            }
        } catch (Exception e) {
            log.error("返修品入库给mes推送待判异常:{}", e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "返修品入库给mes推送待判",
                        MesConstant.MES_IP_PORT + MesConstant.MES_DP_URL,
                        null,
                        "127.0.0.1",
                        body,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
    }
    public boolean pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo,String barcode) {
        boolean success = false;
        // 获取请求头
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1345,7 +1345,7 @@
    @Override
    @Transactional
    public String zwmsOutLocWork(ZwmsOutLocWorkDto param) {
    public R zwmsOutLocWork(ZwmsOutLocWorkDto param) {
        Order order = orderService.selectByNo(param.getOrderNo());
        if (!Cools.isEmpty(order)) {
@@ -1354,6 +1354,7 @@
        DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE);
        Date now = new Date();
        // 单据主档
        order = new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
@@ -1391,38 +1392,16 @@
                now,    // 修改时间
                null    // 备注
        );
        if (!orderService.insert(order)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
        }
        // 单据明细档
        List<DetlDto> list = new ArrayList<>();
        List<ZwmsOutLocWorkDto.Rolls> orderDetails = param.getMatDetails();
        for (ZwmsOutLocWorkDto.Rolls detail : orderDetails) {
            DetlDto dto = new DetlDto(detail.getRollNo(), detail.getBoxNo(), 1.0);
            dto.setOrderNo(detail.getSpecs());
            dto.setSplices(detail.getSplices());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + 1);
            } else {
                list.add(dto);
            }
        }
        for (DetlDto detlDto : list) {
//            Mat mat = matService.selectByMatnr(detlDto.getMatnr());
        for (String groupNo : param.getGroups()) {
            OrderDetl orderDetl = new OrderDetl();
//            if (Cools.isEmpty(mat)) {
//                throw new CoolException(detlDto.getMatnr() + "编号商品检索失败,请先添加商品");
//            } else {
//                orderDetl.sync(mat);
//            }
            orderDetl.setSpecs(String.valueOf(detlDto.getSplices()));
            orderDetl.setBatch(detlDto.getBatch() == null ? "" : detlDto.getBatch());
            orderDetl.setModel(detlDto.getMatnr());
            orderDetl.setMatnr(detlDto.getOrderNo());
            orderDetl.setMaktx(detlDto.getOrderNo());
            orderDetl.setAnfme(detlDto.getAnfme());
            orderDetl.setBrand(groupNo);
            orderDetl.setBatch("");
            orderDetl.setOrderId(order.getId());
            orderDetl.setOrderNo(order.getOrderNo());
            orderDetl.setCreateBy(9527L);
@@ -1431,12 +1410,14 @@
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
            orderDetl.setAnfme(1.0);
            if (!orderDetlService.insert(orderDetl)) {
                throw new CoolException("生成单据明细失败,请联系管理员");
            }
        }
        return null;
        return R.ok("单据生成成功");
    }
    @Override
@@ -1464,11 +1445,11 @@
        // 到达出库口确认为1,更新工作档状态为57.出库完成
        if (param.getOutLocResult() == 1) {
            wrkMast.setWrkSts(20L);
            // 空托盘到位直接更新工作档状态为14.已出库未确认,空托无需复核确认
            if (!flag || wrkMast.getIoType() == 110) {
//            wrkMast.setWrkSts(20L);
//            // 空托盘到位直接更新工作档状态为14.已出库未确认,空托无需复核确认
//            if (!flag || wrkMast.getIoType() == 110) {
                wrkMast.setWrkSts(14L);
            }
//            }
            wrkMastService.updateById(wrkMast);
        }
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -12,6 +12,8 @@
import com.zy.asrs.entity.param.FullStoreParam;
import com.zy.asrs.entity.param.LocDetlAdjustParam;
import com.zy.asrs.entity.param.StockOutParam;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.*;
@@ -25,6 +27,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
@@ -70,6 +73,10 @@
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Resource
    private OrderMapper orderMapper;
    @Resource
    private OrderDetlMapper orderDetlMapper;
    @Autowired
    private WcsController wcsController;
    @Autowired
@@ -373,7 +380,12 @@
                if (!wrkDetlService.insert(wrkDetl)) {
                    throw new CoolException("保存工作档明细失败");
                }
                // 修改订单明细
                orderDetlMapper.updateOrderDetlByGroupNo(detlDto.getOrderNo(), detlDto.getLocDetl().getBrand(), 1);
                // 修改订单状态
                orderMapper.updateSettleByOrderNo(detlDto.getOrderNo(),2L, userId);
            }
            // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
            locMast = locMastService.selectById(dto.getLocNo());
            if (locMast.getLocSts().equals("F")) {
@@ -1041,13 +1053,14 @@
        }
        //取消出库工作档时,查询单据管理表,回滚作业中数量
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103) {
        if(wrkMast.getIoType() == 101 || wrkMast.getIoType() == 103 || wrkMast.getIoType() == 107) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
            for (WrkDetl wrkDetl : wrkDetls) {
                if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
                        throw new CoolException("订单数据回滚失败");
                    }
//                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
//                        throw new CoolException("订单数据回滚失败");
//                    }
                    orderDetlMapper.updateOrderDetlByGroupNo(wrkDetl.getOrderNo(),wrkDetl.getBrand(),0);
                    //修改订单主表状态,没有作业数量时才可以修改
                    boolean flag = true;
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -38,7 +38,7 @@
        }
    }
//    @Scheduled(cron = "0/5 * * * * ? ")
    @Scheduled(cron = "0/9 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
        String erpReport = Parameter.get().getErpReport();
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -2,12 +2,11 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.ReportMesOrderResult;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlService;
@@ -15,8 +14,6 @@
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
import com.zy.common.model.MesPakinParam;
import com.zy.common.model.MesPakoutParam;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
@@ -25,6 +22,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/7/7
@@ -51,77 +49,18 @@
            return SUCCESS;
        }
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
        // 入库完成上报
        if (docType.getPakin() == 1) {
            MesPakinParam pakinParam = new MesPakinParam();
            pakinParam.setPakinTime(DateUtils.convert(order.getUpdateTime()));
            pakinParam.setLgortFrom("5008");
            pakinParam.setLgortTo("5006");
            for (OrderDetl orderDetl : orderDetls) {
                String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
                pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
            }
            String response = "";
            boolean success = false;
            try {
                response = new HttpHandler.Builder()
                        .setUri(MesConstant.URL)
                        .setPath(MesConstant.PAKIN_URL)
                        .setJson(JSON.toJSONString(pakinParam))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
                    success = true;
                    // 修改订单状态 4.完成 ===>> 6.已上报
                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                } else {
                    log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response);
                    throw new CoolException("上报mes系统失败");
                }
            } catch (Exception e) {
                log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "成品库入库上报",
                            MesConstant.URL + MesConstant.PAKIN_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(pakinParam),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
        // 出库完成上报
        if (docType.getPakout() == 1) {
            MesPakoutParam pakoutParam = new MesPakoutParam();
            pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单"));
            pakoutParam.setPakoutTime(DateUtils.convert(order.getUpdateTime()));
            pakoutParam.setLgortFrom("5006");
            pakoutParam.setLgortTo("1111");
            if (!pakoutParam.isTag()) {
                pakoutParam.setKunnr("C1000");
            }
            pakoutParam.setOrderNo(order.getOrderNo());
            for (OrderDetl orderDetl : orderDetls) {
                String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
                pakoutParam.getList().add(new MesPakoutParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
            }
            List<ReportMesOrderResult> collect = orderDetls.stream().map(orderDetl ->
                    new ReportMesOrderResult(orderDetl.getBrand(), orderDetl.getQty().intValue())).collect(Collectors.toList());
            String response = "";
            boolean success = false;
            try {
                response = new HttpHandler.Builder()
                        .setUri(MesConstant.URL)
                        .setPath(MesConstant.PAKOUT_URL)
                        .setJson(JSON.toJSONString(pakoutParam))
                        .setUri(MesConstant.MES_IP_PORT)
                        .setPath(MesConstant.MES_CKSB_URL)
                        .setJson(JSON.toJSONString(collect))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
@@ -132,28 +71,77 @@
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                } else {
                    log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKOUT_URL, JSON.toJSONString(pakoutParam), response);
                    throw new CoolException("上报mes系统失败");
                    log.error("请求MES出库单上报接口失败!!!url:{};request:{};response:{}", MesConstant.MES_IP_PORT+MesConstant.MES_CKSB_URL, JSON.toJSONString(collect), response);
                    throw new CoolException("请求MES出库单上报接口失败");
                }
            } catch (Exception e) {
                log.error("fail", e);
                log.error("请求MES出库单上报接口异常", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
//                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "成品库出库上报",
                            MesConstant.URL + MesConstant.PAKOUT_URL,
                            "请求MES出库单上报接口",
                            MesConstant.MES_IP_PORT + MesConstant.MES_CKSB_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(pakoutParam),
                            JSON.toJSONString(collect),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
        // 入库完成上报
//        if (docType.getPakin() == 1) {
//            MesPakinParam pakinParam = new MesPakinParam();
//            pakinParam.setPakinTime(DateUtils.convert(order.getUpdateTime()));
//            pakinParam.setLgortFrom("5008");
//            pakinParam.setLgortTo("5006");
//            for (OrderDetl orderDetl : orderDetls) {
//                String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
//                pakinParam.getList().add(new MesPakinParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
//            }
//            String response = "";
//            boolean success = false;
//            try {
//                response = new HttpHandler.Builder()
//                        .setUri(MesConstant.URL)
//                        .setPath(MesConstant.PAKIN_URL)
//                        .setJson(JSON.toJSONString(pakinParam))
//                        .build()
//                        .doPost();
//                JSONObject jsonObject = JSON.parseObject(response);
//                if (jsonObject.getInteger("code").equals(200)) {
//                    success = true;
//                    // 修改订单状态 4.完成 ===>> 6.已上报
//                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
//                        throw new CoolException("服务器内部错误,请联系管理员");
//                    }
//                } else {
//                    log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(pakinParam), response);
//                    throw new CoolException("上报mes系统失败");
//                }
//            } catch (Exception e) {
//                log.error("fail", e);
////            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                return FAIL.setMsg(e.getMessage());
//            } finally {
//                try {
//                    // 保存接口日志
//                    apiLogService.save(
//                            "成品库入库上报",
//                            MesConstant.URL + MesConstant.PAKIN_URL,
//                            null,
//                            "127.0.0.1",
//                            JSON.toJSONString(pakinParam),
//                            response,
//                            success
//                    );
//                } catch (Exception e) { log.error("", e); }
//            }
//        }
        return SUCCESS;
    }
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -3,6 +3,7 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
@@ -12,6 +13,7 @@
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
@@ -35,7 +37,8 @@
    private WaitPakinService waitPakinService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Resource
    private OrderDetlMapper orderDetlMapper;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
        if (wrkMast.getWrkSts() == 4) {
@@ -261,6 +264,27 @@
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("盘点入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                    }
                    for(WrkDetl wrkDetl : wrkDetls57) {
                        if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                            // 更新订单完成数量
                            orderDetlMapper.updateOrderDetlQtyByGroupNo(wrkDetl.getOrderNo(), wrkDetl.getBrand());
                        }
//                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
//                        if (orderDetl==null){
//                            orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
//                        }
//                        try {
//                            if(!Cools.isEmpty(orderDetl)){
//                                if(!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
//                                        orderDetl.getBatch(),wrkDetl.getAnfme())){
////                                    exceptionHandle("全板入库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
////                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
//                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                                    return FAIL.setMsg("全板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
//                                }
//                            }
//                        } catch (Exception ignore){}
                    }
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
                        locMast.setLocSts(wrkMast.getFullPlt().equals("Y")?"F":"D");
@@ -360,29 +384,33 @@
                        return FAIL.setMsg("全板出库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                    }
                    for (WrkDetl wrkDetl : wrkDetls101) {
                        if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                            // 更新订单完成数量
                            orderDetlMapper.updateOrderDetlQtyByGroupNo(wrkDetl.getOrderNo(), wrkDetl.getBrand());
                        }
                        // 更新订单完成数量
//                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
//                        if (orderDetl==null){
//                            orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), null);
//                        }
                        // 箱号+卷号
                        OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("batch",wrkDetl.getBatch())
                                .eq("model",wrkDetl.getModel()));
                        try {
                            if(!Cools.isEmpty(orderDetl)){
                                // 更新订单完成数量
//                                orderDetlService.update(null,new EntityWrapper<OrderDetl>().eq("order_no",orderDetl.getOrderNo())
//                                        .eq("batch",orderDetl.getBatch()).eq("model", orderDetl.getModel()));
                                if(!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), orderDetl.getModel(),
                                        orderDetl.getBatch(),wrkDetl.getAnfme())){
//                                    exceptionHandle("全板出库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
//                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore){}
//                        // 箱号+卷号
//                        OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper<OrderDetl>().eq("batch",wrkDetl.getBatch())
//                                .eq("model",wrkDetl.getModel()));
//
//                        try {
//                            if(!Cools.isEmpty(orderDetl)){
//                                // 更新订单完成数量
////                                orderDetlService.update(null,new EntityWrapper<OrderDetl>().eq("order_no",orderDetl.getOrderNo())
////                                        .eq("batch",orderDetl.getBatch()).eq("model", orderDetl.getModel()));
//                                if(!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), orderDetl.getModel(),
//                                        orderDetl.getBatch(),wrkDetl.getAnfme())){
////                                    exceptionHandle("全板出库 ===>> 更新订单完成数量失败;[workNo={0}],[locNo={1}]",
////                                            wrkMast.getWrkNo(), wrkMast.getLocNo());
//                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
//                                    return FAIL.setMsg("全板出库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getSourceLocNo() + "]");
//                                }
//                            }
//                        } catch (Exception ignore){}
                    }
                    // 删除工作档源库位的库存明细
                    if (!locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", wrkMast.getSourceLocNo()))) {
src/main/java/com/zy/common/constant/MesConstant.java
@@ -13,6 +13,15 @@
    public static final String PAKOUT_URL = "wmsFinprd/api/zy/v1/packOut/sendList";
    // MES接口IP地址
    public static final String MES_IP_PORT = "http://192.168.14.249:8008";
    // 给MES推送一楼反修为待判
    public static final String MES_DP_URL = "/api/Task/InventoryTask";
    // 给MES推送出库单结果
    public static final String MES_CKSB_URL = "/api/Task/InventoryTask";
    // GWCS接口IP地址
    public static final String GWCS_IP_PORT = "http://192.168.14.249:8008";
src/main/resources/mapper/OrderDetlMapper.xml
@@ -86,8 +86,8 @@
        <if test="order_id!=null and order_id!='' ">
            and mod.order_id like '%' + #{order_id} + '%'
        </if>
        <if test="matnr!=null and matnr!='' ">
            and mod.matnr like '%' + #{matnr} + '%'
        <if test="brand!=null and brand!='' ">
            and mod.brand like '%' + #{brand} + '%'
        </if>
        <if test="maktx!=null and maktx!='' ">
            and mod.maktx like '%' + #{maktx} + '%'
@@ -201,5 +201,18 @@
            </otherwise>
        </choose>
    </update>
    <update id="updateOrderDetlByGroupNo">
        update man_order_detl
        set work_qty = #{count}
        where 1=1
          and order_no= #{orderNo} and brand = #{brand}
    </update>
    <update id="updateOrderDetlQtyByGroupNo">
        update man_order_detl
        set qty = 1
        where 1=1
        and order_no = #{orderNo}
        and brand = #{brand}
    </update>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -52,6 +52,17 @@
        where 1=1
        and id = #{orderId}
    </update>
    <update id="updateSettleByOrderNo">
        update man_order
        set settle = #{status}
        ,update_time = getdate()
        <if test="userId != null">
            ,update_by = #{userId}
        </if>
        where 1=1
        and order_no = #{orderNo}
        and settle != #{status}
    </update>
    <select id="selectComplete" resultMap="BaseResultMap">
        select
src/main/webapp/static/js/orderTable.js
@@ -41,7 +41,8 @@
        cols: [[
            // {type: 'numbers', title: '#'},
            {field: 'orderTime', title: '日期'},
            {field: 'orderNo', title: '单据编号', align: 'center'}
            {field: 'orderNo', title: '单据编号', align: 'center'},
            {field: 'docType$', title: '单据类型'},
        ]],
        done: function (res, curr, count) {
            $('#dictTable+.layui-table-view .layui-table-body tbody>tr:first').trigger('click');