自动化立体仓库 - WMS系统
pang.jiabao
2024-12-25 62b94e763b07ce64e5b43274bb428c1c9c46ed6e
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -26,6 +26,8 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
/**
@@ -75,7 +77,9 @@
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Resource
    private InventoryCheckOrderDetlService inventoryCheckOrderDetlService;
    private InventoryCheckOrderService checkOrderService;
    @Resource
    private InventoryCheckOrderDetlService checkOrderDetlService;
    @Resource
    private BasDevpMapper basDevpMapper;
@@ -84,18 +88,29 @@
    public R inLocCallAgv(String sta, String inSta) {
        BasDevp basDevp = basDevpMapper.selectById(inSta);
        // 0.出库模式,1.agv入库中,2.生成入库任务
        if (basDevp.getDevMk().equals("0")) { // 是出库
             // 判断是否有出库任务
            int count = wrkMastService.selectCount(new EntityWrapper<WrkMast>()
                    .eq("sta_no", inSta).lt("wrk_sts",14).in("io_type",101,103,107,110));
            if (count == 0) {
                // 没有出库任务,更改为入库模式
                basDevp.setDevMk("1");
                basDevpMapper.updateById(basDevp);
            } else {
                return R.parse(inSta + "站点存在出库任务");
            }
        // 判断是否有出库任务
        Wrapper<WrkMast> wrapper = new EntityWrapper<WrkMast>().lt("wrk_sts", 14).in("io_type", 101, 103, 107, 110);
        switch (inSta) {
            case "1040":
                wrapper.in("source_sta_no", "1043", "1044");
                break;
            case "2010":
                wrapper.in("source_sta_no", "2013", "2014");
                break;
            case "2000":
                wrapper.in("source_sta_no", "2003", "2004");
                break;
            case "3010":
                wrapper.in("source_sta_no", "3013", "3014");
                break;
            default:
        }
        int count = wrkMastService.selectCount(wrapper);
        log.info("入库呼叫agv呼叫站点:{},目标站点:{},出库任务数:{}",sta,inSta,count);
        if (count != 0) {
            return R.parse(inSta + "站点存在出库任务");
        }
        // 先绑定
@@ -127,10 +142,13 @@
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            jsonObject.getString("message");
            if (jsonObject.getInteger("code").equals(0)) {
                success = true;
                // 入库暂存+1
                basDevp.setInQty(basDevp.getInQty() + 1);
                basDevpMapper.updateById(basDevp);
            } else {
                message = jsonObject.getString("message");
                log.error("入库呼叫agv失败!!!url:{};request:{};response:{}", ApiInterfaceConstant.AGV_IP + ApiInterfaceConstant.AGV_CALL_IN_PATH, body, response);
            }
        } catch (Exception e) {
@@ -360,7 +378,9 @@
                    throw new CoolException("修改单据作业数量失败");
                }
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(),orderDetl.getManu());
//                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(),orderDetl.getManu());
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(),orderDetl.getSuppCode()
                        , orderDetl.getManu(),orderDetl.getSku(),orderDetl.getSupp(),orderDetl.getTemp1(),orderDetl.getTemp2(),orderDetl.getTemp3(),orderDetl.getTemp4());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    assert one != null;
@@ -389,6 +409,14 @@
                waitPakin.setModiTime(now);
                waitPakin.setManu(detlDto.getMark()); //标记
                waitPakin.setOrigin(order.getItemName());//仓库
                waitPakin.setSupp(detlDto.getSuppName()); //供应商
                waitPakin.setSku(detlDto.getCustomer()); //客户名称
                waitPakin.setThreeCode(detlDto.getOrderNo()); //u8发过来的订单号
                waitPakin.setSuppCode(detlDto.getFromOrderNo()); //来源单号
                waitPakin.setTemp1(detlDto.getTemp1());
                waitPakin.setTemp2(detlDto.getTemp2());
                waitPakin.setTemp3(detlDto.getTemp3());
                waitPakin.setTemp4(detlDto.getTemp4());
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
@@ -777,7 +805,7 @@
        Date now = new Date();
        for(OrderDetl orderDetl : orderDetls){
            //查询所有库位状态为F的库位信息
            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(),orderDetl.getBatch(),null,null);
            List<LocDetl> locDetls = locDetlService.queryStock(orderDetl.getMatnr(),orderDetl.getBatch(),null,null,orderDetl.getSupp(),orderDetl.getTemp1(),orderDetl.getTemp2());
            if (locDetls.size() == 0) {
                throw new CoolException("库存中没有该物料");
            }
@@ -897,7 +925,7 @@
            throw new CoolException("盘点列表参数为空");
        }
        for (InventoryCheckOrderDetl orderDetl: param.getParam()){
            InventoryCheckOrderDetl inventoryCheckOrderDetl = inventoryCheckOrderDetlService.selectOne(new EntityWrapper<InventoryCheckOrderDetl>()
            InventoryCheckOrderDetl inventoryCheckOrderDetl = checkOrderDetlService.selectOne(new EntityWrapper<InventoryCheckOrderDetl>()
                    .eq("order_no", orderDetl.getOrderNo())
                    .eq("matnr", orderDetl.getMatnr())
                    .eq("batch", orderDetl.getBatch()));
@@ -909,7 +937,7 @@
            }
            inventoryCheckOrderDetl.setCheckAnfme(orderDetl.getCheckAnfme());
            inventoryCheckOrderDetl.setStatus("2");
            if (!inventoryCheckOrderDetlService.updateById(inventoryCheckOrderDetl)){
            if (!checkOrderDetlService.updateById(inventoryCheckOrderDetl)){
                throw new CoolException("保存盘点信息失败!");
            }
@@ -921,6 +949,164 @@
    @Override
    @Transactional
    public void inventoryUpload(String orderId) {
        if (Cools.isEmpty(orderId)){
            throw new CoolException("盘点单id为空");
        }
        InventoryCheckOrder inventoryCheckOrder = checkOrderService.selectById(orderId);
        if (Cools.isEmpty(inventoryCheckOrder)){
            throw new CoolException("未找到盘点单");
        }
        if (inventoryCheckOrder.getStatus().equals("2")){
            throw new CoolException("盘点单已提交");
        }
        int count = checkOrderDetlService.selectCount(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("order_no", inventoryCheckOrder.getOrderNo()).isNull("check_anfme"));
        if (count>0){
            throw new CoolException("有未完成的盘点任务");
        }
        List<InventoryCheckOrderDetl> checkOrderProfitDetls = checkOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("order_no", inventoryCheckOrder.getOrderNo())
                .addFilter("anfme < check_anfme"));
        if (!checkOrderProfitDetls.isEmpty()){
            //获取盘盈单param
            InventoryErpParam erpProfitParam = getErpProfitParam(inventoryCheckOrder, checkOrderProfitDetls);
            uploadErp(erpProfitParam);
        }
        List<InventoryCheckOrderDetl> checkOrderDeficitDetls = checkOrderDetlService.selectList(new EntityWrapper<InventoryCheckOrderDetl>()
                .eq("order_no", inventoryCheckOrder.getOrderNo())
                .addFilter("anfme > check_anfme"));
        if (!checkOrderDeficitDetls.isEmpty()){
            //获取盘亏单param
            InventoryErpParam erpDeficitParam = getErpDeficitParam(inventoryCheckOrder, checkOrderDeficitDetls);
            uploadErp(erpDeficitParam);
        }
        inventoryCheckOrder.setStatus("2");
        if (!checkOrderService.updateById(inventoryCheckOrder)){
            throw new CoolException("状态更新失败");
        }
    }
    public void uploadErp(InventoryErpParam param){
        String response = "";
        boolean success = false;
        try {
            HashMap<String, Object> headers = new HashMap<>();
            headers.put("Content-Type", "application/json");
            response = new HttpHandler.Builder()
                    .setHeaders(headers)
                    .setUri("10.0.100.160:30108")
                    .setPath("web/apps/gongqi.df.dataTrans/DTInterFace/doJobWithupdateBody")
                    .setJson(JSON.toJSONString(param))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("errcode").equals(0)) {
                success = true;
            } else if (jsonObject.getInteger("errcode").equals(1)) {
                log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PACK_DOWN_URL, JSON.toJSONString(param), response);
                throw new CoolException(jsonObject.getString("msg"));
            } else {
                log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PACK_DOWN_URL, JSON.toJSONString(param), response);
                throw new CoolException("上报mes系统失败");
            }
        } catch (Exception e) {
            log.error("fail", e);
            throw new CoolException(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "盘点单上报",
                        MesConstant.URL + MesConstant.PACK_DOWN_URL,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(param),
                        response,
                        success
                );
            } catch (Exception e) { log.error("", e); }
        }
    }
    public InventoryErpParam getErpProfitParam(InventoryCheckOrder inventoryCheckOrder,List<InventoryCheckOrderDetl> checkOrderProfitDetls) {
        Date date = new Date();
        InventoryErpParam erpProfitParam = new InventoryErpParam();
        InventoryErpParam.DataJson dataJson = new InventoryErpParam.DataJson();
        dataJson.setFlowCode("LIKUwms12GOTmes");
        dataJson.setTableCode("DTInventInTable_pdd");
        dataJson.setLogName("盘盈单-入库单");
        erpProfitParam.setDataJson(dataJson);
        List<InventoryErpParam.UpdateJson> updateJsonList = new ArrayList<>();
        InventoryErpParam.UpdateJson updateJson = new InventoryErpParam.UpdateJson();
        updateJson.setOrderNo(inventoryCheckOrder.getOrderNo());
        updateJson.setDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
        List<InventoryErpParam.MatDetails> matDetails = new ArrayList<>();
        for (InventoryCheckOrderDetl checkOrderProfitDetl: checkOrderProfitDetls){
            InventoryErpParam.MatDetails matDetail = new InventoryErpParam.MatDetails();
            Mat mat = matService.selectByMatnr(checkOrderProfitDetl.getMatnr());
            matDetail.setMatnr(checkOrderProfitDetl.getMatnr());
            matDetail.setBatch(checkOrderProfitDetl.getBatch());
            matDetail.setSpecs(mat.getSpecs());
            Double anfme = new BigDecimal(checkOrderProfitDetl.getCheckAnfme()).subtract(new BigDecimal(checkOrderProfitDetl.getAnfme())).doubleValue();
            matDetail.setAnfme(anfme);
            matDetail.setLocNo(checkOrderProfitDetl.getLocNo());
            matDetail.setWarehouse(checkOrderProfitDetl.getArea());
            matDetail.setSeq(updateJson.getMatDetails() == null?1:updateJson.getMatDetails().size()+1);
            matDetails.add(matDetail);
        }
        updateJson.setMatDetails(matDetails);
        updateJsonList.add(updateJson);
        erpProfitParam.setUpdateJson(updateJsonList);
        return erpProfitParam;
    }
    public InventoryErpParam getErpDeficitParam(InventoryCheckOrder inventoryCheckOrder,List<InventoryCheckOrderDetl> checkOrderDeficitDetls) {
        Date date = new Date();
        InventoryErpParam erpDeficitParam = new InventoryErpParam();
        InventoryErpParam.DataJson dataJson = new InventoryErpParam.DataJson();
        dataJson.setFlowCode("LIKUwms12GOTmes");
        dataJson.setTableCode("DTInventOutTable_pdd");
        dataJson.setLogName("盘亏单-出库单");
        erpDeficitParam.setDataJson(dataJson);
        List<InventoryErpParam.UpdateJson> updateJsonList2 = new ArrayList<>();
        InventoryErpParam.UpdateJson updateJson2 = new InventoryErpParam.UpdateJson();
        updateJson2.setOrderNo(inventoryCheckOrder.getOrderNo());
        updateJson2.setDate(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(date));
        List<InventoryErpParam.MatDetails> matDetails = new ArrayList<>();
        for (InventoryCheckOrderDetl checkOrderDeficitDetl: checkOrderDeficitDetls){
            InventoryErpParam.MatDetails matDetail = new InventoryErpParam.MatDetails();
            Mat mat = matService.selectByMatnr(checkOrderDeficitDetl.getMatnr());
            matDetail.setMatnr(checkOrderDeficitDetl.getMatnr());
            matDetail.setBatch(checkOrderDeficitDetl.getBatch());
            matDetail.setSpecs(mat.getSpecs());
            Double anfme = new BigDecimal(checkOrderDeficitDetl.getAnfme()).subtract(new BigDecimal(checkOrderDeficitDetl.getCheckAnfme())).doubleValue();
            matDetail.setAnfme(anfme);
            matDetail.setLocNo(checkOrderDeficitDetl.getLocNo());
            matDetail.setWarehouse(checkOrderDeficitDetl.getArea());
            matDetail.setSeq(updateJson2.getMatDetails() == null?1:updateJson2.getMatDetails().size()+1);
            matDetails.add(matDetail);
        }
        updateJson2.setMatDetails(matDetails);
        updateJsonList2.add(updateJson2);
        erpDeficitParam.setUpdateJson(updateJsonList2);
        return erpDeficitParam;
    }
    @Override
    @Transactional
    public void stockOut(OrderDetl orderDetl, BasDevp staNo, LocDetl locDetl,
                         Double curOutQty, Integer ioType, Long userId, Date now) {
        // 获取库位