自动化立体仓库 - WMS系统
pang.jiabao
2024-07-19 a29aa2ea80eaaea6acff08068a04de47b69478a8
src/main/java/com/zy/asrs/service/impl/MobileServiceImpl.java
@@ -4,10 +4,7 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.mapper.Wrapper;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.common.SnowflakeIdWorker;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
@@ -27,6 +24,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.*;
/**
@@ -85,7 +83,11 @@
    private TagService tagService;
    @Autowired
    private BasBoxTypeService basBoxTypeService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Resource
    private OpenServiceImpl openServiceImpl;
    @Override
    @Transactional
@@ -1185,6 +1187,98 @@
    @Override
    @Transactional
    public R pdckqr(PdckqrParam param) {
        WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo());
        if (wrkMast == null) {
            throw new CoolException("工作档不存在:" + param.getWorkNo());
        }
        if (wrkMast.getIoType() != 107 || wrkMast.getWrkSts() != 2) {
            throw new CoolException(param.getWorkNo() + "工作档类型:" + wrkMast.getIoType() + "工作状态:" + wrkMast.getWrkSts() + ",不匹配");
        }
        List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(param.getWorkNo());
        List<PdckqrParam.Material> materials = param.getMaterials();
        boolean isFullyCancelled = compareAndCheckCancellation(wrkDetls, materials);
        if (isFullyCancelled) { // 盘点物料确成功,工作档转换 盘点出库->盘点再入库,下发回库命令
            // 保存工作主档历史档
            if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
                throw new CoolException("保存工作主档历史档失败");
            }
            // 获取目标站
            Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                    .eq("type_no", wrkMast.getIoType() - 50)
                    .eq("stn_no", wrkMast.getStaNo()) // 作业站点 = 拣料出库的目标站
                    .eq("crn_no", wrkMast.getCrnNo()); // 堆垛机号
            StaDesc staDesc = staDescService.selectOne(wrapper);
            if (Cools.isEmpty(staDesc)) {
                throw new CoolException("入库路径不存在");
            }
            Date now = new Date();
            // 堆垛机站点(目标站)
            Integer staNo = staDesc.getCrnStn();
            // 更新工作档数据状态
            wrkMast.setIoType(wrkMast.getIoType() - 50); // 入出库类型: 103->53,104->54,107->57
            wrkMast.setWrkSts(14L); // 工作状态: 14.已出库未确认
            wrkMast.setSourceStaNo(wrkMast.getStaNo()); // 源站
            wrkMast.setStaNo(staNo); // 目标站
            wrkMast.setLocNo(wrkMast.getSourceLocNo()); // 目标库位 = 出库时的源库位
            wrkMast.setSourceLocNo(""); // 源库位清空
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
                throw new CoolException("更新工作档数据状态失败");
            }
            // 修改库位状态 Q.拣料/盘点/并板再入库
            LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
            locMast.setLocSts("Q");
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("修改库位状态失败");
            }
            // 推送给gwcs执行命令
            openServiceImpl.pushStaNoToGwcs(wrkMast.getSourceStaNo(),wrkMast.getStaNo(),wrkMast.getWrkNo());
            return R.ok("盘点确认成功");
        } else { // 物料不一致
            // todo 不一致的处理处理方法待定
        }
        return R.error("盘点确认异常");
    }
        /**
         * 比较两个集合的类的属性,相同则抵消,最后判断两个集合是否完全抵消
         */
        public  boolean compareAndCheckCancellation(List<WrkDetl> list1, List<PdckqrParam.Material> list2) {
            if (list1.size() != list2.size()) {
                return false; // If lists are not of the same size, cancellation is not possible
            }
            List<PdckqrParam.Material> remainingList2 = new ArrayList<>(list2);
            // Compare and cancel out elements
            for (WrkDetl p1 : list1) {
                boolean cancelled = false;
                for (PdckqrParam.Material p2 : remainingList2) {
                    if (p1.getBatch().equals(p2.getBoxNo()) && p1.getModel().equals(p2.getRollNo())) { // 卷号和箱号相同
                        remainingList2.remove(p2);
                        cancelled = true;
                        break;
                    }
                }
                if (!cancelled) {
                    return false; // If any element in list1 cannot be cancelled, return false
                }
            }
            return remainingList2.isEmpty(); // Return true if all elements in list1 were cancelled out
        }
    @Override
    @Transactional
    public List<Map<String, Object>> boxTypeComb() {
        EntityWrapper<BasBoxType> wrapper = new EntityWrapper<>();
        List<Map<String, Object>> result = new ArrayList<>();