自动化立体仓库 - WMS系统
whycq
2024-06-23 69d68078402cd2029336a9e25fd78e4501bf2a80
Merge remote-tracking branch 'origin/phpsasrs' into phpsasrs
28个文件已修改
2个文件已添加
746 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/ReportQueryController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WaitPakin.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/WrkDetlLog.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/PickConfirmParam.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/PickMatParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/StockVo.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OrderDetlService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 65 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 251 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/constant/MesConstant.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/web/WcsController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locDetl/locDetl.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/waitPakin/waitPakin.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/wrkDetlLog/wrkDetlLog.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/pakStore/locDetlCheckQuery.html 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/report/viewStayTime.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/waitPakinLog/waitPakinLog.html 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -9,15 +9,13 @@
import com.core.common.R;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.CombParam;
import com.zy.asrs.entity.param.MobileAdjustParam;
import com.zy.asrs.entity.param.OffSaleParam;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.MobileAdjustResult;
import com.zy.asrs.mapper.ManLocDetlMapper;
import com.zy.asrs.service.*;
import com.zy.common.model.LocDto;
import com.zy.common.model.TaskDto;
import com.zy.common.model.WrkDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
@@ -55,7 +53,12 @@
    private PackService packService;
    @Autowired
    private ManLocDetlMapper manLocDetlMapper;
    @Autowired
    private StaDescService staDescService;
    @Autowired
    private CommonService commonService;
    @Autowired
    private MatService matService;
    // 商品上架
    @RequestMapping("/mat/onSale/auth")
