liuxy 2 years ago
parent 01c2fb900a
commit a4e20724fb

@ -0,0 +1,747 @@
<template>
<div>
<el-steps :active="step" align-center>
<el-step title="选择预算计划">
</el-step>
<el-step title="新增预算支出事项">
</el-step>
<el-step title="新增成功">
</el-step>
</el-steps>
<div style="margin: 20px;" v-if="step==1">
<Input v-model="planSearch" search enter-button=" " placeholder="搜索预算计划.." @on-search="getBudgets" />
<xy-table :list="plans" :show-index="false" :table-item="planTable" :height="boxheight" style="margin-top: 10px;"
ref="editorPlanTable" row-key="id" border default-expand-all
:tree-props="{ children: 'notChildren', hasChildren: 'hasChildren' }" @select="selectPlan">
<template v-slot:btns>
<el-table-column label="使用金额(元)" header-align="center" width="130">
<template slot-scope="scope" v-if="scope.row.pid === 0">
<Input :value="scope.row.useMoney" @input="planInput($event,scope.row)" />
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex;justify-content: flex-end;">
<Page :total="planTotal" show-elevator @on-change="planPageChange" />
</div>
<div style="text-align: center;">
<el-button style="margin-top: 12px;" @click="nextStep"></el-button>
</div>
</div>
<div style="padding: 20px; margin: 20px;background-color: #fff;" v-if="step==2">
<el-form ref="form" :model="detail" label-width="180px">
<el-form-item label="项目名称">
<el-input clearable placeholder="请填写项目名称" @change="checkName" v-model="detail.name" style="width: 300px;" />
</el-form-item>
<el-form-item label="是否需要签订合同">
<el-switch v-model="detail.is_contract" active-text="" inactive-text="" :active-value="1"
:inactive-value="0" />
</el-form-item>
<el-form-item label="是否为简易流程">
<el-switch v-model="detail.is_simple" active-text="" inactive-text="" :active-value="1"
:inactive-value="0" />
<span style="flex: 1;text-align: right;">水电煤等费用付款</span>
</el-form-item>
<el-form-item label="承包商/供货商" v-if="detail.is_simple">
<el-input v-model="detail.supply" placeholder="请填写承包商/供货商" style="width: 300px;" />
</el-form-item>
<el-form-item label="项目类型" v-if="!detail.is_simple">
<el-select clearable 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>
</el-form-item>
<el-form-item label="采购形式" v-if="!detail.is_simple">
<el-select clearable 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>
</el-form-item>
<el-form-item label="采购方式" v-if="!detail.is_simple">
<el-select clearable 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>
</el-form-item>
<el-form-item label="采购预算价" v-if="!detail.is_simple">
<el-input clearable placeholder="请填写采购预算价" v-model="detail.price" style="width: 300px;" />
</el-form-item>
<el-form-item label="资金渠道" v-if="!detail.is_simple">
<el-select multiple clearable 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>
</el-form-item>
</el-form>
<div style="text-align: center;">
<el-button style="margin-top: 12px;" @click="nextStep"></el-button>
<el-button style="margin-top: 12px;" @click="nextStep"></el-button>
</div>
</div>
</div>
</template>
<script>
import {
getparameter
} from "@/api/system/dictionary";
import {
editorContract,
detailContract,
checkContractName,
getContract
} from '@/api/contract/contract'
import {
getBudget
} from "@/api/budget/budget";
import {
getInfo
} from '@/api/user.js'
import {
Message
} from 'element-ui'
import {
resetSelect
} from '@/utils'
export default {
data() {
var planPass = (rule, value, callback) => {
if (this.detail.isBudget) {
if (this.detail.plan.length === 0) {
return callback(new Error('必选'))
} else {
callback()
}
} else {
callback()
}
}
var supplyPass = (rule, value, callback) => {
if (this.detail.is_simple) {
if (value === '') {
callback(new Error('必填'))
} else {
callback()
}
} else {
callback()
}
}
var typePass = (rule, value, callback) => {
if (!this.detail.is_simple) {
if (value === '') {
callback(new Error('必填'))
} else {
callback()
}
} else {
callback()
}
}
var methodsPass = (rule, value, callback) => {
if (!this.detail.is_simple) {
if (value === '') {
callback(new Error('必填'))
} else {
callback()
}
} else {
callback()
}
}
var modalityPass = (rule, value, callback) => {
if (!this.detail.is_simple) {
if (value === '') {
callback(new Error('必填'))
} else {
callback()
}
} else {
callback()
}
}
var pricePass = (rule, value, callback) => {
if (!this.detail.is_simple) {
if (value === '') {
callback(new Error('必填'))
} else {
if (/^\d+(\.\d+)?$/.test(value)) {
callback()
} else {
callback(new Error('必须为数字'))
}
}
} else {
callback()
}
}
return {
purchaseType: [],
moneyWay: [],
purchaseWay: [],
userList: ["ma_sm", "admin", "yu_l", "wang_yx", "li_f", "chen_y"],
boxheight: 300,
step: 1,
user: null,
adminEdit: false,
isFocus: false,
contrantId: '',
isShowEditor: false,
isShowPlan: false,
detail: {},
plan: [],
options: [{
value: 1,
label: '待申请'
}, {
value: 2,
label: '流转中'
}, {
value: 3,
label: '已办结'
}],
rules: {
name: [{
required: true,
message: "必填"
}],
supply: [{
validator: supplyPass,
trigger: 'change'
}],
type: [{
validator: typePass,
trigger: 'change'
}],
methods: [{
validator: methodsPass,
trigger: 'change'
}],
modality: [{
validator: modalityPass,
trigger: 'change'
}],
price: [{
validator: pricePass,
trigger: 'change'
}],
fundingChannels: [{
required: true,
message: "必填"
}],
plan: [{
validator: planPass,
trigger: 'change'
}]
},
plans: [],
planSearch: '',
planTable: [{
sortable: false,
width: 44,
type: "selection",
selectable: (row, index) => {
return row.pid === 0
}
},
{
label: "科室",
prop: 'plan_department.name',
width: 100,
align: 'center'
},
{
label: "年份",
prop: 'year',
width: 80,
align: 'center'
},
{
label: "分类",
prop: 'type_detail.value',
width: 120,
},
{
label: "名称",
prop: 'name',
align: 'left'
},
{
label: "计划金额",
prop: 'money',
align: 'right',
width: 120,
},
{
label: "实付金额",
prop: 'use_money_total',
width: 120,
align: 'right'
},
{
label: '已用金额',
prop: 'has_money_total',
width: 120,
align: 'right'
}
],
planTotal: 0,
selections: [],
contractSelect: {
page: 1,
page_size: 10,
is_framework: 1
},
contractList: [],
loading: false,
contractTable: [{
type: "selection",
width: 56,
align: "center",
},
{
title: "项目名称",
key: "name",
minWidth: 180,
align: "left",
},
{
title: "采购形势",
width: 120,
render: (h, {
row
}) => {
return h('span', {}, row.purchase_type?.value || "无")
}
},
{
title: "项目类型",
width: 120,
render: (h, {
row
}) => {
let map = new Map([
[1, "服务"],
[2, "货物"],
[3, "工程"]
])
return h('span', {}, map.get(row.type))
}
},
{
title: "采购方式",
width: 120,
render: (h, {
row
}) => {
return h('span', {}, row.purchase_way?.value || "无")
}
}
],
contractTotal: 0,
isShowContractToContracts: false
}
},
methods: {
//
async getMoneyWay() {
this.moneyWay = (
await getparameter({
number: "money_way",
})
).detail;
},
//
async getPurchaseWay() {
this.purchaseWay = (
await getparameter({
number: "purchase_way",
})
).detail;
},
//
async getPurchaseType() {
this.purchaseType = (
await getparameter({
number: "purchase_type",
})
).detail;
},
nextStep() {
if (this.step == 1) {
this.step = 2;
}
},
//
planInput(e, row) {
if (!/^[0-9]+.?[0-9]*$/.test(e) && e) {
Message({
type: 'warning',
message: '金额格式错误'
})
row.useMoney = 0
return
}
if (e <= (Number(row.money) - Number(row.use_money_total))) {
row.useMoney = e
this.plan.forEach(item => {
if (item.value.plan_id == row.id) {
item.value.use_money = e
}
})
return
}
Message({
type: 'warning',
message: '使用金额大于剩余预算'
})
row.useMoney = 0
},
//
planSelect() {
if (this.plan.length === 0) {
Message({
type: 'warning',
message: '选择计划不能为空'
})
return
}
for (let item of this.plan) {
console.log(item)
if (!item.value.use_money) {
Message({
type: 'warning',
message: '金额不能为空'
})
return
}
}
this.detail.plan = this.plan
this.isShowPlan = false
},
//
selectPlan(sel, row) {
if (sel) {
let select = sel.map(item => {
return {
label: item.name,
value: {
plan_id: item.id,
use_money: item.useMoney,
new_money: item.money
}
}
})
this.plan = [...this.detail.plan, ...select]
} else {
this.plan = 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,
is_tree: 1
})
this.plans = res.list;
this.planTotal = res.list.total || 0;
var selPlans = [...this.detail.plan, ...this.plan]
//let selPlans = this.detail.plan.contact([]);
console.log(selPlans)
this.toggleSelection(selPlans.map(item => {
return item.value.plan_id
}))
},
planPageChange(e) {
this.plansPageIndex = e
this.getBudgets()
},
//
toggleSelection(plans) {
var selPlans = [...this.detail.plan, ...this.plan]
if (plans) {
this.plans.forEach(plan => {
if (plans.includes(plan.id)) {
plan.useMoney = selPlans[plans.indexOf(plan.id)].value.use_money
this.$refs.editorPlanTable.toggleRowSelection(plan)
}
if (plan.children?.length > 0) {
plan.children.forEach(cplan => {
if (plans.includes(cplan.id)) {
cplan.useMoney = selPlans[plans.indexOf(cplan.id)].value.use_money
this.$refs.editorPlanTable.toggleRowSelection(cplan)
}
})
}
})
// this.plans.filter(plan => {
// if (plans.includes(plan.id)) {
// plan.useMoney = selPlans[plans.indexOf(plan.id)].value.use_money
// return true
// }
// }).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.selections = []
this.detail = {
name: res.name,
is_contract: res.is_contract,
content: res.content,
is_simple: res?.is_simple,
date: res.date,
req_status: res.req_status,
purchase_status: res.purchase_status,
join_status: res.join_status,
invite_status: res.invite_status,
supply: res?.supply,
type: res.type,
methods: res.purchase_type_id,
modality: res.purchase_way_id,
fundingChannels: res.money_way_id?.split(',')?.map(item => {
return Number(item)
}),
price: res.plan_price,
isBudget: res.is_plan === 1 ? true : false,
is_framework: res.is_framework,
use_framework_buy: res.use_framework_buy,
contract_to_contracts: res.contract_to_contracts,
plan: res.plans.map(item => {
return {
label: item.name,
value: {
plan_id: item.id,
use_money: res.plan_link.filter(item1 => {
return item1.plan_id === item.id
})[0].use_money,
new_money: item.money
}
}
})
}
this.plan = this.detail.plan
},
//y
checkName(e) {
},
editor() {
editorContract({
id: this.contrantId,
type: this.detail.type,
is_plan: this.detail.isBudget ? 1 : 0,
is_simple: this.detail?.is_simple,
content: this.detail?.content,
is_contract: this.detail?.is_contract,
supply: this.detail?.supply,
purchase_type_id: this.detail.methods,
purchase_way_id: this.detail.modality,
money_way_id: this.detail.fundingChannels.toString(),
plan_price: this.detail.price,
name: this.detail.name,
req_status: this.detail.req_status,
purchase_status: this.detail.purchase_status,
join_status: this.detail.join_status,
invite_status: this.detail.invite_status,
date: this.detail.date,
contract_plan_links: this.detail.plan.map(item => {
return item.value
}),
is_framework: this.detail.is_framework,
use_framework_buy: this.detail.use_framework_buy,
contract_to_contracts: this.selections.map(i => {
return {
contract_id: this.contrantId,
to_contract_id: i.id,
use_money: i.money
}
})
}).then(res => {
this.isShowEditor = false
Message({
type: 'success',
message: "操作成功"
})
this.$emit('success')
})
},
//
async getContractToContracts() {
const res = await getContract(this.contractSelect)
let selectedIds = this.selections.map(i => i.id)
this.contractList = res.list.data.map(item => {
return {
...item,
_checked: !!selectedIds.find(i => i === item.id),
}
})
this.contractTotal = res.list.total
},
selectionChange(selection) {
this.selections = Array.from(
new Set(
selection
)
);
},
delSelections(val) {
this.selections.map((item, index) => {
if (item.id === val.id) {
this.selections.splice(index, 1)
}
})
},
},
computed: {
},
created() {
this.getBudgets();
this.getMoneyWay();
this.getPurchaseType();
this.getPurchaseWay();
this.boxheight = document.documentElement.clientHeight - 400;
},
watch: {
isShowContractToContracts(val) {
if (val) {
this.getContractToContracts();
} else {
this.contractSelect = {
page: 1,
page_size: 10,
is_framework: 1,
}
this.contractList = [];
this.contractTotal = 0;
}
}
},
mounted() {
let that = this;
getInfo().then(response => {
console.log(response)
this.user = response;
if (that.userList.indexOf(response.username) != -1) {
that.adminEdit = true;
}
}).catch(error => {})
}
}
</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: 200px;
}
.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;
}
}
.xy-table-item-price-wan {
position: relative;
&::after {
position: absolute;
right: 0;
top: 0;
content: '(万元)'
}
::v-deep .el-input__clear {
position: relative;
right: 46px;
z-index: 2;
}
}
</style>
Loading…
Cancel
Save