浏览代码

修改预算

余思翰 4 周前
父节点
当前提交
320fcc6d66

+ 390
- 388
oa-ui/src/views/flowable/form/budget/addBudget.vue 查看文件

@@ -1,388 +1,390 @@
1
-<!--
2
- * @Author: ysh
3
- * @Date: 2024-06-21 18:51:51
4
- * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-04-21 09:34:14
6
--->
7
-<template>
8
-  <div class="app-container">
9
-    <h2 class="text-center">项目直接生产成本预算表</h2>
10
-    <p style="text-align: center">编制人:{{ $store.getters.name }}</p>
11
-    <el-divider></el-divider>
12
-    <div class="mt20 mb20" v-if="showAlter">
13
-      <el-alert title="任务被退回,请修改后重新提交" type="error" :closable="false">
14
-        <return-comment :taskForm="taskForm" @isReturn="isReturn"></return-comment>
15
-      </el-alert>
16
-    </div>
17
-    <el-descriptions title="项目信息" labelClassName="mylabel">
18
-      <el-descriptions-item label="项目编号">{{
19
-        project.projectNumber
20
-      }}</el-descriptions-item>
21
-      <el-descriptions-item label="项目名称">{{
22
-        project.projectName
23
-      }}</el-descriptions-item>
24
-      <el-descriptions-item label="项目负责人">{{
25
-        getUserName(project.projectLeader)
26
-      }}</el-descriptions-item>
27
-      <el-descriptions-item label="项目类型">{{
28
-        project.projectType
29
-      }}</el-descriptions-item>
30
-      <el-descriptions-item label="承担部门">{{
31
-        getDeptNames(project.undertakingDept)
32
-      }}</el-descriptions-item>
33
-      <el-descriptions-item label="甲方单位">{{
34
-        project.partyA ? project.partyA.partyAName : ""
35
-      }}</el-descriptions-item>
36
-    </el-descriptions>
37
-    <el-divider><b>间接成本</b></el-divider>
38
-    <!-- 选择人员 -->
39
-    <people-table ref="peopleRef" :budgetId="budgetForm.budgetId" @chooseUser="getChooseUser"
40
-      @staffCost="getStaffCost"></people-table>
41
-    <!-- 选择车辆 -->
42
-    <car-table ref="carRef" :budgetId="budgetForm.budgetId" @chooseCar="getChooseCar" @carCost="getCarCost"></car-table>
43
-    <!-- 选择设备 -->
44
-    <device-table ref="deviceRef" :budgetId="budgetForm.budgetId" @chooseDevice="getChooseDevice"
45
-      @deviceCost="getDeviceCost"></device-table>
46
-    <!-- 分割线 -->
47
-    <el-divider><b>直接成本</b></el-divider>
48
-    <!-- 预结算 -->
49
-    <money-table ref="moneyRef" :projectId="this.taskForm.formId" :budgetId="budgetForm.budgetId"
50
-      @settleExpense="getSettleExpense" @contentList="getContentList"></money-table>
51
-    <!-- 其他成本 -->
52
-    <other-table ref="otherRef" @otherCost="getOtherCost" :budgetForm="budgetForm"></other-table>
53
-    <!-- 预算备注 -->
54
-    <el-form :model="budgetForm" style="padding: 20px 100px 0">
55
-      <el-form-item label="预算表单备注" label-width="100px">
56
-        <el-input type="textarea" v-model="budgetForm.remark" placeholder="请输入预算备注" :rows="4"></el-input>
57
-      </el-form-item>
58
-      <el-form-item label="附件上传" label-width="100px">
59
-        <FileUpload v-if="budgetForm.document == null || budgetForm.document == ''" :disabled="taskName != '预算编制'"
60
-          :limit="1" :filePathName="'预算编制/附件上传'" :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']"
61
-          @input="getDocumentPath"></FileUpload>
62
-        <div v-if="budgetForm.document">
63
-          <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + budgetForm.document}`)">
64
-            {{ getFileName(budgetForm.document) }}
65
-          </el-link>
66
-          <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + budgetForm.document}`"
67
-            :underline="false" target="_blank">
68
-            <span class="el-icon-download">下载文件</span>
69
-          </el-link>
70
-          <FileUpload v-if="taskName == '预算编制'" :limit="1" :filePathName="'预算编制/附件上传'"
71
-            :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getDocumentPath"></FileUpload>
72
-        </div>
73
-      </el-form-item>
74
-    </el-form>
75
-    <!-- 统计 -->
76
-    <div class="text-center">
77
-      <el-tag class="ml10 mr10" type="success">间接成本:{{ isNaN(budgetForm.fixCost) ? 0 : budgetForm.fixCost }}</el-tag>
78
-      <el-tag class="ml10 mr10">直接成本:{{
79
-        isNaN(budgetForm.directExpense) ? 0 : budgetForm.directExpense
80
-      }}</el-tag>
81
-      <el-tag class="ml10 mr10" type="danger">预算总成本:{{
82
-        isNaN(budgetForm.totalBudget) ? 0 : budgetForm.totalBudget
83
-      }}</el-tag>
84
-    </div>
85
-    <div class="mt20 text-center" style="color: #909399; font-size: 12px">
86
-      tips:预览表单,请先保存之后刷新再查看
87
-    </div>
88
-    <el-divider></el-divider>
89
-    <div style="text-align: center">
90
-      <el-button type="warning" @click="preserve()">保存</el-button>
91
-      <el-button type="success" @click="viewForm()">预览表单</el-button>
92
-      <el-button type="primary" @click="submitNextFlow" v-if="taskName != '预算批准'">提交下一个流程</el-button>
93
-      <el-button type="primary" @click="submitNextFlow" v-else>结算批准</el-button>
94
-    </div>
95
-    <el-dialog title="表单预览" :visible.sync="viewOpen" width="70%" append-to-body>
96
-      <budget-info :taskName="taskName" :taskForm="taskForm" @goBack="$emit('goBack')"></budget-info>
97
-    </el-dialog>
98
-  </div>
99
-</template>
100
-
101
-<script>
102
-import { Snowflake } from "@/utils/snowFlake.js";
103
-import { getProject } from "@/api/oa/project/project";
104
-import {
105
-  listBudget,
106
-  addBudget,
107
-  updateBudget,
108
-  delBudget,
109
-} from "@/api/oa/budget/budget.js";
110
-import { listBudgetCar, addBudgetCar, delBudgetCar } from "@/api/oa/budget/budgetCar.js";
111
-import {
112
-  listBudgetStaff,
113
-  addBudgetStaff,
114
-  delBudgetStaff,
115
-} from "@/api/oa/budget/budgetStaff.js";
116
-import {
117
-  listBudgetDevice,
118
-  addBudgetDevice,
119
-  delBudgetDevice,
120
-} from "@/api/oa/budget/budgetDevice.js";
121
-import {
122
-  listBudgetSettle,
123
-  addBudgetSettle,
124
-  delBudgetSettle,
125
-} from "@/api/oa/budget/budgetSettle.js";
126
-import { getUsersDeptLeaderByDept, getUsersManageLeaderByDept } from "@/api/system/post";
127
-import { complete, getNextFlowNode } from "@/api/flowable/todo";
128
-import budgetInfo from "./budgetInfo.vue";
129
-import ReturnComment from "@/views/flowable/form/components/flowBtn/returnComment.vue";
130
-import ReturnBtn from "@/views/flowable/form/components/flowBtn/returnBtn.vue";
131
-import CarTable from "./carTable.vue";
132
-import MoneyTable from "./moneyTable.vue";
133
-import PeopleTable from "./staffTable.vue";
134
-import DeviceTable from "./deviceTable.vue";
135
-import OtherTable from "./otherTable.vue";
136
-export default {
137
-  components: {
138
-    ReturnComment,
139
-    ReturnBtn,
140
-    PeopleTable,
141
-    CarTable,
142
-    DeviceTable,
143
-    MoneyTable,
144
-    OtherTable,
145
-    budgetInfo,
146
-  },
147
-  data() {
148
-    return {
149
-      baseUrl: process.env.VUE_APP_BASE_API,
150
-      budgetForm: {
151
-        budgetId: new Snowflake(1n, 1n, 0n).nextId().toString(),
152
-        projectId: "",
153
-        fixCost: 0,
154
-        directExpense: 0,
155
-        totalBudget: 0,
156
-      },
157
-      flag: false,
158
-      project: {},
159
-      showAlter: true,
160
-      returnOpen: false,
161
-      viewOpen: false,
162
-    };
163
-  },
164
-  props: {
165
-    taskForm: {
166
-      type: Object,
167
-      require: true,
168
-    },
169
-    taskName: {
170
-      type: String,
171
-      require: true,
172
-    },
173
-  },
174
-  watch: {
175
-    budgetForm: {
176
-      handler(newVal) {
177
-        if (newVal) {
178
-          this.getFixCost();
179
-          this.getDirectExpense();
180
-          this.getTotalBudget();
181
-        }
182
-      },
183
-      immediate: true, // 立即生效
184
-      deep: true, //监听对象或数组的时候,要用到深度监听
185
-    },
186
-  },
187
-  created() {
188
-    this.getProjectInfo();
189
-    this.initBudgetForm();
190
-  },
191
-  methods: {
192
-    initBudgetForm() {
193
-      listBudget({ pageNum: 1, pageSize: 20, projectId: this.taskForm.formId }).then(
194
-        res => {
195
-          if (res.rows[0] && res.rows[0].budgetId) {
196
-            this.flag = true;
197
-            this.budgetForm = res.rows[0];
198
-            this.budgetId = res.rows[0].budgetId;
199
-          } else {
200
-            this.flag = false;
201
-            this.budgetForm.projectId = this.taskForm.formId;
202
-          }
203
-        }
204
-      );
205
-    },
206
-    getProjectInfo() {
207
-      getProject(this.taskForm.formId).then(response => {
208
-        this.project = response.data;
209
-      });
210
-    },
211
-    // 保存
212
-    preserve() {
213
-      if (!this.flag) {
214
-        this.addBudgetForm(this.budgetForm);
215
-        this.flag = true;
216
-      } else {
217
-        this.updateBudgetForm(this.budgetForm);
218
-      }
219
-      this.$message.success("保存成功");
220
-    },
221
-    viewForm() {
222
-      this.viewOpen = true;
223
-    },
224
-    // 提交下一个流程
225
-    async submitNextFlow() {
226
-      if (this.taskName == "预算编制") {
227
-        this.preserve();
228
-      }
229
-      const params = { taskId: this.taskForm.taskId };
230
-      const deptIdsStr = this.project.undertakingDept;
231
-      const deptIdsArr = deptIdsStr.split(",").map(Number);
232
-      let approvalList = [];
233
-      for (let deptId of deptIdsArr) {
234
-        let res = await getUsersManageLeaderByDept({ deptId });
235
-        if (res.code == 200 && res.data) {
236
-          res.data.forEach(element => {
237
-            approvalList.push(element.userId);
238
-          });
239
-        }
240
-      }
241
-      this.$set(this.taskForm.variables, "approvalList", approvalList); //得到各部门的分管领导列表
242
-      // 提交到下一个流程
243
-      getNextFlowNode(params).then(res => {
244
-        complete(this.taskForm).then(response => {
245
-          this.$modal.msgSuccess(response.msg);
246
-          this.$emit("goBack");
247
-        });
248
-      });
249
-    },
250
-    addBudgetForm(form) {
251
-      addBudget(form);
252
-      for (let user of form.chooseUser) {
253
-        user.budgetId = form.budgetId;
254
-        addBudgetStaff(user);
255
-      }
256
-      for (let car of form.chooseCar) {
257
-        car.budgetId = form.budgetId;
258
-        addBudgetCar(car);
259
-      }
260
-      for (let device of form.chooseDevice) {
261
-        device.budgetId = form.budgetId;
262
-        addBudgetDevice(device);
263
-      }
264
-      for (let work of form.contentList) {
265
-        work.budgetId = form.budgetId;
266
-        addBudgetSettle(work).then(res => {
267
-          this.$message.success("预算添加成功");
268
-        });
269
-      }
270
-    },
271
-    updateBudgetForm(form) {
272
-      updateBudget(form);
273
-      delBudgetStaff(form.budgetId).then(res => {
274
-        for (let user of form.chooseUser) {
275
-          user.budgetId = form.budgetId;
276
-          addBudgetStaff(user);
277
-        }
278
-      });
279
-      delBudgetCar(form.budgetId).then(res => {
280
-        for (let car of form.chooseCar) {
281
-          car.budgetId = form.budgetId;
282
-          addBudgetCar(car);
283
-        }
284
-      });
285
-      delBudgetDevice(form.budgetId).then(res => {
286
-        for (let device of form.chooseDevice) {
287
-          device.budgetId = form.budgetId;
288
-          addBudgetDevice(device);
289
-        }
290
-      });
291
-      delBudgetSettle(form.budgetId).then(res => {
292
-        for (let work of form.contentList) {
293
-          work.budgetId = form.budgetId;
294
-          addBudgetSettle(work);
295
-        }
296
-        this.$message.success("预算添加成功");
297
-      });
298
-    },
299
-    getChooseUser(val) {
300
-      this.$set(this.budgetForm, "chooseUser", val);
301
-    },
302
-    getStaffCost(val) {
303
-      this.$set(this.budgetForm, "staffCost", val);
304
-    },
305
-    getChooseCar(val) {
306
-      this.$set(this.budgetForm, "chooseCar", val);
307
-    },
308
-    getCarCost(val) {
309
-      this.$set(this.budgetForm, "carCost", val);
310
-    },
311
-    getChooseDevice(val) {
312
-      this.$set(this.budgetForm, "chooseDevice", val);
313
-    },
314
-    getDeviceCost(val) {
315
-      this.$set(this.budgetForm, "deviceCost", val);
316
-    },
317
-    getContentList(val) {
318
-      this.$set(this.budgetForm, "contentList", val);
319
-    },
320
-    getSettleExpense(val) {
321
-      this.$set(this.budgetForm, "settleExpense", val);
322
-    },
323
-    getOtherCost(val) {
324
-      this.$set(this.budgetForm, "outExpense", val.outExpense);
325
-      this.$set(this.budgetForm, "rentExpense", val.rentExpense);
326
-      this.$set(this.budgetForm, "otherExpense", val.otherExpense);
327
-      this.$set(this.budgetForm, "taxExpense", val.taxExpense);
328
-      this.$set(this.budgetForm, "businessExpense", val.businessExpense);
329
-    },
330
-    getFixCost() {
331
-      const staffCost = this.safeNumber(this.budgetForm.staffCost);
332
-      const carCost = this.safeNumber(this.budgetForm.carCost);
333
-      const deviceCost = this.safeNumber(this.budgetForm.deviceCost);
334
-      const total = staffCost + carCost + deviceCost;
335
-      this.budgetForm.fixCost = total.toFixed(2);
336
-    },
337
-    safeNumber(value) {
338
-      const num = Number(value);
339
-      return isNaN(num) ? 0 : num;
340
-    },
341
-    // 获取直接成本
342
-    getDirectExpense() {
343
-      const settleExpense = this.safeNumber(this.budgetForm.settleExpense);
344
-      const outExpense = this.safeNumber(this.budgetForm.outExpense);
345
-      const rentExpense = this.safeNumber(this.budgetForm.rentExpense);
346
-      const taxExpense = this.safeNumber(this.budgetForm.taxExpense);
347
-      const businessExpense = this.safeNumber(this.budgetForm.businessExpense);
348
-      const otherExpense = this.safeNumber(this.budgetForm.otherExpense);
349
-      const sum =
350
-        settleExpense +
351
-        outExpense +
352
-        rentExpense +
353
-        taxExpense +
354
-        businessExpense +
355
-        otherExpense;
356
-      this.budgetForm.directExpense = sum.toFixed(2);
357
-    },
358
-    getTotalBudget() {
359
-      this.budgetForm.totalBudget = (
360
-        Number(this.budgetForm.fixCost) + Number(this.budgetForm.directExpense)
361
-      ).toFixed(2);
362
-    },
363
-    isReturn(val) {
364
-      this.showAlter = val;
365
-    },
366
-    commentByRole() {
367
-      if (this.taskName == "分管审核") {
368
-        return this.form.managerComment;
369
-      } else if (this.taskName == "总经理审批") {
370
-        return this.form.gmComment;
371
-      }
372
-    },
373
-    getDocumentPath(val) {
374
-      let arr = val.split('/upload')
375
-      this.budgetForm.document = arr[1]
376
-      if (val == "") {
377
-        this.budgetForm.document = ""
378
-      }
379
-    }
380
-  },
381
-};
382
-</script>
383
-
384
-<style lang="scss" scoped>
385
-.mylabel {
386
-  font-weight: bold;
387
-}
388
-</style>
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-06-21 18:51:51
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-05-09 17:29:35
6
+-->
7
+<template>
8
+  <div class="app-container">
9
+    <h2 class="text-center">项目直接生产成本预算表</h2>
10
+    <p style="text-align: center">编制人:{{ $store.getters.name }}</p>
11
+    <el-divider></el-divider>
12
+    <div class="mt20 mb20" v-if="showAlter">
13
+      <el-alert title="任务被退回,请修改后重新提交" type="error" :closable="false">
14
+        <return-comment :taskForm="taskForm" @isReturn="isReturn"></return-comment>
15
+      </el-alert>
16
+    </div>
17
+    <el-descriptions title="项目信息" labelClassName="mylabel">
18
+      <el-descriptions-item label="项目编号">{{
19
+        project.projectNumber
20
+        }}</el-descriptions-item>
21
+      <el-descriptions-item label="项目名称">{{
22
+        project.projectName
23
+        }}</el-descriptions-item>
24
+      <el-descriptions-item label="项目负责人">{{
25
+        getUserName(project.projectLeader)
26
+        }}</el-descriptions-item>
27
+      <el-descriptions-item label="项目类型">{{
28
+        project.projectType
29
+        }}</el-descriptions-item>
30
+      <el-descriptions-item label="承担部门">{{
31
+        getDeptNames(project.undertakingDept)
32
+        }}</el-descriptions-item>
33
+      <el-descriptions-item label="甲方单位">{{
34
+        project.partyA ? project.partyA.partyAName : ""
35
+        }}</el-descriptions-item>
36
+    </el-descriptions>
37
+    <!-- <el-divider><b>间接成本</b></el-divider> -->
38
+    <!-- 预结算 -->
39
+    <money-table ref="moneyRef" :projectId="this.taskForm.formId" :budgetId="budgetForm.budgetId"
40
+      @settleExpense="getSettleExpense" @contentList="getContentList"></money-table>
41
+    <!-- 选择人员 -->
42
+    <people-table ref="peopleRef" :budgetId="budgetForm.budgetId" :innerSettleLimit="innerSettleLimit"
43
+      @chooseUser="getChooseUser" @staffCost="getStaffCost"
44
+      @innerSettleExceeded="handleInnerSettleExceeded"></people-table>
45
+    <!-- 选择车辆 -->
46
+    <car-table ref="carRef" :budgetId="budgetForm.budgetId" @chooseCar="getChooseCar" @carCost="getCarCost"></car-table>
47
+    <!-- 选择设备 -->
48
+    <device-table ref="deviceRef" :budgetId="budgetForm.budgetId" @chooseDevice="getChooseDevice"
49
+      @deviceCost="getDeviceCost"></device-table>
50
+    <!-- 分割线 -->
51
+    <!-- <el-divider><b>直接成本</b></el-divider> -->
52
+    <!-- 现场开支 -->
53
+    <site-expenses :outer-users="outerUsers" @expensesList="getExpensesList"></site-expenses>
54
+    <!-- 经营填写 -->
55
+
56
+    <!-- 其他成本 -->
57
+    <other-table ref="otherRef" @otherCost="getOtherCost" :budgetForm="budgetForm"></other-table>
58
+    <!-- 预算备注 -->
59
+    <el-form :model="budgetForm" style="padding: 20px 100px 0">
60
+      <el-form-item label="预算表单备注" label-width="100px">
61
+        <el-input type="textarea" v-model="budgetForm.remark" placeholder="请输入预算备注" :rows="4"></el-input>
62
+      </el-form-item>
63
+      <el-form-item label="附件上传" label-width="100px">
64
+        <FileUpload v-if="budgetForm.document == null || budgetForm.document == ''" :disabled="taskName != '预算编制'"
65
+          :limit="1" :filePathName="'预算编制/附件上传'" :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']"
66
+          @input="getDocumentPath"></FileUpload>
67
+        <div v-if="budgetForm.document">
68
+          <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + budgetForm.document}`)">
69
+            {{ getFileName(budgetForm.document) }}
70
+          </el-link>
71
+          <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + budgetForm.document}`"
72
+            :underline="false" target="_blank">
73
+            <span class="el-icon-download">下载文件</span>
74
+          </el-link>
75
+          <FileUpload v-if="taskName == '预算编制'" :limit="1" :filePathName="'预算编制/附件上传'"
76
+            :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getDocumentPath"></FileUpload>
77
+        </div>
78
+      </el-form-item>
79
+    </el-form>
80
+    <!-- 统计 -->
81
+    <div class="text-center">
82
+      <el-tag class="ml10 mr10" type="success">间接成本:{{ isNaN(budgetForm.fixCost) ? 0 : budgetForm.fixCost }}</el-tag>
83
+      <el-tag class="ml10 mr10">直接成本:{{
84
+        isNaN(budgetForm.directExpense) ? 0 : budgetForm.directExpense
85
+        }}</el-tag>
86
+      <el-tag class="ml10 mr10" type="danger">预算总成本:{{
87
+        isNaN(budgetForm.totalBudget) ? 0 : budgetForm.totalBudget
88
+        }}</el-tag>
89
+    </div>
90
+    <div class="mt20 text-center" style="color: #909399; font-size: 12px">
91
+      tips:预览表单,请先保存之后刷新再查看
92
+    </div>
93
+    <el-divider></el-divider>
94
+    <div style="text-align: center">
95
+      <el-button type="warning" @click="preserve()">保存</el-button>
96
+      <el-button type="success" @click="viewForm()">预览表单</el-button>
97
+      <el-button type="primary" @click="submitNextFlow" v-if="taskName != '预算批准'">提交下一个流程</el-button>
98
+      <el-button type="primary" @click="submitNextFlow" v-else>结算批准</el-button>
99
+    </div>
100
+    <el-dialog title="表单预览" :visible.sync="viewOpen" width="70%" append-to-body>
101
+      <budget-info :taskName="taskName" :taskForm="taskForm" @goBack="$emit('goBack')"></budget-info>
102
+    </el-dialog>
103
+  </div>
104
+</template>
105
+
106
+<script>
107
+import { Snowflake } from "@/utils/snowFlake.js";
108
+import { getProject } from "@/api/oa/project/project";
109
+import { listBudget, addBudget, updateBudget, delBudget } from "@/api/oa/budget/budget.js";
110
+import { listBudgetCar, addBudgetCar, delBudgetCar } from "@/api/oa/budget/budgetCar.js";
111
+import { listBudgetStaff, addBudgetStaff, delBudgetStaff } from "@/api/oa/budget/budgetStaff.js";
112
+import { listBudgetDevice, addBudgetDevice, delBudgetDevice } from "@/api/oa/budget/budgetDevice.js";
113
+import { listBudgetSettle, addBudgetSettle, delBudgetSettle } from "@/api/oa/budget/budgetSettle.js";
114
+import { getUsersDeptLeaderByDept, getUsersManageLeaderByDept } from "@/api/system/post";
115
+import { complete, getNextFlowNode } from "@/api/flowable/todo";
116
+import budgetInfo from "./budgetInfo.vue";
117
+import ReturnComment from "@/views/flowable/form/components/flowBtn/returnComment.vue";
118
+import ReturnBtn from "@/views/flowable/form/components/flowBtn/returnBtn.vue";
119
+import CarTable from "./carTable.vue";
120
+import MoneyTable from "./moneyTable.vue";
121
+import PeopleTable from "./staffTable.vue";
122
+import DeviceTable from "./deviceTable.vue";
123
+import OtherTable from "./otherTable.vue";
124
+import SiteExpenses from "./siteExpenses.vue";
125
+export default {
126
+  components: {
127
+    ReturnComment,
128
+    ReturnBtn,
129
+    PeopleTable,
130
+    CarTable,
131
+    DeviceTable,
132
+    MoneyTable,
133
+    OtherTable,
134
+    budgetInfo,
135
+    SiteExpenses
136
+  },
137
+  data() {
138
+    return {
139
+      baseUrl: process.env.VUE_APP_BASE_API,
140
+      budgetForm: {
141
+        budgetId: new Snowflake(1n, 1n, 0n).nextId().toString(),
142
+        projectId: "",
143
+        fixCost: 0,
144
+        directExpense: 0,
145
+        totalBudget: 0,
146
+      },
147
+      flag: false,
148
+      project: {},
149
+      showAlter: true,
150
+      returnOpen: false,
151
+      viewOpen: false,
152
+      innerSettleLimit: 0, // 内业预算绩效合计限制
153
+      outerUsers: [], // 存储外业人员
154
+    };
155
+  },
156
+  props: {
157
+    taskForm: {
158
+      type: Object,
159
+      require: true,
160
+    },
161
+    taskName: {
162
+      type: String,
163
+      require: true,
164
+    },
165
+  },
166
+  watch: {
167
+    budgetForm: {
168
+      handler(newVal) {
169
+        if (newVal) {
170
+          this.getFixCost();
171
+          this.getDirectExpense();
172
+          this.getTotalBudget();
173
+        }
174
+      },
175
+      immediate: true, // 立即生效
176
+      deep: true, //监听对象或数组的时候,要用到深度监听
177
+    },
178
+  },
179
+  created() {
180
+    this.getProjectInfo();
181
+    this.initBudgetForm();
182
+  },
183
+  methods: {
184
+    initBudgetForm() {
185
+      listBudget({ pageNum: 1, pageSize: 20, projectId: this.taskForm.formId }).then(
186
+        res => {
187
+          if (res.rows[0] && res.rows[0].budgetId) {
188
+            this.flag = true;
189
+            this.budgetForm = res.rows[0];
190
+            this.budgetId = res.rows[0].budgetId;
191
+          } else {
192
+            this.flag = false;
193
+            this.budgetForm.projectId = this.taskForm.formId;
194
+          }
195
+        }
196
+      );
197
+    },
198
+    getProjectInfo() {
199
+      getProject(this.taskForm.formId).then(response => {
200
+        this.project = response.data;
201
+      });
202
+    },
203
+    // 保存
204
+    preserve() {
205
+      console.log(this.budgetForm)
206
+      return
207
+      if (!this.flag) {
208
+        this.addBudgetForm(this.budgetForm);
209
+        this.flag = true;
210
+      } else {
211
+        this.updateBudgetForm(this.budgetForm);
212
+      }
213
+      this.$message.success("保存成功");
214
+    },
215
+    viewForm() {
216
+      this.viewOpen = true;
217
+    },
218
+    // 提交下一个流程
219
+    async submitNextFlow() {
220
+      if (this.taskName == "预算编制") {
221
+        this.preserve();
222
+      }
223
+      const params = { taskId: this.taskForm.taskId };
224
+      const deptIdsStr = this.project.undertakingDept;
225
+      const deptIdsArr = deptIdsStr.split(",").map(Number);
226
+      let approvalList = [];
227
+      for (let deptId of deptIdsArr) {
228
+        let res = await getUsersManageLeaderByDept({ deptId });
229
+        if (res.code == 200 && res.data) {
230
+          res.data.forEach(element => {
231
+            approvalList.push(element.userId);
232
+          });
233
+        }
234
+      }
235
+      this.$set(this.taskForm.variables, "approvalList", approvalList); //得到各部门的分管领导列表
236
+      // 提交到下一个流程
237
+      getNextFlowNode(params).then(res => {
238
+        complete(this.taskForm).then(response => {
239
+          this.$modal.msgSuccess(response.msg);
240
+          this.$emit("goBack");
241
+        });
242
+      });
243
+    },
244
+    addBudgetForm(form) {
245
+      addBudget(form);
246
+      for (let user of form.chooseUser) {
247
+        user.budgetId = form.budgetId;
248
+        addBudgetStaff(user);
249
+      }
250
+      for (let car of form.chooseCar) {
251
+        car.budgetId = form.budgetId;
252
+        addBudgetCar(car);
253
+      }
254
+      for (let device of form.chooseDevice) {
255
+        device.budgetId = form.budgetId;
256
+        addBudgetDevice(device);
257
+      }
258
+      for (let work of form.contentList) {
259
+        work.budgetId = form.budgetId;
260
+        addBudgetSettle(work).then(res => {
261
+          this.$message.success("预算添加成功");
262
+        });
263
+      }
264
+    },
265
+    updateBudgetForm(form) {
266
+      updateBudget(form);
267
+      delBudgetStaff(form.budgetId).then(res => {
268
+        for (let user of form.chooseUser) {
269
+          user.budgetId = form.budgetId;
270
+          addBudgetStaff(user);
271
+        }
272
+      });
273
+      delBudgetCar(form.budgetId).then(res => {
274
+        for (let car of form.chooseCar) {
275
+          car.budgetId = form.budgetId;
276
+          addBudgetCar(car);
277
+        }
278
+      });
279
+      delBudgetDevice(form.budgetId).then(res => {
280
+        for (let device of form.chooseDevice) {
281
+          device.budgetId = form.budgetId;
282
+          addBudgetDevice(device);
283
+        }
284
+      });
285
+      delBudgetSettle(form.budgetId).then(res => {
286
+        for (let work of form.contentList) {
287
+          work.budgetId = form.budgetId;
288
+          addBudgetSettle(work);
289
+        }
290
+        this.$message.success("预算添加成功");
291
+      });
292
+    },
293
+    getChooseUser(val) {
294
+      this.$set(this.budgetForm, "chooseUser", val);
295
+      // 从选择的人员中筛选出外业人员
296
+      this.outerUsers = val.filter(user => user.type === '外业');
297
+    },
298
+    getStaffCost(val) {
299
+      this.$set(this.budgetForm, "staffCost", val);
300
+    },
301
+    getChooseCar(val) {
302
+      this.$set(this.budgetForm, "chooseCar", val);
303
+    },
304
+    getCarCost(val) {
305
+      this.$set(this.budgetForm, "carCost", val);
306
+    },
307
+    getChooseDevice(val) {
308
+      this.$set(this.budgetForm, "chooseDevice", val);
309
+    },
310
+    getExpensesList(val) {
311
+      this.$set(this.budgetForm, "expensesList", val);
312
+    },
313
+    getDeviceCost(val) {
314
+      this.$set(this.budgetForm, "deviceCost", val);
315
+    },
316
+    getContentList(val) {
317
+      this.$set(this.budgetForm, "contentList", val);
318
+    },
319
+    getSettleExpense(val) {
320
+      this.innerSettleLimit = val;
321
+    },
322
+    handleInnerSettleExceeded(data) {
323
+      // this.$message.error(`内业预算绩效总额(${data.current.toFixed(2)})超出限制(${data.limit})`);
324
+    },
325
+    getOtherCost(val) {
326
+      this.$set(this.budgetForm, "outExpense", val.outExpense);
327
+      this.$set(this.budgetForm, "letterExpense", val.letterExpense);
328
+      this.$set(this.budgetForm, "winExpense", val.winExpense);
329
+      this.$set(this.budgetForm, "taxExpense", val.taxExpense);
330
+      this.$set(this.budgetForm, "travelExpense", val.travelExpense);
331
+    },
332
+    getFixCost() {
333
+      const staffCost = this.safeNumber(this.budgetForm.staffCost);
334
+      const carCost = this.safeNumber(this.budgetForm.carCost);
335
+      const deviceCost = this.safeNumber(this.budgetForm.deviceCost);
336
+      const total = staffCost + carCost + deviceCost;
337
+      this.budgetForm.fixCost = total.toFixed(2);
338
+    },
339
+    safeNumber(value) {
340
+      const num = Number(value);
341
+      return isNaN(num) ? 0 : num;
342
+    },
343
+    // 获取直接成本
344
+    getDirectExpense() {
345
+      const settleExpense = this.safeNumber(this.budgetForm.settleExpense);
346
+      const outExpense = this.safeNumber(this.budgetForm.outExpense);
347
+      const letterExpense = this.safeNumber(this.budgetForm.letterExpense);
348
+      const taxExpense = this.safeNumber(this.budgetForm.taxExpense);
349
+      const winExpense = this.safeNumber(this.budgetForm.winExpense);
350
+      const travelExpense = this.safeNumber(this.budgetForm.travelExpense);
351
+      const sum =
352
+        settleExpense +
353
+        outExpense +
354
+        letterExpense +
355
+        taxExpense +
356
+        winExpense +
357
+        travelExpense;
358
+      this.budgetForm.directExpense = sum.toFixed(2);
359
+    },
360
+    getTotalBudget() {
361
+      this.budgetForm.totalBudget = (
362
+        Number(this.budgetForm.fixCost) + Number(this.budgetForm.directExpense)
363
+      ).toFixed(2);
364
+    },
365
+    isReturn(val) {
366
+      this.showAlter = val;
367
+    },
368
+    commentByRole() {
369
+      if (this.taskName == "分管审核") {
370
+        return this.form.managerComment;
371
+      } else if (this.taskName == "总经理审批") {
372
+        return this.form.gmComment;
373
+      }
374
+    },
375
+    getDocumentPath(val) {
376
+      let arr = val.split('/upload')
377
+      this.budgetForm.document = arr[1]
378
+      if (val == "") {
379
+        this.budgetForm.document = ""
380
+      }
381
+    }
382
+  },
383
+};
384
+</script>
385
+
386
+<style lang="scss" scoped>
387
+.mylabel {
388
+  font-weight: bold;
389
+}
390
+</style>

