detail.vue 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559
  1. <template>
  2. <div v-if="showDetail">
  3. <div style="display: flex; justify-content: space-between">
  4. <div style="display: flex; align-items: center">
  5. <el-breadcrumb separator="/">
  6. <el-breadcrumb-item
  7. ><span style="font-weight: 700">凯和协议</span></el-breadcrumb-item
  8. >
  9. <el-breadcrumb-item
  10. ><span style="font-weight: 700"
  11. >凯和协议详情页</span
  12. ></el-breadcrumb-item
  13. >
  14. </el-breadcrumb>
  15. <el-button
  16. style="margin-left: 10px"
  17. size="mini"
  18. icon="el-icon-arrow-left"
  19. @click="cancel"
  20. >返回列表
  21. </el-button>
  22. </div>
  23. </div>
  24. <br />
  25. <el-form
  26. ref="form"
  27. :model="form"
  28. :rules="rules"
  29. label-width="100px"
  30. :disabled="readOnly"
  31. >
  32. <el-row>
  33. <el-col :span="6">
  34. <el-form-item label="协议名称" prop="fName">
  35. <el-input v-model="form.fName" placeholder="请输入" size="small">
  36. </el-input>
  37. </el-form-item>
  38. </el-col>
  39. <el-col :span="6">
  40. <el-form-item label="协议类型" prop="fTypes">
  41. <el-select
  42. style="width: 100%"
  43. v-model="form.fTypes"
  44. placeholder="请选择"
  45. size="small"
  46. filterable
  47. clearable
  48. >
  49. <el-option
  50. v-for="item in protocolTypes"
  51. :key="item.dictValue"
  52. :label="item.dictLabel"
  53. :value="item.dictLabel"
  54. >
  55. </el-option>
  56. </el-select>
  57. </el-form-item>
  58. </el-col>
  59. <el-col :span="6">
  60. <el-form-item label="制单人" prop="createBy">
  61. <el-input
  62. v-model="form.createBy"
  63. size="small"
  64. placeholder="请输入"
  65. disabled
  66. ></el-input>
  67. </el-form-item>
  68. </el-col>
  69. <el-col :span="6">
  70. <el-form-item label="状态" prop="status">
  71. <el-input
  72. v-model="form.status"
  73. size="small"
  74. placeholder="请输入"
  75. disabled
  76. ></el-input>
  77. </el-form-item>
  78. </el-col>
  79. </el-row>
  80. <el-row>
  81. <el-col :span="6">
  82. <el-form-item label="起运港" prop="fLoadportId">
  83. <el-select
  84. style="width: 100%"
  85. v-model="form.fLoadportId"
  86. placeholder="请选择"
  87. size="small"
  88. @change="loadportChange"
  89. filterable
  90. clearable
  91. >
  92. <el-option
  93. v-for="item in fMblnoOptions"
  94. :key="item.fId"
  95. :label="item.fName"
  96. :value="item.fId"
  97. >
  98. </el-option>
  99. </el-select>
  100. </el-form-item>
  101. </el-col>
  102. <el-col :span="6">
  103. <el-form-item label="运输条款" prop="fLoadportMode">
  104. <el-select
  105. style="width: 100%"
  106. v-model="form.fLoadportMode"
  107. placeholder="请选择起运港运输条款"
  108. size="small"
  109. filterable
  110. clearable
  111. >
  112. <el-option
  113. v-for="item in fServiceitems"
  114. :key="item.dictValue"
  115. :label="item.dictLabel"
  116. :value="item.dictLabel"
  117. >
  118. </el-option>
  119. </el-select>
  120. </el-form-item>
  121. </el-col>
  122. <el-col :span="6">
  123. <el-form-item label="目的港" prop="fDestportId">
  124. <el-select
  125. style="width: 100%"
  126. v-model="form.fDestportId"
  127. placeholder="请选择"
  128. size="small"
  129. @change="destportChange"
  130. filterable
  131. clearable
  132. >
  133. <el-option
  134. v-for="item in fMblnoOptions"
  135. :key="item.fId"
  136. :label="item.fName"
  137. :value="item.fId"
  138. >
  139. </el-option>
  140. </el-select>
  141. </el-form-item>
  142. </el-col>
  143. <el-col :span="6">
  144. <el-form-item label="运输条款" prop="fDestportMode">
  145. <el-select
  146. style="width: 100%"
  147. v-model="form.fDestportMode"
  148. placeholder="请选择目的港运输条款"
  149. size="small"
  150. filterable
  151. clearable
  152. >
  153. <el-option
  154. v-for="item in fServiceitemsNews"
  155. :key="item.dictValue"
  156. :label="item.dictLabel"
  157. :value="item.dictLabel"
  158. >
  159. </el-option>
  160. </el-select>
  161. </el-form-item>
  162. </el-col>
  163. <el-col :span="6">
  164. <el-form-item label="有效期开始" prop="fPeriodStart">
  165. <el-date-picker
  166. style="width: 100%"
  167. v-model="form.fPeriodStart"
  168. placeholder="请选择"
  169. type="date"
  170. size="small"
  171. >
  172. </el-date-picker>
  173. </el-form-item>
  174. </el-col>
  175. <el-col :span="6">
  176. <el-form-item label="有效期结束" prop="fPeriodEnd">
  177. <el-date-picker
  178. style="width: 100%"
  179. v-model="form.fPeriodEnd"
  180. placeholder="请选择"
  181. type="date"
  182. size="small"
  183. >
  184. </el-date-picker>
  185. </el-form-item>
  186. </el-col>
  187. <el-col :span="6">
  188. <el-form-item label="制单时间" prop="createTime">
  189. <el-date-picker
  190. style="width: 100%"
  191. v-model="form.createTime"
  192. placeholder="请选择"
  193. type="date"
  194. size="small"
  195. disabled
  196. >
  197. </el-date-picker>
  198. </el-form-item>
  199. </el-col>
  200. </el-row>
  201. <el-row>
  202. <el-col :span="24">
  203. <el-form-item label="备注" prop="remark">
  204. <el-input
  205. v-model="form.remark"
  206. size="small"
  207. placeholder="请输入"
  208. type="textarea"
  209. :rows="2"
  210. />
  211. </el-form-item>
  212. </el-col>
  213. </el-row>
  214. </el-form>
  215. <div class="head-but">
  216. <div>
  217. <el-button type="primary" size="mini" @click="add" :disabled="readOnly">
  218. 新 增
  219. </el-button>
  220. <el-button
  221. type="success"
  222. size="mini"
  223. @click="save"
  224. :disabled="readOnly"
  225. >
  226. 保 存
  227. </el-button>
  228. <el-button type="info" size="mini" :disabled="readOnly">
  229. 生效申请
  230. </el-button>
  231. <el-button type="danger" size="mini" :disabled="readOnly">
  232. 作废申请
  233. </el-button>
  234. </div>
  235. <div class="tabSetting">
  236. <div style="margin: 0 12px">
  237. <el-button
  238. icon="el-icon-setting"
  239. size="mini"
  240. circle
  241. @click="colSetting"
  242. ></el-button>
  243. </div>
  244. </div>
  245. </div>
  246. <el-table :data="data" style="width: 100%">
  247. <el-table-column label="序号" type="index" width="50" />
  248. <el-table-column
  249. v-for="(item, index) in tableOption"
  250. :key="index"
  251. :label="item.name"
  252. :width="item.width"
  253. :prop="item.label"
  254. align="center"
  255. :fixed="item.fixed"
  256. :show-overflow-tooltip="true"
  257. >
  258. <template slot-scope="{ row }">
  259. <span v-if="item.label == 'fFeeId'">
  260. <el-select
  261. style="width: 100%"
  262. v-model="row.fFeeId"
  263. placeholder="请选择"
  264. size="small"
  265. filterable
  266. clearable
  267. @change="feeChange(row)"
  268. :disabled="readOnly"
  269. >
  270. <el-option
  271. v-for="item in listFees"
  272. :key="item.fId"
  273. :label="item.fName"
  274. :value="item.fId"
  275. >
  276. </el-option>
  277. </el-select>
  278. </span>
  279. <span v-if="item.label == 'fFeeunitId'">
  280. <el-select
  281. style="width: 100%"
  282. v-model="row.fFeeunitId"
  283. placeholder="请选择"
  284. size="small"
  285. filterable
  286. clearable
  287. @change="feeunitChange(row)"
  288. :disabled="readOnly"
  289. >
  290. <el-option
  291. v-for="item in unitfees"
  292. :key="item.dictValue"
  293. :label="item.dictLabel"
  294. :value="item.dictValue"
  295. >
  296. </el-option>
  297. </el-select>
  298. </span>
  299. <span v-if="item.label == 'fPrice'">
  300. <el-input
  301. v-model="row.fPrice"
  302. placeholder="请输入"
  303. size="small"
  304. oninput="value=value.replace(/[^0-9.]/g,'').replace(/^(\-)*(\d+)\.(\d\d).*$/,'$1$2.$3')"
  305. :disabled="readOnly"
  306. >
  307. </el-input>
  308. </span>
  309. <span v-if="item.label == 'remark'">
  310. <el-input
  311. v-model="row.remark"
  312. placeholder="请输入"
  313. size="small"
  314. :disabled="readOnly"
  315. >
  316. </el-input>
  317. </span>
  318. <span v-if="item.label == 'createBy'">
  319. {{ row.createBy }}
  320. </span>
  321. <span v-if="item.label == 'createTime'">
  322. {{ row.createTime }}
  323. </span>
  324. </template>
  325. </el-table-column>
  326. <el-table-column fixed="right" label="操作" width="80" align="center">
  327. <template slot-scope="{ row, $index }">
  328. <el-button
  329. type="text"
  330. size="small"
  331. @click="rowDel(row, $index)"
  332. :disabled="readOnly"
  333. >删除</el-button
  334. >
  335. </template>
  336. </el-table-column>
  337. </el-table>
  338. <column-setting
  339. ref="columnSetting"
  340. @reset="reset"
  341. @getRowdata="getRowdata"
  342. tableName="凯和协议明细"
  343. />
  344. </div>
  345. </template>
  346. <script>
  347. import { tableOption2 } from "./js/index";
  348. import columnSetting from "@/components/ColumnSetting/index";
  349. import { portInquiry } from "@/api/kaihe/domesticTrade/orderInformation";
  350. import { listFees } from "@/api/basicdata/fees";
  351. import { getdetail, save, itemRemove } from "@/api/kaihe/protocol/index";
  352. export default {
  353. data() {
  354. return {
  355. form: {},
  356. tableOption: tableOption2,
  357. readOnly: null,
  358. data: [],
  359. protocolTypes: [],
  360. fServiceitems: [],
  361. fServiceitemsNews: [],
  362. fMblnoOptions: [],
  363. listFees: [],
  364. unitfees: [],
  365. rules: {
  366. fName: [
  367. { required: true, message: "请选择协议名称", trigger: "change" },
  368. ],
  369. fTypes: [
  370. { required: true, message: "请选择协议类型", trigger: "change" },
  371. ],
  372. fPeriodStart: [
  373. { required: true, message: "请选择协议类型", trigger: "change" },
  374. ],
  375. fPeriodEnd: [
  376. { required: true, message: "请选择协议类型", trigger: "change" },
  377. ],
  378. },
  379. };
  380. },
  381. props: {
  382. showDetail: {
  383. type: Boolean,
  384. },
  385. },
  386. components: {
  387. columnSetting,
  388. },
  389. created() {},
  390. methods: {
  391. init(row, status) {
  392. this.readOnly = status;
  393. if (row) {
  394. console.log(row);
  395. getdetail(row.fId).then((res) => {
  396. this.form = res.data;
  397. this.data = res.data.tShipDealItemList;
  398. });
  399. }
  400. this.getDicts("protocol_type").then((response) => {
  401. this.protocolTypes = response.data;
  402. });
  403. this.getDicts("f_serviceitems").then((response) => {
  404. this.fServiceitems = response.data;
  405. });
  406. this.getDicts("f_serviceitemsNew").then((response) => {
  407. this.fServiceitemsNews = response.data;
  408. });
  409. this.getDicts("data_unitfees").then((response) => {
  410. this.unitfees = response.data;
  411. });
  412. portInquiry().then((res) => {
  413. this.fMblnoOptions = res.rows;
  414. });
  415. listFees().then((res) => {
  416. this.listFees = res.rows;
  417. });
  418. setTimeout((e) => {
  419. this.$refs.columnSetting.getRow(this.tableOption);
  420. }, 100);
  421. },
  422. feeChange(row) {
  423. this.listFees.forEach((e) => {
  424. if (e.fId == row.fFeeId) {
  425. row.fFeeName = e.fName;
  426. }
  427. });
  428. },
  429. feeunitChange(row) {
  430. this.unitfees.forEach((e) => {
  431. if (e.dictValue == row.fFeeunitId) {
  432. row.fFeeunitName = e.dictLabel;
  433. }
  434. });
  435. },
  436. loadportChange(row) {
  437. this.fMblnoOptions.forEach((e) => {
  438. if (row == e.fId) {
  439. this.form.fLoadportName = e.fName;
  440. }
  441. });
  442. },
  443. destportChange(row) {
  444. this.fMblnoOptions.forEach((e) => {
  445. if (row == e.fId) {
  446. this.form.fDestportName = e.fName;
  447. }
  448. });
  449. },
  450. returnData() {
  451. this.$emit("goBack", false);
  452. },
  453. resetQuery() {
  454. this.form = this.$options.data().form;
  455. },
  456. getList() {},
  457. add() {
  458. this.data.push({});
  459. },
  460. save() {
  461. if (this.data.length > 0) {
  462. for (let i = 0; i < this.data.length; i++) {
  463. if (!this.data[i].fFeeId) {
  464. return this.$message.error(
  465. "请选择第" + Number(i + 1) + "行费用名称"
  466. );
  467. }
  468. if (!this.data[i].fFeeunitId) {
  469. return this.$message.error(
  470. "请选择第" + Number(i + 1) + "行价格单位"
  471. );
  472. }
  473. console.log(this.data[i].fPrice)
  474. if (this.data[i].fPrice == undefined || this.data[i].fPrice === "") {
  475. return this.$message.error("请输入第" + Number(i + 1) + "行单价");
  476. }
  477. }
  478. }
  479. save({ ...this.form, tShipDealItemList: this.data }).then((res) => {
  480. if (res.code == 200) {
  481. this.form = res.data;
  482. this.data = res.data.tShipDealItemList;
  483. this.$message({
  484. type: "success",
  485. message: "保存成功!",
  486. });
  487. }
  488. });
  489. },
  490. rowDel(row, index) {
  491. console.log(row, index);
  492. this.$confirm("确定删除数据?", {
  493. confirmButtonText: "确定",
  494. cancelButtonText: "取消",
  495. type: "warning",
  496. }).then(() => {
  497. if (row.fId) {
  498. itemRemove(row.fId).then((res) => {
  499. this.$message({
  500. type: "success",
  501. message: "删除成功!",
  502. });
  503. this.data.splice(index, 1);
  504. });
  505. } else {
  506. this.$message({
  507. type: "success",
  508. message: "删除成功!",
  509. });
  510. this.data.splice(index, 1);
  511. }
  512. });
  513. },
  514. colSetting() {
  515. this.$refs.columnSetting.init(this.tableOption);
  516. },
  517. getRowdata(list) {
  518. this.tableOption = list;
  519. },
  520. reset() {
  521. this.tableOption = this.$options.data().tableOption;
  522. },
  523. cancel() {
  524. if (!this.readOnly) {
  525. this.$confirm("返回列表,是否保存?", "提示", {
  526. confirmButtonText: "保存",
  527. cancelButtonText: "取消",
  528. type: "warning",
  529. })
  530. .then(() => {
  531. this.save("back");
  532. Object.assign(this.$data, this.$options.data());
  533. this.$emit("goBack", false);
  534. })
  535. .catch(() => {
  536. Object.assign(this.$data, this.$options.data());
  537. this.$emit("goDetail", false);
  538. });
  539. } else {
  540. Object.assign(this.$data, this.$options.data());
  541. this.$emit("goBack", false);
  542. }
  543. },
  544. },
  545. watch: {
  546. info: function (obj) {
  547. console.log(obj);
  548. },
  549. },
  550. };
  551. </script>
  552. <style lang="scss" scoped>
  553. .head-but {
  554. display: flex;
  555. justify-content: space-between;
  556. margin-bottom: 8px;
  557. }
  558. </style>