自学内容网 自学内容网

对接金蝶云星空存货档案到MES系统的详细步骤及java&js动态脚本拉取的实现

  1. 导入k3cloud-webapi的jar依赖
<dependency>
            <groupId>com.jk.api</groupId>
            <artifactId>k3cloud_webapi</artifactId>
            <version>1.0</version>
</dependency>
<dependency>
            <groupId>com.jk.api</groupId>
            <artifactId>k3cloud-webapi-sdk</artifactId>
            <version>7.0</version>
</dependency>

2. 创建调用js脚本进行k3cloud-webapi拉取数据的工具类


import com.alibaba.fastjson.JSONObject;
import com.sun.deploy.util.StringUtils;
import com.sun.istack.internal.Nullable;
import javax.script.Invocable;
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
import javax.script.ScriptException;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.logging.*;

public class JSUtil {

    
    /**
     *
     * @param jsFilePath js文件的位置 Thread.currentThread().getContextClassLoader().getResource("js文件的位置").getPath();
     * @param method JS脚本中的方法
     * @param obj 传入脚本中的参数
     * @return
     * @throws ScriptException
     * @throws NoSuchMethodException
     * @throws FileNotFoundException
     */
    public static Object transform(String jsFilePath,String method,@Nullable Object obj) throws ScriptException, NoSuchMethodException, FileNotFoundException {
        //开启ES6支持
        System.setProperty("nashorn.args","--language=es6");
//        ScriptEngine engine = new ScriptEngineManager().getEngineByName("Nashorn");
        ScriptEngine engine = new ScriptEngineManager().getEngineByName("JavaScript");
        if (jsFilePath == null) {
            throw new RuntimeException("输入参数有误");
        }
        Object result = null;
        engine.eval(new FileReader(jsFilePath));
        Invocable inv = (Invocable) engine;
        try {
            result = inv.invokeFunction(method,obj);
//            System.out.println("transform result:"+result);
        } catch (ScriptException e) {
            e.printStackTrace();
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
        return result;
    }
}

3.拉取和转换数据的js脚本

const k3Url = "http://xxx.xxx.xx.xxx/k3cloud/";
const dbID = "6673cc977ecc9e";//测试环境DbId
// const appID = "214623_S3dB1Zlv6qn+2Y8oSZxC4+wNVM677tLH";
const userName = "mes";
// const appSec = "d294564799a74e798c69ee437508d4f0";
const password = "xxx";
const lang = 2052;
const CookieVal = "";
//定义返回结果
let returnMessage = {code: 200, msg: "成功", data: []}
let result = [];
let queryResult = null;
//导入Java工具支持
let BarnaclePlugin = Java.type("com.jkmes.sync.util.K3CloudUtil");
/**
 * 金蝶对接webapi拉取数据js
 */
function pullDatas(params) {
    print('params:',params);

    let filterStr = "FNumber like 'WCP.%'";
    if(params != null){
        let isNeedAnd = true;
        if(params.FNumber){
            if(params.FNumber.indexOf(",") > -1){
                //多个单号
                let fNumbers = params.FNumber.split(",").map(function(part) {
                    return "'" + part + "'";
                }).join(",");
                filterStr = " FNumber in ("+fNumbers+")";
            }else {
                filterStr = " FNumber='" + params.FNumber + "'";
            }
            isNeedAnd = true;
        }
        if(params.FDOCUMENTSTATUS){
            if(isNeedAnd){filterStr = filterStr+" AND "}
            filterStr = filterStr + " FDOCUMENTSTATUS='"+params.FDOCUMENTSTATUS+"'";
            isNeedAnd = true;
        }
        if(params.FBASEUNITID){
            if(isNeedAnd){filterStr = filterStr+" AND "}
            filterStr = filterStr + " FBASEUNITID='"+params.FBASEUNITID+"'";
            isNeedAnd = true;
        }
        if(params.FMODIFYDATE_start){
            if(isNeedAnd){filterStr = filterStr+" AND "}
            filterStr = filterStr + " FAPPROVEDATE>='"+params.FMODIFYDATE_start+"'";
            isNeedAnd = true;
        }
        if(params.FMODIFYDATE_end){
            if(isNeedAnd){filterStr = filterStr+" AND "}
            filterStr = filterStr + " FAPPROVEDATE<='"+params.FMODIFYDATE_end+"'";
            isNeedAnd = true;
        }
    }
    print('filterStr:'+filterStr);

    /**
     * @description:请求参数
     * @type {{TopRowCount: number, FieldKeys: string, FormId: string, Limit: number, FilterString: string, StartRow: number}}
     */
    var content = {
        "FormId": "bd_material", //存货
        //"TopRowCount": 2, //最多允许查询的数量,0或者不要此属性表示不限制
        "Limit": params.pageNum!=null?params.pageNum:2000,// 分页取数每页允许获取的数据,最大不能超过2000
        "StartRow": params!=null?(params.pageIndex-1):0,// 分页取数开始行索引,从0开始,例如每页10行数据,第2页开始是10,第3页开始是20
        "FilterString": filterStr,// 过滤条件,已审核
        "FieldKeys": "FNumber,FName,FMATERIALID,FTYPEID,FMATERIALGROUP,FBASEUNITID,FSPECIFICATION,FBARCODE_CMK,FIMAGEFILESERVER,FMODIFYDATE,FFORBIDSTATUS,FDOCUMENTSTATUS,FAPPROVEDATE,FLENGTH,FWIDTH,FHEIGHT" //查询字段
    };
    content = JSON.stringify(content)
    print('invContent:'+content)
    try {
            queryResult = BarnaclePlugin.executeQuery(k3Url, content, dbID, userName, password, lang);
        print("queryResult:"+queryResult);
            if (queryResult != null && queryResult.indexOf("false") > -1) {
                queryResult = JSON.parse(queryResult);
                const errors = JSON.stringify(queryResult[0][0].Result.ResponseStatus.Errors);
                returnMessage.code = 500;
                returnMessage.msg = errors;
                returnMessage.data = ['null'];
            } else {//对返回的结果进行参数赋值,在这里通过JS拼接可以直接转换成业务系统需要的字段
                //JsonStr转换成JSONObject
                queryResult = JSON.parse(queryResult);
                for (let i = 0; i < queryResult.length; i++) {
                    let icErpCode = queryResult[i][4],invAttribute = '',inInvCode = queryResult[i][0];
                        if(inInvCode.startsWith('WCP.')){
                            //产成品
                            invAttribute = 'finished_product';
                        }else if(inInvCode.startsWith('3.')){
                            //半成品
                            invAttribute = 'unfinished_product';
                        }else {
                            //物料
                            // invAttribute = 'material';
                        }
                        if(invAttribute == 'finished_product' || invAttribute == 'unfinished_product' || invAttribute == 'material'){
                            result.push({
                                /*erpCode: queryResult[i][0],
                                unitName: queryResult[i][1],
                                FMODIFYDATE: queryResult[i][2],*/
                                invAbbCode: queryResult[i][0],
                                // FERPCLSID: queryResult[i][3],
                                erpCode: queryResult[i][2],
                                invCode: queryResult[i][2],
                                invName: queryResult[i][1],
                                icErpCode:icErpCode,
                                unitErpCode:queryResult[i][5],
                                invAbbcode: queryResult[i][2],
                                invStd: queryResult[i][6],
                                invAttribute: invAttribute,
                                invWeight: getMaterialWeightByMatId(queryResult[i][2]),
                                barcode: queryResult[i][7],
                                imgAddress: queryResult[i][8],
                                useStatus: 0,
                                verifyType: "barcode",
                                // FMODIFYDATE: queryResult[i][8],
                                // FFORBIDSTATUS: queryResult[i][6],
                                FDOCUMENTSTATUS: queryResult[i][11],
                                FAPPROVEDATE: queryResult[i][12],
                                invLength: queryResult[i][13],
                                invWide: queryResult[i][14],
                                invHeight: queryResult[i][15],
                            })
                        }
                }
                //返回结果
                returnMessage.code = 200;
                returnMessage.msg = "拉取数据成功";
                returnMessage.data = result;
            }

    } catch (e) {
        returnMessage.code = 500;
        returnMessage.msg = e.message;
        returnMessage.data = [JSON.parse(e)];
    }
    return JSON.stringify(returnMessage);
}

/**
 * 通过存货的ID获取物料单位换算的存货净重
 * @param id
 * @param type:name/code
 * @returns {*|null}
 */
function getMaterialWeightByMatId(materialId){
    print('materialId:',materialId);
    var content = {
        "FormId": "BD_MATERIALUNITCONVERT",
        //"TopRowCount": 2, //最多允许查询的数量,0或者不要此属性表示不限制
        "Limit": 2000,// 分页取数每页允许获取的数据,最大不能超过2000
        "StartRow": 0,// 分页取数开始行索引,从0开始,例如每页10行数据,第2页开始是10,第3页开始是20
        "FilterString": " FMATERIALID="+materialId,// 过滤条件
        // "OrderString": "FID ASC", //排序条件
        "FieldKeys": "FCONVERTNUMERATOR" //单位查询字段
    };
    content = JSON.stringify(content)
    print("getMaterialWeightByMatIdContent:",content);
    let queryResult = null;
    try {
        queryResult = BarnaclePlugin.executeQuery(k3Url, content, dbID, userName, password, lang);
        print("getMaterialWeightByMatIdQueryResult:"+queryResult);
        if (queryResult != null && queryResult.indexOf("false") > -1){
            print("getMaterialWeightByMatId return null")
        }else {
            queryResult = JSON.parse(queryResult);
            return queryResult[0][0];
        }
    } catch (e) {
        print("getMaterialWeightByMatIdError:"+e)
    }
    return null;
}

4. js脚本中调用的K3CloudUtil的java工具类


import com.alibaba.fastjson.JSONObject;
import com.jk.k3cloudwebapi.K3CloudApiClient;
import java.util.List;

public class K3CloudUtil{
    public static String executeQuery(String url,String content, Object... args) {
        K3CloudApiClient k3CloudApiClient = new K3CloudApiClient(url);
        String results = null;
        try {
            Boolean login = k3CloudApiClient.login(args);
            System.out.println("login:"+login);
            if (login) {
                List<List<Object>> sResult = k3CloudApiClient.executeBillQuery(content);
                results = JSONObject.toJSONString(sResult);
            }
        } catch (Exception e) {
            System.out.println("登录失败:"+e.getMessage());
            e.printStackTrace();
        }
        return results;
    }
}

5. 单元测试代码

@Test
public void test() throws NoSuchMethodException, ScriptException, FileNotFoundException {
String jsFilePath = Thread.currentThread().getContextClassLoader().getResource("com/kingdee/k3cloud/webapi/khJs/invMapper.js").getPath();

System.out.println("jsFilePath:"+jsFilePath);
String jsMethod = "pullDatas";
int totalCount = 0;
for (int i = 0; i < 1; i+=2000) {
//Object result = JSUtil.transform(jsFilePath, jsMethod, new JSONObject().fluentPut("pageNum",2000).fluentPut("pageIndex",1).fluentPut("FNumber","").fluentPut("FID","66cbce0115e323,66ab3cae14b04e,66cbce8f15e327").fluentPut("status","C"));
//支持动态传参(按起始日期、产品编码[支持多个,英文逗号分隔]日期、状态)分页查询
Object result = JSUtil.transform(jsFilePath, jsMethod, new JSONObject().fluentPut("pageNum",2000).fluentPut("pageIndex",1).fluentPut("FNumber","WCP.TSSP6.PF.0001").fluentPut("FID","").fluentPut("status","C"));
int currentPageSize = JSONObject.parseObject(result.toString()).getJSONArray("data").size();
if(currentPageSize > 0) {
totalCount += currentPageSize;
System.out.println("resultSize:" + currentPageSize);
System.out.println(i + "-result:" + result);
}
}
System.out.println("totalCount:"+totalCount);//测试环境:35255条存货
}

6.执行结果数据:

D:\soft\dev\java\jdk\jdk1.8.0_151\bin\java.exe -ea -Didea.test.cyclic.buffer.size=1048576 -Dhxl.spring.invoke.port=33334 -javaagent:D:\soft\dev\idea\idea2024.1.6\lib\idea_rt.jar=58671:D:\soft\dev\idea\idea2024.1.6\bin -Dfile.encoding=UTF-8 -classpath C:\Users\litao\.m2\repository\org\junit\platform\junit-platform-launcher\1.11.0\junit-platform-launcher-1.11.0.jar;C:\Users\litao\.m2\repository\org\junit\vintage\junit-vintage-engine\5.11.0\junit-vintage-engine-5.11.0.jar;D:\soft\dev\idea\idea2024.1.6\lib\idea_rt.jar;D:\soft\dev\idea\idea2024.1.6\plugins\junit\lib\junit5-rt.jar;D:\soft\dev\idea\idea2024.1.6\plugins\junit\lib\junit-rt.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\charsets.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\deploy.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\access-bridge-64.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\cldrdata.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\dnsns.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\jaccess.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\jfxrt.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\localedata.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\nashorn.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\sunec.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\sunjce_provider.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\sunmscapi.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\sunpkcs11.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\ext\zipfs.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\javaws.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\jce.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\jfr.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\jfxswt.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\jsse.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\management-agent.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\plugin.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\resources.jar;D:\soft\dev\java\jdk\jdk1.8.0_151\jre\lib\rt.jar;D:\idea-workspace\k3-cloud\target\classes;C:\Users\litao\.m2\repository\junit\junit\4.12\junit-4.12.jar;C:\Users\litao\.m2\repository\org\hamcrest\hamcrest-core\1.3\hamcrest-core-1.3.jar;C:\Users\litao\.m2\repository\com\alibaba\fastjson\1.2.67\fastjson-1.2.67.jar;C:\Users\litao\.m2\repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;C:\Users\litao\.m2\repository\com\google\code\gson\gson\2.8.0\gson-2.8.0.jar;C:\Users\litao\.m2\repository\org\apache\httpcomponents\httpclient\4.5.6\httpclient-4.5.6.jar;C:\Users\litao\.m2\repository\commons-codec\commons-codec\1.10\commons-codec-1.10.jar;C:\Users\litao\.m2\repository\org\apache\httpcomponents\httpcore\4.4.10\httpcore-4.4.10.jar;C:\Users\litao\.m2\repository\org\apache\httpcomponents\httpmime\4.5.3\httpmime-4.5.3.jar;C:\Users\litao\.m2\repository\com\fasterxml\jackson\core\jackson-annotations\2.9.0\jackson-annotations-2.9.0.jar;C:\Users\litao\.m2\repository\com\fasterxml\jackson\core\jackson-core\2.9.8\jackson-core-2.9.8.jar;C:\Users\litao\.m2\repository\com\fasterxml\jackson\core\jackson-databind\2.9.8\jackson-databind-2.9.8.jar;C:\Users\litao\.m2\repository\org\json\json\20211205\json-20211205.jar;C:\Users\litao\.m2\repository\com\jk\api\k3cloud_webapi\1.0\k3cloud_webapi-1.0.jar;C:\Users\litao\.m2\repository\com\jk\api\k3cloud-webapi-sdk\7.0\k3cloud-webapi-sdk-7.0.jar;C:\Users\litao\.m2\repository\org\apache\logging\log4j\log4j-core\2.10.0\log4j-core-2.10.0.jar;C:\Users\litao\.m2\repository\org\apache\logging\log4j\log4j-api\2.10.0\log4j-api-2.10.0.jar;C:\Users\litao\.m2\repository\org\junit\jupiter\junit-jupiter\5.11.0\junit-jupiter-5.11.0.jar;C:\Users\litao\.m2\repository\org\junit\jupiter\junit-jupiter-api\5.11.0\junit-jupiter-api-5.11.0.jar;C:\Users\litao\.m2\repository\org\opentest4j\opentest4j\1.3.0\opentest4j-1.3.0.jar;C:\Users\litao\.m2\repository\org\junit\platform\junit-platform-commons\1.11.0\junit-platform-commons-1.11.0.jar;C:\Users\litao\.m2\repository\org\apiguardian\apiguardian-api\1.1.2\apiguardian-api-1.1.2.jar;C:\Users\litao\.m2\repository\org\junit\jupiter\junit-jupiter-params\5.11.0\junit-jupiter-params-5.11.0.jar;C:\Users\litao\.m2\repository\org\junit\jupiter\junit-jupiter-engine\5.11.0\junit-jupiter-engine-5.11.0.jar;C:\Users\litao\.m2\repository\org\junit\platform\junit-platform-engine\1.11.0\junit-platform-engine-1.11.0.jar;C:\Users\litao\.m2\repository\org\projectlombok\lombok\1.18.30\lombok-1.18.30.jar;C:\Users\litao\.m2\repository\org\slf4j\slf4j-api\1.7.36\slf4j-api-1.7.36.jar;C:\Users\litao\.m2\repository\ch\qos\logback\logback-classic\1.2.11\logback-classic-1.2.11.jar;C:\Users\litao\.m2\repository\ch\qos\logback\logback-core\1.2.11\logback-core-1.2.11.jar;C:\Users\litao\.m2\repository\cn\hutool\hutool-all\5.3.10\hutool-all-5.3.10.jar;C:\Users\litao\.config\.cool-request\request\lib\spring-invoke-starter.jar com.intellij.rt.junit.JUnitStarter -ideVersion5 -junit5 com.kingdee.k3cloud.webapi.gxJs.CommonTestNoApp,testBarnacleCall
jsFilePath:/D:/idea-workspace/k3-cloud/target/classes/com/kingdee/k3cloud/webapi/gxJs/invMapper.js
params: {"FID":"","pageIndex":1,"pageNum":2000,"FNumber":"WCP.TSSP6.PF.0001","status":"C"}
filterStr: FNumber='WCP.TSSP6.PF.0001'
invContent:{"FormId":"bd_material","Limit":2000,"StartRow":0,"FilterString":" FNumber='WCP.TSSP6.PF.0001'","FieldKeys":"FNumber,FName,FMATERIALID,FTYPEID,FMATERIALGROUP,FBASEUNITID,FSPECIFICATION,FBARCODE_CMK,FIMAGEFILESERVER,FMODIFYDATE,FFORBIDSTATUS,FDOCUMENTSTATUS,FAPPROVEDATE,FLENGTH,FWIDTH,FHEIGHT"}
login:true
queryResult:[["WCP.TSSP6.PF.0001","佛沙",142644,0,142268,102118,"P1-1a",null," ","2024-09-28T13:58:56.077","A","C","2024-09-28T14:00:04.34",0.0,0.0,0.0]]
materialId: 142644
getMaterialWeightByMatIdContent: {"FormId":"BD_MATERIALUNITCONVERT","Limit":2000,"StartRow":0,"FilterString":" FMATERIALID=142644","FieldKeys":"FCONVERTNUMERATOR"}
login:true
getMaterialWeightByMatIdQueryResult:[[2.05453]]
resultSize:1
0-result:{"code":200,"msg":"拉取数据成功","data":[{"invAbbCode":"WCP.TSSP6.PF.0001","erpCode":142644,"invCode":142644,"invName":"佛沙","icErpCode":142268,"unitErpCode":102118,"invAbbcode":142644,"invStd":"P1-1a","invAttribute":"finished_product","invWeight":2.05453,"barcode":null,"imgAddress":" ","useStatus":0,"verifyType":"barcode","FDOCUMENTSTATUS":"C","FAPPROVEDATE":"2024-09-28T14:00:04.34","invLength":0,"invWide":0,"invHeight":0}]}
totalCount:1

Process finished with exit code 0

说明为什么要用javascript脚本动态拉取?因为erp对接的规则可能经常要变动,而且erp拉取的数据需要经过转换,才能经常业务系统的接口推送到业务系统,用js做中间这层的拉取规则实现及数据转换非常合适,因为可以随时动态修改,而且不用部署马上就生效,java层面只需要实现对接webapi的标准功能就行了!

需要用到2个SDK的下载地址:金蝶云星空k3cloud-webapi对接的SDK:k3cloud-webapi-sdk.7.0.jar资源-CSDN文库

金蝶云星空k3cloud-webapi对接封装后的SDK,k3cloud-webapi-1.0-SNAPSHOT.jar资源-CSDN文库


原文地址:https://blog.csdn.net/LT_1029/article/details/143078426

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!