index.vue 19 KB

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