@@ -358,4 +361,182 @@
        return mobileService.manDetlOut(json);
    }
    @RequestMapping("/loc/f/list")
    @ManagerAuth(memo = "获取在库库位")
    public R locNoF(@RequestParam(required = false) String locNo){
        Wrapper<LocMast> wrapper = new EntityWrapper<LocMast>().eq("loc_sts", "F");
        if (!Cools.isEmpty(locNo)) {
            wrapper.like("loc_no", locNo);
        }
        List<LocMast> list = locMastService.selectList(wrapper);
        return R.ok().add(list);
    }
    @RequestMapping("/pick/sta/list")
    @ManagerAuth(memo = "获取并板站")
    public R pickSta(){
        List<StaDesc> list = staDescService.selectList(new EntityWrapper<StaDesc>().eq("type_no",104));
        return R.ok().add(list);
    }
    @RequestMapping("/pick/mat/list")
    @ManagerAuth(memo = "获取并板物料")
    public R pickMats(@RequestParam(required = false) String matnr){
        List<DocType> docTypes = docTypeService.selectList(new EntityWrapper<DocType>().like("doc_name", "入库"));
        ArrayList<Long> typeList = new ArrayList<>();
        for (DocType docType : docTypes) {
            typeList.add(docType.getDocId());
        }
        EntityWrapper<Order> wrapper = new EntityWrapper<>();
        wrapper.eq("status", 1);
        wrapper.in("doc_type", typeList);
        List<Order> orders = orderService.selectList(wrapper);
        ArrayList<Long> orderIds = new ArrayList<>();
        for (Order order : orders) {
            orderIds.add(order.getId());
        }
        //搜索明细
        Wrapper<OrderDetl> wrapper1 = new EntityWrapper<OrderDetl>();
        wrapper1.eq("status", 1);
        wrapper1.in("order_id", orderIds);
        if (!Cools.isEmpty(matnr)) {
            wrapper1.like("matnr", matnr);
        }
        List<OrderDetl> list = orderDetlService.selectList(wrapper1);
        ArrayList<PickMatParam> maps = new ArrayList<>();
        for (OrderDetl orderDetl : list) {
            //剩余可用数量
            double count = orderDetl.getAnfme() - orderDetl.getWorkQty();
            if (count <= 0) {
                continue;
            }
            PickMatParam matParam = new PickMatParam();
            matParam.setMatnr(orderDetl.getMatnr());
            matParam.setBatch(orderDetl.getBatch());
            matParam.setOrderNo(orderDetl.getOrderNo());
            matParam.setOrderId(orderDetl.getOrderId());
            matParam.setCount(count);
            matParam.setUseCount(0D);
            maps.add(matParam);
        }
        return R.ok().add(maps);
    }
    @RequestMapping("/pick/in")
    @ManagerAuth(memo = "并板入库")
    @Transactional
    public R pickConfirm(@RequestBody PickConfirmParam param){
        LocMast locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (!locMast.getLocSts().equals("F")) {
            return R.error("库位状态不是在库");
        }
        StaDesc staDesc = staDescService.selectOne(new EntityWrapper<StaDesc>()
                .eq("type_no", 104)
                .eq("stn_no", param.getStaNo()));
        if (staDesc == null) {
            return R.error("站点不存在");
        }
        //检验传参是否和订单明细匹配
        for (PickMatParam matParam : param.getList()) {
            Wrapper<OrderDetl> wrapper = new EntityWrapper<OrderDetl>()
                    .eq("order_no", matParam.getOrderNo())
                    .eq("status", 1)
                    .eq("matnr", matParam.getMatnr());
            if (!Cools.isEmpty(matParam.getBatch())) {
                wrapper.eq("batch", matParam.getBatch());
            }
            OrderDetl orderDetl = orderDetlService.selectOne(wrapper);
            if (orderDetl == null) {
                return R.error("物料数据不存在");
            }
            //剩余可用数量
            double count = orderDetl.getAnfme() - orderDetl.getWorkQty();
            if (matParam.getCount() != count) {
                return R.error("物料数据已过期");
            }
            if (matParam.getUseCount() > count) {
                return R.error("可用数量不足");
            }
        }
        Date now = new Date();
        // 生成工作号
        int workNo = commonService.getWorkNo(WorkNoType.getWorkNoType(104));
        // 生成工作档
        WrkMast wrkMast = new WrkMast();
        wrkMast.setWrkNo(workNo);
        wrkMast.setIoTime(now);
        wrkMast.setWrkSts(101L); // 工作状态:101.生成出库
        wrkMast.setIoType(104); // 入出库状态
        wrkMast.setIoPri(13D); // 优先级:13
        wrkMast.setSourceStaNo(staDesc.getCrnStn()); // 源站
        wrkMast.setStaNo(staDesc.getStnNo()); // 目标站
        wrkMast.setSourceLocNo(param.getLocNo()); // 源库位
        wrkMast.setFullPlt("Y"); // 满板:Y
        wrkMast.setPicking("Y"); // 拣料
        wrkMast.setExitMk("N"); // 退出
        wrkMast.setEmptyMk("N"); // 空板
        wrkMast.setBarcode(locMast.getBarcode());
        wrkMast.setAppeUser(getUserId()); // 操作人员数据
        wrkMast.setAppeTime(now);
        wrkMast.setModiUser(getUserId());
        wrkMast.setModiTime(now);
        wrkMast.setCrnNo(staDesc.getCrnNo());
        if (!wrkMastService.insert(wrkMast)) {
            throw new CoolException("保存工作档失败,出库库位号:" + param.getLocNo());
        }
        // 生成工作档明细
        for (PickMatParam matParam : param.getList()) {
            EntityWrapper<Mat> wrapper = new EntityWrapper<>();
            wrapper.eq("status", 1);
            wrapper.eq("matnr", matParam.getMatnr());
            Mat mat = matService.selectOne(wrapper);
            if (mat == null) {
                throw new CoolException("保存工作档失败,物料信息不存在:" + matParam.getMatnr());
            }
            WrkDetl wrkDetl = new WrkDetl();
            wrkDetl.sync(mat);
            wrkDetl.setOrderNo(matParam.getOrderNo());
            wrkDetl.setWrkNo(workNo);
            wrkDetl.setZpallet(wrkMast.getBarcode());
            wrkDetl.setIoTime(now);
            wrkDetl.setAnfme(matParam.getUseCount()); // 数量
            wrkDetl.setAppeTime(now);
            wrkDetl.setAppeUser(getUserId());
            wrkDetl.setModiTime(now);
            wrkDetl.setModiUser(getUserId());
            if (!wrkDetlService.insert(wrkDetl)) {
                throw new CoolException("保存工作档明细失败");
            }
            //更新订单工作数量
            orderDetlService.increaseWorkQtyByOrderNo(matParam.getOrderNo(), matParam.getMatnr(), matParam.getBatch(), matParam.getUseCount());
        }
        // 修改库位状态:   F.在库 ====>>> R.出库预约/P.拣料/盘点/并板出库中
        locMast = locMastService.selectOne(new EntityWrapper<LocMast>().eq("loc_no", param.getLocNo()));
        if (locMast.getLocSts().equals("F")) {
            locMast.setLocSts("P");
            locMast.setModiUser(getUserId());
            locMast.setModiTime(now);
            if (!locMastService.updateById(locMast)) {
                throw new CoolException("预约库位状态失败,库位号:" + param.getLocNo());
            }
        } else {
            throw new CoolException(param.getLocNo() + "库位不是在库状态");
        }
        return R.ok();
    }
}
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -1,17 +1,18 @@
package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.annotations.AppAuth;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.param.MatSyncParam;
import com.zy.asrs.entity.param.OpenOrderCompleteParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
import com.zy.asrs.service.OpenService;
import com.zy.common.model.DetlDto;
import com.zy.common.web.BaseController;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletRequest;
@@ -103,7 +104,7 @@
    /**
     * 库存统计
     */
    @RequestMapping("/stock/default/v1")
    @PostMapping("/stock/default/v1")
    public R queryStock(@RequestHeader(required = false) String appkey,
                        HttpServletRequest request) {
        auth(appkey, null, request);
src/main/java/com/zy/asrs/controller/ReportQueryController.java
@@ -71,6 +71,10 @@
        if (!Cools.isEmpty(locNo) && !locNo.equals("null")) {
            bean.setLoc_no(locNo);
        }
        String matnr = String.valueOf(param.get("matnr"));
        if (!Cools.isEmpty(matnr) && !matnr.equals("null")) {
            bean.setMatnr(matnr);
        }
        List<ViewStayTimeBean> list = reportQueryMapper.queryViewStayTimeList(bean);
        int count = reportQueryMapper.getViewStayTimeCount(bean);
        Page<ViewStayTimeBean> page = new Page<>();
src/main/java/com/zy/asrs/entity/WaitPakin.java
@@ -4,7 +4,10 @@
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.common.utils.Synchro;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@@ -221,6 +224,15 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
    public String getAppeUser$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.selectById(this.appeUser);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getUsername());
        }
        return null;
    }
    public void sync(Object source) {
        Synchro.Copy(source, this);
    }
