自动化立体仓库 - WMS系统
#
野心家
2023-10-10 ba4e5ac7bd44e0d24f480b44a94cfe8d256a86e9
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -3,23 +3,28 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
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.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.NodePakoutParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.service.*;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.WorkLogHandler;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.SaasUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.constant.MesConstant;
import com.zy.common.entity.Parameter;
import com.zy.common.model.DetlDto;
import com.zy.common.model.MesCombParam;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.User;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -59,6 +64,16 @@
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WorkLogHandler workLogHandler;
    @Autowired
    private ManLocDetlService manLocDetlService;
    @Autowired
    private WaitPakinLogService waitPakinLogService;
    @Autowired
    private NodeService nodeService;
    @Autowired
    private ManPakOutService manPakOutService;
    @Override
    @Transactional
@@ -71,6 +86,16 @@
                eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        // todo: 不下线重新入库
        WrkMast wrkMast = wrkMastService.selectByBarcode(param.getBarcode());
        if (wrkMast != null && wrkMast.getWrkSts() == 18) {
            ReturnT<String> start = workLogHandler.start(wrkMast);
            if (!start.isSuccess()) {
                log.error("工作档[workNo={}]历史档处理失败", wrkMast.getWrkNo());
            }
        }
        Date now = new Date();
        // 无单组托
@@ -79,9 +104,11 @@
            // 生成入库通知档
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(), elem.getCsocode(), elem.getIsoseq());
                detlDto.setContainerCode(elem.getContainerCode());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    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 {
@@ -106,6 +133,10 @@
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                waitPakin.setThreeCode(detlDto.getCsocode());
                waitPakin.setDeadTime(detlDto.getIsoseq());
                waitPakin.setSuppCode(detlDto.getContainerCode());
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
@@ -130,9 +161,11 @@
                    throw new CoolException("修改单据明细数量失败");
                }
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme(),elem.getCsocode(),elem.getIsoseq());
                detlDto.setContainerCode(elem.getContainerCode());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    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 {
@@ -156,6 +189,11 @@
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                waitPakin.setThreeCode(detlDto.getCsocode());
                waitPakin.setDeadTime(detlDto.getIsoseq());
                waitPakin.setSuppCode(detlDto.getContainerCode());
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
@@ -276,10 +314,12 @@
                }
                Mat analyse = MatUtils.analyseMat(elem.getMatnr());
                // 条码、物料代码、序列号、数量
                DetlDto detlDto = new DetlDto(elem.getMatnr(), analyse.getMatnr(), analyse.getBarcode(), elem.getAnfme());
                DetlDto detlDto = new DetlDto(elem.getMatnr(), analyse.getMatnr(), analyse.getBarcode(), elem.getAnfme(),elem.getCsocode(),elem.getIsoseq());
