自动化立体仓库 - WMS系统
zyx
2024-04-28 087db8aee2e9cbfb44b8e61531c1cace5e36a6e2
ERP接口同步
8个文件已修改
1个文件已添加
419 ■■■■ 已修改文件
src/main/java/com/zy/asrs/controller/MobileController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java 59 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/OrderPakinParam.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/OpenService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java 150 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/OrderSendScheduler.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/handler/OrderSendHandler.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/controller/MobileController.java
@@ -22,6 +22,7 @@
import org.springframework.web.bind.annotation.*;
import java.math.BigDecimal;
import java.text.ParseException;
import java.util.*;
/**
@@ -58,6 +59,8 @@
    private PlaService plaService;
    @Autowired
    private NodeService nodeService;
    @Autowired
    private OpenService openService;
    // 商品上架
@@ -424,7 +427,8 @@
    @RequestMapping("/plaDetl/packin/v1")
    //@ManagerAuth(memo="pla入库")
    public R plaPackIn(@RequestBody JSONObject json){
    @Transactional
    public R plaPackIn(@RequestBody JSONObject json) throws ParseException {
        String locNo = json.get("locNo").toString();
        JSONArray jsonArray = JSONArray.parseArray(json.getJSONArray("pla").toJSONString());
        for (Object o : jsonArray){
@@ -442,6 +446,8 @@
                mobileService.plaPakin(brand,locNo,batch,packageNo,user);
            }
        }
        //入库成功后上报ERP
        openService.pakinReportErp(json);
        return R.ok("入库成功");
    }
src/main/java/com/zy/asrs/entity/param/MatSyncParam.java
@@ -23,6 +23,16 @@
        /**
         * 商品编号
         */
        private String cInvCode;
        /**
         * 商品名称
         */
        private String cInvName;
        /**
         * 商品编号
         */
        private String matnr;
        /**
@@ -194,6 +204,24 @@
         * 备注
         */
        private String memo;
        public void setcInvCode(String cInvCode) {
            this.cInvCode = cInvCode;
            this.matnr = cInvCode;
        }
        public void setcInvName(String cInvName) {
            this.cInvName = cInvName;
            this.maktx = cInvName;
        }
        public void setMatnr(String matnr) {
        }
        public void setMaktx(String maktx) {
        }
    }
}
src/main/java/com/zy/asrs/entity/param/OpenOrderPakoutParam.java
@@ -2,6 +2,8 @@
import lombok.Data;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
@@ -26,12 +28,51 @@
    //公司
    private String cAccount;
    //调拨
    private String allocation;
    //备注
    private String cMemo;
    private List<Body> ADDBody;
    private List<Body> aDDBody;
    //private List<DetlDto> orderDetails;
    public void setcCode(String cCode) {
        this.cCode = cCode;
    }
    public void setdDate(String dDate) throws ParseException {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-DD hh:mm:ss");
        this.dDate =  sdf.parse(dDate);
    }
    public void setdDate$(Date dDate) {
        this.dDate =  dDate;
    }
    public void setcMaker(String cMaker) {
        this.cMaker = cMaker;
    }
    public void setcAccount(String cAccount) {
        this.cAccount = cAccount;
    }
    public void setType(String type) {
        this.type = type;
    }
    public void setcMemo(String cMemo) {
        this.cMemo = cMemo;
    }
    public void setaDDBody(List<Body> aDDBody) {
        this.aDDBody = aDDBody;
    }
    public void setAllocation(String allocation) {
        this.allocation = allocation;
    }
    @Data
    public static class Body{
@@ -43,6 +84,22 @@
        private String cBatch;
        //行备注
        private String cbMemo;
        public void setcInvCode(String cInvCode) {
            this.cInvCode = cInvCode;
        }
        public void setiQuantity(Double iQuantity) {
            this.iQuantity = iQuantity;
        }
        public void setcBatch(String cBatch) {
            this.cBatch = cBatch;
        }
        public void setCbMemo(String cbMemo) {
            this.cbMemo = cbMemo;
        }
    }
}
src/main/java/com/zy/asrs/entity/param/OrderPakinParam.java
New file
@@ -0,0 +1,26 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class OrderPakinParam {
    //生产订单号
    private String orderNo;
    //入库时间
    private String pakinTime;
    //存货编码
    private String cInvCode;
    //牌号
    private String brand;
    //批号
    private String batch;
    //包号
    private Integer packageNo;
    //入库重量
    private Double iQuantity;
    //主体
    private String account;
    //备注
    private String memo;
}
src/main/java/com/zy/asrs/service/OpenService.java
@@ -5,6 +5,7 @@
import com.zy.asrs.entity.param.*;
import com.zy.asrs.entity.result.StockVo;
import java.text.ParseException;
import java.util.List;
public interface OpenService {
@@ -47,4 +48,6 @@
    R getInOutDetl();
    DigitalTwin inventoryQuantity();
    int pakinReportErp(JSONObject jsonObject) throws ParseException;
}
src/main/java/com/zy/asrs/service/impl/OpenServiceImpl.java
@@ -1,5 +1,8 @@
package com.zy.asrs.service.impl;
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;
@@ -14,15 +17,19 @@
import com.zy.asrs.mapper.TagMapper;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.MatUtils;
import com.zy.asrs.utils.Utils;
import com.zy.common.model.DetlDto;
import com.zy.common.utils.HttpHandler;
import com.zy.common.utils.NodeUtils;
import com.zy.system.entity.User;
import com.zy.system.service.UserService;
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.text.ParseException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
@@ -31,8 +38,15 @@
 * Created by vincent on 2022/4/9
 */
