tool-list.js 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228
  1. import request from '../../../src/tools/request';
  2. import {
  3. isTypeof,
  4. isArrayInnerValue,
  5. objectMerge,
  6. axiosReqParams,
  7. responseKeyToValue,
  8. responseNodeParseList,
  9. parseRequestParams,
  10. mergeRequestParams
  11. } from '../../../src/tools/utils';
  12. //弹出宽显示按钮
  13. const btnList = function (number, type = 'submit') {
  14. let tmpNumber = number
  15. const defaultList = {
  16. iShow: true,
  17. list: []
  18. }
  19. if (isTypeof(number) === 'undefined') {
  20. tmpNumber = 3 // 3为全部按钮
  21. }
  22. if ((tmpNumber & 1) === 1) {
  23. defaultList.list.push({ label: '取消', type: 'close', bType: 'info', icon: 'el-icon-close' })
  24. }
  25. if ((tmpNumber & 2) === 2) {
  26. defaultList.list.push({ label: '确认', type: type, bType: 'primary', icon: 'el-icon-check' })
  27. }
  28. return defaultList
  29. };
  30. //根据key获取row的值
  31. let getFieldToValue = function (row, field) {
  32. let res = '';
  33. if (isTypeof(row) === 'array') {
  34. let vals = [];
  35. row.forEach(item => {
  36. vals.push(item[field]);
  37. });
  38. res = vals.join(',');
  39. } else {
  40. res = row[field];
  41. }
  42. return res;
  43. }
  44. //整理代码
  45. export function initVueData(tag) {
  46. let options = {},
  47. option = {
  48. keys: 1,
  49. row: {},
  50. finds: {},
  51. order: {},
  52. where: {},
  53. tableData: [],
  54. loading: true,
  55. tableName: tag,
  56. checkboxVal: [],
  57. showColumns: [],
  58. columnOptions: [],
  59. tableListResponse: null,
  60. dialogDelTableVisible: false,
  61. dialogEditTableVisible: false,
  62. dialogExecTableVisible: false,
  63. loadTableTreeNodeMap: new Map(),
  64. add_edit_dialog: '80%',
  65. del_dialog: '40%',
  66. labelPosition: 'left',
  67. inputType: 'show',
  68. pages: {
  69. pageSize: 10, //默认每页的数据量
  70. currentPage: 1, //当前页码
  71. pageNum: 1, //查询的页码
  72. totalCount: 0,
  73. pageSizes: [10, 30, 50, 100],
  74. style: 'text-align: center;',
  75. layout: 'total, sizes, prev, pager, next, jumper'
  76. },
  77. //操作按钮
  78. //buttonsList: [],
  79. //list请求的默认参数
  80. /*queryParam: [
  81. {
  82. type: 1,
  83. key: 'page',
  84. value: 'pageNum'
  85. },{
  86. type: 1,
  87. key: 'size',
  88. value: 'pageSize'
  89. }
  90. ],*/
  91. //操作删除校验规则
  92. /*optRules: {
  93. isRules: true,
  94. method: 'post',
  95. url: '/scnInfo/pageList',
  96. params: {
  97. busCode: getFieldToValue,
  98. pageNum: 1,
  99. pageSize: 10
  100. },
  101. message: '该记录在数据中有关联,请先删除关联数据!'
  102. },*/
  103. //dialog按钮操作
  104. //dialogFooter: {},
  105. //composeParam: ['id'],//删除字段主键
  106. queryURL: {
  107. del: {
  108. url: '',
  109. method: 'get',
  110. name: 'companyName'
  111. },
  112. add: {
  113. url: '',
  114. method: 'post'
  115. },
  116. edit: {
  117. url: '',
  118. method: 'post'
  119. },
  120. list: {
  121. url: '',
  122. method: 'post',
  123. parse: {
  124. tableData: ['data', 'data'],
  125. totalCount: ['data', 'total']
  126. }
  127. },
  128. name: '默认'
  129. },
  130. /*axios: {
  131. timeout: 5000,
  132. headers: {}
  133. }*/
  134. };
  135. Object.assign(options, option);
  136. if (arguments.length > 1) {
  137. options = objectMerge(options, arguments[1]());
  138. }
  139. return options;
  140. };
  141. export function messageFun(message, type, time) {
  142. message = message ? message : '错误';
  143. time = time ? time : 3000;
  144. type = type ? type : 'success';
  145. Message({
  146. message: message,
  147. type: type,
  148. duration: time
  149. });
  150. }
  151. //table全局操作事件
  152. export function utilBtnEventList(obj, btnObj) {
  153. if (isTypeof(btnObj) === 'string') {
  154. tableEventList(obj, btnObj, {}, 'all');
  155. } else if (isTypeof(btnObj) === 'object') {
  156. if (btnObj.hasOwnProperty('event')) {
  157. tableEventList(obj, btnObj, {}, 'all');
  158. } else {
  159. updateShowColumns(obj, btnObj);
  160. }
  161. } else {
  162. messageFun('按钮事件方法未处理,请确认。', 'error', 3000);
  163. }
  164. }
  165. //table表中的操作请求入口
  166. export function unitTableAllEvent(obj, args) {
  167. let row = args[0] || {},
  168. btnObj = args[1] || '';
  169. if (isTypeof(btnObj) === 'object') {
  170. btnObj.event = btnObj.type || '';
  171. }
  172. tableEventList(obj, btnObj, row, 'only');
  173. }
  174. //事件处理机制
  175. export function tableEventList(obj, btnObj, row, opType = 'only') {
  176. const type = btnObj.event;
  177. obj.currEventObj = btnObj;
  178. obj.url = obj.queryURL[type] && obj.queryURL[type].url;
  179. obj.method = obj.queryURL[type] && obj.queryURL[type].method;
  180. obj.autoParams = obj.queryURL[type] && obj.queryURL[type].params;
  181. obj.autoMethodType = obj.queryURL[type] && obj.queryURL[type].methodType;
  182. obj.demandList = obj.queryURL[type] && obj.queryURL[type].demandList ? obj.queryURL[type].demandList : null;
  183. obj.currAxios = obj.queryURL[type] && obj.queryURL[type].axios ? Object.assign({}, obj.axios, obj.queryURL[type].axios) : obj.axios;
  184. obj.inputType = 'show';
  185. obj.add_edit_dialog = obj.queryURL[type] && obj.queryURL[type].width ? obj.queryURL[type].width : '80%';
  186. switch (type) {
  187. case 'add':
  188. unitAddCellData(obj);
  189. break;
  190. case 'delAll':
  191. if (obj.queryURL[type]) {
  192. if (obj.queryURL['del'] && isTypeof(obj.queryURL['del']) === 'object') {
  193. for (let [k, v] of Object.entries(obj.queryURL['del'])) {
  194. if (!obj.queryURL[type].hasOwnProperty(k)) {
  195. obj.queryURL[type][k] = v;
  196. }
  197. }
  198. }
  199. } else {
  200. obj.queryURL[type] = Object.assign({}, obj.queryURL['del']);
  201. }
  202. obj.url = obj.url || (obj.queryURL['del'] && obj.queryURL['del'].url ? obj.queryURL['del'].url : '');
  203. if (obj.url) {
  204. unitDelAllCell(obj, type);
  205. } else {
  206. obj.$message.error('请在queryURL中配置del参数!')
  207. }
  208. break;
  209. case "edit":
  210. let rowType = obj.queryURL[type] && obj.queryURL[type].rowType ? obj.queryURL[type].rowType : false;
  211. if (rowType) {
  212. if (obj.queryURL && obj.queryURL['byid']) {
  213. unitEditRowDataById(obj, row);
  214. } else {
  215. obj.$message.error('请在queryURL中配置byid参数!')
  216. }
  217. } else {
  218. unitEditCellData(obj, row);
  219. }
  220. break;
  221. case "detail":
  222. obj.inputType = 'detail';
  223. // 自定义操作
  224. if (btnObj.custom) {
  225. obj.$emit('onListEvent', type, row);//自定义事件
  226. break
  227. }
  228. if (obj.queryURL['detail']) {
  229. unitDetailRowDataById(obj, row);
  230. } else {
  231. unitDetailCellData(obj, row);
  232. }
  233. break;
  234. case "del":
  235. if (obj.queryURL[type]) {
  236. unitRemoveCellData(obj, type, row);
  237. } else {
  238. obj.$message.error('请在queryURL中配置del参数!')
  239. }
  240. break;
  241. default:
  242. if (type !== 'list' && type !== 'byid' && obj.queryURL.hasOwnProperty(type)) {
  243. obj.inputType = type;
  244. if (opType == 'all') {
  245. const currCheckedList = unitGetCheckedList(obj);
  246. if (currCheckedList.length > 0) {
  247. if (isTypeof(obj.queryURL[type].only) === 'number') {
  248. if (obj.queryURL[type].only > 0 && currCheckedList.length !== obj.queryURL[type].only) {
  249. obj.$message.error('该操作只允许选择' + obj.queryURL[type].only + '条记录!');
  250. return false;
  251. }
  252. } else if (obj.queryURL[type].only && currCheckedList.length > 1) { // 只允许选择一行
  253. obj.$message.error('该操作只允许选择一条记录!');
  254. return false;
  255. }
  256. row = obj.queryURL[type].only ? currCheckedList[0] : currCheckedList;
  257. } else {
  258. // required默认值为true,required为false不需要传值
  259. if (!obj.queryURL[type].hasOwnProperty('required')
  260. || (obj.queryURL[type].hasOwnProperty('required') && obj.queryURL[type].required)) {
  261. obj.$message.error('请您至少选择一条操作记录!');
  262. return false;
  263. }
  264. }
  265. }
  266. if (obj.queryURL[type].hasOwnProperty('query') && isTypeof(obj.queryURL[type].query) === 'object') {
  267. unitOtherOptRowDataById(obj, type, row)
  268. } else {
  269. let tmpRow = row;
  270. if (obj.queryURL[type].hasOwnProperty('emit') && obj.queryURL[type].emit) {
  271. tmpRow = emitOnDataRow(obj, type, row) || row;
  272. }
  273. unitOtherOptCellData(obj, type, tmpRow);
  274. }
  275. } else {
  276. if (obj.$listeners && !obj.$listeners.onListEvent) {
  277. console.error('未定义emit方法:onListEvent, ' + type)
  278. }
  279. obj.$emit('onListEvent', type, row, btnObj);//自定义事件
  280. }
  281. }
  282. }
  283. //选择显示的项
  284. function updateShowColumns(obj, currList) {
  285. obj.showColumns = currList.showColumns;
  286. obj.keys = currList.keys;
  287. }
  288. export function actionBtnList(obj, type) {
  289. const dialogFooter = obj.dialogFooter || {}
  290. const btnDefaultList = btnList(3)
  291. if (dialogFooter.hasOwnProperty('list')) {
  292. let list = [],
  293. res = Object.assign({}, dialogFooter);
  294. res.type = type;
  295. res.btnObj = obj.currEventObj;
  296. if (dialogFooter.isMerge) {
  297. Array.prototype.push.apply(list, dialogFooter.list);
  298. Array.prototype.push.apply(list, btnDefaultList.list);
  299. res.list = list;
  300. }
  301. return res;
  302. } else {
  303. btnDefaultList.type = type;
  304. btnDefaultList.btnObj = obj.currEventObj;
  305. return btnDefaultList;
  306. }
  307. }
  308. export function unitAddCellData(obj) {
  309. var _obj = {};
  310. _obj._btn = actionBtnList(obj, 'add');
  311. _obj._title = (obj.queryURL.add && obj.queryURL.add.title) ? obj.queryURL.add.title : ("增加" + obj.queryURL.name);
  312. _obj._url = obj.url;
  313. _obj._method = obj.method;
  314. _obj._axios = obj.axios;
  315. _obj._params = obj.autoParams;
  316. _obj.methodType = obj.autoMethodType;
  317. obj.row = _obj;
  318. unitIsDemandSelectList(obj);
  319. obj.dialogDelTableVisible = false;
  320. obj.dialogEditTableVisible = true;
  321. }
  322. export function unitRowObjectMerge(item, row) {
  323. if (item.concat && isTypeof(item.concat) === 'array') {
  324. let tmpData = {};
  325. item.concat.forEach(key => {
  326. if (row[key] && isTypeof(row[key]) === 'object') {
  327. tmpData = Object.assign(tmpData, row[key])
  328. }
  329. })
  330. return tmpData || {};
  331. }
  332. return row || {};
  333. }
  334. // 其他请求方式获取编辑记录
  335. export function unitOtherOptRowDataById(obj, type, row) {
  336. let queryData = {},
  337. item = obj.queryURL[type].query,
  338. key = item && item.key ? item.key : 'id',
  339. value = item && item.value ? item.value : key,
  340. axios = item && item.axios ? item.axios : obj.axios;
  341. if (item.params) {
  342. parseRequestParams(item.params, row, queryData);
  343. } else {
  344. queryData[key] = row[value];
  345. }
  346. request(axiosReqParams(item, mergeRequestParams(queryData, obj._publicParams), axios, obj.options)).then((response) => {
  347. let rowData = row,
  348. next = { keyType: 'result' };
  349. if (responseKeyToValue(response, obj, obj, next)) {
  350. const tmpData = responseNodeParseList(response, item.parse, 'object')
  351. if (item.hasOwnProperty('mergeList')) {
  352. if (isTypeof(item.mergeList) === 'array') {
  353. item.mergeList.forEach(itemKey => {
  354. rowData[itemKey] = tmpData[itemKey];
  355. })
  356. } else if (isTypeof(item.mergeList) === 'object') {
  357. for (let [kk, vv] of Object.entries(item.mergeList)) {
  358. rowData[kk] = tmpData[vv];
  359. }
  360. } else {
  361. rowData = Object.assign({}, row, tmpData);
  362. }
  363. } else {
  364. rowData = Object.assign({}, row, tmpData);
  365. }
  366. }
  367. unitOtherOptCellData(obj, type, unitRowObjectMerge(item, rowData));
  368. }).catch((err) => {
  369. unitOtherOptCellData(obj, type, unitRowObjectMerge(item, row));
  370. });
  371. }
  372. // 通过byid获取row数据
  373. export function unitEditRowDataById(obj, row) {
  374. let queryData = {},
  375. item = obj.queryURL['byid'],
  376. key = item && item.key ? item.key : 'id',
  377. value = item && item.value ? item.value : key,
  378. axios = item && item.axios ? item.axios : obj.axios;
  379. if (item.params) {
  380. parseRequestParams(item.params, row, queryData);
  381. } else {
  382. queryData[key] = row[value];
  383. }
  384. request(axiosReqParams(item, mergeRequestParams(queryData, obj._publicParams), axios, obj.options)).then((response) => {
  385. let rowData = row,
  386. next = { keyType: 'result' };
  387. if (responseKeyToValue(response, obj, obj, next)) {
  388. const tmpData = responseNodeParseList(response, item.parse, 'object')
  389. // 数据是否合并
  390. if (item.hasOwnProperty('mergeList')) {
  391. if (isTypeof(item.mergeList) === 'array') {
  392. item.mergeList.forEach(itemKey => {
  393. rowData[itemKey] = tmpData[itemKey];
  394. })
  395. } else if (isTypeof(item.mergeList) === 'object') {
  396. for (let [kk, vv] of Object.entries(item.mergeList)) {
  397. rowData[kk] = tmpData[vv];
  398. }
  399. } else {
  400. rowData = Object.assign({}, row, tmpData);
  401. }
  402. } else {
  403. rowData = Object.assign({}, row, tmpData);
  404. }
  405. }
  406. unitEditCellData(obj, unitRowObjectMerge(item, rowData));
  407. }).catch((err) => {
  408. unitEditCellData(obj, unitRowObjectMerge(item, row));
  409. });
  410. }
  411. export function unitEditCellData(obj, row) {
  412. let editObj = obj.queryURL.edit,
  413. oldRow = Object.assign({}, row);
  414. obj.row = row;
  415. obj.row._oldData = oldRow;
  416. obj.row._btn = actionBtnList(obj, 'edit');
  417. obj.row._title = (editObj && editObj.title) ? (isTypeof(editObj.title) === 'function' ? editObj.title(row, obj) : editObj.title) : ("编辑" + obj.queryURL.name);
  418. obj.row._url = obj.url;
  419. obj.row._method = obj.method;
  420. obj.row._axios = obj.currAxios;
  421. obj.row._params = obj.autoParams;
  422. obj.row.methodType = obj.autoMethodType;
  423. unitIsDemandSelectList(obj);
  424. obj.dialogDelTableVisible = false;
  425. obj.dialogEditTableVisible = true;
  426. }
  427. export function unitOtherOptCellData(obj, type, row) {
  428. let objType = obj.queryURL[type] || {},
  429. oldRow = Object.assign({}, row),
  430. tmpBtnList = {
  431. currEventObj: obj.currEventObj,
  432. dialogFooter: btnList(objType.btnStatus || 3, type)
  433. };
  434. obj.row = unitOtherOptParams(obj, type, row);
  435. obj.row._oldData = oldRow;
  436. obj.row._btn = actionBtnList(tmpBtnList, type);
  437. obj.row._title = (objType && objType.title) ? (isTypeof(objType.title) === 'function' ? objType.title(row, obj) : objType.title) : (obj.queryURL.name);
  438. obj.row._url = obj.url;
  439. obj.row._method = obj.method;
  440. obj.row._axios = obj.currAxios;
  441. obj.row.methodType = obj.autoMethodType;
  442. unitIsDemandSelectList(obj);
  443. obj.dialogDelTableVisible = objType.isForm ? false : true;
  444. obj.dialogEditTableVisible = objType.isForm ? true : false;
  445. }
  446. export function unitExtendData(obj, item, _axios, row) {
  447. if (isTypeof(item) === 'object' && item.extendLabel && isTypeof(item.extendLabel) === 'array') {
  448. let queryData = {},
  449. key = item.key ? item.key : 'id',
  450. value = item.value ? item.value : key,
  451. axios = item.axios ? item.axios : _axios;
  452. if (item.params) {
  453. parseRequestParams(item.params, row, queryData);
  454. } else {
  455. queryData[key] = row[value];
  456. }
  457. request(axiosReqParams(item, mergeRequestParams(queryData, obj._publicParams), axios, obj.options)).then((response) => {
  458. let rowData = row || {},
  459. next = { keyType: 'result' };
  460. if (responseKeyToValue(response, obj, obj, next)) {
  461. rowData = responseNodeParseList(response, item.parse, 'object')
  462. }
  463. item.extendLabel.forEach(ext => {
  464. row[ext.label] = isTypeof(rowData[ext.key]) === 'undefined' ? '' : rowData[ext.key]
  465. })
  466. unitDetailCellData(obj, unitRowObjectMerge(item, row));
  467. }).catch((err) => {
  468. unitDetailCellData(obj, unitRowObjectMerge(item, row));
  469. });
  470. } else {
  471. unitDetailCellData(obj, unitRowObjectMerge(item, row));
  472. }
  473. }
  474. export function unitDetailRowDataById(obj, row) {
  475. let queryData = {},
  476. item = obj.queryURL['detail'],
  477. key = item && item.key ? item.key : 'id',
  478. value = item && item.value ? item.value : key,
  479. axios = item && item.axios ? item.axios : obj.axios;
  480. if (item.url) {
  481. if (item.params) {
  482. parseRequestParams(item.params, row, queryData);
  483. } else {
  484. queryData[key] = row[value];
  485. }
  486. request(axiosReqParams(item, mergeRequestParams(queryData, obj._publicParams), axios, obj.options)).then((response) => {
  487. let rowData = row,
  488. next = { keyType: 'result' };
  489. if (responseKeyToValue(response, obj, obj, next)) {
  490. rowData = responseNodeParseList(response, item.parse, 'object')
  491. }
  492. if (item.extend) {
  493. unitExtendData(obj, item.extend, axios, unitRowObjectMerge(item, rowData));
  494. } else {
  495. unitDetailCellData(obj, unitRowObjectMerge(item, rowData));
  496. }
  497. }).catch((err) => {
  498. if (item.extend) {
  499. unitExtendData(obj, item.extend, axios, unitRowObjectMerge(item, row));
  500. } else {
  501. unitDetailCellData(obj, unitRowObjectMerge(item, row));
  502. }
  503. });
  504. } else {
  505. if (item.extend) {
  506. unitExtendData(obj, item.extend, axios, unitRowObjectMerge(item, row));
  507. } else {
  508. unitDetailCellData(obj, unitRowObjectMerge(item, row));
  509. }
  510. }
  511. }
  512. export function unitDetailCellData(obj, row) {
  513. let tmpBtnList = {
  514. currEventObj: obj.currEventObj,
  515. dialogFooter: btnList(1)
  516. }
  517. obj.row = row;
  518. obj.row._btn = actionBtnList(tmpBtnList, 'detail');
  519. obj.row._title = (obj.queryURL.detail && obj.queryURL.detail.title) ? (isTypeof(obj.queryURL.detail.title) === 'function' ? obj.queryURL.detail.title(row, obj) : obj.queryURL.detail.title) : (obj.queryURL.name + "详情");
  520. unitIsDemandSelectList(obj);
  521. obj.dialogDelTableVisible = false;
  522. obj.dialogEditTableVisible = true;
  523. }
  524. // 批量操作参数配置
  525. export function unitBatchOperateData(obj, queryItem, row) {
  526. let namesList = [], pData = [],
  527. tmpRow = isTypeof(row) === 'array' ? Object.assign({}, { selectRowList: row }) : Object.assign({}, row),
  528. fields = obj.composeParam && obj.composeParam.length > 0 ? obj.composeParam : ['id'],
  529. dataItem = function (props, rowData) {
  530. let data = {};
  531. if (props) { // props参数存在
  532. for (let [k, v] of Object.entries(props)) {
  533. data[k] = rowData[v] !== '' ? rowData[v] : '';
  534. }
  535. } else { // 没有设置参数时,使用组件自定制主键
  536. fields.forEach(item => {
  537. data[item] = rowData[item] !== '' ? rowData[item] : '';
  538. })
  539. }
  540. return data;
  541. },
  542. optNameList = function (item, name) {
  543. if (isTypeof(name) === 'array') {
  544. const names = [];
  545. name.forEach(itemName => {
  546. names.push(item[itemName]);
  547. })
  548. return names.join('&');
  549. } else {
  550. return item[name];
  551. }
  552. },
  553. queryDataType = function (key, data, item) {
  554. let resData, tmpData = [...new Set(data)];
  555. if (item.hasOwnProperty('dataType')) { // 数据类型传递
  556. if (isTypeof(item.dataType) === 'object') {
  557. if (item.dataType.hasOwnProperty(key)) {
  558. if (item.dataType[key] === 'array') {
  559. resData = tmpData;
  560. } else if (item.dataType[key] === 'jsonstring') {
  561. resData = JSON.stringify(tmpData);
  562. } else if (item.dataType[key] === 'object') {
  563. resData = tmpData.length === 1 ? (tmpData[0] || null) : tmpData
  564. } else if (item.dataType[key] === 'number') {
  565. resData = tmpData.length === 1 ? Number(tmpData[0]) : tmpData
  566. }
  567. } else {
  568. resData = tmpData.join(',');
  569. }
  570. } else {
  571. if (item.dataType === 'array') {
  572. resData = tmpData;
  573. } else if (item.dataType === 'jsonstring') {
  574. resData = JSON.stringify(tmpData);
  575. } else if (item.dataType[key] === 'object') {
  576. resData = tmpData.length === 1 ? (tmpData[0] || null) : tmpData
  577. } else if (item.dataType[key] === 'number') {
  578. resData = tmpData.length === 1 ? Number(tmpData[0]) : tmpData
  579. }
  580. }
  581. } else { // 字符串传参
  582. resData = tmpData.join(',');
  583. }
  584. return resData;
  585. };
  586. tmpRow._params = {};
  587. //method 模式
  588. tmpRow._params.method = queryItem['method'];
  589. // 配置title
  590. if (isTypeof(queryItem.title) === 'array') {
  591. if (tmpRow.hasOwnProperty('hasChildren') && tmpRow.hasChildren) {
  592. tmpRow._title = queryItem.title[0] ? queryItem.title[0] : (obj.queryURL.name);
  593. } else {
  594. tmpRow._title = queryItem.title[1] ? queryItem.title[1] : (obj.queryURL.name);
  595. }
  596. } else {
  597. tmpRow._title = queryItem.title ? queryItem.title : (obj.queryURL.name);
  598. }
  599. // 删除参数提取和删除名称提示
  600. if (tmpRow.hasOwnProperty('selectRowList') && isTypeof(tmpRow.selectRowList) === 'array') {
  601. tmpRow.selectRowList.forEach(item => {
  602. namesList.push(optNameList(item, queryItem.name));
  603. pData.push(dataItem(queryItem.props, item));
  604. });
  605. } else if (isTypeof(tmpRow) === 'object') {
  606. namesList.push(optNameList(tmpRow, queryItem.name));
  607. pData.push(dataItem(queryItem.props, tmpRow));
  608. }
  609. //提交参数 pData为参数数组
  610. tmpRow._params.data = {};
  611. if (queryItem.hasOwnProperty('isprops') && queryItem.isprops) { // 参数数组整体传
  612. tmpRow._params.data[fields[0]] = queryDataType(fields[0], pData, queryItem);// 参数类型
  613. } else { // 遍历pData分开传,相同key需要合并
  614. pData.forEach(item => {
  615. for (let [kk, vv] of Object.entries(item)) {
  616. if (tmpRow._params.data.hasOwnProperty(kk) && isTypeof(tmpRow._params.data[kk]) === 'array') {
  617. tmpRow._params.data[kk].push(vv);
  618. } else {
  619. tmpRow._params.data[kk] = [vv];
  620. }
  621. }
  622. })
  623. for (let [k, v] of Object.entries(tmpRow._params.data)) {
  624. tmpRow._params.data[k] = queryDataType(k, v, queryItem);
  625. }
  626. }
  627. // 操作的记录总数
  628. if (queryItem.hasOwnProperty('optNumber') && isTypeof(queryItem.optNumber) === 'string') {
  629. tmpRow._params.data[queryItem.optNumber] = namesList.length
  630. }
  631. // 自带固定参数
  632. if (queryItem.hasOwnProperty('params') && queryItem.params) { // 参数数组整体传
  633. for (let [k, v] of Object.entries(queryItem.params)) {
  634. tmpRow._params.data[k] = v;
  635. }
  636. }
  637. tmpRow.optNameList = namesList
  638. return tmpRow;
  639. }
  640. //删除提示内容显示
  641. export function unitDelParams(obj, type, row) {
  642. const queryItem = obj.queryURL && obj.queryURL.hasOwnProperty(type) ? obj.queryURL[type] : (obj.queryURL['del'] || {});
  643. const tmpRow = unitBatchOperateData(obj, queryItem, row);
  644. const nameString = Array.isArray(tmpRow.optNameList) ? tmpRow.optNameList.join(',') : '';
  645. //删除提示
  646. tmpRow._optMessage = queryItem.info ? queryItem.info : '确定删除【' + nameString + '】记录。';
  647. tmpRow._rules = actionDelRules(obj.optRules, tmpRow);//删除前判断的规则
  648. return tmpRow;
  649. }
  650. // 其他批量操作
  651. export function unitOtherOptParams(obj, type, row) {
  652. const queryItem = obj.queryURL && obj.queryURL.hasOwnProperty(type) ? obj.queryURL[type] : {};
  653. const tmpRow = unitBatchOperateData(obj, queryItem, row);
  654. const nameString = Array.isArray(tmpRow.optNameList) ? tmpRow.optNameList.join(',') : '';
  655. //提示
  656. tmpRow._optMessage = queryItem.info ? queryItem.info : '确定操作【' + nameString + '】记录。';
  657. return tmpRow;
  658. }
  659. //删除时加载删除规则
  660. export function actionDelRules(optRules, row) {
  661. if (optRules) {
  662. let res = Object.create(optRules);
  663. if (res.params) {
  664. let param = {};
  665. for (let [k, v] of Object.entries(res.params)) {
  666. if (isTypeof(v) === 'function') {
  667. param[k] = v(row, k);
  668. } else {
  669. param[k] = v;
  670. }
  671. }
  672. res.params = param;
  673. }
  674. return res;
  675. } else {
  676. return {
  677. isRules: false
  678. }
  679. }
  680. }
  681. export function unitRemoveCellData(obj, type, row) {
  682. obj.row = unitDelParams(obj, type, row);
  683. obj.row._btn = "确认";
  684. obj.row._btntype = 'del';
  685. obj.row._url = obj.url;
  686. obj.row._method = obj.method;
  687. obj.row._axios = obj.axios;
  688. obj.row._optType = 'del';
  689. obj.row.methodType = obj.autoMethodType;
  690. unitIsDemandSelectList(obj);
  691. obj.dialogDelTableVisible = true;
  692. obj.dialogEditTableVisible = false;
  693. }
  694. // 是否按需加载select列表
  695. export function unitIsDemandSelectList(obj) {
  696. if (obj.demandList && isTypeof(obj.demandList) === 'array') {
  697. unitInitSelectList(obj, obj.demandList)
  698. }
  699. }
  700. // 获取listType类型,这里只提供一个
  701. function unitGetCurrListTypeValue(obj) {
  702. let listType = 'table';
  703. if (isTypeof(obj.listType) === 'string') {
  704. listType = obj.listType;
  705. } else if (isTypeof(obj.listType) === 'array') {
  706. listType = obj.listType[0];
  707. }
  708. return listType;
  709. }
  710. // 或许选中的记录list
  711. function unitGetCheckedList(obj) {
  712. const list = [];
  713. const listType = unitGetCurrListTypeValue(obj);
  714. // list数组中插入选中的记录
  715. if (listType === 'table') {
  716. if (obj.multipleSelection && obj.multipleSelection.length > 0) {
  717. obj.multipleSelection.forEach(item => {
  718. list.push(item);
  719. });
  720. }
  721. } else if (listType === 'card') {
  722. obj.tableData.forEach(item => {
  723. if (item.cardChecked) {
  724. list.push(item);
  725. }
  726. })
  727. }
  728. return list;
  729. }
  730. export function unitDelAllCell(obj, type) {
  731. const list = unitGetCheckedList(obj);
  732. if (list.length > 0) {
  733. unitRemoveCellData(obj, type, list);
  734. } else {
  735. obj.$message({
  736. message: '请您至少选择一条删除记录!',
  737. type: 'error'
  738. });
  739. }
  740. }
  741. // emit获取参数,在页面中设置
  742. export function emitOnDataRow(obj, type, row) {
  743. let res = null;
  744. if (obj.$listeners && !obj.$listeners.emitOnDataRow) {
  745. console.error('未定义emit方法:emitOnDataRow, ' + type);
  746. return res;
  747. }
  748. obj.$emit('emitOnDataRow', type, obj, row, function (pRes) {
  749. res = pRes;
  750. });
  751. return res;
  752. }
  753. // emit获取当前记录信息
  754. export function emitOnReqParams(obj, type) {
  755. let res = null;
  756. if (obj.$listeners && !obj.$listeners.onReqParams) {
  757. console.error('未定义emit方法:onReqParams, ' + type);
  758. return res;
  759. }
  760. obj.$emit('onReqParams', type, obj, function (pRes) {
  761. res = pRes;
  762. });
  763. return res;
  764. }
  765. export function getQueryParams(obj, isFindList) {
  766. let res = {},
  767. findKey = '';
  768. Array.isArray(obj.queryParam) && obj.queryParam.forEach(item => {
  769. switch (item.type) {
  770. case 1:
  771. if ((obj.page_status & 8) == 8) {
  772. res[item.key] = obj.pages[item.value];
  773. }
  774. break;
  775. case 2:
  776. findKey = item.key;
  777. if (isTypeof(item.value) === 'object') {
  778. res[item.key] = objectMerge({}, item.value);
  779. } else {
  780. res[item.key] = item.value;
  781. }
  782. break;
  783. case 3:
  784. let defaultParams = true;
  785. if (isTypeof(obj.finds) == 'object' && obj.finds.hasOwnProperty(item.key) && obj.finds[item.key] === '') {
  786. defaultParams = false;
  787. }
  788. if (defaultParams) {
  789. if (findKey) {
  790. res[findKey][item.key] = item.value;
  791. } else {
  792. res[item.key] = item.value;
  793. }
  794. }
  795. break;
  796. }
  797. });
  798. if (isFindList && obj.finds) {
  799. if (isTypeof(obj.finds) == 'object') {
  800. for (let [k, v] of Object.entries(obj.finds)) {
  801. if (v !== '') {
  802. if (findKey) {
  803. res[findKey][k] = isTypeof(v) == 'array' ? v.join('') : v;
  804. } else {
  805. res[k] = isTypeof(v) == 'array' ? v.join('') : v;
  806. }
  807. }
  808. }
  809. } else if (isTypeof(obj.finds) == 'string') {
  810. obj.page_column.forEach(item => {
  811. if (item.allSearch) {
  812. if (obj.finds == 0 || obj.finds) {
  813. if (findKey) {
  814. res[findKey][item.field] = obj.finds;
  815. } else {
  816. res[item.field] = obj.finds;
  817. }
  818. }
  819. }
  820. });
  821. }
  822. }
  823. for (let [k, v] of Object.entries(obj.order)) {
  824. res.orderName = k.replace(/([A-Z])/g, "_$1").toLowerCase();
  825. res.orderBy = v == 'ascending' ? 'asc' : 'desc';
  826. }
  827. return res;
  828. }
  829. export function searchSourceData(obj) {
  830. if (obj.finds) {
  831. let params = [],
  832. sourceNewData = [];
  833. if (isTypeof(obj.finds) == 'object') {
  834. for (let [k, v] of Object.entries(obj.finds)) {
  835. if (v !== '') {
  836. params.push({
  837. key: k,
  838. value: isTypeof(v) == 'array' ? v.join('') : v
  839. });
  840. }
  841. }
  842. } else if (isTypeof(obj.finds) == 'string') {
  843. obj.page_column.forEach(item => {
  844. if (item.allSearch) {
  845. if (obj.finds !== '') {
  846. params.push({
  847. key: item.field,
  848. value: obj.finds
  849. });
  850. }
  851. }
  852. });
  853. }
  854. obj.sourceData.forEach(item => {
  855. let itemFlag = true;
  856. params.forEach(param => {
  857. (item[param.key].indexOf(param.value) == -1) && (itemFlag = false);
  858. });
  859. itemFlag && sourceNewData.push(item);
  860. });
  861. obj.tableData = sourceNewData;
  862. obj.pages.totalCount = sourceNewData.length;
  863. } else {
  864. obj.tableData = obj.sourceData;
  865. obj.pages.totalCount = obj.sourceData.length;
  866. }
  867. obj.loading = false;
  868. }
  869. export function unitInitDataTableList(obj) {
  870. obj.loading = true;
  871. obj.tableData = [];
  872. let item = obj.queryURL['list'],
  873. queryData = !obj.queryParam || isTypeof(obj.queryParam) === 'function'
  874. ? emitOnReqParams(obj, 'list')
  875. : getQueryParams(obj, true),
  876. // table中插入一条记录
  877. insertTableItem = function (obj, dataItem, mergeItem) {
  878. let tmpDataItem = responseNodeParseList(dataItem, mergeItem) || {}
  879. for (let [kk, vv] of Object.entries(tmpDataItem)) {
  880. obj.$set(dataItem, kk, vv);
  881. }
  882. };
  883. // 在没有显示table和分页信息情况下不请求接口
  884. if ((obj.page_status & 8) != 8 && (obj.page_status & 4) != 4) return;
  885. request(axiosReqParams(item, mergeRequestParams(queryData, obj._publicParams), obj.axios, obj.options)).then((response) => {
  886. let next = { keyType: 'result' };
  887. obj.loading = false; //关闭遮罩load
  888. obj.tableListResponse = response;
  889. // 对查询列表数据处理函数,或者获取数据后操作
  890. if (obj.$listeners && obj.$listeners.afterTableData && isTypeof(obj.$listeners.afterTableData) === 'function') {
  891. obj.$emit('afterTableData', response);
  892. }
  893. if (responseKeyToValue(response, obj, obj, next)) {
  894. if ((obj.page_status & 4) == 4) {
  895. let tmpTableList = responseNodeParseList(response, item.parse.tableData) || []; //table赋值值
  896. if (obj.rowKey || item.parse.childrenData) {
  897. tmpTableList.forEach(dataItem => {
  898. if (isTypeof(item.parse.childrenData) === 'object') {
  899. for (let [ck, cv] of Object.entries(item.parse.childrenData)) {
  900. insertTableItem(obj, dataItem, cv)
  901. }
  902. } else {
  903. insertTableItem(obj, dataItem, item.parse.childrenData)
  904. }
  905. if (!obj.options.hasOwnProperty('lazy')
  906. || (obj.options.hasOwnProperty('lazy') && obj.options.lazy)) {
  907. dataItem.hasChildren = item.tree ? (dataItem[item.tree.key] ? true : false) : true;
  908. }
  909. })
  910. }
  911. if (obj.$listeners && obj.$listeners.updateColumnValue && isTypeof(obj.$listeners.updateColumnValue) === 'function') {
  912. // 通过回调修改tableData值
  913. obj.loading = true;
  914. obj.$emit('updateColumnValue', tmpTableList, (pRes) => {
  915. obj.tableData = pRes || tmpTableList;
  916. obj.loading = false; //关闭遮罩load
  917. });
  918. } else {
  919. obj.tableData = tmpTableList;
  920. }
  921. }
  922. if ((obj.page_status & 8) == 8) {
  923. obj.pages.totalCount = responseNodeParseList(response, item.parse.totalCount, 'number') || 0; //赋值总页数
  924. }
  925. }
  926. }).catch((err) => {
  927. obj.loading = false;
  928. });
  929. }
  930. export function unitInitSelectList(obj, demandList = null) {
  931. return new Promise((resolve, reject) => {
  932. let selectlist = obj.select_list;
  933. for (let [key, val] of Object.entries(selectlist)) {
  934. if (isTypeof(val) === 'object') {
  935. // 判断对象是否需要初始化
  936. if (demandList === null && val.isNotInit) continue;
  937. // 动态加载单个select
  938. if (val.url) {
  939. if (val.paramType) {
  940. key = key.substr(0, (key.length - 5))
  941. } else {
  942. selectlist[(key + 'Param')] = val;
  943. val.paramsTypeof = isTypeof(val.params)
  944. }
  945. // 查询按需加载list中是否存在
  946. if (demandList && (isTypeof(demandList) !== 'array' || !isArrayInnerValue(demandList, key))) continue;
  947. let post = val.paramsTypeof === 'function'
  948. ? emitOnReqParams(obj, key)
  949. : (val.params ? val.params : getQueryParams(obj, false));
  950. //增加默认参数
  951. val.params = post;
  952. val.paramType = true;// 是否重复加载
  953. selectlist[key] = [];
  954. (async function (keys) {
  955. let tmpAxios = Object.assign({}, obj.axios, val.axios);
  956. await selectListRequest(selectlist, val, keys, mergeRequestParams(post, obj._publicParams), tmpAxios, obj.options);
  957. }(key));
  958. }
  959. }
  960. }
  961. });
  962. }
  963. export async function reloadItemSelectList(obj, type, field) {
  964. let post = {},
  965. selectlist = obj.select_list,
  966. selectkey = field + 'Param',
  967. item = selectlist[selectkey],
  968. currPage = item.pageProps && item.pageProps.page ? item.pageProps.page : 'page';
  969. if (item.url) {
  970. if (type === 'remote') {
  971. selectlist[field] = []
  972. if (item.hasOwnProperty('remote')
  973. && item.remote.paramKey
  974. && item.remote.key
  975. && item.remote.hasOwnProperty('paramKey')
  976. ) {
  977. if (isTypeof(item.remote.paramKey) === 'array') {
  978. let tmpItemParams = item.params
  979. item.remote.paramKey.forEach(k => {
  980. if (tmpItemParams.hasOwnProperty(k)) {
  981. tmpItemParams = tmpItemParams[k]
  982. } else {
  983. tmpItemParams[k] = {}
  984. tmpItemParams = tmpItemParams[k]
  985. }
  986. });
  987. tmpItemParams[item.remote.key] = item.remote.value;
  988. } else {
  989. if (!item.params.hasOwnProperty(item.remote.paramKey)) {
  990. item.params[item.remote.paramKey] = {};
  991. }
  992. item.params[item.remote.paramKey][item.remote.key] = item.remote.value;
  993. }
  994. } else {
  995. item.remote && item.remote.key && (item.params[item.remote.key] = item.remote.value);
  996. }
  997. if (item.params && item.params[currPage]) {
  998. item.params[currPage] = 1;
  999. }
  1000. } else if (type === 'infinite') {
  1001. if (item.params && item.params[currPage]) {
  1002. item.params[currPage] += 1;
  1003. } else {
  1004. return false;
  1005. }
  1006. }
  1007. post = item.params;
  1008. // 存在扩展参数函数
  1009. if (item.extParamsFunc && isTypeof(item.extParamsFunc) == 'function') {
  1010. post = item.extParamsFunc(obj.rowData, post)
  1011. }
  1012. let tmpAxios = Object.assign({}, obj.axios, item.axios);
  1013. await selectListRequest(selectlist, item, field, mergeRequestParams(post, obj._publicParams), tmpAxios, obj.options);
  1014. }
  1015. }
  1016. export async function selectListRequest(selectlist, item, field, data, axios, options) {
  1017. const responseData = await request(axiosReqParams(item, data, axios, options)).then((response) => {
  1018. return response
  1019. }).catch((err) => {
  1020. });
  1021. selectlist[field].push(...parseResListData(responseData, item));
  1022. }
  1023. export function parseResListData(response, item) {
  1024. let result = [],
  1025. node = item.node ? item.node : 'data',
  1026. props = item.props ? item.props : { value: 'oid', label: 'name' },
  1027. list = responseNodeParseList(response, node),
  1028. isListType = isTypeof(list);
  1029. if (item.result) {
  1030. result = list;
  1031. } else {
  1032. if (isListType === 'array') {
  1033. if (list && list.length > 0) {
  1034. list.forEach(it => {
  1035. let tmpLabel = '',
  1036. tmpValue = '';
  1037. if (isTypeof(it) === 'object') {
  1038. if (isTypeof(props['value']) === 'array') {
  1039. let tmpArray = [];
  1040. props['value'].forEach(labelItem => {
  1041. tmpArray.push(it[labelItem]);
  1042. });
  1043. tmpValue = tmpArray.join('#0');
  1044. } else {
  1045. tmpValue = it[props['value']];
  1046. }
  1047. if (isTypeof(props['label']) === 'array') {
  1048. let tmpArray = [];
  1049. props['label'].forEach(labelItem => {
  1050. tmpArray.push(it[labelItem]);
  1051. });
  1052. tmpLabel = tmpArray.join(' / ');
  1053. } else {
  1054. tmpLabel = it[props['label']];
  1055. }
  1056. } else if (isTypeof(it) === 'array') {
  1057. tmpValue = it.join('#0')
  1058. tmpLabel = it.join(' / ')
  1059. } else {
  1060. tmpValue = it
  1061. tmpLabel = it
  1062. }
  1063. result.push({
  1064. value: tmpValue,
  1065. label: tmpLabel
  1066. });
  1067. });
  1068. }
  1069. } else if (isListType === 'object') {
  1070. for (let [k, v] of Object.entries(list)) {
  1071. result.push({
  1072. value: k.toString(),
  1073. label: v
  1074. });
  1075. }
  1076. }
  1077. }
  1078. if (item.filter) {
  1079. result = result.filter(it => !isArrayInnerValue(item.filter, it.label))
  1080. }
  1081. return result;
  1082. }