You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

370 lines
11 KiB

3 years ago
<template>
<div>
<!-- 付款登记-->
3 years ago
<xy-dialog title="付款登记" :is-show.sync="isShowPaymentRegistration" type="form" class="payment-registration" :form="paymentRegistrationForm" :rules="paymentRegistrationRules" @submit="submit" ref="paymentRegistration">
3 years ago
<template v-slot:extraFormTop>
<div class="payment-registration-row">
<div class="payment-registration-row-title">受款单位</div>
3 years ago
<div class="payment-registration-row-content">{{contract.supply}}</div>
3 years ago
</div>
<div class="payment-registration-row">
<div class="payment-registration-row-title">合同名称</div>
<div class="payment-registration-row-content">{{contract.name}}</div>
</div>
<div class="payment-registration-row">
<div class="payment-registration-row-title">合同金额</div>
3 years ago
<div class="payment-registration-row-content">{{priceFormat(contract.money)}} </div>
3 years ago
</div>
<div style="display: flex">
<div class="payment-registration-row">
<div class="payment-registration-row-title">已付金额</div>
<div class="payment-registration-row-content">{{totalMoney()}} </div>
</div>
<div class="payment-registration-row">
<div class="payment-registration-row-title">支付占比</div>
<div class="payment-registration-row-content">{{percentPay()}}%</div>
</div>
<div class="payment-registration-row">
<div class="payment-registration-row-title">已付笔数</div>
<div class="payment-registration-row-content">{{payment.length}}</div>
<div class="payment-registration-row-content" style="color: #ff0000;padding-left: 16px;cursor: pointer;">
<Poptip :transfer="true">
<div>点击查看列表</div>
<template v-slot:content>
<template v-if="payment&&payment.length>0">
<xy-table :height="200" :list="payment" :table-item="payTable">
<template v-slot:btns><p></p></template>
</xy-table>
</template>
<template v-else>
<div style="text-align: center">暂无已付笔数</div>
</template>
</template>
</Poptip>
</div>
</div>
</div>
</template>
<template v-slot:applyMoney>
3 years ago
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>申请付款金额
</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input clearable placeholder="请填写付款金额" v-model="paymentRegistrationForm.applyMoney" style="width: 300px;"/>
</div>
</div>
3 years ago
</template>
<template v-slot:deductionMoney>
3 years ago
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>本期扣款金额
</div>
<div class="xy-table-item-content xy-table-item-price">
<el-input clearable placeholder="请填写扣款金额" v-model="paymentRegistrationForm.deductionMoney" style="width: 300px;"/>
</div>
</div>
3 years ago
</template>
<template v-slot:type>
3 years ago
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>款项类型
</div>
<div class="xy-table-item-content">
<el-select placeholder="选择款项类型或直接填写其他类型"
v-model="paymentRegistrationForm.type"
style="width: 200px;"
filterable
allow-create
clearable>
<el-option
v-for="item in paymentType"
:key="item"
:label="item"
:value="item">
</el-option>
</el-select>
</div>
</div>
3 years ago
</template>
<template v-slot:isLast>
3 years ago
<div class="xy-table-item">
<div class="xy-table-item-label">
<span style="color: red;font-weight: 600;padding-right: 4px;">*</span>是否最后一笔
</div>
<div class="xy-table-item-content">
3 years ago
<el-switch v-model="paymentRegistrationForm.isLast" @change="toggleSelection"/>
3 years ago
</div>
</div>
3 years ago
</template>
3 years ago
<template v-slot:extraFormBottom v-if="paymentRegistrationForm.isLast">
3 years ago
<Input search enter-button=" " placeholder="搜索预算计划.." v-model="searchContent" @on-search="getBudgets"/>
<xy-table :list="plans" :show-index="false" :table-item="planTable" :height="310" style="margin-top: 10px;" ref="planTable" @select="selectPlan">
<template v-slot:btns>
<el-table-column label="使用金额" header-align="center">
<template slot-scope="scope">
3 years ago
<Input :value="scope.row.useMoney" @input="(e)=>scope.row.useMoney = e"/>
3 years ago
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="planTotal" show-elevator @on-change="pageChange"/>
</div>
</template>
</xy-dialog>
</div>
</template>
<script>
import {getparameter} from "@/api/system/dictionary"
import {getFundLog,addFundLog} from "@/api/paymentRegistration/fundLog"
import {getBudget} from "@/api/budget/budget";
import {detailContract} from "@/api/contract/contract";
import {Message} from "element-ui";
import {parseTime} from "@/utils";
export default {
data() {
return {
searchContent:"",
planTotal:0,
pageIndex:1,
//付款登记
plans:[],
contract:{},
payment:[],//合同关联的付款登记
payTable:[
{
label:'支付金额',
prop:'act_money',
sortable:false,
align:'right'
},
{
label:'时间',
prop:'created_at',
sortable:false,
width:120,
formatter:(t1,t2,value)=>{
return parseTime(new Date(value),'{y}-{m}-{d}')
}
}
],
3 years ago
paymentType:["进度款","结算款","质保金"],
3 years ago
isShowPaymentRegistration:false,
paymentRegistrationForm:{
applyMoney:"",
deductionMoney:"",
type:"",
3 years ago
isLast:false,
3 years ago
plan:[]
},
paymentRegistrationRules:{
applyMoney:[
3 years ago
{required:true,message:"必填"},
{pattern:/^\d+(\.\d+)?$/, message: '必须为数字'}
3 years ago
],
deductionMoney:[
3 years ago
{required:true,message:"必填"},
{pattern:/^\d+(\.\d+)?$/, message: '必须为数字'}
3 years ago
],
type:[
{required:true,message:"必选"}
]
},
planTable:[
{
sortable:false,
width:36,
type:'selection'
},
{
label:"分类",
prop:'type',
formatter:(cell,data,value)=>{
switch (value){
case 1:
return "部门预算"
break;
case 2:
return "水务计划"
break;
default:
return "未知"
}
}
},
{
label:"名称",
prop:'name',
align:'left'
},
{
label:"计划金额",
prop:'money',
align:'right'
}
],
}
},
methods: {
//翻页
pageChange(e){
this.pageIndex = e
this.getBudgets()
},
//合计金额
totalMoney(){
let total = 0.00
this.payment.map(item => {
total += Number(item.act_money)
})
return total.toFixed(2)
},
//支付占比
percentPay(){
let total = this.totalMoney()
3 years ago
return (total/this.contract.money)*100 || 0
3 years ago
},
//获取合同信息
async getContract(info){
this.contract = await detailContract({id:info.id})
this.paymentRegistrationForm.plan = this.contract.plans.map(item=>{
return {
plan_id:item.id,
3 years ago
use_money:item.useMoney,
3 years ago
new_money:item.money,
}
})
const res = await getFundLog({contract_id:this.contract.id})
this.payment = res.data
},
submit(){
3 years ago
let data = this.paymentRegistrationForm.isLast ? {
3 years ago
contract_id:this.contract.id,
apply_money:this.paymentRegistrationForm.applyMoney,
discount_money:this.paymentRegistrationForm.deductionMoney,
type:this.paymentRegistrationForm.type,
3 years ago
is_end:this.paymentRegistrationForm.isLast ? 1 : 0,
3 years ago
contract_plan_links:this.paymentRegistrationForm.plan
3 years ago
} : {
contract_id:this.contract.id,
apply_money:this.paymentRegistrationForm.applyMoney,
discount_money:this.paymentRegistrationForm.deductionMoney,
type:this.paymentRegistrationForm.type,
is_end:this.paymentRegistrationForm.isLast ? 1 : 0
}
addFundLog(data).then(res=>{
3 years ago
this.isShowPaymentRegistration = false
Message({
type:'success',
message:"操作成功"
})
3 years ago
this.$refs['paymentRegistration'].reset()
3 years ago
})
},
//计划
//获取预算计划
async getBudgets(){
let res = await getBudget({name:this.searchContent,page_size:10,page:this.pageIndex})
this.plans = res.data
this.planTotal = res.total
this.toggleSelection(this.paymentRegistrationForm.plan.map(item => {
return item.plan_id
}))
},
planPageChange(e){
this.plansPageIndex = e
this.getBudgets()
},
selectPlan(sel,row){
if(sel){
this.paymentRegistrationForm.plan = sel.map(item => {
return {
plan_id:item.id,
3 years ago
use_money:item.useMoney,
3 years ago
new_money:item.money
}
})
}else{
this.paymentRegistrationForm.plan = []
}
},
3 years ago
toggleSelection(e) {
if(!e){
return
}
let plans = this.paymentRegistrationForm.plan.map(item => {return item.plan_id})
3 years ago
if (plans) {
this.plans.filter(plan => {
return plans.includes(plan.id)
}).map(row => {
3 years ago
this.$nextTick(()=>{
this.$refs['planTable'].toggleRowSelection(row);
})
3 years ago
})
} else {
3 years ago
this.$refs['planTable'].clearSelection();
3 years ago
}
},
},
3 years ago
computed:{
priceFormat(){
return function (price){
return Number(price).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, '$1,')
}
}
},
3 years ago
async mounted() {
await this.getBudgets()
}
}
</script>
<style scoped lang="scss">
.payment-registration{
&-row{
display: flex;
padding: 6px 0;
&-title{
padding: 0 10px;
}
&-content{
}
}
}
3 years ago
.xy-table-item-label{
width: 140px;
}
.xy-table-item-price{
position: relative;
&::after{
z-index: 1;
position: absolute;
right: 0;
top: 0;
content:'(元)'
}
::v-deep .el-input__clear{
position: relative;
right: 30px;
z-index: 2;
}
}
3 years ago
</style>