Kaynağa Gözat

Merge remote-tracking branch 'origin/dev' into dev

# Conflicts:
#	web/.env.development
xuwenhao 8 ay önce
ebeveyn
işleme
e3d5d8fafe

+ 9 - 0
web/src/api/collection.js

@@ -33,3 +33,12 @@ export const deleteCollection = (data) => {
     data: data
   })
 }
+
+// 检索收款记录
+export const retrievalCollection = (data) => {
+  return service({
+    url: '/project/queryCollectionList',
+    method: 'POST',
+    data: data
+  })
+}

+ 9 - 0
web/src/api/project.js

@@ -90,3 +90,12 @@ export const deleteProjectState = (data) => {
     data: data
   })
 }
+
+// 查询项目的收支分析
+export const queryProjectExpense = (code) => {
+  return service({
+    url: '/finance/queryProjectFinance',
+    method: 'GET',
+    params: { code: code }
+  })
+}

+ 31 - 3
web/src/pinia/collection/Collection.js

@@ -1,13 +1,20 @@
 import { defineStore } from 'pinia'
-import { reactive } from 'vue'
-import { createCollection, deleteCollection, queryCollection, updateCollection } from '@/api/collection'
+import { reactive, ref } from 'vue'
+import { createCollection, deleteCollection, queryCollection, updateCollection, retrievalCollection } from '@/api/collection'
 import { formatDate } from '@/utils/formatDate'
 
 export const collectionOperate = defineStore('payment', () => {
   // 定义数据
   const paymentList = reactive([])
+  const paymentCode = ref('')
+  const paymentTotal = ref(0)
   // 定义修改数据的方法
   const getPaymentList = (code) => {
+    // retrievalCollection().then(res => {
+    //   if (res.code === 0) {
+    //
+    //   }
+    // })
     queryCollection(code).then(res => {
       if (res.code === 0) {
         const data = res.data
@@ -16,6 +23,7 @@ export const collectionOperate = defineStore('payment', () => {
         })
         paymentList.length = 0
         paymentList.push(...data)
+        console.log(paymentList)
       }
     })
   }
@@ -40,11 +48,31 @@ export const collectionOperate = defineStore('payment', () => {
       }
     })
   }
+  const changePaymentList = (list) => {
+    list.forEach(item => {
+      item.collectionTime = formatDate(item.collectionTime)
+    })
+    paymentList.length = 0
+    paymentList.push(...list)
+    paymentTotal.value = list.length
+  }
+  const changePaymentCode = (code) => {
+    paymentCode.value = code
+  }
+  const changePaymentTotal = (total) => {
+    paymentTotal.value = total
+  }
+
   return {
     paymentList,
+    paymentCode,
+    paymentTotal,
     getPaymentList,
     postCollection,
     putCollection,
-    delCollection
+    delCollection,
+    changePaymentList,
+    changePaymentCode,
+    changePaymentTotal
   }
 })

+ 6 - 1
web/src/pinia/hour/Hour.js

@@ -35,11 +35,16 @@ export const hourOperate = defineStore('time', () => {
       }
     })
   }
+  const changeTimeList = (list) => {
+    timeList.length = 0
+    timeList.push(...list)
+  }
   return {
     timeList,
     getTimeList,
     postTime,
     putTime,
-    delTime
+    delTime,
+    changeTimeList
   }
 })

+ 6 - 1
web/src/pinia/reimbursement/Reimbursement.js

@@ -36,11 +36,16 @@ export const reimburseOperate = defineStore('account', () => {
       }
     })
   }
+  const changeReimburseList = (list) => {
+    reimburseList.length = 0
+    reimburseList.push(...list)
+  }
   return {
     reimburseList,
     getReimburseList,
     postReimburse,
     putReimburse,
-    delReimburse
+    delReimburse,
+    changeReimburseList
   }
 })

+ 13 - 17
web/src/view/finance/components/hour.vue

@@ -1,22 +1,18 @@
 <template>
   <div>
-      <el-row>
-        <el-col :span="6">
-          <el-form-item
-              label="人员名称:"
-          >
-            <el-input
-                v-model="condition.name"
-                placeholder="请输入人员名称"
-            />
-          </el-form-item>
-        </el-col>
-      </el-row>
-      <el-row>
-        <el-table>
-          <el-table-column/>
-        </el-table>
-      </el-row>
+    <el-row>
+      <el-col :span="6">
+        <el-form-item
+          label="人员名称:"
+        >
+          <el-input
+            v-model="condition.name"
+            placeholder="请输入人员名称"
+          />
+        </el-form-item>
+      </el-col>
+    </el-row>
+    <el-row/>
   </div>
 </template>
 

