当前位置: 首页 > news >正文

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

  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转换成JSONObjectqueryResult = 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. 单元测试代码

@Testpublic 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:1Process 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文库


http://www.mrgr.cn/news/53807.html

相关文章:

  • windows下pycharm社区版2024下载与安装(包含新建第一个工程)
  • 一起搭WPF架构之LiveCharts.Wpf的简单了解与安装
  • VTK的学习方法-第一类型应用
  • Spring Boot配置文件不识别变量的解决方案
  • OpenAI GPT-o1实现方案记录与梳理
  • 每日OJ题_牛客_[NOIP2001]装箱问题_01背包_C++_Java
  • 【C++初阶】一文讲通默认成员函数~类和对象(中)
  • Java项目-基于springboot框架的社区疫情防控平台系统项目实战(附源码+文档)
  • 【MySQL】设置二进制日志文件自动过期,从根源上解决占满磁盘的问题:通过修改 binlog_expire_logs_seconds 配置项
  • 使用C语言实现一个任务调度系统
  • 现代数字信号处理I-P4 CRLB+LMMSE 学习笔记
  • Olap数据处理
  • 智慧社区Web平台:Spring Boot技术实现
  • 高级SQL技巧:掌握数据分析与优化的艺术
  • 自由学习记录(10)
  • 【win11】终端/命令提示符/powershell美化
  • ProteinMPNN中EncLayer类介绍
  • 软件设计的依赖反转原则
  • 这种V带的无极变速能用在新能源汽车上吧?
  • Python配合Yolov11开对象检测训练软件
  • 019_基于python+django食品销售数据分析系统2024_4032ydxt
  • SwanLab VSCode插件已发布,附使用教程
  • Spring Cloud Alibaba AI实践
  • YOLOv11改进策略【卷积层】| ECCV-2024 小波卷积WTConv 增大感受野,降低参数量计算量,独家创新助力涨点
  • 【软件测试】JUnit
  • 【瑞昱RTL8763E】py文件的执行