315 lines
10 KiB
Vue
315 lines
10 KiB
Vue
|
|
<template>
|
|||
|
|
<div class="main" v-loading="loading">
|
|||
|
|
<div class="">
|
|||
|
|
<div class="">
|
|||
|
|
<el-card style="">
|
|||
|
|
<el-row>
|
|||
|
|
<div>
|
|||
|
|
<h1>差旅费报销申请单</h1>
|
|||
|
|
</div>
|
|||
|
|
<el-button type="primary">
|
|||
|
|
<i class="el-icon-check" @click="addTripClaim">提交</i>
|
|||
|
|
</el-button>
|
|||
|
|
</el-row>
|
|||
|
|
</el-card>
|
|||
|
|
<el-card>
|
|||
|
|
<div class="header">
|
|||
|
|
基本信息
|
|||
|
|
</div>
|
|||
|
|
<el-divider></el-divider>
|
|||
|
|
<div>
|
|||
|
|
<el-form :form="form" label-width="100px" :rules="rules">
|
|||
|
|
<el-form-item label="报销描述:" prop="remark">
|
|||
|
|
<el-input type="textarea" v-model="form.remark" :rows="5"></el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
|
|||
|
|
<el-row>
|
|||
|
|
<el-col :span="8">
|
|||
|
|
<el-form-item label="开始时间:" prop="startTime">
|
|||
|
|
<el-date-picker
|
|||
|
|
v-model="form.startTime"
|
|||
|
|
align="right"
|
|||
|
|
type="date"
|
|||
|
|
placeholder="选择日期"
|
|||
|
|
value-format="yyyy-MM-dd"
|
|||
|
|
>
|
|||
|
|
</el-date-picker>
|
|||
|
|
</el-form-item>
|
|||
|
|
|
|||
|
|
<el-form-item label="出差天数:" prop="tripDays">
|
|||
|
|
<el-input type="number" v-model="form.tripDays"placeholder="请输入出差天数" ></el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
|
|||
|
|
</el-col>
|
|||
|
|
<el-col :span="8">
|
|||
|
|
<el-form-item label="结束时间:" prop="endTime" >
|
|||
|
|
<el-date-picker
|
|||
|
|
v-model="form.endTime"
|
|||
|
|
align="right"
|
|||
|
|
type="date"
|
|||
|
|
placeholder="选择日期"
|
|||
|
|
value-format="yyyy-MM-dd"
|
|||
|
|
>
|
|||
|
|
</el-date-picker>
|
|||
|
|
</el-form-item>
|
|||
|
|
<el-form-item label="报销总额:" prop="cost">
|
|||
|
|
<el-input v-model="form.cost" placeholder="请输入报销总额">
|
|||
|
|
<template slot="append">元</template>
|
|||
|
|
</el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
|
|||
|
|
</el-col>
|
|||
|
|
<el-col :span="8">
|
|||
|
|
<el-form-item label="关联项目:" prop="projectId">
|
|||
|
|
<el-select v-model="form.projectId" filterable placeholder="请选择">
|
|||
|
|
<el-option
|
|||
|
|
v-for="item in projectList"
|
|||
|
|
:key="item.projectId"
|
|||
|
|
:label="item.projectName"
|
|||
|
|
:value="item.projectId">
|
|||
|
|
</el-option>
|
|||
|
|
</el-select>
|
|||
|
|
</el-form-item>
|
|||
|
|
|
|||
|
|
<el-form-item label="票据总数:" prop="detailNumber">
|
|||
|
|
<el-input v-model="form.detailNumber" placeholder="请输入票据总数">
|
|||
|
|
<template slot="append">张</template>
|
|||
|
|
</el-input>
|
|||
|
|
</el-form-item>
|
|||
|
|
</el-col>
|
|||
|
|
</el-row>
|
|||
|
|
</el-form>
|
|||
|
|
|
|||
|
|
<el-divider></el-divider>
|
|||
|
|
<div style="font-weight: 900;display: flex;">
|
|||
|
|
<div style="width: 50%">
|
|||
|
|
最终报销金额:
|
|||
|
|
<span style="color: red">{{form.cost===""?'请输入金额':form.cost}}</span>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
<div>
|
|||
|
|
大写:<span style="color: red">{{numberToCNY(form.cost)}}</span>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</el-card>
|
|||
|
|
|
|||
|
|
<el-card>
|
|||
|
|
报销明细补充
|
|||
|
|
<el-divider></el-divider>
|
|||
|
|
<div>
|
|||
|
|
<div style="margin-bottom: 10px">
|
|||
|
|
<el-button @click="addRow" type="primary">添加</el-button>
|
|||
|
|
<el-button @click="deleteRows" type="danger" :disabled="selectedRows.length === 0">删除</el-button>
|
|||
|
|
<el-button @click="co" type="danger">打印</el-button>
|
|||
|
|
</div>
|
|||
|
|
<el-table
|
|||
|
|
:data="form.claimDetailList"
|
|||
|
|
style="width: 100%"
|
|||
|
|
border
|
|||
|
|
stripe
|
|||
|
|
v-loading="loading"
|
|||
|
|
highlight-current-row
|
|||
|
|
@selection-change="handleSelectionChange"
|
|||
|
|
>
|
|||
|
|
<el-table-column type="selection" width="55"></el-table-column>
|
|||
|
|
<el-table-column label="序号" width="80" type="index"></el-table-column>
|
|||
|
|
<el-table-column label="报销类型">
|
|||
|
|
<template slot-scope="scope">
|
|||
|
|
<el-select v-model="scope.row.claimType" placeholder="请选择报销类型">
|
|||
|
|
<el-option
|
|||
|
|
v-for="dict in dict.type.claim_detail_type"
|
|||
|
|
:key="dict.value"
|
|||
|
|
:label="dict.label"
|
|||
|
|
:value="parseInt(dict.value)"
|
|||
|
|
></el-option>
|
|||
|
|
</el-select>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column label="开始时间">
|
|||
|
|
<template slot-scope="scope">
|
|||
|
|
<el-date-picker
|
|||
|
|
v-model="scope.row.beginTime"
|
|||
|
|
align="right"
|
|||
|
|
type="date"
|
|||
|
|
placeholder="选择日期"
|
|||
|
|
value-format="yyyy-MM-dd"
|
|||
|
|
>
|
|||
|
|
</el-date-picker>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column label="结束时间">
|
|||
|
|
<template slot-scope="scope">
|
|||
|
|
|
|||
|
|
<el-date-picker
|
|||
|
|
v-model="scope.row.endTime"
|
|||
|
|
align="right"
|
|||
|
|
type="date"
|
|||
|
|
placeholder="选择日期"
|
|||
|
|
value-format="yyyy-MM-dd"
|
|||
|
|
>
|
|||
|
|
</el-date-picker>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
|
|||
|
|
<el-table-column label="入住地点">
|
|||
|
|
<template slot-scope="scope">
|
|||
|
|
<el-input v-model="scope.row.lodgingAddress" placeholder="请输入入住地点" :disabled="scope.row.claimType!==1"></el-input>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
<el-table-column label="款项金额">
|
|||
|
|
<template slot-scope="scope">
|
|||
|
|
<el-input v-model="scope.row.cost" size="small" placeholder="请输入" >
|
|||
|
|
<template slot="append">元</template>
|
|||
|
|
</el-input>
|
|||
|
|
</template>
|
|||
|
|
</el-table-column>
|
|||
|
|
</el-table>
|
|||
|
|
</div>
|
|||
|
|
</el-card>
|
|||
|
|
<el-card>
|
|||
|
|
票据留存
|
|||
|
|
<el-divider></el-divider>
|
|||
|
|
<div style="display: flex">
|
|||
|
|
<div style="margin-right: 20px">
|
|||
|
|
上传票据:
|
|||
|
|
</div>
|
|||
|
|
<div>
|
|||
|
|
<fileUpload v-model="files"/>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
|
|||
|
|
|
|||
|
|
</el-card>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</div>
|
|||
|
|
</template>
|
|||
|
|
|
|||
|
|
<script>
|
|||
|
|
import {addUser, deptTreeSelect, listUser} from "@/api/system/user";
|
|||
|
|
import {addOnboarding} from "@/api/oa/onboarding";
|
|||
|
|
import {listProject} from "../../../api/oa/project";
|
|||
|
|
import {numberToCNY} from "../../../utils/currencyFormatter";
|
|||
|
|
import {startClaim} from "../../../api/workflow/process";
|
|||
|
|
import {addOaClaim} from "../../../api/oa/claim";
|
|||
|
|
|
|||
|
|
export default {
|
|||
|
|
dicts: ['claim_detail_type'],
|
|||
|
|
data() {
|
|||
|
|
return {
|
|||
|
|
loading: false,
|
|||
|
|
// 表单参数
|
|||
|
|
form: {
|
|||
|
|
claimDetailList: [],
|
|||
|
|
fileList:[]
|
|||
|
|
},
|
|||
|
|
// 表单校验
|
|||
|
|
rules: {
|
|||
|
|
|
|||
|
|
startTime: [
|
|||
|
|
{ required: true, message: "开始时间不能为空", trigger: "blur" }
|
|||
|
|
],
|
|||
|
|
endTime: [
|
|||
|
|
{ required: true, message: "结束时间不能为空", trigger: "blur" }
|
|||
|
|
],
|
|||
|
|
tripDays: [
|
|||
|
|
{ required: true, message: "出差天数不能为空", trigger: "blur" }
|
|||
|
|
],
|
|||
|
|
cost: [
|
|||
|
|
{ required: true, message: "报销金额不能为空", trigger: "blur" }
|
|||
|
|
],
|
|||
|
|
detailNumber: [
|
|||
|
|
{ required: true, message: "票据总数不能为空", trigger: "blur" }
|
|||
|
|
]
|
|||
|
|
},
|
|||
|
|
// 项目列表
|
|||
|
|
projectList: [],
|
|||
|
|
selectedRows: [],
|
|||
|
|
files:[]
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
created() {
|
|||
|
|
this.getProjectList();
|
|||
|
|
},
|
|||
|
|
methods: {
|
|||
|
|
// 提交报销表单
|
|||
|
|
addTripClaim(){
|
|||
|
|
this.loading = true
|
|||
|
|
// 将文件列表进行处理
|
|||
|
|
this.form.fileList = this.files.split(',').map(file=>({fileUrl:file.trim()}))
|
|||
|
|
startClaim().then(res=>{
|
|||
|
|
this.form.procInsId = res.data
|
|||
|
|
addOaClaim(this.form).then(res => {
|
|||
|
|
this.loading = false
|
|||
|
|
this.$modal.msgSuccess("新增成功");
|
|||
|
|
this.goBack()
|
|||
|
|
})
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
co(){
|
|||
|
|
console.log(this.files)
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
// 添加新的一行
|
|||
|
|
addRow() {
|
|||
|
|
this.form.claimDetailList.push({
|
|||
|
|
claimType: '',
|
|||
|
|
beginTime: '',
|
|||
|
|
endTime: '',
|
|||
|
|
cost: '',
|
|||
|
|
lodgingAddress:''
|
|||
|
|
});
|
|||
|
|
},
|
|||
|
|
// 删除勾选的行
|
|||
|
|
deleteRows() {
|
|||
|
|
this.form.claimDetailList = this.form.claimDetailList.filter(row => !this.selectedRows.includes(row));
|
|||
|
|
this.selectedRows = []; // 清空选中的行
|
|||
|
|
},
|
|||
|
|
// 处理表格头部的序号显示
|
|||
|
|
renderHeader(h, { column }) {
|
|||
|
|
return h('span', column.label);
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
getProjectList(){
|
|||
|
|
let query = {
|
|||
|
|
pageSize:9999,
|
|||
|
|
pageNum:1,
|
|||
|
|
}
|
|||
|
|
listProject(query).then(res => {
|
|||
|
|
this.projectList = res.rows
|
|||
|
|
})
|
|||
|
|
},
|
|||
|
|
/** 返回页面 */
|
|||
|
|
goBack() {
|
|||
|
|
// 关闭当前标签页并返回上个页面
|
|||
|
|
this.$tab.closePage(this.$route)
|
|||
|
|
this.$router.back()
|
|||
|
|
},
|
|||
|
|
numberToCNY,
|
|||
|
|
// 处理表格选择变化,更新选中的行
|
|||
|
|
handleSelectionChange(val) {
|
|||
|
|
this.selectedRows = val;
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
|
|||
|
|
};
|
|||
|
|
</script>
|
|||
|
|
|
|||
|
|
<style scoped>
|
|||
|
|
.main {
|
|||
|
|
padding: 10px;
|
|||
|
|
background-color: #f6f6f6;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
.container {
|
|||
|
|
margin: 10px;
|
|||
|
|
padding: 10px;
|
|||
|
|
background-color: white;
|
|||
|
|
border-radius: 10px;
|
|||
|
|
}
|
|||
|
|
</style>
|