index.vue 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655
  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. this.$message({
  422. type: "warning",
  423. message: "请填写键值!"
  424. });
  425. return;
  426. }
  427. }
  428. this.dialogVisible = false;
  429. this.extendedDisabled = false
  430. this.form.extendedDataArr.map(item => {
  431. item.edit = false
  432. })
  433. },
  434. // 表格操作------------------------------------------------------------
  435. // 新增
  436. addbtnfun() {
  437. this.form.status = 0
  438. this.$refs.crud.rowAdd()
  439. },
  440. // 查看
  441. rowViewfun(row, index) {
  442. this.extendedDisabled = true
  443. this.$refs.crud.rowView(row, index)
  444. },
  445. // 编辑
  446. rowEditfun(row, index) {
  447. getBservicetermsDetail(row.id).then(res => {
  448. this.form = res.data.data;
  449. this.form.extendedDataArr.map(item => {
  450. item.edit = false
  451. })
  452. this.$refs.crud.rowEdit(row, index)
  453. });
  454. },
  455. rowSave(row, done, loading) {
  456. row.extendedDataArr.map(item => {
  457. delete item.edit
  458. })
  459. row.extendedData = JSON.stringify(row.extendedDataArr)
  460. delete row.extendedDataArr
  461. addBserviceterms(row).then(() => {
  462. this.onLoad(this.page);
  463. this.$message({
  464. type: "success",
  465. message: "操作成功!"
  466. });
  467. done();
  468. }, error => {
  469. loading();
  470. window.console.log(error);
  471. });
  472. },
  473. rowUpdate(row, index, done, loading) {
  474. // if (row.status === 1) {
  475. row.extendedDataArr.map(item => {
  476. delete item.edit
  477. })
  478. row.extendedData = JSON.stringify(row.extendedDataArr)
  479. delete row.extendedDataArr
  480. updateBserviceterms(row).then(() => {
  481. this.onLoad(this.page);
  482. this.$message({
  483. type: "success",
  484. message: "操作成功!"
  485. });
  486. done();
  487. }, error => {
  488. loading();
  489. console.log(error);
  490. });
  491. // } else {
  492. // this.$message({
  493. // message: '非禁用状态无法修改',
  494. // type: 'warning'
  495. // });
  496. // }
  497. },
  498. rowDel(row) {
  499. if (row.status === 1) {
  500. this.$confirm("确定将选择数据删除?", {
  501. confirmButtonText: "确定",
  502. cancelButtonText: "取消",
  503. type: "warning"
  504. })
  505. .then(() => {
  506. return removeBserviceterms(row.id);
  507. })
  508. .then(() => {
  509. this.onLoad(this.page);
  510. this.$message({
  511. type: "success",
  512. message: "操作成功!"
  513. });
  514. });
  515. } else {
  516. this.$message({
  517. message: '非禁用状态无法删除',
  518. type: 'warning'
  519. });
  520. }
  521. },
  522. handleDelete() {
  523. if (this.selectionList.length === 0) {
  524. this.$message.warning("请选择至少一条数据");
  525. return;
  526. }
  527. for (const selection of this.selectionList) {
  528. if (selection.status == 0) {
  529. this.$message.warning("选中的数据中有启用数据,启用数据不可删除!");
  530. return;
  531. }
  532. }
  533. this.$confirm("确定将选择数据删除?", {
  534. confirmButtonText: "确定",
  535. cancelButtonText: "取消",
  536. type: "warning"
  537. })
  538. .then(() => {
  539. return removeBserviceterms(this.ids);
  540. })
  541. .then(() => {
  542. this.onLoad(this.page);
  543. this.$message({
  544. type: "success",
  545. message: "操作成功!"
  546. });
  547. this.$refs.crud.toggleSelection();
  548. });
  549. },
  550. beforeOpen(done, type) {
  551. if (["edit", "view"].includes(type)) {
  552. getBservicetermsDetail(this.form.id).then(res => {
  553. this.form = res.data.data;
  554. });
  555. }
  556. done();
  557. },
  558. searchReset() {
  559. this.query = {};
  560. this.onLoad(this.page);
  561. },
  562. searchChange(params, done) {
  563. this.query = params;
  564. this.page.currentPage = 1;
  565. this.onLoad(this.page, params);
  566. done();
  567. },
  568. selectionChange(list) {
  569. this.selectionList = list;
  570. },
  571. selectionClear() {
  572. this.selectionList = [];
  573. this.$refs.crud.toggleSelection();
  574. },
  575. currentChange(currentPage) {
  576. this.page.currentPage = currentPage;
  577. },
  578. sizeChange(pageSize) {
  579. this.page.pageSize = pageSize;
  580. },
  581. refreshChange() {
  582. this.onLoad(this.page, this.query);
  583. },
  584. onLoad(page, params = {}) {
  585. this.loading = true;
  586. getBservicetermsList(page.currentPage, page.pageSize, Object.assign(params, this.query)).then(res => {
  587. const data = res.data.data;
  588. this.page.total = data.total;
  589. this.data = data.records;
  590. this.loading = false;
  591. this.selectionClear();
  592. });
  593. },
  594. //自定义列保存
  595. async saveColumnTwo(ref, option, optionBack, code) {
  596. /**
  597. * 已定义全局方法,直接使用,saveColumnData保存列数据方法,参数传值(表格名称,当前表格的option数据)
  598. * 已定义全局方法,直接使用,getColumnName方法用来获取枚举值,参数根据自己定义的code值获取中文名
  599. * 一定要执行异步操作,要等接口成功返回,才能执行下一行编码
  600. */
  601. const inSave = await this.saveColumnData(this.getColumnName(code), this[option]);
  602. if (inSave) {
  603. this.$message.success("保存成功");
  604. //关闭窗口
  605. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  606. }
  607. },
  608. //自定义列重置
  609. async resetColumnTwo(ref, option, optionBack, code) {
  610. this[option] = this[optionBack];
  611. const inSave = await this.delColumnData(this.getColumnName(code), this[optionBack]);
  612. if (inSave) {
  613. this.$message.success("重置成功");
  614. this.$refs[ref].$refs.dialogColumn.columnBox = false;
  615. }
  616. },
  617. // 更改表格颜色
  618. headerClassName(tab) {
  619. //颜色间隔
  620. let back = ""
  621. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  622. if (tab.columnIndex % 2 === 0) {
  623. back = "back-one"
  624. } else if (tab.columnIndex % 2 === 1) {
  625. back = "back-two"
  626. }
  627. }
  628. return back;
  629. },
  630. }
  631. };
  632. </script>
  633. <style lang="scss" scoped>
  634. ::v-deep#out-table .back-one {
  635. background: #ecf5ff !important;
  636. }
  637. ::v-deep#out-table .back-two {
  638. background: #ecf5ff !important;
  639. }
  640. /deep/ .el-col-md-8 {
  641. width: 24.33333%;
  642. }
  643. </style>