src/main/java/com/zy/asrs/entity/WrkDetlLog.java
@@ -2,8 +2,10 @@
import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SpringUtils;
import com.zy.asrs.service.WrkMastLogService;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
import io.swagger.annotations.ApiModelProperty;
@@ -358,5 +360,20 @@
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.appeTime);
    }
    public String getIoType$(){
        if (Cools.isEmpty(this.wrkNo) || Cools.isEmpty(this.ioTime)){
            return "";
        }
        WrkMastLogService wrkMastLogService = SpringUtils.getBean(WrkMastLogService.class);
        EntityWrapper<WrkMastLog> wrapper = new EntityWrapper<>();
        wrapper.eq("wrk_no", wrkNo);
        wrapper.eq("io_time", ioTime);
        WrkMastLog wrkMastLog = wrkMastLogService.selectOne(wrapper);
        if (Cools.isEmpty(wrkMastLog)){
            return "";
        }
        return wrkMastLog.getIoType$();
    }
}
src/main/java/com/zy/asrs/entity/param/PickConfirmParam.java
New file
@@ -0,0 +1,16 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import java.util.List;
@Data
public class PickConfirmParam {
    private String locNo;
    private Integer staNo;
    private List<PickMatParam> list;
}
src/main/java/com/zy/asrs/entity/param/PickMatParam.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class PickMatParam {
    private String matnr;
    private String batch;
    private String orderNo;
    private Long orderId;
    private Double count;
    private Double useCount;
}
src/main/java/com/zy/asrs/entity/result/StockVo.java
@@ -10,10 +10,12 @@
    private String matnr;
    private String maktx;
    private String specs;
    private String batch;
    private Double count;
    private String memo;
}
src/main/java/com/zy/asrs/mapper/OrderDetlMapper.java
@@ -56,4 +56,7 @@
     * @return 库存数量
     */
    Long selectCountToManByMatnr(@Param("matnr") String matnr,@Param("batch") String batch);
    int increaseWorkQtyByOrderNo(@Param("orderNo") String orderNo, @Param("matnr") String matnr, @Param("batch") String batch, @Param("qty") Double qty);
}
src/main/java/com/zy/asrs/service/OrderDetlService.java
@@ -52,4 +52,6 @@
     * @return 返回两个键值对,asrCount在立库库存,manCount在平库库存
     */
    Map<String,Long> selectCountByMatnr(String matnr, String batch);
    boolean increaseWorkQtyByOrderNo(String orderNo, String matnr, String batch, Double qty);
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,7 +1,5 @@
package com.zy.asrs.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.DateUtils;
@@ -9,17 +7,17 @@
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.param.MatSyncParam;
import com.zy.asrs.entity.param.OpenOrderPakinParam;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
import com.zy.asrs.entity.param.PackParam;
import com.zy.asrs.entity.result.InOutCountDto;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.NodeUtils;
import com.zy.common.utils.Synchro;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -485,49 +483,17 @@
                // 分类
                Long tagId;
                // 一级分类
                if (!Cools.isEmpty(matParam.getGroupCode()) && !Cools.isEmpty(matParam.getGroupName())) {
                    Tag priTag = tagService.selectByName(matParam.getGroupCode(), 2);
                    if (priTag == null) {
                        Tag top = tagService.getTop();
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(top.getId());
                        priTag = new Tag(
                                null,    // 编号
                                matParam.getGroupCode(),    // 名称
                                top.getId(),    // 父级
                                top.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
                                nodeUtils.pathName.toString(),    // 关联路径名
                                0,    // 类型
                                null,    // 负责人
                                null,    // 图片
                                null,    // 简要描述
                                null,    // 数量
                                2,    // 等级
                                null,    // 排序
                                1,    // 状态
                                now,    // 添加时间
                                null,    // 添加人员
                                now,    // 修改时间
                                null,    // 修改人员
                                null    // 备注
                        );
                        if (tagMapper.insert(priTag) == 0) {
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                    }
                if (!Cools.isEmpty(matParam.getGroupName())) {
                    // 二级分类
                    Tag secTag = tagService.selectByName(matParam.getGroupName(), 3);
                    if (secTag == null) {
                        NodeUtils nodeUtils = new NodeUtils();
                        nodeUtils.executePath(priTag.getId());
                        secTag = new Tag(
                                null,    // 编号
                                matParam.getGroupName(),    // 名称
                                priTag.getId(),    // 父级
                                priTag.getName(),    // 父级名称
                                nodeUtils.path.toString(),    // 关联路径
                                nodeUtils.pathName.toString(),    // 关联路径名
                                10010L,    // 父级
                                "全部",    // 父级名称
                                "10009,10010",    // 关联路径
                                "全部,全部",    // 关联路径名
                                0,    // 类型
                                null,    // 负责人
                                null,    // 图片
@@ -545,17 +511,20 @@
                        if (tagMapper.insert(secTag) == 0) {
                            throw new CoolException("服务器内部错误,请联系管理员");
                        }
                        Tag tag = tagService.selectByName(matParam.getGroupName(), 3);
                        tagId = tag.getId();
                    } else {
                        tagId = secTag.getId();
                    }
                    tagId = secTag.getId();
                } else {
                    tagId = tagService.getTop().getId();
                    throw new CoolException("商品分类不能为空");
//                    tagId = tagService.getTop().getId();
                }
                mat.sync(matParam);
//            mat.setMatnr(para);
//            mat.setMaktx(param.getMaktx());
//            mat.setSpecs(param.getSpecs());
//            mat.setModel(param.getModel());
                mat.setTagId(tagId);
                mat.setStatus(1);
                mat.setCreateTime(now);
@@ -566,7 +535,9 @@
                    log.info("同步新物料[商品编号:{}]", mat.getMatnr());
                }
            } else {
                mat.sync(param);
//                mat.sync(param);
                mat.setMaktx(matParam.getMaktx());
                mat.setSpecs(matParam.getSpecs());
                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                }
src/main/java/com/zy/asrs/service/impl/OrderDetlServiceImpl.java
@@ -127,4 +127,9 @@
        map.put("manCount",orderDetlMapper.selectCountToManByMatnr(matnr, batch));
        return map;
    }
    @Override
    public boolean increaseWorkQtyByOrderNo(String orderNo, String matnr, String batch, Double qty) {
        return this.baseMapper.increaseWorkQtyByOrderNo(orderNo, matnr, batch, qty) > 0;
    }
}
src/main/java/com/zy/asrs/service/impl/OrderServiceImpl.java
@@ -73,7 +73,7 @@
        if (complete) {
            for (OrderDetl orderDetl : orderDetls) {
                //生成单据和入库通知档时,给batch为空的明细赋了一个 ="", 现在改为null,回传用
                if (orderDetl.getBatch().equals("")){
                if (!Cools.isEmpty(orderDetl.getBatch()) && orderDetl.getBatch().equals("")){
                    orderDetl.setBatch(null);
                    orderDetlService.updateById(orderDetl);
                }
src/main/java/com/zy/asrs/service/impl/WorkServiceImpl.java
@@ -835,6 +835,7 @@
            locDetl.sync(mat);
            locDetl.setZpallet(zpallet);
            locDetl.setBatch(adjust.getBatch());
            locDetl.setBarcode(locDetls.get(0).getBarcode());
            locDetl.setLocNo(locMast.getLocNo());
            locDetl.setAnfme(adjust.getCount()); // 数量
            locDetl.setModiUser(userId); // 操作人员信息
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -1,9 +1,8 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.core.common.DateUtils;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
@@ -15,17 +14,18 @@
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
import com.zy.common.model.MesPakinParam;
import com.zy.common.model.MesPakoutParam;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * Created by vincent on 2020/7/7
@@ -55,104 +55,165 @@
            return SUCCESS;
        }
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
        // 获取请求头
        Map<String, Object> headers = getHeaders();
        // 构造请求体
        String body = getBody(orderDetls, order);
        // 入库完成上报
        if (docType.getPakin() == 1) {
            JSONObject orderJson = new JSONObject();
            orderJson.put("orderNo",order.getOrderNo());
            String response = "";
            boolean success = false;
            try {
                response = new HttpHandler.Builder()
                        .setUri(MesConstant.URL)
                        .setPath(MesConstant.PAKIN_URL)
                        .setJson(orderJson.toJSONString())
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
                    success = true;
                    // 修改订单状态 4.完成 ===>> 6.已上报
                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                } else {
                    log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKIN_URL, JSON.toJSONString(orderJson), response);
                    throw new CoolException("上报mes系统失败");
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(MesConstant.URL)
                    .setPath(MesConstant.PAKIN_URL)
                    .setHeaders(headers)
                    .setJson(body)
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            JSONObject std_data = jsonObject.getJSONObject("std_data");
            JSONObject execution = std_data.getJSONObject("execution");
            String code = execution.getString("code");
            JSONObject std_data1 = jsonObject.getJSONObject("parameter");
            JSONObject execution1 = std_data1.getJSONObject("response_result");
            String status = execution1.getString("Status");
            if ("0".equals(code) && "0".equals(status)) {
                success = true;
                // 修改订单状态 4.完成 ===>> 6.已上报
                if (!orderService.updateSettle(order.getId(), 6L, null)) {
                    throw new CoolException("服务器内部错误,请联系管理员");
                }
            } catch (Exception e) {
                log.error("fail", e);
            } else {
                log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL + MesConstant.PAKIN_URL, body, response);
                throw new CoolException("上报mes系统失败");
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "入库上报",
                            MesConstant.URL + MesConstant.PAKIN_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(orderJson),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
        // 出库完成上报
        if (docType.getPakout() == 1) {
            MesPakoutParam pakoutParam = new MesPakoutParam();
            pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单"));
            pakoutParam.setPakoutTime(DateUtils.convert(order.getUpdateTime()));
            pakoutParam.setLgortFrom("5006");
            pakoutParam.setLgortTo("1111");
            if (!pakoutParam.isTag()) {
                pakoutParam.setKunnr("C1000");
            }
            pakoutParam.setOrderNo(order.getOrderNo());
            for (OrderDetl orderDetl : orderDetls) {
                String serial = Cools.isEmpty(orderDetl.getBatch()) ? "" : orderDetl.getBatch();
                pakoutParam.getList().add(new MesPakoutParam.Detl(orderDetl.getMatnr() + (Cools.isEmpty(serial) ? "" : "-" + serial), orderDetl.getAnfme()));
            }
            String response = "";
            boolean success = false;
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                response = new HttpHandler.Builder()
                        .setUri(MesConstant.URL)
                        .setPath(MesConstant.PAKOUT_URL)
                        .setJson(JSON.toJSONString(pakoutParam))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code").equals(200)) {
                    success = true;
                    // 修改订单状态 4.完成 ===>> 6.已上报
                    if (!orderService.updateSettle(order.getId(), 6L, null)) {
                        throw new CoolException("服务器内部错误,请联系管理员");
                    }
                } else {
                    log.error("请求接口失败!!!url:{};request:{};response:{}", MesConstant.URL+MesConstant.PAKOUT_URL, JSON.toJSONString(pakoutParam), response);
                    throw new CoolException("上报mes系统失败");
                }
                // 保存接口日志
                apiLogService.save(
                        docType.getPakin() == 1 ?"入库上报" : "出库上报",
                        MesConstant.URL + MesConstant.PAKIN_URL,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(body),
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "成品库出库上报",
                            MesConstant.URL + MesConstant.PAKOUT_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(pakoutParam),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
                log.error("", e);
            }
        }
        return SUCCESS;
    }
    private String getBody(List<OrderDetl> orderDetls, Order order) {
        JSONObject orderJson = new JSONObject();
        JSONObject orderJson1 = new JSONObject();
        JSONObject orderJson2 = new JSONObject();
        JSONObject orderJson3 = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        for(OrderDetl orderDetl:orderDetls) {
            Map<String,Object> map = new HashMap<>();
            map.put("matnr",orderDetl.getMatnr());
            map.put("anfme",orderDetl.getAnfme());
            jsonArray.add(map);
        }
        orderJson3.put("orderNo",order.getOrderNo());
        orderJson3.put("TypeKey",order.getDocType$());
        orderJson3.put("matList",jsonArray);
        orderJson2.put("importData",orderJson3);
        orderJson1.put("parameter",orderJson2);
        orderJson.put("std_data",orderJson1);
        return orderJson.toJSONString();
    }
    Map<String, Object> getHeaders(){
        JSONObject digiHost = new JSONObject();
        digiHost.put("prod","XThirdParty");
        digiHost.put("ver","1.0");
        digiHost.put("ip","192.168.10.160");
        digiHost.put("id","XWMS");
        digiHost.put("timezone","+8");
        digiHost.put("timestamp",new Date().getTime());
        digiHost.put("acct","dcms");
        JSONObject digiService = new JSONObject();
        digiService.put("prod","E10");
        digiService.put("name","XCommon.ImportData");
        digiService.put("ip","192.168.10.160");
        digiService.put("id","SW_TEST_External");
        String key = digiHost.toJSONString() + digiService.toJSONString();
        String keyMd5 = DigestUtils.md5Hex(key);
        Map<String,Object> headers = new HashMap<>();
        headers.put("digi-type","sync ");
        headers.put("digi-protocol","raw");
        headers.put("digi-host",digiHost.toJSONString());
        headers.put("digi-service",digiService.toJSONString());
        headers.put("digi-key",keyMd5);
        headers.put("digi-datakey"," XCommon.ImportData");
        return headers;
    }
    public static void main(String[] args) {
        String msg = "{\n" +
                "    \"std_data\": {\n" +
                "        \"execution\": {\n" +
                "            \"code\": \"0\",\n" +
                "            \"sql_code\": \"\",\n" +
                "            \"description\": \"执行成功\",\n" +
                "            \"token_id\": \"e7b4b7d668ec41fa83f643eb1b322959\"\n" +
                "        },\n" +
                "        \"parameter\": {\n" +
                "            \"response_result\": {\n" +
                "                \"Status\": \"0\",\n" +
                "                \"Message\": \"操作成功!\",\n" +
                "                \"DOC_NO\": \"\"\n" +
                "            }\n" +
                "        }\n" +
                "    }\n" +
                "}";
        JSONObject jsonObject = JSON.parseObject(msg);
        JSONObject std_data = jsonObject.getJSONObject("std_data");
        JSONObject execution = std_data.getJSONObject("execution");
        System.out.println(jsonObject.get("std_data"));
        System.out.println(execution.getString("code"));
//        JSONObject orderJson = new JSONObject();
//        JSONObject orderJson1 = new JSONObject();
//        JSONObject orderJson2 = new JSONObject();
//        JSONObject orderJson3 = new JSONObject();
//
//        JSONArray jsonArray = new JSONArray();
//        Map<String,Object> map = new HashMap<>();
//        map.put("matnr","301080001");
//        map.put("anfme","23456");
//        JSONObject jsonObject = new JSONObject();
//        jsonObject.put("matnr","301080001");
//        jsonObject.put("anfme","23456");
//        jsonArray.add(map);
//
//        orderJson3.put("orderNo","3600-201702010001");
//        orderJson3.put("TypeKey","PURCHASE_ARRIVAL");
//        orderJson3.put("matList",jsonArray);
//        orderJson2.put("importData",orderJson3);
//        orderJson1.put("parameter",orderJson2);
//        orderJson.put("std_data",orderJson1);
//        System.out.println(orderJson.toJSONString());
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -204,19 +204,15 @@
                    // 根据工作号,查询工作明细档
                    List<WrkDetl> wrkDetls54 = wrkDetlService.selectList(new EntityWrapper<WrkDetl>().eq("wrk_no", wrkMast.getWrkNo()));
                    if (wrkDetls54.isEmpty()) {
//                        exceptionHandle("并板入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                        TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                        return FAIL.setMsg("并板入库 ===>> 工作明细档为空; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                        exceptionHandle("并板入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                    }
                    // 修改库存明细数量,如无库存,曾新增
                    for (WrkDetl wrkDetl:wrkDetls54) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        if (null != locDetl) {
                            if (!locDetlService.updateAnfme(wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
//                                exceptionHandle("并板入库 ===>> 修改库存明细数量失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                                TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                return FAIL.setMsg("并板入库 ===>> 修改库存明细数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                            if (!locDetlService.updateAnfme(locDetl.getAnfme() + wrkDetl.getAnfme(), locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch())) {
                                exceptionHandle("并板入库 ===>> 修改库存明细数量失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                            }
                        } else {
                            locDetl = new LocDetl();
@@ -227,11 +223,25 @@
                            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() + "]");
                                exceptionHandle("并板入库 ===>> 新增库存明细失败;[workNo={0}],[matnr={1}]", wrkMast.getWrkNo(), wrkDetl.getMatnr());
                            }
                        }
                        // 更新订单完成数量
                        OrderDetl orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        if (orderDetl == null) {
                            orderDetl = orderDetlService.selectItem(wrkDetl.getOrderNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        }
                        try {
                            if(!Cools.isEmpty(orderDetl)){
                                if (!orderDetlService.increaseQtyByOrderNo(wrkDetl.getOrderNo(), wrkDetl.getMatnr(),
                                        orderDetl.getBatch(), wrkDetl.getAnfme())) {
                                    TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                                    return FAIL.setMsg("并板入库 ===>> 更新订单完成数量失败; [workNo=" + wrkMast.getWrkNo() + "],[locNo=" + wrkMast.getLocNo() + "]");
                                }
                            }
                        } catch (Exception ignore){}
                    }
                    // 修改库位状态 Q ====>> F
                    if (locMast.getLocSts().equals("Q")) {
@@ -240,9 +250,7 @@
                        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() + "]");
                            exceptionHandle("并板入库 ===>> 修改库位状态失败;[workNo={0}],[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
                        }
                    }
                    break;
src/main/java/com/zy/common/CodeBuilder.java
@@ -20,7 +20,7 @@
        generator.url="127.0.0.1:1433;databasename=phpsasrs";
        generator.username="sa";
        generator.password="sa@123";
        generator.table="man_mat_v2";
        generator.table="man_bom_mat";
        generator.packagePath="com.zy.asrs";
        generator.build();
    }
src/main/java/com/zy/common/constant/MesConstant.java
@@ -5,11 +5,11 @@
 */
public class MesConstant {
    public static final String URL = "http://192.168.99.130:80";
    public static final String URL = "http://192.186.5.235:9990";
    public static final String PACK_DOWN_URL = "mes/api/zy/v1/packDown/sendList";
    public static final String PAKIN_URL = "mes/api/zy/v1/warehouse/sendList";
    public static final String PAKIN_URL = "/CROSS/RESTful";
    public static final String PAKOUT_URL = "wmsFinprd/api/zy/v1/packOut/sendList";
src/main/java/com/zy/common/web/WcsController.java
@@ -73,7 +73,7 @@
                if (wrkMast != null && wrkMast.getIoType() == 103) {
                    return R.parse(CodeRes.PICK_600);
                }
                return R.parse(CodeRes.NO_COMB_700);
                return R.error(param.getBarcode() + "此条码未组托,请先组托!");
            }
            int countLoc = locDetlService.selectCount(new EntityWrapper<LocDetl>().eq("zpallet",param.getBarcode()));
            int countWrk = wrkMastService.selectCount(new EntityWrapper<WrkMast>().eq("barcode",param.getBarcode())
src/main/java/com/zy/system/entity/license/CustomLicenseManager.java
@@ -126,29 +126,29 @@
        //当前服务器真实的参数信息
        LicenseCheck serverCheckModel = getServerInfos();
        if(expectedCheckModel != null && serverCheckModel != null){
            //校验IP地址
            if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){
                //throw new LicenseContentException("当前服务器的IP没在授权范围内");
            }
            //校验Mac地址
            if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){
                //throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
            }
            //校验主板序列号
            if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){
                throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
            }
            //校验CPU序列号
            if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){
                throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
            }
        }else{
            throw new LicenseContentException("不能获取服务器硬件信息");
        }
        //if(expectedCheckModel != null && serverCheckModel != null){
        //    //校验IP地址
        //    if(!checkIpAddress(expectedCheckModel.getIpAddress(),serverCheckModel.getIpAddress())){
        //        //throw new LicenseContentException("当前服务器的IP没在授权范围内");
        //    }
        //
        //    //校验Mac地址
        //    if(!checkIpAddress(expectedCheckModel.getMacAddress(),serverCheckModel.getMacAddress())){
        //        //throw new LicenseContentException("当前服务器的Mac地址没在授权范围内");
        //    }
        //
        //    //校验主板序列号
        //    if(!checkSerial(expectedCheckModel.getMainBoardSerial(),serverCheckModel.getMainBoardSerial())){
        //        throw new LicenseContentException("当前服务器的主板序列号没在授权范围内");
        //    }
        //
        //    //校验CPU序列号
        //    if(!checkSerial(expectedCheckModel.getCpuSerial(),serverCheckModel.getCpuSerial())){
        //        throw new LicenseContentException("当前服务器的CPU序列号没在授权范围内");
        //    }
        //}else{
        //    throw new LicenseContentException("不能获取服务器硬件信息");
        //}
    }
