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.

633 lines
17 KiB

<template>
<div style="padding: 0 20px">
<lx-header
icon="md-apps"
text="付款登记"
style="margin-bottom: 10px; border: 0px; margin-top: 15px"
>
<div slot="content"></div>
<slot>
<span style="padding: 0 6px; word-break: keep-all"> 业务科室 </span>
<span>
<el-select
v-model="select.department_id"
clearable
placeholder="业务科室选择"
size="small"
style="width: 120px"
>
<el-option
v-for="item in departments"
:key="item.id"
:label="item.name"
:value="item.id"
>
</el-option>
</el-select>
</span>
<span style="padding: 0 6px; word-break: keep-all">确认日期</span>
<span>
<DatePicker
:value="[select.start_audit_date, select.end_audit_date]"
placeholder="请选择日期"
type="daterange"
placement="bottom-start"
style="width: 180px"
@on-change="(e) => {
if (e[0] && e[1]) {
select.start_audit_date = $moment(e[0]).format('YYYY-MM-DD');
select.end_audit_date = $moment(e[1]).format('YYYY-MM-DD');
} else {
select.start_audit_date = '';
select.end_audit_date = '';
}
}"
></DatePicker>
</span>
<span style="padding: 0 6px; word-break: keep-all">创建日期</span>
<span>
<DatePicker
:value="selectDate"
placeholder="请选择日期"
type="daterange"
placement="bottom-start"
style="width: 180px"
@on-change="(e) => {
if (e[0] && e[1]) {
selectDate[0] = $moment(e[0]).format('YYYY-MM-DD');
selectDate[1] = $moment(e[1]).format('YYYY-MM-DD');
} else {
selectDate[0] = '';
selectDate[1] = '';
}
}"
></DatePicker>
</span>
<span style="padding: 0 6px; word-break: keep-all">关键字</span>
<span>
<Input
v-model="keyword"
placeholder="请输入关键字"
style="width: 180px"
></Input>
</span>
<span style="padding: 0 6px; word-break: keep-all">预算计划</span>
<span>
<Input
v-model="select.plan_name"
clearable
placeholder="请选择预算计划"
@on-focus="showPlanForSearch"
style="width: 200px"
@on-clear="clearSelectForSearch"
/>
</span>
<span style="padding: 0 6px; word-break: keep-all"> 状态 </span>
<Select
v-model="status"
clearable
placeholder="请选择"
style="width: 100px"
>
<Option
v-for="item in [
{ label: '待审核', value: 0 },
{ label: '已审核', value: 1 },
]"
:key="item.value"
:value="item.value"
>
{{ item.label }}
</Option>
</Select>
<Button type="primary" style="margin-left: 10px" ghost>重置</Button>
<Button type="primary" style="margin-left: 10px" @click="doSearch()"
>查询</Button
>
<Button type="primary" @click="toExport()" style="margin-left: 10px"
>导出</Button
>
</slot>
</lx-header>
<!-- 搜索使用 预算计划 -->
<xy-dialog
:is-show.sync="isShowPlanForSearch"
title="预算计划"
:width="720"
@on-ok="planSelectForSearch"
>
<template>
<div style="display: flex;align-items: center;">
<DatePicker type="year" v-model="planSearch.year" style="margin-right: 6px;"></DatePicker>
<Input
v-model="planSearch.name"
search
enter-button="搜 索"
placeholder="搜索预算计划.."
@on-search="searchBudgets"
/>
</div>
<div
style="
margin: 10px 0;
display: flex;
align-items: center;
"
>
<span>是否选择为父级</span>
<el-switch v-model="isPlanSearchPid" style="padding: 0 4px;" active-text="是" inactive-text="否"></el-switch>
<div>
已选择:<span style="margin-right: 10px">{{
select.plan_name
}}</span>
</div>
<el-link style="margin-left: auto;" type="success" @click="clearSelectForSearch"
>清空选择</el-link
>
</div>
<xy-table
highlight-current-row
:list="plans"
@rowClick="selectPlanForSearch"
:show-index="false"
:table-item="planTableSearch"
:height="310"
style="margin-top: 10px"
ref="singlePlanTable"
>
<template v-slot:btns> </template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page :total="planTotal" show-elevator @on-change="planPageChange" />
</div>
<el-tag type="warning">点击行进行选择</el-tag>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="confirmPlanForSearch">确定</Button>
</template>
</xy-dialog>
<xy-table :list="list" :table-item="table">
<template v-slot:btns>
<el-table-column
label="操作"
fixed="right"
width="160"
header-align="center"
>
<template slot-scope="scope" v-if="scope.row.flow_status === 3">
<template v-if="scope.row.status === 0">
<Button
size="small"
type="primary"
style="margin-left: 10px; margin-bottom: 4px"
@click="
($refs['examineRegistration'].isShow = true),
$refs['examineRegistration'].getRegistration(scope.row.id)
"
>审核确认</Button
>
</template>
<template v-else>
<Button
size="small"
type="error"
ghost
style="margin-left: 10px; margin-bottom: 4px"
@click="cancelExamine(scope.row)"
>审核撤销</Button
>
</template>
</template>
</el-table-column>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page
:total="total"
show-elevator
@on-change="pageChange"
show-sizer
@on-page-size-change="pageSizeChange"
/>
</div>
<examineRegistration
ref="examineRegistration"
@refresh="getFundLogs"
></examineRegistration>
</div>
</template>
<script>
import {
getFundLog,
delFundLog,
editorFundLog,
} from "@/api/paymentRegistration/fundLog";
import { getToken } from "@/utils/auth";
import { parseTime } from "@/utils";
import { Message } from "element-ui";
import { getBudget } from "@/api/budget/budget";
import { getparameter } from "@/api/system/dictionary";
import examineRegistration from "./components/examineRegistration";
import { listdeptNoAuth } from '@/api/system/department'
export default {
components: {
examineRegistration,
},
data() {
return {
planSearchPid: "",
isPlanSearchPid: false,
departments: [],
moneyWay: [],
plan: [],
planTableSearch: [
{
label: "父级",
prop: "pid_info.name",
width: 160
},
{
label: "分类",
prop: "type_detail.value",
width: 120,
},
{
label: "年份",
prop: "year",
align: "center",
width: 90,
},
{
label: "名称",
prop: "name",
width: 200,
align: "left",
},
{
label: "计划金额",
prop: "money",
align: "right",
width: 160,
formatter: (v1, v2, value) => {
return `${(value && parseFloat(value) !== 0) ? value : v1.update_money }`.replace(/\B(?=(\d{3})+(?!\d))/g, ",")
}
},
],
plans: [], //预算数据
planSearch: {
year: "",
name: "",
plan_department_id: "",
},
planTotal: 0,
plansPageIndex: 1,
isShowPlanForSearch: false,
status: 0,
keyword: "",
select: {
year: "",
plan_id: "",
plan_name: "",
department_id: "",
start_audit_date: "",
end_audit_date: "",
},
selectDate: [],
list: [],
total: 0,
pageIndex: 1,
pageSize: 10,
table: [
{
label: "项目名称",
minWidth: 300,
prop: "contract.name",
fixed: "left",
align: "left",
},
{
label: "付款申请金额(元)",
prop: "apply_money",
align: "right",
width: 170,
formatter: (v1, v2, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "实际付款金额(元)",
prop: "act_money",
align: "right",
width: 170,
formatter: (v1, v2, value) => {
return Number(value)
.toFixed(2)
.replace(/(\d)(?=(\d{3})+\.)/g, "$1,");
},
},
{
label: "预算计划",
width: 320,
align: "left",
customFn: (row) => {
{
if (row.act_plan_link.length > 0) {
return row.act_plan_link.map((item) => {
return (
<div>
{" "}
[{item.plan.year}] {(item.plan && item.plan.pid_info) ? item.plan.pid_info.name: ''} - {item.plan.name} <br /> [使用金额]{" "}
{item.use_money}元{" "}
</div>
);
});
}
}
},
},
{
label: "款项类型",
prop: "type",
width: 120,
},
{
prop: "status",
label: "状态",
width: 100,
formatter: (cell, data, value) => {
if (value === 0) return "待审核";
else return "已审核";
},
},
{
prop: 'flow_status',
label: '流程状态',
formatter: (cell, data, value) => {
let map = new Map([
[1,'待申请'],
[2,'流转中'],
[3,'已完成']
])
return map.get(value)
}
},
{
label: "次数",
prop: "pay_count",
width: 95,
formatter: (cell, data, value) => {
return value + 1;
},
},
{
label: "最后一笔",
prop: "is_end",
width: 125,
formatter: (cell, data, value) => {
return value == 1 ? "是" : "否";
},
},
{
label: "经办人",
minWidth: 120,
prop: "admin.name",
align: "center",
},
{
label: "业务科室",
minWidth: 140,
prop: "department.name",
align: "center",
},
{
label: "备注",
minWidth: 360,
prop: "remark",
align: "left",
},
{
label: "创建信息",
prop: "created_at",
width: 160,
formatter: (cell, data, value) => {
return parseTime(new Date(value), "{y}-{m}-{d}");
},
},
],
};
},
methods: {
//获取科室
async getDepartment() {
this.departments = await listdeptNoAuth();
},
planPageChange(e) {
this.plansPageIndex = e;
this.getBudgets();
},
//获取资金渠道
async getMoneyWay() {
this.moneyWay = (
await getparameter({
number: "money_way",
})
).detail;
},
clearSelectForSearch() {
this.isPlanSearchPid = false;
this.planSearchPid = "";
this.select.plan_id = "";
this.select.plan_name = "请选择预算计划";
},
//计划搜索
searchBudgets() {
this.plansPageIndex = 1;
this.getBudgets();
},
doSearch() {
this.pageIndex = 0;
this.getFundLogs();
},
confirmPlanForSearch() {
this.isShowPlanForSearch = false;
this.getFundLogs();
},
//默认选择计划
toggleSelection(plans, type) {
if (plans) {
this.plans
.filter((plan) => {
if (plans.includes(plan.id)) {
plan.useMoney = this.plan[plans.indexOf(plan.id)].value.use_money;
return true;
}
})
.map((row) => {
this.$refs.planTable.toggleRowSelection(row);
});
} else {
this.$refs.planTable.clearSelection();
}
},
//获取预算计划
async getBudgets() {
await getBudget({
name: this.planSearch.name,
page_size: 10,
page: this.plansPageIndex,
plan_department_id: this.planSearch.plan_department_id,
top_pid: 1,
year: this.planSearch.year ? this.$moment(this.planSearch.year).format("YYYY") : "",
}).then((res) => {
this.plans = res.list.data;
this.planTotal = res.list.total;
this.toggleSelection(
this.plan.map((item) => {
return item.value.plan_id;
}),
1
);
});
},
async showPlanForSearch() {
this.isShowPlanForSearch = true;
await this.getBudgets();
},
//选择计划 搜索
selectPlanForSearch(sel) {
console.log(sel);
if (sel) {
this.planSearchPid = sel.pid;
this.select.plan_id = sel.id;
this.select.plan_name = this.isPlanSearchPid ? "[" + sel.pid_info?.year + "]-" + sel.pid_info?.name : "[" + sel.year + "]-" + sel.name;
} else {
this.planSearchPid = "";
this.select.plan_id = "";
this.select.plan_name = "";
}
},
//确认计划选择搜索
planSelectForSearch() {
if (this.select.plan_id == "") {
Message({
type: "warning",
message: "选择计划不能为空",
});
return;
}
this.isShowPlanForSearch = false;
},
pageSizeChange(e) {
this.pageSize = e;
this.pageIndex = 1;
this.getFundLogs();
},
pageChange(e) {
this.pageIndex = e;
this.getFundLogs();
},
toExport() {
this.is_export = 1;
this.getFundLogs(true);
},
async getFundLogs(is_export) {
let pidPlans = []
if (this.isPlanSearchPid) {
pidPlans = (await getBudget({
pid: this.planSearchPid,
page: 1,
page_size: 999,
})).list.data
}
await getFundLog({
page_size: this.pageSize,
page: this.pageIndex,
keyword: this.keyword,
start_date: this.selectDate[0],
end_date: this.selectDate[1],
status: this.status,
act_plan_link_id: this.isPlanSearchPid ? pidPlans.map(i => i.id).toString() : this.select.plan_id,
department_id: this.select.department_id,
start_audit_date: this.select.start_audit_date,
end_audit_date: this.select.end_audit_date,
sort_name: "updated_at",
sort_type: "desc",
}).then((res) => {
let tokens = getToken();
if (is_export) {
var url = "/api/admin/fund_log/index?token=" + tokens;
if (this.selectDate) url += "&date=" + this.selectDate;
if (this.keyword) url += "&keyword=" + this.keyword;
if (typeof this.status != "undefined")
url += "&status=" + this.status;
if (this.select.plan_id)
url += "&act_plan_link_id=" + this.select.plan_id;
url += "&is_export=" + this.is_export;
url = location.host + url;
console.log(url);
window.open("http://" + url, "_blank");
this.select.is_export = 0;
return;
}
this.list = res.data;
this.total = res.total;
});
},
deleteFundLog(row) {
delFundLog({
id: row.id,
}).then((res) => {
Message({
type: "success",
message: "操作成功",
});
this.getFundLogs();
});
},
cancelExamine(row) {
editorFundLog({
id: row.id,
contract_id: row.contract_id,
status: 0,
}).then((res) => {
this.getFundLogs();
Message({
type: "success",
message: "操作成功",
});
});
},
},
mounted() {
this.getMoneyWay();
this.getFundLogs();
},
created() {
this.getDepartment()
}
};
</script>
<style scoped lang="scss"></style>