receiptSettleDetailsPage.vue 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736
  1. <template>
  2. <div class="borderless">
  3. <div class="customer-head">
  4. <div class="customer-back">
  5. <el-button type="danger" style="border: none;background: none;color: red" icon="el-icon-arrow-left"
  6. @click="backToList">返回列表
  7. </el-button>
  8. <div class="upper_right_button">
  9. <el-button type="primary"
  10. size="small"
  11. :disabled="!form.id"
  12. @click="postMessage"
  13. >发送消息</el-button>
  14. <el-button type="warning"
  15. size="small"
  16. class="el-button--small-yh"
  17. :buttonLoading="buttonLoading"
  18. :disabled="!form.id"
  19. @click.stop="confirmSettlement"
  20. >{{financeDisabled?"收费":"撤销收费"}}
  21. </el-button>
  22. <el-button class="el-button--small-yh"
  23. type="primary"
  24. size="small"
  25. :buttonLoading="buttonLoading"
  26. :disabled="!financeDisabled"
  27. @click.stop="saveSettlement"
  28. >保存数据
  29. </el-button>
  30. </div>
  31. </div>
  32. </div>
  33. <div class="customer-main">
  34. <containerTitle title="基础信息"></containerTitle>
  35. <basic-container>
  36. <avue-form class="trading-form" ref="form" v-model="form" :option="option">
  37. <template slot="corpId">
  38. <crop-select
  39. v-model="form.corpId"
  40. corpType="KG"
  41. :disabled="!financeDisabled"
  42. @getCorpData="returnBack"
  43. style="width: 100%"
  44. ></crop-select>
  45. </template>
  46. <template slot="accountNo">
  47. <el-select v-model="form.accountNo"
  48. placeholder="请选择"
  49. :disabled="!financeDisabled"
  50. @change="accountNoChange"
  51. clearable
  52. filterable>
  53. <el-option v-for="(item,index) in form.bankList"
  54. :key="index"
  55. :label="item.accountNo"
  56. :value="item.accountNo"
  57. >
  58. </el-option>
  59. </el-select>
  60. </template>
  61. <template slot="caseOverPayment">
  62. <el-input
  63. placeholder="请输入"
  64. clearable
  65. v-model="form.caseOverPayment"
  66. @change="caseOverPaymentChange"
  67. v-input-limit="2"
  68. :disabled="dataList.length == 0"
  69. ></el-input>
  70. </template>
  71. <template slot="remark">
  72. <el-input type="textarea"
  73. v-model="form.remark"
  74. size="small"
  75. rows="2"
  76. autocomplete="off"
  77. placeholder="">
  78. </el-input>
  79. </template>
  80. </avue-form>
  81. </basic-container>
  82. <containerTitle title="明细列表"></containerTitle>
  83. <basic-container>
  84. <avue-crud :option="itemsOption"
  85. :data="dataList"
  86. ref="crud"
  87. v-model="itemsForm"
  88. :page.sync="page"
  89. @search-reset="searchReset"
  90. @row-update="rowUpdate"
  91. @selection-change="selectionChange"
  92. @current-change="currentChange"
  93. @size-change="sizeChange"
  94. @refresh-change="refreshChange">
  95. <template slot="menuLeft">
  96. <el-button type="primary"
  97. size="small"
  98. icon="el-icon-shopping-cart-2"
  99. :disabled="!financeDisabled"
  100. :buttonLoading="buttonLoading"
  101. @click="selectRecipt"
  102. >选择销售合同
  103. </el-button>
  104. </template>
  105. <template slot-scope="{ row }" slot="currency">
  106. <el-select v-if="row.$cellEdit" v-model="row.currency" size="small" placeholder="请选择 币别" clearable filterable>
  107. <el-option v-for="(item,index) in currencyDic" :key="index" :label="item.dictValue" :value="item.dictValue"></el-option>
  108. </el-select>
  109. <span v-else>{{ row.currency }}</span>
  110. </template>
  111. <template slot="thisAmount" slot-scope="{ row }">
  112. <span v-if="row.$cellEdit" class="required_fields">*</span>
  113. <el-input
  114. v-if="row.$cellEdit"
  115. v-model="row.thisAmount"
  116. style="width: 90%"
  117. placeholder="请输入"
  118. size="small"
  119. oninput='this.value=this.value.replace(/[^(\d.)]/g,"").replace(/^(\d+)\.(\d\d).*$/, "$1.$2")'
  120. ></el-input>
  121. <span v-else>{{ row.thisAmount }}</span>
  122. </template>
  123. <template slot-scope="scope" slot="menu">
  124. <el-button
  125. type="text"
  126. size="small"
  127. icon="el-icon-edit"
  128. :disabled="!financeDisabled"
  129. @click.stop="rowCell(scope.row,scope.index)"
  130. > {{ scope.row.$cellEdit ? '修改完成' : '修改' }}
  131. </el-button>
  132. <el-button
  133. type="text"
  134. size="small"
  135. icon="el-icon-delete"
  136. :disabled="!financeDisabled"
  137. @click.stop="rowDel(scope.row,scope.index)"
  138. >删除
  139. </el-button>
  140. </template>
  141. </avue-crud>
  142. </basic-container>
  143. <el-dialog
  144. title="导入销售"
  145. append-to-body
  146. class="el-dialogDeep"
  147. :visible.sync="billDetailDialog"
  148. width="60%"
  149. :close-on-click-modal="false"
  150. :destroy-on-close="true"
  151. :close-on-press-escape="false"
  152. top="10vh"
  153. v-dialog-drag>
  154. <bill-detail
  155. :params="params"
  156. :billType="billType"
  157. @closeFun="closeBillDetail"
  158. @importProMent="importProMent"
  159. >
  160. </bill-detail>
  161. </el-dialog>
  162. </div>
  163. <messagePost
  164. v-if="messageVisble"
  165. ref="messagePost"
  166. @closeDialog="closeDialog"
  167. ></messagePost>
  168. </div>
  169. </template>
  170. <script>
  171. import option from "./configuration/detailsPage.json";
  172. import { getDetail } from "@/api/financialManagement/financialManagement"
  173. import { getDetails,modify,cancelModify,saveOrEdit } from "@/api/financialManagement/paymentRequest";
  174. import billDetail from "@/components/bill/billDetailList";
  175. import _ from "lodash";
  176. import { getlistBankBy,deleteDetail } from "@/api/financialManagement/paymentRequest";
  177. import { contrastObj,contrastList } from "@/util/contrastData";
  178. import {getUserInfo} from "@/api/system/user";
  179. import {getCorpDetail} from "@/api/maintenance/overpayment";
  180. import messagePost from "@/components/messageSend/main"
  181. export default {
  182. name: "receiptDetailsPage",
  183. props: {
  184. detailData: {
  185. type: Object
  186. }
  187. },
  188. components:{
  189. billDetail,
  190. messagePost
  191. },
  192. data() {
  193. return {
  194. category: '',
  195. form: {},
  196. itemsForm:{},
  197. params:{},
  198. buttonLoading:false,
  199. itemsOption: option,
  200. option: {
  201. menuBtn: false,
  202. labelWidth: 100,
  203. column: [
  204. {
  205. label: '系统号',
  206. prop: 'sysNo',
  207. span: 8,
  208. disabled: true
  209. },{
  210. label: '合同号',
  211. prop: 'srcOrderno',
  212. span: 8,
  213. rules: [
  214. {
  215. required: false,
  216. message: ' ',
  217. trigger: 'blur'
  218. }
  219. ]
  220. }, {
  221. label: '往来单位',
  222. prop: 'corpId',
  223. sort:true,
  224. span: 8,
  225. rules: [
  226. {
  227. required: false,
  228. message: ' ',
  229. trigger: 'blur'
  230. }
  231. ]
  232. },
  233. {
  234. label: '银行账号',
  235. prop: 'accountNo',
  236. span: 8,
  237. rules: [
  238. {
  239. required: false,
  240. message: ' ',
  241. trigger: 'blur'
  242. }
  243. ]
  244. },
  245. {
  246. label: '开户银行',
  247. prop: 'accountBank',
  248. span: 8,
  249. rules: [
  250. {
  251. required: false,
  252. message: ' ',
  253. trigger: 'blur'
  254. }
  255. ]
  256. }, {
  257. label: '银行户头',
  258. prop: 'accountName',
  259. span: 8,
  260. rules: [
  261. {
  262. required: false,
  263. message: ' ',
  264. trigger: 'blur'
  265. }
  266. ]
  267. },
  268. {
  269. label: '人民币金额',
  270. prop: 'amount',
  271. span: 8,
  272. rules: [
  273. {
  274. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  275. message: ' ',
  276. trigger: 'blur'
  277. },
  278. {
  279. required: false,
  280. message: ' ',
  281. trigger: 'blur'
  282. }
  283. ]
  284. },
  285. {
  286. label: '外币金额',
  287. prop: 'foreignAmount',
  288. display: true,
  289. span: 8,
  290. rules: [
  291. {
  292. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  293. message: ' ',
  294. trigger: 'blur'
  295. }
  296. ]
  297. },
  298. {
  299. label: '使用溢付款',
  300. prop: 'caseOverPayment',
  301. display: false,
  302. span: 8,
  303. rules: [
  304. {
  305. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  306. message: ' ',
  307. trigger: 'blur'
  308. }
  309. ]
  310. },
  311. {
  312. label: '溢付款余额',
  313. prop: 'overPayment',
  314. display: false,
  315. disabled: true,
  316. span: 8,
  317. rules: [
  318. {
  319. pattern: /(^[1-9]([0-9]+)?(\.[0-9]{1,2})?$)|(^(0){1}$)|(^[0-9]\.[0-9]([0-9])?$)/,
  320. message: ' ',
  321. trigger: 'blur'
  322. }
  323. ]
  324. },
  325. {
  326. label: '收款日期',
  327. prop: 'time',
  328. span: 8,
  329. type:"date",
  330. rules: [
  331. {
  332. required: false,
  333. message: ' ',
  334. trigger: 'blur'
  335. }
  336. ]
  337. },
  338. {
  339. label: '制单人',
  340. prop: 'createUserName',
  341. span: 8,
  342. disabled:true,
  343. rules: [
  344. {
  345. required: false,
  346. message: ' ',
  347. trigger: 'blur'
  348. }
  349. ]
  350. }, {
  351. label: '制单日期',
  352. prop: 'createTime',
  353. span: 8,
  354. type:"date",
  355. disabled:true,
  356. rules: [
  357. {
  358. required: false,
  359. message: ' ',
  360. trigger: 'blur'
  361. }
  362. ]
  363. },
  364. {
  365. label: '备注',
  366. prop: 'remark',
  367. span:24,
  368. row:2,
  369. rules: [
  370. {
  371. required: false,
  372. message: ' ',
  373. trigger: 'blur'
  374. }
  375. ]
  376. },
  377. ],
  378. },
  379. id:'',
  380. dataList: [],
  381. currencyDic:[],
  382. page: {
  383. pageSize: 10,
  384. pagerCount: 5,
  385. total: 0,
  386. },
  387. billDetailDialog:false,
  388. financeDisabled:true,
  389. billType:"收费",
  390. // 明细本次金额总计
  391. allAmount: 0,
  392. // 消息弹窗
  393. messageVisble: false,
  394. //新旧数据对比
  395. oldForm:{},
  396. oldDataList:[],
  397. financeStatusDic:[{
  398. value: '正常',
  399. label: '正常'
  400. },
  401. {
  402. value: '停用',
  403. label: '停用'
  404. }],
  405. }
  406. },
  407. created() {
  408. // 人民币金额默认为0
  409. this.$set(this.form,"amount", 0)
  410. getUserInfo().then(res=>{
  411. this.category = res.data.data.billType
  412. if (this.category == 2) {
  413. this.$set(this.form,"overPayment", 0)
  414. this.$set(this.form,"caseOverPayment", 0)
  415. this.option.column.forEach(item => {
  416. if (item.prop == 'caseOverPayment' || item.prop == 'overPayment') {
  417. item.display = true
  418. }
  419. if (item.prop == 'foreignAmount') {
  420. item.display = false
  421. }
  422. })
  423. }
  424. })
  425. //币别
  426. this.getWorkDicts("currency").then(res =>{
  427. this.currencyDic = res.data.data
  428. })
  429. if (this.detailData.id) {
  430. this.buttonLoading = true
  431. this.id = this.detailData.id;//字符串转数字 超长用BigInt
  432. getDetail(this.id).then(res => {
  433. this.afterEcho(res.data.data)
  434. }).finally(()=>{
  435. this.buttonLoading = false
  436. })
  437. }else{
  438. this.form.financeStatus = "待结算"
  439. this.oldForm.financeStatus = "待结算"
  440. }
  441. },
  442. mounted() {
  443. },
  444. methods: {
  445. //选择客户
  446. returnBack(corpValue){
  447. this.corpId = corpValue.id
  448. getlistBankBy(corpValue.id).then(res =>{
  449. this.$set(this.form,"bankList",res.data)
  450. })
  451. // 溢付款余额获取
  452. if (this.category == 2) {
  453. getCorpDetail({corpId:corpValue.id}).then(res => {
  454. this.form.overPayment = res.data.data? res.data.data.balanceOverpaymen: 0
  455. })
  456. }
  457. },
  458. //选择卡号
  459. accountNoChange(value){
  460. this.form.bankList.forEach(item =>{
  461. if(item.accountNo == value){
  462. this.$set(this.form,"accountBank",item.accountBank)
  463. this.$set(this.form,"accountName",item.accountName)
  464. }
  465. })
  466. },
  467. selectRecipt(){
  468. if(!this.form.corpId){
  469. this.$message.warning("请先选择客户!")
  470. return
  471. }
  472. this.params = {
  473. corpId: this.form.corpId
  474. }
  475. this.billDetailDialog = true;
  476. },
  477. closeBillDetail(){
  478. this.billDetailDialog = false;
  479. },
  480. importProMent(list){
  481. list.forEach((item,index) =>{
  482. item.accId = item.id;
  483. item.srcOrderno = item.accSysNo
  484. item.billNo = item.srcBillNo
  485. delete item.id;
  486. this.$refs.crud.rowCellAdd(item);
  487. })
  488. //明细列表所有合同号 去重 加, 为主表合同号
  489. this.$set(this.form,'srcOrderno',Array.from(new Set(this.dataList.map(item =>{ return item.srcOrderno}))).join(','))
  490. this.billDetailDialog = false;
  491. },
  492. rowUpdate(row, index, done) {
  493. done(row);
  494. },
  495. rowCell(row,index){
  496. // row.$cellEdit = !row.$cellEdit
  497. this.$refs.crud.rowCell(row, index)
  498. },
  499. rowDel(row,index){
  500. if (row.id) {
  501. deleteDetail({ids: row.id}).then(res => {
  502. this.$message({
  503. type: "success",
  504. message: "操作成功!"
  505. });
  506. this.dataList.splice(index, 1);
  507. })
  508. } else {
  509. this.dataList.splice(index, 1);
  510. }
  511. },
  512. searchReset() {
  513. console.log('1')
  514. },
  515. selectionChange() {
  516. console.log('1')
  517. },
  518. currentChange() {
  519. console.log('1')
  520. },
  521. sizeChange() {
  522. console.log('1')
  523. },
  524. refreshChange() {
  525. console.log('1')
  526. },
  527. confirmSettlement(status){
  528. if (!this.form.corpId) return this.$message.error('往来单位不能为空')
  529. this.$refs["form"].validate((valid,done) => {
  530. done();
  531. if(valid && this.verificationData()){
  532. this.$confirm("是否确认收费?", "提示", {
  533. confirmButtonText: "确认",
  534. cancelButtonText: "取消",
  535. type: "warning",
  536. }).then(()=>{
  537. for (let i = 0; i < this.dataList.length; i++) {
  538. if (this.dataList[i].thisAmount == null || this.dataList[i].thisAmount == 0 ) {
  539. return this.$message.error(`第${i + 1}行的本次金额不能为空`);
  540. }
  541. }
  542. this.buttonLoading = true
  543. this.form.billNo = this.dataList.map(item =>{return item.billNo}).join(",")
  544. if (this.category == 2 && this.financeDisabled) {
  545. this.allAmount = 0;
  546. this.form.amount = this.form.amount? this.form.amount: 0
  547. this.dataList.forEach(e => {
  548. this.allAmount = Number(this.allAmount) + Number(e.thisAmount)
  549. })
  550. if (this.allAmount == 0 && this.form.amount == 0) {
  551. return this.$message.error('人民币金额不能为空')
  552. } else if (Number(this.allAmount) > 0 && (Number(this.form.amount) > Number(this.allAmount))) {
  553. this.form.caseOverPayment = 0;
  554. } else if (Number(this.allAmount) > 0 && (Number(this.form.amount) < Number(this.allAmount))) {
  555. this.form.caseOverPayment = Number(this.allAmount) - Number(this.form.amount)
  556. if (Number(this.form.caseOverPayment) > Number(this.form.overPayment)) {
  557. return this.$message.error('溢付款余额不足,无法收费')
  558. }
  559. }
  560. }
  561. const params = {
  562. ...this.form,
  563. billType:"收费",
  564. itemsList:this.dataList
  565. }
  566. if(this.financeDisabled){
  567. modify(params).then(res =>{
  568. this.$message.success("操作成功!")
  569. this.afterEcho(res.data.data)
  570. }).finally(()=>{
  571. this.buttonLoading = false
  572. })
  573. }else{
  574. cancelModify(params).then(res =>{
  575. this.$message.success("操作成功!")
  576. this.afterEcho(res.data.data)
  577. }).finally(()=>{
  578. this.buttonLoading = false
  579. })
  580. }
  581. })
  582. if(status === true){
  583. this.$emit("goBack");
  584. }
  585. }
  586. })
  587. },
  588. saveSettlement(){
  589. this.$refs["form"].validate((valid,done) => {
  590. done();
  591. if(valid){
  592. for (let i = 0; i < this.dataList.length; i++) {
  593. if (this.dataList[i].thisAmount === (null || "")) {
  594. return this.$message.error(`第${i + 1}行的本次金额不能为空`);
  595. }
  596. }
  597. this.buttonLoading = true
  598. this.form.billNo = this.dataList.map(item =>{return item.billNo}).join(",")
  599. const params = {
  600. ...this.form,
  601. billType:"收费",
  602. itemsList:this.dataList
  603. }
  604. saveOrEdit(params).then(res=>{
  605. this.$message.success("操作成功!")
  606. this.afterEcho(res.data.data)
  607. }).finally(()=>{
  608. this.buttonLoading = false
  609. })
  610. }})
  611. },
  612. async afterEcho(data){
  613. this.form = data;
  614. // 溢付款余额获取
  615. if (this.category == 2) {
  616. await getCorpDetail({corpId: this.form.corpId}).then(res => {
  617. if (Number(this.form.overPayment) != (res.data.data? res.data.data.balanceOverpaymen: '0.00')) {
  618. this.form.overPayment = res.data.data? res.data.data.balanceOverpaymen: '0.00'
  619. }
  620. })
  621. }
  622. this.oldForm = Object.assign({},this.form);
  623. this.financeDisabled = this.form.financeStatus === "待结算"?true:false;
  624. if(this.financeDisabled){
  625. this.option.column.forEach(item =>{
  626. if( item.prop === "remark"){
  627. this.$set(item,"disabled",false)
  628. }else if( item.prop === "createUserName" || item.prop === "createTime" || item.prop === "sysNo" || item.prop === "overPayment"){
  629. this.$set(item,"disabled",true)
  630. }else{
  631. this.$set(item,"disabled",false)
  632. }
  633. })
  634. }
  635. if(this.financeDisabled === false){
  636. this.option.column.forEach(item =>{
  637. if( item.prop === "remark"){
  638. this.$set(item,"disabled",false)
  639. }else if( item.prop === "createUserName" || item.prop === "createTime" || item.prop === "sysNo"){
  640. this.$set(item,"disabled",true)
  641. }else{
  642. this.$set(item,"disabled",true)
  643. }
  644. })
  645. }
  646. if(data.itemsList){
  647. this.dataList = data.itemsList
  648. this.oldDataList = this.deepClone(data.itemsList)
  649. }
  650. },
  651. verificationData(){
  652. if(contrastObj(this.form,this.oldForm) || contrastList(this.dataList,this.oldDataList)
  653. ){
  654. this.$confirm("数据发生变化,请先提交保存!", "提示", {
  655. confirmButtonText: "保存",
  656. cancelButtonText: "取消",
  657. type: "warning",
  658. }).then(() => {
  659. this.saveSettlement()
  660. }).catch(()=>{
  661. return false
  662. })
  663. }else{
  664. return true
  665. }
  666. },
  667. backToList(){
  668. if(contrastObj(this.form,this.oldForm) || contrastList(this.dataList,this.oldDataList)
  669. ){
  670. this.$confirm("是否保存当前页面?", "提示", {
  671. confirmButtonText: "保存",
  672. cancelButtonText: "取消",
  673. type: "warning",
  674. }).then(() => {
  675. this.saveSettlement()
  676. }).catch(()=>{
  677. this.$emit("goBack");
  678. })
  679. }else{
  680. this.$emit("goBack");
  681. }
  682. },
  683. // 溢付款更改时
  684. caseOverPaymentChange() {
  685. if (!this.form.caseOverPayment) this.form.caseOverPayment = 0;
  686. if (Number(this.form.caseOverPayment) > Number(this.form.overPayment)) {
  687. this.form.caseOverPayment = 0;
  688. return this.$message.error('本次使用的溢付款不能超过总溢付款')
  689. }
  690. },
  691. // 发送消息
  692. postMessage() {
  693. this.messageVisble = true
  694. this.$nextTick(() => {
  695. this.$refs.messagePost.init()
  696. })
  697. },
  698. closeDialog() {
  699. this.messageVisble = false
  700. },
  701. }
  702. }
  703. </script>
  704. <style lang="scss" scoped>
  705. ::v-deep .el-form-item {
  706. margin-bottom: 0;
  707. }
  708. .trading-form ::v-deep .el-form-item {
  709. margin-bottom: 8px !important;
  710. }
  711. .required_fields{
  712. color: #F56C6C;
  713. display:inline-block;
  714. width: 7%
  715. }
  716. .upper_right_button{
  717. display: flex;
  718. position: fixed;
  719. right: 12px;
  720. top: 47px;
  721. }
  722. </style>