自动化立体仓库 - WMS系统
pang.jiabao
2024-07-18 8e0335c10755399ba4eda92512939995d844e7bd
组托桁架相关接口开发
4个文件已添加
11个文件已修改
304 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ZphjcdwcParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/ZphjckdwParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/ZphjcdgzVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/ZphjcdwcVo.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/GhjtScheduler.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/WorkMastScheduler.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -192,6 +192,23 @@
        return R.ok(openService.emptyOutLoc(param));
    }
    @PostMapping("/zpckdw")
    @AppAuth(memo = "组盘桁架gwcs告诉zwms货物到位,zmws告诉gwcs怎么拆")
    public synchronized R zphjDw(@RequestHeader(required = false) String appkey,
                                      @RequestBody ZphjckdwParam param,
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        return openService.zphjDw(param);
    }
    @PostMapping("/cdwc")
    @AppAuth(memo = "组盘桁架拆垛完成gwcs请求zwms")
    public synchronized R zphjCdwc(@RequestHeader(required = false) String appkey,
                                      @RequestBody ZphjcdwcParam param,
                                      HttpServletRequest request) {
        auth(appkey, param, request);
        return openService.zphjCdwc(param);
    }
//    @PostMapping("/cpjck")
//    @AppAuth(memo = "物料信息获取")
//    public synchronized R emptyOutLoc(@RequestHeader(required = false) String appkey,
src/main/java/com/zy/asrs/entity/param/ZphjcdwcParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.entity.param;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 组盘桁架拆垛完成
 * @createDate 2024/7/16 9:37
 */
@Data
public class ZphjcdwcParam {
    private Integer workNo; // 工作号
}
src/main/java/com/zy/asrs/entity/param/ZphjckdwParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.entity.param;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 组盘桁架出库到位
 * @createDate 2024/7/16 9:36
 */
@Data
public class ZphjckdwParam {
    private Integer workNo; // 工作号
}
src/main/java/com/zy/asrs/entity/result/ZphjcdgzVo.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.result;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 返回组盘桁架拆垛规则
 * @createDate 2024/7/16 9:37
 */
@Data
public class ZphjcdgzVo {
    private Integer workNo; // 工作号
    private String position; // 要拆的位置,左或右
}
src/main/java/com/zy/asrs/entity/result/ZphjcdwcVo.java
New file
@@ -0,0 +1,21 @@
package com.zy.asrs.entity.result;
import lombok.Data;
/**
 * @author pang.jiabao
 * @description 拆垛完成,返回给gwcs执行命令(回库和出库)
 * @createDate 2024/7/16 13:46
 */