@Slf4j
@Service
@Service("OpenService")
public class OpenServiceImpl implements OpenService {
    @Value("${u8.url}")
    private String url;
    @Value("${u8.path}")
    private String orderReportPath;
    @Autowired
    private OrderService orderService;
@@ -66,6 +80,10 @@
    private ReportQueryMapper reportQueryMapper;
    @Autowired
    private UserService userService;
    @Autowired
    private PlaService plaService;
    @Autowired
    private ApiLogService apiLogService;
    @Override
    @Transactional
@@ -207,7 +225,7 @@
                param.getCCode(),    // 订单编号
                DateUtils.convert(now),    // 单据日期
                docType.getDocId(),    // 单据类型
                null,    // 项目编号
                1L,    // 项目编号
                null,    //
                null,    // 调拨项目编号
                null,    // 初始票据号
@@ -486,14 +504,15 @@
                }
                if (!matService.insert(mat)) {
                    throw new CoolException("服务器内部错误,请联系管理员");
                } else {
                    log.info("同步新物料[商品编号:{}]", mat.getMatnr());
                }
                log.info("同步新物料[商品编号:{}]", mat.getMatnr());
            } else {
                mat.sync(param);
                //mat.sync(param);
                mat.setMaktx(matParam.getMaktx());
                if (!matService.update(mat, new EntityWrapper<Mat>().eq("matnr", matParam.getMatnr()))) {
                    throw new CoolException("更新已存在商品信息失败,请联系管理员");
                }
                log.info("同步更新物料[商品编号:{}]", mat.getMatnr());
            }
        }
