|
@@ -1,16 +1,16 @@
|
|
<template>
|
|
<template>
|
|
<HcCard>
|
|
<HcCard>
|
|
<template #header>
|
|
<template #header>
|
|
- <div class="hc-expense-total-title">报销总额(元):1520</div>
|
|
|
|
|
|
+ <div class="hc-expense-total-title">报销总额(元):{{totalFrMoney}}</div>
|
|
</template>
|
|
</template>
|
|
<div class="hac-expense-record-body">
|
|
<div class="hac-expense-record-body">
|
|
<div class="record-form-box">
|
|
<div class="record-form-box">
|
|
<el-scrollbar>
|
|
<el-scrollbar>
|
|
- <HcCardItem :title="'报销明细' + (index + 1)" v-for="(item, index) in detailsArr" ui="hac-bg-grey mb-5">
|
|
|
|
- <el-form ref="formRef" :model="formModel" :rules="formRules" label-position="left" label-width="auto" size="large">
|
|
|
|
|
|
+ <HcCardItem :title="'报销明细' + (index + 1)" v-for="(item, index) in detailsData.details" ui="hac-bg-grey mb-5">
|
|
|
|
+ <el-form ref="formRef" :model="item" :rules="formRules" label-position="left" label-width="auto" size="large">
|
|
<div class="hc-form-item">
|
|
<div class="hc-form-item">
|
|
- <el-form-item label="所属项目:" prop="key1">
|
|
|
|
- <el-select block v-model="formModel.key1">
|
|
|
|
|
|
+ <el-form-item label="所属项目:" prop="projectId">
|
|
|
|
+ <el-select block v-model="item.projectId">
|
|
<el-option v-for="item in projectData" :label="item.name" :value="item.id"/>
|
|
<el-option v-for="item in projectData" :label="item.name" :value="item.id"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -22,62 +22,68 @@
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
<div class="hc-form-item">
|
|
<div class="hc-form-item">
|
|
- <el-form-item label="报销金额(元):" prop="key2">
|
|
|
|
- <el-input v-model="formModel.key2" placeholder="请输入报销金额" />
|
|
|
|
|
|
+ <el-form-item label="报销金额(元):" prop="frMoney">
|
|
|
|
+ <el-input v-model="item.frMoney" placeholder="请输入报销金额" />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="费用发生日期:" prop="key3">
|
|
|
|
- <el-date-picker type="date" class="block" v-model="formModel.key3" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
|
|
|
|
|
|
+ <el-form-item label="费用发生日期:" prop="frDate">
|
|
|
|
+ <el-date-picker type="date" class="block" v-model="item.frDate" format="YYYY-MM-DD" value-format="YYYY-MM-DD"/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
- <el-form-item label="费用类型:" prop="key4">
|
|
|
|
- <el-select block v-model="formModel.key4">
|
|
|
|
- <el-option label="选项1" value="选项1"/>
|
|
|
|
- <el-option label="选项2" value="选项2"/>
|
|
|
|
|
|
+ <el-form-item label="费用类型:" prop="frType">
|
|
|
|
+ <el-select block v-model="item.frType">
|
|
|
|
+ <el-option label="暂无接口1" value="1"/>
|
|
|
|
+ <el-option label="暂无接口2" value="2"/>
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</div>
|
|
</div>
|
|
<el-form-item label="费用说明:">
|
|
<el-form-item label="费用说明:">
|
|
<el-input type="textarea"
|
|
<el-input type="textarea"
|
|
- v-model="formModel.key5"
|
|
|
|
|
|
+ v-model="item.frDesc"
|
|
:autosize="{ minRows: 3, maxRows: 5 }"
|
|
:autosize="{ minRows: 3, maxRows: 5 }"
|
|
placeholder="请输入费用说明"
|
|
placeholder="请输入费用说明"
|
|
/>
|
|
/>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="电子发票:">
|
|
<el-form-item label="电子发票:">
|
|
- <HcFormUpload :src="formModel.key6" @item="formInvoiceClick"/>
|
|
|
|
|
|
+ <HcFormUpload :src="item.frElectronicInvoiceUrl"
|
|
|
|
+ @upload="invoiceItemUpload(index)"
|
|
|
|
+ @change="invoiceItemChange($event, index)"
|
|
|
|
+ />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="附件文件:">
|
|
<el-form-item label="附件文件:">
|
|
- <HcFormUpload :src="formModel.key6" @item="formFileClick"/>
|
|
|
|
|
|
+ <HcFormUpload :src="item.frAttachmentUrl"
|
|
|
|
+ @upload="fileItemUpload(index)"
|
|
|
|
+ @change="fileItemChange($event, index)"
|
|
|
|
+ />
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
</HcCardItem>
|
|
</HcCardItem>
|
|
<div class="record-form-action-box mt-11">
|
|
<div class="record-form-action-box mt-11">
|
|
<el-divider content-position="right" border-style="dashed">
|
|
<el-divider content-position="right" border-style="dashed">
|
|
- <el-button type="primary" hc-btn @click="detailsArr.push({})">
|
|
|
|
|
|
+ <el-button type="primary" hc-btn>
|
|
<HcIcon name="add"/>
|
|
<HcIcon name="add"/>
|
|
<span>添加明细</span>
|
|
<span>添加明细</span>
|
|
</el-button>
|
|
</el-button>
|
|
</el-divider>
|
|
</el-divider>
|
|
- <el-form class="mt-16" inline :model="formInline" label-position="top">
|
|
|
|
|
|
+ <el-form class="mt-16" inline :model="detailsData" label-position="top">
|
|
<el-form-item label="归属人">
|
|
<el-form-item label="归属人">
|
|
- <el-select v-model="formInline.key1">
|
|
|
|
- <el-option label="选项1" value="1" />
|
|
|
|
- <el-option label="选项2" value="2" />
|
|
|
|
|
|
+ <el-select v-model="detailsData.userIdVesting">
|
|
|
|
+ <el-option label="暂无接口1" value="1" />
|
|
|
|
+ <el-option label="暂无接口2" value="2" />
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="是否抵消借款金额">
|
|
<el-form-item label="是否抵消借款金额">
|
|
- <el-select v-model="formInline.key2">
|
|
|
|
- <el-option label="是" value="1" />
|
|
|
|
- <el-option label="否" value="2" />
|
|
|
|
|
|
+ <el-select v-model="detailsData.isDeductLoan">
|
|
|
|
+ <el-option label="否" :value="0" />
|
|
|
|
+ <el-option label="是" :value="1" />
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="选择借款项">
|
|
<el-form-item label="选择借款项">
|
|
- <el-select v-model="formInline.key3">
|
|
|
|
- <el-option label="选项1" value="1" />
|
|
|
|
- <el-option label="选项2" value="2" />
|
|
|
|
|
|
+ <el-select v-model="detailsData.deductLoanId">
|
|
|
|
+ <el-option label="暂无接口1" value="1" />
|
|
|
|
+ <el-option label="暂无接口2" value="2" />
|
|
</el-select>
|
|
</el-select>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
<el-form-item label="冲抵后的实际报销金额">
|
|
<el-form-item label="冲抵后的实际报销金额">
|
|
- <el-input v-model="formInline.key2" disabled>
|
|
|
|
|
|
+ <el-input v-model="detailsData.frMoneyActual" disabled>
|
|
<template #append>元</template>
|
|
<template #append>元</template>
|
|
</el-input>
|
|
</el-input>
|
|
</el-form-item>
|
|
</el-form-item>
|
|
@@ -111,7 +117,12 @@
|
|
</div>
|
|
</div>
|
|
|
|
|
|
<!--上传控件-->
|
|
<!--上传控件-->
|
|
- <HcUploadFile ref="HcUploadFileRef" :options="uploadFileOptions" :echoParams="uploadEchoParams" @success="HcUploadFileSuccess"/>
|
|
|
|
|
|
+ <HcUploadFile ref="HcUploadFileRef"
|
|
|
|
+ :options="uploadFileOptions"
|
|
|
|
+ :echoParams="uploadEchoParams"
|
|
|
|
+ @item="HcUploadFileItem"
|
|
|
|
+ @success="HcUploadFileSuccess"
|
|
|
|
+ />
|
|
|
|
|
|
<!--关联预算计划-->
|
|
<!--关联预算计划-->
|
|
<HcDialog bgColor="#ffffff" isToBody isTable
|
|
<HcDialog bgColor="#ffffff" isToBody isTable
|
|
@@ -136,22 +147,30 @@ import {useRoute, useRouter} from 'vue-router'
|
|
import mainApi from "~api/expense/finReimburse";
|
|
import mainApi from "~api/expense/finReimburse";
|
|
import projectApi from "~api/project/project-list";
|
|
import projectApi from "~api/project/project-list";
|
|
import {getTokenHeader} from "~src/api/request/header";
|
|
import {getTokenHeader} from "~src/api/request/header";
|
|
-import {getArrValue} from "js-fast-way";
|
|
|
|
|
|
+import {getArrValue, getObjValue} from "js-fast-way";
|
|
|
|
|
|
const router = useRouter()
|
|
const router = useRouter()
|
|
const useRoutes = useRoute()
|
|
const useRoutes = useRoute()
|
|
|
|
|
|
const dataId = ref(useRoutes?.query?.id ?? '')
|
|
const dataId = ref(useRoutes?.query?.id ?? '')
|
|
|
|
+const dataType = ref(useRoutes?.query?.type ?? 'add') // add:新增 view:预览 draft:草稿
|
|
|
|
|
|
onActivated(() => {
|
|
onActivated(() => {
|
|
dataId.value = useRoutes?.query?.id ?? ''
|
|
dataId.value = useRoutes?.query?.id ?? ''
|
|
|
|
+ dataType.value = useRoutes?.query?.type ?? 'add'
|
|
getApi()
|
|
getApi()
|
|
})
|
|
})
|
|
|
|
|
|
const getApi = () => {
|
|
const getApi = () => {
|
|
getProjectData()
|
|
getProjectData()
|
|
- if (dataId.value > 0) {
|
|
|
|
|
|
+ if (dataId.value > 0 && dataType.value !== 'add') {
|
|
getDetailsData()
|
|
getDetailsData()
|
|
|
|
+ } else {
|
|
|
|
+ totalFrMoney.value = '0'
|
|
|
|
+ detailsData.value = {
|
|
|
|
+ ...detailsObj,
|
|
|
|
+ details: [detailsObj1]
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
@@ -170,29 +189,82 @@ const getProjectData = async () => {
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+//基础详情
|
|
|
|
+const detailsObj = {
|
|
|
|
+ frMoney: 0, // 报销金额
|
|
|
|
+ frMoneyActual: 0, // 实际报销金额
|
|
|
|
+ userIdVesting: null, // 归属人id
|
|
|
|
+ isDeductLoan: 0, // 是否抵扣借款 0=否 1=是
|
|
|
|
+ deductLoanId: null, // 借款信息id
|
|
|
|
+ approvalResultName: '', // 审批结果
|
|
|
|
+ approvalStatusName: '', // 审批状态
|
|
|
|
+ status: null, // 审批状态 0=未上报 1=待审批 2=已审批 3=已驳回
|
|
|
|
+ //details: [detailsObj1],
|
|
|
|
+}
|
|
|
|
+//明细
|
|
|
|
+const detailsObj1 = {
|
|
|
|
+ projectId: null, // 所属项目id
|
|
|
|
+ budgetPlanIds: '', // 预算计划ids
|
|
|
|
+ frMoney: 0, // 报销金额
|
|
|
|
+ frDate: null, // 报销时间
|
|
|
|
+ frDesc: '', // 费用说明
|
|
|
|
+ frType: null, // 报销类型
|
|
|
|
+ frElectronicInvoiceUrl: '', // 电子发票url地址
|
|
|
|
+ frAttachmentUrl: '', // 附件url地址
|
|
|
|
+}
|
|
|
|
+
|
|
//获取详情数据
|
|
//获取详情数据
|
|
-const detailsArr = ref([{}])
|
|
|
|
|
|
+const totalFrMoney = ref('')
|
|
|
|
+const detailsData = ref({})
|
|
|
|
+
|
|
const getDetailsData = async () => {
|
|
const getDetailsData = async () => {
|
|
- const {error, code, data} = await mainApi.detail({
|
|
|
|
- id: dataId.value
|
|
|
|
- })
|
|
|
|
- //判断状态
|
|
|
|
- console.log(data)
|
|
|
|
- if (!error && code === 200) {
|
|
|
|
|
|
+ if (dataType.value === 'view') {
|
|
|
|
+ //预览详情
|
|
|
|
+ let newDetails = {}, newDetails1 = {}
|
|
|
|
+ const {error, code, data, msg} = await mainApi.detail({
|
|
|
|
+ id: dataId.value
|
|
|
|
+ })
|
|
|
|
+ //判断状态
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
+ const res = getObjValue(data)
|
|
|
|
+ //基础数据
|
|
|
|
+ Object.keys(detailsObj).forEach(key => {
|
|
|
|
+ newDetails[key] = res[key]
|
|
|
|
+ })
|
|
|
|
+ //明细数据
|
|
|
|
+ Object.keys(detailsObj1).forEach(key => {
|
|
|
|
+ newDetails1[key] = res[key]
|
|
|
|
+ })
|
|
|
|
+ totalFrMoney.value = res?.frMoney
|
|
|
|
+ newDetails.details = [newDetails1]
|
|
|
|
+ } else {
|
|
|
|
+ newDetails = detailsObj
|
|
|
|
+ newDetails.details = [detailsObj1]
|
|
|
|
+ totalFrMoney.value = '0'
|
|
|
|
+ window.$message?.error(msg)
|
|
|
|
+ }
|
|
|
|
+ detailsData.value = newDetails
|
|
|
|
+ } else if (dataType.value === 'draft') {
|
|
|
|
+ //草稿详情
|
|
|
|
+ const {error, code, data} = await mainApi.draftDetail({
|
|
|
|
+ id: dataId.value
|
|
|
|
+ })
|
|
|
|
+ //判断状态
|
|
|
|
+ console.log(data)
|
|
|
|
+ if (!error && code === 200) {
|
|
|
|
|
|
- } else {
|
|
|
|
|
|
+ } else {
|
|
|
|
|
|
|
|
+ }
|
|
|
|
+ } else {
|
|
|
|
+ totalFrMoney.value = '0'
|
|
|
|
+ detailsData.value = {
|
|
|
|
+ ...detailsObj,
|
|
|
|
+ details: [detailsObj1]
|
|
|
|
+ }
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
-
|
|
|
|
-//上传配置
|
|
|
|
-const HcUploadFileRef = ref(null)
|
|
|
|
-const uploadEchoParams = ref({})
|
|
|
|
-const uploadFileOptions = {
|
|
|
|
- headers: getTokenHeader(),
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
//明细表单
|
|
//明细表单
|
|
const formRef = ref(null)
|
|
const formRef = ref(null)
|
|
const formModel = ref({
|
|
const formModel = ref({
|
|
@@ -228,22 +300,70 @@ const tableBudgetData = ref([
|
|
])
|
|
])
|
|
|
|
|
|
|
|
|
|
|
|
+//上传配置
|
|
|
|
+const HcUploadFileRef = ref(null)
|
|
|
|
+const uploadEchoParams = ref({})
|
|
|
|
+const uploadFileOptions = {
|
|
|
|
+ headers: getTokenHeader(),
|
|
|
|
+}
|
|
|
|
+
|
|
//电子发票
|
|
//电子发票
|
|
-const formInvoiceClick = () => {
|
|
|
|
|
|
+const invoiceItemUpload = (index) => {
|
|
|
|
+ uploadEchoParams.value = {
|
|
|
|
+ name: 'frElectronicInvoiceUrl',
|
|
|
|
+ index: index
|
|
|
|
+ }
|
|
HcUploadFileRef.value?.selectFile();
|
|
HcUploadFileRef.value?.selectFile();
|
|
}
|
|
}
|
|
|
|
+//文件列表改变事件
|
|
|
|
+const invoiceItemChange = (src, index) => {
|
|
|
|
+ const res = getObjValue(detailsData.value.details[index])
|
|
|
|
+ res.frElectronicInvoiceUrl = src
|
|
|
|
+}
|
|
|
|
|
|
-//附件
|
|
|
|
-const formFileClick = () => {
|
|
|
|
|
|
+//附件上传
|
|
|
|
+const fileItemUpload = (index) => {
|
|
|
|
+ uploadEchoParams.value = {
|
|
|
|
+ name: 'frAttachmentUrl',
|
|
|
|
+ index: index
|
|
|
|
+ }
|
|
HcUploadFileRef.value?.selectFile();
|
|
HcUploadFileRef.value?.selectFile();
|
|
}
|
|
}
|
|
|
|
+//文件列表改变事件
|
|
|
|
+const fileItemChange = (src, index) => {
|
|
|
|
+ const res = getObjValue(detailsData.value.details[index])
|
|
|
|
+ res.frAttachmentUrl = src
|
|
|
|
+}
|
|
|
|
|
|
//上传完成
|
|
//上传完成
|
|
-const HcUploadFileSuccess = (res) => {
|
|
|
|
|
|
+const HcUploadFileSuccess = ({echoParams, resData}) => {
|
|
|
|
+ setUploadFileData(echoParams, resData)
|
|
|
|
+}
|
|
|
|
|
|
|
|
+//使用某个文件
|
|
|
|
+const HcUploadFileItem = ({item}) => {
|
|
|
|
+ const {name, index} = uploadEchoParams.value, {pdfUrl} = item.resData
|
|
|
|
+ const urls = detailsData.value.details[index][name].split(',')
|
|
|
|
+ if (urls.indexOf(pdfUrl) === -1) {
|
|
|
|
+ setUploadFileData(uploadEchoParams.value, item.resData)
|
|
|
|
+ } else {
|
|
|
|
+ window.$message?.warning('文件已存在')
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
-const formInline = ref({})
|
|
|
|
|
|
+//设置上传后的数据
|
|
|
|
+const setUploadFileData = (echoParams, resData) => {
|
|
|
|
+ const {name, index} = echoParams, {pdfUrl} = resData
|
|
|
|
+ let url = detailsData.value.details[index][name]
|
|
|
|
+ if (url) {
|
|
|
|
+ url += `,${pdfUrl}`
|
|
|
|
+ } else {
|
|
|
|
+ url = pdfUrl
|
|
|
|
+ }
|
|
|
|
+ detailsData.value.details[index][name] = url
|
|
|
|
+}
|
|
|
|
+
|
|
|
|
+
|
|
const timeLineData = ref([
|
|
const timeLineData = ref([
|
|
{title: '审批人', section: '部门负责人'},
|
|
{title: '审批人', section: '部门负责人'},
|
|
{title: '财务审核', section: '财务'},
|
|
{title: '财务审核', section: '财务'},
|