QueryPage.vue 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029
  1. <template>
  2. <div
  3. class="flex-container"
  4. :class="{'flex-container-modal': isSearchWidget == true, 'flex-container' : (isSearchWidget == null || isSearchWidget == false)}"
  5. >
  6. <div class="flex-header">
  7. <div
  8. class="panel panel-default"
  9. style="margin-bottom: 5px;"
  10. >
  11. <div
  12. class="panel-heading"
  13. style="padding: 0px;"
  14. >
  15. <InfoHeader
  16. :html-help-url="infoWindowDto.htmlHelpUrl"
  17. :info-grid-fields="infoGridFields"
  18. :header-name="infoWindowDto.name"
  19. :info-filter-fields="infoFilterFields"
  20. :info-window-no="infoWindowDto.no"
  21. @filter-field-property-changed="filterFieldPropertyChanged($event)"
  22. @grid-field-property-changed="gridFieldPropertyChanged($event)"
  23. />
  24. </div>
  25. <div
  26. class="panel-body"
  27. style="padding-bottom: 5px; padding-top: 8px;"
  28. >
  29. <QueryCondition
  30. ref="queryCondition"
  31. :info-filter-fields="infoFilterFields"
  32. :info-buttons="infoWindowDto.infoButtons"
  33. :is-search-widget="isSearchWidget"
  34. :show-button="true"
  35. :info-window-no="infoWindowDto.no"
  36. @simple-search="simpleSearch"
  37. @complex-search="complexSearch"
  38. @refresh-search="pageSearch"
  39. @execute-process="executeProcess($event)"
  40. @execute-export="executeExport"
  41. />
  42. </div>
  43. </div>
  44. </div>
  45. <div class="flex-content">
  46. <div
  47. :id="tableOutDivId"
  48. class="flex-main table-fix-head"
  49. >
  50. <table
  51. class="fixed-table table-striped table-bordered"
  52. :width="tableWidth"
  53. height="40px"
  54. >
  55. <thead>
  56. <tr height="40px">
  57. <th width="50px">{{ $t('lang.QueryPage.serialNumber') }}</th>
  58. <th
  59. width="30px"
  60. class="text-center"
  61. :class="{'mulitiple-select': multipleSelect}"
  62. @click.self="changeSelectMode"
  63. >
  64. <input
  65. v-model="isSelectAll"
  66. type="checkbox"
  67. />
  68. </th>
  69. <th
  70. v-for="(infoGridField) in infoGridFields"
  71. v-show="infoGridField.isShow"
  72. :key="infoGridField.fieldName"
  73. :width="infoGridField.width + 'px'"
  74. @dragover="ondragover($event, infoGridField)"
  75. @click="onSort(infoGridField)"
  76. >
  77. <div
  78. :id="'infoGridFieldId_' + infoGridField.fieldName"
  79. class="rz-handle"
  80. draggable="true"
  81. @dragstart="ondragstart($event, infoGridField)"
  82. @drag="ondrag($event, infoGridField)"
  83. @dragend="ondragend($event, infoGridField)"
  84. />
  85. <div
  86. v-tooltip.right="Language.getHelpTrl($i18n.locale, infoGridField)"
  87. class="td-max"
  88. >
  89. {{ Language.getNameTrl($i18n.locale, infoGridField) }}
  90. </div>
  91. </th>
  92. </tr>
  93. </thead>
  94. <tbody>
  95. <tr
  96. v-for="(item1,index) in infoWindowData.dataList"
  97. :key="'tr' + item1.id"
  98. height="40px"
  99. :class="{'warning':item1.select}"
  100. @dblclick="selectNode(item1)"
  101. >
  102. <td style="text-align: center;">{{ index+1+(pagination.current_page-1)*pagination.per_page }}</td>
  103. <td class="text-center">
  104. <input
  105. type="checkbox"
  106. :checked="item1.select"
  107. @click.self="selectNodeForSearch(item1)"
  108. />
  109. </td>
  110. <td
  111. v-for="item2 in infoGridFields"
  112. v-show="item2.isShow"
  113. id="item.id"
  114. :key="'td-' + item2.id"
  115. >
  116. <span v-if="item2.simpleDisplayType == 'Image'">
  117. <QueryPageImage
  118. v-if="item1.data[item2.fieldName] != undefined"
  119. :class-name="item2.selectClause"
  120. :image-names="item1.data[item2.fieldName].displayValue[0]"
  121. />
  122. </span>
  123. <span v-else>
  124. {{ item1.data[item2.fieldName] != undefined ? item1.data[item2.fieldName].displayValue[0] : "" }}
  125. </span>
  126. </td>
  127. </tr>
  128. </tbody>
  129. </table>
  130. </div>
  131. </div>
  132. <div
  133. class="flex-footer"
  134. style="margin-top: 10px;"
  135. >
  136. <div class="pull-left">
  137. <span>{{ $t('lang.QueryPage.the') }}
  138. {{ (pagination.current_page-1)*pagination.per_page+1 }}
  139. -
  140. {{ pagination.current_page*pagination.per_page }}
  141. {{ $t('lang.QueryPage.strip') }}
  142. ,
  143. {{ $t('lang.QueryPage.total') }}
  144. {{ pagination.total }}
  145. {{ $t('lang.QueryPage.strip') }}
  146. ,
  147. {{ $t('lang.QueryPage.displayOnEachPage') }}
  148. </span>
  149. <PageSizeSelect @page-size-changed="gridSizeSelect" />
  150. <span>{{ $t('lang.QueryPage.strip') }}</span>
  151. </div>
  152. <div class="pull-right">
  153. <Pagination
  154. :pagination="pagination"
  155. :callback="pageSearch"
  156. />
  157. </div>
  158. </div>
  159. <Loading ref="loading" />
  160. <Modal ref="modal">
  161. <template #default>
  162. <ProcessReportResult
  163. :process-report-result="processReportResult"
  164. :pdf-only="pdfOnly"
  165. :excel-only="excelOnly"
  166. />
  167. </template>
  168. <template #header>
  169. <div>{{ $t('lang.QueryPage.resultsOfEnforcement') }}</div>
  170. </template>
  171. </Modal>
  172. </div>
  173. </template>
  174. <script>
  175. var Common = require('../../common/Common.js').default;
  176. var Modal = require('../../modal/src/Modal.vue').default;
  177. var PageSizeSelect = require('../../page-size-select/src/PageSizeSelect.vue').default;
  178. var Pagination = require('../../vue-bootstrap-pagination/src/vue-bootstrap-pagination.vue').default;
  179. var QueryCondition = require('./QueryCondition.vue').default;
  180. var InfoHeader = require('./InfoHeader.vue').default;
  181. var InfoUtil = require('./InfoUtil.js').default;
  182. var Notify = require('../../common/Notify.js').default;
  183. var Loading = require('../../loading/src/Loading.vue').default;
  184. var ProcessReportResult = require('../../process/src/ProcessReportResult.vue').default;
  185. var Uuid = require('../../common/Uuid.js').default;
  186. var QueryPageImage = require('./QueryPageImage.vue').default;
  187. var DownloadService = require('../../common/DownloadService.js').default;
  188. var HtmlWindowResource = require('../../html-window/src/api/HtmlWindowResource.js').default;
  189. var CustomerWindowResource = require('../../customer-window/src/api/CustomerWindowResource.js').default;
  190. var ProcessReportResource = require('../../process/src/api/ProcessReportResource.js').default;
  191. var UserStorageResource = require('../../common/UserStorageResource.js').default;
  192. var Language = require('../../common/Language.js').default;
  193. export default {
  194. name: 'QueryPage',
  195. components: {
  196. Pagination,
  197. QueryCondition,
  198. Modal,
  199. InfoHeader,
  200. Loading,
  201. ProcessReportResult,
  202. PageSizeSelect,
  203. QueryPageImage,
  204. },
  205. props: {
  206. 'whereClauseSource':{
  207. type: Object,
  208. default: null,
  209. },
  210. 'isSearchWidget':{
  211. type: Boolean,
  212. default: false,
  213. },
  214. 'parentModelData': {
  215. type: Object,
  216. default: null,
  217. },
  218. 'modelData': {
  219. type: Object,
  220. default: null,
  221. },
  222. 'fieldValue': {
  223. type: Object,
  224. default: null,
  225. },
  226. },
  227. emits: ['dataSelected'],
  228. data: function () {
  229. this.Language = Language;
  230. return {
  231. infoWindowDto: {},
  232. queryResult: {},
  233. infoWindowData: {},
  234. selectedModelDatas: [], // 当前界面的选择项 (multiple)
  235. pagination: {
  236. total: 0,
  237. per_page: Common.pageSize, // required
  238. current_page: 1, // required
  239. last_page: 10, // required
  240. },
  241. isSelectAll: false,
  242. infoQueryParam: [],
  243. processReportResult: [],
  244. multipleSelect: false,
  245. uuid: Uuid.createUUID(),
  246. sortStr: '',// 排序
  247. sortStyle: ' ASC',
  248. currentIsSimpleSearch: true,
  249. startX: '',
  250. startWidth: '',
  251. processReportDto: '',
  252. pdfOnly: '',
  253. excelOnly: '',
  254. infoGridFields: [],
  255. infoFilterFields: [],
  256. // 表格外面的DIV的id
  257. tableOutDivId: Uuid.createUUID(),
  258. };
  259. },
  260. computed: {
  261. tableWidth: function () {
  262. var totalWidth = 50;
  263. if (this.infoWindowDto != undefined && this.infoGridFields != undefined) {
  264. this.infoGridFields.forEach(function (item) {
  265. if (item.isShow) {
  266. totalWidth += Number(item.width);
  267. }
  268. });
  269. }
  270. return totalWidth + 'px';
  271. },
  272. },
  273. watch: {
  274. /**
  275. * 是否选择了全部的数据
  276. */
  277. isSelectAll: function (val) {
  278. var _self = this;
  279. if (_self.multipleSelect) {
  280. if (_self.isSelectAll) {
  281. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  282. if (val) {
  283. _self.infoWindowData.dataList.forEach(function (item) {
  284. item.select = true;
  285. _self.selectedModelDatas.push(item);
  286. });
  287. }
  288. } else {
  289. _self.infoWindowData.dataList.forEach(function (item) {
  290. item.select = false;
  291. });
  292. _self.selectedModelDatas = [];
  293. }
  294. } else {
  295. _self.isSelectAll = false;
  296. }
  297. },
  298. /**
  299. * 路由发生改变
  300. */
  301. $route: function (to, from) {
  302. var _self = this;
  303. _self.infoWindowData = {};
  304. },
  305. /**
  306. * 选择的数据发生改变
  307. */
  308. // selectedModelDatas: function(to, from){
  309. // var _self = this;
  310. // if(!_self.multipleSelect){
  311. // if(to.length > 1){
  312. // _self.selectedModelDatas.splice(0, to.length - 1);
  313. // }
  314. // }
  315. // },
  316. /**
  317. * fieldValue发生改变
  318. */
  319. fieldValue: function (to, from) {
  320. this.reSelectedNode(to);
  321. },
  322. },
  323. methods: {
  324. // 页码数量改变
  325. gridSizeSelect: function (newPageSize) {
  326. this.pagination.per_page = newPageSize;
  327. this.pagination.current_page = 1;
  328. },
  329. ondragstart: function (event, gridFieldItem) {
  330. var _self = this;
  331. _self.startX = event.pageX;
  332. _self.startWidth = Number(gridFieldItem.width);
  333. event.dataTransfer.setDragImage(event.target, 0, 20);
  334. event.dataTransfer.effectAllowed = 'move';
  335. },
  336. ondrag: function (event, gridFieldItem) {
  337. var _self = this;
  338. gridFieldItem.width = _self.startWidth + (event.pageX - _self.startX);
  339. },
  340. ondragend: function (event, gridFieldItem, index) {
  341. var _self = this;
  342. let newWidth = _self.startWidth + (event.pageX - _self.startX);
  343. if (newWidth < 50) {
  344. newWidth = 50;
  345. }
  346. gridFieldItem.width = newWidth;
  347. InfoUtil.saveInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  348. },
  349. ondragover: function (event, gridFieldItem) {
  350. event.preventDefault();
  351. event.dataTransfer.dropEffect = 'move';
  352. },
  353. // 初始化数据
  354. initWidget: function (data) {
  355. var _self = this;
  356. if (data == undefined) {
  357. return;
  358. }
  359. _self.infoWindowDto = data;
  360. _self.infoFilterFields = data.infoFilterFields;
  361. _self.infoGridFields = data.infoGridFields;
  362. // var sortNo = 10;
  363. _self.infoGridFields.forEach(function (item) {
  364. item.width = 150;
  365. });
  366. _self.infoFilterFields.forEach(function (item) {
  367. item.value = {
  368. 'infoFilterFieldId': item.id,
  369. 'value1': '',
  370. 'value2': '',
  371. };
  372. });
  373. InfoUtil.restoreInfoFilterFields(_self.infoWindowDto.no, _self.infoFilterFields);
  374. InfoUtil.restoreInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  375. _self.simpleSearch();
  376. },
  377. complexSearch: function () {
  378. var _self = this;
  379. _self.pagination.current_page = 1;
  380. var infoQueryParam = {
  381. infoWindowNo: _self.infoWindowDto.no,
  382. start: (_self.pagination.current_page - 1) * _self.pagination.per_page,
  383. length: _self.pagination.per_page,
  384. sortClause: '',
  385. infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
  386. whereClauseSource: _self.whereClauseSource,
  387. parentModelData: _self.parentModelData,
  388. modelData: _self.modelData,
  389. isSearchWidget: _self.isSearchWidget,
  390. };
  391. _self.infoQueryParam = infoQueryParam;
  392. _self.currentIsSimpleSearch = false;
  393. _self.queryInfoWindowDataComplex();
  394. },
  395. pageSearch: function () {
  396. var _self = this;
  397. _self.infoQueryParam.start = (_self.pagination.current_page - 1) * _self.pagination.per_page;
  398. _self.infoQueryParam.length = _self.pagination.per_page;
  399. var isSimpleQuery = _self.$refs.queryCondition.isSimpleQuery();
  400. if (isSimpleQuery) {
  401. _self.queryInfoWindowDataSimple();
  402. } else {
  403. _self.queryInfoWindowDataComplex();
  404. }
  405. },
  406. /**
  407. * 简单查询
  408. * @return {void}
  409. */
  410. simpleSearch: function () {
  411. var _self = this;
  412. _self.pagination.current_page = 1;
  413. var infoQueryParam = {
  414. infoWindowNo: _self.infoWindowDto.no,
  415. start: (_self.pagination.current_page - 1) * _self.pagination.per_page,
  416. length: _self.pagination.per_page,
  417. sortClause: '',
  418. infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
  419. whereClauseSource: _self.whereClauseSource,
  420. parentModelData: _self.parentModelData,
  421. modelData: _self.modelData,
  422. isSearchWidget: _self.isSearchWidget,
  423. };
  424. _self.infoQueryParam = infoQueryParam;
  425. _self.currentIsSimpleSearch = true;
  426. _self.queryInfoWindowDataSimple();
  427. },
  428. queryInfoWindowDataComplex: function () {
  429. var _self = this;
  430. _self.$refs.loading.show();
  431. $.ajax({
  432. url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataComplex'),
  433. type: 'post',
  434. dataType: 'json',
  435. beforeSend: function (request) {
  436. Common.addTokenToRequest(request);
  437. },
  438. contentType: 'application/json',
  439. data: JSON.stringify(_self.infoQueryParam),
  440. success: function (data) {
  441. _self.$refs.loading.hide();
  442. data.dataList.forEach(function (item) {
  443. item.select = false;
  444. });
  445. _self.infoWindowData = data;
  446. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  447. _self.reSelectedNode(_self.fieldValue);
  448. _self.pagination.total = data.totalSize;
  449. _self.pagination.last_page = Math.ceil(data.totalSize / data.range.length);
  450. _self.fixedTableHeader();
  451. },
  452. error: function (XMLHttpRequest, textStatus, errorThrown) {
  453. _self.$refs.loading.hide();
  454. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  455. },
  456. });
  457. },
  458. queryInfoWindowDataSimple: function () {
  459. var _self = this;
  460. if (_self.$refs.loading) {
  461. _self.$refs.loading.show();
  462. }
  463. _self.infoQueryParam.whereClauseSource = _self.whereClauseSource;
  464. $.ajax({
  465. url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataSimple'),
  466. type: 'post',
  467. dataType: 'json',
  468. beforeSend: function (request) {
  469. Common.addTokenToRequest(request);
  470. },
  471. contentType: 'application/json',
  472. data: JSON.stringify(_self.infoQueryParam),
  473. success: function (data) {
  474. if (_self.$refs.loading) {
  475. _self.$refs.loading.hide();
  476. }
  477. data.dataList.forEach(function (item) {
  478. item.select = false;
  479. });
  480. _self.infoWindowData = data;
  481. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  482. _self.reSelectedNode(_self.fieldValue);
  483. _self.pagination.total = data.totalSize;
  484. _self.pagination.last_page = Math.ceil(data.totalSize / data.range.length);
  485. _self.fixedTableHeader();
  486. },
  487. error: function (XMLHttpRequest, textStatus, errorThrown) {
  488. if (_self.$refs.loading) {
  489. _self.$refs.loading.hide();
  490. }
  491. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  492. },
  493. });
  494. },
  495. /**
  496. * 双击表格行事件
  497. */
  498. selectNode: function (modelData) {
  499. this.$emit('dataSelected', modelData);
  500. },
  501. /**
  502. * 选择/取消选择表格行中的复选框事件
  503. */
  504. selectNodeForSearch: function (modelData) {
  505. var _self = this;
  506. if ((_self.fieldValue != undefined) && (_self.fieldValue.fieldType == 'ManyToManyKey')) {
  507. // CRUD-ManyToManySetBoxEditor多选搜索框-多选
  508. } else if ((_self.fieldValue != undefined) && (_self.fieldValue.displayType == 'MultiSearchBoxEditor')) {
  509. // 多选
  510. } else if ((_self.fieldValue != undefined) && (_self.fieldValue.fieldType == 'Key')) {
  511. // 单选
  512. // 清空选择项
  513. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  514. }
  515. var currentStatus = modelData.select;
  516. var index = _self.selectedModelDatas.indexOf(modelData);
  517. if (!_self.multipleSelect) {
  518. _self.selectedModelDatas = [];
  519. _self.infoWindowData.dataList.forEach(function (item) {
  520. item.select = false;
  521. });
  522. }
  523. modelData.select = !currentStatus;
  524. if (index < 0) {
  525. _self.selectedModelDatas.push(modelData);
  526. _self.$emit('dataSelected', modelData);
  527. } else {
  528. _self.selectedModelDatas.splice(index, 1);
  529. _self.$emit('deleteSelected', modelData);
  530. }
  531. },
  532. /**
  533. * 获取选择的数据
  534. */
  535. getSelectedModelDatas: function (data) {
  536. var _self = this;
  537. return _self.selectedModelDatas;
  538. },
  539. /**
  540. * 条件字段属性发生改变
  541. */
  542. filterFieldPropertyChanged: function (infoFilterFieldsClone) {
  543. let _self = this;
  544. InfoUtil.saveInfoFilterFields(_self.infoWindowDto.no, infoFilterFieldsClone).then(successData => {
  545. InfoUtil.restoreInfoFilterFields(_self.infoWindowDto.no, _self.infoFilterFields);
  546. }, errorData => {
  547. console.log(errorData);
  548. });
  549. },
  550. /**
  551. * 表格字段属性发生改变
  552. */
  553. gridFieldPropertyChanged: function (infoGridFieldsClone) {
  554. let _self = this;
  555. InfoUtil.saveInfoGridFields(_self.infoWindowDto.no, infoGridFieldsClone).then(successData => {
  556. InfoUtil.restoreInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  557. }, errorData => {
  558. console.log(errorData);
  559. });
  560. },
  561. /**
  562. * 执行流程
  563. * @param {Object} infoButton
  564. * @return {void}
  565. */
  566. executeProcess: function (infoButton) {
  567. var _self = this;
  568. if (infoButton == null) {
  569. return;
  570. }
  571. if (infoButton.htmlWindowNo != null && infoButton.htmlWindowNo.length > 0) {
  572. HtmlWindowResource.uniqueByNo(infoButton.htmlWindowNo).then(htmlWindowDto => {
  573. if (htmlWindowDto != undefined) {
  574. var htmlWindowUrl = htmlWindowDto.htmlFileName;
  575. var autoCloseInterval = htmlWindowDto.autoCloseInterval;
  576. var regExp = new RegExp('[{].*?[}]', 'g');
  577. var result = htmlWindowUrl.match(regExp);
  578. if (htmlWindowUrl != undefined && htmlWindowUrl != '') {
  579. for (var index = 0, len = result.length; index < len; index++) {
  580. var tempResult = result[index];
  581. console.log('{' + tempResult + '}匹配');
  582. if (tempResult == '{URL}') {
  583. htmlWindowUrl = htmlWindowUrl.replace('{URL}', Common.getRedirectUrl(''));
  584. console.log('{' + htmlWindowUrl + '}地址');
  585. } else if (tempResult == '{RecordId}') {
  586. if (_self.selectedModelDatas.length == 0) {
  587. Notify.error('错误', '未选择可操作的数据', true);
  588. return;
  589. }
  590. htmlWindowUrl = htmlWindowUrl.replace('{RecordId}', _self.getFirstSelectRecordId());
  591. } else if (tempResult == '{RecordIds}') {
  592. if (_self.selectedModelDatas.length == 0) {
  593. Notify.error('错误', '未选择可操作的数据', true);
  594. return;
  595. }
  596. htmlWindowUrl = htmlWindowUrl.replace('{RecordIds}', _self.getSelectedRecordIds());
  597. } else if (tempResult == '{Token}') {
  598. htmlWindowUrl = htmlWindowUrl.replace('{Token}', Common.getToken());
  599. } else if (tempResult == '{infoWindowNo}') {
  600. htmlWindowUrl = htmlWindowUrl.replace('{infoWindowNo}', _self.infoWindowDto.no);
  601. } else {
  602. if (_self.selectedModelDatas.length == 0) {
  603. Notify.error('错误', '未选择可操作的数据', true);
  604. return;
  605. } else if (_self.selectedModelDatas.length > 1) {
  606. Notify.error('错误', '请选择一条数据', true);
  607. return;
  608. }
  609. var tempResult1 = tempResult.replace('{', '').replace('}', '');
  610. htmlWindowUrl = htmlWindowUrl.replace(tempResult, _self.getFirstSelectModelDataFieldValue(tempResult1));
  611. }
  612. }
  613. var openWindow = window.open(htmlWindowUrl);
  614. // 自动关闭
  615. if (autoCloseInterval != undefined) {
  616. setTimeout(function () {
  617. openWindow.close();
  618. openWindow = undefined;
  619. }, autoCloseInterval * 1000);
  620. }
  621. }
  622. }
  623. }, errorData => {
  624. Common.processException(errorData);
  625. });
  626. } else if (infoButton.customerWindowNo != null && infoButton.customerWindowNo.length > 0) {
  627. CustomerWindowResource.uniqueByNo(infoButton.customerWindowNo).then(customerWindowDto => {
  628. var customerWindowRouteUrl = customerWindowDto.routeUrl;
  629. if (customerWindowRouteUrl != undefined && customerWindowRouteUrl != '') {
  630. if (customerWindowRouteUrl == 'exportInfoData') {
  631. var downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
  632. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  633. + '&token=' + Common.getToken();
  634. window.open(downloadUrl);
  635. } else {
  636. // if (_self.selectedModelDatas.length == 0) {
  637. // Notify.error("错误", "未选择可操作的数据", true);
  638. // return;
  639. // }
  640. localStorage.setItem(_self.uuid, JSON.stringify(_self.selectedModelDatas));
  641. var routeDate = {
  642. path: customerWindowRouteUrl,
  643. query: {
  644. 'uuid': _self.uuid,
  645. },
  646. };
  647. _self.$router.push(routeDate);
  648. }
  649. }
  650. }, errorData => {
  651. Common.processException(errorData);
  652. });
  653. } else if (infoButton.processReportNo != null && infoButton.processReportNo.length > 0) {
  654. var processReportNo = infoButton.processReportNo;
  655. if (processReportNo != undefined && processReportNo != '') {
  656. var ids = _self.getSelectedRecordIds();
  657. if (ids.length < 1) {
  658. Notify.error('错误', '未选择可操作的数据', true);
  659. return;
  660. }
  661. _self.$refs.loading.show();
  662. ProcessReportResource.uniqueByNo(infoButton.processReportNo).then(successData => {
  663. _self.processReportDto = successData;
  664. if (successData) {
  665. _self.pdfOnly = successData.pdfOnly;
  666. _self.excelOnly = successData.excelOnly;
  667. }
  668. ProcessReportResource.runProcessByIds(infoButton.processReportNo, ids).then(successData => {
  669. _self.$refs.modal.show = true;
  670. _self.$refs.loading.hide();
  671. _self.processReportResult = successData;
  672. _self.$emit('processExecuteFinish');
  673. }, errorData => {
  674. _self.$refs.loading.hide();
  675. Common.processException(errorData);
  676. });
  677. }, errorData => {
  678. _self.$refs.loading.hide();
  679. Common.processException(errorData);
  680. });
  681. }
  682. }
  683. },
  684. /**
  685. * 执行导出
  686. * @return {void}
  687. */
  688. executeExport: function () {
  689. var _self = this;
  690. var isSimpleQuery = _self.$refs.queryCondition.isSimpleQuery();
  691. if(isSimpleQuery){
  692. let condition = _self.$refs.queryCondition.getQueryCondition();
  693. let downloadUrl = Common.getApiURL('exportResource/exportInfoDataSimple') + '?infoWindowNo=' + _self.infoWindowDto.no
  694. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  695. + '&infoFilterFieldValues=' + _self.uuid
  696. + '&condition=' + condition;
  697. let timeStr = moment().format('_YYYYMMDD_hhmmss');
  698. let fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
  699. DownloadService.downloadFile(downloadUrl, fileName);
  700. }else{
  701. let infoFilterFieldValues = _self.$refs.queryCondition.getQueryCondition();
  702. let infoFilterFieldValueStrs = JSON.stringify(infoFilterFieldValues);
  703. let downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
  704. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  705. + '&infoFilterFieldValues=' + _self.uuid;
  706. let timeStr = moment().format('_YYYYMMDD_hhmmss');
  707. let fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
  708. let userStorageDtos = [
  709. {
  710. key: _self.uuid,
  711. value: infoFilterFieldValueStrs,
  712. },
  713. ];
  714. // 组装查询条件,然后放到后台数据库当中
  715. UserStorageResource.uploadUserStorage(userStorageDtos).then(successData => {
  716. DownloadService.downloadFile(downloadUrl, fileName);
  717. }, errorData => {
  718. Common.processException(errorData);
  719. });
  720. }
  721. },
  722. /**
  723. * 获取选择数据的Id集合
  724. */
  725. getSelectedRecordIds: function () {
  726. var _self = this;
  727. var recordIds = [];
  728. _self.selectedModelDatas.forEach(function (selectedModelData) {
  729. recordIds.push(selectedModelData.id);
  730. });
  731. return recordIds;
  732. },
  733. /**
  734. * 获取选中的第一个数据的Id
  735. */
  736. getFirstSelectRecordId: function () {
  737. var _self = this;
  738. if (_self.selectedModelDatas.length > 0) {
  739. return _self.selectedModelDatas[0].id;
  740. }
  741. return undefined;
  742. },
  743. /**
  744. * 获取选中的第一个数据的FieldValue
  745. */
  746. getFirstSelectModelDataFieldValue: function (name) {
  747. var _self = this;
  748. if (_self.selectedModelDatas.length > 0) {
  749. if (_self.selectedModelDatas[0].data[name] != undefined) {
  750. return _self.selectedModelDatas[0].data[name].displayValue[0];
  751. }
  752. }
  753. return undefined;
  754. },
  755. /**
  756. * 切换全选/单选
  757. */
  758. changeSelectMode: function () {
  759. this.multipleSelect = !this.multipleSelect;
  760. },
  761. /**
  762. * 排序
  763. */
  764. onSort: function (infoGridField) {
  765. var _self = this;
  766. var fieldName = null;
  767. if (infoGridField.sortFieldName != undefined && infoGridField.sortFieldName != '') {
  768. fieldName = infoGridField.sortFieldName;
  769. } else {
  770. fieldName = infoGridField.fieldName;
  771. }
  772. var sortStr = fieldName + _self.sortStyle;
  773. _self.infoQueryParam.sortClause = sortStr;
  774. if (_self.currentIsSimpleSearch) {
  775. _self.queryInfoWindowDataSimple();
  776. } else {
  777. _self.queryInfoWindowDataComplex();
  778. }
  779. _self.sortStyle = _self.sortStyle == ' ASC' ? ' DESC' : ' ASC';
  780. },
  781. /**
  782. * 重新加载数据以后,重新计算当前界面的选择项
  783. */
  784. reSelectedNode: function (fieldValue) {
  785. if (!fieldValue) {
  786. return;
  787. }
  788. var _self = this;
  789. var ids = [];
  790. if (fieldValue.displayType == 'MultiSearchBoxEditor') {
  791. ids = fieldValue.ids;
  792. } else if (fieldValue.fieldType == 'ManyToManyKey') {
  793. ids = fieldValue.ids;
  794. } else if (fieldValue.fieldType == 'Key') {
  795. ids.push(fieldValue.id);
  796. } else {
  797. return;
  798. }
  799. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  800. if (this.infoWindowData && this.infoWindowData.dataList) {
  801. this.infoWindowData.dataList.forEach(function (node) {
  802. if (ids.indexOf(node.id) > -1) {
  803. _self.selectedModelDatas.push(node);
  804. }
  805. });
  806. }
  807. },
  808. /**
  809. * 冻结表头
  810. */
  811. fixedTableHeader: function () {
  812. let _self = this;
  813. _self.$nextTick(function () {
  814. var $th = $('#' + _self.tableOutDivId).find('thead');
  815. $('#' + _self.tableOutDivId).on('scroll', function () {
  816. $th.css('transform', 'translateY(' + this.scrollTop + 'px)');
  817. });
  818. });
  819. },
  820. },
  821. };
  822. </script>
  823. <style scoped>
  824. .sort-button {
  825. float: left;
  826. }
  827. .fixed-table {
  828. table-layout: fixed;
  829. }
  830. table.fixed-table tr th {
  831. text-align: center;
  832. }
  833. table.fixed-table td {
  834. text-align: center;
  835. word-wrap: break-word;
  836. word-break: normal;
  837. }
  838. .btn-process {
  839. float: right;
  840. margin-left: 15px;
  841. }
  842. .mulitiple-select {
  843. background-color: #6699cc !important;
  844. }
  845. table.fixed-table th {
  846. position: relative;
  847. min-width: 25px;
  848. }
  849. table.fixed-table th,
  850. table.fixed-table td {
  851. overflow: hidden;
  852. white-space: nowrap;
  853. text-overflow: ellipsis;
  854. border-right: 1px solid rgba(0, 0, 0, 0.05);
  855. }
  856. table.fixed-table th {
  857. min-width: 10px;
  858. background-color: #f8f8f8;
  859. }
  860. table.fixed-table th .rz-handle {
  861. width: 10px;
  862. height: 100%;
  863. position: absolute;
  864. top: 0;
  865. right: 0;
  866. background: repeating-linear-gradient(
  867. 45deg,
  868. transparent,
  869. transparent 2px,
  870. rgba(0, 0, 0, 0.05) 2px,
  871. rgba(0, 0, 0, 0.05) 4px
  872. );
  873. cursor: ew-resize !important;
  874. }
  875. table.fixed-table th .rz-handle.rz-handle-active {
  876. border-right: 2px solid #000;
  877. transform: scaleX(100);
  878. background: rgba(0, 0, 0, 0.05) 2px;
  879. }
  880. .rz-handle:hover {
  881. background: rgba(0, 0, 0, 0.2) 4px;
  882. }
  883. .flex-container {
  884. display: flex;
  885. /* 垂直*/
  886. flex-direction: column;
  887. width: 100%;
  888. /*视口被均分为100单位的vh 占据整个窗口*/
  889. height: calc(100vh - 75px);
  890. }
  891. .flex-container-modal {
  892. display: flex;
  893. /* 垂直*/
  894. flex-direction: column;
  895. width: 100%;
  896. /*视口被均分为100单位的vh 占据整个窗口*/
  897. height: calc(100vh - 215px);
  898. }
  899. .flex-header {
  900. /*放大缩小比例为0 占据垂直方向80px*/
  901. height: 400px;
  902. flex: 0 0 100px;
  903. }
  904. .flex-footer {
  905. height: 40px;
  906. flex: 0 0 40px;
  907. }
  908. .flex-content {
  909. display: flex;
  910. flex: 1;
  911. height: 0;
  912. }
  913. .flex-main {
  914. overflow: scroll;
  915. flex: 1;
  916. margin-bottom: 0px;
  917. }
  918. </style>
  919. <style scoped>
  920. /** 修复分页的样式 By YangZhiJie 2021-07-06 11:23 */
  921. nav >>> ul.pagination {
  922. margin: 0 !important;
  923. }
  924. </style>
  925. <style scoped>
  926. .warning {
  927. background-color: #fcf8e3 !important;
  928. }
  929. .text-center {
  930. text-align: center !important;
  931. }
  932. </style>