portsTerms.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <!--港口详情-->
  2. <template>
  3. <div class="borderless" v-loading="pageLoading">
  4. <div class="customer-head">
  5. <div class="customer-back">
  6. <!-- <i class="back-icon el-icon-arrow-left"></i><i style="font-style:normal">返回管理列表</i>-->
  7. <el-button type="danger" style="border: none;background: none;color: red" icon="el-icon-arrow-left"
  8. @click="backToList">返回列表
  9. </el-button>
  10. </div>
  11. <div class="add-customer-btn">
  12. <el-button size="small" type="primary" style="margin-right: 8px" v-if="detailData.seeDisabled"
  13. :loading="saveLoading" @click="editHandle">编 辑
  14. </el-button>
  15. <el-button size="small" type="primary" style="margin-right: 8px" v-else :loading="saveLoading"
  16. @click="editCustomer">保 存
  17. </el-button>
  18. </div>
  19. </div>
  20. <div class="customer-main">
  21. <el-form :model="form" ref="form" label-width="100px" class="demo-ruleForm">
  22. <containerTitle title="基础资料"></containerTitle>
  23. <basic-container :showBtn="true">
  24. <el-row>
  25. <el-col v-for="(item, index) in basicData.column" :key="index" :span="item.span ? item.span : 8"
  26. :class="{ isShow: item.display }">
  27. <el-form-item v-if="item.prop == 'addressCname'" :label="item.label" :prop="item.prop"
  28. :rules="item.rules">
  29. <dic-select v-model="form.addressCname" placeholder="场站" label="cnName"
  30. url="/blade-los/bcorps/listAll?corpTypeName=场站" :filterable="true"
  31. :multiple="true" :collapseTags="true" dataType="string"
  32. @selectChange="dicChange('addressCname', $event)"
  33. :disabled="item.disabled || detailData.seeDisabled"></dic-select>
  34. </el-form-item>
  35. <el-form-item v-else :label="item.label" :prop="item.prop" :rules="item.rules">
  36. <el-select v-if="item.type == 'select'" v-model="form[item.prop]"
  37. :placeholder="'请选择' + item.label" clearable filterable style="width: 100%"
  38. size="small" :disabled="item.disabled || detailData.seeDisabled">
  39. <el-option v-for="(ite, inde) in item.dicData" :key="inde" :label="ite.label"
  40. :value="ite.value"></el-option>
  41. </el-select>
  42. <el-input type="textarea" v-else-if="item.type === 'textarea'"
  43. v-model.trim="form[item.prop]" size="small" autocomplete="off"
  44. :disabled="item.disabled || detailData.seeDisabled"
  45. :placeholder="'请输入' + item.label"></el-input>
  46. <el-input v-else type="age" style="width: 100%;" v-model.trim="form[item.prop]"
  47. size="small" autocomplete="off" :disabled="item.disabled || detailData.seeDisabled"
  48. clearable :placeholder="'请输入' + item.label"></el-input>
  49. </el-form-item>
  50. </el-col>
  51. </el-row>
  52. </basic-container>
  53. </el-form>
  54. </div>
  55. <div class="customer-main margintop">
  56. <containerTitle title="船公司信息"></containerTitle>
  57. <basic-container>
  58. <div style="margin-bottom: 10px">
  59. <el-button type="primary" size="small" :disabled="detailData.seeDisabled"
  60. @click="shippingCompanyAdd">新增数据
  61. </el-button>
  62. </div>
  63. <el-table stripe :data="form.bportsTermsList" id="out-table" :header-cell-class-name="headerClassName"
  64. style="width: 100%">
  65. <el-table-column prop="carrierName" label="船公司名称">
  66. </el-table-column>
  67. <el-table-column prop="serviceTermCode" label="服务条款">
  68. </el-table-column>
  69. <el-table-column prop="details" label="船公司特殊要求">
  70. </el-table-column>
  71. <el-table-column prop="remarks" label="备注">
  72. </el-table-column>
  73. <el-table-column label="操作">
  74. <template slot-scope="scope">
  75. <el-button type="text" size="small" :disabled="detailData.seeDisabled"
  76. @click="shipCompanyEdit(scope.$index, scope.row)">编辑</el-button>
  77. <el-button size="small" type="text" :disabled="detailData.seeDisabled"
  78. @click="shipCompanyDelete(scope.$index, scope.row)">删除</el-button>
  79. </template>
  80. </el-table-column>
  81. </el-table>
  82. </basic-container>
  83. </div>
  84. <div class="customer-main margintop">
  85. <containerTitle title="扩展数据"></containerTitle>
  86. <basic-container>
  87. <div style="margin-bottom: 10px">
  88. <el-button type="primary" size="small" :disabled="detailData.seeDisabled"
  89. @click="extendedDataAdd">新增数据
  90. </el-button>
  91. </div>
  92. <el-table stripe :data="form.extendedDataArr" id="out-table" :header-cell-class-name="headerClassName"
  93. style="width: 100%">
  94. <el-table-column prop="name" label="名称">
  95. <template slot-scope="{row}">
  96. <el-input v-if="row.edit" size="small" v-model="row.name" placeholder="请输入名称"></el-input>
  97. <span v-else>{{ row.name }}</span>
  98. </template>
  99. </el-table-column>
  100. <el-table-column prop="value" label="键值">
  101. <template slot-scope="{row}">
  102. <el-input v-if="row.edit" size="small" v-model="row.value" placeholder="请输入键值"></el-input>
  103. <span v-else>{{ row.value }}</span>
  104. </template>
  105. </el-table-column>
  106. <el-table-column label="操作">
  107. <template slot-scope="scope">
  108. <el-button type="text" size="small" :disabled="detailData.seeDisabled"
  109. @click="extendedDataEdit(scope.$index, scope.row)">{{ scope.row.edit ? '保存' : '编辑'
  110. }}</el-button>
  111. <el-button size="small" type="text" :disabled="detailData.seeDisabled"
  112. @click="extendedDataDelete(scope.$index, scope.row)">删除</el-button>
  113. </template>
  114. </el-table-column>
  115. </el-table>
  116. </basic-container>
  117. </div>
  118. <!--船公司添加弹窗-->
  119. <el-dialog title="船公司" :visible.sync="shipVisible" width="50%" append-to-body :destroy-on-close="true"
  120. :modal-append-to-body="false" :before-close="shipClose">
  121. <div>
  122. <el-form :model="shipForm" ref="shipForm" label-width="120px" class="demo-ruleForm">
  123. <el-row>
  124. <el-col v-for="(item, index) in shipData.column" :key="index" :span="item.span ? item.span : 12"
  125. :class="{ isShow: item.display }">
  126. <el-form-item :label="item.label" :prop="item.prop" :rules="item.rules">
  127. <el-input type="textarea" v-if="item.type === 'textarea'"
  128. v-model.trim="shipForm[item.prop]" size="small" autocomplete="off"
  129. :disabled="item.disabled" :placeholder="'请输入' + item.label"></el-input>
  130. <div v-else-if="item.prop == 'carrierName'">
  131. <search-query ref="SearchQuery" :datalist="corpData" title="船公司" :filterable="true"
  132. :clearable="true" :remote="true"
  133. :forParameter="{ key: 'id', label: 'cnName', value: 'id' }"
  134. @remoteMethod="getBcorpsListfun" @corpChange="corpCorpChange">
  135. <bcorps></bcorps>
  136. </search-query>
  137. </div>
  138. <div v-else-if="item.prop == 'serviceTermCode'">
  139. <search-query ref="SearchQuery" :datalist="serviceTermCodeData" title="服务条款"
  140. :filterable="true" :clearable="true" :remote="true"
  141. :forParameter="{ key: 'id', label: 'cnName', value: 'cnName' }"
  142. @remoteMethod="getBcorpsListfun" @corpChange="serviceTermCodeCorpChange">
  143. <bserviceterms></bserviceterms>
  144. </search-query>
  145. </div>
  146. <el-input v-else type="age" style="width: 100%;" v-model.trim="shipForm[item.prop]"
  147. size="small" autocomplete="off" :disabled="item.disabled" clearable
  148. :placeholder="'请输入' + item.label"></el-input>
  149. </el-form-item>
  150. </el-col>
  151. </el-row>
  152. </el-form>
  153. </div>
  154. <span slot="footer" class="dialog-footer">
  155. <el-button @click="shipVisible = false;">取 消</el-button>
  156. <el-button type="primary" @click="shipcompanyConfirm">确 定</el-button>
  157. </span>
  158. </el-dialog>
  159. </div>
  160. </template>
  161. <script>
  162. import { bportsDetail, bportsSubmit } from "@/api/iosBasicData/bports";
  163. import SearchQuery from "@/components/iosbasic-data/searchquery.vue";
  164. import bcorps from "@/views/iosBasicData/bcorps/index.vue";
  165. import bserviceterms from "@/views/iosBasicData/bserviceterms/index.vue";
  166. import dicSelect from "@/components/dicSelect/main";
  167. import { getBcorpsList } from "@/api/iosBasicData/bcorps";
  168. import { getBservicetermsList } from "@/api/iosBasicData/bserviceterms";
  169. export default {
  170. components: { bcorps, SearchQuery, bserviceterms, dicSelect },
  171. props: {
  172. detailData: {
  173. type: Object
  174. }
  175. },
  176. data() {
  177. return {
  178. pageLoading: false,
  179. saveLoading: false,
  180. // 船公司弹窗
  181. shipVisible: false,
  182. // 船公司弹窗绑定的数据
  183. shipForm: {},
  184. shipIndex: null,
  185. // 客户(船公司)数据
  186. corpData: [],
  187. // 服务条款
  188. serviceTermCodeData: [],
  189. // 获取到的数据
  190. form: {
  191. isSeaPort: 0,
  192. isAirPort: 0,
  193. isInlandPort: 0,
  194. status: 0,
  195. extendedDataArr: [],
  196. bportsTermsList: [],
  197. },
  198. // 基础资料数据
  199. basicData: {
  200. column: [
  201. {
  202. label: "港口编码",
  203. prop: "code",
  204. rules: [{
  205. required: true,
  206. message: "请输入港口编码",
  207. trigger: "blur"
  208. }]
  209. },
  210. {
  211. label: "国际编码",
  212. prop: "unCode",
  213. },
  214. {
  215. label: "中文名称",
  216. prop: "cnName",
  217. rules: [{
  218. required: true,
  219. message: "请输入中文名称",
  220. trigger: "blur"
  221. }]
  222. },
  223. {
  224. label: "英文名称",
  225. prop: "enName",
  226. rules: [{
  227. required: true,
  228. message: "请输入英文名称",
  229. trigger: "blur"
  230. }]
  231. },
  232. {
  233. label: "国家代码",
  234. prop: "cntyCode",
  235. },
  236. {
  237. label: "国家名称",
  238. prop: "cntyName",
  239. },
  240. {
  241. label: "场站",
  242. prop: "addressCname",
  243. rules: [{
  244. required: true,
  245. message: "请选择场站",
  246. trigger: "blur"
  247. }]
  248. },
  249. {
  250. label: "是否海港",
  251. prop: "isSeaPort",
  252. type: 'select',
  253. dicData: [{
  254. label: '否',
  255. value: 0
  256. }, {
  257. label: '是',
  258. value: 1
  259. }],
  260. },
  261. {
  262. label: "是否空港",
  263. prop: "isAirPort",
  264. type: 'select',
  265. dicData: [{
  266. label: '否',
  267. value: 0
  268. }, {
  269. label: '是',
  270. value: 1
  271. }],
  272. },
  273. {
  274. label: "是否内陆港",
  275. prop: "isInlandPort",
  276. width: 100,
  277. type: 'select',
  278. dicData: [{
  279. label: '否',
  280. value: 0
  281. }, {
  282. label: '是',
  283. value: 1
  284. }],
  285. },
  286. {
  287. label: "状态",
  288. prop: "status",
  289. type: 'select',
  290. dicData: [{
  291. label: '启用',
  292. value: 0
  293. }, {
  294. label: '停用',
  295. value: 1
  296. }],
  297. },
  298. {
  299. label: "备注",
  300. prop: "remarks",
  301. span: 24,
  302. type: 'textarea',
  303. minRows: 3,
  304. },
  305. ]
  306. },
  307. // 传公司数据
  308. shipData: {
  309. column: [
  310. {
  311. label: "船公司名称",
  312. prop: "carrierName",
  313. rules: [{
  314. required: true,
  315. message: "请输入传公司名称",
  316. trigger: "blur"
  317. }]
  318. },
  319. {
  320. label: "服务条款",
  321. prop: "serviceTermCode",
  322. rules: [{
  323. required: true,
  324. message: "请输入服务条款",
  325. trigger: "blur"
  326. }]
  327. },
  328. {
  329. label: "船公司特殊要求",
  330. prop: "details",
  331. // rules: [{
  332. // required: true,
  333. // message: "请输入船公司特殊要求",
  334. // trigger: "blur"
  335. // }]
  336. },
  337. {
  338. label: "备注",
  339. prop: "remarks",
  340. span: 24,
  341. type: 'textarea',
  342. minRows: 3,
  343. },
  344. ]
  345. },
  346. }
  347. },
  348. created() {
  349. this.getBcorpsListfun()
  350. this.getBservicetermsListfun()
  351. },
  352. methods: {
  353. dicChange(name, row) {
  354. if (name == 'addressCname') {
  355. console.log(row)
  356. if (row) {
  357. this.form.addressId = row.ids
  358. this.form.addressCname = row.names
  359. } else {
  360. this.form.addressId = null
  361. this.form.addressCname = null
  362. }
  363. }
  364. },
  365. // 获取客户(船公司)数据
  366. getBcorpsListfun(cnName) {
  367. getBcorpsList(1, 10, { cnName }).then(res => {
  368. this.corpData = res.data.data.records
  369. })
  370. },
  371. // 船公司选中的回调
  372. corpCorpChange(value) {
  373. for (let item of this.corpData) {
  374. if (item.id == value) {
  375. this.$set(this.shipForm, 'carrierId', item.id)
  376. this.$set(this.shipForm, 'carrierName', item.cnName)
  377. }
  378. }
  379. },
  380. // 服务条款请求的数据
  381. getBservicetermsListfun(cnName) {
  382. getBservicetermsList(1, 10, { cnName }).then(res => {
  383. this.serviceTermCodeData = res.data.data.records
  384. })
  385. },
  386. // 服务条款选择的回调
  387. serviceTermCodeCorpChange(value) {
  388. this.shipForm.serviceTermCode = value
  389. },
  390. // 获取详情数据
  391. bportsDetailfun(id) {
  392. this.pageLoading = true
  393. bportsDetail(id).then(res => {
  394. this.form = res.data.data;
  395. this.form.extendedDataArr.map(item => {
  396. item.edit = false
  397. return item
  398. })
  399. this.pageLoading = false
  400. });
  401. },
  402. // 编辑按钮更改状态
  403. editHandle() {
  404. this.detailData.seeDisabled = false;
  405. },
  406. // 保存按钮
  407. editCustomer() {
  408. this.$refs.form.validate((valid) => {
  409. if (valid) {
  410. // 判断是否有id
  411. // if (this.form.id) {
  412. // this.form.bportsTermsList.map(item=>{
  413. // item.pid = this.form.id
  414. // })
  415. // }else {
  416. // }
  417. this.saveLoading = true
  418. this.bportsSubmitfun()
  419. } else {
  420. return false;
  421. }
  422. })
  423. },
  424. // 保存接口
  425. bportsSubmitfun() {
  426. this.form.extendedData = JSON.stringify(this.form.extendedDataArr)
  427. bportsSubmit(this.form).then((res) => {
  428. this.$message({
  429. type: "success",
  430. message: "操作成功!"
  431. });
  432. this.saveLoading = false
  433. this.bportsDetailfun(res.data.data.id)
  434. this.detailData.seeDisabled = true;
  435. })
  436. },
  437. // 船公司添加
  438. shippingCompanyAdd() {
  439. this.shipVisible = true
  440. },
  441. // 船公司编辑
  442. shipCompanyEdit(index, row) {
  443. this.shipForm = JSON.parse(JSON.stringify(row))
  444. this.shipIndex = index
  445. this.shipVisible = true
  446. },
  447. // 船公司删除
  448. shipCompanyDelete(index, row) {
  449. this.form.bportsTermsList.splice(index, 1)
  450. },
  451. // 船公司确认
  452. shipcompanyConfirm() {
  453. if (this.shipIndex != null) {
  454. this.form.bportsTermsList.splice(this.shipIndex, 1, this.shipForm)
  455. } else {
  456. this.form.bportsTermsList.push(this.shipForm)
  457. }
  458. this.shipForm = {}
  459. this.shipIndex = null
  460. this.shipVisible = false
  461. },
  462. // 船公司关闭
  463. shipClose(done) {
  464. done();
  465. // this.$confirm('确认关闭?')
  466. // .then(_ => {
  467. // done();
  468. // })
  469. // .catch(_ => {});
  470. },
  471. // 扩展数据添加
  472. extendedDataAdd() {
  473. this.form.extendedDataArr.map(item => {
  474. item.edit = false
  475. })
  476. this.form.extendedDataArr.push({
  477. edit: true
  478. })
  479. },
  480. // 扩展数据编辑
  481. extendedDataEdit(index, row) {
  482. if (row.edit) {
  483. this.$delete(row, 'edit')
  484. this.$set(row, 'edit', false)
  485. } else {
  486. this.$delete(row, 'edit')
  487. this.$set(row, 'edit', true)
  488. }
  489. },
  490. // 扩展数据删除
  491. extendedDataDelete(index, row) {
  492. this.form.extendedDataArr.splice(index, 1)
  493. },
  494. //返回列表
  495. backToList() {
  496. this.$emit('goBack')
  497. },
  498. // 更改表格颜色
  499. headerClassName(tab) {
  500. //颜色间隔
  501. let back = ""
  502. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  503. if (tab.columnIndex % 2 === 0) {
  504. back = "back-one"
  505. } else if (tab.columnIndex % 2 === 1) {
  506. back = "back-two"
  507. }
  508. }
  509. return back;
  510. },
  511. }
  512. }
  513. </script>
  514. <style scoped>
  515. ::v-deep#out-table .back-one {
  516. background: #ecf5ff !important;
  517. }
  518. ::v-deep#out-table .back-two {
  519. background: #ecf5ff !important;
  520. }
  521. .borderless {
  522. height: 100%;
  523. box-sizing: border-box
  524. }
  525. .customer-main {
  526. //margin-top: 20px;
  527. //width: calc(100% - 140px);
  528. margin-bottom: 15px;
  529. }
  530. .margintop {
  531. margin-top: 10px;
  532. }
  533. ::v-deep.el-form-item {
  534. margin-bottom: 0;
  535. }
  536. .isShow {
  537. display: none;
  538. }
  539. </style>