index.vue 22 KB

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