index.vue 24 KB

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