自动化立体仓库 - WMS系统
zyx
2023-11-22 d87f68eb535935814f287b3740474e7eb24b3643
自动补货流程更新
9个文件已修改
159 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvLocDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/AutoReplenishmentScheduler.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java 103 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvLocDetlMapper.java
@@ -37,6 +37,9 @@
    @Select("SELECT SUM(anfme) FROM agv_loc_detl WHERE loc_no = #{locNo}")
    Double sumByLocNo(@Param("locNo")String locNo);
    @Select("SELECT SUM(anfme) FROM agv_loc_detl WHERE matnr = #{matnr}")
    Double sumByMatnr(@Param("matnr")String matnr);
    int updateAnfme(@Param("locNo")String locNo, @Param("anfme")Double anfme, @Param("matnr")String matnr, @Param("batch")String batch, @Param("csocode")String csocode, @Param("isocode")String isocode);
    int deleteLocDetl(@Param("locNo")String locNo, @Param("anfme")Double anfme, @Param("matnr")String matnr, @Param("batch")String batch, @Param("csocode")String csocode, @Param("isocode")String isocode);
src/main/java/com/zy/asrs/service/AgvLocDetlService.java
@@ -39,6 +39,8 @@
    public Double selectSumAnfmeByLocNo(String locNo);
    public Double selectSumAnfmeByMatnr(String matnr);
    public AgvLocDetl selectLocdetl(String locNo,String matnr,String batch,String csocode,String isocode);
    public void compareToEss(MultipartFile file) throws IOException;
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -71,7 +71,7 @@
    List<String> selectLocNo(String matnr);
    Set<String> selectLocNo(String matnr, String batch, String csocode, String isocode);
    Set<String> selectLocNos(String matnr);
    LocDetl selectByContainerCode(String containerCode);
src/main/java/com/zy/asrs/service/impl/AgvLocDetlServiceImpl.java
@@ -198,6 +198,11 @@
    }
    @Override
    public Double selectSumAnfmeByMatnr(String matnr) {
        return this.baseMapper.sumByMatnr(matnr);
    }
    @Override
    public AgvLocDetl selectLocdetl(String locNo, String matnr, String batch, String csocode, String isocode) {
        return this.baseMapper.selectLocdetl(locNo,matnr,batch,csocode,isocode);
    }
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -45,6 +45,9 @@
    @Value("${agv.containerArrivedPath}")
    private String containerArrivedPath;
    @Value("${agvBasDev.maxWorkNum}")
    private int maxWrokNum;
    @Autowired
    AgvWrkMastMapper agvWrkMastMapper;
    @Autowired