@Data
public class ZphjcdwcVo {
    private int workNo; // 任务号
    private int sourceStaNo; // 源站点
    private int staNo; // 目标站点
    private int descFlag; // 拆垛出来托盘出库路径
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -27,6 +27,10 @@
    int updateAnfme(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("matnr")String matnr, @Param("batch")String batch);
    int deleteItem2(@Param("locNo")String locNo, @Param("model")String model, @Param("batch")String batch);
    int updateAnfme2(@Param("anfme")Double anfme, @Param("locNo")String locNo, @Param("model")String model, @Param("batch")String batch);
    List<LocDetl> getStockOutPage(Map<String, Object> map);
    Integer getStockOutPageCount(Map<String, Object> map);
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -6,7 +6,6 @@
import com.zy.asrs.entity.result.StockVo;
import java.util.List;
import java.util.Map;
import java.util.Set;
public interface LocDetlService extends IService<LocDetl> {
@@ -21,6 +20,10 @@
     * 修改库存明细数量,如果数量为0,则删除记录
     */
    boolean updateAnfme(Double anfme, String locNo, String matnr, String batch);
    /**
     * 修改库存明细数量,如果数量为0,则删除记录
     */
    boolean updateAnfme2(Double anfme, String locNo, String model, String batch);
    boolean updateLocNo(String newLocNo, String oldLocNo);
src/main/java/com/zy/asrs/service/OpenService.java
@@ -85,4 +85,14 @@
     * 拆盘机出库接口(空托盘出库)
     */
    String emptyOutLoc(GhjtApiParam param);
    /**
     * 组盘桁架gwcs告诉zwms货物到位,zmws告诉gwcs怎么拆
     */
    R zphjDw(ZphjckdwParam param);
    /**
     * 组盘桁架拆垛完成gwcs请求zwms
     */
    R zphjCdwc(ZphjcdwcParam param);
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -37,6 +37,14 @@
        }
    }
    @Override
    public boolean updateAnfme2(Double anfme, String locNo, String model, String batch) {
        if (anfme <= 0) {
            return this.baseMapper.deleteItem2(locNo, model, batch) > 0;
        } else {
            return baseMapper.updateAnfme2(anfme, locNo, model, batch) > 0;
        }
    }
    @Override
    public boolean updateLocNo(String newLocNo, String oldLocNo) {
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -11,6 +11,8 @@
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.entity.result.ZphjcdgzVo;
import com.zy.asrs.entity.result.ZphjcdwcVo;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
@@ -28,6 +30,7 @@
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2022/4/9
@@ -69,6 +72,8 @@
    @Autowired
    private WrkDetlSingleService wrkDetlSingleService;
    @Autowired
    private WrkMastLogService wrkMastLogService;
    @Autowired
    private WrkMastStaService wrkMastStaService;
    @Autowired
    private WrkMastStaLogService wrkMastStaLogService;
@@ -76,6 +81,8 @@
    private StaDescService staDescService;
    @Autowired
    private LocMastService locMastService;
    @Autowired
    private ApiLogService apiLogService;
    @Override
    @Transactional
@@ -1295,8 +1302,120 @@
        return "出库成功";
    }
    @Autowired
    private ApiLogService apiLogService;
    @Override
    @Transactional
    public R zphjDw(ZphjckdwParam param) {
        // 根据任务号得到工作主档
        if (Cools.isEmpty(param.getWorkNo())) {
            throw new CoolException("工作号不能为空!");
        }
        WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo());
        if (wrkMast == null) {
            throw new CoolException("工作档不存在!");
        }
        if (wrkMast.getWrkSts() != 2 || wrkMast.getIoType() != 103) {
            throw new CoolException("工作档当前状态不为2/出库类型不为拣料!");
        }
        // 更新工作档状态2.设备上走->42.等待码垛
        wrkMast.setWrkSts(42L);
        wrkMastService.updateById(wrkMast);
        // 查询要拆的位置,只有一个
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
        List<String> collect = wrkDetls.stream().map(WrkDetl::getOrigin).distinct().collect(Collectors.toList());
        String position = collect.get(0);
        // 返回拆垛规则
        ZphjcdgzVo zphjcdgzVo = new ZphjcdgzVo();
        zphjcdgzVo.setWorkNo(wrkMast.getWrkNo());
        zphjcdgzVo.setPosition(position);
        return R.ok(zphjcdgzVo);
    }
    @Override
    @Transactional
    public R zphjCdwc(ZphjcdwcParam param) {
        if (Cools.isEmpty(param.getWorkNo())) {
            throw new CoolException("工作号不能为空!");
        }
        WrkMast wrkMast = wrkMastService.selectById(param.getWorkNo());
        if (wrkMast == null) {
            throw new CoolException("工作档不存在!");
        }
        if (wrkMast.getWrkSts() != 42 || wrkMast.getIoType() != 103) {
            throw new CoolException("工作档当前状态不为42/出库类型不为拣料!");
        }
        // 保存工作主档历史档
        if (!wrkMastLogService.save(wrkMast.getWrkNo())) {
            throw new CoolException("保存工作主档历史档失败");
        }
        // 更新工作类型103->53
        wrkMast.setIoType(53);
        wrkMast.setWrkSts(52L); // 工作状态42->52.设备上走(拆垛完成)
        Integer staNo = wrkMast.getStaNo();
        // 目标站点源站点转换
        wrkMast.setStaNo(wrkMast.getSourceStaNo());
        wrkMast.setSourceStaNo(staNo);
        // 目标库位=源库位
        wrkMast.setLocNo(wrkMast.getSourceLocNo());
        // 源库位清除
        wrkMast.setSourceLocNo("");
        wrkMast.setModiTime(new Date());
        int outStaNo = 0; // 出库源站点
        if (staNo == 3044 || staNo == 3045) {
             outStaNo = 3046;
        } else if(staNo == 3040 || staNo == 3041) {
             outStaNo = 3042;
        }
        if (outStaNo == 0) {
            throw new CoolException("出库源站点转换有误:" + staNo);
        }
        // 获取出库物料
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
        int descFlag = getType(wrkDetls);
        // get0原托盘回流信息,get1拆垛出来物料出库信息
        List<ZphjcdwcVo> zphjcdwcVos = new ArrayList<>();
        ZphjcdwcVo zphjcdwcVo1 = new ZphjcdwcVo();
        zphjcdwcVo1.setWorkNo(wrkMast.getWrkNo());
        zphjcdwcVo1.setStaNo(wrkMast.getStaNo());
        zphjcdwcVo1.setSourceStaNo(wrkMast.getSourceStaNo());
        zphjcdwcVos.add(zphjcdwcVo1);
        ZphjcdwcVo zphjcdwcVo2 = new ZphjcdwcVo();
        zphjcdwcVo2.setSourceStaNo(outStaNo);
        zphjcdwcVo2.setStaNo(3106); // 3106/3077
        zphjcdwcVo2.setDescFlag(descFlag);
        zphjcdwcVos.add(zphjcdwcVo2);
        // 更新工作主档
        wrkMastService.updateById(wrkMast);
        // 修改库位状态 Q.拣料/盘点/并板再入库
        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
        locMast.setLocSts("Q");
        locMast.setModiTime(new Date());
        if (!locMastService.updateById(locMast)) {
            throw new CoolException("修改库位状态失败");
        }
        // 下发回库的目标站点和拆垛的出库目标站点给gwcs
        return R.ok(zphjcdwcVos);
    }
    /**
     * 根据出库物料明细判断是否去贴标(单卷贴标,多卷不贴标)
     * @param wrkDetls 物料明细
     * @return 0.多卷不贴标路径,1.单卷贴标路径
     */
    private int getType(List<WrkDetl> wrkDetls) {
        return wrkDetls.size() > 1 ? 0 : 1; // 一条记录就是一卷
    }
    private void pushStaNoToGwcs(Integer palletizingNo, Integer staNo, Integer workNo) {
        boolean success = false;
src/main/java/com/zy/asrs/task/GhjtScheduler.java
@@ -7,6 +7,7 @@
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.task.handler.GhjtHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@@ -31,10 +32,10 @@
    private OrderMapper orderMapper;
    // 下发出库任务给GWCS(从出库码头到出库口)
//    @Scheduled(cron = "0/2 * * * * ? ")
    @Scheduled(cron = "0/2 * * * * ? ")
    public void ckrwPushGwcs() {
        // 查询状态为13的工作档
        List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().eq("io_type", 101).eq("wrk_sts", 13));
        List<WrkMast> wrkMasts = wrkMastMapper.selectList(new EntityWrapper<WrkMast>().in("io_type", 101,103,107,110).eq("wrk_sts", 13));
        for (WrkMast wrkMast : wrkMasts) {
            try {
                ghjtHandler.startCkrwPushGwcs(wrkMast);
src/main/java/com/zy/asrs/task/WorkMastScheduler.java
@@ -61,7 +61,7 @@
        }
    }
    @Scheduled(cron = "0/3 * * * * ? ")
//    @Scheduled(cron = "0/3 * * * * ? ")
    private void execute202(){
        BasDevp basDevp = basDevpService.selectById(144);
        if (basDevp.getWrkNo()!=0 && basDevp.getLoading().equals("Y")){
src/main/java/com/zy/asrs/task/handler/GhjtHandler.java
@@ -1,13 +1,16 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.mapper.OrderMapper;
import com.zy.asrs.mapper.WrkMastMapper;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WrkDetlService;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
@@ -17,7 +20,9 @@
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * @author pang.jiabao
@@ -37,6 +42,9 @@
    @Resource
    private WrkMastMapper wrkMastMapper;
    @Resource
    private WrkDetlService wrkDetlService;
    @Transactional
    public void startCkrwPushGwcs(WrkMast wrkMast) {
@@ -44,11 +52,15 @@
        Map<String, Object> headers = new HashMap<>();
        headers.put("Content-Type", "application/json;charset=UTF-8");
        // 下发给gwcs要走的路径标识
        int descFlag = getDescToGwcs(wrkMast);
        // 构造请求体
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("workNo", wrkMast.getWrkNo());
        jsonObject.put("staNo", wrkMast.getStaNo());
        jsonObject.put("sourceStaNo", wrkMast.getSourceStaNo());
        jsonObject.put("descFlag", descFlag); // 101出库时用,0只有一条路径,1理货贴标路径,2贴标打带路径
        String body = jsonObject.toJSONString();
        boolean success = false;
@@ -89,6 +101,30 @@
        }
    }
    /**
     * 全板出库到3077或3106的任务,判断出库要走的路径
     * @param wrkMast 工作主档
     * @return 0.只有一条路径,1.理货贴标出库路径,2.贴标打带出库路径
     */
    private int getDescToGwcs(WrkMast wrkMast) {
        int flag = 0;
        if (wrkMast.getIoType() == 101 && (wrkMast.getStaNo() == 3077 || wrkMast.getStaNo() == 3106)) {
            List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
            // 出的物料有几个位置
            List<String> collect = wrkDetls.stream().map(WrkDetl::getOrigin).distinct().collect(Collectors.toList());
            if (collect.size() == 1) { // 一箱
                if (wrkDetls.size() == 1) { // 一卷去贴标
                     flag = 1;
                } else { // 多卷直接出
                }
            } else if(collect.size() == 2) { // 两箱去贴标打带
                    flag = 2;
            }
        }
        return flag;
    }
    @Transactional
    public void OutBoundCompleteReport(Order order) {
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -157,9 +157,14 @@
                    }
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
//                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        // 箱号+卷号
                        LocDetl locDetl = locDetlService.selectOne(new EntityWrapper<LocDetl>().eq("batch",wrkDetl.getBatch())
                                .eq("model",wrkDetl.getModel()));
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
//                            if (!locDetlService.updateAnfme(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
                            if (!locDetlService.updateAnfme2(locDetl.getAnfme() - wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getModel(), wrkDetl.getBatch())) {
//                                exceptionHandle("拣料入库 ===>> 修改库存明细数量失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("拣料入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
src/main/resources/mapper/LocDetlMapper.xml
@@ -84,6 +84,23 @@
        and matnr = #{matnr}
        <include refid="batchSeq"></include>
    </update>
    <delete id="deleteItem2">
        delete from asr_loc_detl
        where 1=1
        and loc_no = #{locNo}
        and model = #{model}
        <include refid="batchSeq"></include>
    </delete>
    <update id="updateAnfme2">
        update asr_loc_detl
        set anfme = #{anfme}
        , modi_time = getdate()
        where 1=1
        and loc_no = #{locNo}
        and model = #{model}
        <include refid="batchSeq"></include>
    </update>
    <sql id="stockOutCondition">
        <if test="loc_no!=null and loc_no!='' ">