自动化立体仓库 - WMS系统
whycq
2025-01-08 ac92d2777fc472ae766e2bd6209c70691fe5dc5b
Merge branch 'mdqdasrs-auto' into mdqdasrsVersion
15个文件已修改
251 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/LocMastMapper.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocMastService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/WrkDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/param/SearchLocParam.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocMastMapper.xml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkDetlMapper.xml 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/WrkMastMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locDetl/locDetl.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocMastMapper.java
@@ -40,4 +40,6 @@
    List<LocMast> selectAreaEmpty(Short locType1,Integer crnNo);
    List<LocMast> selectAllLocNotEmpty(@Param("groupLoc") List<String> groupOuterLoc);
    LocMast getLocFByMatnr(String locNo);
}
src/main/java/com/zy/asrs/mapper/WrkDetlMapper.java
@@ -6,6 +6,7 @@
import org.apache.ibatis.annotations.Param;
import org.springframework.stereotype.Repository;
import java.util.Date;
import java.util.List;
@Mapper
@@ -23,4 +24,6 @@
    int updateInspect( @Param("wrkNo")Integer wrkNo, @Param("matnr")String matnr, @Param("batch")String batch);
    List<WrkDetl> selectPakoutQuery(@Param("staNo")Integer staNo, @Param("matnr")String matnr);
    int updateIoTime(@Param("workNo") Integer workNo, @Param("ioTime") Date ioTime);
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -89,4 +89,5 @@
    List<LocDetlAll> selectOwnerAllAnfme();
    List<String> getSameDetl(String matnr, String batch, String grade);
}
src/main/java/com/zy/asrs/service/LocMastService.java
@@ -57,4 +57,6 @@
    List<LocMast> selectAreaEmpty(Short locType1, Integer crnNo);
    boolean checkAllLocEmpty(List<String> groupLoc);
    LocMast getLocFByMatnr(String matnr);
}
src/main/java/com/zy/asrs/service/WrkDetlService.java
@@ -21,4 +21,6 @@
    List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr);
    boolean updateIoTime(Integer workNo, Date ioTime);
}
src/main/java/com/zy/asrs/service/impl/LocMastServiceImpl.java
@@ -121,4 +121,11 @@
        return result.size() <= 0;
    }
    @Override
    public LocMast getLocFByMatnr(String matnr) {
        return this.baseMapper.getLocFByMatnr(matnr);
    }
}
src/main/java/com/zy/asrs/service/impl/WrkDetlServiceImpl.java
@@ -79,4 +79,9 @@
    public List<WrkDetl> selectPakoutQuery(Integer staNo, String matnr) {
        return this.baseMapper.selectPakoutQuery(staNo, matnr);
    }
    @Override
    public boolean updateIoTime(Integer workNo, Date ioTime) {
        return this.baseMapper.updateIoTime(workNo, ioTime) > 0;
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -213,6 +213,45 @@
                    }
                    break;
                // 并板入库
                case 55:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls55 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls55.isEmpty()) {
//                        exceptionHandle("并板入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("并板入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                    }
                    // 修改库存明细数量,如无库存,曾新增
                    for (WrkDetl wrkDetl:wrkDetls55) {
                        LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("loc_no", locMast.getLocNo()));
                        locDetlService.delete(new EntityWrapper<LocDetl>().eq("loc_no", locDetl.getLocNo()));
                        locDetl = new LocDetl();
                        locDetl.sync(wrkDetl);
                        locDetl.setLocNo(wrkMast.getLocNo()); // 库位号
                        locDetl.setAnfme(wrkDetl.getAnfme()); // 数量
                        locDetl.setZpallet(wrkDetl.getZpallet()); // 托盘条码
                        locDetl.setModiTime(now);
                        locDetl.setAppeTime(now);
                        if (!locDetlService.insert(locDetl)) {
//                                exceptionHandle("并板入库 ===>> 新增库存明细失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                            return FAIL.setMsg("并板入库 ===>> 新增库存明细失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        }
                    }
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
                        locMast.setLocSts("F");
                        locMast.setBarcode(wrkMast.getBarcode());
                        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 54:
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls54 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
@@ -259,6 +298,7 @@
                        }
                    }
                    break;
                // 盘点入库
                case 57:
                    // 根据工作号,查询工作明细档
