浏览代码

收入分析

2545307760@qq.com 7 月之前
父节点
当前提交
2416084e63

+ 44 - 8
web/src/api/cost.js

@@ -57,38 +57,74 @@ export const queryProjectMonthFee = (month, year) => {
   })
 }
 
+// 查询项目费用类型列表
+export const projectCostTypeList = () => {
+  return service({
+    url: '/finance/queryProjectFeeGenre',
+    method: 'get'
+  })
+}
+
+// 新增项目费用类型
+export const addProjectCostType = (data) => {
+  return service({
+    url: '/finance/createProjectFeeGenre',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改项目费用类型
+export const putProjectCostType = (data) => {
+  return service({
+    url: '/finance/updateProjectFeeGenre',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除项目费用类型
+export const delProjectCostType = (data) => {
+  return service({
+    url: '/finance/deleteProjectFeeGenre',
+    method: 'delete',
+    data: data
+  })
+}
+
 // 查询项目费用列表
-export const queryProjectCost = (data) => {
+export const projectCostList = (data) => {
   return service({
     url: '/expenses/queryProjectFeeList',
     method: 'post',
-    data: data
+    data
   })
 }
 
 // 新增项目费用
-export const createProjectCost = (data) => {
+export const postProjectCost = (data) => {
   return service({
     url: '/expenses/createProjectFee',
     method: 'post',
-    data: data
+    data
   })
 }
 
 // 修改项目费用
-export const updateProjectCost = (data) => {
+export const putProjectCost = (data) => {
   return service({
     url: '/expenses/updateProjectFee',
     method: 'put',
-    data: data
+    data
   })
 }
 
 // 删除项目费用
-export const deleteProjectCost = (data) => {
+export const delProjectCost = (data) => {
   return service({
     url: '/expenses/deleteProjectFee',
     method: 'delete',
-    data: data
+    data
   })
 }
+

+ 2 - 2
web/src/pinia/cost/cost.js

@@ -1,11 +1,11 @@
 import { defineStore } from 'pinia'
 import { reactive, ref } from 'vue'
-import { queryProjectCost } from '@/api/cost'
+import { projectCostTypeList } from '@/api/cost'
 export const payData = defineStore('expenses', () => {
   const projectCostList = reactive([])
   const costListTotal = ref(0)
   const getCostList = (data) => {
-    queryProjectCost(data).then(res => {
+    projectCostTypeList(data).then(res => {
       if (res.data === 0) {
         console.log(res)
       }

+ 2 - 0
web/src/view/dashboard/index.vue

@@ -131,8 +131,10 @@ const xData = ref([])
 const queryData = async() => {
   await queryProjectSum().then(res => {
     projectSum.value = res.data
+    console.log(res.data)
     for (const key in projectSum.value) {
       xData.value.push(projectSum.value[key])
+      console.log(xData.value)
     }
   })
   await queryProjectMonthFee(monthData.value, yearData.value).then(res => {

+ 333 - 18
web/src/view/finance/financeAnalysis/components/projectPay.vue

@@ -66,25 +66,25 @@
           </el-form-item>
           <el-form-item label="项目:">
             <el-select
-              v-model="projectSelect"
+              v-model="condition.projectCode"
               placeholder="请选择项目"
               clearable
               @clear="clearProject"
             >
               <el-option
                 v-for="item in projectList"
-                :key="item.ID"
+                :key="item.code"
                 :label="item.name"
-                :value="item.ID"
+                :value="item.code"
               />
             </el-select>
           </el-form-item>
           <el-form-item label="类型:">
             <el-select
-              v-model="costSelect"
-              placeholder="请选择类型"
+              v-model="costTypeSelect"
+              placeholder="请选择费用类型"
               clearable
-              @clear="clearCost"
+              @clear="clearCostType"
             >
               <el-option
                 v-for="item in costTypeList"
@@ -240,17 +240,298 @@
         </el-table>
       </el-col>
     </el-row>
+    <el-drawer
+      v-model="drawerShow"
+      :title="drawerTitle"
+      width="40%"
+    >
+      <el-form
+        label-width="90"
+        label-position="left"
+        size="large"
+      >
+        <el-form-item label="人员:">
+          <el-select
+            v-model="drawerData.reimburser"
+            placeholder="请选择人员名称"
+            @change="changePeople"
+          >
+            <el-option
+              v-for="item in userList"
+              :key="item.ID"
+              :label="item.nickName"
+              :value="item.ID"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="部门:">
+          <el-select
+            v-model="drawerData.departmentId"
+            disabled
+            placeholder="请选择部门"
+          >
+            <el-option
+              v-for="item in departmentList"
+              :key="item.ID"
+              :label="item.name"
+              :value="item.ID"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="支入金额:">
+          <el-input-number
+            v-model="drawerData.depositAmount"
+          />
+        </el-form-item>
+        <el-form-item label="支出金额:">
+          <el-input-number
+            v-model="drawerData.expenditureAmount"
+          />
+        </el-form-item>
+        <el-form-item label="时间:">
+          <el-date-picker
+            v-model="drawerData.feeTime"
+            type="date"
+            placeholder="请选择日期"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+          />
+        </el-form-item>
+        <el-form-item label="费用类型:">
+          <el-select
+            v-model="drawerData.genre"
+            placeholder="请选择费用类型"
+          >
+            <el-option
+              v-for="item in costTypeList"
+              :key="item.ID"
+              :label="item.name"
+              :value="item.ID"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="项目:">
+          <el-select
+            v-model="drawerData.projectCode"
+            placeholder="请选择项目"
+          >
+            <el-option
+              v-for="item in projectList"
+              :key="item.code"
+              :label="item.name"
+              :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注:">
+          <el-input
+            v-model="drawerData.remarks"
+            placeholder="请填写费用备注"
+          />
+        </el-form-item>
+        <el-form-item label="费用明细:">
+          <el-input
+            v-model="drawerData.expenseDetail"
+            type="textarea"
+            :rows="8"
+            :maxlength="400"
+            show-word-limit
+            placeholder="请填写费用明细"
+          />
+        </el-form-item>
+        <el-form-item label="余额:">
+          <el-input-number
+            v-model="drawerData.thenBalance"
+          />
+        </el-form-item>
+      </el-form>
+      <el-row
+        style="margin-top: 50px"
+        justify="end"
+      >
+        <el-button
+          type="primary"
+          size="large"
+          @click="changeCostList"
+        >确认</el-button>
+      </el-row>
+    </el-drawer>
+    <el-dialog
+      v-model="costTypePopup"
+      title="费用类型"
+      width="40%"
+    >
+      <el-form>
+        <el-form-item
+          label="编辑类型:"
+          size="large"
+        >
+          <el-input
+            v-model="changeTypeValue"
+            style="width: 550px"
+            placeholder="请输入费用类型"
+          >
+            <template #prepend>
+              <el-select
+                v-model="changeTypeSelect"
+                placeholder="请选择费用类型"
+                clearable
+                style="width: 140px"
+                @clear="clearTypeSelect"
+              >
+                <el-option
+                  v-for="item in costTypeList"
+                  :key="item.ID"
+                  :label="item.name"
+                  :value="item.ID"
+                />
+              </el-select>
+            </template>
+            <template #append>
+              <el-button @click="deleteCostType">删除</el-button>
+            </template>
+          </el-input>
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button
+            type="primary"
+            @click="editCostType"
+          >
+            确认
+          </el-button>
+        </div>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { reactive, ref } from 'vue'
+import { reactive, ref, onMounted } from 'vue'
 import { payData } from '@/pinia/cost/cost'
+import { getDepByStart } from '@/api/department'
+import { projectCostTypeList, delProjectCostType } from '@/api/cost'
+import { ElMessage, ElMessageBox } from 'element-plus'
+import { getAllUsers } from '@/api/user'
+import { getAllProject } from '@/api/project'
+
 defineOptions({
   name: 'ProjectPay'
 })
+onMounted(() => {
+  // 查询部门
+  queryDepartmentList()
+  // 查询项目费用类型
+  queryProjectCostType()
+  // 查询人员列表
+  getUserList()
+  // 查询项目列表
+  queryProjectList()
+})
+// 项目费用类型
+const costTypeList = reactive([])
+const costTypeSelect = ref('')
+const costTypePopup = ref(false)
+const clearCostType = () => {
+  costTypeSelect.value = ''
+  condition.genre = 0
+}
+const changeTypeValue = ref('')
+const changeTypeSelect = ref('')
+const clearTypeSelect = () => {
+  changeTypeSelect.value = ''
+}
+const deleteCostType = () => {
+  if (changeTypeSelect.value === '') {
+    ElMessage.error('请选择需要删除的费用类型')
+    return
+  }
+  ElMessageBox.confirm(
+    '确定进行删除该费用类型吗?',
+    '删除',
+    {
+      confirmButtonText: '确定',
+      cancelButtonText: '取消',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      const deleteId = {
+        id: changeTypeSelect.value
+      }
+      delProjectCostType(deleteId).then(res => {
+        if (res.code === 0) {
+          ElMessage.success('删除成功')
+          queryProjectCostType()
+          changeTypeValue.value = ''
+          changeTypeSelect.value = ''
+        }
+      })
+    })
+    .catch(() => {
+      ElMessage({
+        type: 'info',
+        message: '取消删除',
+      })
+    })
+}
+const queryProjectCostType = () => {
+  projectCostTypeList().then(res => {
+    if (res.code === 0) {
+      costTypeList.length = 0
+      costTypeList.push(...res.data)
+    }
+  })
+}
+// 部门
+const departmentList = reactive([])
+const queryDepartmentList = () => {
+  getDepByStart().then(res => {
+    if (res.code === 0) {
+      departmentList.length = 0
+      departmentList.push(...res.data)
+    }
+  })
+}
+
+// 抽屉新增编辑信息
+const drawerTitle = ref('新增项目费用项')
+const drawerShow = ref(false)
+const drawerData = reactive({
+  reimburser: 0,
+  departmentId: 0,
+  expenditureAmount: 0,
+  depositAmount: 0,
+  projectCode: '',
+  feeTime: '',
+  genre: 0,
+  expenseDetail: '',
+  remarks: '',
+  thenBalance: 0,
+})
+const drawerDataType = ref('add')
+const changeCostList = () => {
+  if (drawerDataType.value === 'add') {
+    for (const i in drawerData) {
+      if (drawerData[i] === '' || drawerData[i] === 0) {
+        ElMessage.error('请将信息填写完整')
+        return
+      }
+    }
+    // postProjectCost(drawerData).then(res => {
+    //   console.log(res)
+    //   if (res.code === 0) {
+    //     console.log(res.data)
+    //     ElMessage.success('新增成功')
+    //   }
+    // })
+  }
+}
+
 // 费用数据存储
 const costData = payData()
+
 // 搜索条件
 const condition = reactive({
   pageInfo: {
@@ -264,6 +545,7 @@ const condition = reactive({
   monthTime: '',
   yearTime: ''
 })
+
 // 时间搜索
 const timeTypeList = reactive([
   { label: '按日期查询', value: 'date' },
@@ -283,20 +565,21 @@ const changeTimeType = (value) => {
     condition.monthTime = ''
   }
 }
+
 // 项目搜索
 const projectList = reactive([])
-const projectSelect = ref('')
 const clearProject = () => {
-  projectSelect.value = ''
-  condition.projectId = 0
+  condition.projectCode = ''
 }
-// 费用类型
-const costTypeList = reactive([])
-const costSelect = ref('')
-const clearCost = () => {
-  costSelect.value = ''
-  condition.genre = 0
+const queryProjectList = () => {
+  getAllProject().then(res => {
+    if (res.code === 0) {
+      projectList.length = 0
+      projectList.push(...res.data)
+    }
+  })
 }
+
 // 人员搜索
 const peopleSelect = ref('')
 const userList = reactive([])
@@ -304,8 +587,23 @@ const clearPeopleSelect = () => {
   peopleSelect.value = ''
   condition.reimburser = 0
 }
-// 费用类型弹窗
-const costTypePopup = ref(false)
+const getUserList = () => {
+  getAllUsers().then(res => {
+    if (res.code === 0) {
+      userList.length = 0
+      userList.push(...res.data)
+      console.log('用户列表', res.data)
+    }
+  })
+}
+const changePeople = (val) => {
+  userList.forEach(item => {
+    if (val === item.ID) {
+      drawerData.departmentId = item.departmentId
+    }
+  })
+}
+
 // 查询费用列表
 const consultPayList = () => {
   costData.getCostList(condition)
@@ -315,7 +613,24 @@ const consultPayList = () => {
 const payListReset = () => {
 }
 
+// 添加项目费用
 const addDetailRecord = () => {
+  drawerTitle.value = '新增项目费用项'
+  drawerDataType.value = 'add'
+  const initialData = {
+    reimburser: userList[0].ID,
+    departmentId: userList[0].departmentId,
+    expenditureAmount: 0,
+    depositAmount: 0,
+    projectCode: projectList[0].code,
+    feeTime: '',
+    genre: costTypeList[0].ID,
+    expenseDetail: '',
+    remarks: '',
+    thenBalance: 0
+  }
+  Object.assign(drawerData, initialData)
+  drawerShow.value = true
 }
 
 const costEdit = (value) => {

+ 0 - 19
web/src/view/finance/financeAnalysis/financeAnalysis.vue

@@ -314,28 +314,10 @@ const projectList = (condition) => {
       listData.push(...list)
       symbol.changeCode(list[0].code)
       getMainMessage(list[0].code)
-      getReimburseList(list[0].ID)
     }
   })
 }
 
-const getReimburseList = (id) => {
-  const condition = {
-    pageInfo: {
-      page: 1,
-      pageSize: 8,
-    },
-    reimburser: 0,
-    projectId: id,
-    genre: 0,
-    dayTime: '',
-    monthTime: '',
-    yearTime: ''
-  }
-  peopleCost(condition).then(res => {
-    console.log(res)
-  })
-}
 const nameSearch = () => {
   condition.pageInfo.page = 1
   projectList(condition)
@@ -367,7 +349,6 @@ const hourOut = ref()
 const getMainMessage = (code) => {
   queryProjectExpense(code).then(res => {
     if (res.code === 0) {
-      console.log(res.data)
       const summaryData = res.data
       const sumList = summaryData.collection
       let sum = 0