Browse Source

费用管理,财务报销

ZaiZai 2 years ago
parent
commit
6ba6f3bb9c

+ 8 - 0
src/api/modules/expense/finReimburse.js

@@ -25,6 +25,14 @@ export default {
             params: form
             params: form
         }, msg);
         }, msg);
     },
     },
+    //财务报销草稿箱编辑详情
+    async draftDetail(form, msg = false) {
+        return httpApi({
+            url: '/api/blade-control/expense/financial/draft/detail',
+            method: 'get',
+            params: form
+        }, msg);
+    },
     //财务报销信息提交
     //财务报销信息提交
     async submit(form, msg = false) {
     async submit(form, msg = false) {
         return httpApi({
         return httpApi({

+ 11 - 1
src/api/modules/system/parameter.js

@@ -19,9 +19,19 @@ export const getParentList = (form, msg = true) => httpApi({
     method: 'get',
     method: 'get',
     params: form
     params: form
 }, msg);
 }, msg);
+
 //子列表
 //子列表
 export const getChildList = (form, msg = true) => httpApi({
 export const getChildList = (form, msg = true) => httpApi({
     url: '/api/blade-control/dictinfo/child-list',
     url: '/api/blade-control/dictinfo/child-list',
     method: 'get',
     method: 'get',
     params: form
     params: form
-}, msg);
+}, msg);
+
+//字典数据查询接口
+export const getDictInfo = (code, msg = false) => httpApi({
+    url: '/api/blade-control/dictinfo/get-dict-info',
+    method: 'get',
+    params: {
+        code
+    }
+}, msg);

+ 9 - 10
src/views/expense/finReimburse/index.vue

@@ -79,7 +79,7 @@ import {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 {getArrValue} from "js-fast-way";
 import {getArrValue} from "js-fast-way";
-import {getChildList} from "~api/system/parameter";
+import {getDictInfo} from "~api/system/parameter";
 import {delMessage} from "~uti/tools";
 import {delMessage} from "~uti/tools";
 
 
 const router = useRouter()
 const router = useRouter()
@@ -98,9 +98,7 @@ const getApi = () => {
 
 
 //测试查字典
 //测试查字典
 const getChildListApi = () => {
 const getChildListApi = () => {
-    getChildList({
-        code: 'expense_fr_type'
-    })
+    getDictInfo('expense_fr_type')
 }
 }
 
 
 //项目类型
 //项目类型
@@ -173,7 +171,7 @@ const getTableData = async () => {
 const rowNameTap = ({id}) => {
 const rowNameTap = ({id}) => {
     router.push({
     router.push({
         name: 'expense-finReimburse-record',
         name: 'expense-finReimburse-record',
-        query: {id: id}
+        query: {id: id, type: 'view'}
     })
     })
 }
 }
 
 
@@ -196,7 +194,8 @@ const rowCancel = async (row) => {
 //新增预算
 //新增预算
 const addRowClick = () => {
 const addRowClick = () => {
     router.push({
     router.push({
-        name: 'expense-finReimburse-record'
+        name: 'expense-finReimburse-record',
+        query: {type: 'add'}
     })
     })
 }
 }
 
 
@@ -235,18 +234,18 @@ const getDraftNum = async () => {
 }
 }
 
 
 //继续编辑
 //继续编辑
-const editDraftClick = ({id}) => {
+const editDraftClick = ({emdraftIds}) => {
     router.push({
     router.push({
         name: 'expense-finReimburse-record',
         name: 'expense-finReimburse-record',
-        query: {id: id}
+        query: {id: emdraftIds, type: 'draft'}
     })
     })
 }
 }
 
 
 //删除草稿
 //删除草稿
-const delDraftClick = (row) => {
+const delDraftClick = ({groupId}) => {
     delMessage(async () => {
     delMessage(async () => {
         const {error, code, msg} = await mainApi.remove({
         const {error, code, msg} = await mainApi.remove({
-            id: row.id
+            id: groupId
         })
         })
         //判断状态
         //判断状态
         if (!error && code === 200) {
         if (!error && code === 200) {

+ 172 - 52
src/views/expense/finReimburse/record.vue

@@ -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: '财务'},