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.

399 lines
12 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

<template>
<div>
<!-- 编辑-->
<xy-dialog :is-show.sync="isShowEditor" title="合同编辑" type="form" :form="detail" :rules="rules" @submit="editor" ref="addContract">
<template v-slot:name>
<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-input placeholder="请填写项目名称" v-model="detail.name" style="width: 300px;"/>
</div>
</div>
</template>
<template v-slot:type>
<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="detail.type" style="width: 300px;">
<el-option v-for="item in [{label:'服务',value:1},{label:'货品',value:2},{label:'工程',value:3}]" :label="item.label" :value="item.value"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:methods>
<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="detail.methods" style="width: 300px;">
<el-option v-for="item in purchaseType" :label="item.value" :value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:modality>
<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="detail.modality" style="width: 300px;">
<el-option v-for="item in purchaseWay" :label="item.value" :value="item.id"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:price>
<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 placeholder="请填写合同预算价" v-model="detail.price" style="width: 300px;"/>
</div>
</div>
</template>
<template v-slot:money>
<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 placeholder="请填写合同金额" v-model="detail.money" style="width: 300px;"/>
</div>
</div>
</template>
<template v-slot:fundingChannels>
<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="detail.fundingChannels" style="width: 300px;">
<el-option v-for="item in moneyWay" :value="item.id" :label="item.value"></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:supply>
<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-input placeholder="请填写供应商" v-model="detail.supply" style="width: 300px;"/>
</div>
</div>
</template>
<template v-slot:carryDepartment>
<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-input placeholder="请填写执行部门" v-model="detail.carryDepartment" style="width: 300px;"/>
</div>
</div>
</template>
<template v-slot:isBudget>
<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-switch v-model="detail.isBudget"/>
</div>
</div>
</template>
<template v-if="detail.isBudget" v-slot:plan>
<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">
<div class="contract-add-plan" style="width: 300px;" @click="isShowPlan = true,getBudgets()">
<template v-if="detail.plan.length > 0">
<template v-for="item in detail.plan">
<Tag closable color="primary" @on-close="delPlan(item)">{{item.label}}</Tag>
</template>
</template>
<template v-else>
<div class="contract-add-plan-no-plan">请选择关联计划</div>
</template>
</div>
</div>
</div>
</template>
</xy-dialog>
<!-- 编辑中 预算计划 -->
<xy-dialog :is-show.sync="isShowPlan" title="预算计划" :width="640">
<template v-slot:normalContent>
<Input v-model="planSearch" search enter-button="搜 索" placeholder="搜索预算计划.." @on-search="getBudgets"/>
<xy-table :list="plans" :show-index="false" :table-item="planTable" :height="310" style="margin-top: 10px;" ref="editorPlanTable" @select="selectPlan">
<template v-slot:btns>
<el-table-column label="使用金额" header-align="center">
<template slot-scope="scope">
<Input :value="scope.row.useMoney ? scope.row.useMoney: scope.row.money" @input="(e)=>scope.row.useMoney = e"/>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="planTotal" show-elevator @on-change="planPageChange"/>
</div>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="isShowPlan = false">确定</Button>
</template>
</xy-dialog>
</div>
</template>
<script>
import {editorContract,detailContract} from "@/api/contract/contract";
import {getBudget} from "@/api/budget/budget";
import {Message} from 'element-ui'
export default {
props:{
purchaseType:Array,
moneyWay:Array,
purchaseWay:Array
},
data() {
var planPass = (rule, value, callback) => {
if(this.detail.isBudget){
if(this.detail.plan.length === 0){
return callback(new Error('必选'))
}else{
callback()
}
}else{
callback()
}
}
return {
contrantId:'',
isShowEditor:false,
isShowPlan:false,
detail:{},
rules:{
name:[
{required:true,message:"必填"}
],
type:[
{required:true,message:"必选"}
],
methods:[
{required:true,message:"必选"}
],
modality:[
{required:true,message:"必选"}
],
price:[
{required:true,message:"必填"}
],
money:[
{required:true,message:"必填"}
],
fundingChannels:[
{required:true,message:"必填"}
],
supply:[
{required:true,message:"必填"}
],
carryDepartment:[
{required:true,message:"必填"}
],
plan:[
{validator:planPass}
]
},
plans:[],
planSearch:'',
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'
}
],
planTotal:0,
}
},
methods: {
//选择计划
selectPlan(sel,row){
if(sel){
this.detail.plan = sel.map(item => {
return {
label:item.name,
value:{
plan_id:item.id,
use_money:item.useMoney ?? item.money,
new_money:item.money
}
}
})
}else{
this.detail.plan = []
}
},
delPlan(val){
this.detail.plan.map((item,index)=>{
if(item.value.plan_id === val.value.plan_id){
this.detail.plan.splice(index,1)
}
})
},
//获取预算计划
async getBudgets(){
let res = await getBudget({name:this.planSearch,page_size:10,page:this.plansPageIndex})
this.plans = res.data
this.planTotal = res.total
this.toggleSelection(this.detail.plan.map(item => {
return item.value.plan_id
}))
},
planPageChange(e){
this.plansPageIndex = e
this.getBudgets()
},
//默认选择计划
toggleSelection(plans) {
if (plans) {
this.plans.filter(plan => {
return plans.includes(plan.id)
}).map(row => {
this.$refs.editorPlanTable.toggleRowSelection(row)
})
} else {
this.$refs.editorPlanTable.clearSelection()
}
},
async getDetail(id){
let res = await detailContract({id:id})
this.contrantId = res.id
this.detail = {
name:res.name,
type:res.type,
methods:res.purchase_type_id,
modality:res.purchase_way_id,
fundingChannels:res.money_way_id,
price:res.plan_price,
money:res.money,
supply:res.supply,
carryDepartment:res.carry_department,
isBudget:res.is_plan === 1 ? true : false,
plan:res.plans.map(item=>{
return {
label:item.name,
value:{
plan_id:item.id,
use_money:item.useMoney ?? item.money,
new_money:item.money
}
}
})
}
},
editor(){
editorContract({
id:this.contrantId,
type:this.detail.type,
is_plan:this.detail.isBudget ? 1 : 0,
purchase_type_id:this.detail.methods,
purchase_way_id:this.detail.modality,
money_way_id:this.detail.fundingChannels,
plan_price:this.detail.price,
name:this.detail.name,
carry_department:this.detail.carryDepartment,
contract_plan_links:this.detail.plan.map(item=>{
return item.value
})
}).then(res=>{
this.isShowEditor = false
Message({
type:'success',
message:"操作成功"
})
this.$emit('success')
})
},
},
mounted() {
},
}
</script>
<style scoped lang="scss">
.contract-add-plan{
min-height: 30px;
border: 1px solid #dcdee2;
border-radius: 4px;
display: flex;
flex-wrap: wrap;
align-items: center;
align-content: center;
padding: 0 8px;
&-no-plan{
height: 30px;
line-height: 30px;
color: #CDD0D5;
}
}
.xy-table-item-label{
width: 140px;
}
.xy-table-item-price{
position: relative;
&::after{
position: absolute;
right: 0;
top: 0;
content:''
}
}
</style>