自动化立体仓库 - WMS系统
zwl
2025-06-27 85ef8fe5827bce822c9e74ab0a6a9340a4bae016
erp对接
3个文件已修改
3个文件已添加
521 ■■■■■ 已修改文件
src/main/java/com/zy/asrs/entity/OrderDetl.java 81 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/result/OrderResult.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/CollectOrdersScheduler.java 193 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/ERPReportScheduler.java 138 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/OrderDetl.java
@@ -77,9 +77,9 @@
    private String maktx;
    /**
     * 序列码
     * 批号
     */
    @ApiModelProperty(value= "序列码")
    @ApiModelProperty(value= "批号")
    private String batch;
    /**
@@ -89,28 +89,59 @@
    private String specs;
    /**
     * 型号
     * 组织编码
     */
    @ApiModelProperty(value= "型号")
    @ApiModelProperty(value= "组织编码")
    private String manu;
    /**
     * 项次
     */
    @ApiModelProperty(value= "项次")
    private String model;
    /**
     * 颜色
     * 任务仓库
     */
    @ApiModelProperty(value= "颜色")
    @ApiModelProperty(value= "任务仓库")
    private String color;
    /**
     * 品牌
     * 任务储位
     */
    @ApiModelProperty(value= "品牌")
    @ApiModelProperty(value= "任务储位")
    private String brand;
    /**
     * 单位
     * 单位编码
     */
    @ApiModelProperty(value= "单位")
    @ApiModelProperty(value= "单位编码")
    private String unit;
    /**
     * 单位名称
     */
    @ApiModelProperty(value= "单位名称")
    private String sku;
    /**
     * 供应商编码
     */
    @ApiModelProperty(value= "供应商编码")
    @TableField("item_num")
    private String itemNum;
    /**
     * 托盘码
     */
    @ApiModelProperty(value= "托盘码")
    private String barcode;
    /**
     * 供应商名称
     */
    @ApiModelProperty(value= "供应商名称")
    private String origin;
    /**
     * 单价
@@ -119,34 +150,11 @@
    private Double price;
    /**
     * sku
     */
    @ApiModelProperty(value= "sku")
    private String sku;
    /**
     * 单位量
     */
    @ApiModelProperty(value= "单位量")
    private Double units;
    /**
     * 条码
     */
    @ApiModelProperty(value= "条码")
    private String barcode;
    /**
     * 产地
     */
    @ApiModelProperty(value= "产地")
    private String origin;
    /**
     * 厂家
     */
    @ApiModelProperty(value= "厂家")
    private String manu;
    /**
     * 生产日期
@@ -154,13 +162,6 @@
    @ApiModelProperty(value= "生产日期")
    @TableField("manu_date")
    private String manuDate;
    /**
     * 品项数
     */
    @ApiModelProperty(value= "品项数")
    @TableField("item_num")
    private String itemNum;
    /**
     * 安全库存量
src/main/java/com/zy/asrs/entity/result/OrderResult.java
New file
@@ -0,0 +1,51 @@
package com.zy.asrs.entity.result;
import lombok.Data;
@Data
public class OrderResult {
    //组织编码
    private String orgNo;
    //单据类别
    private String docType;
    //订单编号
    private String docNo;
    //项次(行号)
    private String docSeqNo;
    //任务仓库
    private String docWarehouseNo;
    //任务储位
    private String docCellNo;
    //任务批次
    private String docLotNo;
    //物料编码
    private String itemNo;
    //品名
    private String itemName;
    //规格
    private String itemSpec;
    //入库数量
    private double applyQty;
    //单位编码
    private String unitNo;
    //单位名称
    private String unitName;
    //供应商编码
    private String supplierNo;
    //供应商名称
    private String supplierName;
}
src/main/java/com/zy/asrs/task/CollectOrdersScheduler.java
New file
@@ -0,0 +1,193 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
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;
import com.core.common.SnowflakeIdWorker;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.OrderResult;
import com.zy.asrs.service.*;
import com.zy.asrs.service.impl.DocTypeServiceImpl;
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.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Service;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
@Service
@Slf4j
public class CollectOrdersScheduler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    private String URL;
    @Value("${erp.address.inaddress}")
    private String inaddress;
    @Autowired
    private OrderService orderService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Autowired
    private MatService matService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private ApiLogService apiLogService;
    /**
     * 轮询获取入库订单
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    private void execute() {
        // 获取当前日期时间
        LocalDateTime now = LocalDateTime.now();
        // 减去一个月
        LocalDateTime oneMonthAgo = now.minusMonths(1);
        // 定义日期时间格式(HH表示24小时制)
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
        // 格式化日期时间
        String formattedDateTime = oneMonthAgo.format(formatter);
        HashMap<String, Object> map = new HashMap<>();
        map.put("orgNo", 0);//组织编号
//        map.put("docNo",0);
        map.put("startTime", formattedDateTime);//开始时间
        String format = now.format(formatter);
        map.put("endTime", format);//结束时间
        //查询订单
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(URL)
                    .setPath(inaddress)
                    .setJson(JSON.toJSONString(map))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if (jsonObject.getInteger("status") == 200) {
                JSONArray response1 = JSON.parseArray(jsonObject.get("response").toString());
                for (int j = 0; j < response1.size(); j++) {
                    OrderResult orderResult = response1.getObject(0, OrderResult.class);
                    Order order = orderService.selectByNo(orderResult.getDocNo());//单据编号
                    if (Cools.isEmpty(order)) {
                        Date now1 = new Date();
                        DocType docType = docTypeService.selectOne(new EntityWrapper<DocType>().eq("memo",orderResult.getDocType()));//单据编号
                        // 单据主档
                        order = new Order(
                                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                                orderResult.getDocNo(),    // 订单编号
                                DateUtils.convert(now1),    // 单据日期
                                docType.getDocId(),    // 单据类型
                                null,    // 项目编号
                                null,    //
                                null,    // 调拨项目编号
                                null,    // 初始票据号
                                null,    // 票据号
                                null,    // 客户编号
                                null,    // 客户
                                null,    // 联系方式
                                null,    // 操作人员
                                null,    // 合计金额
                                null,    // 优惠率
                                null,    // 优惠金额
                                null,    // 销售或采购费用合计
                                null,    // 实付金额
                                null,    // 付款类型
                                null,    // 业务员
                                null,    // 结算天数
                                null,    // 邮费支付类型
                                null,    // 邮费
                                null,    // 付款时间
                                null,    // 发货时间
                                null,    // 物流名称
                                null,    // 物流单号
                                1L,    // 订单状态
                                1,    // 状态
                                9527L,    // 添加人员
                                now1,    // 添加时间
                                9527L,    // 修改人员
                                now1,    // 修改时间
                                null    // 备注
                        );
                    }
                    //物料编码
                    Mat mat = matService.selectByMatnr(orderResult.getItemNo());
                    if (Cools.isEmpty(mat)) {
                        throw new CoolException(orderResult.getItemNo() + "编号商品检索失败,请先添加商品");
                    }
                    OrderDetl orderDetl1 = orderDetlService.selectOne(new EntityWrapper<OrderDetl>()
                            .eq("order_no", orderResult.getDocNo())
                            .eq("matnr", orderResult.getItemNo())
                            .eq("batch", orderResult.getDocLotNo()));//批号
                    if (!Cools.isEmpty(orderDetl1)) {
                        continue;
                    }
                    DocType docType = docTypeService.selectById(orderResult.getDocType());
                    OrderDetl orderDetl = new OrderDetl();
                    orderDetl.sync(mat);
                    orderDetl.setBatch(orderResult.getDocLotNo());
                    orderDetl.setAnfme(orderResult.getApplyQty());
                    orderDetl.setOrderId(order.getId());
                    orderDetl.setOrderNo(order.getOrderNo());
                    orderDetl.setCreateBy(9527L);
                    orderDetl.setCreateTime(new Date());
                    orderDetl.setUpdateBy(9527L);
                    orderDetl.setUpdateTime(new Date());
                    orderDetl.setStatus(1);
                    orderDetl.setQty(0.0D);
                    //保存erp传过来的字段
                    orderDetl.setManu((orderResult.getOrgNo()));//组织编码
                    orderDetl.setModel(orderResult.getDocSeqNo());//项次--行号
                    orderDetl.setColor(orderResult.getDocWarehouseNo());//任务仓库
                    orderDetl.setBrand(orderResult.getDocCellNo());//任务储位
                    orderDetl.setUnit(orderResult.getUnitNo());//单位编号
                    orderDetl.setSku(orderResult.getUnitName());//单位名称
                    orderDetl.setItemNum(orderResult.getSupplierNo());//供应商编码
                    orderDetl.setOrigin(orderResult.getSupplierName());//供应商名称
                    if (!orderDetlService.insert(orderDetl)) {
                        throw new CoolException("生成单据明细失败,请联系管理员");
                    }
                }
            } else {
            }
        } catch (Exception e) {
            log.error("fail", e);
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "轮询数据",
                        URL + inaddress,
                        null,
                        "127.0.0.1",
                        map.toString(),
                        response,
                        success
                );
            } catch (Exception e) {
                log.error("", e);
            }
        }
    }
}
src/main/java/com/zy/asrs/task/ERPReportScheduler.java
New file
@@ -0,0 +1,138 @@
package com.zy.asrs.task;
import com.alibaba.fastjson.JSON;
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;
import com.core.exception.CoolException;
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.result.OrderResult;
import com.zy.asrs.service.*;
import com.zy.common.utils.HttpHandler;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;
import java.util.*;
@Service
@Slf4j
public class ERPReportScheduler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    private String URL;
    @Value("${erp.address.outaddress}")
    private String outAddress;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private WrkMastService wrkMastService;
    @Autowired
    private ConfigService configService;
    @Autowired
    private WrkDetlService wrkDetlService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private DocTypeService docTypeService;
    /**
     * 单个任务上报erp
     */
    @Scheduled(cron = "0/10 * * * * ? ")
    private void execute() {
        //查找所有任务档任务状态为40ERP上报中的任务
        List<WrkMast> wrkMasts = wrkMastService.selectList(new EntityWrapper<WrkMast>().eq("wrk_sts", 40));
        //是否需要上报ERP
        Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "newErpReport"));
        if(!Cools.isEmpty(config)&&config.getValue().equals("Y")&&!Cools.isEmpty(wrkMasts)){
            for(WrkMast wrkMast:wrkMasts){
                List<WrkDetl> wrkDetls = wrkDetlService.selectByWrkNo(wrkMast.getWrkNo());
                if(wrkDetls!=null&&wrkDetls.size()>0){
                    List<LinkedHashMap<String,Object>> datas=new ArrayList<>();
                    for(WrkDetl wrkDetl:wrkDetls){
                        OrderDetl orderDetl= orderDetlService.selectItem(wrkDetl.getOrderNo(),wrkDetl.getMatnr(),wrkDetl.getBatch());
                        if(orderDetl==null){
                            log.error("orderNo={},matnr={},batch={},没有查询到订单明细",wrkDetl.getOrderNo(),wrkDetl.getMatnr(),wrkDetl.getBatch());
                            continue;
                        }
                        Order order= orderService.selectByNo(wrkDetl.getOrderNo());
                        if(order==null){
                            log.error("orderNo={},matnr={},batch={},没有查询到订单",wrkDetl.getOrderNo(),wrkDetl.getMatnr(),wrkDetl.getBatch());
                            continue;
                        }
                        DocType docType = docTypeService.selectById(order.getDocType());//单据编号
                        LinkedHashMap<String,Object> map=new LinkedHashMap<>();
                        map.put("orgNo",orderDetl.getManu());//组织编码
                        map.put("docNo",orderDetl.getOrderNo());
                        map.put("docType",docType.getMemo());
                        map.put("docSeqNo",orderDetl.getModel());
                        map.put("itemNo",orderDetl.getMatnr());
                        map.put("qty",wrkDetl.getAnfme());
                        map.put("unitNo",orderDetl.getUnit());
                        map.put("warehouseNo",orderDetl.getColor());
                        map.put("cellNo",orderDetl.getBrand());
                        map.put("combinationLotNo",String.valueOf(orderDetl.getBatch()));
                        map.put("barcode",wrkDetl.getZpallet());
                        datas.add(map);
                    }
                    HashMap<String,Object> map=new HashMap<>();
                    map.put("data",datas);
                    //上报ERP
                    String response = "";
                    boolean success = false;
                    try {
                        response = new HttpHandler.Builder()
                                .setUri(URL)
                                .setPath(outAddress)
                                .setJson(JSON.toJSONString(map))
                                .build()
                                .doPost();
                        JSONObject jsonObject = JSON.parseObject(response);
                        if (jsonObject.getInteger("status") == 200) {
                            if(wrkMast.getIoType()<100){
                                wrkMast.setWrkSts(10L);//入库转历史档
                            }else{
                                wrkMast.setWrkSts(18L);//出库转历史档
                            }
                        } else {
                            log.error("任务号={},上报失败",wrkMast.getWrkNo());
                        }
                    } catch (Exception e) {
                        log.error("fail", e);
                    } finally {
                        try {
                            // 保存接口日志
                            apiLogService.save(
                                    "上报任务结果给ERP",
                                    URL + outAddress,
                                    null,
                                    "127.0.0.1",
                                    map.toString(),
                                    response,
                                    success
                            );
                        } catch (Exception e) {
                            log.error("", e);
                        }
                    }
                }else {
                    log.error("任务号:{},没有任务明细",wrkMast.getWrkNo());
                }
            }
        }
    }
}
src/main/java/com/zy/asrs/task/handler/WorkMastHandler.java
@@ -9,6 +9,8 @@
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.system.entity.Config;
import com.zy.system.service.ConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -36,6 +38,8 @@
    private LocDetlService locDetlService;
    @Autowired
    private WaitPakinService waitPakinService;
    @Autowired
    private ConfigService configService;
    public ReturnT<String> start(WrkMast wrkMast) {
        // 9.入库完成
@@ -51,6 +55,9 @@
    private ReturnT<String> doIn(WrkMast wrkMast){
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getLocNo());
        //判断任务是否有订单号
        Boolean boo=false;
        try {
            if (null == locMast) {
                exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
@@ -84,8 +91,13 @@
                    if (wrkDetls.isEmpty()) {
                        exceptionHandle("全板入库 ===>> 工作明细档不存在;[workNo={0}]", wrkMast.getWrkNo());
                    }
                    //判断是否有订单号
                    if(!Cools.isEmpty(wrkDetls.get(0).getOrderNo())){
                        boo=true;
                    }
                    // 遍历工作明细,更新库存明细和入库通知档
                    for (WrkDetl wrkDetl : wrkDetls) {
                        wrkDetl.setBatch("");
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
                        if (null != locDetl) {
@@ -143,6 +155,12 @@
                    if (wrkDetls53.isEmpty()) {
                        exceptionHandle("拣料入库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                    }
                    //判断是否有订单号
                    if(!Cools.isEmpty(wrkDetls53.get(0).getOrderNo())){
                        boo=true;
                    }
                    for (WrkDetl wrkDetl : wrkDetls53) {
                        LocDetl locDetl = locDetlService.selectItem(locMast.getLocNo(), wrkDetl.getMatnr(), wrkDetl.getBatch());
@@ -273,8 +291,15 @@
                default:
                    break;
            }
            // 修改工作主档状态
            wrkMast.setWrkSts(10L);
            //是否需要上报ERP
            Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "newErpReport"));
            if(!Cools.isEmpty(config)&&config.getValue().equals("Y")&&boo){
                wrkMast.setWrkSts(40L);//任务状态转ERP上报中
            }else{
                // 修改工作主档状态
                wrkMast.setWrkSts(10L);
            }
            wrkMast.setModiTime(now);
            if (!wrkMastService.updateById(wrkMast)) {
                exceptionHandle("更新入库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
@@ -289,8 +314,12 @@
    }
    private ReturnT<String> doOut(WrkMast wrkMast){
        Date now = new Date();
        LocMast locMast = locMastService.selectById(wrkMast.getSourceLocNo());
        //判断任务是否有订单号
        Boolean boo=false;
        try {
            if (null == locMast) {
                exceptionHandle("工作档[workNo={0}]库位号错误[locNo={1}]", wrkMast.getWrkNo(), wrkMast.getLocNo());
@@ -338,6 +367,11 @@
                    if (wrkDetls101.isEmpty()) {
                        exceptionHandle("全板出库 ===>> 工作明细档为空;[workNo={0}]", wrkMast.getWrkNo());
                    }
                    //判断是否有订单号
                    if(!Cools.isEmpty(wrkDetls101.get(0).getOrderNo())){
                        boo=true;
                    }
                    for (WrkDetl wrkDetl : wrkDetls101) {
                        // todo:luxiaotao 3)修改出库通知档 status ==> Y
                    }
@@ -375,8 +409,14 @@
                    break;
            }
            if(wrkMast.getIoType()!=11) {
                // 修改工作主档状态
                wrkMast.setWrkSts(18L);
                //是否需要上报ERP
                Config config = configService.selectOne(new EntityWrapper<Config>().eq("code", "newErpReport"));
                if(!Cools.isEmpty(config)&&config.getValue().equals("Y")&&boo){
                    wrkMast.setWrkSts(40L);//任务状态转ERP上报中
                }else{
                    // 修改工作主档状态
                    wrkMast.setWrkSts(18L);
                }
                wrkMast.setModiTime(now);
                if (!wrkMastService.updateById(wrkMast)) {
                    exceptionHandle("更新出库完成状态失败;[workNo={0}]", wrkMast.getWrkNo());
src/main/resources/application.yml
@@ -59,3 +59,13 @@
store:
  bufferCount: 2
#erp对接
erp:
  #地址
  address:
    URL: http://192.168.3.102:16001
    #入库单据
    inaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc
    #结果上报(审核)单地址
    outaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc