feesTemplateItems.vue 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654
  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. <el-select v-if="item.type == 'select'" v-model="form[item.prop]" :placeholder="'请选择' + item.label" clearable
  29. filterable style="width: 100%" size="small"
  30. :disabled="item.disabled || detailData.seeDisabled">
  31. <el-option v-for="(ite, inde) in item.dicData" :key="inde" :label="ite.label"
  32. :value="ite.value"></el-option>
  33. </el-select>
  34. <el-input type="textarea" v-else-if="item.type === 'textarea'" v-model.trim="form[item.prop]" size="small"
  35. autocomplete="off" :disabled="item.disabled || detailData.seeDisabled" :placeholder="'请输入' + item.label"></el-input>
  36. <el-input v-else type="age" style="width: 100%;" v-model.trim="form[item.prop]" size="small" autocomplete="off"
  37. :disabled="item.disabled || detailData.seeDisabled" clearable :placeholder="'请输入' + item.label"></el-input>
  38. </el-form-item>
  39. </el-col>
  40. </el-row>
  41. </basic-container>
  42. </el-form>
  43. </div>
  44. <div class="customer-main margintop">
  45. <containerTitle title="费用详细"></containerTitle>
  46. <basic-container>
  47. <div style="margin-bottom: 10px">
  48. <el-button type="primary"
  49. size="small"
  50. :disabled="detailData.seeDisabled"
  51. @click="feestemplatepingCompanyAdd">新增数据
  52. </el-button>
  53. </div>
  54. <el-table
  55. stripe
  56. :data="form.feesTemplateItemsList"
  57. id="out-table"
  58. :header-cell-class-name="headerClassName"
  59. style="width: 100%">
  60. <el-table-column
  61. prop="curCode"
  62. label="客户">
  63. </el-table-column>
  64. <el-table-column
  65. prop="curCode"
  66. label="客户英文名称">
  67. </el-table-column>
  68. <el-table-column
  69. prop="curCode"
  70. label="费用编码">
  71. </el-table-column>
  72. <el-table-column
  73. prop="feeCnName"
  74. label="费用">
  75. </el-table-column>
  76. <el-table-column
  77. prop="curCode"
  78. label="费用英文名称">
  79. </el-table-column>
  80. <el-table-column
  81. prop="quantityRule"
  82. label="数量规则">
  83. </el-table-column>
  84. <el-table-column
  85. prop="quantity"
  86. label="数量">
  87. </el-table-column>
  88. <el-table-column
  89. prop="price"
  90. label="单价">
  91. </el-table-column>
  92. <el-table-column
  93. prop="unitNo"
  94. label="计量单位">
  95. </el-table-column>
  96. <el-table-column
  97. prop="curCode"
  98. label="币别">
  99. </el-table-column>
  100. <el-table-column
  101. prop="remarks"
  102. label="备注">
  103. </el-table-column>
  104. <el-table-column label="操作">
  105. <template slot-scope="scope">
  106. <el-button
  107. type="text"
  108. size="small"
  109. :disabled="detailData.seeDisabled"
  110. @click="feestemplateCompanyEdit(scope.$index, scope.row)">编辑</el-button>
  111. <el-button
  112. size="small"
  113. type="text"
  114. :disabled="detailData.seeDisabled"
  115. @click="feestemplateCompanyDelete(scope.$index, scope.row)">删除</el-button>
  116. </template>
  117. </el-table-column>
  118. </el-table>
  119. </basic-container>
  120. </div>
  121. <!--费用详细添加弹窗-->
  122. <el-dialog
  123. title="费用详细"
  124. :visible.sync="feestemplateVisible"
  125. width="60%"
  126. append-to-body
  127. :destroy-on-close="true"
  128. :modal-append-to-body="false"
  129. :before-close="feestemplateClose">
  130. <div>
  131. <el-form :model="feestemplateForm" ref="feestemplateForm" label-width="100px" class="demo-ruleForm">
  132. <el-row>
  133. <el-col v-for="(item, index) in feestemplateData.column" :key="index" :span="item.span ? item.span : 12"
  134. :class="{ isShow: item.display }" >
  135. <el-form-item :label="item.label" :prop="item.prop" :rules="item.rules">
  136. <div v-if="item.prop == 'corpId'">
  137. <search-query ref="SearchQuery"
  138. :datalist="corpData"
  139. :selectValue="feestemplateForm[item.prop]"
  140. title="客户"
  141. :filterable="true"
  142. :clearable="true"
  143. :remote="true"
  144. :forParameter="{key:'id',label:'cnName',value:'id'}"
  145. @remoteMethod="getBcorpsListfun" @corpChange="corpCorpChange" >
  146. <bcorps></bcorps>
  147. </search-query>
  148. </div>
  149. <div v-else-if="item.prop == 'feeId'">
  150. <search-query ref="SearchQuery"
  151. :datalist="feeData"
  152. :selectValue="feestemplateForm[item.prop]"
  153. title="费用"
  154. :filterable="true"
  155. :clearable="true"
  156. :remote="true"
  157. :forParameter="{key:'id',label:'cnName',value:'id'}"
  158. @remoteMethod="bfeesListfun" @corpChange="feeCorpChange" >
  159. <bfeesdefine></bfeesdefine>
  160. </search-query>
  161. </div>
  162. <div v-else-if="item.prop == 'curCode'">
  163. <search-query ref="SearchQuery"
  164. :datalist="curCodeData"
  165. :selectValue="feestemplateForm[item.prop]"
  166. title="币别"
  167. :filterable="true"
  168. :clearable="true"
  169. :remote="true"
  170. :forParameter="{key:'id',label:'code',value:'code'}"
  171. @remoteMethod="getRateListfun" @corpChange="curCodeCorpChange" >
  172. <bfeesdefine></bfeesdefine>
  173. </search-query>
  174. </div>
  175. <div v-else-if="item.prop == 'unitNo'">
  176. <search-query ref="SearchQuery"
  177. :datalist="unitNoData"
  178. :selectValue="feestemplateForm[item.prop]"
  179. title="计量单位"
  180. :filterable="true"
  181. :clearable="true"
  182. :remote="true"
  183. :forParameter="{key:'id',label:'code',value:'code'}"
  184. @remoteMethod="getBunitsListfun" @corpChange="unitNoCorpChange" >
  185. <bunits></bunits>
  186. </search-query>
  187. </div>
  188. <el-input type="textarea" v-else-if="item.type === 'textarea'" v-model.trim="feestemplateForm[item.prop]" size="small"
  189. autocomplete="off" :disabled="item.disabled" :placeholder="'请输入' + item.label"></el-input>
  190. <el-input v-else type="age" style="width: 100%;" v-model.trim="feestemplateForm[item.prop]" size="small" autocomplete="off"
  191. :disabled="item.disabled" clearable :placeholder="'请输入' + item.label"></el-input>
  192. </el-form-item>
  193. </el-col>
  194. </el-row>
  195. </el-form>
  196. </div>
  197. <span slot="footer" class="dialog-footer">
  198. <el-button @click="feestemplateVisible = false;">取 消</el-button>
  199. <el-button type="primary" @click="feestemplatecompanyConfirm">确 定</el-button>
  200. </span>
  201. </el-dialog>
  202. </div>
  203. </template>
  204. <script>
  205. import {losbfeestemplateDetail, losbfeestemplateSubmit} from "@/api/iosBasicData/losbfeestemplate";
  206. import {bfeesList} from "@/api/iosBasicData/bfees";
  207. import {getBcorpsList} from "@/api/iosBasicData/bcorps";
  208. import { getRateList } from "@/api/iosBasicData/rateManagement";
  209. import {getBunitsList} from "@/api/iosBasicData/bunits";
  210. import SearchQuery from '@/components/iosbasic-data/searchquery.vue'
  211. import bcorps from "@/views/iosBasicData/bcorps/index.vue";
  212. import bfeesdefine from "@/views/iosBasicData/bfeesdefine/index.vue";
  213. import bbusinesstype from "@/views/iosBasicData/bbusinesstype/index.vue";
  214. import bunits from "@/views/iosBasicData/bunits/index.vue";
  215. export default {
  216. components: {SearchQuery,bcorps,bfeesdefine,bbusinesstype,bunits},
  217. props:{
  218. detailData: {
  219. type: Object
  220. }
  221. },
  222. data(){
  223. return {
  224. pageLoading:false,
  225. saveLoading:false,
  226. // 费用详细弹窗
  227. feestemplateVisible:false,
  228. // 费用详细弹窗绑定的数据
  229. feestemplateForm:{},
  230. feestemplateIndex:null,
  231. // 客户请求数据
  232. corpData:[],
  233. // 费用请求数据
  234. feeData:[],
  235. // 币别请求数据
  236. curCodeData:[],
  237. // 计算属性数据
  238. unitNoData:[],
  239. // 获取到的数据
  240. form:{
  241. isShared:0,
  242. status:0,
  243. feesTemplateItemsList:[]
  244. },
  245. // 基础资料数据
  246. basicData:{
  247. column:[
  248. // {
  249. // label: "业务类型",
  250. // prop: "businessTypeId",
  251. // rules: [{
  252. // required: true,
  253. // message: "",
  254. // trigger: "blur"
  255. // }]
  256. // },
  257. // {
  258. // label: "业务类型",
  259. // prop: "businessTypeCnName",
  260. // rules: [{
  261. // required: true,
  262. // message: "",
  263. // trigger: "blur"
  264. // }]
  265. // },
  266. // {
  267. // label: "业务类型英文",
  268. // prop: "businessTypeEnName",
  269. // disabled:true,
  270. // rules: [{
  271. // required: true,
  272. // message: "请输入业务类型英文名称",
  273. // trigger: "blur"
  274. // }]
  275. // },
  276. {
  277. label: "模版编号",
  278. prop: "code",
  279. search: true,
  280. rules: [{
  281. required: true,
  282. message: "请输入模版编号",
  283. trigger: "blur"
  284. }]
  285. },
  286. {
  287. label: "模版中文名称",
  288. prop: "cnName",
  289. rules: [{
  290. required: true,
  291. message: "请输入模版中文名称",
  292. trigger: "blur"
  293. }]
  294. },
  295. {
  296. label: "模版英文名称",
  297. prop: "enName",
  298. rules: [{
  299. required: true,
  300. message: "请输入模版英文名称",
  301. trigger: "blur"
  302. }]
  303. },
  304. {
  305. label: "收付",
  306. prop: "dc",
  307. type:'select',
  308. dicData:[{
  309. label:'收',
  310. value:'D'
  311. },{
  312. label:'付',
  313. value:'C'
  314. }],
  315. },
  316. {
  317. label: "是否公开共享",
  318. prop: "isShared",
  319. width:100,
  320. type:'select',
  321. dicData:[{
  322. label:'否',
  323. value:0
  324. },{
  325. label:'是',
  326. value:1
  327. }],
  328. },
  329. {
  330. label: "状态",
  331. prop: "status",
  332. type:'select',
  333. dicData:[{
  334. label:'启用',
  335. value:0
  336. },{
  337. label:'停用',
  338. value:1
  339. }],
  340. },
  341. {
  342. label: "备注",
  343. prop: "remarks",
  344. span:24,
  345. type: 'textarea',
  346. minRows: 3,
  347. },
  348. ]
  349. },
  350. // 费用详细数据
  351. feestemplateData:{
  352. column:[
  353. {
  354. label: "客户",
  355. prop: "corpId",
  356. type:'select',
  357. rules: [{
  358. required: true,
  359. message: "",
  360. trigger: "blur"
  361. }]
  362. },
  363. {
  364. label: "客户英文名称",
  365. prop: "corpEnName",
  366. disabled:true,
  367. },
  368. {
  369. label: "费用",
  370. prop: "feeId",
  371. rules: [{
  372. required: true,
  373. message: "",
  374. trigger: "blur"
  375. }]
  376. },
  377. {
  378. label: "费用编码",
  379. prop: "feeCode",
  380. disabled:true,
  381. },
  382. // {
  383. // label: "费用中文名称",
  384. // prop: "feeCnName",
  385. // disabled:true,
  386. // },
  387. {
  388. label: "费用英文名称",
  389. prop: "feeEnName",
  390. disabled:true,
  391. },
  392. {
  393. label: "数量规则",
  394. prop: "quantityRule",
  395. rules: [{
  396. required: true,
  397. message: "请输入数量规则,用于根据单位自动计算数量",
  398. trigger: "blur"
  399. }]
  400. },
  401. {
  402. label: "数量",
  403. prop: "quantity",
  404. rules: [{
  405. required: true,
  406. // message: "请输入数量",
  407. trigger: "blur"
  408. },{
  409. pattern:/-?[1-9]\d*/,
  410. // message:"请输入数字",
  411. trigger:'blur'
  412. }]
  413. },
  414. {
  415. label: "单价",
  416. prop: "price",
  417. rules: [{
  418. required: true,
  419. // message: "请输入单价",
  420. trigger: "blur"
  421. },{
  422. // pattern:/[1-9]\d*.\d*|0\.\d*[1-9]\d*/,
  423. pattern:/-?[1-9]\d*/,
  424. // message:"请输入数字",
  425. trigger:'blur'
  426. }]
  427. },
  428. {
  429. label: "计量单位",
  430. prop: "unitNo",
  431. rules: [{
  432. required: true,
  433. // message: "请输入计量单位",
  434. trigger: "blur"
  435. }]
  436. },
  437. {
  438. label: "币别",
  439. prop: "curCode",
  440. rules: [{
  441. required: true,
  442. // message: "请输入币别",
  443. trigger: "blur"
  444. }]
  445. },
  446. {
  447. label: "备注",
  448. prop: "remarks",
  449. span:24,
  450. type: 'textarea',
  451. minRows: 3,
  452. },
  453. ]
  454. },
  455. }
  456. },
  457. created() {
  458. this.getBcorpsListfun()
  459. this.bfeesListfun()
  460. this.getRateListfun()
  461. this.getBunitsListfun()
  462. },
  463. methods:{
  464. // 获取客户数据
  465. getBcorpsListfun(cnName){
  466. getBcorpsList(1,10,{cnName}).then(res=>{
  467. this.corpData = res.data.data.records
  468. })
  469. },
  470. bfeesListfun(cnName){
  471. bfeesList(1,10,{cnName}).then(res=>{
  472. this.feeData = res.data.data.records
  473. })
  474. },
  475. // 获取币别数据
  476. getRateListfun(cnName){
  477. getRateList({
  478. current:1,
  479. size: 10,
  480. cnName
  481. }).then(res=>{
  482. this.curCodeData = res.data.data.records
  483. })
  484. },
  485. // 获取计算属性
  486. getBunitsListfun(){
  487. getBunitsList(1,10,).then(res=>{
  488. this.unitNoData = res.data.data.records
  489. })
  490. },
  491. // 客户选择之后的回调
  492. corpCorpChange(value){
  493. for(let item of this.corpData) {
  494. if (item.id == value) {
  495. this.$set(this.feestemplateForm,'corpId',item.id)
  496. this.$set(this.feestemplateForm,'corpEnName',item.enName)
  497. this.$set(this.feestemplateForm,'corpCnName',item.cnName)
  498. }
  499. }
  500. },
  501. // 费用选择之后的回调
  502. feeCorpChange(value){
  503. for(let item of this.feeData) {
  504. if (item.id == value) {
  505. this.$set(this.feestemplateForm,'feeId',item.id)
  506. this.$set(this.feestemplateForm,'feeCode',item.code)
  507. this.$set(this.feestemplateForm,'feeEnName',item.enName)
  508. this.$set(this.feestemplateForm,'feeCnName',item.cnName)
  509. }
  510. }
  511. },
  512. // 币别选择之后的回调
  513. curCodeCorpChange(value) {
  514. this.$set(this.feestemplateForm,'curCode',value)
  515. },
  516. // 计算属性选择之后
  517. unitNoCorpChange(value) {
  518. for(let item of this.unitNoData) {
  519. if (item.code == value) {
  520. this.$set(this.feestemplateForm,'unitId',item.id)
  521. this.$set(this.feestemplateForm,'unitNo',item.code)
  522. }
  523. }
  524. },
  525. // 获取详情数据
  526. losbfeestemplateDetailfun(id){
  527. this.pageLoading = true
  528. losbfeestemplateDetail(id).then(res => {
  529. this.form = res.data.data;
  530. this.pageLoading = false
  531. });
  532. },
  533. // 编辑按钮更改状态
  534. editHandle(){
  535. this.detailData.seeDisabled = false;
  536. },
  537. // 保存按钮
  538. editCustomer(){
  539. this.$refs.form.validate((valid)=>{
  540. if (valid) {
  541. this.saveLoading = true
  542. this.losbfeestemplateSubmitfun()
  543. }else {
  544. return false;
  545. }
  546. })
  547. },
  548. // 保存接口
  549. losbfeestemplateSubmitfun(){
  550. losbfeestemplateSubmit(this.form).then((res)=>{
  551. this.$message({
  552. type: "success",
  553. message: "操作成功!"
  554. });
  555. this.saveLoading = false
  556. this.losbfeestemplateDetailfun(res.data.data.id)
  557. this.detailData.seeDisabled = true;
  558. })
  559. },
  560. // 费用详细添加
  561. feestemplatepingCompanyAdd(){
  562. this.feestemplateVisible = true
  563. },
  564. // 费用详细编辑
  565. feestemplateCompanyEdit(index,row){
  566. this.feestemplateForm = JSON.parse(JSON.stringify(row))
  567. this.feestemplateIndex = index
  568. this.feestemplateVisible = true
  569. },
  570. // 费用详细删除
  571. feestemplateCompanyDelete(index,row){
  572. this.form.feesTemplateItemsList.splice(index,1)
  573. },
  574. // 费用详细确认
  575. feestemplatecompanyConfirm(){
  576. if (this.feestemplateIndex != null) {
  577. this.form.feesTemplateItemsList.splice(this.feestemplateIndex,1,this.feestemplateForm)
  578. }else {
  579. if (!this.form.feesTemplateItemsList) {
  580. this.form.feesTemplateItemsList = []
  581. }
  582. this.form.feesTemplateItemsList.push(this.feestemplateForm)
  583. }
  584. this.feestemplateForm = {}
  585. this.feestemplateIndex = null
  586. this.feestemplateVisible = false
  587. },
  588. // 费用详细关闭
  589. feestemplateClose(done){
  590. this.$confirm('确认关闭?')
  591. .then(_ => {
  592. done();
  593. })
  594. .catch(_ => {});
  595. },
  596. //返回列表
  597. backToList() {
  598. this.$emit('goBack')
  599. },
  600. // 更改表格颜色
  601. headerClassName(tab){
  602. //颜色间隔
  603. let back = ""
  604. if (tab.columnIndex >= 0 && tab.column.level === 1) {
  605. if (tab.columnIndex % 2 === 0) {
  606. back = "back-one"
  607. } else if (tab.columnIndex % 2 === 1) {
  608. back = "back-two"
  609. }
  610. }
  611. return back;
  612. },
  613. }
  614. }
  615. </script>
  616. <style scoped>
  617. ::v-deep#out-table .back-one {
  618. background: #ecf5ff !important;
  619. }
  620. ::v-deep#out-table .back-two {
  621. background: #ecf5ff !important;
  622. }
  623. .borderless {
  624. height: 100%;
  625. box-sizing: border-box
  626. }
  627. .customer-main {
  628. //margin-top: 20px;
  629. //width: calc(100% - 140px);
  630. margin-bottom: 15px;
  631. }
  632. .margintop {
  633. margin-top: 10px;
  634. }
  635. ::v-deep.el-form-item {
  636. margin-bottom: 0;
  637. }
  638. .isShow {
  639. display: none;
  640. }
  641. </style>