agreementpriceitems.vue 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586
  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
  16. :loading="saveLoading" @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 :label="item.label" :prop="item.prop" :rules="item.rules">
  28. <div v-if="item.prop == 'corpCnName'">
  29. <search-query ref="SearchQuery"
  30. :datalist="corpData"
  31. title="客户"
  32. :filterable="true"
  33. :clearable="true"
  34. :remote="true"
  35. :selectValue="form.corpCnName"
  36. :disabled="item.disabled || detailData.seeDisabled"
  37. :forParameter="{key:'id',label:'cnName',value:'cnName'}"
  38. @remoteMethod="getBcorpsListfun" @corpChange="corpCorpChange" >
  39. <bcorps></bcorps>
  40. </search-query>
  41. </div>
  42. <el-date-picker
  43. v-else-if="item.type === 'date'"
  44. v-model="form[item.prop]"
  45. type="date"
  46. size="small"
  47. value-format="yyyy-MM-dd"
  48. :disabled="item.disabled || detailData.seeDisabled"
  49. placeholder="选择日期">
  50. </el-date-picker>
  51. <el-select v-else-if="item.type == 'select'" v-model="form[item.prop]" :placeholder="'请选择' + item.label" clearable
  52. filterable style="width: 100%" size="small"
  53. :disabled="item.disabled || detailData.seeDisabled">
  54. <el-option v-for="(ite, inde) in item.dicData" :key="inde" :label="ite.label"
  55. :value="ite.value"></el-option>
  56. </el-select>
  57. <el-input type="textarea" v-else-if="item.type === 'textarea'" v-model.trim="form[item.prop]" size="small"
  58. autocomplete="off" :disabled="item.disabled || detailData.seeDisabled" :placeholder="'请输入' + item.label"></el-input>
  59. <el-input v-else type="age" style="width: 100%;" v-model.trim="form[item.prop]" size="small" autocomplete="off"
  60. :disabled="item.disabled || detailData.seeDisabled" clearable :placeholder="'请输入' + item.label"></el-input>
  61. </el-form-item>
  62. </el-col>
  63. </el-row>
  64. </basic-container>
  65. </el-form>
  66. </div>
  67. <div class="customer-main margintop">
  68. <containerTitle title="协议详细"></containerTitle>
  69. <basic-container>
  70. <div style="margin-bottom: 10px">
  71. <el-button type="primary"
  72. size="small"
  73. :disabled="detailData.seeDisabled"
  74. @click="agreementPricepingCompanyAdd">新增数据
  75. </el-button>
  76. </div>
  77. <el-table
  78. stripe
  79. :data="form.agreementPriceItemsList"
  80. id="out-table"
  81. :header-cell-class-name="headerClassName"
  82. style="width: 100%">
  83. <el-table-column
  84. prop="carrierCnName"
  85. label="船公司中文名称">
  86. </el-table-column>
  87. <el-table-column
  88. prop="carrierEnName"
  89. label="船公司英文名称">
  90. </el-table-column>
  91. <el-table-column
  92. prop="accountPeriodDays"
  93. label="账期天数">
  94. </el-table-column>
  95. <el-table-column
  96. prop="settlementPeriodType"
  97. label="结算周期类型">
  98. </el-table-column>
  99. <el-table-column
  100. prop="settlementPeriodName"
  101. label="结算周期名称">
  102. </el-table-column>
  103. <el-table-column
  104. prop="settlementPeriodDescr"
  105. label="结算周期描述">
  106. </el-table-column>
  107. <el-table-column
  108. prop="remarks"
  109. label="备注">
  110. </el-table-column>
  111. <el-table-column label="操作">
  112. <template slot-scope="scope">
  113. <el-button
  114. type="text"
  115. size="small"
  116. :disabled="detailData.seeDisabled"
  117. @click="agreementPriceCompanyEdit(scope.$index, scope.row)">编辑</el-button>
  118. <el-button
  119. size="small"
  120. type="text"
  121. :disabled="detailData.seeDisabled"
  122. @click="agreementPriceCompanyDelete(scope.$index, scope.row)">删除</el-button>
  123. </template>
  124. </el-table-column>
  125. </el-table>
  126. </basic-container>
  127. </div>
  128. <!--协议详细添加弹窗-->
  129. <el-dialog
  130. title="协议详细"
  131. :visible.sync="agreementPriceVisible"
  132. width="60%"
  133. append-to-body
  134. :destroy-on-close="true"
  135. :modal-append-to-body="false"
  136. :before-close="agreementPriceClose">
  137. <div>
  138. <el-form :model="agreementPriceForm" ref="agreementPriceForm" label-width="100px" class="demo-ruleForm">
  139. <el-row>
  140. <el-col v-for="(item, index) in agreementPriceData.column" :key="index" :span="item.span ? item.span : 12"
  141. :class="{ isShow: item.display }" >
  142. <el-form-item :label="item.label" :prop="item.prop" :rules="item.rules">
  143. <div v-if="item.prop == 'carrierCnName'">
  144. <search-query ref="SearchQuery"
  145. :datalist="carrierData"
  146. :selectValue="agreementPriceForm[item.prop]"
  147. title="船公司"
  148. :filterable="true"
  149. :clearable="true"
  150. :remote="true"
  151. :disabled="item.disabled"
  152. :forParameter="{key:'id',label:'cnName',value:'cnName'}"
  153. @remoteMethod="getBcorpsListCarrierfun" @corpChange="carrierCorpChange" >
  154. <bcorps></bcorps>
  155. </search-query>
  156. </div>
  157. <div v-else-if="item.prop == 'settlementPeriodType'">
  158. <search-query ref="SearchQuery"
  159. :datalist="settlementPeriodData"
  160. :selectValue="agreementPriceForm[item.prop]"
  161. title="结算周期"
  162. :filterable="true"
  163. :clearable="true"
  164. :remote="true"
  165. :disabled="item.disabled"
  166. :forParameter="{key:'id',label:'balanceCycleType',value:'balanceCycleType'}"
  167. @remoteMethod="balancecycleListfun" @corpChange="settlementPeriodCorpChange" >
  168. <balancecycle></balancecycle>
  169. </search-query>
  170. </div>
  171. <el-input type="textarea" v-else-if="item.type === 'textarea'" v-model.trim="agreementPriceForm[item.prop]" size="small"
  172. autocomplete="off" :disabled="item.disabled" :placeholder="'请输入' + item.label"></el-input>
  173. <el-input v-else type="age" style="width: 100%;" v-model.trim="agreementPriceForm[item.prop]" size="small" autocomplete="off"
  174. :disabled="item.disabled" clearable :placeholder="'请输入' + item.label"></el-input>
  175. </el-form-item>
  176. </el-col>
  177. </el-row>
  178. </el-form>
  179. </div>
  180. <span slot="footer" class="dialog-footer">
  181. <el-button @click="agreementPriceVisible = false;">取 消</el-button>
  182. <el-button type="primary" @click="agreementPricecompanyConfirm">确 定</el-button>
  183. </span>
  184. </el-dialog>
  185. </div>
  186. </template>
  187. <script>
  188. import {agreementpriceDetail, agreementpriceSubmit} from "@/api/iosBasicData/agreementprice";
  189. import {bfeesList} from "@/api/iosBasicData/bfees";
  190. import {getBcorpsList} from "@/api/iosBasicData/bcorps";
  191. import { getRateList } from "@/api/iosBasicData/rateManagement";
  192. import {bbusinesstypeList} from "@/api/iosBasicData/bbusinesstype";
  193. import SearchQuery from '@/components/iosbasic-data/searchquery.vue'
  194. import bcorps from "@/views/iosBasicData/bcorps/index.vue";
  195. import bfeesdefine from "@/views/iosBasicData/bfeesdefine/index.vue";
  196. import bbusinesstype from "@/views/iosBasicData/bbusinesstype/index.vue";
  197. import balancecycle from "@/views/financialManagementF/balancecycle/index.vue";
  198. import {getWorkDicts} from "@/api/system/dictbiz";
  199. import {balancecycleList} from "@/api/iosBasicData/balancecycle";
  200. export default {
  201. components: {SearchQuery,bcorps,bfeesdefine,bbusinesstype,balancecycle},
  202. props:{
  203. detailData: {
  204. type: Object
  205. }
  206. },
  207. data(){
  208. return {
  209. pageLoading:false,
  210. saveLoading:false,
  211. // 协议详细弹窗
  212. agreementPriceVisible:false,
  213. // 协议详细弹窗绑定的数据
  214. agreementPriceForm:{},
  215. agreementPriceIndex:null,
  216. // 客户请求数据
  217. corpData:[],
  218. // 船公司请求到的数据
  219. carrierData:[],
  220. // 结算周期数据
  221. settlementPeriodData:[],
  222. // 获取到的数据
  223. form:{
  224. isShared:0,
  225. status:0,
  226. agreementPriceItemsList:[]
  227. },
  228. // 基础资料数据
  229. basicData:{
  230. column:[
  231. {
  232. label: "单据编码",
  233. prop: "billNo",
  234. rules: [{
  235. required: true,
  236. message: "请输入单位编码",
  237. trigger: "blur"
  238. }]
  239. },
  240. {
  241. label: "单位编码",
  242. prop: "agreementNo",
  243. rules: [{
  244. required: true,
  245. message: "请输入单位编码",
  246. trigger: "blur"
  247. }]
  248. },
  249. {
  250. label: "客户名称",
  251. prop: "corpCnName",
  252. rules: [{
  253. required: true,
  254. message: "请输入客户中文名称",
  255. trigger: "blur"
  256. }]
  257. },
  258. {
  259. label: "客户英文名称",
  260. prop: "corpEnName",
  261. disabled:true,
  262. rules: [{
  263. required: true,
  264. message: "请输入客户英文名称",
  265. trigger: "blur"
  266. }]
  267. },
  268. {
  269. label: "授信等级",
  270. prop: "creditLevel",
  271. // 请输入授信等级,A=A级,B=B级,B+=B+级,B-=B-级,C=C级,D=黑名单
  272. type:'select',
  273. dicData:[]
  274. },
  275. {
  276. label: "协议生效日期",
  277. prop: "effectiveDate",
  278. type: 'date'
  279. },
  280. {
  281. label: "协议失效日期",
  282. prop: "expiringDate",
  283. type: 'date'
  284. },
  285. {
  286. label: "人民币协议金额",
  287. prop: "amountCny",
  288. },
  289. {
  290. label: "美元协议金额",
  291. prop: "amountUsd",
  292. },
  293. {
  294. label: "状态",
  295. prop: "status",
  296. type:'select',
  297. dicData:[{
  298. label:'启用',
  299. value:0
  300. },{
  301. label:'停用',
  302. value:1
  303. }],
  304. },
  305. {
  306. label: "账期备注",
  307. prop: "accountPeriodRemarks",
  308. span:24,
  309. type: 'textarea',
  310. width: "180",
  311. slot: true,
  312. minRows: 3,
  313. },
  314. {
  315. label: "备注",
  316. prop: "remarks",
  317. span:24,
  318. type: 'textarea',
  319. minRows: 3,
  320. },
  321. ]
  322. },
  323. // 费用详细数据
  324. agreementPriceData:{
  325. column:[
  326. // {
  327. // label: "协议价管理主表id",
  328. // prop: "pid",
  329. // rules: [{
  330. // required: true,
  331. // message: "请输入协议价管理主表id",
  332. // trigger: "blur"
  333. // }]
  334. // },
  335. // {
  336. // label: "船公司 Id",
  337. // prop: "carrierId",
  338. // },
  339. {
  340. label: "船公司中文名称",
  341. prop: "carrierCnName",
  342. },
  343. {
  344. label: "船公司英文名称",
  345. prop: "carrierEnName",
  346. disabled:true,
  347. },
  348. {
  349. label: "账期天数",
  350. prop: "accountPeriodDays",
  351. },
  352. {
  353. label: "结算周期类型",
  354. prop: "settlementPeriodType",
  355. },
  356. {
  357. label: "结算周期名称",
  358. prop: "settlementPeriodName",
  359. disabled:true,
  360. },
  361. {
  362. label: "结算周期描述",
  363. prop: "settlementPeriodDescr",
  364. // disabled:true,
  365. },
  366. {
  367. label: "备注",
  368. prop: "remarks",
  369. span:24,
  370. type: 'textarea',
  371. minRows: 3,
  372. },
  373. ]
  374. },
  375. }
  376. },
  377. created() {
  378. this.getBcorpsListfun()
  379. this.getBcorpsListCarrierfun()
  380. this.balancecycleListfun()
  381. this.getWorkDictsfun()
  382. },
  383. methods:{
  384. // 查询字典
  385. getWorkDictsfun(){
  386. getWorkDicts('bcorps-credit-level').then((res) => {
  387. let arr = []
  388. for(let item of res.data.data) {
  389. arr.push({
  390. label:item.dictValue,
  391. value:item.dictValue
  392. })
  393. }
  394. for(let item of this.basicData.column) {
  395. if (item.prop == 'creditLevel') {
  396. item.dicData = arr
  397. }
  398. }
  399. });
  400. },
  401. // 获取客户数据
  402. getBcorpsListfun(cnName){
  403. getBcorpsList(1,10,{cnName}).then(res=>{
  404. this.corpData = res.data.data.records
  405. })
  406. },
  407. // 获取船公司数据
  408. getBcorpsListCarrierfun(cnName){
  409. getBcorpsList(1,10,{corpTypeName:'船公司',cnName}).then(res=>{
  410. this.carrierData = res.data.data.records
  411. })
  412. },
  413. // 结算周期数据
  414. balancecycleListfun(cnName){
  415. balancecycleList(1,10,{cnName}).then(res=>{
  416. this.settlementPeriodData = res.data.data.records
  417. })
  418. },
  419. // 客户选择之后的回调
  420. corpCorpChange(value){
  421. for(let item of this.corpData) {
  422. if (item.cnName == value) {
  423. this.$set(this.form,'corpId',item.id)
  424. this.$set(this.form,'corpEnName',item.enName)
  425. this.$set(this.form,'corpCnName',item.cnName)
  426. }
  427. }
  428. },
  429. // 船公司选择之后的回调
  430. carrierCorpChange(value){
  431. for(let item of this.carrierData) {
  432. if (item.cnName == value) {
  433. this.$set(this.agreementPriceForm,'carrierId',item.id)
  434. this.$set(this.agreementPriceForm,'carrierEnName',item.enName)
  435. this.$set(this.agreementPriceForm,'carrierCnName',item.cnName)
  436. }
  437. }
  438. },
  439. // 结算周期类型
  440. settlementPeriodCorpChange(value) {
  441. for(let item of this.settlementPeriodData) {
  442. if (item.balanceCycleType == value) {
  443. this.$set(this.agreementPriceForm,'settlementPeriodType',item.balanceCycleType)
  444. this.$set(this.agreementPriceForm,'settlementPeriodName',item.balanceCycleName)
  445. this.$set(this.agreementPriceForm,'settlementPeriodDescr',item.balanceCycleDescribe)
  446. }
  447. }
  448. console.log(value)
  449. },
  450. // 获取详情数据
  451. agreementpriceDetailfun(id){
  452. this.pageLoading = true
  453. agreementpriceDetail(id).then(res => {
  454. this.form = res.data.data;
  455. this.pageLoading = false
  456. });
  457. },
  458. // 编辑按钮更改状态
  459. editHandle(){
  460. this.$set(this.detailData,'seeDisabled',false)
  461. // this.detailData.seeDisabled = false;
  462. },
  463. // 保存按钮
  464. editCustomer(){
  465. this.$refs.form.validate((valid)=>{
  466. if (valid) {
  467. this.saveLoading = true
  468. this.agreementpriceSubmitfun()
  469. }else {
  470. return false;
  471. }
  472. })
  473. },
  474. // 保存接口
  475. agreementpriceSubmitfun(){
  476. agreementpriceSubmit(this.form).then((res)=>{
  477. this.$message({
  478. type: "success",
  479. message: "操作成功!"
  480. });
  481. this.saveLoading = false
  482. this.agreementpriceDetailfun(res.data.data.id)
  483. this.detailData.seeDisabled = true;
  484. })
  485. },
  486. // 费用详细添加
  487. agreementPricepingCompanyAdd(){
  488. this.agreementPriceVisible = true
  489. this.agreementPriceForm = {}
  490. },
  491. // 费用详细编辑
  492. agreementPriceCompanyEdit(index,row){
  493. this.agreementPriceForm = JSON.parse(JSON.stringify(row))
  494. this.agreementPriceIndex = index
  495. this.agreementPriceVisible = true
  496. },
  497. // 费用详细删除
  498. agreementPriceCompanyDelete(index,row){
  499. this.form.agreementPriceItemsList.splice(index,1)
  500. },
  501. // 费用详细确认
  502. agreementPricecompanyConfirm(){
  503. if (this.agreementPriceIndex != null) {
  504. this.form.agreementPriceItemsList.splice(this.agreementPriceIndex,1,this.agreementPriceForm)
  505. }else {
  506. if (!this.form.agreementPriceItemsList) {
  507. this.form.agreementPriceItemsList = []
  508. }
  509. this.form.agreementPriceItemsList.push(this.agreementPriceForm)
  510. }
  511. this.agreementPriceForm = {}
  512. this.agreementPriceIndex = null
  513. this.agreementPriceVisible = false
  514. },
  515. // 费用详细关闭
  516. agreementPriceClose(done){
  517. done();
  518. // this.$confirm('确认关闭?')
  519. // .then(_ => {
  520. // done();
  521. // })
  522. // .catch(_ => {});
  523. },
  524. //返回列表
  525. backToList() {
  526. this.$emit('goBack')
  527. },
  528. // 更改表格颜色
  529. headerClassName(tab){
  530. //颜色间隔
  531. let back = ""
  532. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  533. if (tab.columnIndex % 2 === 0) {
  534. back = "back-one"
  535. } else if (tab.columnIndex % 2 === 1) {
  536. back = "back-two"
  537. }
  538. }
  539. return back;
  540. },
  541. }
  542. }
  543. </script>
  544. <style scoped>
  545. ::v-deep#out-table .back-one {
  546. background: #ecf5ff !important;
  547. }
  548. ::v-deep#out-table .back-two {
  549. background: #ecf5ff !important;
  550. }
  551. .borderless {
  552. height: 100%;
  553. box-sizing: border-box
  554. }
  555. .customer-main {
  556. //margin-top: 20px;
  557. //width: calc(100% - 140px);
  558. margin-bottom: 15px;
  559. }
  560. .margintop {
  561. margin-top: 10px;
  562. }
  563. ::v-deep.el-form-item {
  564. margin-bottom: 0;
  565. }
  566. .isShow {
  567. display: none;
  568. }
  569. </style>