自动化立体仓库 - WMS系统
dubin
1 天以前 2a9f6d72baa207bc91c98d0a5cd2235be9816691
对接接口开发
11个文件已添加
14个文件已修改
1088 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/OpenController.java 117 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/Order.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenInventoryParam.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderParam.java 145 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenSummaryParam.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/TokenParam.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/OpenInventoryVo.java 83 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/OpenSummaryVo.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/TokenVo.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/LocDetlService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 151 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/InventoryAdjustmentReportHandler.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/MesOrderSyncHandler.java 100 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/InventoryAdjustmentParam.java 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/common/model/MesReportParam.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/LocDetlMapper.xml 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderDetlMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/mapper/OrderMapper.xml 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/OpenController.java
@@ -9,6 +9,9 @@
import com.core.exception.CoolException;
import com.zy.asrs.entity.LocMast;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenInventoryVo;
import com.zy.asrs.entity.result.OpenSummaryVo;
import com.zy.asrs.entity.result.TokenVo;
import com.zy.asrs.service.LocDetlService;
import com.zy.asrs.service.LocMastService;
import com.zy.asrs.service.OpenService;
@@ -292,4 +295,118 @@
//        System.out.println(JSON.toJSONString(param1));
//    }
    /*========================================new Agreement==============================================================*/
    /**
     * 获取token
     * @param param
     * @param request
     * @return
     */
    @PostMapping("/getToken")
    public synchronized R getToken(@RequestBody(required = true) TokenParam param,
                                   HttpServletRequest request){
        authNew(param, param, request);
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        TokenVo tokenVo = new TokenVo();
        String token = Cools.enToken(System.currentTimeMillis() + param.getAppId(), param.getAppSecret());
        tokenVo.setToken(token);
        tokenVo.setValidTime(30);
        return R.ok().add(tokenVo);
    }
    private void authNew(TokenParam param, Object obj, HttpServletRequest request) {
        log.info("{}接口被访问;appSecret:{};请求数据:{}", "open/sensorType/list/auth/v1", param.getAppSecret(), JSON.toJSONString(obj));
        request.setAttribute("cache", obj);
        if (!auth) {
            return;
        }
        if (Cools.isEmpty(param.getAppId()) || Cools.isEmpty(param.getAppSecret())) {
            throw new CoolException("认证失败,请确认appId和appSecret无误!");
        }
        if (!param.getAppId().contains("HLWMS")){
            throw new CoolException("认证失败,请确认appId无误!");
        }
        if (!APP_KEY_LIST.contains(param.getAppSecret())) {
            throw new CoolException("认证失败,请确认appSecret无误!");
        }
    }
    /**
     * 物料基础信息同步
     * @param appkey
     * @param param
     * @param request
     * @return
     */
    @PostMapping("/erp/mat/sync")
    public synchronized R syncMatInfoV2(@RequestHeader(required = false) String appkey,
                                        @RequestBody(required = false) List<MatSyncParam.MatParam> param,
                                        HttpServletRequest request){
        if (Cools.isEmpty(param)){
            return R.parse(BaseRes.PARAM);
        }
        MatSyncParam matSyncParam = new MatSyncParam();
        List<MatSyncParam.MatParam> objects = new ArrayList<>();
        objects = param;
        matSyncParam.matDetails = objects;
        openService.syncMat(matSyncParam);
        return R.ok();
    }
    /**
     * 入/出库通知单下发
     * @param param
     * @return
     */
    @PostMapping("/erp/order/add")
    public synchronized R addOrder(@RequestBody OpenOrderParam param){
        if (Cools.isEmpty(param)) {
            return R.parse(BaseRes.PARAM);
        }
        if (Cools.isEmpty(param.getOrderNo())){
            return R.error("单据编号[orderNo]不能为空");
        }
        if (Cools.isEmpty(param.getOrderType())){
            return R.error("单据类型[orderType]不能为空");
        }
        if (Cools.isEmpty(param.getWkType())){
            return R.error("业务类型[wkType]不能为空");
        }
        if (Cools.isEmpty(param.getOrderItems())){
            return R.error("订单明细[orderItems]不能为空");
        }
        openService.orderCreate(param);
        return R.ok();
    }
    /**
     * 库存明细查询
     * @param param
     * @return
     */
    @PostMapping("/erp/inventory/details")
    public synchronized R queryInventoryDetails(@RequestBody OpenInventoryParam param){
        if (Cools.isEmpty(param)){
            return R.parse(BaseRes.PARAM);
        }
        OpenInventoryVo openInventoryVo = openService.queryInventoryDetails(param);
        return R.ok(openInventoryVo);
    }
    /**
     * 库存汇总查询
     * @param param
     * @return
     */
    @PostMapping("/erp/inventory/summary")
    public synchronized R queryInventorySummary(@RequestBody OpenSummaryParam param){
        if (Cools.isEmpty(param)){
            return R.parse(BaseRes.PARAM);
        }
        OpenSummaryVo openSummaryVo = openService.queryInventorySummary(param);
        return R.ok(openSummaryVo);
    }
}
src/main/java/com/zy/asrs/entity/Order.java
@@ -262,6 +262,13 @@
    private String memo;
    /**
     * 操作类型
     */
    @ApiModelProperty(value= "操作类型")
    @TableField("operate_type")
    private Integer operateType;
    /**
     * 状态 1: 进行中  0: 初始  2:已完成
     */
    @ApiModelProperty(value= "状态  2:已完成 1: 进行中 0: 初始  ")