src/main/java/com/zy/common/web/WcsController.java
@@ -8,10 +8,13 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.MatServiceImpl;
import com.zy.asrs.utils.Utils;
import com.zy.common.CodeRes;
import com.zy.common.model.LocDto;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
@@ -52,6 +55,14 @@
    private WorkService workService;
    @Autowired
    private BasCrnpService basCrnpService;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    @Autowired
    private MatServiceImpl matService;
    @PostMapping("/pakin/loc/v1")
    @ResponseBody
@@ -342,4 +353,159 @@
        return dto;
    }
    @PostMapping("/process/loc/v1")
    @ResponseBody
    @Transactional
    public synchronized R processLoc() {
        log.info("收到WCS罐装出库接口请求");
        Date now = new Date();
        // 查询库存状态位F 且 库存明细包含该物料的库位
        LocMast tarLoc = locMastService.getLocFByMatnr("BZ10100ZZ00000010");
        if (Cools.isEmpty(tarLoc)) {
            throw new CoolException("没有可出库的库位");
        }
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("io_type", 105).ne("wrk_sts", 14));
        if (!Cools.isEmpty(tarLoc)) {
            if (wrkMasts.size() > 3) {
                throw new CoolException("当前已有4笔出库任务,暂停下发");
            }
        }
        // 获取源站
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                .eq("type_no", 105)
                .eq("stn_no", 2301)
                .eq("crn_no", tarLoc.getCrnNo()));
        Integer sourceStaNo = staDesc.getCrnStn();
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(103));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(11L); // 工作状态:11.生成出库ID
        wrkMast.setIoType(105); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setCrnNo(tarLoc.getCrnNo());
        wrkMast.setSourceStaNo(sourceStaNo); // 源站
        wrkMast.setStaNo(2301); // 目标站
        wrkMast.setSourceLocNo(tarLoc.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("N"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setLinkMis("N");
        wrkMast.setBarcode(tarLoc.getBarcode());
        wrkMast.setAppeTime(now);
        wrkMast.setModiTime(now);
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:"+tarLoc.getLocNo());
        }
        // 生成工作档明细
        List<LocDetl> locDetls = locDetlService.selectList(new EntityWrapper<LocDetl>().eq("loc_no", tarLoc.getLocNo()));
        for (LocDetl locDetl : locDetls) {
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(locDetl);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setBatch(locDetl.getBatch());
            wrkDetl.setAnfme(locDetl.getAnfme()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiTime(now);
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        if (tarLoc.getLocSts().equals("F")) {
            tarLoc.setLocSts("P");
            tarLoc.setModiTime(now);
            if (!locMastService.updateById(tarLoc)) {
                throw new CoolException("预约库位状态失败,库位号:"+tarLoc.getLocNo());
            }
        } else {
            throw new CoolException(tarLoc.getLocNo() + "库位不是在库状态");
        }
        return R.ok();
    }
    @PostMapping("/process/in/loc/v1")
    @ResponseBody
    @Transactional
    public synchronized R processInLoc(@RequestBody SearchLocParam param){
        log.info("灌装线收到WCS入库接口请求====>>入参:{}", param);
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                .eq("barcode", param.getBarcode())
                .eq("io_type", 105)
                .eq("wrk_sts", 14));
        if (Cools.isEmpty(wrkMast)) {
            log.info("查询不到该托盘码的罐装出库任务,托盘码位{" + param.getBarcode() + "}" );
            throw new CoolException("查询不到该托盘码的罐装出库任务,托盘码位{" + param.getBarcode() + "}" );
        }
        // 获取目标站
        Wrapper<StaDesc> wrapper = new EntityWrapper<StaDesc>()
                .eq("type_no", 55)
                .eq("stn_no", 2106)
                .eq("crn_no", wrkMast.getCrnNo());
        StaDesc staDesc = staDescService.selectOne(wrapper);
        if (Cools.isEmpty(staDesc)) {
            throw new CoolException("入库路径不存在!");
        }
        try {
            // 保存工作明细档历史档
            if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
                throw new CoolException("保存工作明细档历史档失败");
            }
            // 保存工作主档历史档
            if (!wrkDetlLogService.save(wrkMast.getWrkNo())) {
                throw new CoolException("保存工作主档历史档失败");
            }
            Date now = new Date();
            // 堆垛机站点(目标站)
            Integer staNo = staDesc.getCrnStn();
            // 更新工作档数据状态
            wrkMast.setIoTime(now);
            wrkMast.setIoType(55);
            wrkMast.setWrkSts(2L);
            wrkMast.setSourceStaNo(2106);
            wrkMast.setStaNo(staNo);
            wrkMast.setLocNo(wrkMast.getSourceLocNo());
            wrkMast.setSourceLocNo("");
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
                throw new CoolException("更新工作档数据状态失败");
            }
            List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
            for (WrkDetl wrkDetl : wrkDetls) {
                Mat mat = matService.selectByMatnr("CP10103TY22014617");
                WrkDetl wrkDetl1 = new WrkDetl();
                wrkDetl1.sync(wrkDetl);
                wrkDetl1.sync(mat);
                wrkDetl1.setBatch(param.getBatch());
                wrkDetl1.setIoTime(now);
                wrkDetlService.insert(wrkDetl1);
            }
            wrkDetlService.delete(new EntityWrapper<WrkDetl>().eq("matnr", "BZ10100ZZ00000010").eq("wrk_no",wrkMast.getWrkNo()));
            // 更新明细档io_time (历史档关联使用)
//            wrkDetlService.updateIoTime(wrkMast.getWrkNo(), now);
            // 修改库位状态 Q.拣料/盘点/并板再入库
            LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
            locMast.setLocSts("Q");
            locMast.setModiTime(new Date());
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("修改库位状态失败");
            }
        } catch (Exception e) {
            throw new CoolException("入库失败!");
        }
        StartupDto dto = new StartupDto();
        dto.setWorkNo(wrkMast.getWrkNo());
        dto.setCrnNo(wrkMast.getCrnNo());
        dto.setSourceStaNo(wrkMast.getSourceStaNo());
        dto.setStaNo(wrkMast.getStaNo());
        dto.setLocNo(wrkMast.getLocNo());
        log.info("WCS入库接口返参:{},托盘码:{}", dto, param.getBarcode());
        return R.ok().add(dto);
    }
}
src/main/java/com/zy/common/web/param/SearchLocParam.java
@@ -17,4 +17,6 @@
    // 库位规格( 0:未知, 1:低库位, 2:高库位)
    private Short locType1;
    private String batch;
}
src/main/resources/mapper/LocMastMapper.xml
@@ -117,5 +117,15 @@
        </foreach>
    </select>
    <select id="getLocFByMatnr" resultMap="BaseResultMap">
        SELECT TOP 1 mast.*
        FROM asr_loc_mast mast
        JOIN asr_loc_detl detl
        ON mast.loc_no = detl.loc_no
        AND mast.loc_sts = 'F'
        AND detl.matnr = #{matnr}
        ORDER BY mast.modi_time
    </select>
