index.vue 22 KB

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