自动化立体仓库 - WMS系统
1
zhang
2 天以前 e58e9ba5347a681cd535115c1f83e4788f39a224
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -1,13 +1,19 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.GwmsGenerateInventoryDto;
import com.zy.asrs.mapper.LocDetlMapper;
import com.zy.asrs.mapper.OrderDetlMapper;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -15,8 +21,7 @@
import org.springframework.transaction.interceptor.TransactionAspectSupport;
import javax.annotation.Resource;
import java.util.Date;
import java.util.List;
import java.util.*;
import java.util.stream.Collectors;
/**
@@ -43,6 +48,12 @@
    private OrderDetlMapper orderDetlMapper;
    @Resource
    private LocDetlMapper locDetlMapper;
    @Resource
    private ApiLogService apiLogService;
    @Resource
    private OrderMapper orderMapper;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 4.入库完成
@@ -59,7 +70,7 @@
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
        try {
            if (null == locMast) {
            if (null == locMast && wrkMast.getIoType() != 3) {
//                exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg("工作档[workNo=" + wrkMast.getWrkNo() + "]库位号错误[locNo=" + wrkMast.getLocNo() + "]");
@@ -112,10 +123,11 @@
                            locDetl.sync(wrkDetl);
                            locDetl.setLocNo(wrkMast.getLocNo()); // 库位号
                            locDetl.setAnfme(wrkDetl.getAnfme()); // 数量
                            locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码
                            locDetl.setZpallet(wrkMast.getBarcode()); // 托盘条码
                            locDetl.setBarcode(wrkMast.getBarcode());
                            locDetl.setModiTime(now);
                            locDetl.setAppeTime(now);
                            locDetl.setBatch("");
//                            locDetl.setBatch("");
                            if (!locDetlService.insert(locDetl)) {
//                                exceptionHandle("全板入库 ===>> 添加库存明细失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
@@ -154,6 +166,8 @@
                            return FAIL.setMsg("全板入库 ===>> 修改库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 入库完成上报mes
                    inBoundCompletePushMes(wrkMast,wrkDetls);
                    break;
                // 拣料入库
                case 53:
@@ -198,6 +212,10 @@
//                        } catch (Exception ignore){}
                    }
                    // 修改捡料入库的库存明细的理货状态为待理货
                    locDetlMapper.updateLhStsByLocNo(wrkMast.getLocNo(),0);
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
                        locMast.setLocSts("F");
@@ -364,6 +382,108 @@
                        return FAIL.setMsg("库位移转 ===>> 修改目标库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                    }
                    break;
                // 跨巷道库位移转完成
                case 12:
                    // 默认目标库位是空板
                    String locSts2 = "D";
                    // 库位移转判断是否为空板移转
                    if (wrkMast.getEmptyMk().equals("N")) {
                        locSts2 = "F";
                        // 转移库存明细数据: 库存号 由工作档源库位变为目标库位
                        if (!locDetlService.updateLocNo(wrkMast.getLocNo(), wrkMast.getSourceLocNo())) {
//                            exceptionHandle("库位移转 ===>> 转移库存明细数据失败;[源库位={0}],[目标库位={1}]", wrkMast.getSourceLocNo(), wrkMast.getLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("库位移转 ===>> 转移库存明细数据失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 跨巷道移库,更新订单明细及订单状态
                    List<WrkDetl> wrkDetlList2 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (!wrkDetlList2.isEmpty()) {
                        // 判断有无单据编号
                        Optional<WrkDetl> any = wrkDetlList2.stream().filter(wrkDetl -> wrkDetl.getOrderNo() != null).findAny();
                        if (any.isPresent()) {
                            String orderNo = any.get().getOrderNo();
                            // 根据单据编号和库位号查询单据明细
                            List<OrderDetl> orderDetlList = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().in("order_no",orderNo).eq("specs",wrkMast.getSourceLocNo()));
                            // 更新单据明细的移库状态
                            for(OrderDetl orderDetl: orderDetlList) {
                                orderDetl.setDanger(2);
                                orderDetl.setUpdateTime(now);
                                orderDetlMapper.updateById(orderDetl);
                            }
                            // 判断单据明细是不是全部移库完成
                            Integer count = orderDetlMapper.selectCount(new EntityWrapper<OrderDetl>().lt("danger", 2).eq("order_no", orderNo));
                            if (count == 0) {
                                // 更新单据为已完成
                                // 直接更新为6已上报,方便转储历史
                                orderMapper.updateSettleByOrderNo(orderNo,6,null);
                            }
                        }
                    } else { // 空板转移没有工作明细,但是要更新单据明细状态
                        // 只有一条作业中的移库单据
                        List<Order> orderList = orderMapper.selectList(new EntityWrapper<Order>().eq("doc_type", 24).le("settle", 3));
                        if(orderList.isEmpty()) {
                            log.error("没有获取到正在执行中的移库单据");
                        } else {
                            Order order = orderList.get(0);
                            // 根据单据编号和库位号查询单据明细
                            List<OrderDetl> orderDetlList = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().in("order_no",order.getOrderNo()).eq("specs",wrkMast.getSourceLocNo()));
                            // 更新单据明细的移库状态
                            for(OrderDetl orderDetl: orderDetlList) {
                                orderDetl.setDanger(2);
                                orderDetl.setUpdateTime(now);
                                orderDetlMapper.updateById(orderDetl);
                            }
                            // 判断单据明细是不是全部移库完成
                            Integer count = orderDetlMapper.selectCount(new EntityWrapper<OrderDetl>().lt("danger", 2).eq("order_no", order.getOrderNo()));
                            if (count == 0) {
                                // 更新单据为已完成
                                orderMapper.updateSettleByOrderNo(order.getOrderNo(),6,null);
                            }
                        }
                    }
                    // 修改源库位状态 ==> O
                    LocMast sourceLoc2 = locMastService.selectById(wrkMast.getSourceLocNo());
                    if (null != sourceLoc2) {
                        sourceLoc2.setBarcode("");
                        sourceLoc2.setLocSts("O");
                        sourceLoc2.setSheetNo("0");
                        sourceLoc2.setModiTime(now);
                        sourceLoc2.setIoTime(now);
                        if (!locMastService.updateById(sourceLoc2)) {
//                            exceptionHandle("库位移转 ===>> 修改源库位状态失败;[workNo={0}],[sourceLoc={1}]", wrkMast.getWrkNo(), wrkMast.getSourceLocNo());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("库位移转 ===>> 修改源库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 修改目标库位状态 ==> .locSts
                    locMast.setLocSts(locSts2);
                    locMast.setBarcode(wrkMast.getBarcode());
                    locMast.setSheetNo("0");
                    locMast.setIoTime(now);
                    locMast.setModiTime(now);
                    if (!locMastService.updateById(locMast)) {
//                        exceptionHandle("库位移转 ===>> 修改目标库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("库位移转 ===>> 修改目标库位状态失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                    }
                    break;
                // 空闲理货入库
                case 59:
                    // 修改库位状态 S ====>> F
                    if (locMast.getLocSts().equals("S")) {
                        locMast.setLocSts("F");
                        locMast.setModiTime(now);
                        locMastService.updateById(locMast);
                    }
                    // 修改空闲理货入库的库存明细的理货状态为待理货
                    locDetlMapper.updateLhStsByLocNo(wrkMast.getLocNo(),0);
                    break;
                default:
                    break;
            }
@@ -384,6 +504,94 @@
        return SUCCESS;
    }
    private void inBoundCompletePushMes(WrkMast wrkMast, List<WrkDetl> wrkDetls) {
        GwmsGenerateInventoryDto gwmsGenerateInventoryDto = new GwmsGenerateInventoryDto();
        gwmsGenerateInventoryDto.setWarehouseType(4);
        gwmsGenerateInventoryDto.setBarcode(wrkMast.getBarcode());
        gwmsGenerateInventoryDto.setPalletizingNo(wrkMast.getStaNo());
        gwmsGenerateInventoryDto.setGroupOrderNumber(wrkMast.getMemo());
        List<GwmsGenerateInventoryDto.MatList> matLists = new ArrayList<>();
        for (WrkDetl wrkDetl : wrkDetls) {
            boolean flag = true;
            for (GwmsGenerateInventoryDto.MatList matList : matLists) {
                if (matList.getPackageGroupNo().equals(wrkDetl.getBrand())) {
                    matList.getRolls().add(new GwmsGenerateInventoryDto.Rolls(wrkDetl.getModel(),
                            wrkDetl.getUnit(), wrkDetl.getMaktx(), wrkDetl.getLength(),
                            Integer.parseInt(wrkDetl.getSpecs()), wrkDetl.getWeight(), wrkDetl.getVolume(),
                            wrkDetl.getManuDate()));
                    flag = false;
                    break;
                }
            }
            if (flag) {
                GwmsGenerateInventoryDto.MatList matList = new GwmsGenerateInventoryDto.MatList();
                matList.setBoxPos(wrkDetl.getOrigin());
                matList.setPackageGroupNo(wrkDetl.getBrand());
                matList.setOutOrIn("in");
                matList.setStockType(wrkMast.getWhsType() == 1 ? "返修入库" : "成品入库");
                matList.setBoxType(wrkDetl.getColor());
                matList.setRollType(wrkDetl.getManu());
                matList.setWideInWidth(wrkDetl.getSku());
                matList.setThickness(wrkDetl.getItemNum());
                List<GwmsGenerateInventoryDto.Rolls> rollsList = new ArrayList<>();
                GwmsGenerateInventoryDto.Rolls roll = new GwmsGenerateInventoryDto.Rolls(wrkDetl.getModel(),
                        wrkDetl.getUnit(), wrkDetl.getMaktx(), wrkDetl.getLength(),
                        Integer.parseInt(wrkDetl.getSpecs()), wrkDetl.getWeight(), wrkDetl.getVolume(),
                        wrkDetl.getManuDate());
                rollsList.add(roll);
                matList.setRolls(rollsList);
                matLists.add(matList);
            }
        }
        gwmsGenerateInventoryDto.setMatList(matLists);
        boolean success = false;
        // 获取请求头
        Map<String, Object> headers = new HashMap<>();
        headers.put("Content-Type", "application/json;charset=UTF-8");
        // 构造请求体
        String body = JSON.toJSONString(gwmsGenerateInventoryDto);
        String response = "";
        try {
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.MES_CC_IP_PORT)
                    .setPath(MesConstant.MES_CC_FXRK_URL)
                    .setHeaders(headers)
                    .setJson(body)
                    .build()
                    .doPost();
            if (!Cools.isEmpty(response)) {
                JSONObject jsonObject1 = JSONObject.parseObject(response);
                int code = (int) jsonObject1.get("code");
                boolean state = jsonObject1.getBoolean("state");
                if (code == 200 && state) {
                    success = true;
                }
            } else {
                log.error("入库完成推送mes失败!!!url:{};request:{};response:{}", MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL, body, response);
            }
        } catch (Exception e) {
            log.error("入库完成推送mes异常:{}", e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "入库完成推送mes",
                        MesConstant.MES_CC_IP_PORT + MesConstant.MES_CC_FXRK_URL,
                        null,
                        "127.0.0.1",
                        body,
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
    }
    private ReturnT<String> doOut(WrkMast wrkMast){
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());