//                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 one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch(),detlDto.getCsocode(),detlDto.getIsoseq(),detlDto.getContainerCode());
                    assert one != null;
                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
                } else {
@@ -384,6 +424,10 @@
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                waitPakin.setThreeCode(detlDto.getCsocode());
                waitPakin.setDeadTime(detlDto.getIsoseq());
                waitPakin.setSuppCode(detlDto.getContainerCode());
                if (!waitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
@@ -400,4 +444,169 @@
        }
    }
    @Transactional
    public void nodePutway(String zpallet, String locNo, User user) {
        Date now = new Date();
        //增加平库库存
        List<WaitPakin> waitPakinList = waitPakinService.selectList(new EntityWrapper<WaitPakin>().eq("zpallet", zpallet));
        if(Cools.isEmpty(waitPakinList)){
            throw new CoolException("该托盘码未组托");
        }
        waitPakinList.forEach(waitPakin -> {
            //料想码
            String containerCode = waitPakin.getSuppCode();
            //如果当前料想码已存在,则修改该料想的物料数量
            ManLocDetl manLocDetl = manLocDetlService.selectOne(new EntityWrapper<ManLocDetl>().eq("container_code", containerCode));
            if(Cools.isEmpty(manLocDetl)){
                saveManlocDetl(waitPakin,now,locNo);
            }else{
                if(Cools.eq(manLocDetl.getMatnr(),waitPakin.getMatnr())
                        && Cools.eq(manLocDetl.getCsocode(),waitPakin.getThreeCode())
                        && Cools.eq(manLocDetl.getIsoseq(),waitPakin.getDeadTime())){
                    manLocDetl.setAnfme(manLocDetl.getAnfme() + waitPakin.getAnfme());
                    manLocDetlService.update(manLocDetl,new EntityWrapper<ManLocDetl>()
                            .eq("loc_no",manLocDetl.getLocNo())
                            .eq("container_code",manLocDetl.getContainerCode()));
                }else{
                    saveManlocDetl(waitPakin,now,locNo);
                }
            }
            //生成平库入出库日志
            SaasUtils.insertLog(0,locNo,waitPakin.getMatnr(), waitPakin.getAnfme(),user.getUsername());
        });
        //生成入库通知历史档
        waitPakinLogService.save(zpallet);
        //删除入库通知档
        waitPakinService.delete(new EntityWrapper<WaitPakin>().eq("zpallet", zpallet));
        orderService.checkComplete(waitPakinList.get(0).getOrderNo());
    }
    @Transactional
    public void nodePakout(NodePakoutParam param, User user) {
        Node node = nodeService.selectOne(new EntityWrapper<Node>().eq("name", param.getLocNo()));
        Order order = orderService.selectOne(new EntityWrapper<Order>().eq("order_no", param.getOrderNo()));
        if (Cools.isEmpty(node, order)) {
            throw new CoolException("参数为空");
        }
        //查询当前物料的订单详情
        Wrapper<OrderDetl> orderDetlWrapper = new EntityWrapper<OrderDetl>().eq("order_no", param.getOrderNo()).eq(false, "status", 1);
        Utils.wapperSetCondition(orderDetlWrapper,"three_code",param.getCsocode());
        Utils.wapperSetCondition(orderDetlWrapper,"dead_time",param.getIsoseq());
        Utils.wapperSetCondition(orderDetlWrapper,"matnr",param.getMatnr());
        //Utils.confirmOnlyMat(orderDetlWrapper,param.getMatnr(),param.getCsocode(),param.getIsoseq());
        OrderDetl orderDetl = orderDetlService.selectOne(orderDetlWrapper);
        //查询当前拣货单信息
        Wrapper<ManPakOut> manPakOutWrapper = new EntityWrapper<ManPakOut>().eq("wrk_no", param.getWrkNo());
        ManPakOut manPakOut = manPakOutService.selectOne(manPakOutWrapper);
        if(Cools.isEmpty(manPakOut) || manPakOut.getStatus() == 1){
            throw new CoolException("当前拣货码已经完成拣货");
        }
        //查询库存信息
        Wrapper<ManLocDetl> manLocDetlWrapper = new EntityWrapper<ManLocDetl>().eq("loc_no", param.getLocNo());
        Utils.confirmOnlyMat(manLocDetlWrapper,param.getMatnr(),param.getCsocode(),param.getIsoseq());
        ManLocDetl manLocDetl = manLocDetlService.selectOne(manLocDetlWrapper);
        //根据实际出库数量扣减库存
        if(Double.doubleToLongBits(param.getAnfme()) != Double.doubleToLongBits(manPakOut.getAnfme())){
            if(param.getAnfme() > manLocDetl.getAnfme() || (param.getAnfme() - manPakOut.getAnfme()) > (orderDetl.getAnfme() - orderDetl.getQty())){
                throw new CoolException("出库数量不得大于订单数量或者库存数量");
            }
            //根据实际出库数量回写拣货单
            manPakOut.setCount(param.getAnfme());
            if(manPakOut.getCount() < manPakOut.getAnfme()){
                manPakOut.setStatus(8);
            }
            //根据实际出库数量回写订单详情
            orderDetl.setQty(orderDetl.getQty() - (param.getAnfme()-manPakOut.getAnfme()));
            orderDetlService.update(orderDetl,orderDetlWrapper);
        }else {
            manPakOut.setCount(param.getAnfme());
            manPakOut.setStatus(1);
        }
        manPakOutService.update(manPakOut,manPakOutWrapper);
        //检查该订单下的拣货单是否已经全部出库
        int status = checkManPakoutByOrder(param.getOrderNo());
        manPakOutService.updateAllStatus(param.getOrderNo(),status);
        //修改库存
        manLocDetl.setAnfme(manLocDetl.getAnfme()-manPakOut.getCount());
        if (manLocDetl.getAnfme() == 0 ){
            manLocDetlService.delete(manLocDetlWrapper);
        }else{
            manLocDetl.setStatus(1);
            manLocDetlService.update(manLocDetl,manLocDetlWrapper);
        }
        SaasUtils.insertLog(1,manLocDetl.getLocNo(),manLocDetl.getMatnr(), manLocDetl.getAnfme(),user.getUsername());
        manLocDetl.setStatus(1);
        manLocDetlService.update(manLocDetl,manLocDetlWrapper);
        //检测订单是否完成
        orderService.checkComplete(param.getOrderNo());
    }
    private void saveManlocDetl(WaitPakin waitPakin, Date now, String locNo){
        Node node = nodeService.selectOne(new EntityWrapper<Node>()
                .eq("name", locNo));
        ManLocDetl manLocDetl = new ManLocDetl();
        BeanUtils.copyProperties(waitPakin,manLocDetl);
        manLocDetl.setNodeId(node.getId());
        manLocDetl.setContainerCode(waitPakin.getSuppCode());
        manLocDetl.setCsocode(waitPakin.getThreeCode());
        manLocDetl.setIsoseq(waitPakin.getDeadTime());
        manLocDetl.setCreateTime(now);
        manLocDetl.setModiTime(now);
        manLocDetl.setLocNo(locNo);
        manLocDetl.setStatus(1);
        manLocDetlService.insert(manLocDetl);
    }
    private int checkManPakoutByOrder(String orderNo){
        int status = 0;
        List<ManPakOut> manPakOutList = manPakOutService.selectList(new EntityWrapper<ManPakOut>().eq("doc_num", orderNo));
        for(int i=0; i<manPakOutList.size(); i++){
            if(i == 0){
                status = manPakOutList.get(i).getStatus();
            }else {
                if(manPakOutList.get(i).getStatus() != status){
                    status = 8;
                }
            }
        }
        return status;
    }
    public static void main(String[] args) {
        ManPakOut m = new ManPakOut();
        m.setAnfme(1.0);
        NodePakoutParam n = new NodePakoutParam();
        n.setAnfme(1.0);
        double a = 1.0;
        double b = 1.0;
        System.out.println(m.getAnfme() == n.getAnfme());
        System.out.println(a == b);
        System.out.println(Double.doubleToLongBits(m.getAnfme()) == Double.doubleToLongBits(n.getAnfme()));
    }
}