自动化立体仓库 - WMS系统
zyx
2023-12-21 f35fc1f577af2cb76198a520f47b4c7b85fb170e
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,17 +1,16 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
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.entity.param.PackParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.ReportQueryMapper;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
@@ -21,10 +20,12 @@
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.StringUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
 * Created by vincent on 2022/4/9
@@ -51,6 +52,14 @@
    private TagService tagService;
    @Autowired
    private TagMapper tagMapper;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private ReportQueryMapper reportQueryMapper;
    @Override
    @Transactional
@@ -107,7 +116,7 @@
        for (DetlDto detail : orderDetails) {
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch(),dto.getCsocode(),dto.getIsoseq(),null);
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
            } else {
@@ -152,7 +161,7 @@
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                    //result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                if (order.getSettle() == 4L) {
                    // 修改订单状态 4.完成 ===>> 6.已上报
@@ -172,7 +181,7 @@
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                    //result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                // 修改订单状态 4.完成 ===>> 6.已上报
                if (!orderService.updateSettle(order.getId(), 6L, null)) {
@@ -184,10 +193,15 @@
    }
    @Override
    @Transactional
    public void pakoutOrderCreate(OpenOrderPakoutParam param) {
        Order order = orderService.selectByNo(param.getOrderNo());
        // 如果单据不存在则添加;如果单据存在,作业中无法修改,反之则修改单据
        if (!Cools.isEmpty(order)) {
            throw new CoolException(param.getOrderNo() + "单据已存在,请勿重复提交");
            if (order.getSettle() > 1L) {
                throw new CoolException(param.getOrderNo() + "正在出库,无法修改单据");
            }
            orderService.remove(order.getId());
        }
        DocType docType = docTypeService.selectOrAdd(param.getOrderType(), Boolean.FALSE);
        Date now = new Date();
@@ -237,7 +251,7 @@
        for (DetlDto detail : orderDetails) {
            DetlDto dto = new DetlDto(detail.getMatnr(), detail.getBatch(), detail.getAnfme());
            if (DetlDto.has(list, dto)) {
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch());
                DetlDto detlDto = DetlDto.find(list, dto.getMatnr(), dto.getBatch(),dto.getCsocode(),dto.getIsoseq(),null);
                assert detlDto != null;
                detlDto.setAnfme(detlDto.getAnfme() + detail.getAnfme());
            } else {
@@ -281,7 +295,7 @@
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                    //result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                if (order.getSettle() == 4L) {
                    // 修改订单状态 4.完成 ===>> 6.已上报
@@ -301,7 +315,7 @@
                result.setOrderType(order.getDocType$());
                List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
                for (OrderDetl orderDetl : orderDetls) {
                    result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                    //result.getOrderDetails().add(new DetlDto(orderDetl.getOrderNo(), orderDetl.getMatnr(), orderDetl.getBatch(), orderDetl.getQty()));
                }
                // 修改订单状态 4.完成 ===>> 6.已上报
                if (!orderService.updateSettle(order.getId(), 6L, null)) {
@@ -332,8 +346,8 @@
        Date now = new Date();
        pack = new Pack(
                param.getBarcode(),    // 条码[非空]
                analyse.getMatnr(),    // 商品编号
                analyse.getBarcode(),    // 批号
                analyse.getMatnr(),    // 物料号
                analyse.getBarcode(),    // 序列码
                1L,    // 订单状态
                1,    // 状态
                now,    // 添加时间
@@ -428,9 +442,406 @@
            if (!matService.insert(mat)) {
                throw new CoolException("服务器内部错误,请联系管理员");
            } else {
                log.info("打包上线添加新物料[商品编号:{}]", mat.getMatnr());
                log.info("打包上线添加新物料[物料号:{}]", mat.getMatnr());
            }
        }
    }
    @Override
    @Transactional
    public MatSyncParam syncMat(MatSyncParam param) {
        if (Cools.isEmpty(param.getMats()) || param.getMats().size() <=0 ) {
            throw new CoolException("商品数据为空");
        }
        MatSyncParam matSyncParam = new MatSyncParam();
        ArrayList<MatSyncParam.Mats> matParams = new ArrayList<>();
        Tag tag = tagService.selectByName("全部", 1);
        for (MatSyncParam.Mats matParam : param.getMats()){
            Date date = new Date();
            Mat mat = matService.selectByMatnr(matParam.getMatnr());
            if (Cools.isEmpty(mat)) {
                Mat matNew = new Mat();
                matNew.setTagId(tag.getId());
                matNew.setMatnr(matParam.getMatnr());//物料编码
                matNew.setMaktx(matParam.getMaktx());//物料名称
                matNew.setSpecs(matParam.getSpecs());//规格
                matNew.setModel(matParam.getModel());//型号
                matNew.setColor(matParam.getColor());//颜色
                matNew.setUnit(matParam.getUnit());//单位
                matNew.setMemo(matParam.getMemo());//备注
                matNew.setCreateBy(9999L);//9999表示erp下发
                matNew.setCreateTime(date);
                matNew.setUpdateBy(9999L);//9999表示erp下发
                matNew.setUpdateTime(date);
                if (matService.insert(matNew)) {
                    callApiLogSave(matParam, "/open/asrs/mat/v1", "接收ERP下发商品信息成功!添加商品信息成功!", true);
                    matParam.setType(true);
                } else {
                    callApiLogSave(matParam, "/open/asrs/mat/v1", "添加ERP下发商品信息失败!!!状态异常!!!", false);
                    matParam.setType(false);
                    matParam.setMemo("添加ERP下发商品信息失败!");
                }
            } else {
                callApiLogSave(matParam, "/open/asrs/mat/v1", "接收ERP下发商品信息失败!!!商品已存在!!!", false);
                matParam.setType(false);
                matParam.setMemo("商品已存在!");
            }
            matParams.add(matParam);
        }
        matSyncParam.setMats(matParams);
        return matSyncParam;
    }
    public void callApiLogSave(MatSyncParam.Mats matParam, String tableName, String response, Boolean bool) {
        apiLogService.save("ERP下发商品信息", tableName, "null", "10.10.10.1",
                "物料编码:" + matParam.getMatnr() + "、物料名称:" + matParam.getMaktx() + "、规格:" + matParam.getSpecs() + "、备注:" + matParam.getMemo(),
                response, bool);
    }
    @Override
    @Transactional
    public void combMes(CombParam param) {
        Long userId=9999l;
        if (Cools.isEmpty(param.getBarcode(), param.getCombMats())) {
            callApiLogSaveMES(null, null, BaseRes.PARAM, false);
            throw new CoolException(BaseRes.PARAM);
        }
        if(param.getBarcode().length()!=8){
            callApiLogSaveMES(param, null, param.getBarcode() + ":条码长度不是8位", false);
            throw new CoolException("条码长度不是8位===>>" + param.getBarcode());
        }
        // 判断是否有相同条码的数据
        if (waitPakinService.selectCount(new EntityWrapper<WaitPakin>().
                eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
            callApiLogSaveMES(param, null, param.getBarcode() + "数据正在进行入库", false);
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
        int countWrk = wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("zpallet",param.getBarcode()));
        if (countLoc > 0) {
            callApiLogSaveMES(param, null, param.getBarcode() + ":库存条码数据已存在", false);
            throw new CoolException("库存条码数据已存在===>>" + param.getBarcode());
        }else if (countWrk > 0){
            callApiLogSaveMES(param, null, param.getBarcode() + ":工作明细档已存在此数据", false);
            throw new CoolException("工作明细档已存在此数据===>>" + param.getBarcode());
        }
        Date now = new Date();
        try{
            // 生成入库通知档
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                detlDto.setContainerCode(elem.getContainerCode());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch(),detlDto.getCsocode(),detlDto.getIsoseq(),detlDto.getContainerCode());
                    assert one != null;
                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
                } else {
                    detlDtos.add(detlDto);
                }
            });
            for (DetlDto detlDto : detlDtos) {
                Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                if (Cools.isEmpty(mat)) {
                    callApiLogSaveMES(param, null,mat.getMatnr()+"商品档案不存在", false);
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                WaitPakin waitPakin = new WaitPakin();
                waitPakin.sync(mat);
                waitPakin.setBatch(detlDto.getBatch());
                waitPakin.setZpallet(param.getBarcode());   // 托盘码
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(detlDto.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setAppeUser(userId);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                if (!waitPakinService.insert(waitPakin)) {
                    callApiLogSaveMES(param, null,mat.getMatnr()+"保存入库通知档失败", false);
                    throw new CoolException("保存入库通知档失败");
                }
            }
        }catch (Exception e){
            callApiLogSaveMES(null, null,""+e, false);
        }
        callApiLogSaveMES(param, param.getCombMats().get(0),"组托成功", true);
    }
    public void callApiLogSaveMES(CombParam combParam,CombParam.CombMat combMat, String response, Boolean bool) {
        if (Cools.isEmpty(combParam)){
            apiLogService.save("MES下发入库通知单", "/open/asrs/comb/v1", "null", "10.10.10.1",
                    "",
                    response, bool);
        }else if (Cools.isEmpty(combMat)){
            apiLogService.save("MES下发入库通知单", "/open/asrs/comb/v1", "null", "10.10.10.1",
                    "托盘码:" + combParam.getBarcode(),
                    response, bool);
        }else {
            apiLogService.save("MES下发入库通知单", "/open/asrs/comb/v1", "null", "10.10.10.1",
                    "托盘码:" + combParam.getBarcode() + "、物料编号:" + combMat.getMatnr() + "、数量:" + combMat.getAnfme(),
                    response, bool);
        }
    }
    /**
     * 入库记录获取
     */
    @Override
    @Transactional
    public List<ViewWorkInBean> inlogERP() {
        List<ViewWorkInBean> viewWorkInERP = reportQueryMapper.getViewWorkInERP();
        ArrayList<ViewWorkInBean> viewWorkInBeans = new ArrayList<>();
        for (ViewWorkInBean viewWorkInBean:viewWorkInERP){
            viewWorkInBean.sype();
            viewWorkInBeans.add(viewWorkInBean);
        }
        return viewWorkInBeans;
    }
    /**
     * 出库记录获取
     */
    @Override
    @Transactional
    public List<ViewWorkInBean> outlogERP() {
        List<ViewWorkInBean> viewWorkInERP = reportQueryMapper.getViewWorkOutERP();
        ArrayList<ViewWorkInBean> viewWorkInBeans = new ArrayList<>();
        for (ViewWorkInBean viewWorkInBean:viewWorkInERP){
            viewWorkInBean.sype();
            viewWorkInBeans.add(viewWorkInBean);
        }
        return viewWorkInBeans;
    }
    @Transactional
    public boolean syncMat(MatInfoParam param) {
        Date now = new Date();
        Mat mat = matService.selectByMatnr(param.getCinvcode());
        boolean update = true;
        if(Cools.isEmpty(matService.selectByMatnr(param.getCinvcode()))){
            //物料号
            mat = new Mat();
            mat.setMatnr(param.getCinvcode());
            mat.setCreateTime(now);
            mat.setCreateBy(9999L);
            update = false;
//            callApiLogSave(param, "/open/asrs/mat/v1", "接收ERP下发商品信息失败!!!商品已存在!!!", false);
//            param.setType(false);
//            param.setMemo("商品已存在!");
//            return false;
        }
        //Mat mat = new Mat();
        //物料号
        //mat.setMatnr(param.getCinvcode());
        //物料名称
        mat.setMaktx(param.getCinvname());
        //规格型号
        mat.setSpecs(param.getCInvStd());
        //存货分类编码
        mat.setBrand(param.getCinvccode());
        //存货分类名称
        mat.setColor(param.getCInvCName());
        //计量单位
        mat.setUnit(param.getCComUnitName());
        //进项税
        mat.setPrice(param.getIImpTaxRate());
        //销项税
        mat.setUnits(param.getITaxRate());
        //启用日期
        mat.setDsDate(param.getDSDate());
        //建档人
        mat.setSupp(param.getCCreatePerson());
        //建档日期
        mat.setDInvCreateDatetime(param.getDInvCreateDatetime());
        //通用型号
        mat.setModel(param.getCinvdefine4());
        //9999表示erp下发
        mat.setUpdateBy(9999L);
        mat.setTagId(1L);
        mat.setUpdateTime(now);
        if(update){
            if (matService.updateById(mat)){
                callApiLogSave(param, "/open/asrs/mat/v1", "接收ERP下发商品信息成功!添加商品信息成功!", true);
                param.setUpdate(true);
            } else {
                callApiLogSave(param, "/open/asrs/mat/v1", "添加ERP下发商品信息失败!!!状态异常!!!", false);
                param.setError(true);
                param.setMemo("添加ERP下发商品信息失败!");
            }
        }else {
            if (matService.insert(mat)) {
                callApiLogSave(param, "/open/asrs/mat/v1", "接收ERP下发商品信息成功!添加商品信息成功!", true);
                param.setInsert(true);
            } else {
                callApiLogSave(param, "/open/asrs/mat/v1", "添加ERP下发商品信息失败!!!状态异常!!!", false);
                param.setError(true);
                param.setMemo("添加ERP下发商品信息失败!");
            }
        }
        return true;
    }
    @Transactional
    public boolean syncOrder(Map<String, Object> param, boolean pakin) {
        if(Cools.isEmpty(param) || Cools.isEmpty(param.get("orderDetails"))){
            throw new CoolException("单据参数为空或者单据详情为空,无法生成单据信息");
        }
        if(!Cools.isEmpty(orderService.selectByNo(param.get("id").toString()))){
            throw new CoolException("该单据已存在,无法生成单据信息");
        }
        Date now = new Date();
        Order order = orderMapping(param,now,pakin);
        orderService.insert(order);
        List<Map<String, Object>> orderDetails = (List<Map<String, Object>>) param.get("orderDetails");
        orderDetails.forEach(odParam -> {
            OrderDetl od = orderDetlMapping(order,odParam,now);
            orderDetlService.insert(od);
        });
        return true;
    }
    @Transactional
    public boolean orderDelete(String orderNo) {
        Order order = orderService.selectByNo(orderNo);
        if(Cools.isEmpty(order)){
            throw new CoolException("单据不存在,无法删除单据");
        }
        if(order.getSettle() != 1){
            return false;
        }
        orderService.deleteById(order);
        orderDetlService.delete(new EntityWrapper<OrderDetl>().eq("order_no",orderNo));
        return true;
    }
    private Order orderMapping(Map<String, Object> param, Date now, boolean pakin){
        Order order = new Order();
        //uuid
        order.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        //核算主体
        //order.setItemName(param.get("account").toString());
        order.setItemName(toString(param.get("account")));
        //单据唯一表示
        //order.setOrderNo(param.get("id").toString());
        order.setOrderNo(toString(param.get("id")));
        //业务类型
        //order.setDefNumber(param.get("cBusType").toString());
        order.setDefNumber(toString(param.get("cVouchType")));
        //单据类型
        DocType docType = docTypeService.selectOrAdd(param.get("cBusType").toString(), pakin);
        order.setDocType(docType.getDocId());
        //单据日期
        //order.setOrderTime(param.get("dDate").toString());
        order.setOrderTime(toString(param.get("dDate")));
        //供应商/客户编码
        //order.setCstmrName(param.get("ks").toString());
        order.setCstmrName(toString(param.get("ks")));
        //仓库
        //order.setTel(param.get("cWhName").toString());
        order.setTel(toString(param.get("cWhName")));
        //出入库类别
        //setOperMemb(param.get("cRdName").toString());
        order.setOperMemb(toString(param.get("cRdName")));
        //部门
        //order.setSalesman(param.get("cDepCode").toString());
        order.setSalesman(toString(param.get("cDepCode")));
        //备注
        //order.setMemo(param.get("cMemo").toString());
        order.setMemo(toString(param.get("cMemo")));
        //制单人
        //order.setShipCode(param.get("cMaker").toString());
        order.setShipCode(toString(param.get("cMaker")));
        order.setCreateTime(now);
        order.setUpdateTime(now);
        //订单状态
        order.setSettle(1L);
        //状态
        order.setStatus(1);
        return order;
    }
    private OrderDetl orderDetlMapping(Order order, Map<String, Object> odParam, Date now){
        OrderDetl od = new OrderDetl();
        od.setOrderId(order.getId());
        od.setOrderNo(order.getOrderNo());
        //行唯一标识
        //od.setItemNum(odParam.get("autoId").toString());
        od.setItemNum(toString(odParam.get("autoId")));
        //存货编码
        //od.setMatnr(odParam.get("cInvCode").toString());
        od.setMatnr(toString(odParam.get("cInvCode")));
        //存货名称
        //od.setMaktx(odParam.get("cInvName").toString());
        od.setMaktx(toString(odParam.get("cInvName")));
        //规格型号
        //od.setSpecs(odParam.get("cInvStd").toString());
        od.setSpecs(toString(odParam.get("cInvStd")));
        //计量单位
        //od.setUnit(odParam.get("cComUnitName").toString());
        od.setUnit(toString(odParam.get("cComUnitName")));
        //数量
        od.setAnfme(Double.parseDouble(odParam.get("iQuantity").toString()));
        //od.setAnfme(toString(odParam.get("iQuantity")));
        //行号
        //od.setBrand(odParam.get("irowno").toString());
        //od.setBrand(toString(odParam.get("irowno")));
        od.setManu(toString(odParam.get("irowno")));
        //销售订单号
        //od.setColor(odParam.get("csocode").toString());
        //od.setColor(toString(odParam.get("csocode")));
        od.setThreeCode(toString(odParam.get("csocode")));
        //销售订单行号
        //od.setOrigin(odParam.get("isoseq").toString());
        //od.setOrigin(toString(odParam.get("isoseq")));
        od.setDeadTime(toString(odParam.get("isoseq")));
        od.setStatus(1);
        od.setQty(0.0D);
        od.setCreateBy(9999L);
        od.setCreateTime(now);
        od.setUpdateBy(9999L);
        od.setUpdateTime(now);
        return od;
    }
    private String toString(Object o){
        if(StringUtils.isEmpty(o)){
            return null;
        }else{
            return o.toString();
        }
    }
    public void callApiLogSave(MatInfoParam matParam, String tableName, String response, Boolean bool) {
        apiLogService.save("ERP下发商品信息", tableName, "null", "10.10.10.1",
                "物料编码:" + matParam.getCinvcode() + "、物料名称:" + matParam.getCinvname() + "、规格:" + matParam.getCInvStd() + "、备注:" + matParam.getMemo(),
                response, bool);
    }
    public static void main(String[] args) {
        Object s = null;
        if(StringUtils.isEmpty(s)){
            System.out.println("null");
        }else {
            System.out.println(s.toString());
        }
    }
}