XlsModule.js 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501
  1. /**
  2. * xls配置表模块.
  3. * @author deden-configuration
  4. */
  5. var xls, isNode;
  6. var isEncrypt = false;
  7. (function (xls) {
  8. /** 是否已经初始化模块. */
  9. xls.hasInitialized = initConfig();
  10. /** 当前加载配置的国家语言. */
  11. xls.language = 'cn';
  12. /** 数据文件存储根目录url路径. */
  13. xls.rootPath = 'resource/excel/';
  14. /** 配置表ID是否全局唯一. */
  15. xls.isGlobal = false;
  16. /** 生成配置的时间戳. */
  17. xls.createTimestamp = 1469416418374;
  18. /** 索引表最后修改的时间戳. */
  19. xls.modificationTimestamp = 1469068861558;
  20. /** 自定义加载器. */
  21. xls.customLoader;
  22. /** 获取配置`模块表`列表. */
  23. xls.tables;
  24. /** 获取需要加载的配置项,包含`索引表`和`模块表`列表. */
  25. xls.requisites;
  26. /**
  27. * 初始化配置信息
  28. * @returns {boolean}
  29. */
  30. function initConfig() {
  31. /** 加载合并的Json大表 */
  32. xls.load = function (onFinishedCallBack) {
  33. getResByUrl('items', xls.rootPath + (xls.language ? '/' + xls.language : '') + '/items.json', function (bigJson, url) {
  34. //获取配置表队列
  35. var _tables = bigJson['tables'];
  36. xls.tables = _tables.slice();
  37. var _len = _tables.length;
  38. //初始化索引数据,获得合并列表数据表
  39. var i;
  40. var mergeList = [];
  41. xls.requisites = ['items'];
  42. for (i = 0; i < _len; i++) {
  43. if (bigJson[_tables[i]].merge){
  44. mergeList.push(_tables[i]);
  45. }else{
  46. xls.requisites.push(_tables[i]);
  47. }
  48. flush(bigJson, bigJson[_tables[i]]);
  49. }
  50. //获取表类别ID.
  51. var _getAttribute = function (tableId) {
  52. if (!bigJson['table_' + tableId]) {
  53. console.warn('ID为' + tableId + '的配置不存在!');
  54. return null;
  55. }
  56. return bigJson['table_' + tableId];
  57. };
  58. //通过子健获取独立的数据信息.
  59. var _getSubkeyItem = function (subfield, subkey, tableId) {
  60. if (tableId) {
  61. var table = xls[_getAttribute(tableId).name];
  62. if (table.hasLoaded) {
  63. return table.getSubkeyItem(subfield, subkey);
  64. }
  65. else {
  66. console.warn('配置表' + _getAttribute(tableId).name + '没有加载.');
  67. return null;
  68. }
  69. }
  70. else {
  71. console.warn('必须指定tableId值.');
  72. return null;
  73. }
  74. };
  75. //通过ID获取独立的数据信息.
  76. var _getItem = function (id, tableId) {
  77. if (tableId) {
  78. var table = xls[_getAttribute(tableId).name];
  79. if (table.hasLoaded) {
  80. return table.getItem(id);
  81. }
  82. else {
  83. console.warn('配置表' + _getAttribute(tableId).name + '没有加载.');
  84. return null;
  85. }
  86. }
  87. else {
  88. if (xls.isGlobal) {
  89. return bigJson[id];
  90. }
  91. else {
  92. console.warn('非全局ID打表模式必须指定tableId值.');
  93. return null;
  94. }
  95. }
  96. };
  97. //通过ID获取独立的数据信息.
  98. var _getItems = function (tableId) {
  99. var table = xls[_getAttribute(tableId).name];
  100. if (table.hasLoaded) {
  101. return table.getItems();
  102. }
  103. else {
  104. console.warn('配置表' + _getAttribute(tableId).name + '没有加载.');
  105. return null;
  106. }
  107. };
  108. xls.getSubkeyItem = _getSubkeyItem;
  109. xls.getItem = _getItem;
  110. xls.getItems = _getItems;
  111. xls.getAttribute = _getAttribute;
  112. //合并表初始化
  113. var _count = _len = mergeList.length;
  114. for (i = 0; i < _len; i++) {
  115. xls[mergeList[i]].load(function () {
  116. _count--;
  117. if (_count <= 0) {
  118. xls.hasInitialized = true;
  119. onFinishedCallBack(bigJson, url);
  120. }
  121. });
  122. }
  123. }, xls.modificationTimestamp);
  124. };
  125. /** 加载所有配置 */
  126. xls.loadAll = function (onFinishedCallBack) {
  127. xls.load(function (bigJson, url) {
  128. //获取配置表队列
  129. var _tables = bigJson['tables'];
  130. var list = _tables.slice();
  131. var loadSingleTable = function () {
  132. if (list.length) {
  133. xls[list.shift()].load(loadSingleTable);
  134. }
  135. else {
  136. if (onFinishedCallBack)
  137. onFinishedCallBack(bigJson, url);
  138. }
  139. };
  140. loadSingleTable();
  141. });
  142. };
  143. return false;
  144. }
  145. /**
  146. * 植入JSON数据
  147. * @param bigJson
  148. * @param obj
  149. */
  150. function flush(bigJson, obj, onFinishedCallBack, associateMultidimensional) {
  151. var url = xls.rootPath + '/' + (xls.language ? '/' + xls.language : '') + '/' + obj.name + '.json';
  152. url = url.replace(/\/\/+/g, '/');
  153. //给模块接口赋值
  154. var _attributes = xls[obj.name] || (xls[obj.name] = {});
  155. //关联多为表数据.
  156. var _flushMultidimensionalData = function (values, multidimensional, multidimensionalValues, onSubFinishedCallBack) {
  157. //映射表信息
  158. var tableInfo = multidimensional.table;
  159. //是否加载过
  160. if (_attributes.hasLoaded) {
  161. onSubFinishedCallBack(obj.values, url);
  162. return;
  163. }
  164. //创建子健对象
  165. var subkey = bigJson[tableInfo[0]].subkey || (bigJson[tableInfo[0]].subkey = {});
  166. var j, k, len, len2, subObj, key, defValues, value;
  167. switch (multidimensional.type) {
  168. case 'info':
  169. key = tableInfo[1];
  170. if (subkey[key]) {
  171. xls[tableInfo[0]].load(function () {
  172. if (multidimensional.split) {
  173. for (j = 0, len = values.length; j < len; j++) {
  174. subObj = values[j];
  175. defValues = subObj[multidimensional.field].split(multidimensional.split[0]); //分解数组
  176. var infoList = [];
  177. for (k = 0, len2 = defValues.length; k < len2; k++) {
  178. infoList.push(subkey[key][defValues[k]]);
  179. }
  180. subObj['$' + multidimensional.field] = infoList;
  181. }
  182. } else {
  183. for (j = 0, len = values.length; j < len; j++) {
  184. subObj = values[j];
  185. subObj['$' + multidimensional.field] = subkey[key][subObj[multidimensional.field]];
  186. }
  187. }
  188. onSubFinishedCallBack(obj.values, url);
  189. });
  190. }
  191. else {
  192. onSubFinishedCallBack(obj.values, url);
  193. }
  194. break;
  195. case 'definition':
  196. var l, len3;
  197. var definitionVlues = [];
  198. if (multidimensional.split) {
  199. for (j = 0, len = values.length; j < len; j++) {
  200. var definitionList = [];
  201. if (values[j][multidimensional.field]) {
  202. defValues = values[j][multidimensional.field].split(multidimensional.split[0]); //定义原始数据
  203. for (k = 0, len2 = defValues.length; k < len2; k++) {
  204. subObj = {};
  205. definitionList.push(subObj);
  206. var subValues = defValues[k].split(multidimensional.split[1]);
  207. var fields = multidimensionalValues.fields;
  208. var types = multidimensionalValues.types;
  209. for (l = 0, len3 = fields.length; l < len3; l++) {
  210. if (types[l] == 'string') {
  211. subObj[fields[l]] = subValues[l] || null;
  212. }
  213. else {
  214. subObj[fields[l]] = +subValues[l] || null;
  215. }
  216. }
  217. }
  218. }
  219. definitionVlues = definitionVlues.concat(definitionList);
  220. values[j][multidimensional.field] = definitionList;
  221. }
  222. }else{
  223. for (j = 0, len = values.length; j < len; j++) {
  224. if (values[j][multidimensional.field]) {
  225. subObj = {};
  226. var subValues = values[j][multidimensional.field].split(multidimensional.split[0]);
  227. var fields = multidimensionalValues.fields;
  228. var types = multidimensionalValues.types;
  229. for (l = 0, len3 = fields.length; l < len3; l++) {
  230. if (types[l] == 'string') {
  231. subObj[fields[l]] = subValues[l] || "";
  232. }
  233. else if (types[l].search(/^\s*(?:number|int|uint)\s*$/) != -1) {
  234. subObj[fields[l]] = subValues[l] || 0;
  235. }
  236. else {
  237. subObj[fields[l]] = +subValues[l] || null;
  238. }
  239. }
  240. definitionVlues.push(subObj);
  241. }
  242. values[j][multidimensional.field] = subObj;
  243. }
  244. }
  245. bigJson[tableInfo[0]].values = definitionVlues;
  246. flush(bigJson, bigJson[tableInfo[0]], function () {
  247. bigJson[tableInfo[0]].values.length = 0;
  248. onSubFinishedCallBack(obj.values, url);
  249. }, true);
  250. break;
  251. case 'link':
  252. key = tableInfo[1];
  253. if (subkey[key]) {
  254. xls[tableInfo[0]].load(function () {
  255. for (j = 0, len = values.length; j < len; j++) {
  256. subObj = values[j];
  257. if ((value = subkey[key][subObj[multidimensional.field]]) != null) {
  258. subObj[multidimensional.field] = value[tableInfo[2]] || null;
  259. }
  260. else {
  261. console.warn('配置表' + obj.name + ',' + multidimensional.field + '字段,值为(' + subObj[multidimensional.field] + ')的映射数据不存在.');
  262. subObj[multidimensional.field] = null;
  263. }
  264. }
  265. onSubFinishedCallBack(obj.values, url);
  266. });
  267. }
  268. else {
  269. onSubFinishedCallBack(obj.values, url);
  270. }
  271. break;
  272. }
  273. };
  274. //将数据信息个根据ID作为key索引到独立实例.
  275. var _flushData = function (callback, associate) {
  276. var values = obj.values;
  277. if (values) {
  278. var len2 = values.length;
  279. var j, k, key, htmlValue, len3, len4, element;
  280. var htmlList = obj.htmlField;
  281. var multidimensional = obj.multidimensional;
  282. var multidimensionalValues = obj.multidimensionalValues;
  283. var subObj = obj.subkey || (obj.subkey = {});
  284. if (htmlList) {
  285. len3 = htmlList.length;
  286. if (xls.isGlobal) {
  287. for (j = 0; j < len2; j++) {
  288. values[j].getTableId = _getTableId;
  289. bigJson[values[j].id] = values[j];
  290. for (key in subObj) {
  291. subObj[key][values[j][key]] = values[j];
  292. }
  293. for (k = 0; k < len3; k++) {
  294. htmlValue = values[j][htmlList[k]];
  295. if (htmlValue)
  296. values[j][htmlList[k]] = decodeHtml(htmlValue);
  297. }
  298. }
  299. }
  300. else {
  301. var data = obj['data'] = {};
  302. for (j = 0; j < len2; j++) {
  303. values[j].getTableId = _getTableId;
  304. data[values[j].id] = values[j];
  305. for (key in subObj) {
  306. subObj[key][values[j][key]] = values[j];
  307. }
  308. for (k = 0; k < len3; k++) {
  309. htmlValue = values[j][htmlList[k]];
  310. if (htmlValue)
  311. values[j][htmlList[k]] = decodeHtml(htmlValue);
  312. }
  313. }
  314. }
  315. }
  316. else {
  317. if (xls.isGlobal) {
  318. for (j = 0; j < len2; j++) {
  319. values[j].getTableId = _getTableId;
  320. bigJson[values[j].id] = values[j];
  321. for (key in subObj) {
  322. subObj[key][values[j][key]] = values[j];
  323. }
  324. }
  325. }
  326. else {
  327. var data = obj['data'] = {};
  328. for (j = 0; j < len2; j++) {
  329. values[j].getTableId = _getTableId;
  330. data[values[j].id] = values[j];
  331. for (key in subObj) {
  332. subObj[key][values[j][key]] = values[j];
  333. }
  334. }
  335. }
  336. }
  337. if (multidimensional && associate) {
  338. len4 = multidimensional.length;
  339. var _count = len4;
  340. for (j = 0; j < len4; j++) {
  341. {
  342. _flushMultidimensionalData(values, multidimensional[j], multidimensionalValues?multidimensionalValues[j]:"", function () {
  343. _count--;
  344. if (_count <= 0) {
  345. callback();
  346. }
  347. });
  348. }
  349. }
  350. }
  351. else {
  352. callback();
  353. }
  354. }
  355. };
  356. //获取表属性
  357. var _getAttribute = function () {
  358. return obj;
  359. };
  360. //通过子健获取实例项.
  361. var _getSubkeyItem = function (subfield, subkey) {
  362. var result = obj.subkey[subfield];
  363. if (!result) {
  364. console.warn('配置表' + obj.name + '中不存在子健为' + subfield + '的字段.');
  365. return null;
  366. }
  367. result = result[subkey];
  368. if (!result)
  369. console.warn('配置表' + obj.name + ',' + subfield + '列中不存在子健为' + subkey + '的数据项.');
  370. return result;
  371. };
  372. //通过ID获取实例项.
  373. var _getItem = function (id) {
  374. var result = xls.isGlobal ? bigJson[id] : obj.data && obj.data[id];
  375. if (!result)
  376. console.warn('配置表' + obj.name + '中不存在ID为' + id + '的数据项.');
  377. return result;
  378. };
  379. //获取实例队列.
  380. var _getItems = function () {
  381. return obj.values;
  382. };
  383. //获取表ID.
  384. var _getTableId = function () {
  385. return obj.id;
  386. };
  387. //加载子表
  388. var _load = function (onSubFinishedCallBack) {
  389. var _flushDataOnTableLoaded = function (data, url) {
  390. if(_attributes.hasLoaded){
  391. onSubFinishedCallBack(obj.values, url);
  392. return;
  393. }
  394. obj.values = data;
  395. _flushData(function () {
  396. _attributes.hasLoaded = true;
  397. onSubFinishedCallBack(data, url);
  398. }, true);
  399. }
  400. //外部子表加载完成,合并到大表中
  401. if (_attributes.hasLoaded) {
  402. if (isNode) {
  403. onSubFinishedCallBack(obj.values, url);
  404. } else {
  405. egret.callLater(onSubFinishedCallBack, this, obj.values, url);
  406. }
  407. }
  408. else if (obj.merge) {
  409. if (isNode) {
  410. _flushDataOnTableLoaded(obj.values, url);
  411. } else {
  412. egret.callLater(_flushDataOnTableLoaded, this, obj.values, url);
  413. }
  414. }
  415. else {
  416. getResByUrl(_attributes.getAttribute().name, url, _flushDataOnTableLoaded, obj.modification);
  417. }
  418. };
  419. //给模块接口赋值
  420. _attributes.hasLoaded = false;
  421. _attributes.load = _load;
  422. _attributes.getAttribute = _getAttribute;
  423. _attributes.getItem = _getItem;
  424. _attributes.getSubkeyItem = _getSubkeyItem;
  425. _attributes.getItems = _getItems;
  426. bigJson['table_' + obj.id] = obj;
  427. if (associateMultidimensional) {
  428. _flushData(function () {
  429. onFinishedCallBack(obj.values, url);
  430. }, true);
  431. }
  432. }
  433. //加载顺序列表
  434. var sortLoadList = [];
  435. //是否在加载中
  436. var isLoading = false;
  437. /**
  438. * 载入配置文件的加载器,可设置自定义加载器.
  439. */
  440. function getResByUrl(table, url, compFunc, modification) {
  441. if (isLoading) {
  442. sortLoadList.push([table, url, compFunc, modification]);
  443. return;
  444. }
  445. isLoading = true;
  446. var cb = function (data) {
  447. isLoading = false;
  448. compFunc(data, url);
  449. if (sortLoadList.length) getResByUrl.apply(this, sortLoadList.shift());
  450. }
  451. if (table != 'items' && xls[table].hasLoaded){
  452. cb(xls[table].getItems(), url);
  453. return;
  454. }
  455. if (xls.customLoader) {
  456. xls.customLoader(isNode, isEncrypt, modification, table, url, cb);
  457. } else {
  458. if (isNode) {
  459. cb(require(url), url);
  460. } else {
  461. RES.getResByUrl(url + "?v=" + modification, cb, this, RES.ResourceItem.TYPE_JSON);
  462. }
  463. }
  464. }
  465. /** 解码带html支持的配置表 */
  466. function decodeHtml(str) {
  467. var reg = /&lt;|&gt;|&amp;|&apos;|&quot;/g;
  468. return str.replace(reg, function (marchStr, replaceStr) {
  469. switch (marchStr) {
  470. case "&lt;":
  471. return "<";
  472. case "&gt;":
  473. return ">";
  474. case "&amp;":
  475. return "&";
  476. case "&apos;":
  477. return "’";
  478. case "&quot;":
  479. return "\"";
  480. }
  481. return marchStr;
  482. });
  483. }
  484. })(xls || (xls = {}));
  485. /** 兼容nodejs的判断语句. */
  486. try{
  487. if (require && module && require("child_process")) {
  488. isNode = true;
  489. if (xls.rootPath.indexOf(":") == -1 && xls.rootPath.indexOf("./") != 0) {
  490. xls.rootPath = "./" + xls.rootPath;
  491. xls.rootPath = xls.rootPath.replace(/\/\/+/g, '/');
  492. }
  493. module.exports = global.xls = xls;
  494. }
  495. }catch(e){};