财务条
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.
 
 
 

525 lines
14 KiB

<template>
<div>
<!-- 导航返回上一页 -->
<van-nav-bar title="发起申请" left-arrow @click-left="onClickLeft" />
<!-- 申请发票需要输入的数据 -->
<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.invoiceInfo"
required
v-model="item.values"
:label="item.name"
@change="cahngeInvoiceList($event, item)"
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.remark"
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-picker
title="申请类型"
:columns="data.applyTypeOptions"
@confirm="finishApplyType"
/>
</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-picker
title="请选择类目"
:columns="data.applyCategoryOptions"
@confirm="finishApplyCategory"
/>
</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-picker
title="请选择名目"
:columns="data.applyNameOptions"
@confirm="finishApplyName"
/>
</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.submitName"
label="姓名"
placeholder="请输入姓名"
input-align="right"
/>
<!-- 选择所属部门 -->
<van-field
required
v-model="data.department"
label="所属部门"
placeholder="请输入所属部门"
input-align="right"
/>
</div>
<!-- 历史申请 -->
<div class="bg-white mt-3 p-4">
<div class="text-gray-500 font-semibold">历史申请</div>
<div>
<Search />
<FinanceExamine />
</div>
</div>
<!-- 底部立即提交按钮 -->
<div class="mx-6 mt-10">
<van-button type="primary" size="small" block>立即提交</van-button>
</div>
</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,
remark: '',
invoiceList: [],
invoiceInfo: [
{
name: '发票代码',
values: 0,
label: 'invoiceCode',
},
{
name: '发票号码',
values: 1,
label: 'invoiceNumber',
},
{
name: '合计金额(元)',
values: 2,
label: 'money',
},
{
name: '税额(元)',
values: 3,
label: 'taxMoney',
},
{
name: '开票日期',
values: 4,
label: 'invoiceTime',
},
{
name: '发票备注信息',
values: 5,
label: 'remark',
},
],
reviewerList: [], // 审核人数组
checkerList: [], // 默认的审核人
isSuccess: false, // 上传票据是否成功
submitName: '', // 提交人的姓名
department: '', // 选择的部门的值
pplyMoney: '5000', // 手动输入时输入的申请的金额
titleHidden: true, // 上传提示语隐藏
currentPage: 0, // 当前显示页数
personalType: '个人申请', // 上传提示语隐藏
personalCategory: '用款',
// 其他信息的多个选择按钮
showType: false, // 申请类型的
applyTypes: [],
applyTypeOptions: [],
applyType: '', // 选择的类型的值
typeId: '',
showCategory: false, // 所属的类目
applyCategories: [],
applyCategoryOptions: [],
applyCategory: '', // 选择的类目的值
categoryId: '',
showName: false, // 所属的名目
applyNames: [],
applyNameOptions: [],
applyName: '', // 选择的名目的值
rowId: '',
});
// 发票信息
function cahngeInvoiceList(e, item) {
console.log('e: ', e.target.value, item);
}
// 选择申请类型
function finishApplyType(e) {
data.showType = false;
data.applyType = e;
const type = data.applyTypes.find(option => option.name === e);
data.typeId = type.id;
// 类目
handleQueryType(data.typeId, 1);
}
// 所属的类目
function finishApplyCategory(e) {
data.showCategory = false;
data.applyCategory = e;
const category = data.applyCategories.find(option => option.name === e);
data.categoryId = category.id;
// 名目
handleQueryType(data.categoryId, 2);
}
// 所属的名目
function finishApplyName(e) {
data.showName = false;
data.applyName = e;
const row = data.applyNames.find(option => option.name === e);
data.rowId = row.id;
}
// 检查被选中的审核人的状态
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(() => {
data.titleHidden = false;
data.isSuccess = 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) {
console.log('parentId: ', parentId);
try {
const params = {
param: {
parentId,
type,
},
};
const res = await queryType(params);
if (type === 0) {
data.applyTypes = res;
res.forEach(item => {
data.applyTypeOptions.push(item.name);
});
}
if (type === 1) {
data.applyCategories = res;
res.forEach(item => {
data.applyCategoryOptions.push(item.name);
});
}
if (type === 2) {
data.applyNames = res;
res.forEach(item => {
data.applyNameOptions.push(item.name);
});
}
} catch (error) {
console.error('error: ', error);
}
}
onMounted(() => {
// 查询所有成员
handleQueryChecker();
// 查询费用申请类型
handleQueryType(0, 0);
});
/**
* 发起申请
* @param { Object } params
*/
async function submit(params) {
try {
if(!verification()) return
const params = {}
params.param = setParams()
await apply(params)
Toast.success('申请成功');
} catch (error) {
console.log('error: ', error);
Toast.fail(error || '申请失败');
}
}
// 验证必填
function verification(){
const { isSuccess, categoryId, checkerList, department, money, rowId, submitName, typeId, isInvoice } = data
if(!isSuccess && isInvoice){
Toast.fail('请上传票据凭证');
return
}
if(!money && !isInvoice){
Toast.fail('请输入金额');
return
}
if(!checkerList || !checkerList.length){
Toast.fail('请选择审核人');
return
}
if(!typeId){
Toast.fail('请选择申请类型');
return
}
if(!categoryId){
Toast.fail('请选择类目');
return
}
if(!rowId && isInvoice){
Toast.fail('请选择名目');
return
}
if(!submitName){
Toast.fail('请输入提交人姓名');
return
}
if(!department){
Toast.fail('请输入所属部门');
return
}
return true
}
// 设置参数
function setParams(){
const { remark, money, categoryId, checkerList, department, rowId, submitName, typeId, invoiceInfo, isInvoice } = data
let param = {}
let invoiceList = []
let list = {url: 'https://cdn.nlark.com/yuque/0/2022/png/413990/1642482454748-931b2e93-8964-492b-b06b-b8db42733c02.png'}
let totleMoney = 0
invoiceInfo.forEach(item => {
list[item.label] = item.value
if(item.label === 'money'){
totleMoney += item.value - 0
}
})
invoiceList.push(list)
if(isInvoice){
param = {
money: totleMoney * 100,invoiceList, remark, checkerList, typeId, projectId: projectId.value,
taskDetailId: taskDetailId.value, categoryId, rowId, submitName, department
}
}else{
param = {
money: money * 100, remark, checkerList, typeId, projectId: projectId.value, categoryId, submitName, department
}
}
return param
}
</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>