</mapper>
src/main/resources/mapper/WrkDetlMapper.xml
@@ -111,4 +111,11 @@
        and awd.matnr + '-' + awd.batch = #{matnr}
    </select>
    <update id="updateIoTime">
        update asr_wrk_detl
        set io_time = #{ioTime}
        where 1=1
          and wrk_no = #{workNo}
    </update>
</mapper>
src/main/resources/mapper/WrkMastMapper.xml
@@ -63,7 +63,7 @@
    </resultMap>
    <select id="selectToBeCompleteData" resultMap="BaseResultMap">
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
        select * from asr_wrk_mast where ((wrk_sts = 4 Or wrk_sts = 14 ) and io_type != 103 and io_type != 104 and io_type != 105 and io_type != 107 ) or (wrk_sts = 2 and io_type=6) order by upd_mk,error_time,io_time,wrk_no
    </select>
    <select id="selectToBeHistoryData" resultMap="BaseResultMap">
src/main/webapp/static/js/common.js
@@ -271,6 +271,7 @@
    ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
    ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
    ,{field: 'owner$', align: 'center',title: '货主', hide: true}
    ,{field: 'memo', align: 'center',title: '备注', hide: false}
    ,{field: 'payment$', align: 'center',title: '货物形态', hide: false}
]
src/main/webapp/static/js/locDetl/locDetl.js
@@ -24,6 +24,7 @@
        ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
        ,{field: 'weight', align: 'center',title: '重量', hide: false}
        ,{field: 'owner$', align: 'center',title: '货主', hide: false}
        ,{field: 'memo', align: 'center',title: '备注', hide: false}
        ,{field: 'payment$', align: 'center',title: '货物状态', hide: false}
        ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
        ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}