+ 336 - 21
web/src/view/finance/components/payment.vue

@@ -1,53 +1,368 @@
 <template>
   <div>
     <el-row>
-      <el-col :span="6">
+      <el-col :span="8">
         <el-form-item
           label="收款日期:"
         >
           <el-date-picker
-            v-model="paymentTime"
-            type="date"
-            placeholder="请选择收款日期"
-            format="YYYY-MM-DD"
-            value-format="YYYY-MM-DD"
+            v-model="condition.time"
+            type="month"
+            placeholder="请选择收款月份"
+            format="YYYY-MM"
+            value-format="YYYY-MM"
           />
         </el-form-item>
       </el-col>
-      <el-col :span="3">
+      <el-col :span="2">
         <el-button
           type="primary"
           :icon="Search"
+          @click="searchCollection"
         >查询</el-button>
       </el-col>
+      <el-col
+        :span="2"
+        style="margin-left: 30px"
+      >
+        <el-button
+          type="primary"
+          :icon="Plus"
+          @click="paymentAddShow = true"
+        >
+          新增
+        </el-button>
+      </el-col>
     </el-row>
     <el-row>
-      <el-col :span="12">
-        <el-table v-model="pay.paymentList">
-          <el-table-column
-            label="收款时间"
-            prop="collectionTime"
+      <el-col :span="23">
+        <el-row>
+          <el-table
+            :data="pay.paymentList"
+            stripe
+          >
+            <el-table-column
+              label="收款时间"
+              prop="collectionTime"
+              align="center"
+              width="180px"
+            />
+            <el-table-column
+              label="收款金额(元)"
+              prop="price"
+              align="center"
+              width="250px"
+            />
+            <el-table-column
+              label="收款金额(元)"
+              prop="price"
+              align="center"
+              width="250px"
+            />
+            <el-table-column
+              label="操作"
+              align="center"
+            >
+              <template #default="scope">
+                <el-popover
+                  placement="top-start"
+                  title="收款备注"
+                  :width="200"
+                  trigger="click"
+                  :content="scope.row.remarks"
+                >
+                  <template #reference>
+                    <el-button
+                      text
+                      type="primary"
+                      :icon="Notebook"
+                    >
+                      备注
+                    </el-button>
+                  </template>
+                </el-popover>
+                <el-button
+                  text
+                  type="primary"
+                  :icon="Edit"
+                  @click="openPaymentEdit(scope.row)"
+                >
+                  编辑
+                </el-button>
+                <el-button
+                  text
+                  type="primary"
+                  :icon="Delete"
+                  @click="paymentDelete(scope.row)"
+                >
+                  删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-row>
+        <el-row justify="end">
+          <el-pagination
+            background
+            layout="prev, pager, next"
+            :page-size="8"
+            :total="pay.paymentTotal"
+            @change=""
           />
-          <el-table-column
-            label="收款金额"
-            prop="price"
-          />
-        </el-table>
+        </el-row>
       </el-col>
     </el-row>
+    <el-dialog
+      v-model="paymentEditShow"
+      title="收款编辑"
+      width="40%"
+    >
+      <el-form>
+        <el-form-item
+          label="收款金额:"
+          size="large"
+        >
+          <el-input
+            v-model="editAmount"
+            placeholder="请输入收款金额"
+            clearable
+            type="number"
+          />
+        </el-form-item>
+        <el-form-item
+          label="收款日期:"
+          size="large"
+        >
+          <el-date-picker
+            v-model="paymentEditData.collectionTime"
+            type="date"
+            placeholder="请选择收款日期"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item
+          label="收款备注:"
+          size="large"
+        >
+          <el-input
+            v-model="paymentEditData.remarks"
+            placeholder="请输入收款备注"
+            clearable
+            type="textarea"
+            maxlength="100"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button
+          type="primary"
+          size="large"
+          @click="paymentEdit"
+        >
+          确认
+        </el-button>
+      </template>
+    </el-dialog>
+    <el-dialog
+      v-model="paymentAddShow"
+      title="新增收款"
+      width="40%"
+    >
+      <el-form>
+        <el-form-item
+          label="收款金额:"
+          size="large"
+        >
+          <el-input
+            v-model="addAmount"
+            placeholder="请输入收款金额"
+            clearable
+            type="number"
+          />
+        </el-form-item>
+        <el-form-item
+          label="收款日期:"
+          size="large"
+        >
+          <el-date-picker
+            v-model="paymentAddData.collectionTime"
+            type="date"
+            placeholder="请选择收款日期"
+            format="YYYY-MM-DD"
+            value-format="YYYY-MM-DD"
+            clearable
+          />
+        </el-form-item>
+        <el-form-item
+          label="收款备注:"
+          size="large"
+        >
+          <el-input
+            v-model="paymentAddData.remarks"
+            placeholder="请输入收款备注(选填)"
+            clearable
+            type="textarea"
+            maxlength="100"
+            show-word-limit
+          />
+        </el-form-item>
+      </el-form>
+      <template #footer>
+        <el-button
+          type="primary"
+          size="large"
+          @click="paymentAdd"
+        >
+          确认
+        </el-button>
+      </template>
+    </el-dialog>
   </div>
 </template>
 
 <script setup>
