QueryPage.vue 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031
  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 v-if="loading" />
  160. <Modal v-model:show="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. loading: false,
  259. modal: false,
  260. };
  261. },
  262. computed: {
  263. tableWidth: function () {
  264. var totalWidth = 50;
  265. if (this.infoWindowDto != undefined && this.infoGridFields != undefined) {
  266. this.infoGridFields.forEach(function (item) {
  267. if (item.isShow) {
  268. totalWidth += Number(item.width);
  269. }
  270. });
  271. }
  272. return totalWidth + 'px';
  273. },
  274. },
  275. watch: {
  276. /**
  277. * 是否选择了全部的数据
  278. */
  279. isSelectAll: function (val) {
  280. var _self = this;
  281. if (_self.multipleSelect) {
  282. if (_self.isSelectAll) {
  283. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  284. if (val) {
  285. _self.infoWindowData.dataList.forEach(function (item) {
  286. item.select = true;
  287. _self.selectedModelDatas.push(item);
  288. });
  289. }
  290. } else {
  291. _self.infoWindowData.dataList.forEach(function (item) {
  292. item.select = false;
  293. });
  294. _self.selectedModelDatas = [];
  295. }
  296. } else {
  297. _self.isSelectAll = false;
  298. }
  299. },
  300. /**
  301. * 路由发生改变
  302. */
  303. $route: function (to, from) {
  304. var _self = this;
  305. _self.infoWindowData = {};
  306. },
  307. /**
  308. * 选择的数据发生改变
  309. */
  310. // selectedModelDatas: function(to, from){
  311. // var _self = this;
  312. // if(!_self.multipleSelect){
  313. // if(to.length > 1){
  314. // _self.selectedModelDatas.splice(0, to.length - 1);
  315. // }
  316. // }
  317. // },
  318. /**
  319. * fieldValue发生改变
  320. */
  321. fieldValue: function (to, from) {
  322. this.reSelectedNode(to);
  323. },
  324. },
  325. methods: {
  326. // 页码数量改变
  327. gridSizeSelect: function (newPageSize) {
  328. this.pagination.per_page = newPageSize;
  329. this.pagination.current_page = 1;
  330. },
  331. ondragstart: function (event, gridFieldItem) {
  332. var _self = this;
  333. _self.startX = event.pageX;
  334. _self.startWidth = Number(gridFieldItem.width);
  335. event.dataTransfer.setDragImage(event.target, 0, 20);
  336. event.dataTransfer.effectAllowed = 'move';
  337. },
  338. ondrag: function (event, gridFieldItem) {
  339. var _self = this;
  340. gridFieldItem.width = _self.startWidth + (event.pageX - _self.startX);
  341. },
  342. ondragend: function (event, gridFieldItem, index) {
  343. var _self = this;
  344. let newWidth = _self.startWidth + (event.pageX - _self.startX);
  345. if (newWidth < 50) {
  346. newWidth = 50;
  347. }
  348. gridFieldItem.width = newWidth;
  349. InfoUtil.saveInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  350. },
  351. ondragover: function (event, gridFieldItem) {
  352. event.preventDefault();
  353. event.dataTransfer.dropEffect = 'move';
  354. },
  355. // 初始化数据
  356. initWidget: function (data) {
  357. var _self = this;
  358. if (data == undefined) {
  359. return;
  360. }
  361. _self.infoWindowDto = data;
  362. _self.infoFilterFields = data.infoFilterFields;
  363. _self.infoGridFields = data.infoGridFields;
  364. // var sortNo = 10;
  365. _self.infoGridFields.forEach(function (item) {
  366. item.width = 150;
  367. });
  368. _self.infoFilterFields.forEach(function (item) {
  369. item.value = {
  370. 'infoFilterFieldId': item.id,
  371. 'value1': '',
  372. 'value2': '',
  373. };
  374. });
  375. InfoUtil.restoreInfoFilterFields(_self.infoWindowDto.no, _self.infoFilterFields);
  376. InfoUtil.restoreInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  377. _self.simpleSearch();
  378. },
  379. complexSearch: function () {
  380. var _self = this;
  381. _self.pagination.current_page = 1;
  382. var infoQueryParam = {
  383. infoWindowNo: _self.infoWindowDto.no,
  384. start: (_self.pagination.current_page - 1) * _self.pagination.per_page,
  385. length: _self.pagination.per_page,
  386. sortClause: '',
  387. infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
  388. whereClauseSource: _self.whereClauseSource,
  389. parentModelData: _self.parentModelData,
  390. modelData: _self.modelData,
  391. isSearchWidget: _self.isSearchWidget,
  392. };
  393. _self.infoQueryParam = infoQueryParam;
  394. _self.currentIsSimpleSearch = false;
  395. _self.queryInfoWindowDataComplex();
  396. },
  397. pageSearch: function () {
  398. var _self = this;
  399. _self.infoQueryParam.start = (_self.pagination.current_page - 1) * _self.pagination.per_page;
  400. _self.infoQueryParam.length = _self.pagination.per_page;
  401. var isSimpleQuery = _self.$refs.queryCondition.isSimpleQuery();
  402. if (isSimpleQuery) {
  403. _self.queryInfoWindowDataSimple();
  404. } else {
  405. _self.queryInfoWindowDataComplex();
  406. }
  407. },
  408. /**
  409. * 简单查询
  410. * @return {void}
  411. */
  412. simpleSearch: function () {
  413. var _self = this;
  414. _self.pagination.current_page = 1;
  415. var infoQueryParam = {
  416. infoWindowNo: _self.infoWindowDto.no,
  417. start: (_self.pagination.current_page - 1) * _self.pagination.per_page,
  418. length: _self.pagination.per_page,
  419. sortClause: '',
  420. infoFilterFieldValues: _self.$refs.queryCondition.getQueryCondition(),
  421. whereClauseSource: _self.whereClauseSource,
  422. parentModelData: _self.parentModelData,
  423. modelData: _self.modelData,
  424. isSearchWidget: _self.isSearchWidget,
  425. };
  426. _self.infoQueryParam = infoQueryParam;
  427. _self.currentIsSimpleSearch = true;
  428. _self.queryInfoWindowDataSimple();
  429. },
  430. queryInfoWindowDataComplex: function () {
  431. var _self = this;
  432. _self.loading=true;
  433. $.ajax({
  434. url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataComplex'),
  435. type: 'post',
  436. dataType: 'json',
  437. beforeSend: function (request) {
  438. Common.addTokenToRequest(request);
  439. },
  440. contentType: 'application/json',
  441. data: JSON.stringify(_self.infoQueryParam),
  442. success: function (data) {
  443. _self.loading=false;
  444. data.dataList.forEach(function (item) {
  445. item.select = false;
  446. });
  447. _self.infoWindowData = data;
  448. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  449. _self.reSelectedNode(_self.fieldValue);
  450. _self.pagination.total = data.totalSize;
  451. _self.pagination.last_page = Math.ceil(data.totalSize / data.range.length);
  452. _self.fixedTableHeader();
  453. },
  454. error: function (XMLHttpRequest, textStatus, errorThrown) {
  455. _self.loading=false;
  456. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  457. },
  458. });
  459. },
  460. queryInfoWindowDataSimple: function () {
  461. var _self = this;
  462. if (_self.$refs.loading) {
  463. _self.loading=true;
  464. }
  465. _self.infoQueryParam.whereClauseSource = _self.whereClauseSource;
  466. $.ajax({
  467. url: Common.getApiURL('InfoWindowResource/queryInfoWindowDataSimple'),
  468. type: 'post',
  469. dataType: 'json',
  470. beforeSend: function (request) {
  471. Common.addTokenToRequest(request);
  472. },
  473. contentType: 'application/json',
  474. data: JSON.stringify(_self.infoQueryParam),
  475. success: function (data) {
  476. if (_self.$refs.loading) {
  477. _self.loading=false;
  478. }
  479. data.dataList.forEach(function (item) {
  480. item.select = false;
  481. });
  482. _self.infoWindowData = data;
  483. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  484. _self.reSelectedNode(_self.fieldValue);
  485. _self.pagination.total = data.totalSize;
  486. _self.pagination.last_page = Math.ceil(data.totalSize / data.range.length);
  487. _self.fixedTableHeader();
  488. },
  489. error: function (XMLHttpRequest, textStatus, errorThrown) {
  490. if (_self.$refs.loading) {
  491. _self.loading=false;
  492. }
  493. Common.processException(XMLHttpRequest, textStatus, errorThrown);
  494. },
  495. });
  496. },
  497. /**
  498. * 双击表格行事件
  499. */
  500. selectNode: function (modelData) {
  501. this.$emit('dataSelected', modelData);
  502. },
  503. /**
  504. * 选择/取消选择表格行中的复选框事件
  505. */
  506. selectNodeForSearch: function (modelData) {
  507. var _self = this;
  508. if ((_self.fieldValue != undefined) && (_self.fieldValue.fieldType == 'ManyToManyKey')) {
  509. // CRUD-ManyToManySetBoxEditor多选搜索框-多选
  510. } else if ((_self.fieldValue != undefined) && (_self.fieldValue.displayType == 'MultiSearchBoxEditor')) {
  511. // 多选
  512. } else if ((_self.fieldValue != undefined) && (_self.fieldValue.fieldType == 'Key')) {
  513. // 单选
  514. // 清空选择项
  515. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  516. }
  517. var currentStatus = modelData.select;
  518. var index = _self.selectedModelDatas.indexOf(modelData);
  519. if (!_self.multipleSelect) {
  520. _self.selectedModelDatas = [];
  521. _self.infoWindowData.dataList.forEach(function (item) {
  522. item.select = false;
  523. });
  524. }
  525. modelData.select = !currentStatus;
  526. if (index < 0) {
  527. _self.selectedModelDatas.push(modelData);
  528. _self.$emit('dataSelected', modelData);
  529. } else {
  530. _self.selectedModelDatas.splice(index, 1);
  531. _self.$emit('deleteSelected', modelData);
  532. }
  533. },
  534. /**
  535. * 获取选择的数据
  536. */
  537. getSelectedModelDatas: function (data) {
  538. var _self = this;
  539. return _self.selectedModelDatas;
  540. },
  541. /**
  542. * 条件字段属性发生改变
  543. */
  544. filterFieldPropertyChanged: function (infoFilterFieldsClone) {
  545. let _self = this;
  546. InfoUtil.saveInfoFilterFields(_self.infoWindowDto.no, infoFilterFieldsClone).then(successData => {
  547. InfoUtil.restoreInfoFilterFields(_self.infoWindowDto.no, _self.infoFilterFields);
  548. }, errorData => {
  549. console.log(errorData);
  550. });
  551. },
  552. /**
  553. * 表格字段属性发生改变
  554. */
  555. gridFieldPropertyChanged: function (infoGridFieldsClone) {
  556. let _self = this;
  557. InfoUtil.saveInfoGridFields(_self.infoWindowDto.no, infoGridFieldsClone).then(successData => {
  558. InfoUtil.restoreInfoGridFields(_self.infoWindowDto.no, _self.infoGridFields);
  559. }, errorData => {
  560. console.log(errorData);
  561. });
  562. },
  563. /**
  564. * 执行流程
  565. * @param {Object} infoButton
  566. * @return {void}
  567. */
  568. executeProcess: function (infoButton) {
  569. var _self = this;
  570. if (infoButton == null) {
  571. return;
  572. }
  573. if (infoButton.htmlWindowNo != null && infoButton.htmlWindowNo.length > 0) {
  574. HtmlWindowResource.uniqueByNo(infoButton.htmlWindowNo).then(htmlWindowDto => {
  575. if (htmlWindowDto != undefined) {
  576. var htmlWindowUrl = htmlWindowDto.htmlFileName;
  577. var autoCloseInterval = htmlWindowDto.autoCloseInterval;
  578. var regExp = new RegExp('[{].*?[}]', 'g');
  579. var result = htmlWindowUrl.match(regExp);
  580. if (htmlWindowUrl != undefined && htmlWindowUrl != '') {
  581. for (var index = 0, len = result.length; index < len; index++) {
  582. var tempResult = result[index];
  583. console.log('{' + tempResult + '}匹配');
  584. if (tempResult == '{URL}') {
  585. htmlWindowUrl = htmlWindowUrl.replace('{URL}', Common.getRedirectUrl(''));
  586. console.log('{' + htmlWindowUrl + '}地址');
  587. } else if (tempResult == '{RecordId}') {
  588. if (_self.selectedModelDatas.length == 0) {
  589. Notify.error('错误', '未选择可操作的数据', true);
  590. return;
  591. }
  592. htmlWindowUrl = htmlWindowUrl.replace('{RecordId}', _self.getFirstSelectRecordId());
  593. } else if (tempResult == '{RecordIds}') {
  594. if (_self.selectedModelDatas.length == 0) {
  595. Notify.error('错误', '未选择可操作的数据', true);
  596. return;
  597. }
  598. htmlWindowUrl = htmlWindowUrl.replace('{RecordIds}', _self.getSelectedRecordIds());
  599. } else if (tempResult == '{Token}') {
  600. htmlWindowUrl = htmlWindowUrl.replace('{Token}', Common.getToken());
  601. } else if (tempResult == '{infoWindowNo}') {
  602. htmlWindowUrl = htmlWindowUrl.replace('{infoWindowNo}', _self.infoWindowDto.no);
  603. } else {
  604. if (_self.selectedModelDatas.length == 0) {
  605. Notify.error('错误', '未选择可操作的数据', true);
  606. return;
  607. } else if (_self.selectedModelDatas.length > 1) {
  608. Notify.error('错误', '请选择一条数据', true);
  609. return;
  610. }
  611. var tempResult1 = tempResult.replace('{', '').replace('}', '');
  612. htmlWindowUrl = htmlWindowUrl.replace(tempResult, _self.getFirstSelectModelDataFieldValue(tempResult1));
  613. }
  614. }
  615. var openWindow = window.open(htmlWindowUrl);
  616. // 自动关闭
  617. if (autoCloseInterval != undefined) {
  618. setTimeout(function () {
  619. openWindow.close();
  620. openWindow = undefined;
  621. }, autoCloseInterval * 1000);
  622. }
  623. }
  624. }
  625. }, errorData => {
  626. Common.processException(errorData);
  627. });
  628. } else if (infoButton.customerWindowNo != null && infoButton.customerWindowNo.length > 0) {
  629. CustomerWindowResource.uniqueByNo(infoButton.customerWindowNo).then(customerWindowDto => {
  630. var customerWindowRouteUrl = customerWindowDto.routeUrl;
  631. if (customerWindowRouteUrl != undefined && customerWindowRouteUrl != '') {
  632. if (customerWindowRouteUrl == 'exportInfoData') {
  633. var downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
  634. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  635. + '&token=' + Common.getToken();
  636. window.open(downloadUrl);
  637. } else {
  638. // if (_self.selectedModelDatas.length == 0) {
  639. // Notify.error("错误", "未选择可操作的数据", true);
  640. // return;
  641. // }
  642. localStorage.setItem(_self.uuid, JSON.stringify(_self.selectedModelDatas));
  643. var routeDate = {
  644. path: customerWindowRouteUrl,
  645. query: {
  646. 'uuid': _self.uuid,
  647. },
  648. };
  649. _self.$router.push(routeDate);
  650. }
  651. }
  652. }, errorData => {
  653. Common.processException(errorData);
  654. });
  655. } else if (infoButton.processReportNo != null && infoButton.processReportNo.length > 0) {
  656. var processReportNo = infoButton.processReportNo;
  657. if (processReportNo != undefined && processReportNo != '') {
  658. var ids = _self.getSelectedRecordIds();
  659. if (ids.length < 1) {
  660. Notify.error('错误', '未选择可操作的数据', true);
  661. return;
  662. }
  663. _self.loading=true;
  664. ProcessReportResource.uniqueByNo(infoButton.processReportNo).then(successData => {
  665. _self.processReportDto = successData;
  666. if (successData) {
  667. _self.pdfOnly = successData.pdfOnly;
  668. _self.excelOnly = successData.excelOnly;
  669. }
  670. ProcessReportResource.runProcessByIds(infoButton.processReportNo, ids).then(successData => {
  671. _self.modal = true;
  672. _self.loading=false;
  673. _self.processReportResult = successData;
  674. _self.$emit('processExecuteFinish');
  675. }, errorData => {
  676. _self.loading=false;
  677. Common.processException(errorData);
  678. });
  679. }, errorData => {
  680. _self.loading=false;
  681. Common.processException(errorData);
  682. });
  683. }
  684. }
  685. },
  686. /**
  687. * 执行导出
  688. * @return {void}
  689. */
  690. executeExport: function () {
  691. var _self = this;
  692. var isSimpleQuery = _self.$refs.queryCondition.isSimpleQuery();
  693. if(isSimpleQuery){
  694. let condition = _self.$refs.queryCondition.getQueryCondition();
  695. let downloadUrl = Common.getApiURL('exportResource/exportInfoDataSimple') + '?infoWindowNo=' + _self.infoWindowDto.no
  696. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  697. + '&infoFilterFieldValues=' + _self.uuid
  698. + '&condition=' + condition;
  699. let timeStr = moment().format('_YYYYMMDD_hhmmss');
  700. let fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
  701. DownloadService.downloadFile(downloadUrl, fileName);
  702. }else{
  703. let infoFilterFieldValues = _self.$refs.queryCondition.getQueryCondition();
  704. let infoFilterFieldValueStrs = JSON.stringify(infoFilterFieldValues);
  705. let downloadUrl = Common.getApiURL('exportResource/exportInfoDataComplex') + '?infoWindowNo=' + _self.infoWindowDto.no
  706. + '&recordIds=' + _self.getSelectedRecordIds().join(',')
  707. + '&infoFilterFieldValues=' + _self.uuid;
  708. let timeStr = moment().format('_YYYYMMDD_hhmmss');
  709. let fileName = (_self.infoWindowDto == null ? '导出数据' + timeStr + '.xls' : _self.infoWindowDto.name + timeStr + '.xls');
  710. let userStorageDtos = [
  711. {
  712. key: _self.uuid,
  713. value: infoFilterFieldValueStrs,
  714. },
  715. ];
  716. // 组装查询条件,然后放到后台数据库当中
  717. UserStorageResource.uploadUserStorage(userStorageDtos).then(successData => {
  718. DownloadService.downloadFile(downloadUrl, fileName);
  719. }, errorData => {
  720. Common.processException(errorData);
  721. });
  722. }
  723. },
  724. /**
  725. * 获取选择数据的Id集合
  726. */
  727. getSelectedRecordIds: function () {
  728. var _self = this;
  729. var recordIds = [];
  730. _self.selectedModelDatas.forEach(function (selectedModelData) {
  731. recordIds.push(selectedModelData.id);
  732. });
  733. return recordIds;
  734. },
  735. /**
  736. * 获取选中的第一个数据的Id
  737. */
  738. getFirstSelectRecordId: function () {
  739. var _self = this;
  740. if (_self.selectedModelDatas.length > 0) {
  741. return _self.selectedModelDatas[0].id;
  742. }
  743. return undefined;
  744. },
  745. /**
  746. * 获取选中的第一个数据的FieldValue
  747. */
  748. getFirstSelectModelDataFieldValue: function (name) {
  749. var _self = this;
  750. if (_self.selectedModelDatas.length > 0) {
  751. if (_self.selectedModelDatas[0].data[name] != undefined) {
  752. return _self.selectedModelDatas[0].data[name].displayValue[0];
  753. }
  754. }
  755. return undefined;
  756. },
  757. /**
  758. * 切换全选/单选
  759. */
  760. changeSelectMode: function () {
  761. this.multipleSelect = !this.multipleSelect;
  762. },
  763. /**
  764. * 排序
  765. */
  766. onSort: function (infoGridField) {
  767. var _self = this;
  768. var fieldName = null;
  769. if (infoGridField.sortFieldName != undefined && infoGridField.sortFieldName != '') {
  770. fieldName = infoGridField.sortFieldName;
  771. } else {
  772. fieldName = infoGridField.fieldName;
  773. }
  774. var sortStr = fieldName + _self.sortStyle;
  775. _self.infoQueryParam.sortClause = sortStr;
  776. if (_self.currentIsSimpleSearch) {
  777. _self.queryInfoWindowDataSimple();
  778. } else {
  779. _self.queryInfoWindowDataComplex();
  780. }
  781. _self.sortStyle = _self.sortStyle == ' ASC' ? ' DESC' : ' ASC';
  782. },
  783. /**
  784. * 重新加载数据以后,重新计算当前界面的选择项
  785. */
  786. reSelectedNode: function (fieldValue) {
  787. if (!fieldValue) {
  788. return;
  789. }
  790. var _self = this;
  791. var ids = [];
  792. if (fieldValue.displayType == 'MultiSearchBoxEditor') {
  793. ids = fieldValue.ids;
  794. } else if (fieldValue.fieldType == 'ManyToManyKey') {
  795. ids = fieldValue.ids;
  796. } else if (fieldValue.fieldType == 'Key') {
  797. ids.push(fieldValue.id);
  798. } else {
  799. return;
  800. }
  801. _self.selectedModelDatas.splice(0, _self.selectedModelDatas.length);
  802. if (this.infoWindowData && this.infoWindowData.dataList) {
  803. this.infoWindowData.dataList.forEach(function (node) {
  804. if (ids.indexOf(node.id) > -1) {
  805. _self.selectedModelDatas.push(node);
  806. }
  807. });
  808. }
  809. },
  810. /**
  811. * 冻结表头
  812. */
  813. fixedTableHeader: function () {
  814. let _self = this;
  815. _self.$nextTick(function () {
  816. var $th = $('#' + _self.tableOutDivId).find('thead');
  817. $('#' + _self.tableOutDivId).on('scroll', function () {
  818. $th.css('transform', 'translateY(' + this.scrollTop + 'px)');
  819. });
  820. });
  821. },
  822. },
  823. };
  824. </script>
  825. <style scoped>
  826. .sort-button {
  827. float: left;
  828. }
  829. .fixed-table {
  830. table-layout: fixed;
  831. }
  832. table.fixed-table tr th {
  833. text-align: center;
  834. }
  835. table.fixed-table td {
  836. text-align: center;
  837. word-wrap: break-word;
  838. word-break: normal;
  839. }
  840. .btn-process {
  841. float: right;
  842. margin-left: 15px;
  843. }
  844. .mulitiple-select {
  845. background-color: #6699cc !important;
  846. }
  847. table.fixed-table th {
  848. position: relative;
  849. min-width: 25px;
  850. }
  851. table.fixed-table th,
  852. table.fixed-table td {
  853. overflow: hidden;
  854. white-space: nowrap;
  855. text-overflow: ellipsis;
  856. border-right: 1px solid rgba(0, 0, 0, 0.05);
  857. }
  858. table.fixed-table th {
  859. min-width: 10px;
  860. background-color: #f8f8f8;
  861. }
  862. table.fixed-table th .rz-handle {
  863. width: 10px;
  864. height: 100%;
  865. position: absolute;
  866. top: 0;
  867. right: 0;
  868. background: repeating-linear-gradient(
  869. 45deg,
  870. transparent,
  871. transparent 2px,
  872. rgba(0, 0, 0, 0.05) 2px,
  873. rgba(0, 0, 0, 0.05) 4px
  874. );
  875. cursor: ew-resize !important;
  876. }
  877. table.fixed-table th .rz-handle.rz-handle-active {
  878. border-right: 2px solid #000;
  879. transform: scaleX(100);
  880. background: rgba(0, 0, 0, 0.05) 2px;
  881. }
  882. .rz-handle:hover {
  883. background: rgba(0, 0, 0, 0.2) 4px;
  884. }
  885. .flex-container {
  886. display: flex;
  887. /* 垂直*/
  888. flex-direction: column;
  889. width: 100%;
  890. /*视口被均分为100单位的vh 占据整个窗口*/
  891. height: calc(100vh - 75px);
  892. }
  893. .flex-container-modal {
  894. display: flex;
  895. /* 垂直*/
  896. flex-direction: column;
  897. width: 100%;
  898. /*视口被均分为100单位的vh 占据整个窗口*/
  899. height: calc(100vh - 215px);
  900. }
  901. .flex-header {
  902. /*放大缩小比例为0 占据垂直方向80px*/
  903. height: 400px;
  904. flex: 0 0 100px;
  905. }
  906. .flex-footer {
  907. height: 40px;
  908. flex: 0 0 40px;
  909. }
  910. .flex-content {
  911. display: flex;
  912. flex: 1;
  913. height: 0;
  914. }
  915. .flex-main {
  916. overflow: scroll;
  917. flex: 1;
  918. margin-bottom: 0px;
  919. }
  920. </style>
  921. <style scoped>
  922. /** 修复分页的样式 By YangZhiJie 2021-07-06 11:23 */
  923. nav >>> ul.pagination {
  924. margin: 0 !important;
  925. }
  926. </style>
  927. <style scoped>
  928. .warning {
  929. background-color: #fcf8e3 !important;
  930. }
  931. .text-center {
  932. text-align: center !important;
  933. }
  934. </style>