自动化立体仓库 - WMS系统
zyx
2023-07-20 cb98548ecc0fa2d4388eb67528b98be39670bc0c
agv 有单入库功能
1个文件已添加
18个文件已修改
405 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/AgvMobileController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvOpenController.java 47 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvWorkController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java 41 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/AppAuthUtil.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvBasDevp/basDevp.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocDetl/locDetl.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/agvLocRule/locRule.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locDetl/locDetl.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locRule/locRule.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/out.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/orderDetl/orderDetl.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/AgvMobileController.java
@@ -34,12 +34,18 @@
    private AgvWorkService workService;
    /*
    locno?组托+绑定暂存位 : 组托
     */
    @PostMapping("/comb/auth")
    public R comb(@RequestBody CombParam combParam){
        String message = agvMobileService.comb(combParam, 1l);
        return R.ok(message);
    }
    /*
    绑定托盘条码与暂存位
     */
    @PostMapping("/combBinging/auth")
    public R combBinding(@RequestBody Map<String,Object> map){
        String barcode = map.get("barcode").toString();
@@ -48,6 +54,9 @@
        return R.ok("托盘绑定站点成功");
    }
    /*
    获取当前已绑定的还没生成工作档的暂存位
     */
    @PostMapping("/getBasDevp/auth")
    public R getBasDevpByFloor(@RequestBody Map<String,Object> map){
        String floor = map.get("floor").toString();
@@ -57,6 +66,9 @@
        return R.error("参数错误");
    }
    /*
    启动入库,生成工作档
     */
    @PostMapping("/pakin/auth")
    public R pakin(@RequestBody Map<String,Object> map){
        List<String> devNos = (List<String>) map.get("devNo");
src/main/java/com/zy/asrs/controller/AgvOpenController.java
@@ -1,14 +1,13 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.AppAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.ApiLog;
import com.zy.asrs.entity.param.AgvTaskCallBackParam;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.AppAuthUtil;
import com.zy.common.web.BaseController;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
@@ -21,9 +20,9 @@
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.EnumSet;
/**
@@ -54,10 +53,10 @@
    @PostMapping("/task/event/status")
    @AppAuth(memo = "ESS任务回调")
    public R taskEventStaus(@RequestBody AgvTaskCallBackParam param){
    public R taskEventStaus(@RequestBody AgvTaskCallBackParam param, HttpServletRequest request){
        //保存每次调用该接口的参数,作为历史可查询
        //saveApiLog(param);
        //save api log (appkey 后续添加)
        AppAuthUtil.auth("test-appkey",param, request);
        AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper<AgvWrkMast>().eq("wrk_no", param.getTaskCode()));
        if(Cools.isEmpty(agvWrkMast)){
@@ -95,15 +94,6 @@
        return true;
    }
    private void saveApiLog(AgvTaskCallBackParam param){
        ApiLog apiLog = new ApiLog();
        apiLog.setNamespace("ESS任务回调");
        apiLog.setUrl("/agv/task/event/status");
        apiLog.setRequest(JSONObject.toJSONString(param));
        apiLog.setCreateTime(new Date());
        apiLogService.insert(apiLog);
    }
}
enum AgvTask{
@@ -114,27 +104,8 @@
    task{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
            //修改AGV工作档的工作状态为205.工作完成
            agvWrkMastService.updateWrkStsByWrkNo(Integer.valueOf(param.getTaskCode()),205);
            /*
            int wrkNo = Integer.valueOf(param.getTaskCode());
            String barcode = agvWrkMastService.selectById(wrkNo).getBarcode();
            //生成AGV工作历史档
            agvWrkMastLogService.save(wrkNo);
            //生成AGV工作明细历史档
            agvWrkDetlLogService.save(wrkNo);
            //删除AGV工作档
            agvWrkMastService.deleteById(wrkNo);
            //删除AGV工作明细档
            agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
            //生成入库通知历史档
            agvWaitPakinLogService.save(barcode);
            //删除入库通知档
            agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode));
             */
        }
        public void fail(AgvTaskCallBackParam param) {
@@ -203,14 +174,8 @@
    tote_unload{
        @Transactional
        public void success(AgvTaskCallBackParam param) {
            int wrkNo = Integer.valueOf(param.getTaskCode());
            String barcode = agvWrkMastService.selectById(wrkNo).getBarcode();
            //修改目标库位状态为F.在库
            //agvLocMastService.updateLocStsByLocNo(param.getLocationCode(),"F");
            //更新目标库位明细
            //agvLocDetlService.addLocDetlInfo(param.getLocationCode(),wrkNo);
            //修改工作档状态为204.放货完成
            agvWrkMastService.updateWrkStsByWrkNo(wrkNo,204);
            agvWrkMastService.updateWrkStsByWrkNo(Integer.valueOf(param.getTaskCode()),204);
        }
        public void fail(AgvTaskCallBackParam param) {
src/main/java/com/zy/asrs/controller/AgvWorkController.java
@@ -5,7 +5,6 @@
import com.core.common.R;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.service.AgvWorkService;
import com.zy.common.model.StartupDto;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
@@ -21,13 +20,14 @@
    @Autowired
    private AgvWorkService workService;
    //TODO 移动到AgvBasDevpController下面
    @RequestMapping("/create/waitPain/wrkMast/start")
    @ManagerAuth(memo = "生成任务")
    public R createWaitPainWrkMastStart(@RequestParam String param) {
        List<AgvBasDevp> agvBasDevpList = JSONArray.parseArray(param, AgvBasDevp.class);
        StartupDto startupDto = workService.createWaitPainWrkMastStart(agvBasDevpList, getUserId());
        workService.createWaitPainWrkMastStart(agvBasDevpList, getUserId());
        //return R.ok("任务号:" + startupDto.getWorkNo() + ";目标库位:" + startupDto.getLocNo());
        return R.ok("生成入库工作档成功");
src/main/java/com/zy/asrs/service/AgvWrkDetlService.java
@@ -3,13 +3,12 @@
import com.baomidou.mybatisplus.service.IService;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.WrkDetl;
import com.zy.common.model.DetlDto;
import java.util.List;
public interface AgvWrkDetlService extends IService<AgvWrkDetl> {
    void createWorkDetail(Integer workNo, List<DetlDto> detlDtos, String barcode, Long userId);
    //void createWorkDetail(Integer workNo, List<DetlDto> detlDtos, String barcode, Long userId);
    List<WrkDetl> selectByWrkNo(Integer wrkNo);
src/main/java/com/zy/asrs/service/impl/AgvMobileServiceImpl.java
@@ -39,6 +39,9 @@
    private AgvBasDevpService agvBasDevpService;
    /*
    组托 + 绑定暂存位
     */
    @Override
    @Transactional
    public String comb(CombParam param, Long userId) {
@@ -46,98 +49,18 @@
            throw new CoolException(BaseRes.PARAM);
        }
        //检查是否已存在相同的托盘条码,存在则抛出异常
        if (agvWaitPakinService.selectCount(new EntityWrapper<AgvWaitPakin>().
                eq("zpallet", param.getBarcode()).eq("io_status", "N")) > 0) {
            throw new CoolException(param.getBarcode() + "数据正在进行入库");
        }
        Date now = new Date();
        //无单组托
        if (Cools.isEmpty(param.getOrderNo())) {
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    assert one != null;
                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
            //无单组托
            NoOrderComb(param,userId);
                } else {
                    detlDtos.add(detlDto);
                }
            });
            detlDtos.forEach(detlDto -> {
                Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                AgvWaitPakin waitPakin = new AgvWaitPakin();
                waitPakin.setBatch(detlDto.getBatch());//批号
                waitPakin.sync(mat);
                waitPakin.setZpallet(param.getBarcode());   // 托盘码
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(detlDto.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setAppeUser(userId);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                if (!agvWaitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
            });
        }else {
            //关联组托
            Order order = orderService.selectByNo(param.getOrderNo());
            if (order.getSettle() > 2) {
                throw new CoolException("单据编号已过期");
            }
            // 生成入库通知档
            List<DetlDto> detlDtos = new ArrayList<>();
            param.getCombMats().forEach(elem -> {
                // 订单明细数量校验
                OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), elem.getMatnr(), elem.getBatch());
                if (elem.getAnfme() > orderDetl.getEnableQty()) {
                    throw new CoolException(orderDetl.getMatnr() + "入库数量不合法");
                }
                // 修改订单明细数量
                if (!orderDetlService.increase(order.getId(), elem.getMatnr(), elem.getBatch(), elem.getAnfme())) {
                    throw new CoolException("修改单据明细数量失败");
                }
                DetlDto detlDto = new DetlDto(elem.getMatnr(), elem.getBatch(), elem.getAnfme());
                if (DetlDto.has(detlDtos, detlDto)) {
                    DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                    assert one != null;
                    one.setAnfme(one.getAnfme() + detlDto.getAnfme());
                } else {
                    detlDtos.add(detlDto);
                }
            });
            for (DetlDto detlDto : detlDtos) {
                Mat mat = matService.selectByMatnr(detlDto.getMatnr());
                if (Cools.isEmpty(mat)) {
                    throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
                }
                AgvWaitPakin waitPakin = new AgvWaitPakin();
                waitPakin.sync(mat);
                waitPakin.setOrderNo(order.getOrderNo());   // 单据编号
                waitPakin.setBatch(detlDto.getBatch());     // 序列码
                waitPakin.setZpallet(param.getBarcode());   // 托盘码
                waitPakin.setIoStatus("N");     // 入出状态
                waitPakin.setAnfme(detlDto.getAnfme());  // 数量
                waitPakin.setStatus("Y");    // 状态
                waitPakin.setAppeUser(userId);
                waitPakin.setAppeTime(now);
                waitPakin.setModiUser(userId);
                waitPakin.setModiTime(now);
                if (!agvWaitPakinService.insert(waitPakin)) {
                    throw new CoolException("保存入库通知档失败");
                }
            }
            orderService.updateSettle(order.getId(), 2L, userId);
            //有单组托
            OrderComb(param,userId);
        }
        if(StringUtils.isEmpty(param.getLocno())){
@@ -148,6 +71,114 @@
        }
    }
    /*
    AGV无单组托
     */
    private void NoOrderComb(CombParam param, Long userId){
        List<DetlDto> detlDtos = mappingDetlDtoByCombMat(param,null);
        //用于统一一个托盘下的入库通知档的生成时间
        Date now = new Date();
        detlDtos.forEach(detlDto -> {
            syncWaitPakin(detlDto,"",param.getBarcode(),userId,now);
        });
    }
    /*
    AGV有单组托
     */
    private void OrderComb(CombParam param, Long userId){
        //关联组托
        Order order = orderService.selectByNo(param.getOrderNo());
        if(Cools.isEmpty(order)){
            throw new CoolException("单据编号不存在");
        }
        //订单状态2以上为完成或者取消的订单
        if (order.getSettle() > 2) {
            throw new CoolException("单据编号已过期");
        }
        // 用于生成入库通知档所需参数
        List<DetlDto> detlDtos = mappingDetlDtoByCombMat(param,order);
        //用于统一一个托盘下的入库通知档的生成时间
        Date now = new Date();
        for (DetlDto detlDto : detlDtos) {
            //同步生成入库通知档
            syncWaitPakin(detlDto,order.getOrderNo(),param.getBarcode(),userId,now);
        }
        //修改单据状态为2.作业中
        orderService.updateSettle(order.getId(), 2L, userId);
    }
    /*
    根据PDA扫码所传的物料信息参数映射为DetlDto
     */
    private List<DetlDto> mappingDetlDtoByCombMat(CombParam param, Order order){
        List<DetlDto> detlDtos = new ArrayList<>();
        param.getCombMats().forEach(combMat -> {
            if(!Cools.isEmpty(order)){
                //检查入库数量
                checkOrderQty(order,combMat);
            }
            DetlDto detlDto = new DetlDto(combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme());
            //同一托盘下相同物料信息和批号转为一个入库通知档
            if (DetlDto.has(detlDtos, detlDto)) {
                DetlDto one = DetlDto.find(detlDtos, detlDto.getMatnr(), detlDto.getBatch());
                assert one != null;
                one.setAnfme(one.getAnfme() + detlDto.getAnfme());
            } else {
                detlDtos.add(detlDto);
            }
        });
        return detlDtos;
    }
    /*
    检查入库数量是否小于等于单据数量,合理则修改OrderDetl作业数量信息,否则抛出异常
     */
    private void checkOrderQty(Order order, CombParam.CombMat combMat){
        // 订单明细数量校验,如果作业数量大于单据数量则抛出异常
        OrderDetl orderDetl = orderDetlService.selectItem(order.getId(), combMat.getMatnr(), combMat.getBatch());
        if(Cools.isEmpty(orderDetl)){
            throw new CoolException("未匹配到该单据下的物料");
        }
        if (combMat.getAnfme() > orderDetl.getEnableQty()) {
            throw new CoolException(orderDetl.getMatnr() + "入库数量不合法");
        }
        // 修改订单明细数量
        if (!orderDetlService.increase(order.getId(), combMat.getMatnr(), combMat.getBatch(), combMat.getAnfme())) {
            throw new CoolException("修改单据明细数量失败");
        }
    }
    /*
    同步生成AGV入库通知档数据
     */
    private void syncWaitPakin(DetlDto detlDto, String orderNo, String zpallet, Long userId, Date now ){
        Mat mat = matService.selectByMatnr(detlDto.getMatnr());
        if (Cools.isEmpty(mat)) {
            throw new CoolException(detlDto.getMatnr() + "商品档案不存在");
        }
        AgvWaitPakin waitPakin = new AgvWaitPakin();
        waitPakin.sync(mat);
        waitPakin.setOrderNo(orderNo);   // 单据编号
        waitPakin.setBatch(detlDto.getBatch());     // 序列码
        waitPakin.setZpallet(zpallet);   // 托盘码
        waitPakin.setIoStatus("N");     // 入出状态
        waitPakin.setAnfme(detlDto.getAnfme());  // 数量
        waitPakin.setStatus("Y");    // 状态
        waitPakin.setAppeUser(userId);
        waitPakin.setAppeTime(now);
        waitPakin.setModiUser(userId);
        waitPakin.setModiTime(now);
        if (!agvWaitPakinService.insert(waitPakin)) {
            throw new CoolException("保存入库通知档失败");
        }
    }
    @Override
    @Transactional
@@ -163,9 +194,14 @@
    @Override
    public void combBinding(String barcode, String stationCode) {
        EntityWrapper<AgvBasDevp> wrapper = new EntityWrapper<>();
        wrapper.eq("dev_no",stationCode);
        AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(wrapper);
        AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>().eq("barcode", barcode));
        if(!Cools.isEmpty(agvBasDevp)){
            throw new CoolException(barcode + "已经绑定在"+ agvBasDevp.getDevNo() +"站点");
        }
        agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper<AgvBasDevp>().eq("dev_no",stationCode));
        if(agvBasDevp == null){
            throw new CoolException(stationCode + "站点信息错误");
        }