@@ -285,6 +292,44 @@
    public Order() {}
    public Order(String uuid,String orderNo,String orderTime,Long docType,Long itemId,String itemName,Long allotItemId,String defNumber,String number,String cstmr,String cstmrName,String tel,String operMemb,Double totalFee,Double discount,Double discountFee,Double otherFee,Double actFee,Integer payType,String salesman,Integer accountDay,Integer postFeeType,Double postFee,Date payTime,Date sendTime,String shipName,String shipCode,Long settle,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo,Integer operateType) {
        this.uuid = uuid;
        this.orderNo = orderNo;
        this.orderTime = orderTime;
        this.docType = docType;
        this.itemId = itemId;
        this.itemName = itemName;
        this.allotItemId = allotItemId;
        this.defNumber = defNumber;
        this.number = number;
        this.cstmr = cstmr;
        this.cstmrName = cstmrName;
        this.tel = tel;
        this.operMemb = operMemb;
        this.totalFee = totalFee;
        this.discount = discount;
        this.discountFee = discountFee;
        this.otherFee = otherFee;
        this.actFee = actFee;
        this.payType = payType;
        this.salesman = salesman;
        this.accountDay = accountDay;
        this.postFeeType = postFeeType;
        this.postFee = postFee;
        this.payTime = payTime;
        this.sendTime = sendTime;
        this.shipName = shipName;
        this.shipCode = shipCode;
        this.settle = settle;
        this.status = status;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
        this.operateType = operateType;
    }
    public Order(String uuid,String orderNo,String orderTime,Long docType,Long itemId,String itemName,Long allotItemId,String defNumber,String number,String cstmr,String cstmrName,String tel,String operMemb,Double totalFee,Double discount,Double discountFee,Double otherFee,Double actFee,Integer payType,String salesman,Integer accountDay,Integer postFeeType,Double postFee,Date payTime,Date sendTime,String shipName,String shipCode,Long settle,Integer status,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.uuid = uuid;
        this.orderNo = orderNo;
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -341,6 +341,48 @@
    @TableField("det_id")
    private Integer detId;
    /**
     * 备用1
     */
    @ApiModelProperty(value= "行内码 唯一标识")
    @TableField("standby1")
    private String standby1;
    /**
     * 备用2
     */
    @ApiModelProperty(value= "托盘码")
    @TableField("standby2")
    private String standby2;
    /**
     * 备用3
     */
    @ApiModelProperty(value= "计划跟踪号")
    @TableField("standby3")
    private String standby3;
    /**
     * 备用1
     */
    @ApiModelProperty(value= "建议入库仓库")
    @TableField("box_type1")
    private String boxType1;
    /**
     * 备用2
     */
    @ApiModelProperty(value= "建议出库仓库")
    @TableField("box_type2")
    private String boxType2;
    /**
     * 备用3
     */
    @ApiModelProperty(value= "备用3")
    @TableField("box_type3")
    private String boxType3 = "1";
    public OrderDetl() {
    }
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java
@@ -1,5 +1,6 @@
package com.zy.asrs.entity.param;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import java.util.List;
@@ -23,16 +24,19 @@
        /**
         * 商品编号
         */
        @JsonProperty("matNr")
        private String matnr;
        /**
         * 商品名称
         */
        @JsonProperty("makTx")
        private String maktx;
        /**
         * 商品分类
         */
        @JsonProperty("groupId")
        private String groupCode;
        /**
@@ -48,6 +52,7 @@
        /**
         * 规格
         */
        @JsonProperty("spec")
        private String specs;
        /**
@@ -176,8 +181,9 @@
        private Integer danger;
        /**
         * 状态 1: 正常  0: 禁用
         * 状态 1: 新增(默认)  2: 修改   3: 禁用   4: 启用
         */
        @JsonProperty("operateType")
        private Integer status;
        /**
@@ -193,6 +199,7 @@
        /**
         * 备注
         */
        @JsonProperty("describle")
        private String memo;
    }
