Parcourir la source

修改核算,新增预算外开支

余思翰 il y a 3 semaines
Parent
révision
11e43c832c

+ 2
- 2
oa-back/ruoyi-admin/src/main/java/com/ruoyi/web/controller/oa/CmcBudgetOtherController.java Voir le fichier

@@ -90,8 +90,8 @@ public class CmcBudgetOtherController extends BaseController
90 90
      */
91 91
     @Log(title = "cmc预算外开支", businessType = BusinessType.DELETE)
92 92
 	@DeleteMapping("/{expenseIds}")
93
-    public AjaxResult remove(@PathVariable Long[] expenseIds)
93
+    public AjaxResult remove(@PathVariable String[] budgetId)
94 94
     {
95
-        return success(cmcBudgetOtherService.deleteCmcBudgetOtherByExpenseIds(expenseIds));
95
+        return success(cmcBudgetOtherService.deleteCmcBudgetOtherByExpenseIds(budgetId));
96 96
     }
97 97
 }

+ 2
- 2
oa-back/ruoyi-system/src/main/java/com/ruoyi/oa/mapper/CmcBudgetOtherMapper.java Voir le fichier

@@ -54,8 +54,8 @@ public interface CmcBudgetOtherMapper
54 54
     /**
55 55
      * 批量删除cmc预算外开支
56 56
      * 
57
-     * @param expenseIds 需要删除的数据主键集合
57
+     * @param budgetId 需要删除的数据主键集合
58 58
      * @return 结果
59 59
      */
60
-    public int deleteCmcBudgetOtherByExpenseIds(Long[] expenseIds);
60
+    public int deleteCmcBudgetOtherByExpenseIds(String[] budgetId);
61 61
 }

+ 2
- 2
oa-back/ruoyi-system/src/main/java/com/ruoyi/oa/service/ICmcBudgetOtherService.java Voir le fichier

@@ -46,10 +46,10 @@ public interface ICmcBudgetOtherService
46 46
     /**
47 47
      * 批量删除cmc预算外开支
48 48
      * 
49
-     * @param expenseIds 需要删除的cmc预算外开支主键集合
49
+     * @param budgetId 需要删除的cmc预算外开支主键集合
50 50
      * @return 结果
51 51
      */
52
-    public int deleteCmcBudgetOtherByExpenseIds(Long[] expenseIds);
52
+    public int deleteCmcBudgetOtherByExpenseIds(String[] budgetId);
53 53
 
54 54
     /**
55 55
      * 删除cmc预算外开支信息

+ 3
- 3
oa-back/ruoyi-system/src/main/java/com/ruoyi/oa/service/impl/CmcBudgetOtherServiceImpl.java Voir le fichier

@@ -70,13 +70,13 @@ public class CmcBudgetOtherServiceImpl implements ICmcBudgetOtherService
70 70
     /**
71 71
      * 批量删除cmc预算外开支
72 72
      * 
73
-     * @param expenseIds 需要删除的cmc预算外开支主键
73
+     * @param budgetId 需要删除的cmc预算外开支主键
74 74
      * @return 结果
75 75
      */
76 76
     @Override
77
-    public int deleteCmcBudgetOtherByExpenseIds(Long[] expenseIds)
77
+    public int deleteCmcBudgetOtherByExpenseIds(String[] budgetId)
78 78
     {
79
-        return cmcBudgetOtherMapper.deleteCmcBudgetOtherByExpenseIds(expenseIds);
79
+        return cmcBudgetOtherMapper.deleteCmcBudgetOtherByExpenseIds(budgetId);
80 80
     }
81 81
 
82 82
     /**

+ 3
- 3
oa-back/ruoyi-system/src/main/resources/mapper/oa/CmcBudgetOtherMapper.xml Voir le fichier

@@ -62,9 +62,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
62 62
     </delete>
63 63
 
64 64
     <delete id="deleteCmcBudgetOtherByExpenseIds" parameterType="String">
65
-        delete from cmc_budget_other where expense_id in 
66
-        <foreach item="expenseId" collection="array" open="(" separator="," close=")">
67
-            #{expenseId}
65
+        delete from cmc_budget_other where budget_id in 
66
+        <foreach item="budgetId" collection="array" open="(" separator="," close=")">
67
+            #{budgetId}
68 68
         </foreach>
69 69
     </delete>
70 70
 </mapper>

+ 50
- 0
oa-ui/src/api/oa/budget/budgetOther.js Voir le fichier

@@ -0,0 +1,50 @@
1
+/*
2
+ * @Author: ysh
3
+ * @Date: 2025-05-16 10:38:45
4
+ * @LastEditors: 
5
+ * @LastEditTime: 2025-05-16 10:39:10
6
+ */
7
+import request from '@/utils/request'
8
+
9
+// 查询cmc预算外开支列表
10
+export function listOther(query) {
11
+  return request({
12
+    url: '/oa/other/list',
13
+    method: 'get',
14
+    params: query
15
+  })
16
+}
17
+
18
+// 查询cmc预算外开支详细
19
+export function getOther(expenseId) {
20
+  return request({
21
+    url: '/oa/other/' + expenseId,
22
+    method: 'get'
23
+  })
24
+}
25
+
26
+// 新增cmc预算外开支
27
+export function addOther(data) {
28
+  return request({
29
+    url: '/oa/other',
30
+    method: 'post',
31
+    data: data
32
+  })
33
+}
34
+
35
+// 修改cmc预算外开支
36
+export function updateOther(data) {
37
+  return request({
38
+    url: '/oa/other',
39
+    method: 'put',
40
+    data: data
41
+  })
42
+}
43
+
44
+// 删除cmc预算外开支
45
+export function delOther(expenseId) {
46
+  return request({
47
+    url: '/oa/other/' + expenseId,
48
+    method: 'delete'
49
+  })
50
+}