+ 39
- 39
oa-ui/src/views/flowable/form/budget/budget.vue 查看文件

@@ -1,40 +1,40 @@
1
-<!--
2
- * @Author: ysh
3
- * @Date: 2024-04-08 16:08:33
4
- * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-12-16 09:20:14
6
--->
7
-<template>
8
-  <div>
9
-    <add-budget :taskName="taskName" :taskForm="taskForm" @goBack="goBack" v-if="taskName == '预算编制'"></add-budget>
10
-    <budget-info :taskName="taskName" :taskForm="taskForm" @goBack="goBack" v-if="taskName == '分管审核' || taskName == '总经理审核' || taskName == '预算批准'"></budget-info>
11
-  </div>
12
-</template>
13
-
14
-<script>
15
-import AddBudget from '@/views/flowable/form/budget/addBudget.vue';
16
-import BudgetInfo from './budgetInfo.vue';
17
-export default {
18
-  props: {
19
-    taskName: {
20
-      type: String,
21
-      require: true
22
-    },
23
-    taskForm: {
24
-      type: Object,
25
-      require: true
26
-    }
27
-  },
28
-  components: {
29
-    AddBudget,
30
-    BudgetInfo
31
-  },
32
-  methods: {
33
-    goBack() {
34
-      this.$emit('goBack')
35
-    }
36
-  }
37
-}
38
-</script>
39
-
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-04-08 16:08:33
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-12-16 09:20:14
6
+-->
7
+<template>
8
+  <div>
9
+    <add-budget :taskName="taskName" :taskForm="taskForm" @goBack="goBack" v-if="taskName == '预算编制'"></add-budget>
10
+    <budget-info :taskName="taskName" :taskForm="taskForm" @goBack="goBack" v-if="taskName == '分管审核' || taskName == '总经理审核' || taskName == '预算批准'"></budget-info>
11
+  </div>
12
+</template>
13
+
14
+<script>
15
+import AddBudget from '@/views/flowable/form/budget/addBudget.vue';
16
+import BudgetInfo from './budgetInfo.vue';
17
+export default {
18
+  props: {
19
+    taskName: {
20
+      type: String,
21
+      require: true
22
+    },
23
+    taskForm: {
24
+      type: Object,
25
+      require: true
26
+    }
27
+  },
28
+  components: {
29
+    AddBudget,
30
+    BudgetInfo
31
+  },
32
+  methods: {
33
+    goBack() {
34
+      this.$emit('goBack')
35
+    }
36
+  }
37
+}
38
+</script>
39
+
40 40
 <style lang="scss" scoped></style>

