Browse Source

网页端:借款表单新增查看历史借款和查看预算按钮

余思翰 1 day ago
parent
commit
4a69404f4b

+ 23
- 3
oa-ui/src/views/flowable/form/finance/borrowForm.vue View File

@@ -122,12 +122,14 @@
122 122
               <span class="low-money">{{ siteExpenses.toFixed(2) }}</span>
123 123
               <span class="up-money">(大写:{{ formatNumberWithWan(siteExpenses) }})</span>
124 124
             </el-tag>
125
+            <el-button type="primary" size="mini" @click="openBudget = true" v-hasPermi="['cmc:budget:list']">查看预算</el-button>
125 126
           </el-form-item>
126 127
           <el-form-item label="已申请借款" v-if="isSelect">
127 128
             <el-tag type="danger">
128 129
               <span class="low-money">{{ hasBorrow.toFixed(2) }}</span>
129 130
               <span class="up-money">(大写:{{ formatNumberWithWan(hasBorrow) }})</span>
130 131
             </el-tag>
132
+            <el-button type="primary" size="mini" @click="openBorrow = true">查看历史借款</el-button>
131 133
           </el-form-item>
132 134
           <el-form-item label="可用借款" v-if="isSelect">
133 135
             <el-tag type="success">
@@ -333,6 +335,12 @@
333 335
         <el-button @click="openNewExpense = false">取 消</el-button>
334 336
       </div>
335 337
     </el-dialog>
338
+    <el-dialog title="查看预算" :visible.sync="openBudget" width="65%" append-to-body>
339
+      <new-budget-info :taskForm="budgetTaskForm" :taskName="''"></new-budget-info>
340
+    </el-dialog>
341
+    <el-drawer title="查看历史借款" :visible.sync="openBorrow" direction="rtl" size="35%" append-to-body>
342
+      <history-borrow :historyBorrowList="historyBorrowList"></history-borrow>
343
+    </el-drawer>
336 344
     <el-button type="success" @click="printOpen = true">打印</el-button>
337 345
   </div>
338 346
 </template>
@@ -356,6 +364,8 @@ import FileItem from '../business/fileItem.vue';
356 364
 import BorrowPrint from '../components/print/borrowPrint.vue';
357 365
 import ReturnComment from '@/views/flowable/form/components/flowBtn/returnComment.vue';
358 366
 import ReturnBtn from '@/views/flowable/form/components/flowBtn/returnBtn.vue';
367
+import newBudgetInfo from '@/views/flowable/form/budget/adjust/newBudgetInfo.vue';
368
+import HistoryBorrow from './historyBorrow.vue';
359 369
 
360 370
 export default {
361 371
   dicts: ['cmc_borrow_expense', 'cmc_unit'],
@@ -365,7 +375,9 @@ export default {
365 375
     FileItem,
366 376
     BorrowPrint,
367 377
     ReturnComment,
368
-    ReturnBtn
378
+    ReturnBtn,
379
+    newBudgetInfo,
380
+    HistoryBorrow
369 381
   },
370 382
   name: "Borrow",
371 383
   props: {
@@ -455,7 +467,13 @@ export default {
455 467
         name: [
456 468
           { required: true, message: '请输入开支项名称', trigger: 'blur' }
457 469
         ]
458
-      }
470
+      },
471
+      openBudget: false,
472
+      budgetTaskForm: {
473
+        formId: '',
474
+      },
475
+      openBorrow: false,
476
+      historyBorrowList: [],
459 477
     };
460 478
   },