+ 3
- 4
oa-ui/src/views/flowable/form/budget/addBudget.vue Voir le fichier

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-06-21 18:51:51
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-05-15 18:12:10
5
+ * @LastEditTime: 2025-05-16 09:43:29
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
@@ -130,10 +130,9 @@
130 130
     <el-divider></el-divider>
131 131
     <div style="text-align: center">
132 132
       <el-button type="warning" @click="preserve()">保存</el-button>
133
-      <el-button type="danger" @click="returnOpen = true">退 回</el-button>
133
+      <el-button type="danger" @click="returnOpen = true" v-if="taskName != '预算编制'">退 回</el-button>
134 134
       <el-button type="success" @click="viewForm()">预览表单</el-button>
135
-      <el-button type="primary" @click="submitNextFlow" v-if="taskName == '预算批准'">提交下一个流程</el-button>
136
-      <el-button type="primary" @click="submitNextFlow" v-else>结算批准</el-button>
135
+      <el-button type="primary" @click="submitNextFlow" v-if="taskName == '预算编制'">提交下一个流程</el-button>
137 136
     </div>
138 137
     <el-dialog title="表单预览" :visible.sync="viewOpen" width="75%" append-to-body>
139 138
       <!-- <budget-info :taskName="taskName" :taskForm="taskForm" @goBack="$emit('goBack')"></budget-info> -->

+ 46
- 7
oa-ui/src/views/flowable/form/budget/adjust/budgetAdjust.vue Voir le fichier

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2025-05-07 11:01:39
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-05-15 18:32:55
5
+ * @LastEditTime: 2025-05-16 11:15:36
6 6
 -->
7 7
 <template>
8 8
   <div class="main" v-loading="loading">
@@ -118,6 +118,9 @@
118 118
         <business-cost :budgetForm.sync="budgetForm" @update:budgetForm="handleBusinessChange"></business-cost>
119 119
       </el-descriptions-item>
120 120
       <el-descriptions-item label="预算外开销" :span="3">
121
+        <other-cost :otherList.sync="otherList" @update:otherList="handleOtherChange"></other-cost>
122
+      </el-descriptions-item>
123
+      <el-descriptions-item label="分管审核意见" :span="3">
121 124
 
122 125
       </el-descriptions-item>
123 126
     </el-descriptions>
@@ -135,8 +138,9 @@ import { listBudgetCar, updateBudgetCar, addBudgetCar, delBudgetCar } from "@/ap
135 138
 import { listBudgetDevice, updateBudgetDevice, addBudgetDevice, delBudgetDevice } from "@/api/oa/budget/budgetDevice";
136 139
 import { listBudgetSettle, updateBudgetSettle, addBudgetSettle, delBudgetSettle } from "@/api/oa/budget/budgetSettle";
137 140
 import { listBudgetStaff, addBudgetStaff, delBudgetStaff } from "@/api/oa/budget/budgetStaff";
141
+import { listOther, addOther, updateOther, delOther } from "@/api/oa/budget/budgetOther";
138 142
 import { listProjectWork } from "@/api/oa/project/projectWork";
139
-import { listSite, delSite, addSite } from "@/api/oa/budget/budgetSite";
143
+import { listSite, updateSite, delSite, addSite } from "@/api/oa/budget/budgetSite";
140 144
 import { getProject } from "@/api/oa/project/project";
141 145
 import InnerStaffCost from './components/InnerStaffCost.vue';
142 146
 import OuterStaffCost from './components/OuterStaffCost.vue';
@@ -144,6 +148,7 @@ import CarCost from './components/CarCost.vue';
144 148
 import DeviceCost from './components/DeviceCost.vue';
145 149
 import SiteCost from '@/views/flowable/form/budget/adjust/components/SiteCost.vue';
146 150
 import BusinessCost from '@/views/flowable/form/budget/adjust/components/businessCost.vue';