src/main/java/com/zy/asrs/entity/param/OpenInventoryParam.java
New file
@@ -0,0 +1,42 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class OpenInventoryParam {
    /**
     * 仓库编码
     */
    private String wareHouseId;
    /**
     * 库位编码
     */
    private String locId;
    /**
     * 物料编码
     */
    private String matNr;
    /**
     * 订单号/工单号/mes工单号
     */
    private String orderNo;
    /**
     * 计划跟踪号
     */
    private String planNo;
    /**
     * 批次号
     */
    private String batch;
    /**
     * 物料组
     */
    private String matGroup;
}
src/main/java/com/zy/asrs/entity/param/OpenOrderParam.java
New file
@@ -0,0 +1,145 @@
package com.zy.asrs.entity.param;
import com.core.common.Cools;
import lombok.AllArgsConstructor;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class OpenOrderParam {
    /**
     * 订单编码
     */
    private String orderNo;
    /**
     * 单据内码 唯一标识 若没有可以补充订单编码
     */
    private String orderInternalCode;
    /**
     * 订单类型 1 出库单 2 入库单 3 调拨单
     */
    private long orderType;
    /**
     * 业务类型 枚举类型 采购入库单 销售退货单 销售出库单 调拨申请单
     */
    private String wkType;
    /**
     * 业务日期 时间戳 精确到秒
     */
    private Date businessTime;
    /**
     * 创建日期
     */
    private Date createTime;
    /**
     * 订单明细
     */
    private List<OrderItem> orderItems;
    /**
     * 入/出库接驳站点 (出库时将物料出库后运输至该站点 入库时从该站点将物料运回库中) 需要则补充 否则不用补充
     */
    private String stationId;
    /**
     * 操作类型 1 新增(默认) 2 修改 3 取消
     */
    private Integer operateType;
    @Data
    @AllArgsConstructor
    public static class OrderItem {
        /**
         * 行内码 唯一标识
         */
        private String lineId;
        /**
         * 物料编码
         */
        private String matNr;
        /**
         * 物料名称
         */
        private String makTx;
        /**
         * 数量 小数点默认4位
         */
        private Double anfme;
        /**
         * 规格
         */
        private String spec;
        /**
         * 型号
         */
        private String model;
        /**
         * 单位
         */
        private String unit;
        /**
         * 批次号
         */
        private String batch;
        /**
         * 托盘码 若订单类型为出库单时 则指定该托盘出库
         */
        private String palletId;
        /**
         * 计划跟踪号
         */
        private String planNo;
        /**
         * 建议入库仓库
         */
        private String targetWareHouseId;
        /**
         * 建议出库仓库
         */
        private String sourceWareHouseId;
        public static boolean hasLineNumber(List<OrderItem> list, OrderItem orderItem) {
            for (OrderItem item : list) {
                if (item.getLineId().equals(orderItem.getLineId()) && item.getMatNr().equals(orderItem.getMatNr()) && Cools.eq(item.getModel(),orderItem.getModel()) &&
                        Cools.eq(item.getBatch(),orderItem.getBatch()) && Cools.eq(item.getPalletId(),orderItem.getPalletId()) && Cools.eq(item.getPlanNo(),orderItem.getPlanNo()) &&
                        Cools.eq(item.getSourceWareHouseId(),orderItem.getSourceWareHouseId()) && Cools.eq(item.getSpec(),orderItem.getSpec()) && Cools.eq(item.getUnit(),orderItem.getUnit()) &&
                        Cools.eq(item.getTargetWareHouseId(),orderItem.getTargetWareHouseId())){
                    return true;
                }
            }
            return false;
        }
        public static OrderItem findLineNumber(List<OrderItem> list, String lineId, String matNr, String makTx, Double anfme, String spec, String model, String unit, String batch, String palletId, String planNo, String targetWarehouseId, String sourceWarehouseId) {
            for (OrderItem orderItem : list) {
                if (orderItem.getLineId().equals(lineId) && orderItem.getMatNr().equals(matNr) && Cools.eq(orderItem.getModel(),model) &&
                        Cools.eq(orderItem.getBatch(),batch) && Cools.eq(orderItem.getPalletId(),palletId) && Cools.eq(orderItem.getPlanNo(),planNo) &&
                        Cools.eq(orderItem.getSourceWareHouseId(),sourceWarehouseId) && Cools.eq(orderItem.getSpec(),spec) && Cools.eq(orderItem.getUnit(),unit) &&
                        Cools.eq(orderItem.getTargetWareHouseId(),targetWarehouseId)){
                    return orderItem;
                }
            }
            return null;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/OpenSummaryParam.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class OpenSummaryParam {
    /**
     * 仓库编码
     */
    private String wareHouseId;
    /**
     * 物料编码 多个以英文 , 分隔
     */
    private String matNr;
}
src/main/java/com/zy/asrs/entity/param/TokenParam.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class TokenParam {
    /**
     * 应用编码 wms线下分配
     */
    private String appId;
    /**
     * 应用密钥 wms线下分配
     */
    private String appSecret;
}
src/main/java/com/zy/asrs/entity/result/OpenInventoryVo.java
New file
@@ -0,0 +1,83 @@
package com.zy.asrs.entity.result;
import com.zy.asrs.entity.LocDetl;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OpenInventoryVo {
    private List<LocDetl> inventoryList;
    private class Inventory{
        /**
         * 库位编码
         */
        private String locId;
        /**
         * 仓库编码
         */
        private String wareHouseId;
        /**
         * 仓库名称
         */
        private String wareHouseName;
        /**
         * 托盘码 如果一个托盘上备了2个工单号 则分为两条
         */
        private String palletId;
        /**
         * 物料编码
         */
        private String matNr;
        /**
         * 物料名称
         */
        private String makTx;
        /**
         * 数量 若有小数点默认保留2位
         */
        private Double anfme;
        /**
         * 单位
         */
        private String unit;
        /**
         * 库存状态 1,正常  2.冻结
         */
        private Integer status;
        /**
         * 绑定的订单类型 1 出库单 2 入库单 3 备料单 4 调拨单 未绑定时为空
         */
        private Integer orderType;
        /**
         * 订单号、备料单号 未绑定时为空
         */
        private String orderNo;
        /**
         * 计划跟踪号 未绑定时为空
         */
        private String planNo;
        /**
         * 批次号
         */
        private String batch;
    }
}
src/main/java/com/zy/asrs/entity/result/OpenSummaryVo.java
New file
@@ -0,0 +1,44 @@
package com.zy.asrs.entity.result;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class OpenSummaryVo {
    private List<OpenSummary> openSummaryList;
    @Data
    public static class OpenSummary {
        /**
         * 仓库编码
         */
        private String wareHouseId;
        /**
         * 仓库名称
         */
        private String wareHouseName;
        /**
         * 物料编码
         */
        private String matNr;
        /**
         * 物料名称
         */
        private String matTx;
        /**
         * 数量 若有小数点默认保留2位
         */
        private Double anfme;
    }
}
src/main/java/com/zy/asrs/entity/result/TokenVo.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.entity.result;
import lombok.Data;
@Data
public class TokenVo {
    /**
     * token值
     */
    private String token;
    /**
     * 有效时间 单位:分钟
     */
    private Integer validTime;
}
src/main/java/com/zy/asrs/mapper/LocDetlMapper.java
@@ -90,4 +90,8 @@
    List<StockStatisDTO> asrsAndErpList(Map<String, Object> condition);
    long asrsAndErpCount(Map<String, Object> condition);
    List<LocDetl> queryInventoryDetails(String locId, String matNr, String orderNo, String planNo, String batch);
    Double queryInventorySummary(String wareHouseId, String s);
}
src/main/java/com/zy/asrs/service/LocDetlService.java
@@ -91,4 +91,8 @@
    List<LocDetl> selectLocDetlUnilateralMoveShuttle(String matnr, String batch, String grade, Integer crnNo);
    Map<String, Double> getAnfmeByLocNos(List<String> locNos);
    List<LocDetl> queryInventoryDetails(String locId, String matNr, String orderNo, String planNo, String batch);
    Double queryInventorySummary(java.lang.String wareHouseId, java.lang.String s);
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -2,7 +2,9 @@
import com.core.common.R;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenInventoryVo;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.OpenSummaryVo;
import com.zy.asrs.entity.result.StockVo;
import java.util.List;
@@ -59,4 +61,10 @@
     * @param param
     */
    void syncMat(MatSyncParam param);
    void orderCreate(OpenOrderParam param);
    OpenInventoryVo queryInventoryDetails(OpenInventoryParam param);
    OpenSummaryVo queryInventorySummary(OpenSummaryParam param);
}
src/main/java/com/zy/asrs/service/impl/LocDetlServiceImpl.java
@@ -245,6 +245,16 @@
    }
    @Override
    public List<LocDetl> queryInventoryDetails(String locId, String matNr, String orderNo, String planNo, String batch) {
        return this.baseMapper.queryInventoryDetails(locId, matNr, orderNo, planNo, batch);
    }
    @Override
    public Double queryInventorySummary(String wareHouseId, String s) {
        return this.baseMapper.queryInventorySummary(wareHouseId, s);
    }
    @Override
    public LocDetl selectItem(String locNo, WrkDetl wrkDetl) {
        List<LocDetl> locDetls = this.baseMapper.selectItem3(locNo, wrkDetl.getMatnr());
        if (locDetls != null) {
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,14 +1,13 @@
package com.zy.asrs.service.impl;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.common.BaseRes;
import com.core.common.Cools;
import com.core.common.R;
import com.core.common.SnowflakeIdWorker;
import com.core.common.*;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.OpenInventoryVo;
import com.zy.asrs.entity.result.OpenOrderCompeteResult;
import com.zy.asrs.entity.result.OpenSummaryVo;
import com.zy.asrs.entity.result.StockVo;
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
@@ -24,6 +23,7 @@
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.stream.Collectors;
@@ -787,7 +787,7 @@
                } else {
                    tagId = tagService.getTop().getId();
                }
                mat.sync(param);
                mat.sync(matParam);
//            mat.setMatnr(param.getMatnr());
//            mat.setMaktx(param.getMaktx());
//            mat.setSpecs(param.getSpecs());
@@ -803,7 +803,7 @@
                    log.info("同步新物料[商品编号:{}]", mat.getMatnr());
                }
            } else {
                mat.sync(param);
                mat.sync(matParam);
                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                }
