index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660
  1. <!-- 服务条款 -->
  2. <template>
  3. <basic-container>
  4. <avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" :permission="permissionList"
  5. id="out-table" :header-cell-class-name="headerClassName" :before-open="beforeOpen" :search.sync="search"
  6. v-model="form" ref="crud" @row-update="rowUpdate" @row-save="rowSave" @row-del="rowDel"
  7. @search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
  8. @current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange"
  9. @resetColumn="resetColumnTwo('crud', 'option', 'optionBack', 294)"
  10. @saveColumn="saveColumnTwo('crud', 'option', 'optionBack', 294)" @on-load="onLoad">
  11. <template slot-scope="scope" slot="extendedDataArr">
  12. <span style="color: #1e9fff" @click="extendedDataview(scope.row)">
  13. {{ scope.row.extendedDataArr.length }}
  14. </span>
  15. </template>
  16. <template slot-scope="{type,disabled,row}" slot="extendedDataArrForm">
  17. <el-button type="primary" size="small" @click="dialogVisible = true">EDI CODE
  18. </el-button>
  19. </template>
  20. <template slot="menuLeft">
  21. <el-button type="primary" size="small" icon="el-icon-plus" @click="addbtnfun()">新建服务条款
  22. </el-button>
  23. <el-button type="danger" size="small" icon="el-icon-delete" plain @click="handleDelete">删 除
  24. </el-button>
  25. <el-button type="warning" size="small" icon="el-icon-printer" @click="excelBox = true">导入
  26. </el-button>
  27. <el-button type="success" size="small" @click="handleExport" icon="el-icon-printer">导出</el-button>
  28. </template>
  29. <template slot-scope="scope" slot="menu">
  30. <!--<el-button type="text" icon="el-icon-view" size="small" @click.stop="rowViewfun(scope.row, scope.index)">查看-->
  31. <!--</el-button>-->
  32. <el-button type="text" icon="el-icon-edit" size="small" @click.stop="rowEditfun(scope.row, scope.index)">编辑
  33. </el-button>
  34. <el-button type="text" icon="el-icon-edit" size="small" @click.stop="rowDel(scope.row, scope.index)">删除
  35. </el-button>
  36. <el-button v-if="scope.row.status == 1" type="text" icon="el-icon-turn-off" style="color: #85e967" size="small"
  37. @click.stop="statusfun(scope.row.id,0)">
  38. 启用
  39. </el-button>
  40. <el-button v-if="scope.row.status == 0" type="text" icon="el-icon-turn-off" style="color: #e83c3a" size="small"
  41. @click.stop="statusfun(scope.row.id,1)">
  42. 停用
  43. </el-button>
  44. </template>
  45. </avue-crud>
  46. <el-dialog title="EDI CODE" :visible.sync="dialogVisible" width="50%" append-to-body :destroy-on-close="true"
  47. :modal-append-to-body="false" :before-close="handleClose">
  48. <div>
  49. <el-button type="primary" size="small" :disabled="extendedDisabled" @click="extendedDataAdd">新增
  50. </el-button>
  51. <el-table stripe :data="form.extendedDataArr" id="out-table" :header-cell-class-name="headerClassName"
  52. style="width: 100%">
  53. <el-table-column prop="name" label="名称">
  54. <template slot-scope="{row}">
  55. <el-input v-if="row.edit" size="mini" v-model="row.name" placeholder="请输入名称"></el-input>
  56. <span v-else>{{ row.name }}</span>
  57. </template>
  58. </el-table-column>
  59. <el-table-column prop="value" label="键值">
  60. <template slot-scope="{row}">
  61. <el-input v-if="row.edit" size="mini" v-model="row.value" placeholder="请输入键值"></el-input>
  62. <span v-else>{{ row.value }}</span>
  63. </template>
  64. </el-table-column>
  65. <el-table-column label="操作">
  66. <template slot-scope="scope">
  67. <el-button type="text" size="mini" :disabled="extendedDisabled"
  68. @click="extendedDataEdit(scope.$index, scope.row)">{{ scope.row.edit ? '保存' : '编辑' }}</el-button>
  69. <el-button size="mini" type="text" :disabled="extendedDisabled"
  70. @click="extendedDataDelete(scope.$index, scope.row)">删除</el-button>
  71. </template>
  72. </el-table-column>
  73. </el-table>
  74. </div>
  75. <span slot="footer" class="dialog-footer">
  76. <el-button @click="dialogVisible = false; extendedDisabled = false">取 消</el-button>
  77. <el-button type="primary" @click="extendedDatafun">确 定</el-button>
  78. </span>
  79. </el-dialog>
  80. <el-dialog title="导入服务条款" append-to-body :visible.sync="excelBox" width="555px" :close-on-click-modal="false"
  81. v-dialog-drag>
  82. <avue-form :option="excelOption" v-model="excelForm" :table-loading="excelLoading" :upload-before="uploadBefore"
  83. :upload-after="onSuccess">
  84. <template slot="excelTemplate">
  85. <el-button type="primary" @click="handleGet">
  86. 点击下载<i class="el-icon-download el-icon--right"></i>
  87. </el-button>
  88. </template>
  89. </avue-form>
  90. <p style="text-align: center;color: #DC0505">
  91. 温馨提示 第一次导入时请先下载模板
  92. </p>
  93. </el-dialog>
  94. </basic-container>
  95. </template>
  96. <script>
  97. import { getBservicetermsList, getBservicetermsDetail, addBserviceterms, updateBserviceterms, removeBserviceterms } from "@/api/iosBasicData/bserviceterms";
  98. import { mapGetters } from "vuex";
  99. import { getToken } from "@/util/auth";
  100. export default {
  101. data() {
  102. return {
  103. // 扩展数据弹窗
  104. dialogVisible: false,
  105. extendedDisabled:false,
  106. form: {
  107. extendedDataArr: []
  108. },
  109. // form: {},
  110. query: {},
  111. loading: true,
  112. excelBox: false,
  113. search: {},
  114. excelForm: {},
  115. excelLoading: false,
  116. excelOption: {
  117. submitBtn: false,
  118. emptyBtn: false,
  119. column: [
  120. {
  121. label: "模板下载",
  122. prop: "excelTemplate",
  123. formslot: true,
  124. span: 24
  125. },
  126. {
  127. label: "模板上传",
  128. prop: "excelFile",
  129. type: "upload",
  130. drag: true,
  131. loadText: "模板上传中,请稍等",
  132. span: 24,
  133. propsHttp: {
  134. res: "data"
  135. },
  136. tip: "请上传 .xls,.xlsx 标准格式文件",
  137. action: "/api/blade-los/bserviceterms/importBServiceTerms"
  138. }
  139. ]
  140. },
  141. page: {
  142. pageSize: 20,
  143. currentPage: 1,
  144. total: 0,
  145. pageSizes: [10, 20, 30, 40, 50, 100, 200, 300, 400, 500]
  146. },
  147. selectionList: [],
  148. option: {
  149. dialogDrag: true,
  150. },
  151. optionBack: {
  152. dialogDrag: true,
  153. height: 'auto',
  154. stripe: true,
  155. calcHeight: 30,
  156. tip: false,
  157. searchShow: true,
  158. searchMenuSpan: 24,
  159. border: true,
  160. index: true,
  161. viewBtn: false,
  162. selection: true,
  163. dialogClickModal: false,
  164. menuWidth:260,
  165. column: [
  166. {
  167. label: "编码",
  168. prop: "code",
  169. width: "180",
  170. search: true,
  171. slot: true,
  172. rules: [{
  173. required: true,
  174. message: "请输入编码",
  175. trigger: "blur"
  176. }],
  177. overHidden:true,
  178. },
  179. {
  180. label: "中文名称",
  181. prop: "cnName",
  182. width: "180",
  183. search: true,
  184. slot: true,
  185. rules: [{
  186. required: true,
  187. message: "请输入中文名称",
  188. trigger: "blur"
  189. }],
  190. overHidden:true,
  191. },
  192. {
  193. label: "英文名称",
  194. prop: "enName",
  195. width: "180",
  196. search: true,
  197. rules: [{
  198. required: true,
  199. message: "请输入英文名称",
  200. trigger: "blur"
  201. }],
  202. overHidden:true,
  203. },
  204. {
  205. label: "EDI CODE",
  206. prop: "extendedDataArr",
  207. type: 'tree',
  208. formslot: true,
  209. dicData: [],
  210. overHidden:true,
  211. },
  212. // {
  213. // label: "JSON 对象数组,用于不查询的扩展数据, 例如:[{name: "key1", value: "value1"}]",
  214. // prop: "extendedData",
  215. // rules: [{
  216. // required: true,
  217. // message: "请输入JSON 对象数组,用于不查询的扩展数据, 例如:[{name: "key1", value: "value1"}]",
  218. // trigger: "blur"
  219. // }]
  220. // },
  221. {
  222. label: "状态",
  223. prop: "status",
  224. type: "select",
  225. search: true,
  226. dicData: [{
  227. label: '启用',
  228. value: 0
  229. }, {
  230. label: '停用',
  231. value: 1
  232. }],
  233. value: 0,
  234. overHidden:true,
  235. },
  236. {
  237. label: "是否已删除(0 否 1是)",
  238. prop: "isDeleted",
  239. hide: true,
  240. display: false,
  241. overHidden:true,
  242. },
  243. {
  244. label: "创建人",
  245. prop: "createUserName",
  246. display: false,
  247. overHidden:true,
  248. },
  249. {
  250. label: "创建部门",
  251. prop: "createDeptName",
  252. display: false,
  253. overHidden:true,
  254. },
  255. {
  256. label: "创建时间",
  257. prop: "createTime",
  258. width:"160",
  259. display: false,
  260. overHidden:true,
  261. },
  262. {
  263. label: "修改人",
  264. prop: "updateUserName",
  265. display: false,
  266. overHidden:true,
  267. },
  268. {
  269. label: "修改时间",
  270. prop: "updateTime",
  271. width: "160",
  272. display: false,
  273. overHidden:true,
  274. },
  275. {
  276. label: "备注",
  277. prop: "remarks",
  278. type: 'textarea',
  279. width: "180",
  280. span: 24,
  281. minRows: 3,
  282. slot: true,
  283. overHidden:true,
  284. },
  285. ]
  286. },
  287. data: []
  288. };
  289. },
  290. computed: {
  291. ...mapGetters(["permission"]),
  292. permissionList() {
  293. return {
  294. addBtn: this.vaildData(this.permission.bserviceterms_add, false),
  295. viewBtn: this.vaildData(this.permission.bserviceterms_view, false),
  296. delBtn: this.vaildData(this.permission.bserviceterms_delete, false),
  297. editBtn: this.vaildData(this.permission.bserviceterms_edit, false)
  298. };
  299. },
  300. ids() {
  301. let ids = [];
  302. this.selectionList.forEach(ele => {
  303. ids.push(ele.id);
  304. });
  305. return ids.join(",");
  306. }
  307. },
  308. async created() {
  309. this.option = await this.getColumnData(this.getColumnName(294), this.optionBack);
  310. },
  311. methods: {
  312. // 禁用启用按钮
  313. statusfun(id,status){
  314. this.$confirm("确定将选择数据更改状态?", {
  315. confirmButtonText: "确定",
  316. cancelButtonText: "取消",
  317. type: "warning"
  318. }).then(()=>{
  319. getBservicetermsDetail(id).then(res=>{
  320. let obj = res.data.data;
  321. obj.status = status
  322. updateBserviceterms(obj).then(()=>{
  323. this.onLoad(this.page);
  324. this.$message({
  325. type: "success",
  326. message: "操作成功!"
  327. });
  328. })
  329. })
  330. })
  331. },
  332. // 导出
  333. handleExport() {
  334. var condition = ''
  335. for (const key in this.search) {
  336. var value = this.search[key]
  337. if (value) {
  338. condition += `&${key}=${this.search[key]}`
  339. }
  340. }
  341. this.$confirm('是否导出服务条款?', '提示', {
  342. confirmButtonText: '确定',
  343. cancelButtonText: '取消',
  344. type: 'warning'
  345. }).then(() => {
  346. window.open(
  347. `/api/blade-los/bserviceterms/exportBServiceTerms?${this.website.tokenHeader
  348. }=${getToken()}${condition}`
  349. );
  350. }).catch(() => {
  351. this.$message({
  352. type: 'info',
  353. message: '已取消' //
  354. });
  355. })
  356. },
  357. uploadBefore(file, done, loading) {
  358. done();
  359. loading = true;
  360. },
  361. // 上传成功
  362. onSuccess(res, done, loading, column) {
  363. this.excelBox = false;
  364. this.$message.success("导入成功!");
  365. loading = false;
  366. this.onLoad(this.page);
  367. done();
  368. },
  369. // 下载模板
  370. handleGet() {
  371. window.open(
  372. `/api/blade-los/bserviceterms/exportBServiceTerms/template?${this.website.tokenHeader
  373. }=${getToken()}`
  374. );
  375. },
  376. // 扩展数据详情的---------------------------------------
  377. // 扩展数据添加
  378. extendedDataAdd() {
  379. // this.form.extendedDataArr.map(item => {
  380. // item.edit = false
  381. // })
  382. this.form.extendedDataArr.push({
  383. edit: true
  384. })
  385. },
  386. // 扩展数据编辑
  387. extendedDataEdit(index, row) {
  388. this.$set(row, 'edit', !row.edit)
  389. // row.edit = !row.edit
  390. },
  391. // 扩展数据删除
  392. extendedDataDelete(index, row) {
  393. this.form.extendedDataArr.splice(index, 1)
  394. },
  395. // 扩展数据表格点击查询详情
  396. extendedDataview(row) {
  397. this.form = row
  398. this.extendedDisabled = true
  399. this.dialogVisible = true
  400. },
  401. // 扩展数据弹窗关闭
  402. handleClose(done) {
  403. done();
  404. // this.$confirm('确认关闭?')
  405. // .then(_ => {
  406. // done();
  407. // })
  408. // .catch(_ => { });
  409. },
  410. // 扩展数据的确认
  411. extendedDatafun(){
  412. for(let item of this.form.extendedDataArr) {
  413. if (!item.name) {
  414. this.$message({
  415. type: "warning",
  416. message: "请填写名称!"
  417. });
  418. return
  419. }
  420. if (!item.value) {
  421. /*
  422. this.$message({
  423. type: "warning",
  424. message: "请填写键值!"
  425. });
  426. return;
  427. */
  428. }
  429. }
  430. this.dialogVisible = false;
  431. this.extendedDisabled = false
  432. this.form.extendedDataArr.map(item => {
  433. item.edit = false
  434. })
  435. },
  436. // 表格操作------------------------------------------------------------
  437. // 新增
  438. addbtnfun() {
  439. this.form.status = 0
  440. this.$refs.crud.rowAdd()
  441. },
  442. // 查看
  443. rowViewfun(row, index) {
  444. this.extendedDisabled = true
  445. this.$refs.crud.rowView(row, index)
  446. },
  447. // 编辑
  448. rowEditfun(row, index) {
  449. getBservicetermsDetail(row.id).then(res => {
  450. this.form = res.data.data;
  451. this.form.extendedDataArr.map(item => {
  452. item.edit = false
  453. })
  454. this.$refs.crud.rowEdit(row, index)
  455. });
  456. },
  457. rowSave(row, done, loading) {
  458. if(!Array.isArray(row.extendedDataArr)){
  459. row.extendedDataArr=[]
  460. }
  461. row.extendedDataArr.map(item => {
  462. delete item.edit
  463. })
  464. row.extendedData = JSON.stringify(row.extendedDataArr)
  465. delete row.extendedDataArr
  466. addBserviceterms(row).then(() => {
  467. this.onLoad(this.page);
  468. this.$message({
  469. type: "success",
  470. message: "操作成功!"
  471. });
  472. done();
  473. }, error => {
  474. loading();
  475. window.console.log(error);
  476. });
  477. },
  478. rowUpdate(row, index, done, loading) {
  479. // if (row.status === 1) {
  480. row.extendedDataArr.map(item => {
  481. delete item.edit
  482. })
  483. row.extendedData = JSON.stringify(row.extendedDataArr)
  484. delete row.extendedDataArr
  485. updateBserviceterms(row).then(() => {
  486. this.onLoad(this.page);
  487. this.$message({
  488. type: "success",
  489. message: "操作成功!"
  490. });
  491. done();
  492. }, error => {
  493. loading();
  494. console.log(error);
  495. });
  496. // } else {
  497. // this.$message({
  498. // message: '非禁用状态无法修改',
  499. // type: 'warning'
  500. // });
  501. // }
  502. },
  503. rowDel(row) {
  504. if (row.status === 1) {
  505. this.$confirm("确定将选择数据删除?", {
  506. confirmButtonText: "确定",
  507. cancelButtonText: "取消",
  508. type: "warning"
  509. })
  510. .then(() => {
  511. return removeBserviceterms(row.id);
  512. })
  513. .then(() => {
  514. this.onLoad(this.page);
  515. this.$message({
  516. type: "success",
  517. message: "操作成功!"
  518. });
  519. });
  520. } else {
  521. this.$message({
  522. message: '非禁用状态无法删除',
  523. type: 'warning'
  524. });
  525. }
  526. },
  527. handleDelete() {
  528. if (this.selectionList.length === 0) {
  529. this.$message.warning("请选择至少一条数据");
  530. return;
  531. }
  532. for (const selection of this.selectionList) {
  533. if (selection.status == 0) {
  534. this.$message.warning("选中的数据中有启用数据,启用数据不可删除!");
  535. return;
  536. }
  537. }
  538. this.$confirm("确定将选择数据删除?", {
  539. confirmButtonText: "确定",
  540. cancelButtonText: "取消",
  541. type: "warning"
  542. })
  543. .then(() => {
  544. return removeBserviceterms(this.ids);
  545. })
  546. .then(() => {
  547. this.onLoad(this.page);
  548. this.$message({
  549. type: "success",
  550. message: "操作成功!"
  551. });
  552. this.$refs.crud.toggleSelection();
  553. });
  554. },
  555. beforeOpen(done, type) {
  556. if (["edit", "view"].includes(type)) {
  557. getBservicetermsDetail(this.form.id).then(res => {
  558. this.form = res.data.data;
  559. });
  560. }
  561. done();
  562. },
  563. searchReset() {
  564. this.query = {};
  565. this.onLoad(this.page);
  566. },
  567. searchChange(params, done) {
  568. this.query = params;
  569. this.page.currentPage = 1;
  570. this.onLoad(this.page, params);
  571. done();
  572. },
  573. selectionChange(list) {
  574. this.selectionList = list;
  575. },
  576. selectionClear() {
  577. this.selectionList = [];
  578. this.$refs.crud.toggleSelection();
  579. },
  580. currentChange(currentPage) {
  581. this.page.currentPage = currentPage;
  582. },
  583. sizeChange(pageSize) {
  584. this.page.pageSize = pageSize;
  585. },
  586. refreshChange() {
  587. this.onLoad(this.page, this.query);
  588. },
  589. onLoad(page, params = {}) {
  590. this.loading = true;
  591. getBservicetermsList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  592. const data = res.data.data;
  593. this.page.total = data.total;
  594. this.data = data.records;
  595. this.loading = false;
  596. this.selectionClear();
  597. });
  598. },
  599. //自定义列保存
  600. async saveColumnTwo(ref, option, optionBack, code) {
  601. /**
  602. * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
  603. * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
  604. * 一定要执行异步操作,要等接口成功返回,才能执行下一行编码
  605. */
  606. const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
  607. if (inSave) {
  608. this.$message.success("保存成功");
  609. //关闭窗口
  610. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  611. }
  612. },
  613. //自定义列重置
  614. async resetColumnTwo(ref, option, optionBack, code) {
  615. this[option] = this[optionBack];
  616. const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
  617. if (inSave) {
  618. this.$message.success("重置成功");
  619. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  620. }
  621. },
  622. // 更改表格颜色
  623. headerClassName(tab) {
  624. //颜色间隔
  625. let back = ""
  626. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  627. if (tab.columnIndex % 2 === 0) {
  628. back = "back-one"
  629. } else if (tab.columnIndex % 2 === 1) {
  630. back = "back-two"
  631. }
  632. }
  633. return back;
  634. },
  635. }
  636. };
  637. </script>
  638. <style lang="scss" scoped>
  639. ::v-deep#out-table .back-one {
  640. background: #ecf5ff !important;
  641. }
  642. ::v-deep#out-table .back-two {
  643. background: #ecf5ff !important;
  644. }
  645. /deep/ .el-col-md-8 {
  646. width: 24.33333%;
  647. }
  648. </style>