自动化立体仓库 - WMS系统
zyx
2023-10-11 3614fc3249b3de228000234d384e07b97c0079ec
单据自动完结
9个文件已修改
216 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvWorkController.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/AgvWrkDetlMapper.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWorkService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 162 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvWrkMast/wrkMast.js 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWorkController.java
@@ -40,4 +40,18 @@
        workService.adjustLocDetl(param, getUserId());
        return R.ok("库存调整成功");
    }
    @RequestMapping("/hand/control/wrkMast")
    @ManagerAuth(memo = "手动处理工作档")
    public R handControlWrkMast(@RequestParam String workNo,
                                @RequestParam Integer type){
        if (type == 1) {
            workService.completeWrkMast(workNo, getUserId());
            return R.ok("工作档已完成");
        } else if (type == 2) {
            workService.cancelWrkMast(workNo, getUserId());
            return R.ok("工作档已取消");
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/mapper/AgvWrkDetlMapper.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.WrkDetl;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import java.util.List;
@@ -13,7 +14,8 @@
@Repository
public interface AgvWrkDetlMapper extends BaseMapper<AgvWrkDetl> {
    List<WrkDetl> selectByWrkNo(Integer wrkNo);
    @Select("SELECT * FROM agv_wrk_detl WHERE wrk_no = #{wrkNo}")
    List<AgvWrkDetl> selectByWrkNo(@Param("wrkNo")Integer wrkNo);
    int deleteItem(@Param("wrkNo")Integer wrkNo, @Param("matnr")String matnr, @Param("batch")String batch);
src/main/java/com/zy/asrs/service/AgvWorkService.java
@@ -49,4 +49,14 @@
     */
    void adjustLocDetl(LocDetlAdjustParam param, Long userId);
    /**
     * 手动完成工作档
     */
    void completeWrkMast(String workNo, Long userId);
    /**
     * 手动取消工作档
     */
    void cancelWrkMast(String workNo, Long userId);
}
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java
@@ -10,7 +10,7 @@
    //void createWorkDetail(Integer workNo, List<DetlDto> detlDtos, String barcode, Long userId);
    List<WrkDetl> selectByWrkNo(Integer wrkNo);
    List<AgvWrkDetl> selectByWrkNo(Integer wrkNo);
    boolean updateAnfme(Double anfme, Integer wrkNo, String matnr, String batch);
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
@@ -24,6 +25,7 @@
import java.util.Iterator;
import java.util.List;
import java.util.UUID;
import java.util.concurrent.TimeUnit;
/**
 * Created by vincent on 2020/6/11
@@ -59,6 +61,10 @@
    private OrderDetlService orderDetlService;
    @Autowired
    private AdjDetlService adjDetlService;
    @Autowired
    private AgvWrkMastLogService agvWrkMastLogService;
    @Autowired
    private AgvWrkDetlLogService agvWrkDetlLogService;
    /*
@@ -434,6 +440,162 @@
        }
    }
    @Override
    @Transactional
    public void completeWrkMast(String workNo, Long userId) {
        AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 9 || wrkMast.getWrkSts() == 29) {
            throw new CoolException("当前工作档已完成");
        }
        // 入库 + 库位转移
        if (wrkMast.getWrkSts() < 9 || (wrkMast.getWrkSts() > 10 && wrkMast.getIoType()==11)) {
            wrkMast.setWrkSts(9L);
            // 出库
        } else if (wrkMast.getWrkSts() > 20) {
            wrkMast.setWrkSts(29L);
        }
        Date now = new Date();
        wrkMast.setCrnStrTime(DateUtils.calculate(now, 1L, TimeUnit.SECONDS, true));
        wrkMast.setCrnEndTime(now);
        wrkMast.setModiTime(now);
        wrkMast.setModiUser(userId);
        // 完成操作人员记录
        wrkMast.setManuType("手动完成");
        if (!agvWrkMastService.updateById(wrkMast)) {
            throw new CoolException("修改工作档失败");
        }
    }
    @Transactional
    public void cancelWrkMast(String workNo, Long userId) {
        AgvWrkMast wrkMast = agvWrkMastService.selectById(workNo);
        if (Cools.isEmpty(wrkMast)){
            throw new CoolException(workNo+"工作档不存在");
        }
        if (wrkMast.getWrkSts() == 200) {
            //小车移库任务,直接删除工作档
            agvWrkMastService.deleteById(wrkMast);
            return;
        }
        String locNo = ""; // 待修改目标库位
        String locSts = ""; // 待修改目标库位状态
        // 入库取消(修改目标库位)
        if (wrkMast.getWrkSts() < 9) {
            locNo = wrkMast.getLocNo();
            locSts = "O";
            // 库位转移
            if (wrkMast.getIoType() == 11) {
                // 库位转移:源库位
                AgvLocMast locMast = agvLocMastService.selectById(wrkMast.getSourceLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,源库位不存在:"+ wrkMast.getSourceLocNo());
                }
                locMast.setLocSts("F");
                locMast.setModiTime(new Date());
                locMast.setModiUser(userId);
                agvLocMastService.updateById(locMast);
            }
            // 出库取消(修改源库位)
        } else if (wrkMast.getWrkSts() > 20) {
            locNo = wrkMast.getSourceLocNo();
            // 出库 ===>> F.在库
            if (wrkMast.getIoType() > 100 && wrkMast.getIoType() != 110) {
                locSts = "F";
                // 空板出库 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 110) {
                locSts = "D";
                // 库位转移 ===>> D.空桶/空栈板
            } else if (wrkMast.getIoType() == 11) {
                locSts = wrkMast.getFullPlt().equalsIgnoreCase("N")?"D":"F";
                // 库位转移:目标库位
                AgvLocMast locMast = agvLocMastService.selectById(wrkMast.getLocNo());
                if (Cools.isEmpty(locMast)) {
                    throw new CoolException("取消库位转移失败,目标库位不存在:"+ wrkMast.getSourceLocNo());
                }
                locMast.setLocSts("O");
                locMast.setModiTime(new Date());
                locMast.setModiUser(userId);
                agvLocMastService.updateById(locMast);
            }
        } else {
            throw new CoolException("当前工作状态无法取消");
        }
        // 订单关联
        List<AgvWrkDetl> wrkDetls = agvWrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
        for (AgvWrkDetl wrkDetl : wrkDetls) {
            if (!Cools.isEmpty(wrkDetl.getOrderNo())) {
                if (!BaseController.isJSON(wrkDetl.getOrderNo())) {
                    if (!orderDetlService.decrease(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), wrkDetl.getAnfme())) {
                        throw new CoolException("订单数据回滚失败");
                    }
                } else {
                    // 订单合并出库
                    //实际取消的出库数量
                    Double wrkDetlAnfme = wrkDetl.getAnfme();
                    //订单实际出库数量
                    Double orderAnfme;
                    List<OrderDto> orderDtoList = JSON.parseArray(wrkDetl.getOrderNo(), OrderDto.class);
                    for (OrderDto orderDto : orderDtoList) {
                        if(wrkDetlAnfme > orderDto.getAnfme()){
                            orderAnfme = orderDto.getAnfme();
                            wrkDetlAnfme -= orderAnfme;
                        }else {
                            orderAnfme = wrkDetlAnfme;
                        }
                        if (!orderDetlService.decrease(orderDto.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch(), orderAnfme)) {
                            throw new CoolException("订单数据回滚失败");
                        }
                    }
                }
            }
        }
        // 取消操作人员记录
        wrkMast.setManuType("手动取消");
        wrkMast.setModiUser(userId);
        wrkMast.setModiTime(new Date());
        if (!agvWrkMastService.updateById(wrkMast)) {
            throw new CoolException("取消工作档失败");
        }
        // 保存工作主档历史档
        if (!agvWrkMastLogService.save(wrkMast)) {
            throw new CoolException("保存工作历史档失败, workNo = " + wrkMast.getWrkNo());
        }
        // 删除工作主档
        boolean wrkMastRes = agvWrkMastService.deleteById(wrkMast);
        if (wrkMast.getIoType() != 10 && wrkMast.getIoType() != 110) {
            // 保存工作明细档历史档
            if (!agvWrkDetlLogService.save(wrkMast.getWrkNo())) {
//                throw new CoolException("保存工作明细历史档失败, workNo = " + wrkMast.getWrkNo());
            }
            // 删除工作档明细
            boolean wrkDetlRes = agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", workNo));
        }
        // 修改库位状态
        AgvLocMast locMast = agvLocMastService.selectById(locNo);
        if (Cools.isEmpty(locMast)) {
            throw new CoolException("取消工作档失败,库位不存在:"+ locNo);
        }
        locMast.setLocSts(locSts);
        locMast.setModiTime(new Date());
        locMast.setModiUser(userId);
        boolean locMastRes = agvLocMastService.updateById(locMast);
        if (!wrkMastRes || !locMastRes) {
            throw new CoolException("保存数据失败");
        }
    }
    /*
    更新目标库位信息
     */
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java
@@ -50,7 +50,7 @@
    }
    */
    @Override
    public List<WrkDetl> selectByWrkNo(Integer wrkNo) {
    public List<AgvWrkDetl> selectByWrkNo(Integer wrkNo) {
        return this.baseMapper.selectByWrkNo(wrkNo);
    }
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -80,6 +80,12 @@
            //修改源库位状态为O
            agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(),"O");
        }
        //删除AGV工作档
        agvWrkMastService.deleteById(wrkNo);
        //删除AGV工作明细档
        agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
        if(!isJSON(orderNo)){
            //检查订单是否已完成
            orderService.checkComplete(orderNo);
@@ -90,11 +96,6 @@
                orderService.checkComplete(o);
            });
        }
        //删除AGV工作档
        agvWrkMastService.deleteById(wrkNo);
        //删除AGV工作明细档
        agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
        return SUCCESS;
    }
