|
@@ -2,14 +2,14 @@
|
2
|
2
|
* @Author: ysh
|
3
|
3
|
* @Date: 2024-04-30 09:03:14
|
4
|
4
|
* @LastEditors: Please set LastEditors
|
5
|
|
- * @LastEditTime: 2025-01-09 11:43:24
|
|
5
|
+ * @LastEditTime: 2025-02-26 14:48:48
|
6
|
6
|
-->
|
7
|
7
|
<template>
|
8
|
8
|
<div class="app-container" v-loading="loading">
|
9
|
9
|
<el-row :gutter="20">
|
10
|
10
|
<el-col :span="flowDisabled ? 19 : 24" :xs="24">
|
11
|
11
|
<el-button type="success" icon="el-icon-printer" @click="printOpen = true">打印</el-button>
|
12
|
|
- <h2 class="text-center">项目结算表</h2>
|
|
12
|
+ <h2 class="text-center">项目结算表 <span style="color:#f56c6c" v-if="isAppend">(追加结算)</span> </h2>
|
13
|
13
|
<div class="mt20 mb20" v-if="showAlter && flowDisabled">
|
14
|
14
|
<el-alert title="任务被退回,请修改后重新提交" type="error" :closable="false">
|
15
|
15
|
<return-comment :taskForm="taskForm" @isReturn="isReturn"></return-comment>
|
|
@@ -90,34 +90,6 @@
|
90
|
90
|
</el-link>
|
91
|
91
|
</div>
|
92
|
92
|
</el-form-item>
|
93
|
|
- <!-- <el-form-item label="经营发展部审核结算单" prop="">
|
94
|
|
- <FileUpload v-if="taskName == '经营发展部校核'" :limit="1" :filePathName="'项目结算/经营发展部审核结算单'"
|
95
|
|
- :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setModifyDocument">
|
96
|
|
- </FileUpload>
|
97
|
|
- <div v-if="form.modifyDocument" class="upload-list">
|
98
|
|
- <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.modifyDocument}`)">
|
99
|
|
- {{ getFileName(form.modifyDocument) }}
|
100
|
|
- </el-link>
|
101
|
|
- <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.modifyDocument}`"
|
102
|
|
- :underline="false" target="_blank">
|
103
|
|
- <span class="el-icon-download">下载文件</span>
|
104
|
|
- </el-link>
|
105
|
|
- </div>
|
106
|
|
- </el-form-item>
|
107
|
|
- <el-form-item label="分管领导审核结算单" prop="">
|
108
|
|
- <FileUpload v-if="taskName == '分管审核'" :limit="1" :filePathName="'项目结算/分管领导审核结算单'"
|
109
|
|
- :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setFinalDocument">
|
110
|
|
- </FileUpload>
|
111
|
|
- <div v-if="form.finalDocument" class="upload-list">
|
112
|
|
- <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.finalDocument}`)">
|
113
|
|
- {{ getFileName(form.finalDocument) }}
|
114
|
|
- </el-link>
|
115
|
|
- <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.finalDocument}`"
|
116
|
|
- :underline="false" target="_blank">
|
117
|
|
- <span class="el-icon-download">下载文件</span>
|
118
|
|
- </el-link>
|
119
|
|
- </div>
|
120
|
|
- </el-form-item> -->
|
121
|
93
|
|
122
|
94
|
<div class="headers" v-hasRole="['leader', 'business']">
|
123
|
95
|
合同信息
|
|
@@ -238,8 +210,10 @@
|
238
|
210
|
<!-- <el-input-number style="width:100px" v-model="work.settle" clearable :controls="false"></el-input-number> -->
|
239
|
211
|
<div>{{ work.settle }}</div>
|
240
|
212
|
<div v-if="taskName == '结算发起'">
|
241
|
|
- <el-button size="mini" type="text" v-if="Number(work.settle) <= 600 && Number(work.settle) != 0" @click="setSettle(work)">置为600</el-button>
|
242
|
|
- <el-button size="mini" type="text" v-if="Number(work.settle) <= 600 && Number(work.settle) != 0" @click="resetSettle(work)">还原</el-button>
|
|
213
|
+ <el-button size="mini" type="text" v-if="Number(work.settle) <= 600 && Number(work.settle) != 0"
|
|
214
|
+ @click="setSettle(work)">置为600</el-button>
|
|
215
|
+ <el-button size="mini" type="text" v-if="Number(work.settle) <= 600 && Number(work.settle) != 0"
|
|
216
|
+ @click="resetSettle(work)">还原</el-button>
|
243
|
217
|
</div>
|
244
|
218
|
</td>
|
245
|
219
|
<td>
|
|
@@ -282,7 +256,7 @@
|
282
|
256
|
<td style="width: 280px">备注</td>
|
283
|
257
|
<td style="width: 100px">操作</td>
|
284
|
258
|
</tr>
|
285
|
|
- <tr v-for="( work, index ) in settleSumList " :key="index">
|
|
259
|
+ <tr v-for="(work, index) in settleSumList" :key="index">
|
286
|
260
|
<td>
|
287
|
261
|
{{ index + 1 }}
|
288
|
262
|
</td>
|
|
@@ -318,7 +292,7 @@
|
318
|
292
|
<td style="width: 280px">备注</td>
|
319
|
293
|
<td style="width: 100px">操作</td>
|
320
|
294
|
</tr>
|
321
|
|
- <tr v-for="( dept, index ) in deptSettleList " :key="index" v-if="dept.content != '实际结算总金额'">
|
|
295
|
+ <tr v-for="(dept, index) in deptSettleList" :key="index" v-if="dept.content != '实际结算总金额'">
|
322
|
296
|
<td :rowspan="deptSettleList.length" v-if="index == 0">
|
323
|
297
|
{{ Number(actualSumSettle).toFixed(2) }}
|
324
|
298
|
</td>
|
|
@@ -526,7 +500,7 @@
|
526
|
500
|
</el-dialog>
|
527
|
501
|
|
528
|
502
|
<el-dialog title="导入结算工作量" :visible.sync="importOpen" width="400px" append-to-body>
|
529
|
|
- <settle-import @getDataList="getImportSettleList" @cancel="importOpen = false" ></settle-import>
|
|
503
|
+ <settle-import @getDataList="getImportSettleList" @cancel="importOpen = false"></settle-import>
|
530
|
504
|
</el-dialog>
|
531
|
505
|
</div>
|
532
|
506
|
</template>
|
|
@@ -536,23 +510,19 @@ import flow from "@/views/flowable/task/todo/detail/flow";
|
536
|
510
|
import { flowXmlAndNode } from "@/api/flowable/definition";
|
537
|
511
|
import { parseTime } from "@/utils/ruoyi";
|
538
|
512
|
import { listProject, getProject } from "@/api/oa/project/project";
|
539
|
|
-import { deepClone } from "@/utils";
|
540
|
|
-import { listSettle, getSettle, delSettle, addSettle, updateSettle } from "@/api/oa/settle/settle";
|
541
|
|
-import { listSettleSummary, getSettleSummary, addSettleSummary, delSettleSummary, updateSettleSummary } from "@/api/oa/settle/settleSummary";
|
542
|
|
-import { listSettleWork, getSettleWork, addSettleWork, updateSettleWork, delSettleWork } from "@/api/oa/settle/settleWork";
|
543
|
|
-import { listProjectContract, addProjectContract } from "@/api/oa/contract/projectContract";
|
|
513
|
+import { listSettle, getSettle, addSettle, updateSettle } from "@/api/oa/settle/settle";
|
|
514
|
+import { listSettleSummary, addSettleSummary, delSettleSummary } from "@/api/oa/settle/settleSummary";
|
|
515
|
+import { listSettleWork, addSettleWork, delSettleWork } from "@/api/oa/settle/settleWork";
|
544
|
516
|
import { getPrice, getPriceRemarkByWorkType } from "@/api/oa/price/price";
|
545
|
517
|
import ChoosePrice from "./components/choosePrice.vue";
|
546
|
518
|
import { getUser } from "@/api/system/user";
|
547
|
519
|
import { getUserByRole } from "@/api/system/role";
|
548
|
520
|
import { getUserByPost } from "@/api/system/post";
|
549
|
|
-import { complete, getNextFlowNode, returnTask, findReCommitTask, taskRecommit } from "@/api/flowable/todo";
|
550
|
|
-import { getUsersDeptLeader, getUsersDeptLeaderByDept, getUsersManageLeaderByDept, } from "@/api/system/post.js";
|
|
521
|
+import { complete, getNextFlowNode, findReCommitTask, taskRecommit } from "@/api/flowable/todo";
|
|
522
|
+import { getUsersDeptLeaderByDept, getUsersManageLeaderByDept, } from "@/api/system/post.js";
|
551
|
523
|
import { listBudget } from "@/api/oa/budget/budget";
|
552
|
524
|
import { listBudgetSettle } from "@/api/oa/budget/budgetSettle";
|
553
|
525
|
import SettlePrint from "./components/print/settlePrint.vue";
|
554
|
|
-import { getDept } from "@/api/system/dept";
|
555
|
|
-import { getContract } from "@/api/oa/contract/contract";
|
556
|
526
|
import ChooseProject from "./components/chooseProject.vue";
|
557
|
527
|
import projectContractInfo from "./projectContractInfo.vue";
|
558
|
528
|
import ReturnComment from '@/views/flowable/form/components/flowBtn/returnComment.vue';
|
|
@@ -598,6 +568,7 @@ export default {
|
598
|
568
|
data() {
|
599
|
569
|
return {
|
600
|
570
|
baseUrl: process.env.VUE_APP_BASE_API,
|
|
571
|
+ isAppend: false,//是否追加结算
|
601
|
572
|
printOpen: false,
|
602
|
573
|
loading: false,
|
603
|
574
|
drawer: false,
|
|
@@ -663,7 +634,7 @@ export default {
|
663
|
634
|
projectId: '',
|
664
|
635
|
showAlter: true,
|
665
|
636
|
returnOpen: false,
|
666
|
|
- importOpen:false,
|
|
637
|
+ importOpen: false,
|
667
|
638
|
};
|
668
|
639
|
},
|
669
|
640
|
created() {
|
|
@@ -708,6 +679,7 @@ export default {
|
708
|
679
|
const res = await listSettle({ settleId: this.taskForm.formId });
|
709
|
680
|
if (res.total === 1) {
|
710
|
681
|
this.form = res.rows[0];
|
|
682
|
+ this.getIsAppend(this.taskForm.formId, res.rows[0].projectId) //判断是否为追加结算
|
711
|
683
|
this.flag = true;
|
712
|
684
|
const settleId = this.taskForm.formId;
|
713
|
685
|
const [
|
|
@@ -797,7 +769,19 @@ export default {
|
797
|
769
|
this.loading = false;
|
798
|
770
|
this.deptList = this.$store.state.user.deptList
|
799
|
771
|
},
|
800
|
|
-
|
|
772
|
+ async getIsAppend(settleId, projectId) {
|
|
773
|
+ let res = await listSettle({ projectId });
|
|
774
|
+ if (res.total > 1) {
|
|
775
|
+ let arr = res.rows
|
|
776
|
+ const target = arr.find(item => item.settleId === settleId);
|
|
777
|
+ const parseTime = (timeStr) => Date.parse(timeStr);
|
|
778
|
+ const allTimestamps = arr.map(item => parseTime(item.reportTime));
|
|
779
|
+ const minTimestamp = Math.min(...allTimestamps);
|
|
780
|
+ const targetTimestamp = parseTime(target.reportTime);
|
|
781
|
+ const isAppend = targetTimestamp !== minTimestamp;
|
|
782
|
+ this.isAppend = isAppend;
|
|
783
|
+ }
|
|
784
|
+ },
|
801
|
785
|
async getBudgetSettle() {
|
802
|
786
|
let budgetData = await listBudget({ projectId: this.form.projectId })
|
803
|
787
|
if (budgetData.total == 1) {
|
|
@@ -1039,13 +1023,13 @@ export default {
|
1039
|
1023
|
this.calculateActualSumSettle();
|
1040
|
1024
|
},
|
1041
|
1025
|
// 置为600
|
1042
|
|
- setSettle(work){
|
|
1026
|
+ setSettle(work) {
|
1043
|
1027
|
work.settle = 600;
|
1044
|
1028
|
work.remark = '不足600,按600算';
|
1045
|
1029
|
this.calculateSumSettle();
|
1046
|
1030
|
this.calculateActualSumSettle();
|
1047
|
1031
|
},
|
1048
|
|
- resetSettle(work){
|
|
1032
|
+ resetSettle(work) {
|
1049
|
1033
|
work.remark = '';
|
1050
|
1034
|
this.calculateSettle(work)
|
1051
|
1035
|
},
|
|
@@ -1187,12 +1171,19 @@ export default {
|
1187
|
1171
|
}
|
1188
|
1172
|
}
|
1189
|
1173
|
},
|
1190
|
|
- confirmProject(val) {
|
|
1174
|
+ async confirmProject(val) {
|
1191
|
1175
|
if (val.length == 1) {
|
1192
|
1176
|
this.prOpen = false;
|
1193
|
1177
|
this.chooseProject = val[0];
|
1194
|
|
- this.$set(this.form, 'projectId', val[0].projectId)
|
1195
|
|
- this.isSelect = true;
|
|
1178
|
+ let settleData = await listSettle({ projectId: val[0].projectId });
|
|
1179
|
+ console.log(settleData)
|
|
1180
|
+ if (settleData.total >= 1) {
|
|
1181
|
+ this.$modal.confirm('该项目已经发起过项目结算,是否追加结算?').then(() => {
|
|
1182
|
+ this.$set(this.form, 'projectId', val[0].projectId)
|
|
1183
|
+ this.isSelect = true;
|
|
1184
|
+ this.isAppend = true;
|
|
1185
|
+ })
|
|
1186
|
+ }
|
1196
|
1187
|
} else {
|
1197
|
1188
|
this.$message.error("项目只能选择一个!");
|
1198
|
1189
|
return;
|
|
@@ -1203,12 +1194,6 @@ export default {
|
1203
|
1194
|
getPriceRemarkByWorkType({ workType }).then((res) => {
|
1204
|
1195
|
if (res.code == 200) {
|
1205
|
1196
|
if (workType != undefined) this.$set(work, "noteTip", res.msg);
|
1206
|
|
- // this.$notify({
|
1207
|
|
- // title: workType,
|
1208
|
|
- // dangerouslyUseHTMLString: true,
|
1209
|
|
- // message: res.msg,
|
1210
|
|
- // duration: 0
|
1211
|
|
- // });
|
1212
|
1197
|
}
|
1213
|
1198
|
});
|
1214
|
1199
|
},
|
|
@@ -1226,9 +1211,9 @@ export default {
|
1226
|
1211
|
return this.form.dszComment
|
1227
|
1212
|
}
|
1228
|
1213
|
},
|
1229
|
|
- getImportSettleList(val){
|
|
1214
|
+ getImportSettleList(val) {
|
1230
|
1215
|
this.settleWorkList = val;
|
1231
|
|
- for(let work of this.settleWorkList){
|
|
1216
|
+ for (let work of this.settleWorkList) {
|
1232
|
1217
|
this.calculateSettle(work)
|
1233
|
1218
|
}
|
1234
|
1219
|
this.importOpen = false;
|