src/main/resources/application.yml
@@ -53,7 +53,7 @@
#erp
erp:
  enable: false
  enable: true
#License相关配置
src/main/resources/mapper/LocDetlMapper.xml
@@ -106,6 +106,9 @@
        <if test="crnNo!=null and crnNo!='' ">
            and b.crn_no=#{crnNo}
        </if>
        <if test="zpallet!=null and zpallet!='' ">
            and a.zpallet like '%' + #{zpallet} + '%'
        </if>
    </sql>
    <select id="getStockOutPage" resultMap="BaseResultMap">
@@ -297,11 +300,13 @@
    <select id="queryStockTotal" resultType="com.zy.asrs.entity.result.StockVo">
        select
        matnr,
        maktx,
        specs,
        batch,
        count(anfme) as count
        from asr_loc_detl
        where 1=1
        group by matnr,batch
        group by matnr,maktx,specs,batch
    </select>
    <select id="sum" resultType="java.lang.Integer">
        SELECT SUM(anfme) FROM asr_loc_detl
src/main/resources/mapper/OrderDetlMapper.xml
@@ -246,4 +246,20 @@
        </choose>
    </update>
    <update id="increaseWorkQtyByOrderNo">
        update man_order_detl
        set work_qty = work_qty + #{qty}
        where 1=1
        and order_no = #{orderNo}
        and matnr = #{matnr}
        <choose>
            <when test="batch != null and batch != ''">
                and batch = #{batch}
            </when>
            <otherwise>
                and (batch IS NULL OR batch = '')
            </otherwise>
        </choose>
    </update>