src/main/webapp/static/js/agvWrkMast/wrkMast.js
@@ -320,7 +320,7 @@
            // 完成
            case 'complete':
                layer.confirm('确认完成该笔工作档?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                    http.post(baseUrl+"/hand/control/wrkMast", {workNo: data.wrkNo, type:1}, function (res) {
                    http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:1}, function (res) {
                        $(".layui-laypage-btn")[0].click();
                        layer.msg(data.wrkNo + res.msg);
                    })
@@ -332,7 +332,7 @@
            case 'cancel':
                if (data.pdcType === "Y") {
                    layer.confirm('当前任务关联ERP销售单,取消将重新生成出库作业,是否继续?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                        http.post(baseUrl+"/hand/control/wrkMast", {workNo: data.wrkNo, type:2}, function (res) {
                        http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:2}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
@@ -340,7 +340,7 @@
                    });
                } else {
                    layer.confirm('确认取消该笔工作档?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                        http.post(baseUrl+"/hand/control/wrkMast", {workNo: data.wrkNo, type:2}, function (res) {
                        http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:2}, function (res) {
                            $(".layui-laypage-btn")[0].click();
                            layer.msg(data.wrkNo + res.msg);
                        })
@@ -351,7 +351,7 @@
            //  拣料入库
            case 'pick':
                layer.confirm('拣料入库该笔工作档?', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                    http.post(baseUrl+"/hand/control/wrkMast", {workNo: data.wrkNo, type:3}, function (res) {
                    http.post(baseUrl+"/agv/hand/control/wrkMast", {workNo: data.wrkNo, type:3}, function (res) {
                        $(".layui-laypage-btn")[0].click();
                        layer.msg(data.wrkNo + res.msg);
                    })
@@ -361,7 +361,7 @@
            //  先入品
            case 'preHave':
                layer.confirm('任务发生先入品异常。如需重新入库,请确保货物已放至堆垛机出库站!', {title: '工作号:'+data.wrkNo, shadeClose: true}, function(){
                    http.post(baseUrl+"/deal/preHave/start", {wrkNo: data.wrkNo}, function (res) {
                    http.post(baseUrl+"/agv/deal/preHave/start", {wrkNo: data.wrkNo}, function (res) {
                        $(".layui-laypage-btn")[0].click();
                        layer.msg(data.wrkNo + res.msg, {icon: 1});
                    })
src/main/webapp/static/js/common.js
@@ -228,6 +228,7 @@
    ,{field: 'suppCode', align: 'center',title: '料箱码', hide: false, width: 110}
    ,{field: 'matnr', align: 'center',title: '存货编码',hide: true}
    ,{field: 'matnr', align: 'center',title: '存货编码'}
    ,{field: 'anfme', align: 'center',title: '数量'}
    ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: true}
    ,{field: 'maktx', align: 'center',title: '存货名称'}
    ,{field: 'orderNo', align: 'center',title: '单据编号', hide: false}