@@ -812,4 +812,143 @@
    }
    @Override
    public void orderCreate(OpenOrderParam param) {
        Order order = orderService.selectByNo(param.getOrderNo());
        if (!Cools.isEmpty(order)){
            throw new CoolException(param.getOrderNo() + "订单已存在,请勿重复创建");
        }
        Date now = new Date();
        order = new Order(
                String.valueOf(snowflakeIdWorker.nextId()), // 编号[非空]
                param.getOrderNo(), // 订单编码[非空]
                DateUtils.convert(now), //单据日期
                param.getOrderType(), //订单类型
                null, //项目编号
                null, //项目名称 客户PO号
                null, //调拨项目编号
                null, //初始票据号
                null, //票据号
                null, //客户编号
                null, //客户
                param.getOrderInternalCode(), //单据内码
                param.getWkType(), //业务类型
                null, //合计金额
                null, //优惠率
                null, //优惠金额
                null, //销售或采购费用合计
                null, //实付金额
                null, //付款类型 1: 现金  2: 记账
                null, //业务员
                null, //结算天数
                null, //邮费支付类型 1: 在线支付  2: 货到付款
                null, //邮费
                param.getBusinessTime(), //业务日期
                param.getCreateTime(), //创建日期
                null, //物流名称
                null, //物流单号
                1L, //订单状态
                1, //状态 1: 正常  0: 禁用
                9527L, //添加人员
                now, //添加时间
                9527L, //修改人员
                now, //修改时间
                param.getStationId(), //入/出库接驳站点
                param.getOperateType() // 操作类型 1.新增 2.修改 3.取消
        );
        if (!orderService.insert(order)){
            throw new CoolException("保存订单主档失败,请联系管理员!"+order);
        }
        List<OpenOrderParam.OrderItem> list = new ArrayList<>();
        List<OpenOrderParam.OrderItem> orderItems = param.getOrderItems();
        for (OpenOrderParam.OrderItem item : orderItems){
            OpenOrderParam.OrderItem orderItem = new OpenOrderParam.OrderItem(
                    item.getLineId(),
                    item.getMatNr(),
                    item.getMakTx(),
                    item.getAnfme(),
                    item.getSpec(),
                    item.getModel(),
                    item.getUnit(),
                    item.getBatch(),
                    item.getPalletId(),
                    item.getPlanNo(),
                    item.getTargetWareHouseId(),
                    item.getSourceWareHouseId()
            );
            if (OpenOrderParam.OrderItem.hasLineNumber(list,orderItem)){
                OpenOrderParam.OrderItem oi = OpenOrderParam.OrderItem.findLineNumber(
                        list,
                        item.getLineId(),
                        item.getMatNr(),
                        item.getMakTx(),
                        item.getAnfme(),
                        item.getSpec(),
                        item.getModel(),
                        item.getUnit(),
                        item.getBatch(),
                        item.getPalletId(),
                        item.getPlanNo(),
                        item.getTargetWareHouseId(),
                        item.getSourceWareHouseId()
                );
                assert oi != null;
                oi.setAnfme(oi.getAnfme() + orderItem.getAnfme());
            } else {
                list.add(orderItem);
            }
        }
        for (OpenOrderParam.OrderItem orderItem : list) {
            Mat mat = matService.selectByMatnr(orderItem.getMatNr());
            if (Cools.isEmpty(mat)){
                throw new CoolException("订单明细中的商品编号不存在:" + orderItem.getMatNr());
            }
            OrderDetl orderDetl = new OrderDetl();
            orderDetl.sync(mat);
            orderDetl.setOrderNo(order.getOrderNo()); // 订单编号
            orderDetl.setOrderId(order.getId()); // 订单内码
            orderDetl.setStandby1(order.getTel()); // 行内码 唯一标识
            orderDetl.setAnfme(orderItem.getAnfme()); // 订单数量
            orderDetl.setBarcode(orderItem.getBatch()); // 批次
            orderDetl.setStandby2(orderItem.getPalletId()); // 托盘码
            orderDetl.setStandby3(orderItem.getPlanNo()); // 计划跟踪号
            orderDetl.setBoxType1(orderItem.getSourceWareHouseId()); // 建议入库仓库
            orderDetl.setBoxType2(orderItem.getTargetWareHouseId()); // 建议出库仓库
            orderDetl.setCreateBy(9527L);
            orderDetl.setCreateTime(now);
            orderDetl.setUpdateBy(9527L);
            orderDetl.setUpdateTime(now);
            orderDetl.setStatus(1);
            orderDetl.setQty(0.0D);
    //        orderDetl.setPakinPakoutStatus(1);
            if (!orderDetlService.insert(orderDetl)) {
                throw new CoolException("保存订单明细失败,请联系管理员!"+orderDetl);
            }
        }
    }
    @Override
    public OpenInventoryVo queryInventoryDetails(OpenInventoryParam param) {
        List<LocDetl> locDetlList = locDetlService.queryInventoryDetails(param.getLocId(), param.getMatNr(), param.getOrderNo(), param.getPlanNo(), param.getBatch());
        if (Cools.isEmpty(locDetlList)){
            return new OpenInventoryVo();
        }
        return new OpenInventoryVo(locDetlList);
    }
    @Override
    public OpenSummaryVo queryInventorySummary(OpenSummaryParam param) {
        String matNr = param.getMatNr();
        String[] split = matNr.split(",");
        List<OpenSummaryVo.OpenSummary> openSummaryList = new ArrayList<>();
        for (String s : split) {
            OpenSummaryVo.OpenSummary openSummary = new OpenSummaryVo.OpenSummary();
            Double summary =  locDetlService.queryInventorySummary(param.getWareHouseId(), s);
            openSummary.setWareHouseId(param.getWareHouseId()); // 仓库编码
            openSummary.setMatNr(s); // 物料编码
            openSummary.setAnfme(summary); // 数量
            openSummaryList.add(openSummary);
        }
        return new OpenSummaryVo(openSummaryList);
    }
}
src/main/java/com/zy/asrs/task/OrderSyncScheduler.java
@@ -38,19 +38,19 @@
        }
    }
    //@Scheduled(cron = "0/5 * * * * ? ")
    @Scheduled(cron = "0/5 * * * * ? ")
    @Async("orderThreadPool")
    public void completeAndReport(){
//        String erpReport = Parameter.get().getErpReport();
//        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
//            List<Order> orders = orderService.selectComplete();
//            for (Order order : orders) {
//                ReturnT<String> result = orderSyncHandler.start(order);
//                if (!result.isSuccess()) {
//                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
//                }
//            }
//        }
        String erpReport = Parameter.get().getErpReport();
        if (!Cools.isEmpty(erpReport) && erpReport.equals("true")) {
            List<Order> orders = orderService.selectComplete();
            for (Order order : orders) {
                ReturnT<String> result = orderSyncHandler.start(order);
                if (!result.isSuccess()) {
                    log.error("单据[orderNo={}]上报erp失败", order.getOrderNo());
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/InventoryAdjustmentReportHandler.java
New file
@@ -0,0 +1,78 @@
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.exception.CoolException;
import com.zy.asrs.entity.WrkDetlLog;
import com.zy.asrs.entity.WrkMast;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.service.WrkDetlLogService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.model.InventoryAdjustmentParam;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Slf4j
@Service
public class InventoryAdjustmentReportHandler extends AbstractHandler<String> {
    @Autowired
    private WrkDetlLogService wrkDetlLogService;
    @Autowired
    private ApiLogService apiLogService;
    @Transactional
    public ReturnT<String> report(WrkMast wrkMast){
        WrkDetlLog wrkDetlLog = wrkDetlLogService.selectOne(new EntityWrapper<WrkDetlLog>().eq("wrk_no", wrkMast.getWrkNo()).eq("io_time", wrkMast.getIoTime()));
        InventoryAdjustmentParam param = new InventoryAdjustmentParam();
        param.setChangeType(wrkMast.getIoType()); // 调整类型
        param.setWareHouseId("HLWMS"); // 仓库编码
        param.setSourceLocId(wrkMast.getIoType() != 1 ? wrkMast.getSourceLocNo() : ""); // 源库位号
        param.setTargetLocId(wrkMast.getIoType() != 101 ? wrkMast.getLocNo() : ""); // 目标库位号 移库时有
        param.setMatNr(wrkDetlLog.getMatnr()); // 物料编码
        param.setQty(wrkDetlLog.getAnfme().toString()); // 调整数量
        param.setPalletId(wrkMast.getBarcode()); // 托盘号
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri("http://localhost:8080/api")
                    .setPath("/inventory/adjustment")
                    .setJson(JSON.toJSONString(param))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("code") == 200){
                success = true;
            }else {
                log.error("请求接口失败!!!url:{};request:{};response:{}", "http://localhost:8080/api"+"/inventory/adjustment", JSON.toJSONString(param), response);
                throw new CoolException("库存调整上报mes系统失败");
            }
        }catch (Exception e){
            log.error("fail",e);
            return FAIL.setMsg(e.getMessage());
        }finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "库存调整主动上报",
                        "http://localhost:8080/api/inventory/adjustment",
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(param),
                        response,
                        success
                );
            }catch (Exception e) {
                log.error("",e);
            }
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/MesOrderSyncHandler.java
New file
@@ -0,0 +1,100 @@
package com.zy.asrs.task.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.core.exception.CoolException;
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.common.constant.MesConstant;
import com.zy.common.model.MesReportParam;
import com.zy.common.utils.HttpHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Slf4j
@Service
public class MesOrderSyncHandler extends AbstractHandler<String> {
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private ApiLogService apiLogService;
    @Transactional
    public ReturnT<String> start(Order order) {
        DocType docType = docTypeService.selectById(order.getDocType());
        if (null == docType) {
            return SUCCESS;
        }
        List<OrderDetl> orderDetls = orderDetlService.selectByOrderId(order.getId());
        for (OrderDetl orderDetl : orderDetls) {
            MesReportParam mesReportParam = new MesReportParam();
            mesReportParam.setOrderNo(order.getOrderNo()); // 订单编码
            mesReportParam.setPlanNo(orderDetl.getStandby3()); // 计划跟踪号
            mesReportParam.setLineId(orderDetl.getStandby1()); // 行内码
            mesReportParam.setWarehouseId("HL"); // 仓库编码
            mesReportParam.setLocId(""); // 库位号
            mesReportParam.setMatNr(orderDetl.getMatnr()); // 物料编码
            mesReportParam.setQty(orderDetl.getQty().toString()); // 本次出/入数量
            mesReportParam.setPalletId(""); // 托盘号
            mesReportParam.setBatch(orderDetl.getBatch()); // 批次
            String response = "";
            boolean success = false;
            try {
                response = new HttpHandler.Builder()
                        .setUri(MesConstant.URL)
                        .setPath(MesConstant.PAKIN_URL)
                        .setJson(JSON.toJSONString(mesReportParam))
                        .build()
                        .doPost();
                JSONObject jsonObject = JSON.parseObject(response);
                if (jsonObject.getInteger("code") == 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(mesReportParam), response);
                    throw new CoolException("上报mes系统失败");
                }
            }catch (Exception e) {
                log.error("fail", e);
                return FAIL.setMsg(e.getMessage());
            }finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "入/出库结果上报",
                            MesConstant.URL + MesConstant.PAKIN_URL,
                            null,
                            "127.0.0.1",
                            JSON.toJSONString(mesReportParam),
                            response,
                            success
                    );
                } catch (Exception e) { log.error("", e); }
            }
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/handler/OrderSyncHandler.java
@@ -44,6 +44,12 @@
    @Autowired
    private DocTypeService docTypeService;
    /**
     * 入出库结果上报
     * @param order
     * @return
     */
    @Transactional
    public ReturnT<String> start(Order order) {
        DocType docType = docTypeService.selectById(order.getDocType());
src/main/java/com/zy/common/model/InventoryAdjustmentParam.java
New file
@@ -0,0 +1,42 @@
package com.zy.common.model;
import lombok.Data;
@Data
public class InventoryAdjustmentParam {
    /**
     * 调整类型
     */
    private Integer changeType;
    /**
     * 仓库编码
     */
    private String wareHouseId;
    /**
     * 源库位号
     */
    private String sourceLocId;
    /**
     * 目标库位号 移库时有
     */
    private String targetLocId;
    /**
     * 物料编码
     */
    private String matNr;
    /**
     * 调整数量
     */
    private String qty;
    /**
     * 托盘号
     */
    private String palletId;
}
src/main/java/com/zy/common/model/MesReportParam.java
New file
@@ -0,0 +1,52 @@
package com.zy.common.model;
import lombok.Data;
@Data
public class MesReportParam {
    /**
     * 订单编码
     */
    private String orderNo;
    /**
     * 计划跟踪号
     */
    private String planNo;
    /**
     * 行内码
     */
    private String lineId;
    /**
     * 仓库编码
     */
    private String warehouseId;
    /**
     * 库位号
     */
    private String locId;
    /**
     * 物料编码
     */
    private String matNr;
    /**
     * 本次出/入库数量
     */
    private String qty;
    /**
     * 托盘号
     */
    private String palletId;
    /**
     * 批次
     */
    private String batch;
}
src/main/resources/mapper/LocDetlMapper.xml
@@ -640,4 +640,30 @@
            AND outOrderNo like '%' + #{outOrderNo} + '%'
        </if>
    </select>
    <select id="queryInventoryDetails" parameterType="map" resultMap="BaseResultMap">
        SELECT *
        FROM asr_loc_detl
        <where>
            <if test="locId != null and locId != ''">
                AND loc_id = #{locId}
            </if>
            <if test="matNr != null and matNr != ''">
                AND mat_nr = #{matNr}
            </if>
            <if test="orderNo != null and orderNo != ''">
                AND order_no = #{orderNo}
            </if>
            <if test="planNo != null and planNo != ''">
                AND plan_no = #{planNo}
            </if>
            <if test="batch != null and batch != ''">
                AND batch = #{batch}
            </if>
        </where>
    </select>
    <select id="queryInventorySummary" resultType="java.lang.Double">
        SELECT SUM(anfme) FROM asr_loc_detl WHERE matnr = #{s}
    </select>
</mapper>
src/main/resources/mapper/OrderDetlMapper.xml
@@ -59,6 +59,12 @@
        <result column="ware_mame" property="wareName" />
        <result column="packing" property="packing" />
        <result column="det_id" property="detId"/>
        <result column="standby1" property="standby1" />
        <result column="standby2" property="standby2" />
        <result column="standby3" property="standby3" />
        <result column="box_type1" property="boxType1" />
        <result column="box_type2" property="boxType2" />
        <result column="box_type3" property="boxType3" />
    </resultMap>
    <select id="selectItem" resultMap="BaseResultMap">
src/main/resources/mapper/OrderMapper.xml
@@ -40,6 +40,7 @@
        <result column="update_time" property="updateTime" />
        <result column="memo" property="memo" />
        <result column="move_status" property="moveStatus" />
        <result column="operate_type" property="operateType" />
        <result column="temp1" property="temp1" />
        <result column="temp2" property="temp2" />