@@ -538,4 +557,125 @@
        return digitalTwin;
    }
    @Override
    public int pakinReportErp(JSONObject json) throws ParseException {
        JSONArray jsonArray = JSONArray.parseArray(json.getJSONArray("pla").toJSONString());
        List<OpenOrderPakoutParam> list = new ArrayList<>();
        for (Object o : jsonArray){
            JSONObject jsonObject = (JSONObject)o;
            String brand = jsonObject.get("brand").toString();
            String batch = jsonObject.get("batch").toString();
            Integer packageNo = Integer.parseInt(jsonObject.get("packageNo").toString());
            Pla pla = plaService.selectByBatchAndPackageNo(batch, packageNo, brand);
            Mat mat = matService.selectByMaktx(pla.getBrand());
            //当生产单号不一致时,需要新建一个param
            if(list.size() == 0 || checkOrder(list,pla.getProOrderNo()) == null){
                OpenOrderPakoutParam param = new OpenOrderPakoutParam();
                String type = Cools.isEmpty(pla.getProOrderNo()) ? "调拨入库单" : "生产入库单";
                param.setcCode(pla.getProOrderNo());
                param.setcAccount(pla.getOwner());
                param.setdDate(Utils.getDateStr(new Date()));
                param.setType(type);
                List<OpenOrderPakoutParam.Body> bodyList = new ArrayList<>();
                OpenOrderPakoutParam.Body body = new OpenOrderPakoutParam.Body();
                body.setcInvCode(mat.getMatnr());
                body.setiQuantity(pla.getWeightAnfme());
                body.setCbMemo(pla.getMemo());
                bodyList.add(body);
                param.setaDDBody(bodyList);
                list.add(param);
            }else {
                OpenOrderPakoutParam param = checkOrder(list, pla.getProOrderNo());
                List<OpenOrderPakoutParam.Body> bodyList = param.getADDBody();
                OpenOrderPakoutParam.Body body = checkOrderDetl(bodyList, mat.getMatnr());
                //有新的牌号则添加新的orderDetl,否则累加
                if(body == null){
                    body = new OpenOrderPakoutParam.Body();
                    body.setcInvCode(mat.getMatnr());
                    body.setiQuantity(pla.getWeightAnfme());
                    body.setCbMemo(pla.getMemo());
                    bodyList.add(body);
                }else {
                    body.setiQuantity(body.getIQuantity() + pla.getWeightAnfme());
                }
            }
        }
        return doHttpRequest(list, "入库单上报", url, orderReportPath, null, "127.0.0.1");
    }
    private OpenOrderPakoutParam checkOrder(List<OpenOrderPakoutParam> list, String orderNo){
        for (OpenOrderPakoutParam param : list){
            //判断是否包含重复的订单号
            if(Cools.eq(param.getCCode(),orderNo)){
                return param;
            }
        }
        return null;
    }
    private OpenOrderPakoutParam.Body checkOrderDetl(List<OpenOrderPakoutParam.Body> bodyList, String matnr){
        for (OpenOrderPakoutParam.Body param : bodyList){
            //判断是否包含重复的订单号
            if(Cools.eq(param.getCInvCode(),matnr)){
                return param;
            }
        }
        return null;
    }
    private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip){
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(path)
                    .setJson(JSONObject.toJSONString(requestParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(Cools.isEmpty(jsonObject.get("errCode"))){
                throw new CoolException(jsonObject.get("Message").toString());
            }
            int code = (int) jsonObject.get("errCode");
            if(code != 0){
                throw new CoolException(jsonObject.get("errMsg").toString());
            }
            success = true;
            return code;
        }catch (Exception e){
            log.error(e.getMessage());
            throw new CoolException("调用接口响应错误");
        }finally {
            apiLogService.save(
                    namespace,
                    url + path,
                    appkey,
                    ip,
                    JSON.toJSONString(JSONObject.toJSONString(requestParam)),
                    response,
                    success
            );
        }
    }
}
src/main/java/com/zy/asrs/task/OrderSendScheduler.java
@@ -5,7 +5,6 @@
import com.zy.asrs.service.OrderService;
import com.zy.asrs.task.handler.OrderSendHandler;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.util.List;
@@ -21,11 +20,11 @@
    @Scheduled(cron = "0/3 * * * * ? ")
    //@Scheduled(cron = "0/10 * * * * ? ")
    private void looping(){
        List<Order> orders = orderService.selectList(new EntityWrapper<Order>()
                .eq("settle", "4")
                .le("item_id", 3));
                .eq("item_id",1L));
        for (Order order : orders) {
            orderSendHandler.start(order);
        }
