自动化立体仓库 - WMS系统
增加轮询MES接口功能,增加物料档案类与隔膜信息类,增加orderdetl qr_code,startdate,enddate三个字段
12个文件已修改
9个文件已添加
1028 ■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/DiaphragmInfo.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/MaterialInfo.java 50 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/MesMatSyncScheduler.java 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/MesPakinScheduler.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/MesPakoutScheduler.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesMatSyncHandler.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesPakinHandler.java 208 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesPakoutHandler.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 140 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/utils/MesSyncUtil.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/image/favicon.ico 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/image/logo.png 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/common.js 118 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/locDetl/locDetl.js 67 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/order.js 26 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/static/js/order/out.js 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/index.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/login.html 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/webapp/views/order/out.html 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/DiaphragmInfo.java
New file
@@ -0,0 +1,53 @@
package com.zy.asrs.entity;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 此类为隔膜卷信息,用于接收MES系统接口提供的隔膜卷信息
 */
@Data
public class DiaphragmInfo {
    //生产批号
    private String batchNo;
    //物料编码
    private String itemCode;
    //物料名称
    private String itemName;
    //条形码
    private String barCode;
    //大卷位置
    private String position;
    //小卷位置
    private String position2;
    //数量
    private BigDecimal quantity;
    //辅数量
    private BigDecimal assQuantity;
    //规格/型号
    private String std;
    //等级
    private String grade;
    //备注
    private String note;
    //收卷开始日期
    private Date startDate;
    //收卷结束日期
    private Date endDate;
}
src/main/java/com/zy/asrs/entity/MaterialInfo.java
New file
@@ -0,0 +1,50 @@
package com.zy.asrs.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * 此类为物料档案信息,用于接收MES系统接口提供的物料档案信息
 */
@Data
public class MaterialInfo {
    //更新时间
    private Date mdate;
    //物料编码
    private String itemCode;
    //物料名称
    private String itemName;
    //规格
    private String std;
    //材质
    private String material;
    //品牌
    private String brand;
    //备注
    private String note;
    //主单位
    private String unitName;
    //辅单位
    private String assUnitName;
    //主辅关系
    private BigDecimal rate;
    //宽
    private BigDecimal width;
    //厚
    private BigDecimal thickness;
}
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -144,6 +144,12 @@
    private String barcode;
    /**
     * 存储隔膜系统中隔膜卷信息的条形码
     */
    @ApiModelProperty(value= "条形码")
    private String qrCode;
    /**
     * 产地
     */
    @ApiModelProperty(value= "产地")
@@ -290,6 +296,22 @@
    private Date updateTime;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "收卷开始日期")
    @TableField("start_date")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date startDate;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "收卷结束日期")
    @TableField("end_date")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date endDate;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
src/main/java/com/zy/asrs/task/MesMatSyncScheduler.java
New file
@@ -0,0 +1,35 @@
package com.zy.asrs.task;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.MesMatSyncHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
 * 轮询MES接口,同步物料档案信息
 */