@@ -175,7 +211,7 @@
        agvBasDevp.setBarcode(barcode);
        agvBasDevp.setLocSts("F");
        agvBasDevpService.update(agvBasDevp,wrapper);
        agvBasDevpService.update(agvBasDevp,(new EntityWrapper<AgvBasDevp>().eq("dev_no",stationCode)));
    }
    public List<AgvBasDevp> getAgvBasDevpByFloor(int floor) {
src/main/java/com/zy/asrs/service/impl/AgvWorkServiceImpl.java
@@ -3,12 +3,8 @@
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvLocMast;
import com.zy.asrs.entity.AgvWaitPakin;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.*;
import com.zy.asrs.service.*;
import com.zy.common.model.DetlDto;
import com.zy.common.model.StartupDto;
import com.zy.common.service.AgvCommonService;
import lombok.extern.slf4j.Slf4j;
@@ -16,7 +12,6 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -44,6 +39,8 @@
    private AgvWrkMastService agvWrkMastService;
    @Autowired
    private AgvWrkDetlService agvWrkDetlService;
    @Autowired
    private MatService matService;
    @Override
    public StartupDto createWaitPainWrkMastStart(List<AgvBasDevp> agvBasDevpList, Long userId) {
@@ -66,7 +63,7 @@
            //生成工作档
            AgvWrkMast wrkMast = createWrkMast(agvBasDevp, agvLocMast, now, userId);
            //生成工作档明细
            createWrkDetl(agvWaitPakinList,wrkMast,userId);
            createWrkDetlReWrite(agvWaitPakinList,wrkMast,userId);
            //更新源站点信息
            updateAgvBasDevp(agvBasDevp);
            //更新目标库位状态
@@ -96,7 +93,7 @@
    /*
    生成工作档明细
     */
    private void createWrkDetl(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
  /*  private void createWrkDetl(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
        List<DetlDto> detlDtos = new ArrayList<>();
        agvWaitPakinList.forEach(agvWaitPakin -> {
            DetlDto detlDto = new DetlDto(agvWaitPakin.getMatnr(), agvWaitPakin.getBatch(), agvWaitPakin.getAnfme());
@@ -109,7 +106,33 @@
            }
        });
        agvWrkDetlService.createWorkDetail(wrkMast.getWrkNo(), detlDtos, wrkMast.getBarcode(), userId);
    }*/
    /*
    生成工作档明细
     */
    private void createWrkDetlReWrite(List<AgvWaitPakin> agvWaitPakinList, AgvWrkMast wrkMast, Long userId){
        Date now = new Date();
        agvWaitPakinList.stream().forEach(agvWaitPakin -> {
            Mat mat = matService.selectByMatnr(agvWaitPakin.getMatnr());
            if (Cools.isEmpty(mat)) {
                throw new CoolException(agvWaitPakin.getMatnr() + "商品维护失败");
            }
            AgvWrkDetl wrkDetl = new AgvWrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setWrkNo(wrkMast.getWrkNo());
            wrkDetl.setOrderNo(agvWaitPakin.getOrderNo());
            wrkDetl.setIoTime(now);
            wrkDetl.setBatch(agvWaitPakin.getBatch());
            wrkDetl.setAnfme(agvWaitPakin.getAnfme()); // 数量
            wrkDetl.setZpallet(agvWaitPakin.getZpallet()); // 托盘条码
            wrkDetl.setAppeUser(userId);
            wrkDetl.setAppeTime(now);
            wrkDetl.setModiUser(userId);
            wrkDetl.setModiTime(now);
            if (!agvWrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作明细失败");
            }
        });
    }
    /*
src/main/java/com/zy/asrs/service/impl/AgvWrkDetlServiceImpl.java
@@ -1,20 +1,14 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.AgvWrkDetl;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.WrkDetl;
import com.zy.asrs.mapper.AgvWrkDetlMapper;
import com.zy.asrs.service.AgvWrkDetlService;
import com.zy.asrs.service.MatService;
import com.zy.common.model.DetlDto;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
@Service
@@ -23,6 +17,7 @@
    @Autowired
    private MatService matService;
    /*
    @Override
    @Transactional
    public void createWorkDetail(Integer workNo, List<DetlDto> detlDtos, String barcode, Long userId) {
@@ -39,6 +34,7 @@
            AgvWrkDetl wrkDetl = new AgvWrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setOrderNo(dto.getOrderNo());
            wrkDetl.setIoTime(now);
            wrkDetl.setBatch(dto.getBatch());
            wrkDetl.setAnfme(dto.getAnfme()); // 数量
@@ -52,7 +48,7 @@
            }
        }
    }
    */
    @Override
    public List<WrkDetl> selectByWrkNo(Integer wrkNo) {
        return this.baseMapper.selectByWrkNo(wrkNo);
src/main/java/com/zy/asrs/service/impl/AgvWrkMastServiceImp.java
@@ -44,10 +44,19 @@
    public void updateWrkStsByWrkNo(int wrkNo, long wrkSts) {
        AgvWrkMast agvWrkMast = this.selectById(wrkNo);
        //判断要修改的工作档状态是否合理,如果不合理则抛出异常
        checkWrkSts(agvWrkMast,wrkSts);
        agvWrkMast.setWrkSts(wrkSts);
        this.updateById(agvWrkMast);
    }
    private boolean checkWrkSts(AgvWrkMast agvWrkMast,long wrkSts){
        // 判断规则TODO
        return true;
    }
    public Map<String,List<Map<String,String>>> startWrk(List<AgvWrkMast> agvWrkMastList) throws IOException {
        AgvTaskCreateParam agvTaskCreateParam = new AgvTaskCreateParam();
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -40,6 +40,8 @@
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private AgvWrkDetlService agvWrkDetlService;
    @Autowired
    private MatService matService;
    @Autowired
    private ErpService erpService;
@@ -66,10 +68,14 @@
    @Override
    public void checkComplete(String orderNo) {
        Order order = this.selectByNo(orderNo);
        if(Cools.isEmpty(order)){
            return;
        }
        if (order.getSettle() >= 4L) {
            return;
        }
        List<OrderDetl> orderDetls = orderDetlMapper.selectList(new EntityWrapper<OrderDetl>().eq("order_id", order.getId()));
        // 作业数量是否等于数量
        boolean complete = true;
        for (OrderDetl orderDetl : orderDetls) {
            if (orderDetl.getAnfme() > orderDetl.getQty()) {
@@ -77,7 +83,10 @@
                break;
            }
        }
        if (complete && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().like("order_no", orderNo)) == 0) {
        // 如果 作业数量等于单据总数量 && 工作明细档中无该单据的数据 && AGV工作明细档中无该单据的数据
        if (complete
                && wrkDetlService.selectCount(new EntityWrapper<WrkDetl>().eq("order_no", orderNo)) < 1
                && agvWrkDetlService.selectCount(new EntityWrapper<AgvWrkDetl>().eq("order_no",orderNo)) < 1) {
            // 出库订单重新整理明细
            DocType docType = docTypeService.selectById(order.getDocType());
            if (null != docType && docType.getPakout() == 1) {
src/main/java/com/zy/asrs/task/handler/AgvWrkMastHandler.java
@@ -34,11 +34,14 @@
    AgvWaitPakinService agvWaitPakinService;
    @Autowired
    AgvWaitPakinLogService agvWaitPakinLogService;
    @Autowired
    OrderService orderService;
    @Transactional
    public ReturnT<String> completedPutWayWrk(AgvWrkMast agvWrkMast) {
        int wrkNo = agvWrkMast.getWrkNo();
        String barcode = agvWrkMast.getBarcode();
        String orderNo = getOrderNoByWrkNo(wrkNo);
        //修改工作档状态为206.库存更新完成
        agvWrkMast.setWrkSts(206L);
@@ -59,6 +62,9 @@
        agvWrkDetlService.delete(new EntityWrapper<AgvWrkDetl>().eq("wrk_no",wrkNo));
        //删除入库通知档
        agvWaitPakinService.delete(new EntityWrapper<AgvWaitPakin>().eq("zpallet",barcode));
        //检查订单是否已完成
        orderService.checkComplete(orderNo);
        return SUCCESS;
    }
@@ -84,4 +90,9 @@
        return FAIL;
    }
    private String getOrderNoByWrkNo(int wrkNo){
        AgvWrkDetl agvWrkDetl = agvWrkDetlService.selectOne(new EntityWrapper<AgvWrkDetl>().eq("wrk_no", wrkNo));
        return agvWrkDetl.getOrderNo();
    }
}
src/main/java/com/zy/asrs/utils/AppAuthUtil.java
New file
@@ -0,0 +1,23 @@
package com.zy.asrs.utils;
import com.core.common.Cools;
import com.core.exception.CoolException;
import lombok.extern.slf4j.Slf4j;
import javax.servlet.http.HttpServletRequest;
@Slf4j
public class AppAuthUtil {
    private static final boolean auth = true;
    public static void auth(String appkey, Object obj, HttpServletRequest request) {
        request.setAttribute("cache", obj);
        if (Cools.isEmpty(appkey)) {
            throw new CoolException("认证失败,请确认appkey无误!");
        }
//        if (!APP_KEY_LIST.contains(appkey)) {
//            throw new CoolException("认证失败,请确认appkey无误!");
//        }
    }
}
src/main/webapp/static/js/agvBasDevp/basDevp.js
@@ -77,7 +77,7 @@
                    return html;
                }}
            ,{field: 'locSts$', align: 'center',title: '货位状态'}
            ,{field: 'wrkNo', align: 'center',title: '工作号', edit:true,  style:'color: blue;font-weight: bold'}
            //,{field: 'wrkNo', align: 'center',title: '工作号', edit:true,  style:'color: blue;font-weight: bold'}
            ,{field: 'floor', align: 'center',title: '楼'}
            //,{field: 'locType1$', align: 'center',title: '高低'}
            ,{field: 'barcode', align: 'center',title: '条形码'}
src/main/webapp/static/js/agvLocDetl/locDetl.js
@@ -11,7 +11,7 @@
        ,{field: 'zpallet', align: 'center',title: '托盘条码'}
        ,{field: 'specs', align: 'center',title: '规格'}
        ,{field: 'model', align: 'center',title: '代码', hide: true}
        ,{field: 'model', align: 'center',title: '通用型号', hide: true}
        ,{field: 'color', align: 'center',title: '颜色', hide: true}
        ,{field: 'brand', align: 'center',title: '品牌', hide: true}
        ,{field: 'unit', align: 'center',title: '单位', hide: true}
src/main/webapp/static/js/agvLocRule/locRule.js
@@ -25,7 +25,7 @@
            // ,{field: 'id', align: 'center',title: 'ID'}
            ,{field: 'matnr', align: 'center',title: '商品编号'}
            ,{field: 'specs', align: 'center',title: '规格', hide: true}
            ,{field: 'model', align: 'center',title: '型号', hide: true}
            ,{field: 'model', align: 'center',title: '通用型号', hide: true}
            ,{field: 'cstmr', align: 'center',title: '客户', hide: true}
            ,{field: 'batch', align: 'center',title: '批号'}
            ,{field: 'other', align: 'center',title: '其他', hide: true}
src/main/webapp/static/js/common.js
@@ -185,7 +185,7 @@
    ,{field: 'name', align: 'center',title: '移动类型', hide: true}
    ,{field: 'maktx', align: 'center',title: '物料名称', width: 150}
    ,{field: 'specs', align: 'center',title: '规格', hide: false}
    ,{field: 'model', align: 'center',title: '批次', hide: true}
    ,{field: 'model', align: 'center',title: '通用型号', hide: true}
    ,{field: 'manuDate', align: 'center',title: '单据时间', hide: false}
    ,{field: 'weight', align: 'center',title: '重量', hide: false}
    ,{field: 'units', align: 'center',title: '支数', hide: false}
@@ -222,13 +222,13 @@
var detlCols = [
    ,{field: 'zpallet', align: 'center',title: '托盘条码', width: 110}
    ,{field: 'matnr', align: 'center',title: '物料号'}
    ,{field: 'model', align: 'center',title: '批号'}
    ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: false}
    ,{field: 'maktx', align: 'center',title: '物料名称'}
    ,{field: 'specs', align: 'center',title: '规格'}
    ,{field: 'anfme', align: 'center',title: '数量'}
    ,{field: 'name', align: 'center',title: '移动类型', hide: true}
    ,{field: 'orderNo', align: 'center',title: '单据编号', hide: false}
    ,{field: 'batch', align: 'center',title: '序列码', width: 300, sort:true, hide: true}
    ,{field: 'model', align: 'center',title: '通用型号', hide: true}
    ,{field: 'manuDate', align: 'center',title: '单据时间', hide: true}
    ,{field: 'weight', align: 'center',title: '重量', hide: true}
    ,{field: 'units', align: 'center',title: '支数', hide: true}
src/main/webapp/static/js/locDetl/locDetl.js
@@ -11,7 +11,7 @@
        ,{field: 'zpallet', align: 'center',title: '托盘条码'}
        ,{field: 'specs', align: 'center',title: '规格'}
        ,{field: 'model', align: 'center',title: '代码', hide: true}
        ,{field: 'model', align: 'center',title: '通用型号', hide: true}
        ,{field: 'color', align: 'center',title: '颜色', hide: true}
        ,{field: 'brand', align: 'center',title: '品牌', hide: true}
        ,{field: 'unit', align: 'center',title: '单位', hide: true}
src/main/webapp/static/js/locRule/locRule.js
@@ -25,7 +25,7 @@
            // ,{field: 'id', align: 'center',title: 'ID'}
            ,{field: 'matnr', align: 'center',title: '商品编号'}
            ,{field: 'specs', align: 'center',title: '规格', hide: true}
            ,{field: 'model', align: 'center',title: '型号', hide: true}
            ,{field: 'model', align: 'center',title: '通用型号', hide: true}
            ,{field: 'cstmr', align: 'center',title: '客户', hide: true}
            ,{field: 'batch', align: 'center',title: '批号'}
            ,{field: 'other', align: 'center',title: '其他', hide: true}
src/main/webapp/static/js/order/out.js
@@ -40,7 +40,7 @@
            // ,{field: 'qty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
            // ,{field: 'name', align: 'center',title: '名称'}
            // ,{field: 'model', align: 'center',title: '批次'}
            // ,{field: 'model', align: 'center',title: '通用型号'}
            ,{field: 'unit', align: 'center',title: '单位', hide: true}
            ,{field: 'barcode', align: 'center',title: '商品条码', hide: true}
            // ,{field: 'supplier', align: 'center',title: '供应商'}
src/main/webapp/static/js/orderDetl/orderDetl.js
@@ -29,7 +29,7 @@
            ,{field: 'maktx', align: 'center',title: '物料号'}
            ,{field: 'name', align: 'center',title: '名称'}
            ,{field: 'specs', align: 'center',title: '规格'}
            ,{field: 'model', align: 'center',title: '批次'}
            ,{field: 'model', align: 'center',title: '通用型号'}
            ,{field: 'batch', align: 'center',title: '序列码'}
            ,{field: 'unit', align: 'center',title: '单位'}
            ,{field: 'barcode', align: 'center',title: '商品条码'}