src/main/java/com/zy/asrs/task/handler/OrderSendHandler.java
@@ -2,87 +2,119 @@
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.zy.asrs.entity.DocType;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.Order;
import com.zy.asrs.entity.OrderDetl;
import com.zy.asrs.entity.param.OpenOrderPakoutParam;
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.ErpAccessTokenScheduler;
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.HashMap;
import java.util.Map;
import java.util.ArrayList;
import java.util.List;
@Slf4j
@Service
@Transactional
public class OrderSendHandler extends AbstractHandler<String> {
    private static final String erpIp = "10.100.221.19:81";
    private static final String inPath = "/ierp/kapi/app/im/PurinbillApiPlugin";
    private static final String outPath = "/ierp/kapi/app/im/SaloutbillApiPlugin";
    @Value("${u8.url}")
    private String url;
    @Value("${u8.path}")
    private String orderReportPath;
    @Autowired
    private OrderService orderService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private OrderDetlService orderDetlService;
    public void start(Order order) {
        String accessToken = ErpAccessTokenScheduler.accessToken;
        if (accessToken.equals("")) {
            return;
        List<OpenOrderPakoutParam> paramList = new ArrayList<>();
        OpenOrderPakoutParam param = new OpenOrderPakoutParam();
        paramList.add(param);
        List<OrderDetl> orderDetlList = orderDetlService.selectByOrderId(order.getId());
        param.setcCode(order.getOrderNo());
        param.setcMaker(order.getOperMemb());
        param.setcAccount(order.getCstmrName());
        param.setcMemo(order.getMemo());
        param.setType(order.getDocType$());
        param.setdDate$(order.getCreateTime());
        param.setAllocation(order.getItemName());
        List<OpenOrderPakoutParam.Body> bodyList = new ArrayList<>();
        param.setaDDBody(bodyList);
        for(OrderDetl orderDetl : orderDetlList){
            OpenOrderPakoutParam.Body body = new OpenOrderPakoutParam.Body();
            body.setiQuantity(orderDetl.getQty());
            body.setcInvCode(orderDetl.getMatnr());
            body.setCbMemo(orderDetl.getMemo());
            bodyList.add(body);
        }
        HashMap<String, Object> header = new HashMap<>();
        header.put("accessToken",accessToken);
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("orderNo",order.getOrderNo());
        HttpHandler.Builder prepBuilder = new HttpHandler.Builder()
                .setUri(erpIp)
                .setHeaders(header)
                .setJson(jsonObject.toJSONString());
        JSONObject respJson;
        doHttpRequest(paramList, "上报ERP出库单据", url, orderReportPath, null, "127.0.0.1");
        orderService.updateSettle(order.getId(),6L,0L);
        //入库单据
        if (docTypeService.selectOne(new EntityWrapper<DocType>()
                .eq("doc_id",order.getDocType())).getPakin() == 1) {
            try {
                respJson = JSON.parseObject(
                        prepBuilder.setPath(inPath)
                        .build()
                        .doPost());
            } catch (IOException e) {
                throw new RuntimeException(e);
    }
    private int doHttpRequest(Object requestParam, String namespace, String url, String path, String appkey, String ip){
        String response = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(url)
                    .setPath(path)
                    .setJson(JSONObject.toJSONString(requestParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            if(Cools.isEmpty(jsonObject.get("errCode"))){
                throw new CoolException(jsonObject.get("Message").toString());
            }
        }else {
            //出库单据
            try {
                respJson = JSON.parseObject(
                prepBuilder.setPath(outPath)
                        .build()
                        .doPost());
            } catch (IOException e) {
                throw new RuntimeException(e);
            }
        }
        if ((boolean)respJson.get("success")) {
            orderService.updateSettle(order.getId(),6L,1L);
            log.info("单据:" + order.getOrderNo() + "回传成功,已更新单据状态");
        }else {
            order.setItemId(order.getItemId() + 1);
            orderService.updateById(order);
            log.info("单据:"+ order.getOrderNo()+" 回传失败,这是第" + order.getItemId() + "次回传");
            log.info(respJson.toJSONString());
            int code = (int) jsonObject.get("errCode");
            if(code != 0){
                throw new CoolException(jsonObject.get("errMsg").toString());
            }
            success = true;
            return code;
        }catch (Exception e){
            log.error(e.getMessage());
            throw new CoolException("调用接口响应错误");
        }finally {
            apiLogService.save(
                    namespace,
                    url + path,
                    appkey,
                    ip,
                    JSON.toJSONString(JSONObject.toJSONString(requestParam)),
                    response,
                    success
            );
        }
    }
}
src/main/resources/application.yml
@@ -57,4 +57,8 @@
#erp
erp:
  enable: false
  enable: false
u8:
  url: localhost:8080
  path: /test/report