@Slf4j
@Component
public class MesMatSyncScheduler {
    @Autowired
    MesMatSyncHandler handler;
    //@Scheduled(cron = "0/30 * * * * ?")
    private void execute() {
        ReturnT<String> result = null;
        try {
            result = handler.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (!result.isSuccess()) {
            log.error("");
        }
    }
}
src/main/java/com/zy/asrs/task/MesPakinScheduler.java
New file
@@ -0,0 +1,31 @@
package com.zy.asrs.task;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.MesPakinHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
/**
 * 轮询MES接口,生成入库单据
 */
@Slf4j
@Component
public class MesPakinScheduler {
    @Autowired
    MesPakinHandler handler;
    //@Scheduled(cron = "0/30 * * * * ?")
    private void execute() {
        ReturnT<String> result = null;
        result = handler.start();
        if (!result.isSuccess()) {
            log.error("");
        }
    }
}
src/main/java/com/zy/asrs/task/MesPakoutScheduler.java
New file
@@ -0,0 +1,34 @@
package com.zy.asrs.task;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.task.handler.MesPakoutHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
 * 轮询MES接口,生成出库单据
 */
@Slf4j
@Component
public class MesPakoutScheduler {
    @Autowired
    MesPakoutHandler handler;
    //@Scheduled(cron = "0/30 * * * * ?")
    private void execute() {
        ReturnT<String> result = null;
        try {
            result = handler.start();
        } catch (IOException e) {
            e.printStackTrace();
        }
        if (!result.isSuccess()) {
            log.error("");
        }
    }
}
src/main/java/com/zy/asrs/task/handler/MesMatSyncHandler.java
New file
@@ -0,0 +1,143 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.Mat;
import com.zy.asrs.entity.MaterialInfo;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.MatService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.MesSyncUtil;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@Slf4j
@Service
public class MesMatSyncHandler extends AbstractHandler<String> {
    @Value("${mes.mat-sync.url}")
    private String url;
    @Value("${mes.mat-sync.path}")
    private String path;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    MatService matService;
    @Transactional
    public ReturnT<String> start() throws IOException {
        boolean success = true;
        log.info("url:" + url + path);
        JSONObject jsonObject = doGetJsonData();
        int code = jsonObject.getInteger("code");
        if(code == 200){
            insertOrUpdateMat(jsonObject);
        }else {
            success = false;
            log.error("请求mes接口响应错误,响应码为: " + code);
        }
        saveApiLog(jsonObject.toJSONString(),success);
        return SUCCESS;
    }
    /*
    保存请求日志
     */
    private void saveApiLog(String response, boolean success) {
        apiLogService.save(
                "商品信息同步",
                url + path,
                null,
                "127.0.0.1",
                null,
                response,
                success
        );
    }
    /*
    发起一个doGet请求
     */
    private JSONObject doGetJsonData() throws IOException {
        return JSON.parseObject( new HttpHandler.Builder()
                .setUri(url)
                .setPath(path)
                .setParams(MesSyncUtil.getRequestParamMap())
                .build()
                .doGet());
    }
    /*
    插入或更改mat信息
     */
    private void insertOrUpdateMat(JSONObject jsonObject){
        List<MaterialInfo> dataList =  JSONObject.parseArray(jsonObject.getString("data"),MaterialInfo.class);
        //MaterialInfo data = jsonObject.getObject("data",MaterialInfo.class);
        dataList.forEach(data -> {
            Mat m = matService.selectByMatnr(data.getItemCode());
            if(m == null){
                m = new Mat();
                m.setCreateTime(jsonObject.getDate("createDate"));
                matMapping(data,m);
                matService.insert(m);
            }else {
                matMapping(data,m);
                EntityWrapper<Mat> wrapper = new EntityWrapper<>();
                wrapper.eq("matnr",m.getMatnr());
                matService.update(m,wrapper);
            }
        });
    }
    /*
    映射mat和物料档案信息字段
     */
    private void matMapping(MaterialInfo data, Mat m){
        //修改时间 -- 更新时间
        m.setUpdateTime(data.getMdate());
        //商品编码 -- 物料编码
        m.setMatnr(data.getItemCode());
        //商品名称 -- 物料名称
        m.setMaktx(data.getItemName());
        //规格 -- 规格
        m.setSpecs(data.getStd());
        //型号 -- 材质
        m.setModel(data.getMaterial());
        //品牌 -- 品牌
        m.setBrand(data.getBrand());
        //备注 --备注
        m.setMemo(data.getNote());
        //单位 -- 主单位
        m.setUnit(data.getUnitName());
        //品项数 -- 辅单位
        m.setItemNum(data.getAssUnitName());
        //单位量 -- 主辅关系
        m.setUnits(data.getRate() == null ? null : data.getRate().doubleValue());
        //长度 -- 宽
        m.setLength(data.getWidth() == null ? null : data.getWidth().doubleValue());
        //体积 -- 厚
        m.setVolume(data.getThickness() == null ? null : data.getThickness().doubleValue());
    }
}
src/main/java/com/zy/asrs/task/handler/MesPakinHandler.java
New file
@@ -0,0 +1,208 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.Cools;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.DiaphragmInfo;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.asrs.utils.MesSyncUtil;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.io.IOException;
import java.util.Date;
import java.util.List;
@Slf4j
@Service
public class MesPakinHandler extends AbstractHandler<String> {
    @Value("${mes.pakin.url}")
    private String url;
    @Value("${mes.pakin.path}")
    private String path;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Transactional
    public ReturnT<String> start() {
        boolean success = true;
        log.info("url:" + url + path);
        JSONObject jsonObject = null;
        try {
            jsonObject = doGetJsonData();
        } catch (IOException e) {
            success = false;
            e.printStackTrace();
        }
        int code = jsonObject.getInteger("code");
        if(code == 200){
            JSONObject jsonData = jsonObject.getJSONObject("data");
            String orderNo = jsonData.getString("orderNo");
            Order o = insertOrder(jsonData,orderNo);
            insertOrUpdateOrderDetl(jsonData, o);
        }else {
            success = false;
            log.error("请求mes接口响应错误,响应码为: " + code);
        }
        saveApiLog(jsonObject.toJSONString(),success);
        return SUCCESS;
    }
    /*
    保存日志
     */
    private void saveApiLog(String response, boolean success){
        apiLogService.save(
                "生成入库单据",
                url + path,
                null,
                "127.0.0.1",
                null,
                response,
                success
        );
    }
    /*
    发起一个doGet请求
     */
    private JSONObject doGetJsonData() throws IOException {
        return JSON.parseObject( new HttpHandler.Builder()
                .setUri(url)
                .setPath(path)
                .setParams(MesSyncUtil.getRequestParamMap())
                .build()
                .doGet());
    }
    /*
    新增order信息
     */
    private Order insertOrder(JSONObject jsonData, String orderNo){
        Order o = orderService.selectByNo(orderNo);
        if (!Cools.isEmpty(o)) {
            throw new CoolException(jsonData.getString("orderNo") + "单据已存在,请勿重复提交");
        }
        o = orderMapping(jsonData);
        if (!orderService.insert(o)) {
            throw new CoolException("生成单据主档失败,请联系管理员");
        }
        return o;
    }
    /*
    根据orderNo、matnr、batch,新增或者更改orderDetl信息
     */
    private void insertOrUpdateOrderDetl(JSONObject jsonData, Order o){
        List<DiaphragmInfo> diaphragmInfoList =  JSONObject.parseArray(jsonData.getString("orderDetails"),DiaphragmInfo.class);
        diaphragmInfoList.forEach(d -> {
            EntityWrapper<OrderDetl> wrapper = new EntityWrapper<>();
            wrapper.eq("order_no",o.getOrderNo()).eq("matnr",d.getItemCode()).eq("batch",d.getBatchNo());
            OrderDetl od = orderDetlService.selectOne(wrapper);
            if(od == null){
                od = new OrderDetl();
                od.setOrderNo(o.getOrderNo());
                od.setOrderId(o.getId());
                orderDetlMapping(d,od);
                orderDetlService.insert(od);
            }else {
                od.setQty(od.getQty() + d.getQuantity().doubleValue());
                od.setAnfme(od.getAnfme() + d.getAssQuantity().doubleValue());
                od.setUpdateTime(new Date());
                orderDetlService.updateById(od);
            }
        });
    }
    /*
    映射Order类和jsonData的字段
     */
    private Order orderMapping(JSONObject jsonData){
        Order o = new Order();
        o.setStatus(1);
        //设置订单状态 --- 初始化状态
        o.setSettle(0L);
        //uuid
        o.setUuid(String.valueOf(snowflakeIdWorker.nextId()));
        //单据编号
        o.setOrderNo(jsonData.getString("orderNo"));
        //单据时间
        o.setOrderTime(jsonData.getString("orderTime"));
        //单据类型
        DocType docType = docTypeService.selectOrAdd(jsonData.getString("orderType"), Boolean.TRUE);
        o.setDocType(docType.getDocId());
        o.setCreateTime(new Date());
        o.setUpdateTime(new Date());
        return o;
    }
    /*
    映射OrderDetl与隔膜信息类的字段关系
     */
    private void orderDetlMapping(DiaphragmInfo d, OrderDetl od){
        //批号 -- 生产批号
        od.setBatch(d.getBatchNo());
        //商品编码 -- 物料编码
        od.setMatnr(d.getItemCode());
        //商品名称 -- 物料名称
        od.setMaktx(d.getItemName());
        //数量 -- 数量
        od.setAnfme(d.getQuantity() == null ? null : d.getQuantity().doubleValue());
        //完成数量 -- 辅数量
        od.setQty(d.getAssQuantity() == null ? null : d.getAssQuantity().doubleValue());
        //规格 -- 规格/型号
        od.setSpecs(d.getStd());
        //备注 -- 备注
        od.setMemo(d.getNote());
        //条形码 -- 条形码
        od.setQrCode(d.getBarCode());
        //颜色 -- 大卷位置
        od.setColor(d.getPosition());
        //型号 -- 小卷位置
        od.setModel(d.getPosition2());
        //品牌 -- 等级
        od.setBrand(d.getGrade());
        //收卷开始日期
        od.setStartDate(d.getStartDate());
        //收卷结束日期
        od.setEndDate(d.getEndDate());
        od.setCreateTime(new Date());
        od.setUpdateTime(new Date());
    }
}
src/main/java/com/zy/asrs/task/handler/MesPakoutHandler.java
New file
@@ -0,0 +1,37 @@
package com.zy.asrs.task.handler;
import com.zy.asrs.service.DocTypeService;
import com.zy.asrs.service.OrderDetlService;
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import java.io.IOException;
@Slf4j
@Service
public class MesPakoutHandler extends AbstractHandler<String> {
    @Value("${mes.pakin.url}")
    private String url;
    @Value("${mes.pakin.path}")
    private String path;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    public ReturnT<String> start() throws IOException {
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -2,9 +2,8 @@
import com.alibaba.fastjson.JSON;
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.DiaphragmInfo;
import com.zy.asrs.entity.DocType;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
@@ -14,17 +13,19 @@
import com.zy.asrs.service.OrderService;
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.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.math.BigDecimal;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
 * Created by vincent on 2020/7/7
@@ -44,6 +45,18 @@
    @Autowired
    private DocTypeService docTypeService;
    @Value("${mes.pakin-sync.url}")
    private String pakinUrl;
    @Value("${mes.pakin-sync.path}")
    private String pakinPath;
    @Value("${mes.pakout-sync.url}")
    private String pakoutUrl;
    @Value("${mes.pakout-sync.path}")
    private String pakoutPath;
    @Transactional
    public ReturnT<String> start(Order order) {
        DocType docType = docTypeService.selectById(order.getDocType());
@@ -53,6 +66,7 @@
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
        // 入库完成上报
        if (docType.getPakin() == 1) {
            /*
            MesPakinParam pakinParam = new MesPakinParam();
            pakinParam.setPakinTime(DateUtils.convert(order.getUpdateTime()));
            pakinParam.setLgortFrom("5008");
@@ -98,10 +112,13 @@
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
            } */
            return orderPakinSync(order,docType.getDocName(),orderDetls);
        }
        // 出库完成上报
        if (docType.getPakout() == 1) {
            /*
            MesPakoutParam pakoutParam = new MesPakoutParam();
            pakoutParam.setTag(!order.getDocType$().equalsIgnoreCase("手动出库单"));
            pakoutParam.setPakoutTime(DateUtils.convert(order.getUpdateTime()));
@@ -153,8 +170,119 @@
                    );
                } catch (Exception e) { log.error("", e); }
            }
             */
            return orderPakoutSync(order,docType.getDocName(),orderDetls);
        }
        return SUCCESS;
    }
    private  ReturnT<String> orderPakoutSync (Order order, String orderType, List<OrderDetl> orderDetls){
        Map<String,Object> requestMap = getRequestMap(order,orderType,orderDetls);
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(pakoutUrl)
                    .setPath(pakoutPath)
                    .setJson(JSON.toJSONString(requestMap))
                    .build()
                    .doPost();
            success = orderSettleUpdate(response,order);
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "成品库出库上报",
                        pakoutUrl + pakoutPath,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(requestMap),
                        response,
                        success
                );
            } catch (Exception e) { log.error("", e); }
        }
        return SUCCESS;
    }
    private  ReturnT<String> orderPakinSync (Order order, String orderType, List<OrderDetl> orderDetls){
        Map<String,Object> requestMap = getRequestMap(order,orderType,orderDetls);
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(pakinUrl)
                    .setPath(pakinPath)
                    .setJson(JSON.toJSONString(requestMap))
                    .build()
                    .doPost();
            success = orderSettleUpdate(response,order);
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "成品库入库上报",
                        pakinUrl + pakinPath,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(requestMap),
                        response,
                        success
                );
            } catch (Exception e) { log.error("", e); }
        }
        return SUCCESS;
    }
    private Map<String,Object> getRequestMap(Order order,String orderType, List<OrderDetl> orderDetls){
        Map<String,Object> requestMap = new HashMap<>();
        requestMap.put("orderNo",order.getOrderNo());
        requestMap.put("orderTime",order.getOrderTime());
        requestMap.put("orderType",orderType);
        List<DiaphragmInfo> diaphragmInfoList = orderDetls.stream().map(od -> {
            DiaphragmInfo diaphragmInfo = new DiaphragmInfo();
            diaphragmInfo.setBatchNo(od.getBatch());
            diaphragmInfo.setItemCode(od.getMatnr());
            diaphragmInfo.setBarCode(od.getQrCode());
            diaphragmInfo.setQuantity(new BigDecimal(od.getAnfme()));
            diaphragmInfo.setAssQuantity(new BigDecimal(od.getQty()));
            return diaphragmInfo;
        }).collect(Collectors.toList());
        requestMap.put("orderDetails",diaphragmInfoList);
        return requestMap;
    }
    private boolean orderSettleUpdate(String response, Order order){
        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(requestMap), response);
            throw new CoolException("上报mes系统失败");
        }
        return true;
    }
}
src/main/java/com/zy/asrs/utils/MesSyncUtil.java
New file
@@ -0,0 +1,21 @@
package com.zy.asrs.utils;
import org.springframework.util.DigestUtils;
import java.nio.charset.StandardCharsets;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
public class MesSyncUtil {
    public static Map<String,Object> getRequestParamMap(){
        Date date = new Date();
        String ts = date.getTime() + "";
        String key = DigestUtils.md5DigestAsHex(("appkey" + ts).getBytes(StandardCharsets.UTF_8));
        Map<String,Object> requestParamMap = new HashMap<>();
        requestParamMap.put("ts",ts);
        requestParamMap.put("key",key);
        return requestParamMap;
    }
}
src/main/resources/application.yml
@@ -1,5 +1,5 @@
server:
  port: 8080
  port: 8081
  servlet:
    context-path: /@pom.build.finalName@