</mapper>
src/main/resources/mapper/OrderMapper.xml
@@ -65,6 +65,7 @@
        where 1=1
        and settle = 4
        and status = 1
        and doc_type not in(18,19)
        order by create_time asc
    </select>
src/main/webapp/static/js/locDetl/locDetl.js
@@ -8,7 +8,7 @@
        ,{field: 'batch', align: 'center',title: '批号', width: 300, sort:true}
        ,{field: 'anfme', align: 'center',title: '数量'}
        ,{field: 'zpallet', align: 'center',title: '托盘条码'}
        ,{field: 'specs', align: 'center',title: '配置'}
        ,{field: 'specs', align: 'center',title: '规格'}
        ,{field: 'model', align: 'center',title: '代码', hide: true}
        ,{field: 'color', align: 'center',title: '颜色', hide: true}
        ,{field: 'brand', align: 'center',title: '类型', hide: false}
src/main/webapp/static/js/waitPakin/waitPakin.js
@@ -17,7 +17,9 @@
                return html;
            }}
        ,{field: 'modiUser$', align: 'center',title: '修改人员', hide:true}
        ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true})
        ,{field: 'modiTime$', align: 'center',title: '修改时间', hide:true}
        ,{field: 'appeUser$', align: 'center',title: '添加人员'}
        ,{field: 'appeTime$', align: 'center',title: '添加时间'})
    return cols;
}
src/main/webapp/static/js/wrkDetlLog/wrkDetlLog.js
@@ -3,6 +3,7 @@
    var cols = [
        {field: 'wrkNo', align: 'center',title: '工作号'}
        ,{field: 'ioTime$', align: 'center',title: '工作时间'}
        ,{field: 'ioType$', align: 'center',title: '入出库类型'}
    ];
    cols.push.apply(cols, detlCols);
    cols.push({field: 'modiUser$', align: 'center',title: '修改人员',hide: true}
src/main/webapp/views/pakStore/locDetlCheckQuery.html
@@ -76,14 +76,19 @@
                <input class="layui-input" type="text" name="matnr" placeholder="商品编号"  autocomplete="off">
            </div>
        </div>
<!--        <div class="layui-inline">-->
<!--            <div class="layui-input-inline">-->
<!--                <input class="layui-input" type="text" name="maktx" placeholder="物料描述" autocomplete="off">-->
<!--            </div>-->
<!--        </div>-->
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="maktx" placeholder="物料描述" autocomplete="off">
                <input class="layui-input" type="text" name="batch" placeholder="批号" autocomplete="off">
            </div>
        </div>
        <div class="layui-inline">
            <div class="layui-input-inline">
                <input class="layui-input" type="text" name="batch" placeholder="批号" autocomplete="off">
                <input class="layui-input" type="text" name="zpallet" placeholder="托盘码" autocomplete="off">
            </div>
        </div>
        <!-- 日期范围 -->
src/main/webapp/views/report/viewStayTime.html
@@ -24,6 +24,11 @@
            <input class="layui-input" type="text" name="loc_no" placeholder="库位号" autocomplete="off">
        </div>
    </div>
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="matnr" placeholder="商品编号" autocomplete="off">
        </div>
    </div>
    <!-- 待添加 -->
    <div id="data-search-btn" class="layui-btn-container layui-form-item" style="display: inline-block">
src/main/webapp/views/waitPakinLog/waitPakinLog.html
@@ -16,6 +16,11 @@
<div id="search-box" class="layui-form layui-card-header">
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="matnr" placeholder="商品编号" autocomplete="off">
        </div>
    </div>
    <div class="layui-inline">
        <div class="layui-input-inline">
            <input class="layui-input" type="text" name="pakin_id" placeholder="入库通知号" autocomplete="off">
        </div>
    </div>