@@ -73,6 +76,9 @@
    }
    public int startWrk(List<AgvWrkMast> agvWrkMastList, String taskType) throws IOException {
        //任务过滤,过滤掉已存在相同目标库位的工作档
        agvWrkMastList = filter(agvWrkMastList);
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
        agvTaskCreateParam.setTaskType(taskType);
@@ -148,6 +154,13 @@
        return this.selectOne(new EntityWrapper<AgvWrkMast>().eq("barcode",containerCode));
    }
    private List<AgvWrkMast> filter(List<AgvWrkMast> agvWrkMastList){
        return agvWrkMastList.stream().filter(agvWrkMast -> {
            int num = this.selectCount(new EntityWrapper<AgvWrkMast>().eq("loc_no", agvWrkMast.getLocNo()));
            return num <= maxWrokNum;
        }).collect(Collectors.toList());
    }
    private void getContainerMoveParam(List<AgvWrkMast> agvWrkMastList,List<Map<String,String>> positionCodeMapList){
        //往容器入场参数中放入源站点位置
        for(AgvWrkMast agvWrkMast : agvWrkMastList){
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -224,10 +224,10 @@
        return this.baseMapper.selectLocNo(matnr);
    }
    public Set<String> selectLocNo(String matnr, String batch, String csocode, String isocode) {
    public Set<String> selectLocNos(String matnr) {
        Wrapper<LocDetl> wrapper = new EntityWrapper<LocDetl>().eq("matnr", matnr);
        Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode);
        //Utils.confirmOnlyMat(wrapper,matnr,batch,csocode,isocode);
        List<LocDetl> locDetls = this.selectList(wrapper);
        Set<String> locNos = new HashSet<>();
src/main/java/com/zy/asrs/task/AutoReplenishmentScheduler.java
@@ -3,7 +3,9 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.Order;
import com.zy.asrs.service.AgvLocDetlService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.service.OrderService;
@@ -27,13 +29,36 @@
    private AutoReplenishmentHandler autoReplenishmentHandler;
    @Autowired
    private MatService matService;
    @Autowired
    private AgvLocDetlService agvLocDetlService;
    /*
    定时便利库存,生成自动补货单据
     */
    //@Scheduled(cron = "0/5 * * * * ? ")
    public void createOrder(){
        //检测是否有未完成的补货单据
        DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("doc_name", "自动补货单"));
        int count = orderService.selectCount(new EntityWrapper<Order>()
                .eq("doc_type", docType.getDocId())
                .andNew().eq("settle",2)
                .or("settle",1));
        if(count > 0){
            return;
        }
        //查询所有需要补货的物料
        List<Mat> matList = matService.selectList(new EntityWrapper<Mat>().eq(false, "store_min", 0));
        if(!Cools.isEmpty(matList)){
            for (Mat mat : matList){
                //查询当前物料是否在agv库小于库存上限
                Double anfmeSum = agvLocDetlService.selectSumAnfmeByMatnr(mat.getMatnr());
                if(anfmeSum < mat.getStoreMin()){
                    autoReplenishmentHandler.create(mat,mat.getStoreMax() - anfmeSum);
                    break;
                }
            }
        }
    }
    /*
src/main/java/com/zy/asrs/task/handler/AutoReplenishmentHandler.java
@@ -2,6 +2,8 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
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.service.*;
@@ -34,7 +36,26 @@
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Transactional
    public ReturnT<String> create(Mat mat, double anfme) {
        //创建一个新的自动补货单据
        Order order = createOrder();
        OrderDetl orderDetl = createOrderDetl(order);
        orderDetl.setMatnr(mat.getMatnr());
        orderDetl.setMaktx(mat.getMaktx());
        orderDetl.setSpecs(mat.getSpecs());
        orderDetl.setAnfme(anfme);
        orderDetl.setQty(0.0);
        orderService.insert(order);
        orderDetlService.insert(orderDetl);
        return SUCCESS;
    }
    @Transactional
    public ReturnT<String> start(Order order) {
@@ -58,8 +79,64 @@
        order.setSettle(2L);
        orderService.updateById(order);
        return SUCCESS;
    }
    private Order createOrder(){
        Date now = new Date();
        return new Order(
                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                "AUTO" + snowflakeIdWorker.nextId(),    // 订单编号
                DateUtils.convert(now),    // 单据日期
                21L,    // 单据类型 21.自动补货单
                null,    // 项目编号
                null,    //
                null,    // 调拨项目编号
                null,    // 初始票据号
                null,    // 票据号
                null,    // 客户编号
                null,    // 客户
                null,    // 联系方式
                null,    // 操作人员
                null,    // 合计金额
                null,    // 优惠率
                null,    // 优惠金额
                null,    // 销售或采购费用合计
                null,    // 实付金额
                null,    // 付款类型
                null,    // 业务员
                null,    // 结算天数
                null,    // 邮费支付类型
                null,    // 邮费
                null,    // 付款时间
                null,    // 发货时间
                null,    // 物流名称
                null,    // 物流单号
                1L,    // 订单状态
                1,    // 状态
                9999L,    // 添加人员
                now,    // 添加时间
                9999L,    // 修改人员
                now,    // 修改时间
                null    // 备注
        );
    }
    private OrderDetl createOrderDetl(Order order){
        Date now = new Date();
        OrderDetl orderDetl = new OrderDetl();
        orderDetl.setOrderId(order.getId());
        orderDetl.setOrderNo(order.getOrderNo());
        orderDetl.setCreateBy(order.getCreateBy());
        orderDetl.setCreateTime(now);
        orderDetl.setUpdateBy(order.getCreateBy());
        orderDetl.setUpdateTime(now);
        orderDetl.setStatus(1);
        orderDetl.setQty(0.0D);
        return orderDetl;
    }
    private Set<String> pakoutLoc(Order order){
@@ -74,14 +151,11 @@
            }
            String matnr = orderDetl.getMatnr();
            String batch = orderDetl.getBatch();
            String csocode = orderDetl.getThreeCode();
            String isocode = orderDetl.getDeadTime();
            Double orderAnfme = orderDetl.getAnfme();
            double orderAnfme = orderDetl.getAnfme();
            //List<String> locNosSearch = locDetlService.selectLocNo(matnr);
            Set<String> locNosSearch = locDetlService.selectLocNo(matnr, batch, csocode, isocode);
            Set<String> locNosSearch = locDetlService.selectLocNos(matnr);
            //重新排序 并且检测该库位是否含没有料箱码的物料,如有有则不允许出库
            Set<String> resort = resort(locNosSearch);
@@ -92,6 +166,17 @@
                for (LocDetl locDetl :locDetls){
                    if(matnr.equals(locDetl.getMatnr())){
                        orderAnfme -= locDetl.getAnfme();
                    }else {
                        OrderDetl odNew = createOrderDetl(order);
                        odNew.setMatnr(locDetl.getMatnr());
                        odNew.setMaktx(locDetl.getMaktx());
                        odNew.setBatch(locDetl.getBatch());
                        odNew.setThreeCode(locDetl.getThreeCode());
                        odNew.setDeadTime(locDetl.getDeadTime());
                        odNew.setSpecs(locDetl.getSpecs());
                        odNew.setAnfme(0.0);
                        odNew.setQty(locDetl.getAnfme());
                        orderDetlService.insert(odNew);
                    }
                }
                if(orderAnfme <= 0){
@@ -99,6 +184,11 @@
                    orderDetlService.updateById(orderDetl);
                    break;
                }
            }
            if(orderAnfme > 0){
                orderDetl.setAnfme(orderDetl.getAnfme() - orderAnfme);
                orderDetl.setQty(orderDetl.getAnfme());
                orderDetlService.updateById(orderDetl);
            }
        }
@@ -165,6 +255,7 @@
        //wrkMast.setModiUser(userId);
        wrkMast.setModiTime(now);
        //补货标识
        wrkMast.setMk("Y");
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:"+locNo);
src/main/webapp/static/js/common.js
@@ -203,7 +203,7 @@
    // ,{field: 'barcode', align: 'center',title: '条码', hide: true}
    // ,{field: 'manu', align: 'center',title: '厂家', hide: true}
    // ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
    // ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
    ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
    // ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
    // ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
    // ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}