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.
427 lines
12 KiB
427 lines
12 KiB
<template>
|
|
<div>
|
|
<!-- 导航返回上一页 -->
|
|
<NuxtLink to="/applicant">
|
|
<van-nav-bar
|
|
title="发起申请"
|
|
left-arrow
|
|
/>
|
|
</NuxtLink>
|
|
<!-- 申请发票需要输入的数据 -->
|
|
<div class="bg-white pb-3">
|
|
<div class="text-gray-500 px-4 py-3 font-semibold">发票信息</div>
|
|
<!-- 是否上传票据 -->
|
|
<div v-show="data.isInvoice">
|
|
<div class="mx-4 pb-3 border-b">
|
|
<div class="flex pt-3 pb-2 justify-between" v-show="data.titleHidden">
|
|
<div>
|
|
<span class="text-red-500">*</span>
|
|
<span class="text-gray-500">上传票据凭证 </span>
|
|
<span class="text-gray-400 text-xs">(仅支持ipg格式)</span>
|
|
</div>
|
|
<van-button plain type="primary" size="mini" @click="data.isInvoice = false">手动输入</van-button>
|
|
</div>
|
|
<div class="text-center border-b w-52 h-24 bg-gray-100 border-dashed border-2" @click="uploadBill" v-show="!data.isSuccess">
|
|
<p class="text-gray-400 text-xl pt-3">+</p>
|
|
<p class="text-gray-400 text-xs">上传并识别凭证</p>
|
|
</div>
|
|
<!-- 上传票据成功后显示发票信息 -->
|
|
<div v-show="data.isSuccess">
|
|
<van-field
|
|
v-for="item in data.billList"
|
|
required
|
|
v-model="item.values"
|
|
:label="item.name"
|
|
input-align="right"
|
|
/>
|
|
</div>
|
|
</div>
|
|
</div >
|
|
<!-- 手动输入信息 -->
|
|
<div v-show="!data.isInvoice">
|
|
<van-field
|
|
required
|
|
v-model="data.applyMoney"
|
|
label="申请金额"
|
|
placeholder="输入申请金额"
|
|
input-align="right"
|
|
/>
|
|
</div>
|
|
<!-- 备注信息 -->
|
|
<div class="text-gray-500 py-4 pl-5">备注</div>
|
|
<van-cell-group>
|
|
<van-field
|
|
v-model="data.message"
|
|
rows="2"
|
|
autosize
|
|
type="textarea"
|
|
maxlength="40"
|
|
placeholder="请输入备注"
|
|
show-word-limit
|
|
class="border rounded"
|
|
/>
|
|
</van-cell-group>
|
|
</div>
|
|
<!-- 选择审核人 -->
|
|
<div class="mt-3">
|
|
<div class="flex bg-white p-4">
|
|
<div class="text-red-500">*</div>
|
|
<div class="text-gray-500 pl-1 font-semibold">审核人</div>
|
|
</div>
|
|
<div class="px-3 bg-white">
|
|
<div>
|
|
<van-button
|
|
class="button"
|
|
size="mini"
|
|
v-for="item in data.reviewerList"
|
|
:key="item.userId"
|
|
:type="data.checkerList.find(checker => checker === item.userId) ? 'primary' : 'default'"
|
|
@click="handleSelectChecker(item.userId)"
|
|
>
|
|
{{item.name}}
|
|
</van-button>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<!-- 其他信息 -->
|
|
<div class="bg-white mt-3">
|
|
<div class="text-gray-500 p-4 font-semibold">其他信息</div>
|
|
<!-- 申请类型 -->
|
|
<!-- 普通票据申请 -->
|
|
<div v-show="data.isInvoice">
|
|
<van-field
|
|
v-model="data.applyType"
|
|
is-link
|
|
readonly
|
|
label="申请类型"
|
|
placeholder="请选择申请类型"
|
|
@click="data.showType = true"
|
|
required
|
|
input-align="right"
|
|
/>
|
|
<van-popup v-model:show="data.showType" round position="bottom">
|
|
<van-cascader
|
|
:options="data.applyTypeOptions"
|
|
@close="data.showType = false"
|
|
@finish="finishApplyType"
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
<!-- 所属项目 -->
|
|
<van-field
|
|
v-model="data.projectName"
|
|
is-link
|
|
readonly
|
|
label="所属项目"
|
|
placeholder="请选择所属项目"
|
|
required
|
|
input-align="right"
|
|
disabled
|
|
/>
|
|
<van-popup v-model:show="data.projectName" round position="bottom">
|
|
<van-cascader
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
<!-- 所属任务的 -->
|
|
<van-field
|
|
v-model="data.taskName"
|
|
is-link
|
|
readonly
|
|
label="所属任务"
|
|
placeholder="请选择所属任务"
|
|
required
|
|
input-align="right"
|
|
disabled
|
|
/>
|
|
<van-popup v-model:show="data.taskName" round position="bottom">
|
|
<van-cascader
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
<!-- 类目选择 -->
|
|
<van-field
|
|
v-model="data.applyCategory"
|
|
is-link
|
|
readonly
|
|
label="类目"
|
|
placeholder="请选择类目"
|
|
@click="data.showCategory = true"
|
|
input-align="right"
|
|
/>
|
|
<van-popup v-model:show="data.showCategory" round position="bottom">
|
|
<van-cascader
|
|
:options="data.applyCategoryOptions"
|
|
@close="data.showCategory = false"
|
|
@finish="finishApplyCategory"
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
<!-- 名目选择 -->
|
|
<van-field
|
|
v-model="data.applyName"
|
|
is-link
|
|
readonly
|
|
label="名目"
|
|
placeholder="请选择名目"
|
|
@click="data.showName = true"
|
|
input-align="right"
|
|
/>
|
|
<van-popup v-model:show="data.showName" round position="bottom">
|
|
<van-cascader
|
|
:options="data.applyNameOptions"
|
|
@close="data.showName = false"
|
|
@finish="finishApplyName"
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
</div>
|
|
<!-- 个人手动申请 -->
|
|
<div v-show="!data.isInvoice">
|
|
<div class="pl-2">
|
|
<van-cell title="单元格" is-link :value="data.personalType" required/>
|
|
<van-cell title="单元格" is-link :value="data.personalCategory" required/>
|
|
</div>
|
|
|
|
</div>
|
|
</div>
|
|
<!-- 提交人信息 -->
|
|
<div class="bg-white mt-3">
|
|
<div class="text-gray-500 p-4 font-semibold">提交人信息</div>
|
|
<van-field
|
|
required
|
|
v-model="data.name"
|
|
label="姓名"
|
|
placeholder="输入姓名"
|
|
input-align="right"
|
|
/>
|
|
<!-- 选择所属部门 -->
|
|
<van-field
|
|
v-model="data.applyDepartment"
|
|
is-link
|
|
readonly
|
|
label="所属部门"
|
|
placeholder="请选择所属部门"
|
|
@click="data.showDepartment = true"
|
|
required
|
|
input-align="right"
|
|
/>
|
|
<van-popup v-model:show="data.showDepartment" round position="bottom">
|
|
<van-cascader
|
|
:options="data.applyDepartmentOptions"
|
|
@close="data.showDepartment = false"
|
|
@finish="finishApplyDepartment"
|
|
active-color="#1989fa"
|
|
class="p-0"
|
|
/>
|
|
</van-popup>
|
|
</div>
|
|
<!-- 历史申请 -->
|
|
<div class="bg-white mt-3 p-4">
|
|
<div class="text-gray-500 font-semibold">历史申请</div>
|
|
<div>
|
|
<Search />
|
|
<FinanceManage />
|
|
</div>
|
|
</div>
|
|
<!-- 底部立即提交按钮 -->
|
|
<NuxtLink to="/application-details">
|
|
<div class="mx-6 mt-10">
|
|
<van-button type="primary" block>立即提交</van-button>
|
|
</div>
|
|
</NuxtLink>
|
|
|
|
</div>
|
|
</template>
|
|
<script setup>
|
|
import {ref, reactive} from 'vue'
|
|
// import useApplication from 'hooks/useApplication';
|
|
import { queryChecker } from 'apis/member'
|
|
import { queryType } from 'apis/finance'
|
|
|
|
// const getApplication = useApplication();
|
|
const projectName = useProjectName()
|
|
const taskName = useTaskName()
|
|
const projectId = useProjectId()
|
|
const data = reactive({
|
|
isInvoice: true,
|
|
message: '',
|
|
billList: [
|
|
{
|
|
name: '发票代码',
|
|
values:0
|
|
},
|
|
{
|
|
name: '发票号码',
|
|
values:1
|
|
},
|
|
{
|
|
name: '合计金额(元)',
|
|
values:2
|
|
},
|
|
{
|
|
name: '税额(元)',
|
|
values:3
|
|
},
|
|
{
|
|
name: '开票日期',
|
|
values:4
|
|
}
|
|
],
|
|
reviewerList: [], // 审核人数组
|
|
checkerList: [], // 默认的审核人
|
|
applyData: [
|
|
{
|
|
applicant:'代用名1',
|
|
money:100,
|
|
time:'2021/12/31 12:31',
|
|
type: 1
|
|
},
|
|
{
|
|
applicant:'代用名2',
|
|
money:100,
|
|
time:'2021/12/31 12:31',
|
|
type: 2
|
|
},
|
|
], // 申请的记录
|
|
isSuccess: false, // 上传票据是否成功
|
|
name: '', // 提交人的姓名
|
|
pplyMoney: '5000', // 手动输入时输入的申请的金额
|
|
titleHidden: true, // 上传提示语隐藏
|
|
currentPage: 0, // 当前显示页数
|
|
personalType: '个人申请', // 上传提示语隐藏
|
|
personalCategory: '用款',
|
|
// 其他信息的多个选择按钮
|
|
showType: false, // 申请类型的
|
|
applyProject: '', // 选择的类型的值
|
|
applyTypeOptions: [],
|
|
showCategory: false, // 所属的类目
|
|
applyCategory: '', // 选择的类目的值
|
|
applyCategoryOptions: [],
|
|
showName: false, // 所属的名目
|
|
applyName: '', // 选择的名目的值
|
|
applyNameOptions: [],
|
|
showDepartment: false, // 所属的部门
|
|
applyDepartment: '', // 选择的部门的值
|
|
applyDepartmentOptions: [],
|
|
})
|
|
|
|
// 选择申请类型
|
|
function finishApplyType({ selectedOptions }){
|
|
showType.value = false;
|
|
applyType.value = selectedOptions.map((option) => option.text);
|
|
}
|
|
|
|
// 所属的类目
|
|
function finishApplyCategory({ selectedOptions }){
|
|
showCategory.value = false;
|
|
applyCategory.value = selectedOptions.map((option) => option.text);
|
|
}
|
|
|
|
// 所属的名目
|
|
function finishApplyName({ selectedOptions }){
|
|
showName.value = false;
|
|
applyName.value = selectedOptions.map((option) => option.text);
|
|
}
|
|
|
|
// 所属部门
|
|
function finishApplyDepartment({ selectedOptions }){
|
|
showDepartment.value = false;
|
|
applyDepartment.value = selectedOptions.map((option) => option.text);
|
|
}
|
|
|
|
// 检查被选中的审核人的状态
|
|
function handleSelectChecker(id){
|
|
const target = data.checkerList.find(item =>item === id)
|
|
if(target){
|
|
data.checkerList = data.checkerList.filter(item =>item !== id)
|
|
}else{
|
|
data.checkerList.push(id)
|
|
}
|
|
}
|
|
|
|
// 上传票据事件
|
|
function uploadBill(){
|
|
//TODO:调取接口识别票据
|
|
setTimeout(() =>{
|
|
titleHidden.value = false
|
|
isSuccess.value = true
|
|
},1000)
|
|
}
|
|
|
|
/**
|
|
* 查询所有成员
|
|
* @param { String } projectId
|
|
*/
|
|
async function handleQueryChecker(){
|
|
try {
|
|
const params = {
|
|
param:{
|
|
projectId: projectId.value
|
|
}
|
|
}
|
|
const res = await queryChecker(params)
|
|
data.reviewerList = res
|
|
} catch (error) {
|
|
console.error('error: ', error);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 查询费用申请类型
|
|
* @param { String } parentId 上级类型ID,默认为0
|
|
* @param { Number } type 类型:0申请类型 1类目 2名目
|
|
*/
|
|
async function handleQueryType(parentId, type){
|
|
try {
|
|
const params = {
|
|
param:{
|
|
parentId,
|
|
type,
|
|
}
|
|
}
|
|
const res = await queryType(params)
|
|
res.forEach((item) => {
|
|
data.applyTypeOptions.push(item.name)
|
|
})
|
|
} catch (error) {
|
|
console.error('error: ', error);
|
|
}
|
|
}
|
|
|
|
onMounted(() =>{
|
|
// 查询所有成员
|
|
handleQueryChecker()
|
|
// 查询费用申请类型
|
|
handleQueryType(0, 0)
|
|
})
|
|
|
|
</script>
|
|
|
|
<style lang="less" scoped>
|
|
.van-cell-group{
|
|
padding:0 1rem;
|
|
}
|
|
.van-cell{
|
|
font-size: 15px;
|
|
}
|
|
.bill-name{
|
|
font-weight: 600;
|
|
color: #6F6F6F;
|
|
border-bottom: 1px solid #eee;
|
|
padding: 0.75rem 0px;
|
|
}
|
|
.van-button{
|
|
border-radius: 0.2rem;
|
|
}
|
|
.button{
|
|
border-radius: 1rem;
|
|
padding: 0 0.75rem;
|
|
margin: 0.5rem ;
|
|
}
|
|
</style>
|
|
|