index.vue 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897
  1. <template>
  2. <div class="data-table" :style="{ marginTop: marginTop }">
  3. <div :style="dataTableContentStyle" v-loading="loading" element-loading-text="拼命加载中" element-loading-spinner="el-icon-loading" element-loading-background="rgba(0, 0, 0, 0.8)" class="data-table-content">
  4. <div class="flex">
  5. <div class="manageTitle">{{ pageTitle }}</div>
  6. <el-button size="small" @click="handleAdd" plain type="primary">新增</el-button>
  7. </div>
  8. <template v-if="tableData.length">
  9. <div>
  10. <el-table v-el-table-infinite-scroll="load" :data="filteredTableData" :summary-method="getSummaries" :span-method="tableSpanMethod" :tree-props="treeProps" :row-key="rowKeyTree" stripe :show-summary="showSummary" border ref="table" :height="tableHeight ? tableHeight : minHeight - 8 + 'vh'" class="table infinite-list" style="width: 100%; overflow: auto" @select="selectHandler">
  11. <el-table-column v-for="(item, index) in tableColsCopy" :sortable="item.needSort ? true : false" :key="index" :prop="item.columnName" :label="item.columnLabel" :show-overflow-tooltip="showOverflowTooltip" :formtter="formtter">
  12. <template #header>
  13. <span class="colTips">
  14. <el-tooltip :content="item.columnDescribe" placement="top">
  15. <span>{{ item.columnLabel }}</span>
  16. </el-tooltip>
  17. </span>
  18. <span v-if="item.needFilters">
  19. <el-popover placement="bottom" trigger="click" @show="popoverShowHandler(item.columnName)" @hide="popoverHideHandler">
  20. <i slot="reference" :class="[
  21. 'filter-arrow',
  22. 'el-icon-arrow-down',
  23. arrowClass(item.columnName),
  24. ]" />
  25. <el-form>
  26. <el-form-item :label="item.columnLabel">
  27. <el-select v-model="filterValues[item.columnName]" size="small" placeholder="筛选" default-first-option filterable clearable>
  28. <el-option v-for="(option, optionIndex) in tableDataFilters[
  29. item.columnName
  30. ]" :key="option.value + optionIndex" :value="option.value" :label="option.text" />
  31. </el-select>
  32. </el-form-item>
  33. </el-form>
  34. </el-popover>
  35. </span>
  36. </template>
  37. </el-table-column>
  38. <el-table-column fixed="right" label="操作" :width="fixedWidth">
  39. <template slot-scope="scope">
  40. <div class="hd-td">
  41. <el-button type="text" @click="handleEdit(scope.row)" size="small" class="rmScs">编辑</el-button>
  42. <el-button class="rmSc" type="text" @click="handleRemove(scope.row)" size="small">删除</el-button>
  43. </div>
  44. </template>
  45. </el-table-column>
  46. </el-table>
  47. </div>
  48. </template>
  49. <template v-else>
  50. <NoData image-width="auto" image-height="100%" />
  51. </template>
  52. </div>
  53. <div class="data-table-dialog">
  54. <!--新增/编辑-->
  55. <Dialog :width="width" :isBody="isBody" :flag="flag">
  56. <div class="dialog-content">
  57. <div class="title">{{ tableTitle }}</div>
  58. <div class="contents">
  59. <el-form ref="ruleForm" :model="tableForm" :label-width="labelWidth">
  60. <el-row :gutter="20">
  61. <el-col v-for="(item, index) in tableColsCopy" :key="index" :span="rows">
  62. <el-form-item :label="item.columnLabel">
  63. <template v-if="
  64. item.listqueryTemplateID ||
  65. item.listqueryTemplateID == 0
  66. ">
  67. <el-select v-if="asShow" class="input-shadow" size="small" filterable default-first-option style="width: 100%" v-model="tableForm[item.columnName]" @change="changeSelect(item.columnName, item)" placeholder="请选择" clearable @clear="tableForm[item.columnName] = ''">
  68. <el-option v-for="item in tableOptions[item.columnName]" :key="item.v ? item.v : item.planDepartureApt" :label="item.k ? item.k : item.planDepartureApt" :value="
  69. item.setlabel === 'positionDescribe'
  70. ? item.v
  71. : item.v != undefined
  72. ? item.v
  73. : item.planDepartureApt
  74. ">
  75. </el-option>
  76. </el-select>
  77. </template>
  78. <template v-else-if="item.dataType == 'longtext'">
  79. <el-input size="small" :rows="1" type="textarea" @change="inputChangeHandler(item.columnName)" v-model="tableForm[item.columnName]"></el-input>
  80. </template>
  81. <template v-else-if="item.dataType == 'datetime'">
  82. <el-date-picker value-format="yyyy-MM-dd HH:mm:ss" v-model="tableForm[item.columnName]" :rows="1" type="datetime" placeholder="选择日期时间" @change="inputChangeHandler(item.columnName)">
  83. </el-date-picker>
  84. </template>
  85. <template v-else-if="item.dataType == 'number'">
  86. <el-input size="small" v-model.number="tableForm[item.columnName]" onkeyup="value=value.replace(/[^1-9]/g,'')" @change="inputChangeHandler(item.columnName)"></el-input>
  87. </template>
  88. <template v-else>
  89. <el-input size="small" v-model="tableForm[item.columnName]" @change="inputChangeHandler(item.columnName)"></el-input>
  90. </template>
  91. </el-form-item>
  92. </el-col>
  93. </el-row>
  94. </el-form>
  95. </div>
  96. <div class="foot right">
  97. <el-button size="medium" @click="handleOk" class="r24" type="primary">确定</el-button>
  98. <el-button @click="eledite" size="medium">取消</el-button>
  99. </div>
  100. </div>
  101. </Dialog>
  102. <Dialog :isBody="isBody" :flag="rmFlag">
  103. <div class="airportInfoDialog">
  104. <div class="title del-title">删除</div>
  105. <div class="content del-content">
  106. <span class="el-icon-error error r10"></span>您是否确认删除<span class="error l10">{{ rmTitle }}</span>
  107. </div>
  108. <div class="foot right Delfoot">
  109. <el-button size="medium" class="r24" @click="tableRemove" type="danger">删除</el-button>
  110. <el-button size="medium" @click="rmFlag = false">取消</el-button>
  111. </div>
  112. </div>
  113. </Dialog>
  114. </div>
  115. </div>
  116. </template>
  117. <script>
  118. import { setTableFilters } from "@/utils/table";
  119. import Dialog from "@/layout/components/Dialog/index.vue";
  120. import NoData from "@/components/nodata";
  121. import { translateDataToTreeAllTreeMsg } from "@/utils/validate";
  122. import { Query, newData, modifyData, moveData } from "@/api/webApi";
  123. export default {
  124. name: "DataTable",
  125. props: {
  126. dataContent: {
  127. type: Object,
  128. default: () => ({}),
  129. },
  130. //弹框宽度
  131. width: {
  132. type: String,
  133. default: "560px",
  134. },
  135. //弹框表单-行数
  136. rows: {
  137. type: Number,
  138. default: 3,
  139. },
  140. //弹框-表单文字宽度
  141. labelWidth: {
  142. type: String,
  143. default: "80px",
  144. },
  145. //表格高度
  146. tableHeight: {
  147. type: [String, Number],
  148. default: 0,
  149. },
  150. minHeight: {
  151. type: Number,
  152. default: 65,
  153. },
  154. // 是否显示合计行
  155. showSummary: {
  156. type: Boolean,
  157. default: false,
  158. },
  159. marginTop: {
  160. type: String,
  161. default: "0px",
  162. },
  163. // 不换行,溢出隐藏
  164. showOverflowTooltip: {
  165. type: Boolean,
  166. default: false,
  167. },
  168. //操作列宽度
  169. fixedWidth: {
  170. type: String,
  171. default: "180px",
  172. },
  173. },
  174. components: { Dialog, NoData },
  175. data () {
  176. return {
  177. pageTitle: '',
  178. asShow: true,
  179. loading: false,
  180. flag: false,
  181. serviceId: null,
  182. rmFlag: false,
  183. rowTitle: "",
  184. page: 0,
  185. pageSize: 10,
  186. noMore: false,
  187. tableCols: [], //表头数据
  188. tableData: [], //表格数据
  189. tableColsCopy: [], //表头数据缓存
  190. tableDataFilters: {}, //表头-下拉数据
  191. filterValues: {}, //表头-下拉-选中数据
  192. tableDataCopy: [], //缓存table数据
  193. tableGroups: [], //表格分组数据
  194. colShowFilter: "", //表头-下拉-箭头
  195. spanArr: [], //表格分组数据缓存
  196. pos: 0, //表格分组计数
  197. tableTitle: "新增", //弹框标题
  198. tableType: "add", //弹框类型=新增/编辑
  199. tableForm: {}, //弹框表单
  200. rmTitle: "", //弹框-删除-标题
  201. tableObj: {}, //增/删/改数据缓存
  202. tableOptions: {}, //弹框-下来数据缓存
  203. tableArrs: [], //重组table-表头下拉
  204. proAll: false, //重组时-所有请求是否都完成
  205. roles: JSON.parse(sessionStorage.getItem("userAuthList")) ?? [],
  206. tableOptionscp: {},
  207. tabledatacopy: {},
  208. queryId: '',
  209. };
  210. },
  211. computed: {
  212. dataTableContentStyle () {
  213. const style = {};
  214. if (this.minHeight) {
  215. style["min-height"] = this.minHeight;
  216. }
  217. if (this.tableHeight) {
  218. style["height"] = this.tableHeight;
  219. }
  220. return style;
  221. },
  222. //设置表头-下拉-箭头样式
  223. arrowClass () {
  224. return function (prop) {
  225. let classString = "";
  226. if (this.colShowFilter === prop) {
  227. return "arrow-active";
  228. }
  229. if (
  230. Object.entries(this.tableDataFilters).find(
  231. ([key, arr]) => this.filterValues[prop]
  232. )
  233. ) {
  234. classString += "arrow-blue";
  235. }
  236. return classString;
  237. };
  238. },
  239. //设置表头-下拉-选中数据
  240. filteredTableData () {
  241. if (this.isTree) {
  242. this.tableData = translateDataToTreeAllTreeMsg(
  243. this.tableData,
  244. "parentID",
  245. "companyID"
  246. );
  247. }
  248. return this.tableData.filter((item) => {
  249. let flag = true;
  250. Object.entries(this.filterValues).forEach(([key, value]) => {
  251. if (value !== "" && item[key] !== value) {
  252. flag = false;
  253. }
  254. });
  255. return flag;
  256. });
  257. },
  258. fromDataType () {
  259. return function (type) {
  260. if (type) {
  261. return type.replace(/\([^\)]*\)/g, "");
  262. }
  263. }
  264. },
  265. },
  266. mounted () {
  267. console.log(this.$route)
  268. // this.getQuery();
  269. },
  270. updated () {
  271. this.$refs["table"]?.doLayout();
  272. },
  273. methods: {
  274. eledite () {
  275. this.flag = false;
  276. const arrbegin = _.cloneDeep(this.tableOptionscp);
  277. this.tableOptions = arrbegin;
  278. },
  279. load () {
  280. //
  281. if (!this.isTree) {
  282. if (this.noMore || this.loading) {
  283. return;
  284. }
  285. this.getQuery(this.queryId);
  286. }
  287. },
  288. resetTable () {
  289. this.page = 0;
  290. this.noMore = false;
  291. this.tableData = [];
  292. },
  293. changeSelect (data, name) {
  294. if (this.tableForm[data] === "") {
  295. this.tableForm[data] = null;
  296. }
  297. this.tableForm[this.tableOptions[data][0].setvalue] =
  298. this.tableForm[data];
  299. const arrbegin = _.cloneDeep(this.tabledatacopy);
  300. if (this.tableForm.beginNode) {
  301. this.tableOptions.beginPosition = arrbegin.beginPosition.filter(
  302. (i) => i.nodeCode === this.tableForm.beginNode
  303. );
  304. arrbegin.beginPosition.forEach((element) => {
  305. if (element.v === this.tableForm.beginPosition) {
  306. if (element.nodeCode !== this.tableForm.beginNode) {
  307. this.tableForm.beginPosition = "";
  308. }
  309. }
  310. });
  311. // let arr = [];
  312. // this.tableOptions.beginPosition.forEach((element) => {
  313. // arr.push(element.nodeCode);
  314. // });
  315. // if (
  316. // !arr.includes(this.tableForm.beginPosition) &&
  317. // this.tableForm.beginNode
  318. // ) {
  319. // this.tableForm.beginPosition = null;
  320. // }
  321. this.asShow = false;
  322. this.asShow = true;
  323. }
  324. if (this.tableForm.beginPosition && !this.tableForm.beginNode) {
  325. arrbegin.beginPosition.forEach((element) => {
  326. if (this.tableForm.beginPosition === element.v) {
  327. this.tableForm.beginNode = element.nodeCode;
  328. }
  329. });
  330. }
  331. if (this.tableForm.endNode) {
  332. this.tableOptions.endPosition = arrbegin.endPosition.filter(
  333. (i) => i.nodeCode === this.tableForm.endNode
  334. );
  335. arrbegin.endPosition.forEach((element) => {
  336. if (element.v === this.tableForm.endPosition) {
  337. if (element.nodeCode !== this.tableForm.endNode) {
  338. this.tableForm.endPosition = "";
  339. }
  340. }
  341. });
  342. this.asShow = false;
  343. this.asShow = true;
  344. }
  345. if (this.tableForm.endPosition && !this.tableForm.endNode) {
  346. arrbegin.endPosition.forEach((element) => {
  347. if (this.tableForm.endPosition === element.v) {
  348. this.tableForm.endNode = element.nodeCode;
  349. }
  350. });
  351. }
  352. },
  353. inputChangeHandler (data) {
  354. if (this.tableForm[data] === "") {
  355. this.tableForm[data] = null;
  356. }
  357. },
  358. //获取表格数据
  359. async getQuery (id) {
  360. try {
  361. this.loading = true;
  362. const { code, returnData, columnset } = await Query({
  363. serviceId: id,
  364. page: ++this.page,
  365. pageSize: this.pageSize,
  366. dataContent: this.dataContent,
  367. });
  368. if (code == 0) {
  369. if (returnData.length === 0) {
  370. this.page--;
  371. this.noMore = true;
  372. this.loading = false;
  373. }
  374. const titleColumn = columnset.find(
  375. (item) => item.needShow === 1
  376. );
  377. if (titleColumn) {
  378. this.rowTitle = titleColumn.columnName;
  379. }
  380. this.tableData.push(...returnData);
  381. this.tableCols = columnset;
  382. this.serviceId = id;
  383. setTimeout(() => {
  384. this.initTableData();
  385. this.loading = false;
  386. }, 100);
  387. } else {
  388. this.page--;
  389. this.loading = false;
  390. this.$message.error("获取表格数据失败");
  391. }
  392. } catch (error) {
  393. this.page--;
  394. this.loading = false;
  395. }
  396. },
  397. //表格-增/删/改
  398. async generalDataReception (event, data) {
  399. try {
  400. const params = {
  401. serviceId: serviceId.value,
  402. dataContent: data,
  403. event: `${event}`,
  404. };
  405. const { code } =
  406. event == 1
  407. ? await newData(params)
  408. : event == 2
  409. ? await modifyData(params)
  410. : await moveData(params);
  411. if (code == 0) {
  412. this.$message.success("操作成功");
  413. this.resetTable();
  414. this.getQuery(this.queryId);
  415. this.flag = false;
  416. this.rmFlag = false;
  417. this.tableObj = {};
  418. this.tableForm = {};
  419. // this.$router.go(0);
  420. } else {
  421. this.$message.error("操作失败");
  422. this.flag = false;
  423. this.rmFlag = false;
  424. this.tableObj = {};
  425. this.tableForm = {};
  426. }
  427. } catch (error) {
  428. this.flag = false;
  429. this.rmFlag = false;
  430. this.tableObj = {};
  431. this.tableForm = {};
  432. }
  433. },
  434. // 表格勾选
  435. toggleRowSelection (row, isSelected) {
  436. this.$refs["table"].toggleRowSelection(row, isSelected);
  437. },
  438. // 表格初始勾选
  439. selectTableRows (tableData, selectFlagName) {
  440. tableData.forEach((row) => {
  441. this.$refs["table"].toggleRowSelection(row, !!row[selectFlagName]);
  442. });
  443. this.$emit("selectionAll", this.$refs.table.selection);
  444. },
  445. //初始化表格
  446. initTableData () {
  447. this.tableColsCopy = this.tableCols.filter((item) => item.needShow);
  448. this.tableDataCopy = _.cloneDeep(this.tableData);
  449. const datas = _.cloneDeep(this.tableColsCopy);
  450. // const reqUts = [];
  451. datas.forEach(async (item) => {
  452. this.tableDataFilters[item.columnName] = [];
  453. if (item.needGroup) {
  454. this.tableGroups.push(item.columnName);
  455. }
  456. if (item.listqueryTemplateID || item.listqueryTemplateID == 0) {
  457. this.tableArrs.push(item.columnName);
  458. // const reqUt = this.getSelectData(item.listqueryTemplateID)
  459. // reqUts.push(reqUt)
  460. if (!this.tableOptions[item.columnName]) {
  461. //开始位置beginPosition 结束位置endPosition (区分开始结束位置必须传null)
  462. if (
  463. item.columnName !== "beginPosition" &&
  464. item.columnName !== "endPosition"
  465. ) {
  466. this.tableOptions[item.columnName] = await this.getSelectData(
  467. item.listqueryTemplateID
  468. );
  469. } else {
  470. this.tableOptions[item.columnName] = await this.getSelectData(
  471. item.listqueryTemplateID,
  472. null
  473. );
  474. this.tabledatacopy[item.columnName] = _.cloneDeep(
  475. this.tableOptions[item.columnName]
  476. );
  477. }
  478. } else {
  479. if (
  480. item.columnName === "beginPosition" ||
  481. item.columnName === "endPosition"
  482. ) {
  483. this.tableOptions[item.columnName] = await this.getSelectData(
  484. item.listqueryTemplateID,
  485. null
  486. );
  487. }
  488. }
  489. //
  490. }
  491. // this.filterValues[item.columnName] = ''
  492. });
  493. setTableFilters(this.tableData, this.tableDataFilters);
  494. this.tableGroup(this.tableData);
  495. this.selectTableRows(this.tableData, "DeployID");
  496. this.tableOptionscp = _.cloneDeep(this.tableOptions);
  497. const arrbegin = _.cloneDeep(this.tableOptions);
  498. if (arrbegin) {
  499. setTimeout(() => {
  500. this.tableData.forEach((element) => {
  501. if (this.tableOptions.beginNode) {
  502. arrbegin.beginNode.forEach((res) => {
  503. if (res.v === element.beginNode) {
  504. element.beginNode = res.k;
  505. }
  506. });
  507. arrbegin.endNode.forEach((res) => {
  508. if (res.v == element.endNode) {
  509. element.endNode = res.k;
  510. }
  511. });
  512. arrbegin.calculationBasis.forEach((res) => {
  513. if (res.v == element.calculationBasis) {
  514. element.calculationBasis = res.k;
  515. }
  516. });
  517. //位置
  518. this.tabledatacopy.beginPosition.forEach((res) => {
  519. if (res.v == element.beginPosition) {
  520. element.beginPosition = res.k;
  521. }
  522. });
  523. this.tabledatacopy.endPosition.forEach((res) => {
  524. if (res.v == element.endPosition) {
  525. element.endPosition = res.k;
  526. }
  527. });
  528. }
  529. });
  530. }, 100);
  531. }
  532. // this.getSelectDataAll(reqUts)
  533. },
  534. //获取所有获取弹框-下拉数据-请求状态
  535. getSelectDataAll (reqUts) {
  536. Promise.all(reqUts)
  537. .then((res) => {
  538. this.proAll = true;
  539. })
  540. .catch((err) => {
  541. this.proAll = false;
  542. });
  543. },
  544. //获取弹框-下拉数据
  545. async getSelectData (id, name) {
  546. // name ? [name] : name === null ? [null]: [],
  547. const { code, returnData } = await Query({
  548. id,
  549. dataContent: name ? [name] : name === null ? [null] : [],
  550. });
  551. if (code == 0) {
  552. return returnData.listValues;
  553. } else {
  554. return [];
  555. }
  556. },
  557. //重组table-显示名称
  558. setTable () {
  559. this.tableArrs.forEach((item) => {
  560. this.tableOptions[item].forEach((p) => {
  561. this.tableDataCopy.forEach((msg) => {
  562. if (msg[item] == p.v) {
  563. msg[item] = p.k;
  564. }
  565. });
  566. this.tableDataFilters[item].forEach((cap) => {
  567. if (cap.value == p.v) {
  568. cap.text = p.k;
  569. cap.value = p.k;
  570. }
  571. });
  572. });
  573. });
  574. this.tableData = this.tableDataCopy;
  575. },
  576. //分组
  577. tableGroup (tableData) {
  578. const spanArr = [];
  579. let pos = 0;
  580. let ifYj = this.tableGroups[0];
  581. for (let i = 0; i < tableData.length; i++) {
  582. if (i === 0) {
  583. spanArr.push(1);
  584. } else {
  585. if (tableData[i][ifYj] === tableData[i - 1][ifYj]) {
  586. spanArr[pos] += 1;
  587. spanArr.push(0);
  588. } else {
  589. spanArr.push(1);
  590. pos = i;
  591. }
  592. }
  593. }
  594. this.spanArr = spanArr;
  595. this.pos = pos;
  596. },
  597. popoverShowHandler (prop) {
  598. this.colShowFilter = prop;
  599. },
  600. popoverHideHandler () {
  601. this.colShowFilter = "";
  602. },
  603. //分组
  604. tableSpanMethod ({ row, column, rowIndex, columnIndex }) {
  605. if (this.tableGroups.includes(column["property"])) {
  606. const _row = this.spanArr[rowIndex];
  607. const _col = _row > 0 ? 1 : 0;
  608. return {
  609. rowspan: _row,
  610. colspan: _col,
  611. };
  612. }
  613. },
  614. //合计
  615. getSummaries (param) {
  616. const { columns, data } = param;
  617. const sums = [];
  618. columns.forEach((column, index) => {
  619. this.tableColsCopy.forEach((p) => {
  620. if (column.property == p.columnName && p.needCount) {
  621. const values = data.map((item) => Number(item[column.property]));
  622. if (!values.every((value) => isNaN(value))) {
  623. sums[index] = values.reduce((prev, curr) => {
  624. const value = Number(curr);
  625. if (!isNaN(value)) {
  626. return prev + curr;
  627. } else {
  628. return prev;
  629. }
  630. }, 0);
  631. sums[index] += "";
  632. }
  633. }
  634. });
  635. });
  636. return sums;
  637. },
  638. //弹框-确定
  639. handleOk () {
  640. this.submitClickHandler();
  641. },
  642. //滚动
  643. tableLoad () { },
  644. //表格-新增
  645. handleAdd () {
  646. this.flag = true;
  647. this.tableType = "add";
  648. this.tableTitle = "新增";
  649. this.tableForm = {};
  650. },
  651. //表格-编辑
  652. async handleEdit (row) {
  653. this.flag = true;
  654. this.tableType = "edit";
  655. this.tableTitle = "编辑";
  656. this.tableForm = JSON.parse(JSON.stringify(row));
  657. },
  658. // 新增/编辑-确认
  659. submitClickHandler () {
  660. this.$refs["ruleForm"].validate((valid) => {
  661. if (valid) {
  662. if (this.tableType == "add") {
  663. this.tableForm.event = 1;
  664. } else {
  665. this.tableForm.event = 2;
  666. }
  667. this.generalDataReception(this.tableForm.event, this.tableForm);
  668. } else {
  669. return false;
  670. }
  671. });
  672. },
  673. //表格-删除
  674. handleRemove (row) {
  675. this.rmFlag = true;
  676. // this.rmTitle = row.className || row.username || row.serviceName || row.queryTemplateName;
  677. this.rmTitle = row[this.rowTitle];
  678. this.tableObj = row;
  679. },
  680. //表格-删除-确认
  681. tableRemove () {
  682. this.tableObj.event = 3;
  683. this.generalDataReception(this.tableForm.event, this.tableObj);
  684. },
  685. // 表格-选中行
  686. selectHandler (selection, row) {
  687. this.$emit("selection-change", selection, row);
  688. },
  689. // 表格-查询模板预览
  690. handlePreview (row) {
  691. this.$emit("preview", row);
  692. },
  693. formatter(row, column, cellValue, index) {
  694. const sameColumn = this.tableCols.find(col => col.columnName === column.property)
  695. if (sameColumn && this.fromDataType(sameColumn.dataType) === 'datetime') {
  696. return (cellValue ?? '').replace('T', ' ')
  697. }
  698. return cellValue
  699. }
  700. },
  701. };
  702. </script>
  703. <style lang="scss" scoped>
  704. .data-table {
  705. width: 100%;
  706. // background-color: #fff;
  707. // padding: 20px;
  708. .data-table-content {
  709. height: 100%;
  710. }
  711. ::v-deep .table {
  712. width: 100%;
  713. .cell {
  714. padding: 0;
  715. text-align: center;
  716. font-size: 14px;
  717. font-family: Helvetica, "Microsoft YaHei";
  718. letter-spacing: 0;
  719. }
  720. .cell-click {
  721. cursor: pointer;
  722. color: #2d7cff;
  723. &.cell-clicked {
  724. color: purple;
  725. }
  726. }
  727. .el-table__header-wrapper {
  728. .cell {
  729. font-weight: bold;
  730. color: #101116;
  731. > .el-checkbox {
  732. display: none;
  733. }
  734. }
  735. .has-gutter {
  736. tr {
  737. .bgl-huang {
  738. background: #fcf0b1;
  739. }
  740. }
  741. }
  742. }
  743. .el-table__body-wrapper {
  744. tr.bgl-hui {
  745. background: #d2d6df;
  746. td {
  747. background: #d2d6df;
  748. }
  749. &.redBorder {
  750. position: relative;
  751. &::after {
  752. content: "";
  753. position: absolute;
  754. left: 0;
  755. bottom: 0;
  756. width: 100%;
  757. height: 2px;
  758. background: #e83f82;
  759. }
  760. }
  761. }
  762. }
  763. .rmScs {
  764. width: 48px;
  765. height: 24px;
  766. border-color: #9ebbf7;
  767. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.06);
  768. border-radius: 4px;
  769. display: flex;
  770. align-items: center;
  771. justify-content: center;
  772. float: left;
  773. span {
  774. color: #2d67e3;
  775. }
  776. }
  777. .rmScser {
  778. width: 60px;
  779. height: 24px;
  780. border-color: #9ebbf7;
  781. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.06);
  782. border-radius: 4px;
  783. display: flex;
  784. align-items: center;
  785. justify-content: center;
  786. float: left;
  787. span {
  788. color: #2d67e3;
  789. }
  790. }
  791. .rmSc {
  792. width: 48px;
  793. height: 24px;
  794. background: #eb2f3b;
  795. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.06);
  796. border-radius: 4px;
  797. display: flex;
  798. align-items: center;
  799. justify-content: center;
  800. span {
  801. color: #ffffff;
  802. }
  803. }
  804. .hrefBtn {
  805. width: 48px;
  806. height: 24px;
  807. background: #6f81bc;
  808. box-shadow: 0px 3px 3px 0px rgba(0, 0, 0, 0.06);
  809. border-radius: 4px;
  810. display: flex;
  811. align-items: center;
  812. justify-content: center;
  813. span {
  814. color: #ffffff;
  815. }
  816. }
  817. .tableStatus {
  818. font-size: 14px;
  819. .icon {
  820. width: 14px;
  821. height: 14px;
  822. background: #2d67e3;
  823. border-radius: 2px;
  824. display: inline-block;
  825. vertical-align: middle;
  826. position: relative;
  827. top: -2px;
  828. }
  829. .status0 {
  830. position: relative;
  831. top: 5px;
  832. }
  833. .status1 {
  834. position: relative;
  835. top: 5px;
  836. .icon {
  837. background-color: #afb4bf;
  838. }
  839. }
  840. .status2 {
  841. position: relative;
  842. top: 5px;
  843. .icon {
  844. background-color: #eb2f3b;
  845. }
  846. }
  847. }
  848. .el-table__fixed-right {
  849. thead {
  850. div {
  851. color: #101116;
  852. }
  853. }
  854. }
  855. .hd-td {
  856. .hd-tr {
  857. display: flex;
  858. justify-content: center;
  859. flex-direction: row;
  860. padding: 0 8px;
  861. }
  862. }
  863. }
  864. .data-table-btn {
  865. margin-top: 13px;
  866. line-height: 32px;
  867. margin-bottom: 20px;
  868. }
  869. }
  870. .filter-arrow {
  871. cursor: pointer;
  872. transition: 0.3s transform;
  873. &.arrow-active {
  874. transform: rotate(-180deg);
  875. }
  876. &.arrow-blue {
  877. color: #2d7cff;
  878. font-weight: bold;
  879. }
  880. }
  881. .el-select-dropdown__item.hover {
  882. background: #d2d6df;
  883. }
  884. .data-table-dialog {
  885. ::v-deep .dialog-content {
  886. .el-form-item__content {
  887. line-height: 41px;
  888. }
  889. }
  890. }
  891. </style>