151
+import OtherCost from '@/views/flowable/form/budget/adjust/components/otherCost.vue';
147 152
 export default {
148 153
   components: {
149 154
     InnerStaffCost,
@@ -151,7 +156,8 @@ export default {
151 156
     CarCost,
152 157
     DeviceCost,
153 158
     SiteCost,
154
-    BusinessCost
159
+    BusinessCost,
160
+    OtherCost
155 161
   },
156 162
   props: {
157 163
     taskForm: {
@@ -176,7 +182,8 @@ export default {
176 182
       outerStaffList: [],
177 183
       carList: [],
178 184
       deviceList: [],
179
-      siteList: []
185
+      siteList: [],
186
+      otherList: []
180 187
     }
181 188
   },
182 189
   created() {
@@ -283,6 +290,7 @@ export default {
283 290
           // 获取现场开支
284 291
           let siteRes = await listSite({ pageSize: 100, budgetId });
285 292
           this.siteList = siteRes.rows;
293
+
286 294
           this.siteList = this.siteList.map(site => {
287 295
             return {
288 296
               ...site,
@@ -290,6 +298,17 @@ export default {
290 298
               amountAdjust: site.amountAdjust ? Number(site.amountAdjust).toFixed(2) : 0
291 299
             };
292 300
           });
301
+
302
+          // 获取预算外开销
303
+          let otherRes = await listOther({ pageSize: 100, budgetId });
304
+          this.otherList = otherRes.rows;
305
+          this.otherList = this.otherList.map(other => {
306
+            return {
307
+              ...other,
308
+              amount: Number(other.amount).toFixed(2),
309
+              amountAdjust: other.amountAdjust ? Number(other.amountAdjust).toFixed(2) : 0
310
+            };
311
+          });
293 312
         }
294 313
         this.loading = false;
295 314
       }).catch(() => {
@@ -307,7 +326,6 @@ export default {
307 326
     // 处理内业人员数据变化
308 327
     handleInnerStaffChange(newList) {
309 328
       this.innerStaffList = newList;
310
-      console.log(this.innerStaffList);
311 329
     },
312 330
 
313 331
     // 处理外业人员数据变化
@@ -325,11 +343,18 @@ export default {
325 343
     // 处理现场开支数据变化
326 344
     handleSiteChange(newList) {
327 345
       this.siteList = newList;
328
-      console.log(this.siteList);
329 346
     },
330 347
     // 处理经营相关数据变化
331 348
     handleBusinessChange(newData) {
332
-
349
+      this.budgetForm.outAdjust = newData.outAdjust;
350
+      this.budgetForm.letterAdjust = newData.letterAdjust;
351
+      this.budgetForm.winAdjust = newData.winAdjust;
352
+      this.budgetForm.taxAdjust = newData.taxAdjust;
353
+      this.budgetForm.travelAdjust = newData.travelAdjust;
354
+    },
355
+    // 处理预算外开销数据变化
356
+    handleOtherChange(newList) {
357
+      this.otherList = newList;
333 358
     },
334 359
     async preserve() {
335 360
       let obj = {
@@ -344,24 +369,38 @@ export default {
344 369
       }
345 370
       await updateBudget(this.budgetForm);
346 371
       let staffList = this.innerStaffList.concat(this.outerStaffList);
372
+      // 更新人员
347 373
       delBudgetStaff(this.row.budgetId).then(async res => {
348 374
         for (let staff of staffList) {
349 375
           staff.budgetId = this.row.budgetId;
350 376
           await addBudgetStaff(staff);
351 377
         }
352 378
       })
379
+      // 更新车辆
353 380
       delBudgetCar(this.row.budgetId).then(async res => {
354 381
         for (let car of this.carList) {
355 382
           car.budgetId = this.row.budgetId;
356 383
           await addBudgetCar(car);
357 384
         }
358 385
       })
386
+      // 更新设备
359 387
       delBudgetDevice(this.row.budgetId).then(async res => {
360 388
         for (let device of this.deviceList) {
361 389
           device.budgetId = this.row.budgetId;
362 390
           await addBudgetDevice(device);
363 391
         }
364 392
       })
393
+      // 更新现场开支
394
+      for (let site of this.siteList) {
395
+        await updateSite(site);
396
+      }
397
+      // 更新预算外开销
398
+      delOther(this.row.budgetId).then(async res => {
399
+        for (let other of this.otherList) {
400
+          other.budgetId = this.row.budgetId;
401
+          await addOther(other);
402
+        }
403
+      })
365 404
       this.$message.success('保存成功');
366 405
     },
367 406
     confirmSucess() {

+ 20
- 10
oa-ui/src/views/flowable/form/budget/adjust/components/DeviceCost.vue Voir le fichier

@@ -27,20 +27,26 @@
27 27
         <td style="text-align:right;">{{ device.days }}</td>
28 28
         <td style="text-align:right;">{{ device.amount }}</td>
29 29
         <td style="text-align:right;">
30
-          <el-input-number :controls="false" style="width:100%;" v-model="device.daysAdjust" @change="handleChange(device)"></el-input-number>
30
+          <el-input-number :controls="false" style="width:100%;" v-model="device.daysAdjust"
31
+            @change="handleChange(device)"></el-input-number>
31 32
         </td>
32 33
         <td style="text-align:right;">
33 34
           {{ device.amountAdjust }}
34 35
         </td>
35 36
       </tr>
36
-      <!-- <tr>
37
-        <td colspan="4" class="amount">设备成本合计</td>
38
-        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.device?.dayCost) || 0), 0).toFixed(2)}}</td>
39
-        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.days) || 0), 0).toFixed(2)}}</td>
40
-        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.amount) || 0), 0).toFixed(2)}}</td>
41
-        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.daysAdjust) || 0), 0).toFixed(2)}}</td>
42
-        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.amountAdjust) || 0), 0).toFixed(2)}}</td>
43
-      </tr> -->
37
+      <tr>
38
+        <td colspan="5" class="amount">设备成本合计</td>
39
+        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.device ?
40
+          device.device.dayCost : 0) || 0), 0).toFixed(2)}}</td>
41
+        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.days) ||
42
+          0), 0).toFixed(2)}}</td>
43
+        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum + (Number(device.amount) ||
44
+          0), 0).toFixed(2)}}</td>
45
+        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum +
46
+          (Number(device.daysAdjust) || 0), 0).toFixed(2)}}</td>
47
+        <td class="amount" style="text-align:right;">{{deviceList.reduce((sum, device) => sum +
48
+          (Number(device.amountAdjust) || 0), 0).toFixed(2)}}</td>
49
+      </tr>
44 50
     </table>