+ 2
- 2
oa-ui/src/views/flowable/form/budget/budgetInfo.vue 查看文件

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-04-03 16:28:09
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-04-21 09:47:55
5
+ * @LastEditTime: 2025-04-24 10:55:22
6 6
 -->
7 7
 <template>
8 8
   <div class="main">
@@ -282,7 +282,7 @@
282 282
         <el-descriptions-item label="备注" :span="1">
283 283
           {{ budgetForm.businessRemark }}
284 284
         </el-descriptions-item>
285
-        <el-descriptions-item label="预算附件" :span="3">
285
+        <el-descriptions-item label="预算附件" :span="3" v-if="budgetForm.document">
286 286
           <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + budgetForm.document}`)">
287 287
             {{ getFileName(budgetForm.document) }}
288 288
           </el-link>

+ 7
- 27
oa-ui/src/views/flowable/form/budget/carTable.vue 查看文件

@@ -13,46 +13,26 @@
13 13
       <el-form-item v-if="chooseCar.length != 0">
14 14
         <table border="1">
15 15
           <tr>
16
-            <td :colspan="9" class="head">车辆成本预算</td>
16
+            <td :colspan="4" class="head">车辆成本预算</td>
17 17
           </tr>
18 18
           <tr>
19 19
             <td style="width: 120px">车牌号</td>
20
-            <td style="width: 100px">油耗(元/km)</td>
21
-            <td style="width: 100px">保险(元/天)</td>
22
-            <td style="width: 100px">维修(元/天)</td>
23 20
             <td style="width: 110px">折旧成本(天)</td>
24
-            <td style="width: 100px">总里程</td>
25 21
             <td style="width: 110px">预算天数</td>
26
-            <td style="width: 110px">过路费</td>
27 22
             <td style="width: 100px">总额</td>
28 23
           </tr>
29 24
           <tr v-for="car in chooseCar" :key="car.carId">
30 25
             <td>{{ car.licensePlate + car.brand }}</td>
31
-            <td>
32
-              {{ car.fuel }}
33
-            </td>
34
-            <td>
35
-              {{ car.insurance }}
36
-            </td>
37
-            <td>
38
-              {{ car.maintenance }}
39
-            </td>
40 26
             <td>
41 27
               {{ car.dayCost }}
42 28
             </td>
43 29
             <td>
44
-              <el-input v-model="car.distance" placeholder="请输入总里程" @blur="calculateCarTotal(car)"></el-input>
45
-            </td>
46
-            <td>
47
-              <el-input v-model="car.days" placeholder="请输入天数" @blur="calculateCarTotal(car)"></el-input>
48
-            </td>
49
-            <td>
50
-              <el-input v-model="car.toll" placeholder="请输入过路费" @blur="calculateCarTotal(car)"></el-input>
30
+              <el-input-number  :controls="false" v-model="car.days" placeholder="请输入天数" @blur="calculateCarTotal(car)"></el-input-number>
51 31
             </td>
52 32
             <td class="carCost">{{ car.expense }}</td>
53 33
           </tr>
54 34
           <tr>
55
-            <td colspan="8">车辆成本合计</td>
35
+            <td colspan="3">车辆成本合计</td>
56 36
             <td>{{ form.carCost }}</td>
57 37
           </tr>
58 38
         </table>
@@ -137,10 +117,9 @@ export default {
137 117
       this.recalculateCost(val, 'expense', 'carCost');
138 118
     },
139 119
     calculateCarTotal(car) {
140
-      let total1 = Number(car.fuel) * Number(car.distance);
141
-      let total2 = (Number(car.insurance) + Number(car.maintenance) + Number(car.dayCost)) * Number(car.days);
142
-      let sum = (total1 + total2 + Number(car.toll)).toFixed(2);
143
-      this.$set(car, "depreciation", total2.toFixed(2));
120
+      let total = Number(car.dayCost) * Number(car.days);
121
+      let sum = total.toFixed(2);
122
+      this.$set(car, "depreciation", car.dayCost);
144 123
       this.$set(car, "expense", sum);
145 124
       this.getCost("expense", "carCost", this.chooseCar);
146 125
     },
@@ -186,6 +165,7 @@ table {
186 165
     background-color: #e7f6f3;
187 166
     font-family: '微软雅黑';
188 167
     font-size: 18;
168
+    font-weight: bold;
189 169
   }
190 170
 }
191 171
 </style>

+ 2
- 1
oa-ui/src/views/flowable/form/budget/deviceTable.vue 查看文件

@@ -19,7 +19,7 @@
19 19
             <td style="width: 120px">设备名称</td>
20 20
             <td style="width: 120px">规格型号</td>
21 21
             <td style="width: 120px">品牌</td>
22
-            <td>折旧成本(天)</td>
22
+            <td style="width: 120px">折旧成本(天)</td>
23 23
             <td style="width: 100px">预算天数</td>
24 24
             <td style="width: 100px">总额</td>
25 25
           </tr>
@@ -165,6 +165,7 @@ table {
165 165
     background-color: #e7f6f3;
166 166
     font-family: '微软雅黑';
167 167
     font-size: 18;
168
+    font-weight: bold;
168 169
   }
169 170
 }
170 171
 </style>

+ 3
- 2
oa-ui/src/views/flowable/form/budget/moneyTable.vue 查看文件

@@ -43,7 +43,7 @@
43 43
       <el-form-item>
44 44
         <table border="1">
45 45
           <tr class="head">
46
-            <td colspan="11">项目预结算</td>
46
+            <td colspan="11">内业预算绩效</td>
47 47
           </tr>
48 48
           <tr class="content-head">
49 49
             <td style="width: 100px;">工作简述</td>
@@ -135,7 +135,7 @@
135 135
             </td>
136 136
           </tr>
137 137
           <tr>
138
-            <td colspan="10">预算合计</td>
138
+            <td colspan="10">内业预算绩效合计</td>
139 139
             <td colspan="1">{{ Number(settle).toFixed(2) }}</td>
140 140
           </tr>
141 141
         </table>
@@ -455,6 +455,7 @@ table {
455 455
     background-color: #e7f6f3;
456 456
     font-family: '微软雅黑';
457 457
     font-size: 18;
458
+    font-weight: bold;
458 459
   }
459 460
 }
460 461
 </style>

+ 16
- 16
oa-ui/src/views/flowable/form/budget/otherTable.vue 查看文件

@@ -2,12 +2,12 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-12-11 17:21:00
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-23 14:05:03
5
+ * @LastEditTime: 2025-05-06 17:15:03
6 6
 -->
7 7
 <template>
8 8
   <div>
9
-    <el-form :model="form">
10
-      <el-form-item>
9
+    <el-form :model="form" style="padding: 20px 100px 0">
10
+      <el-form-item label="经营相关:">
11 11
         <table border="1">
12 12
           <tr class="head">
13 13
             <td>内容</td>
@@ -25,9 +25,9 @@
25 25
             </td>
26 26
           </tr>
27 27
           <tr>
28
-            <td>车船租赁</td>
28
+            <td>保函费用</td>
29 29
             <td>
30
-              <el-input-number :controls="false" style="width:100%;" v-model="form.rentExpense"
30
+              <el-input-number :controls="false" style="width:100%;" v-model="form.letterExpense"
31 31
                 @blur="computedDirectExpense()"></el-input-number>
32 32
             </td>
33 33
             <td>
@@ -35,9 +35,9 @@
35 35
             </td>
36 36
           </tr>
37 37
           <tr>
38
-            <td>其他费用</td>
38
+            <td>中标服务费</td>
39 39
             <td>
40
-              <el-input-number :controls="false" style="width:100%;" v-model="form.otherExpense"
40
+              <el-input-number :controls="false" style="width:100%;" v-model="form.winExpense"
41 41
                 @blur="computedDirectExpense()"></el-input-number>
42 42
             </td>
43 43
             <td>
@@ -45,7 +45,7 @@
45 45
             </td>
46 46
           </tr>
47 47
           <tr>
48
-            <td>税费成本</td>
48
+            <td>税费</td>
49 49
             <td>
50 50
               <el-input-number :controls="false" style="width:100%;" v-model="form.taxExpense"
51 51
                 @blur="computedDirectExpense()"></el-input-number>
@@ -55,9 +55,9 @@
55 55
             </td>
56 56
           </tr>
57 57
           <tr>
58
-            <td>经营管理费用</td>
58
+            <td>管理出差</td>
59 59
             <td>
60
-              <el-input-number :controls="false" style="width:100%;" v-model="form.businessExpense"
60
+              <el-input-number :controls="false" style="width:100%;" v-model="form.travelExpense"
61 61
                 @blur="computedDirectExpense()"></el-input-number>
62 62
             </td>
63 63
             <td>
@@ -83,10 +83,10 @@ export default {
83 83
     return {
84 84
       form: {
85 85
         outExpense: 0,
86
-        rentExpense: 0,
87
-        otherExpense: 0,
86
+        letterExpense: 0,
87
+        winExpense: 0,
88 88
         taxExpense: 0,
89
-        businessExpense: 0
89
+        travelExpense: 0,
90 90
       }
91 91
     }
92 92
   },
@@ -108,10 +108,10 @@ export default {
108 108
     initTable(val) {
109 109
       this.form = val;
110 110
       this.form.outExpense == undefined ? this.form.outExpense = 0 : this.form.outExpense
111
-      this.form.rentExpense == undefined ? this.form.rentExpense = 0 : this.form.rentExpense
112
-      this.form.otherExpense == undefined ? this.form.otherExpense = 0 : this.form.otherExpense
111
+      this.form.letterExpense == undefined ? this.form.letterExpense = 0 : this.form.letterExpense
112
+      this.form.winExpense == undefined ? this.form.winExpense = 0 : this.form.winExpense
113 113
       this.form.taxExpense == undefined ? this.form.taxExpense = 0 : this.form.taxExpense
114
-      this.form.businessExpense == undefined ? this.form.businessExpense = 0 : this.form.businessExpense
114
+      this.form.travelExpense == undefined ? this.form.travelExpense = 0 : this.form.travelExpense
115 115
     },
116 116
     safeNumber(value) {
117 117
       const num = Number(value);

+ 236
- 49
oa-ui/src/views/flowable/form/budget/staffTable.vue 查看文件

@@ -1,76 +1,183 @@
1 1
 <template>
2 2
   <div class="app-container">
3 3
     <el-form ref="form" :model="form" style="padding: 20px 100px 0">
4
-      <!-- 选择人员 -->
5
-      <el-form-item label="选择人员:">
6
-        <span v-if="chooseUser.length != 0">
7
-          <el-tag effect="plain" type="success" v-for="item in chooseUser" style="margin: 5px; font-size: 14px"
4
+      <!-- 选择内业人员 -->
5
+      <el-form-item label="选择内业人员:">
6
+        <span v-if="innerUsers.length != 0">
7
+          <el-tag effect="plain" type="success" v-for="item in innerUsers" style="margin: 5px; font-size: 14px"
8 8
             :key="item.userId">
9 9
             {{ item.nickName }}
10 10
           </el-tag>
11 11
         </span>
12
-        <el-button type="success" plain icon="el-icon-plus" @click="openPeople = true" size="mini">选择</el-button>
12
+        <el-button type="success" plain icon="el-icon-plus" @click="openPeople('inner')" size="mini">选择</el-button>
13 13
       </el-form-item>
14
-      <div class="mb20" style="color:#E23D28;font-size:12px;">
14
+
15
+      <!-- <div class="mb20" style="color:#E23D28;font-size:12px;">
15 16
         tips:人员成本=(基础工资+岗位工资)/21.75,固定工资中的年功工资暂忽略不计,绩效工资计入直接成本,津贴补贴、五险一金扣除暂未考虑
16
-      </div>
17
-      <el-form-item v-if="chooseUser.length != 0">
17
+      </div> -->
18
+
19
+      <!-- 内业人员表格 -->
20
+      <el-form-item v-if="innerUsers.length != 0">
18 21
         <table border="1">
19 22
           <tr>
20
-            <td :colspan="5" class="head">表1:人员成本预算</td>
23
+            <td :colspan="8" class="head">内业人员成本预算</td>
21 24
           </tr>
22 25
           <tr>
23 26
             <td style="width: 50px">序号</td>
24 27
             <td style="width: 80px">姓名</td>
25 28
             <td style="width: 100px">部门</td>
29
+            <td style="width: 100px">人员成本(天)</td>
26 30
             <td style="width: 100px">预算天数</td>
31
+            <td style="width: 100px">预算绩效</td>
32
+            <td style="width: 100px">金额</td>
33
+            <td style="width: 100px">备注</td>
34
+          </tr>
35
+          <tr v-for="user, index in innerUsers" :key="user.userId">
36
+            <td>{{ index + 1 }}</td>
37
+            <td>{{ user.nickName }}</td>
38
+            <td>{{ user.dept ? user.dept.deptName : user.deptName }}</td>
39
+            <td>
40
+              {{ parseFloat((user.salary.salary + 1780) / 21.75).toFixed(2) }}
41
+            </td>
42
+            <td>
43
+              <el-input-number :controls="false" v-model="user.days" placeholder="请输入天数"
44
+                @blur="calculateUserTotal(user)"></el-input-number>
45
+            </td>
46
+            <td>
47
+              <el-input-number :controls="false" v-model="user.performance" placeholder="请输入预算绩效"
48
+                @blur="calculateUserTotal(user)"></el-input-number>
49
+              <el-button type="text" @click="openCalculatePerformance(user)">计算绩效</el-button>
50
+            </td>
51
+            <td class="staffCost">{{ user.amount }}</td>
52
+            <td>
53
+              <el-input v-model="user.remark" type="textarea"></el-input>
54
+            </td>
55
+          </tr>
56
+          <tr>
57
+            <td colspan="4">合计</td>
58
+            <td>{{ form.innerDays }}</td>
59
+            <td>{{ form.innerSettle }}</td>
60
+            <td>{{ form.innerStaffCost }}</td>
61
+          </tr>
62
+        </table>
63
+      </el-form-item>
64
+
65
+
66
+      <!-- 选择外业人员 -->
67
+      <el-form-item label="选择外业人员:">
68
+        <span v-if="outerUsers.length != 0">
69
+          <el-tag effect="plain" type="success" v-for="item in outerUsers" style="margin: 5px; font-size: 14px"
70
+            :key="item.userId">
71
+            {{ item.nickName }}
72
+          </el-tag>
73
+        </span>
74
+        <el-button type="success" plain icon="el-icon-plus" @click="openPeople('outer')" size="mini">选择</el-button>
75
+      </el-form-item>
76
+      <!-- 外业人员表格 -->
77
+      <el-form-item v-if="outerUsers.length != 0">
78
+        <table border="1">
79
+          <tr>
80
+            <td :colspan="9" class="head">外业人员成本预算</td>
81
+          </tr>
82
+          <tr>
83
+            <td style="width: 50px">序号</td>
84
+            <td style="width: 80px">姓名</td>
85
+            <td style="width: 100px">部门</td>
86
+            <td style="width: 100px">人员成本(天)</td>
87
+            <td style="width: 100px">预算天数</td>
88
+            <td style="width: 100px">预算系数</td>
89
+            <td style="width: 100px">预算绩效</td>
27 90
             <td style="width: 100px">总额</td>
91
+            <td style="width: 100px">备注</td>
28 92
           </tr>
29
-          <tr v-for="user, index in chooseUser" :key="user.userId">
93
+          <tr v-for="user, index in outerUsers" :key="user.userId">
30 94
             <td>{{ index + 1 }}</td>
31 95
             <td>{{ user.nickName }}</td>
32 96
             <td>{{ user.dept ? user.dept.deptName : user.deptName }}</td>
33 97
             <td>
34
-              <el-input v-model="user.days" placeholder="请输入天数" @blur="calculateUserTotal(user)"></el-input>
98
+              {{ parseFloat((user.salary.salary + 1780) / 21.75).toFixed(2) }}
99
+            </td>
100
+            <td>
101
+              <el-input-number :controls="false" v-model="user.days" placeholder="请输入天数"
102
+                @blur="calculateUserTotal(user)"></el-input-number>
103
+            </td>
104
+            <td>
105
+              <el-input-number :controls="false" v-model="user.coefficient" placeholder="请输入系数"
106
+                @blur="calculateUserTotal(user)"></el-input-number>
107
+            </td>
108
+            <td>
109
+              {{ user.performance }}
110
+            </td>
111
+            <td class="staffCost">{{ user.amount }}</td>
112
+            <td>
113
+              <el-input v-model="user.remark" type="textarea"></el-input>
35 114
             </td>
36
-            <td class="staffCost">{{ user.staffCost }}</td>
37 115
           </tr>
38 116
           <tr>
39
-            <td colspan="4">人员成本合计</td>
40
-            <td>{{ form.staffCost }}</td>
117
+            <td colspan="6">合计</td>
118
+            <td>{{ form.outerSettle }}</td>
119
+            <td>{{ form.outerStaffCost }}</td>
41 120
           </tr>
42 121
         </table>
43 122
       </el-form-item>
44 123
 
124
+      <!-- 总成本合计 -->
125
+      <el-form-item v-if="innerUsers.length != 0 || outerUsers.length != 0">
126
+        <table border="1">
127
+          <tr>
128
+            <td colspan="6"><b>人员成本总计</b></td>
129
+            <td><b>{{ form.staffCost }}</b></td>
130
+          </tr>
131
+        </table>
132
+      </el-form-item>
45 133
     </el-form>
46 134
 
47 135
     <!-- 选择人员对话框 -->
48
-    <el-dialog title="选择人员" :visible.sync="openPeople" width="700px" append-to-body>
136
+    <el-dialog :title="currentType === 'inner' ? '选择内业人员' : '选择外业人员'" :visible.sync="isOpenPeople" width="700px"
137
+      append-to-body>
49 138
       <choosePeople @chooseUser="getChooseUser"></choosePeople>
50 139
     </el-dialog>
140
+
141
+    <!-- 计算绩效对话框 -->
142
+    <calculate-performance ref="calculatePerformance" @confirm="handlePerformanceConfirm"></calculate-performance>
51 143
   </div>
52 144
 </template>
53 145
 
54 146
 <script>
55 147
 import { listBudgetStaff, addBudgetStaff, delBudgetStaff } from "@/api/oa/budget/budgetStaff.js";
56 148
 import choosePeople from './components/choosePeople.vue';
149
+import calculatePerformance from './components/calculatePerformance.vue';
57 150
 export default {
58 151
   components: {
59
-    choosePeople
152
+    choosePeople,
153
+    calculatePerformance
60 154
   },
61 155
   props: {
62 156
     budgetId: {
63 157
       type: String,
64 158
       default: ''
159
+    },
160
+    innerSettleLimit: {
161
+      type: [Number, String],
162
+      default: 0
65 163
     }
66 164
   },
67 165
   data() {
68 166
     return {
69 167
       form: {
70
-        staffCost: 0
168
+        staffCost: 0,
169
+        innerStaffCost: 0,
170
+        outerStaffCost: 0,
171
+        innerDays: 0,
172
+        innerSettle: 0,
173
+        outerDays: 0,
174
+        outerSettle: 0
71 175
       },
72
-      chooseUser: [],
73
-      openPeople: false,
176
+      innerUsers: [],
177
+      outerUsers: [],
178
+      isOpenPeople: false,
179
+      currentType: '', // 当前选择的类型:inner 或 outer
180
+      currentUser: null, // 当前操作的用户
74 181
     }
75 182
   },
76 183
   watch: {
@@ -82,12 +189,19 @@ export default {
82 189
     budgetId() {
83 190
       this.initForm()
84 191
     },
85
-    chooseUser: {
192
+    innerUsers: {
86 193
       handler(newVal) {
87
-        this.$emit('chooseUser', newVal)
194
+        this.$emit('chooseUser', [...newVal, ...this.outerUsers])
88 195
       },
89
-      immediate: true, // 立即生效
90
-      deep: true  //监听对象或数组的时候,要用到深度监听
196
+      immediate: true,
197
+      deep: true
198
+    },
199
+    outerUsers: {
200
+      handler(newVal) {
201
+        this.$emit('chooseUser', [...this.innerUsers, ...newVal])
202
+      },
203
+      immediate: true,
204
+      deep: true
91 205
     }
92 206
   },
93 207
   created() {
@@ -97,8 +211,10 @@ export default {
97 211
     initForm() {
98 212
       if (this.budgetId != '') {
99 213
         listBudgetStaff({ pageSize: 100, budgetId: this.budgetId }).then((res) => {
100
-          this.chooseUser = res.rows;
101
-          for (let user of this.chooseUser) {
214
+          const allUsers = res.rows;
215
+          this.innerUsers = allUsers.filter(user => user.type === 'inner');
216
+          this.outerUsers = allUsers.filter(user => user.type === 'outer');
217
+          for (let user of [...this.innerUsers, ...this.outerUsers]) {
102 218
             user.nickName = this.getUserName(user.userId);
103 219
             user.deptName = this.getDeptName(user.user.deptId);
104 220
           }
@@ -107,47 +223,117 @@ export default {
107 223
       }
108 224
     },
109 225
     initStaffCost() {
110
-      let staffCost = 0;
111
-      for (let user of this.chooseUser) {
112
-        staffCost = staffCost + Number(user.staffCost);
226
+      this.updateStaffCosts();
227
+    },
228
+    updateStaffCosts() {
229
+      let innerStaffCost = 0;
230
+      let outerStaffCost = 0;
231
+      let innerDays = 0;
232
+      let innerSettle = 0;
233
+      let outerDays = 0;
234
+      let outerSettle = 0;
235
+
236
+      for (let user of this.innerUsers) {
237
+        if (user.amount) {
238
+          innerStaffCost += Number(user.amount);
239
+        }
240
+        if (user.days) {
241
+          innerDays += Number(user.days);
242
+        }
243
+        if (user.performance) {
244
+          innerSettle += Number(user.performance);
245
+        }
246
+      }
247
+
248
+      for (let user of this.outerUsers) {
249
+        if (user.amount) {
250
+          outerStaffCost += Number(user.amount);
251
+        }
252
+        if (user.days) {
253
+          outerDays += Number(user.days);
254
+        }
255
+        if (user.performance) {
256
+          outerSettle += Number(user.performance);
257
+        }
258
+      }
259
+
260
+      // 验证内业预算绩效是否超过限制
261
+      if (innerSettle > Number(this.innerSettleLimit)) {
262
+        this.$message.warning(`内业预算绩效总额(${innerSettle.toFixed(2)})不能超过内业预算绩效合计(${this.innerSettleLimit})`);
263
+        // 发出警告事件
264
+        this.$emit('innerSettleExceeded', {
265
+          current: innerSettle,
266
+          limit: this.innerSettleLimit
267
+        });
113 268
       }
114
-      this.form.staffCost = staffCost.toFixed(2)
269
+
270
+      this.$set(this.form, 'innerStaffCost', innerStaffCost.toFixed(2));
271
+      this.$set(this.form, 'outerStaffCost', outerStaffCost.toFixed(2));
272
+      this.$set(this.form, 'staffCost', (innerStaffCost + outerStaffCost).toFixed(2));
273
+      this.$set(this.form, 'innerDays', innerDays.toFixed(2));
274
+      this.$set(this.form, 'innerSettle', innerSettle.toFixed(2));
275
+      this.$set(this.form, 'outerDays', outerDays.toFixed(2));
276
+      this.$set(this.form, 'outerSettle', outerSettle.toFixed(2));
115 277
     },
116 278
     getChooseUser(val) {
117 279
       for (let v of val) {
118 280
         if (v.deptId === 115) {
119 281
           v.salary = { salary: 7898.75 }
120 282
         }
283
+        v.type = this.currentType === 'inner' ? '内业' : '外业';
284
+        v.days = 0; // 初始化天数为0
285
+        v.staffCost = 0; // 初始化成本为0
286
+        v.coefficient = 1; // 初始化系数为1
287
+        v.otherCoefficient = 1; // 初始化其他系数为1
288
+      }
289
+      if (this.currentType === 'inner') {
290
+        this.innerUsers = val;
291
+      } else {
292
+        this.outerUsers = val;
121 293
       }
122
-      this.chooseUser = val;
123
-      this.openPeople = false;
124
-      this.recalculateCost(val, 'staffCost', 'staffCost');
294
+      this.isOpenPeople = false;
295
+      this.updateStaffCosts();
296
+    },
297
+    openPeople(type) {
298
+      this.currentType = type;
299
+      this.isOpenPeople = true;
125 300
     },
126 301
     // 计算单个人员的成本
127 302
     calculateUserTotal(user) {
128
-      let total = parseFloat((user.salary.salary + 1780) / 21.75).toFixed(2) * Number(user.days);
303
+      if (!user.days) {
304
+        user.days = 0;
305
+      }
306
+      if (!user.performance) {
307
+        user.performance = 0;
308
+      }
309
+      if (!user.coefficient) {
310
+        user.coefficient = 1; // 默认值改为1
311
+      }
312
+      let total = 0;
313
+      if (user.type === '内业') {
314
+        // 内业人员计算方式不变
315
+        total = parseFloat((user.salary.salary + 1780) / 21.75).toFixed(2) * Number(user.days) + Number(user.performance);
316
+      } else {
317
+        // 外业人员计算方式
318
+        user.performance = 200 * Number(user.days) * Number(user.coefficient) * Number(user.otherCoefficient);
319
+        total = parseFloat((user.salary.salary + 1780) / 21.75).toFixed(2) * Number(user.days) + Number(user.performance);
320
+      }
321
+
129 322
       if (isNaN(total)) {
130 323
         total = 0
131 324
       }
132
-      this.$set(user, "staffCost", total.toFixed(2));
133
-      this.getCost("staffCost", "staffCost", this.chooseUser);
325
+      this.$set(user, "amount", total.toFixed(2));
326
+      this.updateStaffCosts();
134 327
     },
135
-    recalculateCost(arr, name, formName) {
136
-      let sum = arr.reduce((accumulator, item) => {
137
-        // 检查 carCost 属性是否存在且为数字(或可转换为数字)  
138
-        if (item[name] != null && !isNaN(Number(item[name]))) {
139
-          return accumulator + Number(item[name]);
140
-        }
141
-        return accumulator;
142
-      }, 0);
143
-      this.$set(this.form, formName, sum.toFixed(2));
328
+    openCalculatePerformance(user) {
329
+      this.currentUser = user;
330
+      this.$refs.calculatePerformance.open();
144 331
     },
145
-    getCost(name1, name2, list) {
146
-      let sum = 0;
147
-      for (let user of list) {
148
-        sum = sum + Number(user[name1]);
332
+    handlePerformanceConfirm(total) {
333
+      if (this.currentUser) {
334
+        this.$set(this.currentUser, 'performance', total);
335
+        this.calculateUserTotal(this.currentUser);
149 336
       }
150
-      this.form[name2] = sum.toFixed(2);
151 337
     },
152 338
   },
153 339
 }
@@ -174,6 +360,7 @@ table {
174 360
     background-color: #e7f6f3;
175 361
     font-family: '微软雅黑';
176 362
     font-size: 18;
363
+    font-weight: bold;
177 364
   }
178 365
 }
179 366
 </style>

+ 9
- 7
oa-ui/src/views/oa/brand/brandProject.vue 查看文件

@@ -36,22 +36,22 @@
36 36
 
37 37
     <el-table v-loading="loading" :data="brandProjectList" @selection-change="handleSelectionChange">
38 38
       <el-table-column type="selection" width="55" align="center" />
39
-      <el-table-column label="项目进度" align="center"  width="120px">
39
+      <el-table-column label="项目进度" align="center" width="120px">
40 40
         <template slot-scope="scope">
41 41
           <el-progress :text-inside="true" :stroke-width="26" :status="formartProjectProgress(scope.row.percentage)"
42 42
             :percentage="scope.row.percentage" text-color="#fff"></el-progress>
43 43
         </template>
44 44
       </el-table-column>
45
-      <el-table-column label="项目编号" align="center" prop="projectNumber" width="120px"/>
46
-      <el-table-column label="项目名称" align="center" prop="projectName"/>
47
-      <el-table-column label="甲方单位" align="center" prop="partyA.partyAName"/>
45
+      <el-table-column label="项目编号" align="center" prop="projectNumber" width="120px" />
46
+      <el-table-column label="项目名称" align="center" prop="projectName" />
47
+      <el-table-column label="甲方单位" align="center" prop="partyA.partyAName" />
48 48
       <!-- <el-table-column label="甲方单位联系人" align="center" prop="aPerson" />
49 49
       <el-table-column label="甲方单位联系电话" align="center" prop="aPhone" /> -->
50 50
       <el-table-column label="合作单位" align="center" prop="partner.partnerName" />
51 51
       <!-- <el-table-column label="合作单位联系人" align="center" prop="contactPerson" />
52 52
       <el-table-column label="合作单位联系电话" align="center" prop="telephone" /> -->
53 53
       <el-table-column label="项目工期" align="center" prop="duration" />
54
-      <el-table-column label="合同金额" align="center" prop="amount"  width="100px"/>
54
+      <el-table-column label="合同金额" align="center" prop="amount" width="100px" />
55 55
       <!-- <el-table-column label="项目概况" align="center" prop="content" /> -->
56 56
       <!-- <el-table-column label="备注" align="center" prop="remark" /> -->
57 57
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
@@ -167,7 +167,9 @@
167 167
               合同金额
168 168
             </template>
169 169
             <el-form-item prop="amount">
170
-              <el-input v-model="form.amount" placeholder="请输入合同金额" />
170
+              <el-input v-model="form.amount" placeholder="请输入合同金额">
171
+                <template slot="append">元</template>
172
+              </el-input>
171 173
             </el-form-item>
172 174
           </el-descriptions-item>
173 175
           <el-descriptions-item :span="2">
@@ -468,7 +470,7 @@ export default {
468 470
         listBrandPayment({ brandId }).then(result => {
469 471
           this.paymentList = result.rows
470 472
         })
471
-      }else{
473
+      } else {
472 474
         this.paymentList = []
473 475
         this.approvalDocument = ''
474 476
       }

+ 22
- 75
oa-ui/src/views/oa/train/index.vue 查看文件

@@ -2,13 +2,8 @@
2 2
   <div class="app-container">
3 3
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
4 4
       <el-form-item label="培训名称" prop="name">
5
-        <el-input
6
-          v-model="queryParams.name"
7
-          placeholder="请输入培训名称"
8
-          clearable
9
-          @keyup.enter.native="handleQuery"
10
-        />
11
-      </el-form-item>      
5
+        <el-input v-model="queryParams.name" placeholder="请输入培训名称" clearable @keyup.enter.native="handleQuery" />
6
+      </el-form-item>
12 7
       <el-form-item>
13 8
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
14 9
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
@@ -17,46 +12,20 @@
17 12
 
18 13
     <el-row :gutter="10" class="mb8">
19 14
       <el-col :span="1.5">
20
-        <el-button
21
-          type="primary"
22
-          plain
23
-          icon="el-icon-plus"
24
-          size="mini"
25
-          @click="handleAdd"
26
-          v-hasPermi="['oa:train:add']"
27
-        >新增</el-button>
15
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
16
+          v-hasPermi="['oa:train:add']">新增</el-button>
28 17
       </el-col>
29 18
       <el-col :span="1.5">
30
-        <el-button
31
-          type="success"
32
-          plain
33
-          icon="el-icon-edit"
34
-          size="mini"
35
-          :disabled="single"
36
-          @click="handleUpdate"
37
-          v-hasPermi="['oa:train:edit']"
38
-        >修改</el-button>
19
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
20
+          v-hasPermi="['oa:train:edit']">修改</el-button>
39 21
       </el-col>
40 22
       <el-col :span="1.5">
41
-        <el-button
42
-          type="danger"
43
-          plain
44
-          icon="el-icon-delete"
45
-          size="mini"
46
-          :disabled="multiple"
47
-          @click="handleDelete"
48
-          v-hasPermi="['oa:train:remove']"
49
-        >删除</el-button>
23
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
24
+          v-hasPermi="['oa:train:remove']">删除</el-button>
50 25
       </el-col>
51 26
       <el-col :span="1.5">
52
-        <el-button
53
-          type="warning"
54
-          plain
55
-          icon="el-icon-download"
56
-          size="mini"
57
-          @click="handleExport"
58
-          v-hasPermi="['oa:train:export']"
59
-        >导出</el-button>
27
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
28
+          v-hasPermi="['oa:train:export']">导出</el-button>
60 29
       </el-col>
61 30
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
62 31
     </el-row>
@@ -81,31 +50,16 @@
81 50
       </el-table-column>
82 51
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
83 52
         <template slot-scope="scope">
84
-          <el-button
85
-            size="mini"
86
-            type="text"
87
-            icon="el-icon-edit"
88
-            @click="handleUpdate(scope.row)"
89
-            v-hasPermi="['oa:train:edit']"
90
-          >修改</el-button>
91
-          <el-button
92
-            size="mini"
93
-            type="text"
94
-            icon="el-icon-delete"
95
-            @click="handleDelete(scope.row)"
96
-            v-hasPermi="['oa:train:remove']"
97
-          >删除</el-button>
53
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
54
+            v-hasPermi="['oa:train:edit']">修改</el-button>
55
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
56
+            v-hasPermi="['oa:train:remove']">删除</el-button>
98 57
         </template>
99 58
       </el-table-column>
100 59
     </el-table>
101
-    
102
-    <pagination
103
-      v-show="total>0"
104
-      :total="total"
105
-      :page.sync="queryParams.pageNum"
106
-      :limit.sync="queryParams.pageSize"
107
-      @pagination="getList"
108
-    />
60
+
61
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
62
+      @pagination="getList" />
109 63
 
110 64
     <!-- 添加或修改培训记录对话框 -->
111 65
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -126,19 +80,12 @@
126 80
           <el-input type="textarea" :rows="4" v-model="form.participates" placeholder="请输入参培人员" />
127 81
         </el-form-item>
128 82
         <el-form-item label="开始时间" prop="beginDate">
129
-          <el-date-picker clearable
130
-            v-model="form.beginDate"
131
-            type="date"
132
-            value-format="yyyy-MM-dd"
83
+          <el-date-picker clearable v-model="form.beginDate" type="date" value-format="yyyy-MM-dd"
133 84
             placeholder="请选择开始时间">
134 85
           </el-date-picker>
135 86
         </el-form-item>
136 87
         <el-form-item label="结束时间" prop="endDate">
137
-          <el-date-picker clearable
138
-            v-model="form.endDate"
139
-            type="date"
140
-            value-format="yyyy-MM-dd"
141
-            placeholder="请选择结束时间">
88
+          <el-date-picker clearable v-model="form.endDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择结束时间">
142 89
           </el-date-picker>
143 90
         </el-form-item>
144 91
       </el-form>
@@ -239,7 +186,7 @@ export default {
239 186
     // 多选框选中数据
240 187
     handleSelectionChange(selection) {
241 188
       this.ids = selection.map(item => item.trainId)
242
-      this.single = selection.length!==1
189
+      this.single = selection.length !== 1
243 190
       this.multiple = !selection.length
244 191
     },
245 192
     /** 新增按钮操作 */
@@ -281,12 +228,12 @@ export default {
281 228
     /** 删除按钮操作 */
282 229
     handleDelete(row) {
283 230
       const trainIds = row.trainId || this.ids;
284
-      this.$modal.confirm('是否确认删除培训记录编号为"' + trainIds + '"的数据项?').then(function() {
231
+      this.$modal.confirm('是否确认删除培训记录编号为"' + trainIds + '"的数据项?').then(function () {
285 232
         return delTrain(trainIds);
286 233
       }).then(() => {
287 234
         this.getList();
288 235
         this.$modal.msgSuccess("删除成功");
289
-      }).catch(() => {});
236
+      }).catch(() => { });
290 237
     },
291 238
     /** 导出按钮操作 */
292 239
     handleExport() {

+ 46
- 245
oa-ui/src/views/oa/wage/index.vue 查看文件

@@ -1,179 +1,20 @@
1 1
 <template>
2 2
   <div class="app-container">
3 3
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
4
-      <el-form-item label="员工id" prop="userId">
5
-        <el-input
6
-          v-model="queryParams.userId"
7
-          placeholder="请输入员工id"
8
-          clearable
9
-          @keyup.enter.native="handleQuery"
10
-        />
11
-      </el-form-item>
12
-      <el-form-item label="基础工资" prop="baseSalary">
13
-        <el-input
14
-          v-model="queryParams.baseSalary"
15
-          placeholder="请输入基础工资"
16
-          clearable
17
-          @keyup.enter.native="handleQuery"
18
-        />
19
-      </el-form-item>
20
-      <el-form-item label="工龄工资" prop="yearSalary">
21
-        <el-input
22
-          v-model="queryParams.yearSalary"
23
-          placeholder="请输入工龄工资"
24
-          clearable
25
-          @keyup.enter.native="handleQuery"
26
-        />
27
-      </el-form-item>
28
-      <el-form-item label="岗位工资" prop="postSalary">
29
-        <el-input
30
-          v-model="queryParams.postSalary"
31
-          placeholder="请输入岗位工资"
32
-          clearable
33
-          @keyup.enter.native="handleQuery"
34
-        />
35
-      </el-form-item>
36
-      <el-form-item label="绩效工资" prop="performanceSalary">
37
-        <el-input
38
-          v-model="queryParams.performanceSalary"
39
-          placeholder="请输入绩效工资"
40
-          clearable
41
-          @keyup.enter.native="handleQuery"
42
-        />
43
-      </el-form-item>
44
-      <el-form-item label="注册测绘师" prop="certificatesSubsidy">
45
-        <el-input
46
-          v-model="queryParams.certificatesSubsidy"
47
-          placeholder="请输入注册测绘师"
48
-          clearable
49
-          @keyup.enter.native="handleQuery"
50
-        />
51
-      </el-form-item>
52
-      <el-form-item label="过节补贴" prop="festivalSubsidy">
53
-        <el-input
54
-          v-model="queryParams.festivalSubsidy"
55
-          placeholder="请输入过节补贴"
56
-          clearable
57
-          @keyup.enter.native="handleQuery"
58
-        />
59
-      </el-form-item>
60
-      <el-form-item label="稳岗补贴" prop="postStableSubsidy">
61
-        <el-input
62
-          v-model="queryParams.postStableSubsidy"
63
-          placeholder="请输入稳岗补贴"
64
-          clearable
65
-          @keyup.enter.native="handleQuery"
66
-        />
67
-      </el-form-item>
68
-      <el-form-item label="高温补贴" prop="highTemperatureSubsidy">
69
-        <el-input
70
-          v-model="queryParams.highTemperatureSubsidy"
71
-          placeholder="请输入高温补贴"
72
-          clearable
73
-          @keyup.enter.native="handleQuery"
74
-        />
75
-      </el-form-item>
76
-      <el-form-item label="考勤扣款" prop="attendanceDeduct">
77
-        <el-input
78
-          v-model="queryParams.attendanceDeduct"
79
-          placeholder="请输入考勤扣款"
80
-          clearable
81
-          @keyup.enter.native="handleQuery"
82
-        />
83
-      </el-form-item>
84
-      <el-form-item label="应发小计" prop="payableWage">
85
-        <el-input
86
-          v-model="queryParams.payableWage"
87
-          placeholder="请输入应发小计"
88
-          clearable
89
-          @keyup.enter.native="handleQuery"
90
-        />
91
-      </el-form-item>
92
-      <el-form-item label="公积金" prop="houseFund">
93
-        <el-input
94
-          v-model="queryParams.houseFund"
95
-          placeholder="请输入公积金"
96
-          clearable
97
-          @keyup.enter.native="handleQuery"
98
-        />
99
-      </el-form-item>
100
-      <el-form-item label="养老保险" prop="endowmentInsurance">
101
-        <el-input
102
-          v-model="queryParams.endowmentInsurance"
103
-          placeholder="请输入养老保险"
104
-          clearable
105
-          @keyup.enter.native="handleQuery"
106
-        />
107
-      </el-form-item>
108
-      <el-form-item label="失业保险" prop="unemploymentInsurance">
109
-        <el-input
110
-          v-model="queryParams.unemploymentInsurance"
111
-          placeholder="请输入失业保险"
112
-          clearable
113
-          @keyup.enter.native="handleQuery"
114
-        />
115
-      </el-form-item>
116
-      <el-form-item label="医疗保险" prop="medicalInsurance">
117
-        <el-input
118
-          v-model="queryParams.medicalInsurance"
119
-          placeholder="请输入医疗保险"
120
-          clearable
121
-          @keyup.enter.native="handleQuery"
122
-        />
123
-      </el-form-item>
124
-      <el-form-item label="水韵物管费" prop="propertyFee">
125
-        <el-input
126
-          v-model="queryParams.propertyFee"
127
-          placeholder="请输入水韵物管费"
128
-          clearable
129
-          @keyup.enter.native="handleQuery"
130
-        />
131
-      </el-form-item>
132
-      <el-form-item label="扣款小计" prop="deductTotal">
133
-        <el-input
134
-          v-model="queryParams.deductTotal"
135
-          placeholder="请输入扣款小计"
136
-          clearable
137
-          @keyup.enter.native="handleQuery"
138
-        />
139
-      </el-form-item>
140
-      <el-form-item label="社保单位部分" prop="socialSecurityUnit">
141
-        <el-input
142
-          v-model="queryParams.socialSecurityUnit"
143
-          placeholder="请输入社保单位部分"
144
-          clearable
145
-          @keyup.enter.native="handleQuery"
146
-        />
147
-      </el-form-item>
148
-      <el-form-item label="个税" prop="individualIncomeTax">
149
-        <el-input
150
-          v-model="queryParams.individualIncomeTax"
151
-          placeholder="请输入个税"
152
-          clearable
153
-          @keyup.enter.native="handleQuery"
154
-        />
155
-      </el-form-item>
156
-      <el-form-item label="实发工资" prop="paidWage">
157
-        <el-input
158
-          v-model="queryParams.paidWage"
159
-          placeholder="请输入实发工资"
160
-          clearable
161
-          @keyup.enter.native="handleQuery"
162
-        />
4
+      <el-form-item label="姓名" prop="userId">
5
+        <el-select v-model="queryParams.userId" filterable clearable @change="handleQuery">
6
+          <el-option v-for="item in $store.state.user.userList" :key="item.userId" :label="item.nickName"
7
+            :value="item.userId">
8
+          </el-option>
9
+        </el-select>
163 10
       </el-form-item>
164 11
       <el-form-item label="发放日期" prop="payDay">
165
-        <el-date-picker clearable
166
-          v-model="queryParams.payDay"
167
-          type="date"
168
-          value-format="yyyy-MM-dd"
12
+        <el-date-picker clearable v-model="queryParams.payDay" type="date" value-format="yyyy-MM-dd"
169 13
           placeholder="请选择发放日期">
170 14
         </el-date-picker>
171 15
       </el-form-item>
172 16
       <el-form-item label="发放月份" prop="payMonth">
173
-        <el-date-picker clearable
174
-          v-model="queryParams.payMonth"
175
-          type="date"
176
-          value-format="yyyy-MM-dd"
17
+        <el-date-picker clearable v-model="queryParams.payMonth" type="date" value-format="yyyy-MM-dd"
177 18
           placeholder="请选择发放月份">
178 19
         </el-date-picker>
179 20
       </el-form-item>
@@ -184,56 +25,36 @@
184 25
     </el-form>
185 26
 
186 27
     <el-row :gutter="10" class="mb8">
187
-      <el-col :span="1.5">
188
-        <el-button
189
-          type="primary"
190
-          plain
191
-          icon="el-icon-plus"
192
-          size="mini"
193
-          @click="handleAdd"
194
-          v-hasPermi="['oa:wage:add']"
195
-        >新增</el-button>
28
+      <!-- <el-col :span="1.5">
29
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
30
+          v-hasPermi="['oa:wage:add']">新增</el-button>
196 31
       </el-col>
197 32
       <el-col :span="1.5">
198
-        <el-button
199
-          type="success"
200
-          plain
201
-          icon="el-icon-edit"
202
-          size="mini"
203
-          :disabled="single"
204
-          @click="handleUpdate"
205
-          v-hasPermi="['oa:wage:edit']"
206
-        >修改</el-button>
33
+        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
34
+          v-hasPermi="['oa:wage:edit']">修改</el-button>
207 35
       </el-col>
208 36
       <el-col :span="1.5">
209
-        <el-button
210
-          type="danger"
211
-          plain
212
-          icon="el-icon-delete"
213
-          size="mini"
214
-          :disabled="multiple"
215
-          @click="handleDelete"
216
-          v-hasPermi="['oa:wage:remove']"
217
-        >删除</el-button>
37
+        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
38
+          v-hasPermi="['oa:wage:remove']">删除</el-button>
218 39
       </el-col>
219 40
       <el-col :span="1.5">
220
-        <el-button
221
-          type="warning"
222
-          plain
223
-          icon="el-icon-download"
224
-          size="mini"
225
-          @click="handleExport"
226
-          v-hasPermi="['oa:wage:export']"
227
-        >导出</el-button>
41
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
42
+          v-hasPermi="['oa:wage:export']">导出</el-button>
43
+      </el-col> -->
44
+      <el-col :span="1.5">
45
+        <el-button type="warning" plain icon="el-icon-upload2" size="mini" @click="handleImport"
46
+          v-hasPermi="['oa:wage:export']">导入</el-button>
228 47
       </el-col>
48
+    
229 49
       <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
230 50
     </el-row>
231 51
 
232 52
     <el-table v-loading="loading" :data="wageList" @selection-change="handleSelectionChange">
233 53
       <el-table-column type="selection" width="55" align="center" />
234
-      <el-table-column label="工资id" align="center" prop="wageId" />
235
-      <el-table-column label="员工id" align="center" prop="userId" />
236
-      <el-table-column label="基础工资" align="center" prop="baseSalary" />
54
+      <el-table-column label="姓名" align="center" prop="userId">
55
+
56
+      </el-table-column>
57
+      <!-- <el-table-column label="基础工资" align="center" prop="baseSalary" />
237 58
       <el-table-column label="工龄工资" align="center" prop="yearSalary" />
238 59
       <el-table-column label="岗位工资" align="center" prop="postSalary" />
239 60
       <el-table-column label="绩效工资" align="center" prop="performanceSalary" />
@@ -242,16 +63,16 @@
242 63
       <el-table-column label="稳岗补贴" align="center" prop="postStableSubsidy" />
243 64
       <el-table-column label="高温补贴" align="center" prop="highTemperatureSubsidy" />
244 65
       <el-table-column label="考勤扣款" align="center" prop="attendanceDeduct" />
245
-      <el-table-column label="应发小计" align="center" prop="payableWage" />
66
+      <el-table-column label="应发小计" align="center" prop="payableWage" /> -->
246 67
       <el-table-column label="公积金" align="center" prop="houseFund" />
247
-      <el-table-column label="养老保险" align="center" prop="endowmentInsurance" />
68
+      <!-- <el-table-column label="养老保险" align="center" prop="endowmentInsurance" />
248 69
       <el-table-column label="失业保险" align="center" prop="unemploymentInsurance" />
249 70
       <el-table-column label="医疗保险" align="center" prop="medicalInsurance" />
250 71
       <el-table-column label="水韵物管费" align="center" prop="propertyFee" />
251
-      <el-table-column label="扣款小计" align="center" prop="deductTotal" />
72
+      <el-table-column label="扣款小计" align="center" prop="deductTotal" /> -->
252 73
       <el-table-column label="社保单位部分" align="center" prop="socialSecurityUnit" />
253
-      <el-table-column label="个税" align="center" prop="individualIncomeTax" />
254
-      <el-table-column label="实发工资" align="center" prop="paidWage" />
74
+      <!-- <el-table-column label="个税" align="center" prop="individualIncomeTax" />
75
+      <el-table-column label="实发工资" align="center" prop="paidWage" /> -->
255 76
       <el-table-column label="发放日期" align="center" prop="payDay" width="180">
256 77
         <template slot-scope="scope">
257 78
           <span>{{ parseTime(scope.row.payDay, '{y}-{m}-{d}') }}</span>
@@ -264,31 +85,16 @@
264 85
       </el-table-column>
265 86
       <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
266 87
         <template slot-scope="scope">
267
-          <el-button
268
-            size="mini"
269
-            type="text"
270
-            icon="el-icon-edit"
271
-            @click="handleUpdate(scope.row)"
272
-            v-hasPermi="['oa:wage:edit']"
273
-          >修改</el-button>
274
-          <el-button
275
-            size="mini"
276
-            type="text"
277
-            icon="el-icon-delete"
278
-            @click="handleDelete(scope.row)"
279
-            v-hasPermi="['oa:wage:remove']"
280
-          >删除</el-button>
88
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
89
+            v-hasPermi="['oa:wage:edit']">修改</el-button>
90
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
91
+            v-hasPermi="['oa:wage:remove']">删除</el-button>
281 92
         </template>
282 93
       </el-table-column>
283 94
     </el-table>
284
-    
285
-    <pagination
286
-      v-show="total>0"
287
-      :total="total"
288
-      :page.sync="queryParams.pageNum"
289
-      :limit.sync="queryParams.pageSize"
290
-      @pagination="getList"
291
-    />
95
+
96
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
97
+      @pagination="getList" />
292 98
 
293 99
     <!-- 添加或修改员工工资对话框 -->
294 100
     <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
@@ -354,19 +160,11 @@
354 160
           <el-input v-model="form.paidWage" placeholder="请输入实发工资" />
355 161
         </el-form-item>
356 162
         <el-form-item label="发放日期" prop="payDay">
357
-          <el-date-picker clearable
358
-            v-model="form.payDay"
359
-            type="date"
360
-            value-format="yyyy-MM-dd"
361
-            placeholder="请选择发放日期">
163
+          <el-date-picker clearable v-model="form.payDay" type="date" value-format="yyyy-MM-dd" placeholder="请选择发放日期">
362 164
           </el-date-picker>
363 165
         </el-form-item>
364 166
         <el-form-item label="发放月份" prop="payMonth">
365
-          <el-date-picker clearable
366
-            v-model="form.payMonth"
367
-            type="date"
368
-            value-format="yyyy-MM-dd"
369
-            placeholder="请选择发放月份">
167
+          <el-date-picker clearable v-model="form.payMonth" type="date" value-format="yyyy-MM-dd" placeholder="请选择发放月份">
370 168
           </el-date-picker>
371 169
         </el-form-item>
372 170
       </el-form>
@@ -497,7 +295,7 @@ export default {
497 295
     // 多选框选中数据
498 296
     handleSelectionChange(selection) {
499 297
       this.ids = selection.map(item => item.wageId)
500
-      this.single = selection.length!==1
298
+      this.single = selection.length !== 1
501 299
       this.multiple = !selection.length
502 300
     },
503 301
     /** 新增按钮操作 */
@@ -539,18 +337,21 @@ export default {
539 337
     /** 删除按钮操作 */
540 338
     handleDelete(row) {
541 339
       const wageIds = row.wageId || this.ids;
542
-      this.$modal.confirm('是否确认删除员工工资编号为"' + wageIds + '"的数据项?').then(function() {
340
+      this.$modal.confirm('是否确认删除员工工资编号为"' + wageIds + '"的数据项?').then(function () {
543 341
         return delWage(wageIds);
544 342
       }).then(() => {
545 343
         this.getList();
546 344
         this.$modal.msgSuccess("删除成功");
547
-      }).catch(() => {});
345
+      }).catch(() => { });
548 346
     },
549 347
     /** 导出按钮操作 */
550 348
     handleExport() {
551 349
       this.download('oa/wage/export', {
552 350
         ...this.queryParams
553 351
       }, `wage_${new Date().getTime()}.xlsx`)
352
+    },
353
+    handleImport() {
354
+
554 355
     }
555 356
   }
556 357
 };

正在加载...
取消
保存