-import { ref } from 'vue'
-import { Search } from '@element-plus/icons-vue'
+import { reactive, ref } from 'vue'
+import { Search, Delete, Edit, Notebook, Plus } from '@element-plus/icons-vue'
+import { retrievalCollection, updateCollection, deleteCollection, createCollection } from '@/api/collection'
 import { collectionOperate } from '@/pinia/collection/Collection'
+import { ElMessage, ElMessageBox } from 'element-plus'
 defineOptions({
   name: 'Payment'
 })
-const paymentTime = ref('')
 const pay = collectionOperate()
-console.log(pay.paymentList)
+// 数据
+const condition = reactive({
+  pageInfo: {
+    page: 1,
+    pageSize: 10
+  },
+  code: '',
+  time: ''
+})
+
+const paymentEditShow = ref(false)
+const paymentEditData = reactive({
+  id: 0,
+  projectCode: '',
+  price: 0,
+  remarks: '',
+  collectionTime: ''
+})
+const editAmount = ref('')
+
+const paymentAddShow = ref(false)
+
+const paymentAddData = reactive({
+  projectCode: '',
+  price: 0,
+  remarks: '',
+  collectionTime: ''
+})
+const addAmount = ref('')
+// 方法
+const openPaymentEdit = (row) => {
+  paymentEditShow.value = true
+  paymentEditData.projectCode = row.projectCode
+  paymentEditData.collectionTime = row.collectionTime
+  paymentAmount.value = row.price
+  paymentEditData.id = row.ID
+  paymentEditData.remarks = row.remarks
+}
+
+const paymentEdit = () => {
+  paymentEditData.price = parseFloat(paymentAmount.value)
+  updateCollection(paymentEditData).then(res => {
+    if (res.code === 0) {
+      ElMessage({
+        message: '编辑成功',
+        type: 'success',
+        showClose: true,
+        duration: 2000
+      })
+    }
+  })
+  paymentEditShow.value = false
+  pay.getPaymentList(paymentEditData.projectCode)
+}
+const paymentDelete = (row) => {
+  console.log(row)
+  ElMessageBox.confirm(
+    '确定要删除该收款记录吗?',
+    '删除记录',
+    {
+      confirmButtonText: '删除',
+      cancelButtonText: '取消',
+      type: 'warning',
+    }
+  )
+    .then(() => {
+      const id = { id: row.ID }
+      deleteCollection(id).then(res => {
+        console.log(res)
+        if (res.code === 0) {
+          ElMessage({
+            message: '删除成功',
+            type: 'success',
+            showClose: true,
+            duration: 2000
+          })
+          pay.getPaymentList(row.projectCode)
+        }
+      })
+    }).catch(() => {})
+}
+
+const searchCollection = () => {
+  condition.code = pay.paymentCode
+  retrievalCollection(condition).then(res => {
+    console.log(res.data)
+    if (res.code === 0) {
+      pay.changePaymentList(res.data.list)
+    }
+  })
+}
+
+const paymentAdd = () => {
+  const addData = paymentAddData
+  addData.price = addAmount.value.length === 0 ? 0 : parseFloat(addAmount.value)
+  addData.projectCode = pay.paymentCode
+  const summary = {
+    'price': '请输入收款金额',
+    'collectionTime': '请选择收款日期'
+  }
+  for (const item in addData) {
+    if (item === 'remarks') {
+      continue
+    }
+    if (addData[item] === '' || addData[item] === 0 || addData[item] === null) {
+      ElMessage({
+        message: summary[item],
+        type: 'error',
+        showClose: true,
+        duration: 2000
+      })
+      return
+    }
+  }
+  createCollection(addData).then(res => {
+    console.log(res)
+    if (res.code === 0) {
+      ElMessage({
+        message: '新增成功',
+        type: 'success',
+        showClose: true,
+        duration: 2000
+      })
+      addAmount.value = ''
+      paymentAddData.collectionTime = ''
+      pay.getPaymentList(pay.paymentCode)
+      paymentAddShow.value = false
+    }
+  })
+}
 
 </script>
 

