自动化立体仓库 - WMS系统
野心家
2023-08-03 f8f52b8643104a47ebc19d0cfcadec8e421cee17
erp轮询,登录,查询创建物料,查询创建订单
2个文件已修改
9个文件已添加
1个文件已删除
615 ■■■■■ 已修改文件
.idea/misc.xml 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/modules.xml 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/InFormIdParam.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/LoginParam.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/entity/param/MaterielParam.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/InboundOrderScheduler.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/LoginAuthenticationScheduler.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/OutboundOrderScheduler.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java 306 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/LoginAuthenticationHandler.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/java/com/zy/asrs/task/kingdee/handler/OutboundOrderHandler.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/main/resources/application.yml 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
.idea/misc.xml
@@ -1,5 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
  <component name="ExternalStorageConfigurationManager" enabled="true" />
  <component name="FrameworkDetectionExcludesConfiguration">
    <file type="web" url="file://$PROJECT_DIR$" />
  </component>
@@ -13,7 +14,7 @@
      </list>
    </option>
  </component>
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" project-jdk-name="1.8" project-jdk-type="JavaSDK">
  <component name="ProjectRootManager" version="2" languageLevel="JDK_1_8" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
    <output url="file://$PROJECT_DIR$/out" />
  </component>
</project>
.idea/modules.xml
File was deleted
src/main/java/com/zy/asrs/entity/param/InFormIdParam.java
New file
@@ -0,0 +1,38 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class InFormIdParam {
    //查找表单唯一标识
    private String FormId;
    //最多允许查询的数量,0或者不要此属性标识不限制
    private String TopRowCount;
    private Integer Limit;
    private String StartRow;
    //过滤条件(eg:\"FNumber>'0301010120001' and FCreateDate>'2023-07-05' \")
    //1、Left:左括号
    //3、Compare:比较运算符,如 大于">"、小于"<"、等于"="、包含"like"、左包含"llike"、右包含"rlike"
    //4、Value:比较值
    //5、Right:右括号
    //6、Logic:逻辑运算符,如 "and"、"or"
    private Integer Filterstring;
    //排序条件
    private Integer OrderString;
    //待查询表单的字段列(期望返回值)
    private Integer FieldKeys;
}
src/main/java/com/zy/asrs/entity/param/LoginParam.java
New file
@@ -0,0 +1,20 @@
package com.zy.asrs.entity.param;
import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
@Data
public class LoginParam {
    //账号ID
    private String acctID;
    //账号
    private String username;
    //密码
    private String password;
    //
    private Integer lcid;
}
src/main/java/com/zy/asrs/entity/param/MaterielParam.java
New file
@@ -0,0 +1,15 @@
package com.zy.asrs.entity.param;
import lombok.Data;
@Data
public class MaterielParam {
    //商品编号
    private String matnr;
    //商品名称
    private String maktx;
    //规格
    private String specs;
}
src/main/java/com/zy/asrs/task/kingdee/InboundOrderScheduler.java
New file
@@ -0,0 +1,25 @@
package com.zy.asrs.task.kingdee;
import com.zy.asrs.task.kingdee.handler.InboundOrderHandler;
import com.zy.asrs.task.kingdee.handler.LoginAuthenticationHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class InboundOrderScheduler {
    @Autowired
    private InboundOrderHandler inboundOrderHandler;
    @Scheduled(cron = "0/3 * * * * ? ")
    void login(){
        Boolean fig=false;
        if(fig){
            return;
        }
        inboundOrderHandler.start();
    }
}
src/main/java/com/zy/asrs/task/kingdee/LoginAuthenticationScheduler.java
New file
@@ -0,0 +1,23 @@
package com.zy.asrs.task.kingdee;
import com.zy.asrs.task.kingdee.handler.LoginAuthenticationHandler;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class LoginAuthenticationScheduler {
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    //@Scheduled(cron = "0/3 * * * * ? ")
    void login(){
        Boolean fig=false;
        if(fig){
            return;
        }
        loginAuthenticationHandler.start();
    }
}
src/main/java/com/zy/asrs/task/kingdee/OutboundOrderScheduler.java
New file
@@ -0,0 +1,4 @@
package com.zy.asrs.task.kingdee;
public class OutboundOrderScheduler {
}
src/main/java/com/zy/asrs/task/kingdee/handler/InboundOrderHandler.java
New file
@@ -0,0 +1,306 @@
package com.zy.asrs.task.kingdee.handler;
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.param.InFormIdParam;
import com.zy.asrs.entity.param.MaterielParam;
import com.zy.asrs.service.*;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import com.zy.common.constant.MesConstant;
import com.zy.common.utils.HttpHandler;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import netscape.javascript.JSObject;
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.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
@Service
@Slf4j
public class InboundOrderHandler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    //端口
    private String URL;
    @Value("${erp.address.inaddress}")
    //单据,商品档案地址
    private String inaddress;
    @Autowired
    private ApiLogService apiLogService;
    @Autowired
    private LoginAuthenticationHandler loginAuthenticationHandler;
    @Autowired
    private MatService matService;
    @Autowired
    private TagService tagService;
    @Autowired
    private DocTypeService docTypeService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderDetlService orderDetlService;
    @Autowired
    private SnowflakeIdWorker snowflakeIdWorker;
    @Transactional
    public synchronized ReturnT<String> start() {
        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        //登录金蝶r
        ReturnT<String> start = loginAuthenticationHandler.start();
        for(int i=0;i<14;i++) {
            InFormIdParam inFormIdParam = new InFormIdParam();
            //对应订单类型ID
            int docName=0;
            //数量字段
            String anfme =null;
            switch (i){
                //物料档案
                case 0 : inFormIdParam.setFormId("BD_MATERIAL"); break;
                //采购入库
                case 1 : inFormIdParam.setFormId("STK_InStock");docName=13;anfme ="FRealQty"; break;
                //采购退料
                case 2 : inFormIdParam.setFormId("PUR_MRB");docName=21;anfme ="FRMREALQTY"; break;
                //生产领料
                case 3 : inFormIdParam.setFormId("PRD_PickMtrl");docName=22;anfme ="FActualQty"; break;
                //生产退料
                case 4 : inFormIdParam.setFormId("BD_MATERIAL");docName=24;anfme ="FQty"; break;
                //生产补料
                case 5 : inFormIdParam.setFormId("PRD_FeedMtrl");docName=25;anfme ="FActualQty"; break;
                //直接调拨单
                case 6 : inFormIdParam.setFormId("STK_TransferDirect");docName=26;anfme ="FQty"; break;
                //盘盈单
                case 7 : inFormIdParam.setFormId("STK_StockCountGain");docName=28;anfme ="FGainQty"; break;
                //盘亏单
                case 8 : inFormIdParam.setFormId("STK_StockCountLoss");docName=29;anfme ="FLossQty"; break;
                //其他出库
                case 9 : inFormIdParam.setFormId("STK_MisDelivery");docName=30;anfme ="FQty"; break;
                //简单生产领料
                case 10 : inFormIdParam.setFormId("SP_PickMtrl");docName=31;anfme ="FActualQty"; break;
                //简单生产退料
                case 11 : inFormIdParam.setFormId("SP_ReturnMtrl");docName=32;anfme ="FQty"; break;
                //销售出库
                case 12 : inFormIdParam.setFormId("SAL_OUTSTOCK");docName=14;anfme ="FRealQty"; break;
                //销售退货
                case 13 : inFormIdParam.setFormId("SAL_RETURNSTOCK");docName=33;anfme ="FRealQty"; break;
            }
            inFormIdParam.setLimit(10);
            inFormIdParam.setStartRow("0");
            Date time=new Date();
            String FDocumentStatus=null;
            //条件和需要获得的结果拼接
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("FormId", inFormIdParam.getFormId());
            jsonObject.put("Limit", inFormIdParam.getLimit());
            jsonObject.put("StartRow", inFormIdParam.getStartRow());
            //物料档案查询
            if(i==0){
                Tag tag = tagService.selectById(20);
                //最新时间
                time=tag.getCreateTime();
                //物料状态
                FDocumentStatus="C";
                jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(time)+"' and FDocumentStatus='"+FDocumentStatus+"'");
                jsonObject.put("FieldKeys", "FName,FNumber,FCreateDate,FSpecification,FDocumentStatus");
                // FName : 物料名称 ;
                // FNumber :物料编号;
                // FCreateDate :物料创建时间;
                // FSpecification :物料规格;
                // FDocumentStatus :物料状态
            }else{
                //获取最新时间
                DocType docType= docTypeService.selectById(docName);
                //单据状态
                FDocumentStatus="C";
                jsonObject.put("FilterString", "FCreateDate>'"+sdf.format(docType.getCreateTime())+"' and FDocumentStatus='"+FDocumentStatus+"'");
                jsonObject.put("FieldKeys", "FBillNo,FCreateDate,FMaterialId.FNumber,FMaterialId.FName,FMaterialId.FSpecification,"+anfme+",FDocumentStatus");
                // FBillNo :单据编号;
                // FCreateDate :单据创建时间;
                // FMaterialId.FNumber : 物料编码;
                // FMaterialName :物料名称;
                // FMaterialId.FSpecification:物料规格
                // anfme : 物料数量
                // FDocumentStatus :单据状态;
            }
            JSONObject jsonObject1 = new JSONObject();
            jsonObject1.put("data", jsonObject);
            String add = jsonObject1.toJSONString();
            System.out.println(add);
            //上报
            String response = "";
            boolean success = false;
            try {
                //获取Cookie值
                HashMap<String, Object> headers = new HashMap<>();
                headers.put("Cookie", start.getContent());
                response = new HttpHandler.Builder()
                        .setHeaders(headers)
                        .setUri(URL)
                        .setPath(inaddress)
                        .setJson(add)
                        .build()
                        .doPost();
                JSONArray data = JSON.parseArray(response);
                if(i==0){
                    for (int j = 0; j < data.size(); j++) {
                        JSONArray jsonArray = data.getJSONArray(j);
                        //生成商品档案
                        //商品编号
                        Mat mat = matService.selectByMatnr(jsonArray.get(1).toString());
                        if (mat == null) {
                            mat = new Mat();
                            Tag tag=new Tag();
                            mat.setMatnr(jsonArray.get(1).toString());
                            mat.setMaktx(jsonArray.get(0).toString());
                            mat.setSpecs(jsonArray.get(3).toString());//规格
                            //对美国时间进行转换
                            DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                            DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
                            LocalDateTime dateTime = LocalDateTime.parse(jsonArray.get(2).toString(), formatter);
                            String format = dateFormat.format(dateTime);
                            Date date = sdf.parse(format);
                            mat.setCreateTime(date);//商品创建时间
                            mat.setUpdateTime(new Date());
                            mat.setStatus(1);
                            //最新抓取商品时间
                            tag.setCreateTime(date);
//                        tagService.update(tag,new EntityWrapper<Tag>().eq("id",20));
//                        if (!matService.insert(mat)) {
//                            throw new CoolException("服务器内部错误,请联系管理员");
//                        } else {
//                            log.info("同步新物料[商品编号:{}]", mat.getMatnr());
//                        }
                        }
                    }
                }else {
                    for(int j=0;j<data.size();j++){
                        JSONArray jsonArray = data.getJSONArray(j);
                        Order order = orderService.selectByNo(jsonArray.get(0).toString());
                        if (Cools.isEmpty(order)) {
                        DocType docType = docTypeService.selectById(docName);
                        Date now = new Date();
                        // 单据主档
                        order = new Order(
                                String.valueOf(snowflakeIdWorker.nextId()),    // 编号[非空]
                                jsonArray.get(0).toString(),    // 订单编号
                                DateUtils.convert(now),    // 单据日期
                                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,    // 添加人员
                                now,    // 添加时间
                                9527L,    // 修改人员
                                now,    // 修改时间
                                null    // 备注
                        );
                        //对美国时间进行转换
                        DateTimeFormatter dateFormat = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
                        DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
                        LocalDateTime dateTime = LocalDateTime.parse(jsonArray.get(1).toString(), formatter);
                        String format = dateFormat.format(dateTime);
                        Date date = sdf.parse(format);
                        //最新抓取时间
                        docType.setCreateTime(date);
//                        docTypeService.update(docType,new EntityWrapper<DocType>().eq("doc_id",docName));
//                        if (!orderService.insert(order)) {
//                            throw new CoolException("生成单据主档失败,请联系管理员");
//                        }
                        }
                        //物料编码
                        Mat mat = matService.selectByMatnr(jsonArray.get(2).toString());
                        if (Cools.isEmpty(mat)) {
                            throw new CoolException(jsonArray.get(2).toString() + "编号商品检索失败,请先添加商品");
                        }
                        OrderDetl orderDetl = new OrderDetl();
                        orderDetl.sync(mat);
                        orderDetl.setBatch(null);
                        orderDetl.setAnfme(Double.parseDouble(jsonArray.get(5).toString()));
                        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);
//                        if (!orderDetlService.insert(orderDetl)) {
//                            throw new CoolException("生成单据明细失败,请联系管理员");
//                        }
                    }
                }
            } catch (Exception e) {
                log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
                return FAIL.setMsg(e.getMessage());
            } finally {
                try {
                    // 保存接口日志
                    apiLogService.save(
                            "登录金蝶",
                            MesConstant.URL + MesConstant.PAKIN_URL,
                            null,
                            "127.0.0.1",
                            add,
                            response,
                            success
                    );
                } catch (Exception e) {
                    log.error("", e);
                }
            }
        }
        return SUCCESS;
    }
}
src/main/java/com/zy/asrs/task/kingdee/handler/LoginAuthenticationHandler.java
New file
@@ -0,0 +1,134 @@
package com.zy.asrs.task.kingdee.handler;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.core.common.Cools;
import com.core.exception.CoolException;
import com.zy.asrs.entity.param.LoginParam;
import com.zy.asrs.service.ApiLogService;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
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.util.Set;
@Service
@Slf4j
@Transactional
public class LoginAuthenticationHandler extends AbstractHandler<String> {
    @Value("${erp.address.URL}")
    //端口
    private String URL;
    @Value("${erp.address.loginaddress}")
    //登录地址
    private String loginaddress;
    @Value("${erp.login.acctID}")
    //账号ID
    private String acctID;
    @Value("${erp.login.username}")
    //账号
    private String username;
    @Value("${erp.login.password}")
    //密码
    private String password;
    @Value("${erp.login.lcid}")
    //
    private Integer lcid;
    @Autowired
    private ApiLogService apiLogService;
    /**
     * 45分钟登录一次金蝶系统
     * @return
     */
    @Transactional
    public synchronized ReturnT<String> start() {
        LoginParam loginParam =new LoginParam();
        loginParam.setAcctID(acctID);
        loginParam.setUsername(username);
        loginParam.setPassword(password);
        loginParam.setLcid(lcid);
        //上报
        String response = "";
        String cookie = "";
        boolean success = false;
        try {
            response = new HttpHandler.Builder()
                    .setUri(URL)
                    .setPath(loginaddress)
                    .setJson(JSON.toJSONString(loginParam))
                    .build()
                    .doPost();
            JSONObject jsonObject = JSON.parseObject(response);
            Object sessionId = findValueByKey(JSON.parseObject(response), "SessionId");
            cookie="ASP.NET_SessionId="+sessionId+";"+"kdservice-sessionid="+jsonObject.getString("KDSVCSessionId");
            if (Cools.isEmpty(jsonObject.getString("Message"))) {
                success = true;
            } else {
                log.error("请求接口失败!!!url:{};request:{};response:{}", URL+loginaddress, JSON.toJSONString(loginParam), response);
                throw new CoolException("登录金蝶失败");
            }
        } catch (Exception e) {
            log.error("fail", e);
//            TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
            return FAIL.setMsg(e.getMessage());
        } finally {
            try {
                // 保存接口日志
                apiLogService.save(
                        "登录金蝶",
                        MesConstant.URL + MesConstant.PAKIN_URL,
                        null,
                        "127.0.0.1",
                        JSON.toJSONString(loginParam),
                        response,
                        success
                );
            } catch (Exception e) { log.error("", e); }
        }
        return SUCCESS.setContent(cookie);
    }
        public static Object findValueByKey(JSONObject json, String key) {
            Set<String> keySet = json.keySet();
            for (String k : keySet) {
                Object v = json.get(k);
                if (k.equals(key)) {
                    return v;
                } else if (v instanceof JSONArray) {
                    int size = ((JSONArray) v).size();
                    for (int i = 0; i <= size - 1; i++) {
                        Object result = findValueByKey((JSONObject) ((JSONArray) v).get(i), key);
                        if (result != null){
                            return result;
                        }
                    }
                } else if (v instanceof JSONObject){
                    Object result = findValueByKey((JSONObject) v, key);
                    if (result != null){
                        return result;
                    }
                }
            }
            return null;
        }
}
src/main/java/com/zy/asrs/task/kingdee/handler/OutboundOrderHandler.java
New file
@@ -0,0 +1,17 @@
package com.zy.asrs.task.kingdee.handler;
import com.zy.asrs.task.AbstractHandler;
import com.zy.asrs.task.core.ReturnT;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
@Slf4j
public class OutboundOrderHandler extends AbstractHandler<String> {
    @Transactional
    public synchronized ReturnT<String> start() {
        return SUCCESS;
    }
}
src/main/resources/application.yml
@@ -10,7 +10,7 @@
    enabled: false
  datasource:
    driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
    url: jdbc:sqlserver://localhost:1433;databasename=tzhtasrs
    url: jdbc:sqlserver://192.168.4.15:1433;databasename=tzhtasrs
    username: sa
    password: sa@123
  mvc:
@@ -48,4 +48,22 @@
  # 双深库位排号
  doubleLocs: 1,4,5,8
  # 一个堆垛机负责的货架排数
  groupCount: 4
  groupCount: 4
#erp对接
erp:
  #地址
  address:
    URL: http://ht01.wlgear.com:16001
    #登录地址
    loginaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.AuthService.ValidateUser.common.kdsvc
    #单据,商品档案地址
    inaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.ExecuteBillQuery.common.kdsvc
    #结果上报(审核)单地址
    outaddress: K3CLOUD/Kingdee.BOS.WebApi.ServicesStub.DynamicFormService.Audit.common.kdsvc
  #登录账号管理
  login :
    acctID: "64c7666b20caf2"
    username: "cs"
    password: "123456"
    lcid: 2052