index.vue 19 KB

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