+ 70 - 75
web/src/view/finance/financeAnalysis/financeAnalysis.vue

@@ -96,93 +96,82 @@
     </el-row>
     <el-row
       class="mt-5"
-      style="height: 150px"
-      justify="space-between"
+      style="height: 680px"
     >
       <el-col
-        :span="4"
+        :span="16"
         class="bg-white"
+        style="padding-left: 20px"
       >
-        <el-row
-          style="height: 100px"
-          align="middle"
-        >
-          <el-col
-            :span="13"
-            :offset="1"
-          >
-            <el-text>项目收款</el-text>
-          </el-col>
-          <el-col
-            :span="9"
-            class="flex justify-center"
-          >
-            <el-image
-              :src="iconCollection"
-              class="iconStyle"
-            />
-          </el-col>
-        </el-row>
-        <el-row
-          style="height: 50px"
-          align="middle"
-        >
-          <el-col
-            :span="4"
-            :offset="1"
-          >
-            <el-image
-              :src="iconAmount"
-              class="countIcon"
-            />
-          </el-col>
-        </el-row>
-      </el-col>
-      <el-col
-        :span="4"
-        class="bg-white"
-      />
-      <el-col
-        :span="4"
-        class="bg-white"
-      />
-      <el-col
-        :span="4"
-        class="bg-white"
-      />
-      <el-col
-        :span="4"
-        class="bg-white"
-      />
-    </el-row>
-    <el-row
-      class="bg-white mt-5"
-      style="height: 510px"
-    >
-      <el-col :span="20" class="ml-10">
         <el-tabs
-            v-model="listSort"
-            class="demo-tabs"
-            @tab-click="changeSort"
+          v-model="listSort"
+          class="demo-tabs"
+          @tab-click="changeSort"
         >
           <el-tab-pane
-              label="实施工时"
-              :name="1"
+            label="实施工时"
+            :name="1"
           >
-            <Hour/>
+            <Hour />
           </el-tab-pane>
           <el-tab-pane
-              label="费用报销"
-              :name="2"
+            label="费用报销"
+            :name="2"
           >Config</el-tab-pane>
           <el-tab-pane
-              label="项目收款"
-              :name="3"
+            label="项目收款"
+            :name="3"
           >
-            <payment/>
+            <payment />
           </el-tab-pane>
         </el-tabs>
       </el-col>
+      <el-col :span="8">
+        <div style="width: 97%;margin-left: 3%">
+          <el-row justify="space-between">
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+          </el-row>
+          <el-row
+            justify="space-between"
+            style="margin-top: 20px"
+          >
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+          </el-row>
+          <el-row
+            justify="space-between"
+            style="margin-top: 20px"
+          >
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+            <el-col
+              :span="11"
+              class="bg-white"
+              style="height: 150px"
+            />
+          </el-row>
+        </div>
+      </el-col>
     </el-row>
     <el-drawer
       v-model="listShow"
@@ -254,10 +243,10 @@
 <script setup>
 import { Menu, Search } from '@element-plus/icons-vue'
 import { ref, onMounted, reactive, computed } from 'vue'
-import { getProjectList, getProjectMessage } from '@/api/project'
+import { getProjectList, getProjectMessage, queryProjectExpense } from '@/api/project'
 import { collectionOperate } from '@/pinia/collection/Collection'
-import iconCollection from '@/assets/Collection.png'
-import iconAmount from '@/assets/amount.png'
+// import iconCollection from '@/assets/Collection.png'
+// import iconAmount from '@/assets/amount.png'
 import Hour from '../components/hour.vue'
 import Payment from '../components/payment.vue'
 import { hourOperate } from '@/pinia/hour/Hour'
@@ -315,8 +304,14 @@ const projectList = (condition) => {
       const list = res.data.list
       projectTotal.value = res.data.total
       listData.push(...list)
-      payment.getPaymentList(list[0].code)
       hour.getTimeList(list[0].code)
+      payment.changePaymentCode(list[0].code)
+      queryProjectExpense(list[0].code).then(res => {
+        if (res.code === 0) {
+          console.log(res.data)
+          payment.changePaymentList(res.data.collection)
+        }
+      })
       getProjectMessage(list[0].code).then(res => {
         if (res.code === 0) {
           Object.assign(projectMessage, res.data)