index.vue 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540
  1. <template>
  2. <div :style="pageTableHeight" class="TablePage">
  3. <PublicPageHeader class="TablePage_header" :page-title="dataTitle ? dataTitle : pageTitle">
  4. <AuthButton :auth="pageAuthBtnAdd" />
  5. <AuthButton :auth="pageAuthBtnQuery" />
  6. </PublicPageHeader>
  7. <div :style="pageTableContentHeight" class="TablePage_content flex-wrap">
  8. <div v-if="treeData.length" class="TablePage_content_left">
  9. <PublicPageTree :tree-data="treeData" @treeNodeClick="treeNodeClick" />
  10. </div>
  11. <div :class="treeData.length ? 'tableSacle' : 'tableAuto'" class="TablePage_content_right">
  12. <PublicPageTable :loading="loading" :table-cols="tableCols" :table-btns="authBtns" :data="tableData" :header-cell-class-name="headerCellClass" :row-class-name="rowClass" :cell-class-name="cellClass" :formatter="tableFormatter" show-summary @mounted="tableMountedHandler" @load="load" @cell-click="cellClickHandler" @handleEdit="handleEdit" @handleOther="handleOther" @handleRemove="handleRemove" />
  13. </div>
  14. </div>
  15. <div class="TablePage_dialog">
  16. <!--新增/编辑-->
  17. <PublicPageDialog :dialog-title="tableTitle" dialogSize="630px" :dialog-drawer="flag" @handleClose="submitClickClose('ruleForm')" @handleSubmit="submitClickHandler">
  18. <PublicPageForm ref="ruleForm" :label-width="labelWidth" :form-item="formItem" :form-data="tableForm" />
  19. </PublicPageDialog>
  20. <!--删除-->
  21. <PublicPageDialog dialog-title="删除" :dialog-drawer="rmFlag" @handleClose="rmFlag = false" @handleSubmit="tableRemove">
  22. <div class="content del-content">
  23. <span class="el-icon-error error r10"></span>您是否确认删除<span class="error l10">{{ rmTitle }}</span>
  24. </div>
  25. </PublicPageDialog>
  26. <!--高级查询-->
  27. <PublicPageDialog dialog-title="高级查询" dialogSize="600px" :dialog-drawer="advancedDrawer" @handleClose="advancedDrawer = false" @handleSubmit="advancedTable('advancedDialogForm')">
  28. <AdvancedQuery ref="advancedDialogForm" @getAdvancedQueryData="getAdvancedQueryData" />
  29. <template slot="d_foot">
  30. <el-button size="small" @click="queryCollect('advancedDialogForm')" type="primary">收藏</el-button>
  31. </template>
  32. </PublicPageDialog>
  33. </div>
  34. </div>
  35. </template>
  36. <script>
  37. import PublicPageHeader from '@/components/PublicPageHeader'
  38. import PublicPageTable from '@/components/SimpleTable'
  39. import PublicPageTree from '@/components/publicPageTree'
  40. import PublicPageDialog from '@/components/PublicPageDialog'
  41. import PublicPageForm from '@/components/publicPageForm'
  42. import AdvancedQuery from '@/components/AdvancedQuery'
  43. import AuthButton from '@/components/AuthButton'
  44. import { mapGetters } from 'vuex'
  45. import { Query, newData, modifyData, moveData } from "@/api/webApi"
  46. export default {
  47. name: 'TablePage',
  48. components: { PublicPageHeader, PublicPageTable, PublicPageDialog, PublicPageTree, PublicPageForm, AdvancedQuery, AuthButton },
  49. props: {
  50. dataTitle: {
  51. type: String,
  52. default: ''
  53. },
  54. msgContent: {
  55. type: Object,
  56. default: () => new Object()
  57. }
  58. },
  59. data () {
  60. return {
  61. page: 0, //当前table页面
  62. noMore: false, //当前table是否加载到最后开关
  63. loading: false, //页面加载
  64. advancedDrawer: false, //高级查询弹框开关
  65. defaultfilter: { 1: 1 }, //默认查询参数
  66. pageQuery: {},
  67. dialogFlag: false,
  68. pageTitle: '', //页面名称
  69. treeData: [], //tree数据
  70. treeParameters: {}, //tree传递参数
  71. tableCols: [], //表头数据
  72. tableData: [], //表格数据
  73. tableBtns: [], //表格按钮权限
  74. authBtns: [], //表格里面的操作按钮
  75. dataContent: {}, //表格查询数据
  76. pageServiceId: null, //表格serviceid
  77. formItem: [], //弹框表单渲染数据
  78. flag: false, //弹框表单开关
  79. tableType: "add", //弹框表单弹框类型
  80. tableTitle: "新增", //弹框表单标题
  81. tableForm: {}, //弹框表单数据
  82. rmFlag: false, //删除弹框开关
  83. rmTitle: '', //删除弹框标题
  84. tableObj: {}, //删除数据
  85. tableOptions: {}, //表单数据下拉
  86. labelWidth: '120px', //表单文字距离
  87. fromDataReqCatch: [], //表单规则缓存
  88. tableKey:null,//表格主键
  89. }
  90. },
  91. computed: {
  92. ...mapGetters(['authArrs']),
  93. pageTableHeight () {
  94. if (Object.keys(this.msgContent).length) return 'height:100%'
  95. return ''
  96. },
  97. pageTableContentHeight () {
  98. if (Object.keys(this.msgContent).length) return 'height:calc(100% - 60px)'
  99. return ''
  100. },
  101. pageAuthBtnQuery () {
  102. return this.tableBtns.filter(item => item.servicetype == 1)[0]
  103. },
  104. pageAuthBtnAdd () {
  105. return this.tableBtns.filter(item => item.servicetype == 2)[0]
  106. },
  107. pageAuthBtnEdit () {
  108. return this.tableBtns.filter(item => item.servicetype == 3)[0]
  109. },
  110. pageAuthBtnDel () {
  111. return this.tableBtns.filter(item => item.servicetype == 4)[0]
  112. },
  113. pageAuthBtnOther () {
  114. return this.tableBtns.filter(item => item.servicetype == 5)[0]
  115. },
  116. },
  117. mounted () {
  118. this.pageInit()
  119. },
  120. methods: {
  121. //页面初始化
  122. pageInit () {
  123. //获取页面查询参数
  124. const { query } = this.$route
  125. this.pageQuery = query
  126. //获取页面配置
  127. const { pagecode, qid, auth_id } = this.$route.meta
  128. //获取页面权限类型组件  pagetype 1模块  2页面  3按钮 4表格 5树形  6弹窗
  129. const pageAuths = this.authArrs
  130. if (!pageAuths.length) return
  131. //获取当前页面权限类型
  132. const pageAuthArrs = pageAuths.filter(item => item['superiorid'] == auth_id)
  133. if (!pageAuthArrs.length) return
  134. //获取tree权限
  135. const pageAuthtrees = pageAuthArrs.filter(item => item.pagetype == 5)
  136. if (pageAuthtrees?.length) this.getPageTreeSetting(pageAuths, pageAuthtrees)
  137. //获取table权限
  138. const pageAuthtables = pageAuthArrs.filter(item => item.pagetype == 3)
  139. if (pageAuthtables?.length) this.getPageTableSetting(pageAuths, pageAuthtables)
  140. //获取按钮权限
  141. const pageAuthbtns = pageAuthArrs.filter(item => item.pagetype == 4)
  142. if (pageAuthbtns?.length) this.getPageBtnSetting(pageAuthbtns)
  143. },
  144. //根据页面tree设置数据
  145. getPageTreeSetting (pageAuths, pageAuthtrees) {
  146. const { passparameters } = pageAuthtrees[0]
  147. this.treeParameters = passparameters
  148. this.treeData = pageAuthtrees
  149. },
  150. //根据页面table设置数据
  151. getPageTableSetting (pageAuths, pageAuthtables) {
  152. const authTableObj = pageAuthtables[0]
  153. //获取当前页面table的配置
  154. const { pagename, pageconfigurationid, serviceid, pagecode, userpermissionsid, defaultfilter } = authTableObj
  155. //获取当前页面table的按钮权限
  156. const currPageBtns = pageAuths.filter(item => item['superiorid'] == pageconfigurationid)
  157. if (currPageBtns?.length) this.tableBtns.push(...currPageBtns)
  158. this.authBtns = pageAuths.filter(item => item.superiorid == pageconfigurationid && item.pagetype == 4)
  159. this.pageServiceId = Object.keys(this.msgContent).length ? this.msgContent.serviceid : serviceid;
  160. this.pageTitle = pagename
  161. this.defaultfilter = Object.keys(this.pageQuery).length ? this.pageQuery : defaultfilter ? this.formatDefault(defaultfilter, authTableObj) : { 1: 1 }
  162. this.getColumnData(pagecode, userpermissionsid)
  163. },
  164. //根据页面按钮设置数据
  165. getPageBtnSetting (pageAuthbtns) {
  166. this.tableBtns.push(...pageAuthbtns)
  167. },
  168. //获取表头数据
  169. async getColumnData (pagecode, id) {
  170. try {
  171. const { code, returnData } = await Query({
  172. serviceid: '3',
  173. datacontent: { filter: Object.keys(this.msgContent).length ? this.msgContent : { pagecode } },
  174. event: "0"
  175. });
  176. if (code == 0) {
  177. if (returnData?.length) {
  178. this.$store.dispatch('auth/changeAuthMsg', returnData)
  179. const tableColsCopy = _.cloneDeep(returnData).filter((item) => item.isdisplay == 2);
  180. const tableColsCopyOrder = _.orderBy(tableColsCopy, ['displaynumber'], ['asc']);
  181. const formItemCopy = _.cloneDeep(returnData).filter((item) => item.isdisplay == 2 || item.isdisplay == 3);
  182. this.formItem = _.orderBy(formItemCopy, ['displaynumber'], ['asc']);
  183. this.tableCols = tableColsCopyOrder;
  184. const columncode = returnData.find(
  185. (item) => item.isprimarykey == 1
  186. );
  187. if (columncode && Object.keys(columncode).length) {
  188. this.tableKey = columncode['columncode']
  189. }
  190. }
  191. } else {
  192. this.$message.error("获取表头数据失败");
  193. }
  194. } catch (error) {
  195. console.log(error)
  196. }
  197. },
  198. //获取tree点击
  199. treeNodeClick (data) {
  200. const filterItem = this.formatDefault(this.treeParameters, data)
  201. if (!Object.keys(filterItem).length) return
  202. this.defaultfilter = filterItem
  203. this.queryTableData(true)
  204. },
  205. //格式化传递参数数据
  206. formatDefault (item, data = {}) {
  207. if (typeof item != 'string') return {}
  208. const filterItem = {}
  209. const parameters = item.replace('{', '').replace('}', '')
  210. const parametersSplit = parameters?.split(',')
  211. parametersSplit.map(item => {
  212. const [key, val] = item?.split(':')
  213. filterItem[key] = data[val]
  214. })
  215. return filterItem
  216. },
  217. //表单-新增
  218. handleAdd () {
  219. const { openmode, pageroute } = this.pageAuthBtnAdd
  220. if (!openmode) return
  221. if (openmode != 2) this.autoBtnClick(openmode, pageroute)
  222. this.flag = true;
  223. this.tableType = "add";
  224. this.tableTitle = "新增";
  225. this.tableForm = {};
  226. for(let key in this.pageQuery){
  227. this.tableForm[key] = this.pageQuery[key]
  228. }
  229. },
  230. //表格-编辑
  231. handleEdit (row) {
  232. const { openmode, pageroute } = this.pageAuthBtnEdit
  233. if (!openmode) return
  234. if (openmode != 2) this.autoBtnClick(openmode, pageroute)
  235. this.flag = true;
  236. this.tableType = "edit";
  237. this.tableTitle = "编辑";
  238. this.tableForm = _.cloneDeep(row);
  239. },
  240. //表格-其他类型按钮操作
  241. handleOther (row, auth) {
  242. const { openmode, pageroute, passparameters } = this.pageAuthBtnOther
  243. if (!openmode) return
  244. if (openmode != 2) this.autoBtnClick(openmode, pageroute, passparameters, row)
  245. },
  246. //表格-删除
  247. handleRemove (row) {
  248. const { columncode } = this.tableCols[0]
  249. const { openmode, pageroute } = this.pageAuthBtnDel
  250. if (!openmode) return
  251. if (openmode != 2) this.autoBtnClick(openmode, pageroute)
  252. this.rmFlag = true;
  253. this.rmTitle = row[columncode];
  254. this.tableObj = row;
  255. },
  256. //表格-删除-确认
  257. tableRemove () {
  258. this.generalDataReception(3, this.tableObj,this.tableKey);
  259. },
  260. // 新增/编辑-取消
  261. submitClickClose (formName) {
  262. this.flag = false
  263. this.$refs[formName].restForm()
  264. },
  265. // 新增/编辑-确认
  266. submitClickHandler () {
  267. const flag = this.$refs["ruleForm"].submitClickHandler()
  268. if (flag) this.tableType == "add" ? this.generalDataReception(1, this.tableForm) : this.generalDataReception(2, this.tableForm,this.tableKey)
  269. },
  270. formatChange (data, event, key) {
  271. const datas = []
  272. const flag = Array.isArray(data)
  273. if (flag) {
  274. for (let i = 0; i < data.length; i++) {
  275. let obj = {}
  276. if (event == 1) {
  277. obj.value = data[i]
  278. } else if (event == 2) {
  279. obj.value = data[i]
  280. obj.filter = {}
  281. if (Array.isArray(key)) {
  282. const keys = []
  283. const vals = []
  284. obj.filter = []
  285. for (let j = 0; j < key.length; j++) {
  286. const dep = key[i]
  287. keys.push(Object.keys(dep))
  288. vals.push(Object.values(dep))
  289. }
  290. obj.filter.push(nobj)
  291. if (obj.value.hasOwnProperty(keys[i])) {
  292. delete obj.value[keys[i]]
  293. }
  294. } else {
  295. obj.filter[key] = data[i][key]
  296. if (obj.value[key]) {
  297. delete obj.value[key]
  298. }
  299. }
  300. } else {
  301. obj = data[i]
  302. }
  303. datas.push(obj)
  304. }
  305. } else {
  306. let obj = {}
  307. obj.filter = {}
  308. if (event == 1) {
  309. obj.value = data
  310. } else if (event == 2) {
  311. obj.value = data
  312. obj.filter[key] = obj.value[key]
  313. if (obj.value[key]) {
  314. delete obj.value[key]
  315. }
  316. } else {
  317. obj = data
  318. }
  319. datas.push(obj)
  320. }
  321. return datas
  322. },
  323. //表格-增/删/改
  324. async generalDataReception (event, data, key) {
  325. try {
  326. const params = {
  327. serviceid: this.pageServiceId,
  328. datacontent: this.formatChange(data, event, key),
  329. event: `${event}`,
  330. };
  331. const { code } =
  332. event == 1
  333. ? await newData(params)
  334. : event == 2
  335. ? await modifyData(params)
  336. : await moveData(params);
  337. if (code == 0) {
  338. this.$message.success("操作成功");
  339. this.flag = false;
  340. this.rmFlag = false;
  341. this.tableObj = {};
  342. this.tableForm = {};
  343. this.resetTable();
  344. this.load();
  345. // this.$router.go(0);
  346. } else {
  347. this.$message.error("操作失败");
  348. this.flag = false;
  349. this.rmFlag = false;
  350. this.tableObj = {};
  351. this.tableForm = {};
  352. }
  353. } catch (error) {
  354. this.flag = false;
  355. this.rmFlag = false;
  356. this.tableObj = {};
  357. this.tableForm = {};
  358. }
  359. },
  360. autoBtnClick (id, url, passparameters, row = {}) {
  361. switch (Number(id)) {
  362. case 1:
  363. if (passparameters && Object.keys(row).length) {
  364. const filterItem = this.formatDefault(passparameters, row)
  365. this.$router.push({
  366. path: url,
  367. query: filterItem
  368. })
  369. }
  370. break;
  371. case 2:
  372. this.$router.push(url)
  373. break;
  374. default:
  375. break;
  376. }
  377. },
  378. //高级查询-弹框打开
  379. handleQuery () {
  380. const { openmode, pageroute } = this.pageAuthBtnQuery
  381. if (!openmode) return
  382. if (openmode != 3) this.advancedDrawer = true // this.autoBtnClick(openmode, pageroute)
  383. this.dialogFlag = true
  384. },
  385. //高级查询-确定
  386. advancedTable (refName) {
  387. this.$refs[refName].advancedQueryHandler()
  388. },
  389. //高级查询-确定-数据
  390. getAdvancedQueryData (dataRules) {
  391. console.log(dataRules)
  392. },
  393. //高级查询-收藏
  394. queryCollect (refName) {
  395. this.$refs[refName].advancedQueryCollect()
  396. },
  397. // 给表头单元格加上 ascending 或 descending 使用 element 自带的排序箭头变色
  398. headerCellClass () {
  399. return function ({ row, column, rowIndex, columnIndex }) {
  400. const classes = []
  401. const rule = this.tableDataSortRules[column.property]
  402. if (rule) {
  403. classes.push(rule)
  404. }
  405. return classes.join(' ')
  406. }
  407. },
  408. //添加-表格-行样式
  409. rowClass () {
  410. return function ({ row, rowIndex }) {
  411. const classes = []
  412. if (row.deleted === 'DEL') {
  413. classes.push('bgl-deleted')
  414. }
  415. return classes.join(' ')
  416. }
  417. },
  418. //添加-表格-单元格样式
  419. cellClass () {
  420. return function ({ row, column, rowIndex, columnIndex }) {
  421. const classes = []
  422. if (
  423. [
  424. 'flightNO',
  425. // 'passengerName',
  426. 'bagSN',
  427. 'U_Device_ID',
  428. 'preFlightNO',
  429. 'transferFlightNO',
  430. ].includes(column.property) &&
  431. row[column.property] &&
  432. row[column.property] !== 'FBULK'
  433. ) {
  434. classes.push('cell-click')
  435. if (
  436. this.clickedCells.some(
  437. cell =>
  438. cell.pageName === 'advance' &&
  439. Object.entries(cell.row).every(
  440. ([key, value]) => row[key] === value
  441. ) &&
  442. cell.columnProp === column.property
  443. )
  444. ) {
  445. classes.push('cell-clicked')
  446. }
  447. }
  448. return classes.join(' ')
  449. }
  450. },
  451. //添加-表格-单元格-点击事件
  452. cellClickHandler (row, column, cell, event) { },
  453. tableFormatter () {
  454. return function (row, column, cellValue) {
  455. switch (column.property) {
  456. case 'departureTime':
  457. return (cellValue ?? '').replace('T', ' ')
  458. case 'deleted':
  459. return cellValue === 'DEL' ? cellValue : ''
  460. case 'activated':
  461. return Number(cellValue) === 1 ? '激活' : '未激活'
  462. default:
  463. return cellValue ?? ''
  464. }
  465. }
  466. },
  467. tableMountedHandler (refName, ref) {
  468. this.$refs[refName] = ref
  469. },
  470. resetTable () {
  471. this.dataContent = {}
  472. this.page = 0;
  473. this.noMore = false;
  474. this.tableData = [];
  475. },
  476. load () {
  477. if (this.noMore || this.loading) {
  478. return
  479. }
  480. this.queryTableData()
  481. },
  482. async queryTableData (jumpSing = false) {
  483. if (jumpSing) {
  484. const initialize = _.once(this.resetTable)
  485. initialize()
  486. }
  487. this.loading = true;
  488. const datacontent = { filter: this.defaultfilter }
  489. try {
  490. const { code, returnData } = await Query({
  491. page: ++this.page,
  492. serviceid: this.pageServiceId,
  493. datacontent,
  494. event: '0'
  495. });
  496. if (code == 0) {
  497. if (returnData.length === 0) {
  498. this.page--;
  499. this.noMore = true;
  500. }
  501. this.tableData.push(...returnData);
  502. } else {
  503. this.page--;
  504. this.$message.error("获取表格数据失败");
  505. }
  506. } catch (error) {
  507. this.page--;
  508. }
  509. this.noMore = true;
  510. this.loading = false;
  511. }
  512. }
  513. }
  514. </script>
  515. <style lang="scss" scoped>
  516. .TablePage {
  517. height: calc(100vh - 80px);
  518. padding: 20px;
  519. &_content {
  520. margin-top: 20px;
  521. height: calc(100vh - 180px);
  522. &_left {
  523. width: 360px;
  524. margin-right: 20px;
  525. }
  526. &_right {
  527. }
  528. .tableAuto {
  529. width: 100%;
  530. }
  531. .tableSacle {
  532. width: calc(100% - 380px);
  533. }
  534. }
  535. }
  536. </style>