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.

536 lines
13 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' ? `新增${typeText}` : `编辑${typeText}`"
:form="form"
:rules="rules"
@submit="submit"
>
<template v-slot:name>
<div class="xy-table-item">
<div class="xy-table-item-label">{{ typeText }}事项 </div>
<div class="xy-table-item-content">
<el-input
v-model="form.name"
style="width: 300px"
:placeholder="'请填写' + typeText + '事项'"
></el-input>
</div>
</div>
</template>
<template v-slot:report_type v-if="outcomeType == 2">
<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
v-model="form.report_type"
clearable
placeholder="请选择报销类型"
style="width: 300px"
>
<el-option
v-for="item in report_types"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:other_type v-if="outcomeType == 3">
<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
v-model="form.other_type"
clearable
placeholder="请选择其他支出类型"
style="width: 300px"
>
<el-option
v-for="item in other_types"
:key="item.id"
:label="item.value"
:value="item.id"
></el-option>
</el-select>
</div>
</div>
</template>
<template v-slot:money>
<div class="xy-table-item">
<div class="xy-table-item-label">{{ typeText }}金额 </div>
<div class="xy-table-item-content">
<el-input-number
v-model="form.money"
clearable
placeholder="请输入报销金额"
style="width: 300px"
:controls="false"
></el-input-number>
</div>
</div>
</template>
<template #remark>
<div class="xy-table-item">
<div class="xy-table-item-label">
备注
</div>
<div class="xy-table-item-content">
<el-input style="width: 300px" type="textarea" v-model="form.remark" :autosize="{ minRows: 2 }"></el-input>
</div>
</div>
</template>
<template #files>
<div class="xy-table-item">
<div class="xy-table-item-label">文件 </div>
<div class="xy-table-item-content">
<el-upload
style="width: 300px"
ref="upload"
multiple
:headers="{
'Authorization':'Bearer ' + getToken()
}"
:on-success="successHandle"
:before-upload="uploadBefore"
accept="application/x-rar-compressed,application/zip,application/msword,application/vnd.openxmlformats-officedocument.wordprocessingml.document,application/pdf"
:action="action"
:file-list="fileList"
:auto-upload="false"
:on-remove="removeHande"
>
<el-button slot="trigger" size="small" type="primary"
>选取文件</el-button
>
<el-button
style="margin-left: 10px"
size="small"
type="success"
@click="$refs['upload'].submit()"
>开始上传</el-button
>
<div slot="tip" class="el-upload__tip">
支持文件格式:.rar .zip .doc .docx .pdf
<br />单个文件不能超过500kb
</div>
</el-upload>
</div>
</div>
</template>
<template v-slot:oa>
<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="showPlan"
>
<template v-if="form.oa.length > 0">
<template v-for="item in form.oa">
<Tag closable color="primary" @on-close="delOa(item)">{{
item.title
}}</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"
:width="820"
title="审批单"
>
<template>
<xy-table
ref="planTable"
:height="300"
:list="plans"
row-key="id"
:show-index="false"
:table-item="planTable"
style="margin-top: 10px"
@select="selected"
>
<template v-slot:btns>
</template>
</xy-table>
<div style="display: flex; justify-content: flex-end">
<Page
:total="planTotal"
show-elevator
@on-change="e => {planSearch.p = e; getBudgets()}"
/>
</div>
</template>
<template v-slot:footerContent>
<Button type="primary" @click="isShowPlan = false">确定</Button>
</template>
</xy-dialog>
</div>
</template>
<script>
import { getToken } from "@/utils/auth"
import { getparameter } from "@/api/system/dictionary";
import {
addContrant,
editorContract,
detailContract as show,
} from "@/api/contract/contract";
import { httpCurl } from "@/api/out"
export default {
props: {
report_types: {
type: Array,
default: () => [
{
value: "医药报销支出",
id: 1,
},
{
value: "出差报销支出",
id: 2,
},
],
},
other_types: {
type: Array,
default: () => [],
},
departments: {
type: Array,
default: () => [],
},
},
data() {
return {
moneyWay: [],
plans: [],
planTotal: 0,
isShowPlan: false,
planSearch: {
mod_name: '出差审批',
list_rows: 10,
p: 1
},
planTable: [
{
width: 46,
sortable: false,
type: "selection",
fixed: "left",
reserveSelection: true
},
{
label: '名称',
prop: 'title',
minWidth: 160,
fixed: 'left'
},
{
label: '部门',
prop: 'dept_name',
width: 180
},
{
label: '人员',
prop: 'emp_name',
width: 140
},
{
label: '创建时间',
prop: 'create_time',
width: 180,
formatter: (cell,data,value)=> {
return this.$moment(new Date(Number(value)*1000)).format('YYYY-MM-DD')
}
}
],
isShow: false,
id: "",
type: "",
fileList: [],
action: process.env.VUE_APP_UPLOAD_API,
form: {
name: "",
outcome_type: "",
report_type: "",
other_type: "",
money: undefined,
files: [],
remark: "",
oa: [],
},
rules: {
report_type: [
{
required: true,
message: "请填写报销类型",
},
],
other_type: [
{
required: true,
message: "请填写其他支出类型",
},
],
},
};
},
methods: {
getToken,
//上传
successHandle(response, file, fileList) {
this.fileList = fileList;
},
removeHande(file, fileList) {
this.fileList = fileList;
},
uploadBefore(file) {
console.log(file);
if (file.size / 1000 > 500) {
this.$message({
type: "warning",
message: "上传文件大小超过500kb",
});
return false;
}
},
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);
this.fileList = res.files_detail.map(i => {
return {
url: i.url,
name: i.original_name,
response: i
}
})
},
submit() {
this.form.outcome_type = this.outcomeType;
this.form.files = this.fileList.map(i => i.response?.id);
if (this.type === "add") {
if (this.form.hasOwnProperty("id")) {
delete this.form.id;
}
addContrant(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,
});
editorContract(this.form).then((res) => {
this.$message({
type: "success",
message: this.type === "add" ? "新增支出" : "编辑支出" + "成功",
});
this.isShow = false;
this.$emit("refresh");
});
}
},
selected (rows) {
this.form.oa = rows.map(i => {
return {
id: i.id,
title: i.title
}
})
},
delOa (item) {
this.form.oa.splice(this.form.oa.indexOf(this.form.oa.find(i => item.id === i.id)),1)
},
//获取资金渠道
async getMoneyWay() {
this.moneyWay = (
await getparameter({
number: "money_way",
})
).detail;
},
async showPlan() {
await this.getBudgets();
this.isShowPlan = true;
},
//获取预算计划
async getBudgets() {
let res = await httpCurl(this.planSearch, false, '/Api/flowList');
this.plans = res.list
this.planTotal = Number(res.total)
this.plans.forEach(i => {
if (this.form.oa.find(oa => oa.id === i.id)) {
this.$refs['planTable'].toggleRowSelection(i)
}
})
},
},
computed: {
outcomeType() {
return this.$route.path.split("_")[1];
},
typeText() {
let type = this.$route.path.split("_")[1];
if (type == 2) {
return "报销";
}
if (type == 3) {
return "其他支出";
}
},
},
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;
}
},
},
created() {
this.getMoneyWay();
},
};
</script>
<style scoped lang="scss">
::v-deep .el-input__inner {
text-align: left;
}
.xy-table-item-label {
width: 158px;
}
.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;
}
}
.slot-btns {
display: flex;
flex-wrap: wrap;
align-content: center;
justify-content: flex-start;
&-item {
margin: 0 6px 4px 0;
}
}
</style>