461 479
   created() {
@@ -591,6 +609,7 @@ export default {
591 609
       let budgetData = await listBudget({ projectId: this.form.projectId })
592 610
       if (budgetData.total == 1) {
593 611
         let budget = budgetData.rows[0];
612
+        this.budgetTaskForm.formId = this.form.projectId;
594 613
         let siteRes = await listSite({ budgetId: budget.budgetId });
595 614
         let maxExpense = siteRes.rows.reduce((sum, site) => sum + (Number(site.amount) || 0), 0);
596 615
         this.siteExpenses = maxExpense
@@ -602,7 +621,8 @@ export default {
602 621
       if (borrow.total != 0) {
603 622
         let borrowList = borrow.rows;
604 623
         let hasBorrow = 0;
605
-        borrowList = borrowList.filter(item => item.borrowId != this.taskForm.formId)
624
+        borrowList = borrowList.filter(item => item.borrowId != this.taskForm.formId);
625
+        this.historyBorrowList = borrowList; //获取历史借款的列表
606 626
         borrowList.forEach(element => {
607 627
           if (element.managerAmount) {
608 628
             hasBorrow = hasBorrow + element.managerAmount

+ 183
- 0
oa-ui/src/views/flowable/form/finance/historyBorrow.vue View File

@@ -0,0 +1,183 @@
1
+<template>
2
+  <div class="app-container">
3
+    <template v-if="historyBorrowList.length > 0">
4
+      <div v-for="item in historyBorrowList" :key="item.borrowId" class="borrow-card">
5
+        <div class="card-header">
6
+          <span class="applier">申请人:{{ item.applierUser.nickName }}</span>
7
+          <span class="apply-date">申请日期:{{ item.applyDate }}</span>
8
+        </div>
9
+        <div class="card-body">
10
+          <div class="detail-table" v-if="borrowDetailsMap[item.borrowId]">
11
+            <template v-if="borrowDetailsMap[item.borrowId].length > 0">
12
+              <div class="detail-header detail-row">
13
+                <span>开支项目</span>
14
+                <span>单位</span>
15
+                <span>单价</span>
16
+                <span>数量</span>
17
+                <span>申请金额</span>
18
+                <span>核准金额</span>
19
+              </div>
20
+              <div v-for="detail in borrowDetailsMap[item.borrowId]" :key="detail.id" class="detail-row">
21
+                <span>{{ detail.borrowItem }}</span>
22
+                <span>{{ detail.unit }}</span>
23
+                <span>{{ detail.price }}</span>
24
+                <span>{{ detail.quantity }}</span>
25
+                <span>{{ detail.applyAmount }}</span>
26
+                <span :class="{ 'not-approved': detail.managerAmount === undefined || detail.managerAmount === null || detail.managerAmount === '' }">
27
+                  {{ detail.managerAmount !== undefined && detail.managerAmount !== null && detail.managerAmount !== '' ? detail.managerAmount : '未核准' }}
28
+                </span>
29
+              </div>
30
+            </template>
31
+            <template v-else>
32
+              <span class="no-detail">暂无明细</span>
33
+            </template>
34
+          </div>
35
+          <div v-else>
36
+            <span class="no-detail">暂无明细</span>
37
+          </div>
38
+        </div>
39
+        <div class="card-footer">
40
+          <span class="apply-amount">申请金额:{{ item.applyAmount }}</span>
41
+          <span class="manager-amount">核准金额:{{ item.managerAmount !== undefined && item.managerAmount !== null && item.managerAmount !== '' ? item.managerAmount : '未核准' }}</span>
42
+        </div>
43
+      </div>
44
+    </template>
45
+    <template v-else>
46
+      <el-empty description="暂无历史借款"></el-empty>
47
+    </template>
48
+  </div>
49
+</template>
50
+
51
+<script>
52
+import { listBorrowDetail } from "@/api/oa/borrow/borrowDetail";
53
+export default {
54
+  props: {
55
+    historyBorrowList: {
56
+      type: Array,
57
+      default: () => []
58
+    }
59
+  },
60
+  data() {
61
+    return {
62
+      borrowDetailsMap: {}
63
+    };
64
+  },
65
+  watch: {
66
+    historyBorrowList: {
67
+      handler: 'getAllHistoryBorrowDetails',
68
+      immediate: true
69
+    }
70
+  },
71
+  methods: {
72
+    async getAllHistoryBorrowDetails() {
73
+      const map = {};
74
+      for (const item of this.historyBorrowList) {
75
+        if (item.borrowId) {
76
+          try {
77
+            const res = await listBorrowDetail({ borrowId: item.borrowId });
78
+            map[item.borrowId] = res.rows || [];
79
+          } catch (e) {
80
+            map[item.borrowId] = [];
81
+          }
82
+        }
83
+      }
84
+      this.borrowDetailsMap = map;
85
+    }
86
+  }
87
+}
88
+</script>
89
+
90
+<style lang="scss" scoped>
91
+.app-container {
92
+  padding: 18px 0;
93
+  background: #f7f8fa;
94
+}
95
+.borrow-card {
96
+  margin: 0 5px;
97
+  background: #fff;
98
+  border-radius: 14px;
99
+  box-shadow: 0 2px 12px 0 rgba(0,0,0,0.06);
100
+  margin-bottom: 22px;
101
+  padding: 20px 22px 14px 22px;
102
+  transition: box-shadow 0.2s;
103
+  &:hover {
104
+    box-shadow: 0 4px 18px 0 rgba(0,0,0,0.10);
105
+  }
106
+  .card-header {
107
+    display: flex;
108
+    justify-content: space-between;
109
+    align-items: center;
110
+    font-weight: 500;
111
+    margin-bottom: 10px;
112
+    padding-bottom: 2px;
113
+    .applier {
114
+      color: #222;
115
+      font-size: 16px;
116
+    }
117
+    .apply-date {
118
+      color: #aaa;
119
+      font-size: 14px;
120
+      font-weight: 400;
121
+    }
122
+  }
123
+  .card-body {
124
+    .detail-table {
125
+      width: 100%;
126
+      .detail-header {
127
+        font-weight: 500;
128
+        background: #f8fafd;
129
+        color: #666;
130
+        border-radius: 6px 6px 0 0;
131
+      }
132
+      .detail-row {
133
+        display: grid;
134
+        grid-template-columns: 2fr 1fr 1fr 1fr 2fr 2fr;
135
+        align-items: center;
136
+        padding: 5px 0;
137
+        border-bottom: 1px solid #f0f0f0;
138
+        font-size: 15px;
139
+        span {
140
+          text-align: center;
141
+          word-break: break-all;
142
+          min-height: 22px;
143
+          display: flex;
144
+          align-items: center;
145
+          justify-content: center;
146
+        }
147
+        .not-approved {
148
+          color: #bbb;
149
+        }
150
+        &:last-child {
151
+          border-bottom: none;
152
+        }
153
+      }
154
+    }
155
+    .no-detail {
156
+      color: #bbb;
157
+      text-align: center;
158
+      display: block;
159
+      padding: 18px 0 8px 0;
160
+      font-size: 15px;
161
+    }
162
+  }
163
+  .card-footer {
164
+    display: flex;
165
+    justify-content: flex-end;
166
+    gap: 32px;
167
+    margin-top: 14px;
168
+    font-weight: 500;
169
+    font-size: 16px;
170
+    border-top: none;
171
+    padding-top: 0;
172
+    .apply-amount {
173
+      color: #2d8cf0;
174
+    }
175
+    .manager-amount {
176
+      color: #19be6b;
177
+    }
178
+    .manager-amount:after {
179
+      color: #bbb;
180
+    }
181
+  }
182
+}
183
+</style>

+ 4
- 3
oa-ui/src/views/flowable/form/projectProcess/planWorkload.vue View File

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-09-05 13:57:44
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-05 14:45:48
5
+ * @LastEditTime: 2025-07-01 09:59:36
6 6
 -->
7 7
 <template>
8 8
   <div style="width:100%">
@@ -94,8 +94,9 @@ export default {
94 94
     },
95 95
     getContractWorkList(contractId) {
96 96
       listContractWork({ pageNum: 1, pageSize: 100, contractId }).then(res => {
97
-        if (res.rows.length > 0)
98
-          this.workList = res.rows;
97
+        if (res.rows.length > 0) {
98
+          this.workList = res.rows.map(({ workId, ...rest }) => rest);
99
+        }
99 100
         else {
100 101
           this.workList = [{
101 102
             content: "",

Loading…
Cancel
Save