Browse Source

发起申请

apply
song 4 years ago
parent
commit
dfb457d11d
  1. 9
      apis/axios.js
  2. 20
      apis/finance.js
  3. 8
      apis/member.js
  4. 23
      apis/projectFinance.js
  5. 36
      app.vue
  6. 38
      components/FinanceExamine.vue
  7. 9
      components/FinanceManage.vue
  8. 8
      composables/state.ts
  9. 33
      hooks/useApplication.js
  10. 444
      pages/Initiate-application.vue
  11. 18
      pages/applicant.vue
  12. 4
      plugins/vant.js

9
apis/axios.js

@ -1,7 +1,7 @@
import Axios from 'axios'; import Axios from 'axios';
import { Toast } from 'vant'; import { Toast } from 'vant';
// import store from 'store';
import { createApp } from 'vue'; import { createApp } from 'vue';
import { useToken } from '../composables/state'
const app = createApp(); const app = createApp();
app.use(Toast); app.use(Toast);
@ -13,12 +13,13 @@ const instance = Axios.create({
timeout: 20000, timeout: 20000,
}); });
// request // request
instance.interceptors.request.use( instance.interceptors.request.use(
config => { config => {
const token = sessionStorage.getItem('token') || ''; const token = useToken()
if (token) { if (token.value) {
config.headers.Authorization = `Bearer ${token}`; config.headers.Authorization = `Bearer ${token.value}`;
} }
// config.headers.deviceId = store.state.systemInfo.deviceId; // config.headers.deviceId = store.state.systemInfo.deviceId;
config.headers.deviceId = '1'; config.headers.deviceId = '1';

20
apis/finance.js

@ -3,7 +3,6 @@ import http from 'apis/axios';
const apiUrl = import.meta.env.VITE_API_URL; const apiUrl = import.meta.env.VITE_API_URL;
const ptccsens = `${apiUrl}/ptccsens/v1.0`; const ptccsens = `${apiUrl}/ptccsens/v1.0`;
const finance = `${ptccsens}/finance`; const finance = `${ptccsens}/finance`;
const projectFinance = `${ptccsens}/projectFinance`;
// 发起申请 // 发起申请
export const apply = params => http.post(`${finance}/apply`, params); export const apply = params => http.post(`${finance}/apply`, params);
@ -17,21 +16,8 @@ export const getApplyDetail = params => http.post(`${finance}/getApplyDetail`, p
// 通过任务id查看任务关联的财务信息 // 通过任务id查看任务关联的财务信息
export const getByTask = params => http.post(`${finance}/getByTask`, params); export const getByTask = params => http.post(`${finance}/getByTask`, params);
// 查看当前用户的费用申请历史信息(奖金)
export const personalHistory = params => http.post(`${finance}/personalHistory`, params);
// 查询费用申请类型 // 查询费用申请类型
export const queryType = params => http.post(`${finance}/queryType`, params); export const queryType = params => http.post(`${finance}/queryType`, params);
// 追加预算
export const addBudget = params => http.post(`${projectFinance}/addBudget`, params);
// 查看项目下的财务信息
export const queryFinanceOfProject = params => http.post(`${projectFinance}/queryFinanceOfProject`, params);
// 查看项目下的所有任务对应的财务信息
export const queryProjectFinance = params => http.post(`${projectFinance}/queryProjectFinance`, params);
// 修改任务或项目的预算和奖金信息
export const updateFinance = params => http.post(`${projectFinance}/updateFinance`, params);
// 查看自己需要审批的申请
export const queryNeedCheckByMe = params => http.post(`${projectFinance}/queryNeedCheckByMe`, params);

8
apis/member.js

@ -0,0 +1,8 @@
import http from 'apis/axios';
const apiUrl = import.meta.env.VITE_API_URL;
const ptccsens = `${apiUrl}/ptccsens/v1.0`;
const member = `${ptccsens}/member`;
// 查询所有成员
export const queryChecker = params => http.post(`${member}/queryChecker`, params);

23
apis/projectFinance.js

@ -0,0 +1,23 @@
import http from 'apis/axios';
const apiUrl = import.meta.env.VITE_API_URL;
const ptccsens = `${apiUrl}/ptccsens/v1.0`;
const projectFinance = `${ptccsens}/projectFinance`;
// 追加预算
export const addBudget = params => http.post(`${projectFinance}/addBudget`, params);
// 查看所有的费用申请
export const queryAllMoneyApply = params => http.post(`${projectFinance}/queryAllMoneyApply`, params);
// 查看项目下的财务信息
export const queryFinanceOfProject = params => http.post(`${projectFinance}/queryFinanceOfProject`, params);
// 查看自己需要审批的申请
export const queryNeedCheckByMe = params => http.post(`${projectFinance}/queryNeedCheckByMe`, params);
// 查看项目下的所有任务对应的财务信息
export const queryProjectFinance = params => http.post(`${projectFinance}/queryProjectFinance`, params);
// 修改任务或项目的预算和奖金信息
export const updateFinance = params => http.post(`${projectFinance}/updateFinance`, params);

36
app.vue

@ -5,49 +5,25 @@
<script setup> <script setup>
import { reactive } from 'vue'; import { reactive } from 'vue';
import { useRouter } from 'vue-router'; import { useRouter } from 'vue-router';
import { getToken } from 'apis/index'
const router = useRouter(); const router = useRouter();
const token = useToken()
const user = useUser() const user = useUser()
const userId = useUserId() const userId = useUserId()
const projectId = useProjectId() const projectId = useProjectId()
const taskId = useTaskId() const taskId = useTaskId()
const projectName = useProjectName()
const taskName = useTaskName()
// //
const routeValue = router.currentRoute.value; const routeValue = router.currentRoute.value;
console.log('routeValue: ', routeValue); console.log('routeValue: ', routeValue);
token.value = routeValue && routeValue.query && routeValue.query.token ? routeValue.query.token : '';
userId.value = routeValue && routeValue.query && routeValue.query.userId ? routeValue.query.userId : ''; userId.value = routeValue && routeValue.query && routeValue.query.userId ? routeValue.query.userId : '';
projectId.value = routeValue && routeValue.query && routeValue.query.projectId ? routeValue.query.projectId : ''; projectId.value = routeValue && routeValue.query && routeValue.query.projectId ? routeValue.query.projectId : '';
taskId.value = routeValue && routeValue.query && routeValue.query.id ? routeValue.query.id : ''; taskId.value = routeValue && routeValue.query && routeValue.query.id ? routeValue.query.id : '';
projectName.value = routeValue && routeValue.query && routeValue.query.pn ? routeValue.query.pn : '';
taskName.value = routeValue && routeValue.query && routeValue.query.tn ? routeValue.query.tn : '';
// const userString = sessionStorage.getItem('user') || null;
// if (userString) {
// const userInfo = JSON.parse(userString);
// user.value = userInfo;
// } else {
getTokenByUserId(userId.value)
// }
/**
* 根据userId获取token级user信息
* @param {*} param
* @param {string} userId 用户id
*/
async function getTokenByUserId(userId) {
try {
const data = await getToken(userId);
user.value = data || null;
console.log('data: ', data);
if (data) {
sessionStorage.setItem('token', data.token);
sessionStorage.setItem('user', JSON.stringify(data));
} else {
sessionStorage.removeItem('token');
sessionStorage.removeItem('user');
}
} catch (error) {
console.error('error: ', error);
}
}
</script> </script>

38
components/FinanceExamine.vue

@ -14,15 +14,9 @@
<td>{{dayjs(item.submitTime - 0).format('YYYY-MM-DD')}}</td> <td>{{dayjs(item.submitTime - 0).format('YYYY-MM-DD')}}</td>
<td> <td>
<div v-if="!item.applyType" class="flex flex-row justify-between"> <div v-if="!item.applyType" class="flex flex-row justify-between">
<!-- <van-popover v-model:show="showPopover">
<div>侧司法所</div>
<template #reference>
<van-button type="success" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">通过</van-button>
<van-button type="danger" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">驳回</van-button>
</template>
</van-popover> -->
<van-button type="success" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">通过</van-button> <van-button type="success" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">通过</van-button>
<van-button type="danger" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 1)">驳回</van-button> <van-button type="danger" size="mini" class="rounded" @click="showRemark(item.financeCheckId, 2)">驳回</van-button>
</div> </div>
<div class="text-center" v-else :class="item.applyType === 1 ? 'text-blue-500' : 'text-red-500'">{{ item.applyType === 1 ? '已完成' : '已驳回' }}</div> <div class="text-center" v-else :class="item.applyType === 1 ? 'text-blue-500' : 'text-red-500'">{{ item.applyType === 1 ? '已完成' : '已驳回' }}</div>
</td> </td>
@ -34,12 +28,17 @@
</div> </div>
</div> </div>
<van-empty v-else description="暂无数据" /> <van-empty v-else description="暂无数据" />
<van-dialog v-model:show="data.show" title="备注" show-cancel-button @confirm="handleAudit">
<van-field :border="data.border" v-model="data.remark" type="textarea" class="remark" placeholder="请输入备注" />
</van-dialog>
</template> </template>
<script setup> <script setup>
import dayjs from "dayjs"; import dayjs from "dayjs";
import {ref, reactive, onMounted, nextTick} from'vue'; import {ref, reactive, onMounted, nextTick} from'vue';
import { queryNeedCheckByMe, audit } from 'apis/finance'; import { audit } from 'apis/finance';
import { queryNeedCheckByMe } from 'apis/projectFinance';
import { Toast } from 'vant'; import { Toast } from 'vant';
const data = reactive({ const data = reactive({
@ -47,7 +46,10 @@ const data = reactive({
pageNum: 1, pageNum: 1,
pageSize: 10, pageSize: 10,
pages: 0, pages: 0,
showPopover: false, show: false,
remark: '',
auditInfo: {},
border: true
}) })
const taskId = useTaskId() const taskId = useTaskId()
@ -85,7 +87,8 @@ onMounted(() => {
// //
function showRemark(financeCheckId, checkStatus){ function showRemark(financeCheckId, checkStatus){
data.showPopover = true data.show = true
data.auditInfo = { financeCheckId, checkStatus }
} }
/** /**
@ -96,16 +99,19 @@ function showRemark(financeCheckId, checkStatus){
*/ */
async function handleAudit(financeCheckId, checkStatus){ async function handleAudit(financeCheckId, checkStatus){
try { try {
const { auditInfo, remark } = data
const { financeCheckId, checkStatus } = data.auditInfo
const params = { const params = {
param:{ param:{
financeCheckId, financeCheckId,
checkStatus, checkStatus,
remark: '' remark: data.remark
} }
} }
// const res = await audit(params) await audit(params)
Toast('审批成功'); Toast('审批成功');
handleFinanceOfProject() handleFinanceOfProject()
data.remark = ''
} catch (error) { } catch (error) {
console.error('error: ', error); console.error('error: ', error);
} }
@ -126,4 +132,10 @@ table{
border-bottom: 1px solid #ccc border-bottom: 1px solid #ccc
} }
.remark{
border: 1px solid #ccc;
border-radius: 4px;
margin: 5%;
width: 90%;
}
</style> </style>

9
components/FinanceManage.vue

@ -33,7 +33,7 @@
</template> </template>
<script setup> <script setup>
import { queryProjectFinance, updateFinance } from 'apis/finance' import { queryProjectFinance, updateFinance } from 'apis/projectFinance'
import {ref, reactive, onMounted, nextTick} from'vue' import {ref, reactive, onMounted, nextTick} from'vue'
const data = reactive({ const data = reactive({
@ -48,11 +48,7 @@ const projectId = useProjectId()
/** /**
* 查看项目下的所有任务对应的财务信息 * 查看项目下的所有任务对应的财务信息
* @param { * @param { Number } pageNum
*
Number } pageNum
* @param { Number } pageSize * @param { Number } pageSize
* @param { String } projectId * @param { String } projectId
* @param { String } name * @param { String } name
@ -84,7 +80,6 @@ async function handleProjectFinance(){
* @param { String } taskFinanceId 任务财务信息id * @param { String } taskFinanceId 任务财务信息id
*/ */
async function handleUpdateFinance(item){ async function handleUpdateFinance(item){
console.log('item: ', item);
try { try {
const params = { const params = {
param:{ param:{

8
composables/state.ts

@ -19,3 +19,11 @@ export const useUser = () => {
export const useTaskId = () => { export const useTaskId = () => {
return useState('taskId', () => null); return useState('taskId', () => null);
}; };
export const useProjectName = () => {
return useState('projectName', () => null);
};
export const useTaskName = () => {
return useState('taskName', () => null);
};

33
hooks/useApplication.js

@ -0,0 +1,33 @@
import { queryChecker } from 'apis/member'
import { ref } from 'vue'
export default function useApplication() {
const projectId = useProjectId()
const reviewerList = ref([])
/**
* 查询所有成员
* @param { String } projectId
*/
async function handleQueryChecker(){
try {
const params = {
param:{
projectId: projectId.value
}
}
const res = await queryChecker(params)
reviewerList.value = res
} catch (error) {
console.error('error: ', error);
}
}
// handleQueryChecker()
return {
handleQueryChecker,
reviewerList,
};
}

444
pages/Initiate-application.vue

@ -11,37 +11,37 @@
<div class="bg-white pb-3"> <div class="bg-white pb-3">
<div class="text-gray-500 px-4 py-3 font-semibold">发票信息</div> <div class="text-gray-500 px-4 py-3 font-semibold">发票信息</div>
<!-- 是否上传票据 --> <!-- 是否上传票据 -->
<div v-show="isInvoice"> <div v-show="data.isInvoice">
<div class="mx-4 pb-3 border-b"> <div class="mx-4 pb-3 border-b">
<div class="flex pt-3 pb-2 justify-between" v-show="titleHidden"> <div class="flex pt-3 pb-2 justify-between" v-show="data.titleHidden">
<div> <div>
<span class="text-red-500">*</span> <span class="text-red-500">*</span>
<span class="text-gray-500">上传票据凭证 </span> <span class="text-gray-500">上传票据凭证 </span>
<span class="text-gray-400 text-xs">(仅支持ipg格式)</span> <span class="text-gray-400 text-xs">(仅支持ipg格式)</span>
</div> </div>
<van-button plain type="primary" size="mini" @click="isInvoice = false">手动输入</van-button> <van-button plain type="primary" size="mini" @click="data.isInvoice = false">手动输入</van-button>
</div> </div>
<div class="text-center border-b w-52 h-24 bg-gray-100 border-dashed border-2" @click="uploadBill" v-show="!isSuccess"> <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-xl pt-3">+</p>
<p class="text-gray-400 text-xs">上传并识别凭证</p> <p class="text-gray-400 text-xs">上传并识别凭证</p>
</div> </div>
<!-- 上传票据成功后显示发票信息 --> <!-- 上传票据成功后显示发票信息 -->
<div v-show="isSuccess"> <div v-show="data.isSuccess">
<van-field <van-field
v-for="item in billList" v-for="item in data.billList"
required required
v-model="item.values" v-model="item.values"
:label=item.name :label="item.name"
input-align="right" input-align="right"
/> />
</div> </div>
</div> </div>
</div > </div >
<!-- 手动输入信息 --> <!-- 手动输入信息 -->
<div v-show="!isInvoice"> <div v-show="!data.isInvoice">
<van-field <van-field
required required
v-model="applyMoney" v-model="data.applyMoney"
label="申请金额" label="申请金额"
placeholder="输入申请金额" placeholder="输入申请金额"
input-align="right" input-align="right"
@ -51,7 +51,7 @@
<div class="text-gray-500 py-4 pl-5">备注</div> <div class="text-gray-500 py-4 pl-5">备注</div>
<van-cell-group> <van-cell-group>
<van-field <van-field
v-model="message" v-model="data.message"
rows="2" rows="2"
autosize autosize
type="textarea" type="textarea"
@ -73,11 +73,12 @@
<van-button <van-button
class="button" class="button"
size="mini" size="mini"
v-for="item in reviewerList" v-for="item in data.reviewerList"
:type="selected.find(checker => checker === item) ? 'primary' : 'default'" :key="item.userId"
@click="handleSelectChecker(item)" :type="data.checkerList.find(checker => checker === item.userId) ? 'primary' : 'default'"
@click="handleSelectChecker(item.userId)"
> >
{{item}} {{item.name}}
</van-button> </van-button>
</div> </div>
</div> </div>
@ -87,21 +88,21 @@
<div class="text-gray-500 p-4 font-semibold">其他信息</div> <div class="text-gray-500 p-4 font-semibold">其他信息</div>
<!-- 申请类型 --> <!-- 申请类型 -->
<!-- 普通票据申请 --> <!-- 普通票据申请 -->
<div v-show="isInvoice"> <div v-show="data.isInvoice">
<van-field <van-field
v-model="applyType" v-model="data.applyType"
is-link is-link
readonly readonly
label="申请类型" label="申请类型"
placeholder="请选择申请类型" placeholder="请选择申请类型"
@click="showType = true" @click="data.showType = true"
required required
input-align="right" input-align="right"
/> />
<van-popup v-model:show="showType" round position="bottom"> <van-popup v-model:show="data.showType" round position="bottom">
<van-cascader <van-cascader
:options="applyTypeOptions" :options="data.applyTypeOptions"
@close="showType = false" @close="data.showType = false"
@finish="finishApplyType" @finish="finishApplyType"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
@ -109,59 +110,52 @@
</van-popup> </van-popup>
<!-- 所属项目 --> <!-- 所属项目 -->
<van-field <van-field
v-model="applyProject" v-model="data.projectName"
is-link is-link
readonly readonly
label="所属项目" label="所属项目"
placeholder="请选择所属项目" placeholder="请选择所属项目"
@click="showProject = true"
required required
input-align="right" input-align="right"
disabled
/> />
<van-popup v-model:show="showProject" round position="bottom"> <van-popup v-model:show="data.projectName" round position="bottom">
<van-cascader <van-cascader
:options="applyProjectOptions"
@close="showProject = false"
@finish="finishApplyProject"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
/> />
</van-popup> </van-popup>
<!-- 所属任务的 --> <!-- 所属任务的 -->
<van-field <van-field
v-model="applyTask" v-model="data.taskName"
is-link is-link
readonly readonly
label="所属任务" label="所属任务"
placeholder="请选择所属任务" placeholder="请选择所属任务"
@click="showTask = true"
required required
input-align="right" input-align="right"
disabled
/> />
<van-popup v-model:show="showTask" round position="bottom"> <van-popup v-model:show="data.taskName" round position="bottom">
<van-cascader <van-cascader
:options="applyTaskOptions"
@close="showTask = false"
@finish="finishApplyTask"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
/> />
</van-popup> </van-popup>
<!-- 类目选择 --> <!-- 类目选择 -->
<van-field <van-field
v-model="applyCategory" v-model="data.applyCategory"
is-link is-link
readonly readonly
label="类目" label="类目"
placeholder="请选择类目" placeholder="请选择类目"
@click="showCategory = true" @click="data.showCategory = true"
required
input-align="right" input-align="right"
/> />
<van-popup v-model:show="showCategory" round position="bottom"> <van-popup v-model:show="data.showCategory" round position="bottom">
<van-cascader <van-cascader
:options="applyCategoryOptions" :options="data.applyCategoryOptions"
@close="showCategory = false" @close="data.showCategory = false"
@finish="finishApplyCategory" @finish="finishApplyCategory"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
@ -169,19 +163,18 @@
</van-popup> </van-popup>
<!-- 名目选择 --> <!-- 名目选择 -->
<van-field <van-field
v-model="applyName" v-model="data.applyName"
is-link is-link
readonly readonly
label="类目" label="名目"
placeholder="请选择类目" placeholder="请选择名目"
@click="showName = true" @click="data.showName = true"
required
input-align="right" input-align="right"
/> />
<van-popup v-model:show="showName" round position="bottom"> <van-popup v-model:show="data.showName" round position="bottom">
<van-cascader <van-cascader
:options="applyNameOptions" :options="data.applyNameOptions"
@close="showName = false" @close="data.showName = false"
@finish="finishApplyName" @finish="finishApplyName"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
@ -189,10 +182,10 @@
</van-popup> </van-popup>
</div> </div>
<!-- 个人手动申请 --> <!-- 个人手动申请 -->
<div v-show="!isInvoice"> <div v-show="!data.isInvoice">
<div class="pl-2"> <div class="pl-2">
<van-cell title="单元格" is-link :value="personalType" required/> <van-cell title="单元格" is-link :value="data.personalType" required/>
<van-cell title="单元格" is-link :value="personalCategory" required/> <van-cell title="单元格" is-link :value="data.personalCategory" required/>
</div> </div>
</div> </div>
@ -202,26 +195,26 @@
<div class="text-gray-500 p-4 font-semibold">提交人信息</div> <div class="text-gray-500 p-4 font-semibold">提交人信息</div>
<van-field <van-field
required required
v-model="name" v-model="data.name"
label="姓名" label="姓名"
placeholder="输入姓名" placeholder="输入姓名"
input-align="right" input-align="right"
/> />
<!-- 选择所属部门 --> <!-- 选择所属部门 -->
<van-field <van-field
v-model="applyDepartment" v-model="data.applyDepartment"
is-link is-link
readonly readonly
label="所属部门" label="所属部门"
placeholder="请选择所属部门" placeholder="请选择所属部门"
@click="showDepartment = true" @click="data.showDepartment = true"
required required
input-align="right" input-align="right"
/> />
<van-popup v-model:show="showDepartment" round position="bottom"> <van-popup v-model:show="data.showDepartment" round position="bottom">
<van-cascader <van-cascader
:options="applyDepartmentOptions" :options="data.applyDepartmentOptions"
@close="showDepartment = false" @close="data.showDepartment = false"
@finish="finishApplyDepartment" @finish="finishApplyDepartment"
active-color="#1989fa" active-color="#1989fa"
class="p-0" class="p-0"
@ -231,13 +224,10 @@
<!-- 历史申请 --> <!-- 历史申请 -->
<div class="bg-white mt-3 p-4"> <div class="bg-white mt-3 p-4">
<div class="text-gray-500 font-semibold">历史申请</div> <div class="text-gray-500 font-semibold">历史申请</div>
<div v-if="showHistory"> <div>
<Search /> <Search />
<FinanceManage /> <FinanceManage />
</div> </div>
<div v-if="!showHistory" class="no-data">
暂无历史记录
</div>
</div> </div>
<!-- 底部立即提交按钮 --> <!-- 底部立即提交按钮 -->
<NuxtLink to="/application-details"> <NuxtLink to="/application-details">
@ -249,213 +239,112 @@
</div> </div>
</template> </template>
<script setup> <script setup>
import {ref} from 'vue' import {ref, reactive} from 'vue'
const isInvoice = ref(true); // // import useApplication from 'hooks/useApplication';
const message = ref(''); // import { queryChecker } from 'apis/member'
const billList = ref([ import { queryType } from 'apis/finance'
{
name: '发票代码',
values:0
},
{
name: '发票号码',
values:1
},
{
name: '合计金额(元)',
values:2
},
{
name: '税额(元)',
values:3
},
{
name: '开票日期',
values:4
}
]) //
const reviewerList = ref(['冯教授','周亮','李洪明','夏红','麦琪其','薇薇安','卫老师']); //
const selected = ref(['冯教授']); //
const showHistory = ref(true); //
const applyData = ref([
{
applicant:'代用名1',
money:100,
time:'2021/12/31 12:31',
type: 1
},
{
applicant:'代用名2',
money:100,
time:'2021/12/31 12:31',
type: 2
},
{
applicant:'代用名1',
money:100,
time:'2021/12/31 12:31',
type: 3
},
{
applicant:'代用名2',
money:100,
time:'2021/12/31 12:31',
type: 3
},
{
applicant:'代用名1',
money:100,
time:'2021/12/31 12:31',
type: 1
},
{
applicant:'代用名2',
money:100,
time:'2021/12/31 12:31',
type: 2
}
]); //
const isSuccess = ref(false) //
const name = ref('') //
const applyMoney = ref(5000) //
const titleHidden = ref(true) //
const currentPage = ref(0) //
const personalType = ref('个人申请')
const personalCategory = ref('用款')
// // const getApplication = useApplication();
// const projectName = useProjectName()
const showType = ref(false); const taskName = useTaskName()
const applyProject = ref(''); // const projectId = useProjectId()
const applyTypeOptions = [ const data = reactive({
{ isInvoice: true,
text: '项目申请', message: '',
value: '330000', billList: [
}, {
{ name: '发票代码',
text: '日常申请', values:0
value: '320000', },
} {
]; name: '发票号码',
function finishApplyType({ selectedOptions }){ values:1
showType.value = false; },
applyType.value = selectedOptions.map((option) => option.text); {
} name: '合计金额(元)',
// values:2
const showProject = ref(false); },
const applyType = ref(''); // {
const applyProjectOptions = [ name: '税额(元)',
{ values:3
text: '项目一', },
value: '330000', {
}, name: '开票日期',
{ values:4
text: '项目二',
value: '320000',
},
{
text: '项目三',
value: '310000',
}
];
function finishApplyProject({ selectedOptions }){
showProject.value = false;
applyProject.value = selectedOptions.map((option) => option.text);
} }
],
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: [],
})
// //
const showTask = ref(false); function finishApplyType({ selectedOptions }){
const applyTask = ref(''); // showType.value = false;
const applyTaskOptions = [ applyType.value = selectedOptions.map((option) => option.text);
{ }
text: '任务一',
value: '330000',
},
{
text: '任务二',
value: '320000',
},
{
text: '任务三',
value: '310000',
}
];
function finishApplyTask({ selectedOptions }){
showTask.value = false;
applyTask.value = selectedOptions.map((option) => option.text);
}
//
const showCategory = ref(false);
const applyCategory = ref(''); //
const applyCategoryOptions = [
{
text: '报销',
value: '330000',
},
{
text: '奖金',
value: '320000',
},
];
function finishApplyCategory({ selectedOptions }){
showCategory.value = false;
applyCategory.value = selectedOptions.map((option) => option.text);
}
// //
const showName = ref(false); function finishApplyCategory({ selectedOptions }){
const applyName = ref(''); // showCategory.value = false;
const applyNameOptions = [ applyCategory.value = selectedOptions.map((option) => option.text);
{ }
text: '办公费',
value: '330000',
},
{
text: '车辆费用',
value: '320000',
},
{
text: '差旅费',
value: '310000',
}
];
function finishApplyName({ selectedOptions }){
showName.value = false;
applyName.value = selectedOptions.map((option) => option.text);
}
// //
const showDepartment = ref(false); function finishApplyName({ selectedOptions }){
const applyDepartment = ref(''); // showName.value = false;
const applyDepartmentOptions = [ applyName.value = selectedOptions.map((option) => option.text);
{ }
text: '软件部',
value: '330000',
},
{
text: '硬件部',
value: '320000',
},
{
text: '人事部',
value: '310000',
}
];
function finishApplyDepartment({ selectedOptions }){
showDepartment.value = false;
applyDepartment.value = selectedOptions.map((option) => option.text);
}
//
function finishApplyDepartment({ selectedOptions }){
showDepartment.value = false;
applyDepartment.value = selectedOptions.map((option) => option.text);
}
// //
function handleSelectChecker(items){ function handleSelectChecker(id){
const target = selected.value.find(item =>item === items) const target = data.checkerList.find(item =>item === id)
if(target){ if(target){
selected.value = selected.value.filter(item =>item !== items) data.checkerList = data.checkerList.filter(item =>item !== id)
}else{ }else{
selected.value.push(items) data.checkerList.push(id)
} }
} }
// //
function uploadBill(){ function uploadBill(){
//TODO: //TODO:
@ -465,6 +354,53 @@ function uploadBill(){
},1000) },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> </script>
<style lang="less" scoped> <style lang="less" scoped>

18
pages/applicant.vue

@ -9,7 +9,7 @@
<!-- 搜索框与表格部分 --> <!-- 搜索框与表格部分 -->
<van-tabs v-model:active="active" shrink line-width="60px" color="#59B4FF" title-active-color="#59B4FF"> <van-tabs v-model:active="active" shrink line-width="60px" color="#59B4FF" title-active-color="#59B4FF">
<van-tab title="我的申请"> <van-tab title="我的申请">
<div class="mt-8 bg-white"> <div class="mt-8 bg-white flex flex-col">
<div class="p-4 pb-0 text-gray-500 font-semibold">历史申请</div> <div class="p-4 pb-0 text-gray-500 font-semibold">历史申请</div>
<Search class="px-4 pt-0"/> <Search class="px-4 pt-0"/>
<FinanceManage class="px-4 mt-0"/> <FinanceManage class="px-4 mt-0"/>
@ -26,14 +26,11 @@
</div> --> </div> -->
<!-- 底部提交按钮部分 --> <!-- 底部提交按钮部分 -->
<div class="mt-20"> <div class="mt-20" @click="toApplication">
<NuxtLink to="/Initiate-application"> <van-button type="primary" block>发起申请</van-button>
<van-button type="primary" block>发起申请</van-button>
</NuxtLink>
</div> </div>
</van-tab> </van-tab>
<van-tab title="我的奖金"> <van-tab title="我的奖金">
<div class="mt-8 bg-white"> <div class="mt-8 bg-white">
<div class="p-4 pb-0 text-gray-500 font-semibold">奖金领取记录</div> <div class="p-4 pb-0 text-gray-500 font-semibold">奖金领取记录</div>
@ -63,6 +60,9 @@
<script setup> <script setup>
import {ref} from 'vue' import {ref} from 'vue'
import { useRouter } from 'vue-router';
const router = useRouter();
const active = ref(0); const active = ref(0);
const isShow = ref(true); const isShow = ref(true);
@ -72,6 +72,12 @@ function onClickLeft(){
console.log('返回上一页') console.log('返回上一页')
} }
function toApplication() {
const routeValue = router.currentRoute.value;
const query = routeValue.query
router.push({path: '/Initiate-application', query})
}
</script> </script>

4
plugins/vant.js

@ -21,7 +21,8 @@ import {
Cascader, Cascader,
Circle, Circle,
Empty, Empty,
Popover Popover,
Dialog
} from 'vant'; } from 'vant';
import { defineNuxtPlugin } from '#app'; import { defineNuxtPlugin } from '#app';
@ -48,4 +49,5 @@ export default defineNuxtPlugin(nuxtApp => {
.use(Tabs) .use(Tabs)
.use(Empty) .use(Empty)
.use(Popover) .use(Popover)
.use(Dialog)
}); });

Loading…
Cancel
Save