@@ -24,6 +24,13 @@
    multipart:
      maxFileSize: 100MB
      maxRequestSize: 100MB
#  rabbitmq:
#    host: 121.41.63.25 # rabbitMQ的ip地址
#    port: 5672 # 端口
#    username: zyx
#    password: zyx123456
#    virtual-host: /
mybatis-plus:
  mapper-locations: classpath:mapper/*.xml
@@ -53,3 +60,21 @@
comb:
  limit: 5000
mes:
  mat-sync:
    url: localhost:8080
    path: /test/getMat
  pakin:
    url: localhost:8080
    path: /test/getOrder
  pakout:
    url: localhost:8080
    path: /test/getOrder
  pakin-sync:
    url: localhost:8080
    path: /test/syncOrderPakin
  pakout-sync:
    url: localhost:8080
    path: /test/syncOrderPakout
src/main/webapp/static/image/favicon.ico

src/main/webapp/static/image/logo.png

src/main/webapp/static/js/common.js
@@ -181,38 +181,38 @@
}
var matCols = [
    {field: 'matnr', align: 'center',title: '商品编号(品号)', width: 180}
    {field: 'matnr', align: 'center',title: '物料编码', width: 180}
    // {field: 'id', align: 'center',title: 'ID'}
    // ,{field: 'uuid', align: 'center',title: '编号'}
    // ,{field: 'tagId$', align: 'center',title: '所属归类'}
    ,{field: 'maktx', align: 'center',title: '商品名称(品名)', width: 200}
    ,{field: 'maktx', align: 'center',title: '物料名称', width: 200}
    // ,{field: 'name', 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: true}
    ,{field: 'unit', align: 'center',title: '单位', hide: false}
    ,{field: 'price', align: 'center',title: '单价', hide: true}
    ,{field: 'sku', align: 'center',title: 'sku', hide: true}
    ,{field: 'units', align: 'center',title: '单位量', hide: true}
    ,{field: 'barcode', align: 'center',title: '条码', hide: true}
    ,{field: 'origin', align: 'center',title: '产地', hide: true}
    ,{field: 'manu', align: 'center',title: '厂家', hide: true}
    ,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
    ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
    ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
    ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
    ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
    ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
    ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
    ,{field: 'supp', align: 'center',title: '供应商', hide: true}
    ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
    ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
    ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
    ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
    ,{field: 'source$', align: 'center',title: '制购', hide: true}
    ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
    ,{field: 'danger$', 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: false}
    //,{field: 'price', align: 'center',title: '单价', hide: true}
    //,{field: 'sku', align: 'center',title: 'sku', hide: true}
    ,{field: 'units', align: 'center',title: '主辅关系', hide: true}
    //,{field: 'barcode', align: 'center',title: '条码', hide: true}
    //,{field: 'origin', align: 'center',title: '产地', hide: true}
    //,{field: 'manu', align: 'center',title: '厂家', hide: true}
    //,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
    ,{field: 'itemNum', align: 'center',title: '辅单位', hide: true}
   // ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
   // ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
    ,{field: 'length', align: 'center',title: '宽', hide: true}
    ,{field: 'volume', align: 'center',title: '厚', hide: true}
   // ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
   // ,{field: 'supp', align: 'center',title: '供应商', hide: true}
   // ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
   // ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
   // ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
   // ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
   // ,{field: 'source$', align: 'center',title: '制购', hide: true}
   // ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
   // ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
    // ,{field: 'status$', align: 'center',title: '状态'}
    // ,{field: 'createBy$', align: 'center',title: '添加人员'}
    // ,{field: 'createTime$', align: 'center',title: '添加时间'}
@@ -222,38 +222,42 @@
]
var detlCols = [
    {field: 'matnr', align: 'center',title: '商品编号(品号)', sort:true}
    ,{field: 'maktx', align: 'center',title: '商品名称(品名)', sort:true}
    {field: 'matnr', align: 'center',title: '物料编码', sort:true}
    ,{field: 'maktx', align: 'center',title: '物料名称', sort:true}
    ,{field: 'orderNo', align: 'center',title: '单据编号', hide: false}
    ,{field: 'batch', align: 'center',title: '货品特征', sort:true}
    ,{field: 'anfme', align: 'center',title: '数量', hide: false}
   // ,{field: 'batch', align: 'center',title: '货品特征', sort:true}
    ,{field: 'anfme', align: 'center',title: '数量', hide: true}
    ,{field: 'qty', align: 'center',title: '辅数量', hide: true}
    ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: false}
    ,{field: 'specs', align: 'center',title: '规格', hide: false}
    ,{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: false}
    ,{field: 'price', align: 'center',title: '单价', hide: true}
    ,{field: 'sku', align: 'center',title: 'sku', hide: true}
    ,{field: 'units', align: 'center',title: '单位量', hide: true}
    ,{field: 'specs', align: 'center',title: '规格/型号', hide: false}
    ,{field: 'memo', align: 'center',title: '备注', hide: true}
    ,{field: 'qrCode', align: 'center',title: '条形码', hide: false}
    ,{field: 'model', align: 'center',title: '小卷位置', hide: false}
    ,{field: 'color', align: 'center',title: '大卷位置', hide: false}
    ,{field: 'brand', align: 'center',title: '等级', hide: false}
    ,{field: 'startDate', align: 'center',title: '收卷开始日期', hide: false}
    ,{field: 'endDate', align: 'center',title: '收卷结束日期', hide: false}
   // ,{field: 'unit', align: 'center',title: '单位', hide: false}
   // ,{field: 'price', align: 'center',title: '单价', hide: true}
   // ,{field: 'sku', align: 'center',title: 'sku', hide: true}
   // ,{field: 'units', align: 'center',title: '单位量', hide: true}
    ,{field: 'barcode', align: 'center',title: '条码', hide: true}
    ,{field: 'origin', align: 'center',title: '产地', hide: true}
    ,{field: 'manu', align: 'center',title: '厂家', hide: true}
    ,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
    ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
    ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
    ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
    ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
    ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
    ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
    ,{field: 'supp', align: 'center',title: '供应商', hide: true}
    ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
    ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
    ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
    ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
    ,{field: 'source$', align: 'center',title: '制购', hide: true}
    ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
    ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
   // ,{field: 'origin', align: 'center',title: '产地', hide: true}
   // ,{field: 'manu', align: 'center',title: '厂家', hide: true}
   // ,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
   // ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
   // ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
   // ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
   // ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
   // ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
   // ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
   // ,{field: 'supp', align: 'center',title: '供应商', hide: true}
   // ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
   // ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
   // ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
   // ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
   // ,{field: 'source$', align: 'center',title: '制购', hide: true}
   // ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
   // ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
]
src/main/webapp/static/js/locDetl/locDetl.js
@@ -1,39 +1,44 @@
var pageCurr;
function getCol() {
    var cols = [
        {field: 'locNo$', align: 'center',title: '库位号'},
        {field: 'matnr', align: 'center',title: '商品编号', sort:true}
        ,{field: 'maktx', align: 'center',title: '商品名称', sort:true}
        {field: 'locNo$', align: 'center',title: '库位号'}
        ,{field: 'matnr', align: 'center',title: '物料编码', sort:true}
        ,{field: 'maktx', align: 'center',title: '物料名称', sort:true}
        ,{field: 'orderNo', align: 'center',title: '单据编号', hide: false}
        ,{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: '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}
        ,{field: 'price', align: 'center',title: '单价', hide: true}
        ,{field: 'sku', align: 'center',title: 'sku', hide: true}
        ,{field: 'units', align: 'center',title: '单位量', hide: true}
        ,{field: 'barcode', align: 'center',title: '条码', hide: true}
        ,{field: 'origin', align: 'center',title: '产地', hide: true}
        ,{field: 'manu', align: 'center',title: '厂家', hide: true}
        ,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
        ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
        ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
        ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
        ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
        ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
        ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
        ,{field: 'supp', align: 'center',title: '供应商', hide: true}
        ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
        ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
        ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
        ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
        ,{field: 'source$', align: 'center',title: '制购', hide: true}
        ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
        ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
        ,{field: 'anfme', align: 'center',title: '数量', hide: true}
        ,{field: 'qty', align: 'center',title: '辅数量', hide: true}
        ,{field: 'zpallet', align: 'center',title: '托盘条码', hide: true}
        ,{field: 'specs', 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: 'qrCode', align: 'center',title: '条形码', hide: true}
        ,{field: 'memo', align: 'center',title: '备注', hide: true}
        ,{field: 'startDate', align: 'center',title: '收卷开始日期', hide: true}
        ,{field: 'endDate', align: 'center',title: '收卷结束日期', hide: true}
        // ,{field: 'unit', align: 'center',title: '单位', hide: true}
        // ,{field: 'price', align: 'center',title: '单价', hide: true}
        // ,{field: 'sku', align: 'center',title: 'sku', hide: true}
        // ,{field: 'units', align: 'center',title: '单位量', hide: true}
        // ,{field: 'barcode', align: 'center',title: '条码', hide: true}
        // ,{field: 'origin', align: 'center',title: '产地', hide: true}
        // ,{field: 'manu', align: 'center',title: '厂家', hide: true}
        // ,{field: 'manuDate', align: 'center',title: '生产日期', hide: true}
        // ,{field: 'itemNum', align: 'center',title: '品项数', hide: true}
        // ,{field: 'safeQty', align: 'center',title: '安全库存量', hide: true}
        // ,{field: 'weight', align: 'center',title: '单箱净重', hide: true}
        // ,{field: 'length', align: 'center',title: '单箱毛重', hide: true}
        // ,{field: 'volume', align: 'center',title: '单箱体积', hide: true}
        // ,{field: 'threeCode', align: 'center',title: '箱子尺寸', hide: true}
        // ,{field: 'supp', align: 'center',title: '供应商', hide: true}
        // ,{field: 'suppCode', align: 'center',title: '供应商编码', hide: true}
        // ,{field: 'beBatch$', align: 'center',title: '是否批次', hide: true}
        // ,{field: 'deadTime', align: 'center',title: '保质期', hide: true}
        // ,{field: 'deadWarn', align: 'center',title: '预警天数', hide: true}
        // ,{field: 'source$', align: 'center',title: '制购', hide: true}
        // ,{field: 'check$', align: 'center',title: '要求检验', hide: true}
        // ,{field: 'danger$', align: 'center',title: '危险品', hide: true}
    ];
src/main/webapp/static/js/order/order.js
@@ -122,12 +122,13 @@
                        cellMinWidth: 100,
                        cols: [[
                            {type: 'numbers'},
                            {field: 'matnr', title: '商品编码', width: 160},
                            {field: 'maktx', title: '商品名称', width: 160},
                            {field: 'batch', title: '批号'},
                            {field: 'matnr', title: '物料编码', width: 160},
                            {field: 'maktx', title: '物料名称', width: 160},
                            {field: 'batch', title: '生产批号'},
                            {field: 'anfme', title: '数量'},
                            {field: 'workQty', title: '作业数量'},
                            {field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                            {field: 'qty', title: '辅数量'},
                            {field: 'qrCode', title: '条形码'},
                            //{field: 'qty', title: '完成数量', style: 'font-weight: bold'},
                            // {field: 'unit', title: '单位'},
                            // {
                            //     field: 'createTime$', title: '创建时间', sort: true, templet: function (d) {
@@ -136,7 +137,7 @@
                            // },
                            // {field: 'inQty', title: '已入库量'},
                            // {field: 'color', title: '颜色'},
                            {field: 'specs', title: '规格'}
                            {field: 'specs', title: '规格/型号'}
                        ]],
                        request: {
                            pageName: 'curr',
@@ -234,13 +235,14 @@
                    cellMinWidth: 100,
                    cols: [[
                        {type: 'numbers', title: '#'},
                        {field: 'matnr', title: '商品编码', width: 160},
                        {field: 'maktx', title: '商品名称', width: 200},
                        {field: 'batch', title: '批号', edit: true},
                        {field: 'specs', title: '规格'},
                        {field: 'anfme', title: '数量(修改)', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        {field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        {field: 'matnr', title: '物料编码', width: 160},
                        {field: 'maktx', title: '物料名称', width: 200},
                        {field: 'batch', title: '生产批号', edit: true},
                        {field: 'specs', title: '规格/型号'},
                        {field: 'anfme', title: '数量', style: 'color: blue;font-weight: bold', edit: true, minWidth: 110, width: 110},
                        //{field: 'workQty', title: '作业数量',  minWidth: 100, width: 100},
                        // {field: 'unit', title: '单位', width: 80},
                        {field: 'qty', title: '辅数量' , edit: true},
                        {field: 'memo', title: '备注' , edit: true},
                        {align: 'center', title: '操作', toolbar: '#formSSXMTableBar', minWidth: 80, width: 80, fixed: 'right'}
                    ]],
src/main/webapp/static/js/order/out.js
@@ -32,10 +32,10 @@
            {type: 'checkbox'}
            ,{type: 'numbers', title: '#'}
            ,{field: 'orderNo', align: 'center',title: '单据编号', templet: '#orderNoTpl', width: 160}
            ,{field: 'matnr', align: 'center',title: '商品编码', width: 160}
            ,{field: 'maktx', align: 'center',title: '商品名称', width: 200}
            ,{field: 'batch', align: 'center',title: '序列码'}
            ,{field: 'specs', align: 'center',title: '规格'}
            ,{field: 'matnr', align: 'center',title: '物料编码', width: 160}
            ,{field: 'maktx', align: 'center',title: '物料名称', width: 200}
            ,{field: 'batch', align: 'center',title: '生产批号'}
            ,{field: 'specs', align: 'center',title: '规格/型号'}
            // ,{field: 'anfme', align: 'center',title: '数量'}
            // ,{field: 'qty', align: 'center',title: '作业数量', style: 'font-weight: bold'}
            ,{field: 'enableQty', align: 'center',title: '待出数量', style: 'font-weight: bold'}
src/main/webapp/views/index.html
@@ -2,7 +2,7 @@
<html lang="en">
<head>
  <meta charset="utf-8">
  <title>中扬 - 自动化立体仓库 - AS / RS</title>
  <title>蓝科途 - 自动化立体仓库 - AS / RS</title>
  <meta name="renderer" content="webkit">
  <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
src/main/webapp/views/login.html
@@ -3,7 +3,7 @@
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title>中扬 │ login of zoneyung wms</title>
    <title>蓝科途 │ login of Luckt wms</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,minimum-scale=1">
    <meta name="description" content="study of Instancing with three.js">
    <meta name="keywords" content="undefined, Yoichi Kobayashi, WebGL, three.js">
src/main/webapp/views/order/out.html
@@ -95,13 +95,13 @@
                    <form class="layui-form toolbar">
                        <div class="layui-form-item">
                            <div class="layui-inline">
                                <label class="layui-form-label">商品编码:</label>
                                <label class="layui-form-label">物料编码:</label>
                                <div class="layui-input-inline">
                                    <input name="matnr" class="layui-input" placeholder="商品编码"/>
                                </div>
                            </div>
                            <div class="layui-inline">
                                <label class="layui-form-label">商品名称:</label>
                                <label class="layui-form-label">物料名称:</label>
                                <div class="layui-input-inline">
                                    <input name="maktx" class="layui-input" placeholder="商品名称"/>
                                </div>