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.

517 lines
14 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
ref="dialog"
:is-show.sync="isShow"
type="form"
:title="type === 'add' ? '新增政府采购计划' : '编辑政府采购计划'"
:form="form"
:rules="rules"
@submit="submit"
>
<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
:readonly="role === 1"
v-model="form.name"
clearable
placeholder="请输入项目名称"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:content>
<div class="xy-table-item">
<div class="xy-table-item-label">项目内容 </div>
<div class="xy-table-item-content">
<el-input
:readonly="role === 1"
type="textarea"
:autosize="{ minRows: 2 }"
v-model="form.content"
clearable
placeholder="请输入项目内容"
style="width: 300px"
></el-input>
</div>
</div>
</template>
<template v-slot:plan_money>
<div class="xy-table-item">
<div class="xy-table-item-label">采购预算 </div>
<div class="xy-table-item-content xy-table-item-price">
<el-input-number
:disabled="role === 1"
v-model="form.plan_money"
clearable
placeholder="请输入采购预算"
style="width: 300px"
:controls="false"
></el-input-number>
</div>
</div>
</template>
<template v-slot:public_plane_date v-if="role == 0">
<div class="xy-table-item">
<div class="xy-table-item-label">采购意向公开计划时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.public_plane_date"
placeholder="请选择采购意向公开计划时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template v-slot:public_act_date v-if="role == 1">
<div class="xy-table-item">
<div class="xy-table-item-label">采购意向公开实际时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.public_act_date"
placeholder="请选择采购意向公开实际时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template v-slot:invite_plane_date v-if="role == 0">
<div class="xy-table-item">
<div class="xy-table-item-label">招标文件挂网计划时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.invite_plane_date"
placeholder="请选择招标文件挂网计划时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template v-slot:invite_act_date v-if="role == 1">
<div class="xy-table-item">
<div class="xy-table-item-label">招标文件挂网实际时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.invite_act_date"
placeholder="请选择招标文件挂网实际时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template v-slot:open_plane_date v-if="role == 0">
<div class="xy-table-item">
<div class="xy-table-item-label">项目开标计划时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.open_plane_date"
placeholder="请选择项目开标计划时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template v-slot:open_act_date v-if="role == 1">
<div class="xy-table-item">
<div class="xy-table-item-label">项目开标实际时间 </div>
<div class="xy-table-item-content">
<el-date-picker
v-model="form.open_act_date"
placeholder="请选择项目开标实际时间"
style="width: 300px"
value-format="yyyy-MM-dd"
></el-date-picker>
</div>
</div>
</template>
<template #plan_id>
<div class="xy-table-item">
<div class="xy-table-item-label">
关联预算计划
</div>
<div class="xy-table-item-content">
<div
class="contract-add-plan"
style="width: 300px"
@click="isShowPlan = true"
>
<template>
<el-input
readonly
:value="form.plan ? form.plan.name : form.plan_id"
clearable
placeholder="请选择关联计划"
style="width: 300px"
@focus="isShowPlan = true"
></el-input>
</template>
</div>
</div>
</div>
</template>
</xy-dialog>
<!-- 新增表 预算计划 -->
<xy-dialog
:is-show.sync="isShowPlan"
:width="720"
title="预算计划"
@on-ok="isShowPlan = false"
>
<template v-slot:normalContent>
<div style="display: flex">
<el-select
placeholder="科室选择"
clearable
size="small"
v-model="planSearch.plan_department_id"
style="width: 160px"
>
<el-option
v-for="item in departments"
:label="item.name"
:value="item.id"
:key="item.id"
>
</el-option>
</el-select>
<Input
v-model="planSearch.name"
enter-button="搜 索"
placeholder="搜索预算计划.."
search
@on-search="searchBudgets"
/>
</div>
<xy-table
highlight-current-row
ref="planTable"
:height="300"
:list="plans"
:show-index="false"
:table-item="planTable"
style="margin-top: 10px"
@cellClick="row => { form.plan_id = row.id;form.plan = row; }"
>
<template #btns>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page :total="planTotal" show-elevator @on-change="e => { planSearch.page = e;getBudgets(); }" />
</div>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="isShowPlan = false">确定</Button>
</template>
</xy-dialog>
</div>
</template>
<script>
import { show, save, store } from "@/api/govPlane";
import {getBudget} from "@/api/budget/budget";
import {listdeptNoAuth} from "@/api/system/department";
import {getparameter} from "@/api/system/dictionary";
export default {
props: {
role: Number
},
data() {
return {
isShowPlan: false,
departments: [],
moneyWay: [],
planTotal: 0,
plans: [],
planSearch: {
name: "",
plan_department_id: "",
page: 1,
page_size: 10,
top_pid: 1
},
planTable: [
{
label: "分类",
prop: "type",
formatter: (cell, data, value) => {
let res = this.moneyWay.filter((item) => {
return item.id === value;
});
return res[0]?.value || "未知";
},
width: 100,
fixed: "left",
},
{
label: "科室",
prop: "plan_department.name",
width: 100,
align: "center",
},
{
label: "年份",
prop: "year",
width: 80,
align: "center",
},
{
label: "隶属",
prop: "pid_info.name",
width: 180,
align: "left",
},
{
label: "名称",
prop: "name",
width: 320,
align: "left",
},
{
label: "计划金额",
prop: "money",
align: "right",
width: 120,
customFn: (row) => {
let m1 = row.money;
let m2 = row.update_money;
return m2 == 0 ? m1 : m2;
},
},
{
label: "已用金额",
prop: "use_money_total",
width: 120,
align: "right",
},
],
isShow: false,
id: "",
type: "",
form: {
name: "",
content: "",
plan_money: "",
public_plane_date: "",
public_act_date: "",
invite_plane_date: "",
invite_act_date: "",
open_plane_date: "",
open_act_date: "",
plan_id: "",
plan: {}
},
rules: {
name: [
{
required: true,
message: "请填写项目名称",
},
],
},
};
},
methods: {
show() {
this.isShow = true;
},
hidden() {
this.isShow = false;
},
init() {
for (let key in this.form) {
if (this.form[key] instanceof Array) {
this.form[key] = [];
} else {
this.form[key] = "";
}
}
this.$refs["dialog"].clearValidate();
},
setId(id) {
if (typeof id == "number") {
this.id = id;
} else {
console.error("error typeof id: " + typeof id);
}
},
getId() {
return this.id;
},
setType(type = "add") {
let types = ["add", "editor"];
if (types.includes(type)) {
this.type = type;
} else {
console.warn("Unknown type: " + type);
}
},
setForm(key = [], value = []) {
if (key instanceof Array) {
key.forEach((key, index) => {
this.form[key] = value[index] ?? "";
});
}
if (typeof key === "string") {
this.form[key] = value;
}
if (!key) {
this.init();
}
},
async getDetail() {
const res = await show({ id: this.id });
this.$integrateData(this.form, res);
},
submit() {
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
store(this.form).then((res) => {
this.$message({
type: "success",
message:
this.type === "add"
? "新增政府采购计划"
: "编辑政府采购计划" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
}
if (this.type === "editor") {
Object.defineProperty(this.form, "id", {
value: this.id,
enumerable: true,
configurable: true,
writable: true,
});
save(this.form).then((res) => {
this.$message({
type: "success",
message:
this.type === "add"
? "新增政府采购计划"
: "编辑政府采购计划" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
}
},
//获取科室
async getDepartment() {
this.departments = await listdeptNoAuth();
},
//获取资金渠道
async getMoneyWay() {
this.moneyWay = (
await getparameter({
number: "money_way",
})
).detail;
},
//确认计划选择
planSelect(row) {
console.log(row)
// if (this.plan.length === 0) {
// this.$message({
// type: "warning",
// message: "选择计划不能为空",
// });
// return;
// }
//
// this.isShowPlan = false;
},
searchBudgets() {
this.getBudgets();
},
//获取预算计划
async getBudgets() {
let res = await getBudget(this.planSearch);
this.plans = res.list.data;
this.planTotal = res.list.total;
},
},
watch: {
isShow(val) {
if (val) {
if (this.type === "editor") {
this.getDetail();
}
} else {
this.id = "";
this.type = "";
this.init();
this.$refs["dialog"].clearValidate();
delete this.form.id;
}
},
isShowPlan(val) {
if (val) {
this.$refs['planTable'].setCurrentRow(this.plans.find(row => row.id === this.form.plan_id))
}
}
},
created() {
this.getMoneyWay();
this.getDepartment();
this.getBudgets();
}
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
.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;
}
}
</style>