45 51
     <div class="mt10">
46 52
       <el-button type="success" plain icon="el-icon-plus" @click="openDevice" size="mini">新增设备</el-button>
@@ -123,21 +129,25 @@ export default {
123 129
     text-align: center;
124 130
     border-collapse: collapse;
125 131
     margin: 0 auto;
132
+
126 133
     td {
127 134
       padding: 5px;
128 135
     }
129 136
   }
137
+
130 138
   .adjust {
131 139
     color: #F56C6C;
132 140
     width: 120px;
133 141
   }
142
+
134 143
   .delete-btn {
135 144
     cursor: pointer;
136 145
     font-size: 18px;
137 146
   }
147
+
138 148
   .amount {
139 149
     font-weight: bold;
140 150
     font-family: Arial, Helvetica, sans-serif;
141 151
   }
142 152
 }
143
-</style> 
153
+</style>

+ 1
- 1
oa-ui/src/views/flowable/form/budget/adjust/components/InnerStaffCost.vue Voir le fichier

@@ -3,7 +3,7 @@
3 3
     <table border="1" style="width:100%">
4 4
       <tr style="background-color:#f8f8f9">
5 5
         <td></td>
6
-        <td style="min-width:50px;">序号</td>
6
+        <td style="width:50px;">序号</td>
7 7
         <td style="min-width:80px;">姓名</td>
8 8
         <td style="min-width:80px;">人员成本(天)</td>
9 9
         <td style="min-width:80px;">预算天数</td>

+ 12
- 2
oa-ui/src/views/flowable/form/budget/adjust/components/SiteCost.vue Voir le fichier

@@ -1,21 +1,31 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2025-05-15 15:30:09
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-05-16 09:59:30
6
+-->
1 7
 <template>
2 8
   <div class="site-cost">
3 9
     <table border="1" style="width:100%;">
4 10
       <tr style="background-color:#f8f8f9">
11
+        <td style="width: 50px;">序号</td>
5 12
         <td>开支项</td>
6 13
         <td>金额</td>
7 14
         <td class="adjust">核算金额</td>
15
+        <td>备注</td>
8 16
       </tr>
9
-      <tr v-for="site in siteList" :key="site.id">
17
+      <tr v-for="site, index in siteList" :key="site.id">
18
+        <td>{{ index + 1 }}</td>
10 19
         <td>{{ site.name }}</td>
11 20
         <td style="text-align: right;">{{ site.amount }}</td>
12 21
         <td>
13 22
           <el-input-number :controls="false" v-model="site.amountAdjust" placeholder="请输入核算金额"
14 23
             @change="handleSiteChange(site)" />
15 24
         </td>
25
+        <td style="text-align: left;">{{ site.remark }}</td>
16 26
       </tr>
17 27
       <tr>
18
-        <td class="amount" colspan="1">现场开支合计</td>
28
+        <td class="amount" colspan="2">现场开支合计</td>
19 29
         <td class="amount" style="text-align: right;">{{siteList.reduce((sum, site) => sum + (Number(site.amount)
20 30
           || 0), 0).toFixed(2)}}</td>
21 31
         <td class="amount" style="text-align: right;">{{siteList.reduce((sum, site) => sum + (Number(site.amountAdjust)

+ 12
- 7
oa-ui/src/views/flowable/form/budget/adjust/components/businessCost.vue Voir le fichier

@@ -2,13 +2,13 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2025-05-15 18:24:27
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-05-15 18:37:17
5
+ * @LastEditTime: 2025-05-16 10:33:48
6 6
 -->
7 7
 <template>
8 8
   <div class="business-cost">
9 9
     <table border="1" style="width:100%;">
10 10
       <tr style="background-color:#f8f8f9">
11
-        <td>序号</td>
11
+        <td style="width: 50px;">序号</td>
12 12
         <td>名称</td>
13 13
         <td>金额</td>
14 14
         <td class="adjust">核算金额</td>
@@ -21,7 +21,7 @@
21 21
           {{ budgetForm.outExpense }}
22 22
         </td>
23 23
         <td style="text-align:right;">
24
-          <el-input-number :controls="false" v-model="budgetForm.outExpenseAdjust" :min="0" :step="0.01"
24
+          <el-input-number :controls="false" v-model="budgetForm.outAdjust" :min="0" :step="0.01"
25 25
             @change="updateTotalJYAmount"></el-input-number>
26 26
         </td>
27 27
         <td class="remark-cell">{{ budgetForm.outRemark }}</td>
@@ -33,7 +33,7 @@
33 33
           {{ budgetForm.letterExpense }}
34 34
         </td>
35 35
         <td style="text-align:right;">
36
-          <el-input-number :controls="false" v-model="budgetForm.letterExpenseAdjust" :min="0" :step="0.01"
36
+          <el-input-number :controls="false" v-model="budgetForm.letterAdjust" :min="0" :step="0.01"
37 37
             @change="updateTotalJYAmount"></el-input-number>
38 38
         </td>
39 39
         <td class="remark-cell">{{ budgetForm.letterRemark }}</td>
@@ -44,6 +44,10 @@
44 44
         <td style="text-align:right;">
45 45
           {{ budgetForm.winExpense }}
46 46
         </td>
47
+        <td style="text-align:right;">
48
+          <el-input-number :controls="false" v-model="budgetForm.winAdjust" :min="0" :step="0.01"
49
+            @change="updateTotalJYAmount"></el-input-number>
50
+        </td>
47 51
         <td class="remark-cell">{{ budgetForm.winRemark }}</td>
48 52
       </tr>
49 53
       <tr>
@@ -53,7 +57,7 @@
53 57
           {{ budgetForm.taxExpense }}
54 58
         </td>
55 59
         <td style="text-align:right;">
56
-          <el-input-number :controls="false" v-model="budgetForm.taxExpenseAdjust" :min="0" :step="0.01"
60
+          <el-input-number :controls="false" v-model="budgetForm.taxAdjust" :min="0" :step="0.01"
57 61
             @change="updateTotalJYAmount"></el-input-number>
58 62
         </td>
59 63
         <td class="remark-cell">{{ budgetForm.taxRemark }}</td>
@@ -65,7 +69,7 @@
65 69
           {{ budgetForm.travelExpense }}
66 70
         </td>
67 71
         <td style="text-align:right;">
68
-          <el-input-number :controls="false" v-model="budgetForm.travelExpenseAdjust" :min="0" :step="0.01"
72
+          <el-input-number :controls="false" v-model="budgetForm.travelAdjust" :min="0" :step="0.01"
69 73
             @change="updateTotalJYAmount"></el-input-number>
70 74
         </td>
71 75
         <td class="remark-cell">{{ budgetForm.travelRemark }}</td>
@@ -99,13 +103,14 @@ export default {
99 103
   },
100 104
   created() {
101 105
     this.initTotalJYAmount();
106
+    this.updateTotalJYAmount();
102 107
   },
103 108
   methods: {
104 109
     initTotalJYAmount() {
105 110
       this.totalJYAmount = ((Number(this.budgetForm.outExpense) || 0) + (Number(this.budgetForm.letterExpense) || 0) + (Number(this.budgetForm.winExpense) || 0) + (Number(this.budgetForm.taxExpense) || 0) + (Number(this.budgetForm.travelExpense) || 0)).toFixed(2)
106 111
     },
107 112
     updateTotalJYAmount() {
108
-      this.totalJYAmountAdjust = ((Number(this.budgetForm.outExpenseAdjust) || 0) + (Number(this.budgetForm.letterExpenseAdjust) || 0) + (Number(this.budgetForm.winExpenseAdjust) || 0) + (Number(this.budgetForm.taxExpenseAdjust) || 0) + (Number(this.budgetForm.travelExpenseAdjust) || 0)).toFixed(2)
113
+      this.totalJYAmountAdjust = ((Number(this.budgetForm.outAdjust) || 0) + (Number(this.budgetForm.letterAdjust) || 0) + (Number(this.budgetForm.winAdjust) || 0) + (Number(this.budgetForm.taxAdjust) || 0) + (Number(this.budgetForm.travelAdjust) || 0)).toFixed(2)
109 114
     }
110 115
   }
111 116
 }

+ 137
- 0
oa-ui/src/views/flowable/form/budget/adjust/components/otherCost.vue Voir le fichier

@@ -0,0 +1,137 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2025-05-16 10:34:57
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-05-16 11:06:49
6
+-->
7
+<template>
8
+  <div class="other-cost">
9
+    <table border="1" style="width:100%;">
10
+      <tr style="background-color:#f8f8f9">
11
+        <td></td>
12
+        <td style="width: 50px;">序号</td>
13
+        <td>名称</td>
14
+        <td class="adjust">核算金额</td>
15
+        <td>备注</td>
16
+      </tr>
17
+      <tr v-for="other, index in otherList" :key="other.id">
18
+        <td>
19
+          <div class="delete-btn" @click="removeOther(other, index)"><i class="el-icon-remove-outline"
20
+              style="color:#F56C6C"></i>
21
+          </div>
22
+        </td>
23
+        <td>{{ index + 1 }}</td>
24
+        <td>
25
+          <el-input v-model="other.name" placeholder="请输入名称" />
26
+        </td>
27
+        <td>
28
+          <el-input-number :controls="false" v-model="other.amountAdjust" placeholder="请输入核算金额"
29
+            @change="handleOtherChange(other)" />
30
+        </td>
31
+        <td>
32
+          <el-input type="textarea" :rows="2" v-model="other.remark" placeholder="请输入备注" />
33
+        </td>
34
+      </tr>
35
+      <tr>
36
+        <td colspan="3" class="amount">预算外开支合计</td>
37
+        <td class="amount" style="text-align: right;">{{otherList.reduce((sum, other) => sum + (Number(other.amountAdjust) || 0), 0).toFixed(2)}}</td>
38
+      </tr>
39
+    </table>
40
+    <div class="add-staff mt10">
41
+      <el-button type="success" plain icon="el-icon-plus" @click="addOther" size="mini">新增项</el-button>
42
+    </div>
43
+  </div>
44
+</template>
45
+
46
+<script>
47
+export default {
48
+  props: {
49
+    otherList: {
50
+      type: Array,
51
+      default: () => [{
52
+        id: Date.now(),
53
+        name: '',
54
+        amountAdjust: null,
55
+        remark: ''
56
+      }]
57
+    }
58
+  },
59
+  watch: {
60
+    otherList: {
61
+      handler(newVal) {
62
+        if (!newVal || newVal.length === 0) {
63
+          this.$emit('update:otherList', [{
64
+            id: Date.now(),
65
+            name: '',
66
+            amountAdjust: null,
67
+            remark: ''
68
+          }]);
69
+        }
70
+      },
71
+      immediate: true
72
+    }
73
+  },
74
+  methods: {
75
+    handleOtherChange(other) {
76
+      this.$emit('update:otherList', this.otherList);
77
+    },
78
+    addOther() {
79
+      this.otherList.push({
80
+        id: Date.now(),
81
+        name: '',
82
+        amountAdjust: null,
83
+        remark: ''
84
+      });
85
+    },
86
+    removeOther(other, index) {
87
+      this.$confirm('确实移除【' + other.name + '】吗', '提示', {
88
+        confirmButtonText: '确定',
89
+        cancelButtonText: '取消',
90
+        type: 'warning'
91
+      }).then(() => {
92
+        let arr = this.otherList;
93
+        if (arr.length == 1) {
94
+          return;
95
+        }
96
+        if (index >= 0 && index < arr.length) {
97
+          arr.splice(index, 1);
98
+        }
99
+        this.$emit('update:otherList', arr);
100
+      });
101
+    }
102
+  }
103
+}
104
+</script>
105
+
106
+<style lang="scss" scoped>
107
+.other-cost {
108
+  .add-staff {
109
+    margin-bottom: 10px;
110
+  }
111
+
112
+  table {
113
+    text-align: center;
114
+    border-collapse: collapse;
115
+    margin: 0 auto;
116
+
117
+    td {
118
+      padding: 5px;
119
+    }
120
+  }
121
+
122
+  .adjust {
123
+    color: #F56C6C;
124
+    width: 120px;
125
+  }
126
+}
127
+
128
+.delete-btn {
129
+  cursor: pointer;
130
+  font-size: 18px;
131
+}
132
+
133
+.amount {
134
+  font-weight: bold;
135
+  font-family: Arial, Helvetica, sans-serif;
136
+}
137
+</style>

+ 66
- 41
oa-ui/src/views/flowable/form/budget/components/calculatePerformance.vue Voir le fichier

@@ -10,20 +10,21 @@
10 10
         <el-form ref="form" :model="item" label-width="100px">
11 11
           <el-row>
12 12
             <el-col :span="12">
13
-              <el-form-item label="工作类别">
14
-                <el-select v-model="item.workType" placeholder="请选择工作类别"
15
-                  @change="(val) => handleWorkTypeChange(val, index)">
16
-                  <el-option v-for="type in workTypeList" :key="type.value" :label="type.label" :value="type.value">
13
+              <el-form-item label="工作项目">
14
+                <el-select v-model="item.workItem" placeholder="请选择工作项目"
15
+                  @change="(val) => handleWorkItemChange(val, index)">
16
+                  <el-option v-for="workItem in workItemList" :key="workItem.value" :label="workItem.label"
17
+                    :value="workItem.value">
17 18
                   </el-option>
18 19
                 </el-select>
19 20
               </el-form-item>
20 21
             </el-col>
21 22
             <el-col :span="12">
22
-              <el-form-item label="工作项目">
23
-                <el-select v-model="item.workItem" placeholder="请选择工作项目"
24
-                  @change="(val) => handleWorkItemChange(val, index)">
25
-                  <el-option v-for="workItem in item.workItemList" :key="workItem.value" :label="workItem.label"
26
-                    :value="workItem.value">
23
+              <el-form-item label="内容细项">
24
+                <el-select v-model="item.subItem" placeholder="请选择内容细项"
25
+                  @change="(val) => handleSubItemChange(val, index)">
26
+                  <el-option v-for="subItem in item.workSelect.subItemList" :key="subItem.value" :label="subItem.label"
27
+                    :value="subItem.value">
27 28
                   </el-option>
28 29
                 </el-select>
29 30
               </el-form-item>
@@ -34,7 +35,7 @@
34 35
               <el-form-item label="比例尺/等级">
35 36
                 <el-select v-model="item.scaleGrade" placeholder="请选择比例尺/等级"
36 37
                   @change="(val) => handleScaleGradeChange(val, index)">
37
-                  <el-option v-for="scale in item.scaleGradeList" :key="scale.value" :label="scale.label"
38
+                  <el-option v-for="scale in item.workSelect.scaleGradeList" :key="scale.value" :label="scale.label"
38 39
                     :value="scale.value">
39 40
                   </el-option>
40 41
                 </el-select>
@@ -47,7 +48,8 @@
47 48
                   <el-option key="一般地类" label="一般地类" value="0"></el-option>
48 49
                   <el-option key="复杂地类" label="复杂地类" value="1"></el-option>
49 50
                 </el-select>
50
-              </el-form-item></el-col>
51
+              </el-form-item>
52
+            </el-col>
51 53
           </el-row>
52 54
 
53 55
           <el-row>
@@ -65,18 +67,21 @@
65 67
               <el-form-item label="工作量">
66 68
                 <el-input-number v-model="item.workload" :precision="2" :step="0.1" :min="0"
67 69
                   @change="() => calculateTotal(index)"></el-input-number>
68
-              </el-form-item></el-col>
70
+              </el-form-item>
71
+            </el-col>
69 72
           </el-row>
70 73
 
71
-
72 74
           <el-form-item label="单价">
73 75
             <el-tag>{{ item.price }}/ {{ item.unit }}</el-tag>
74 76
           </el-form-item>
75 77
 
76
-
77 78
           <el-form-item label="单项总额">
78 79
             <el-tag>{{ item.total }}</el-tag>
79 80
           </el-form-item>
81
+
82
+          <el-form-item label="备注">
83
+            {{ item.remark }}
84
+          </el-form-item>
80 85
         </el-form>
81 86
       </div>
82 87
     </div>
@@ -98,14 +103,14 @@
98 103
 </template>
99 104
 
100 105
 <script>
101
-import { getWorkTypeList, getWorkItemList, getScaleGradeList, getUnitPrice, getPriceRemarkByWorkType } from '@/api/oa/price/price'
106
+import { getWorkItemList, getSubItemList, getScaleGradeList, getUnitPrice, getPriceRemarkByWorkType } from '@/api/oa/price/checkPrice'
102 107
 
103 108
 export default {
104 109
   name: 'CalculatePerformance',
105 110
   data() {
106 111
     return {
107 112
       visible: false,
108
-      workTypeList: [],
113
+      workItemList: [],
109 114
       performanceList: [this.getDefaultItem()]
110 115
     }
111 116
   },
@@ -119,22 +124,25 @@ export default {
119 124
   methods: {
120 125
     getDefaultItem() {
121 126
       return {
122
-        workType: '',
123 127
         workItem: '',
128
+        subItem: '',
124 129
         scaleGrade: '',
125 130
         groundType: '0',
126 131
         price: 0,
127 132
         workload: 0,
128 133
         coefficient: 1,
129 134
         total: 0,
130
-        workItemList: [],
131
-        scaleGradeList: []
135
+        remark: '',
136
+        workSelect: {
137
+          subItemList: [],
138
+          scaleGradeList: []
139
+        }
132 140
       }
133 141
     },
134 142
     open() {
135 143
       this.visible = true
136 144
       this.resetForm()
137
-      this.initWorkTypeList()
145
+      this.initWorkItemList()
138 146
     },
139 147
     resetForm() {
140 148
       this.performanceList = [this.getDefaultItem()]
@@ -145,43 +153,58 @@ export default {
145 153
     removeItem(index) {
146 154
       this.performanceList.splice(index, 1)
147 155
     },
148
-    initWorkTypeList() {
149
-      getWorkTypeList().then(res => {
156
+    initWorkItemList() {
157
+      getWorkItemList({ workType: '内业' }).then(res => {
150 158
         if (res) {
151
-          this.workTypeList = this.setArray(res)
159
+          this.workItemList = this.setArray(res)
152 160
         }
153 161
       })
154 162
     },
155
-    handleWorkTypeChange(value, index) {
163
+    handleWorkItemChange(value, index) {
156 164
       const item = this.performanceList[index]
157
-      item.workItem = ''
165
+      item.subItem = ''
158 166
       item.scaleGrade = ''
159 167
       item.price = 0
160
-      item.workItemList = []
161
-      item.scaleGradeList = []
168
+      item.workSelect.subItemList = []
169
+      item.workSelect.scaleGradeList = []
162 170
       this.calculateTotal(index)
163 171
 
164 172
       if (value) {
165
-        getWorkItemList({ workType: value }).then(res => {
166
-          if (res) {
167
-            item.workItemList = this.setArray(res)
168
-          }
169
-        })
173
+        this.getWorkSubItemList(item, value)
170 174
       }
171 175
     },
172
-    handleWorkItemChange(value, index) {
176
+    getWorkSubItemList(item, workItem) {
177
+      getSubItemList({ workItem }).then(res => {
178
+        if (res) {
179
+          let subItemList = this.setArray(res)
180
+          item.workSelect.subItemList = subItemList
181
+          if (subItemList.length > 0) {
182
+            item.subItem = subItemList[0].value
183
+            this.handleSubItemChange(item.subItem, this.performanceList.indexOf(item))
184
+          }
185
+        }
186
+      })
187
+    },
188
+    handleSubItemChange(value, index) {
173 189
       const item = this.performanceList[index]
174 190
       item.scaleGrade = ''
175 191
       item.price = 0
176
-      item.scaleGradeList = []
192
+      item.workSelect.scaleGradeList = []
177 193
       this.calculateTotal(index)
178 194
 
179
-      if (value) {
180
-        getScaleGradeList({ workItem: value }).then(res => {
195
+      // Set remark based on selected subItem
196
+      const selectedSubItem = item.workSelect.subItemList.find(sub => sub.value === value)
197
+      if (selectedSubItem) {
198
+        item.remark = selectedSubItem.remark || ''
199
+      }
200
+
201
+      if (value && item.workItem) {
202
+        getScaleGradeList({ workItem: item.workItem }).then(res => {
181 203
           if (res) {
182
-            item.scaleGradeList = this.setArray(res)
183
-            if (item.scaleGradeList.length > 0) {
184
-              item.scaleGrade = item.scaleGradeList[0].value
204
+            let scaleGradeList = this.setArray(res)
205
+            item.workSelect.scaleGradeList = scaleGradeList
206
+            if (scaleGradeList.length > 0) {
207
+              item.scaleGrade = scaleGradeList[0].value
185 208
               this.handleScaleGradeChange(item.scaleGrade, index)
186 209
             }
187 210
           }
@@ -193,7 +216,7 @@ export default {
193 216
       item.price = 0
194 217
       this.calculateTotal(index)
195 218
 
196
-      if (value && item.workItem) {
219
+      if (value && item.workItem && item.subItem) {
197 220
         this.getUnitPrice(index)
198 221
       }
199 222
     },
@@ -202,7 +225,7 @@ export default {
202 225
       item.price = 0
203 226
       this.calculateTotal(index)
204 227
 
205
-      if (item.scaleGrade && item.workItem) {
228
+      if (item.scaleGrade && item.workItem && item.subItem) {
206 229
         this.getUnitPrice(index)
207 230
       }
208 231
     },
@@ -210,12 +233,14 @@ export default {
210 233
       const item = this.performanceList[index]
211 234
       getUnitPrice({
212 235
         workItem: item.workItem,
236
+        subItem: item.subItem,
213 237
         scaleGrade: item.scaleGrade,
214 238
         groundType: item.groundType
215 239
       }).then(res => {
216 240
         if (res.length != 0) {
217 241
           item.price = res.data.price
218 242
           item.unit = res.data.unit
243
+          item.remark = res.data.remark || ''
219 244
           this.calculateTotal(index)
220 245
         }
221 246
       })

Loading…
Annuler
Enregistrer