Browse Source

新增项目流转退回按钮,修改项目预算未保存直接提交数据错误的bug

余思翰 4 months ago
parent
commit
6b97fa2826

+ 1
- 1
oa-back/ruoyi-admin/src/main/resources/application.yml View File

97
   # 令牌密钥
97
   # 令牌密钥
98
   secret: abcdefghijklmnopqrstuvwxyz
98
   secret: abcdefghijklmnopqrstuvwxyz
99
   # 令牌有效期(默认30分钟)
99
   # 令牌有效期(默认30分钟)
100
-  expireTime: 30
100
+  expireTime: 240
101
 
101
 
102
 # MyBatis配置
102
 # MyBatis配置
103
 mybatis:
103
 mybatis:

+ 1
- 1
oa-back/ruoyi-flowable/src/main/java/com/ruoyi/flowable/controller/FlowInstanceController.java View File

48
     }
48
     }
49
 
49
 
50
     @ApiOperation(value = "根据流程实例id获取子流程id列表")
50
     @ApiOperation(value = "根据流程实例id获取子流程id列表")
51
-    @PostMapping(value = "/listSubProcInstId")
51
+    @GetMapping(value = "/listSubProcInstId")
52
     public AjaxResult listSubProcInstId(@ApiParam(value = "流程实例ID", required = true) @RequestParam String instanceId) {
52
     public AjaxResult listSubProcInstId(@ApiParam(value = "流程实例ID", required = true) @RequestParam String instanceId) {
53
         List<HistoricProcessInstance> subProcInstIdList = flowInstanceService.listSubProcInstId(instanceId);
53
         List<HistoricProcessInstance> subProcInstIdList = flowInstanceService.listSubProcInstId(instanceId);
54
         return AjaxResult.success(subProcInstIdList);
54
         return AjaxResult.success(subProcInstIdList);

+ 5
- 7
oa-back/ruoyi-flowable/src/main/java/com/ruoyi/flowable/service/impl/FlowInstanceServiceImpl.java View File

13
 import org.springframework.stereotype.Service;
13
 import org.springframework.stereotype.Service;
14
 import org.springframework.transaction.annotation.Transactional;
14
 import org.springframework.transaction.annotation.Transactional;
15
 
15
 
16
-import java.util.HashMap;
17
-import java.util.List;
18
-import java.util.Map;
19
-import java.util.Objects;
16
+import java.util.*;
20
 
17
 
21
 /**
18
 /**
22
  * <p>工作流流程实例管理<p>
19
  * <p>工作流流程实例管理<p>
67
     public List<HistoricProcessInstance> listSubProcInstId(String instanceId) {
64
     public List<HistoricProcessInstance> listSubProcInstId(String instanceId) {
68
         List<HistoricProcessInstance> historicProcessInstance =
65
         List<HistoricProcessInstance> historicProcessInstance =
69
                 historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(instanceId).list();
66
                 historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(instanceId).list();
67
+        List<HistoricProcessInstance> historicProcessInstanceList = new ArrayList<>(historicProcessInstance);
70
         for (HistoricProcessInstance processInstance : historicProcessInstance) {
68
         for (HistoricProcessInstance processInstance : historicProcessInstance) {
71
-            if (processInstance.getProcessDefinitionId().contains("tech_plan")) {
72
-                historicProcessInstance.addAll(historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(processInstance.getId()).list());
69
+            if (processInstance.getProcessDefinitionId() != null && processInstance.getProcessDefinitionId().contains("tech_plan")) {
70
+                historicProcessInstanceList.addAll(historyService.createHistoricProcessInstanceQuery().superProcessInstanceId(processInstance.getId()).list());
73
             }
71
             }
74
         }
72
         }
75
-        return historicProcessInstance;
73
+        return historicProcessInstanceList;
76
     }
74
     }
77
 
75
 
78
     /**
76
     /**

+ 11
- 3
oa-ui/src/api/flowable/finished.js View File

1
 /*
1
 /*
2
  * @Author: wrh
2
  * @Author: wrh
3
  * @Date: 2024-01-03 08:55:37
3
  * @Date: 2024-01-03 08:55:37
4
- * @LastEditors: wrh
5
- * @LastEditTime: 2024-06-12 15:41:26
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-01-22 16:03:17
6
  */
6
  */
7
 import request from '@/utils/request'
7
 import request from '@/utils/request'
8
-import da from "element-ui/src/locale/lang/da";
9
 
8
 
10
 // 查询已办任务列表
9
 // 查询已办任务列表
11
 export function finishedList(query) {
10
 export function finishedList(query) {
93
     params: query
92
     params: query
94
   })
93
   })
95
 }
94
 }
95
+
96
+// 通过流程实例id查询子流程id
97
+export function listSubProcInstId(query) {
98
+  return request({
99
+    url: '/flowable/instance/listSubProcInstId',
100
+    method: 'get',
101
+    params: query
102
+  })
103
+}

+ 0
- 1
oa-ui/src/api/flowable/process.js View File

1
 import request from '@/utils/request'
1
 import request from '@/utils/request'
2
-import da from "element-ui/src/locale/lang/da";
3
 
2
 
4
 // 我的发起的流程
3
 // 我的发起的流程
5
 export function myProcessList(query) {
4
 export function myProcessList(query) {

+ 1
- 2
oa-ui/src/api/flowable/todo.js View File

1
 import request from '@/utils/request'
1
 import request from '@/utils/request'
2
-import da from "element-ui/src/locale/lang/da";
3
 
2
 
4
 // 查询待办任务列表
3
 // 查询待办任务列表
5
 export function todoList(query) {
4
 export function todoList(query) {
157
     method: 'post',
156
     method: 'post',
158
     data: data
157
     data: data
159
   })
158
   })
160
-}
159
+}

+ 49
- 0
oa-ui/src/utils/cancelSubProcess.js View File

1
+/*
2
+ * @Author: ysh
3
+ * @Date: 2025-01-22 16:58:56
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-01-23 11:32:05
6
+ */
7
+import { listBudget, addBudget, updateBudget, delBudget } from "@/api/oa/budget/budget.js";
8
+import { listTechnical, getTechnical, delTechnical, addTechnical, updateTechnical } from "@/api/oa/technical/technical";
9
+import { listTechnicalPlan, getTechnicalPlan, delTechnicalPlan, addTechnicalPlan, updateTechnicalPlan } from "@/api/oa/technical/technicalPlan";
10
+import { listSafe, getSafe, delSafe, addSafe, updateSafe } from "@/api/oa/safe/safe";
11
+import { listSubProcInstId, delDeployment } from "@/api/flowable/finished"
12
+import { deleteResources } from "@/utils/deleteResource";
13
+
14
+// 取消项目预算、技术方案、技术交底、安全交底流程,并且删除数据
15
+export async function cancelSubProcess(ids, projectId) {
16
+  try {
17
+    const [resSafe, resBudget, resTechnical, resTechnicalPlan] = await Promise.all([
18
+      listSafe({ pageSize: 100, projectId }),
19
+      listBudget({ pageSize: 100, projectId }),
20
+      listTechnical({ pageSize: 100, projectId }),
21
+      listTechnicalPlan({ pageSize: 100, projectId })
22
+    ]);
23
+ 
24
+    const safeIds = extractIds(resSafe.rows,'safeId');
25
+    const budgetIds = extractIds(resBudget.rows,'budgetId');
26
+    const technicalIds = extractIds(resTechnical.rows,'technicalId');
27
+    const technicalPlanIds = extractIds(resTechnicalPlan.rows,'technicalPlanId');
28
+ 
29
+    await deleteResourcesByIds('项目预算', budgetIds);
30
+    await deleteResourcesByIds('安全交底', safeIds);
31
+    await deleteResourcesByIds('技术方案', technicalIds);
32
+    await deleteResourcesByIds('技术交底', technicalPlanIds);
33
+
34
+    await delDeployment(ids);
35
+ 
36
+    return { code: 200 };
37
+  } catch (error) {
38
+    console.error('Error canceling subprocess:', error);
39
+    throw { code: 500, message: error.message || 'An unknown error occurred' };
40
+  }
41
+}
42
+ 
43
+function extractIds(rows,name) {
44
+  return rows ? rows.map(item => item[name] /* 假设每个对象都有一个名为'id'的属性 */) : [];
45
+}
46
+ 
47
+async function deleteResourcesByIds(type, ids) {
48
+  await Promise.all(ids.map(id => deleteResources(type, id)));
49
+}

+ 29
- 1
oa-ui/src/utils/deleteResource.js View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-06-13 17:07:59
3
  * @Date: 2024-06-13 17:07:59
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-10-09 13:52:58
5
+ * @LastEditTime: 2025-01-22 16:45:18
6
  */
6
  */
7
 import request from '@/utils/request'
7
 import request from '@/utils/request'
8
 
8
 
120
       '/oa/wage/batch/:id'
120
       '/oa/wage/batch/:id'
121
     ]
121
     ]
122
   },
122
   },
123
+  {
124
+    procDefName: '项目预算',
125
+    apiUrl: [
126
+      '/oa/budget/:id',
127
+      '/oa/budgetSettle/:id',
128
+      '/oa/budgetCar/:id',
129
+      '/oa/budgetDevice/:id',
130
+      '/oa/budgetStaff/:id',
131
+    ]
132
+  },
133
+  {
134
+    procDefName: '技术方案',
135
+    apiUrl: [
136
+      '/oa/technical/:id',
137
+    ]
138
+  },
139
+  {
140
+    procDefName: '技术交底',
141
+    apiUrl: [
142
+      '/oa/technicalPlan/:id',
143
+    ]
144
+  },
145
+  {
146
+    procDefName: '安全交底',
147
+    apiUrl: [
148
+      '/oa/safe/:id',
149
+    ]
150
+  },
123
 ]
151
 ]
124
 
152
 
125
 // 编写一个方法来处理删除请求,并同时发送所有API请求  
153
 // 编写一个方法来处理删除请求,并同时发送所有API请求  

+ 2
- 2
oa-ui/src/views/flowable/form/archiveForm.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-06-21 18:51:51
3
  * @Date: 2024-06-21 18:51:51
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-22 13:42:37
5
+ * @LastEditTime: 2025-01-23 09:10:56
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
25
               <el-descriptions-item label="承担部门" label-class-name="my-label">{{
25
               <el-descriptions-item label="承担部门" label-class-name="my-label">{{
26
                 chooseProject.undertakingDeptName
26
                 chooseProject.undertakingDeptName
27
               }}</el-descriptions-item>
27
               }}</el-descriptions-item>
28
-              <el-descriptions-item label="发起人" label-class-name="my-label">{{ chooseProject.projectLeaderUser
28
+              <el-descriptions-item label="项目负责人" label-class-name="my-label">{{ chooseProject.projectLeaderUser
29
                 ? chooseProject.projectLeaderUser.nickName : ''
29
                 ? chooseProject.projectLeaderUser.nickName : ''
30
                 }}</el-descriptions-item>
30
                 }}</el-descriptions-item>
31
               <el-descriptions-item label="技术负责人" label-class-name="my-label">{{
31
               <el-descriptions-item label="技术负责人" label-class-name="my-label">{{

+ 20
- 16
oa-ui/src/views/flowable/form/budget/addBudget.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-06-21 18:51:51
3
  * @Date: 2024-06-21 18:51:51
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-16 10:16:27
5
+ * @LastEditTime: 2025-01-23 14:02:18
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
39
     <!-- 其他成本 -->
39
     <!-- 其他成本 -->
40
     <other-table ref="otherRef" @otherCost="getOtherCost" :budgetForm="budgetForm"></other-table>
40
     <other-table ref="otherRef" @otherCost="getOtherCost" :budgetForm="budgetForm"></other-table>
41
     <!-- 预算备注 -->
41
     <!-- 预算备注 -->
42
-    <el-form :model="budgetForm"  style="padding: 20px 100px 0">
42
+    <el-form :model="budgetForm" style="padding: 20px 100px 0">
43
       <el-form-item label="预算表单备注" label-width="100px">
43
       <el-form-item label="预算表单备注" label-width="100px">
44
         <el-input type="textarea" v-model="budgetForm.remark" placeholder="请输入预算备注" :rows="4"></el-input>
44
         <el-input type="textarea" v-model="budgetForm.remark" placeholder="请输入预算备注" :rows="4"></el-input>
45
       </el-form-item>
45
       </el-form-item>
172
     },
172
     },
173
     // 提交下一个流程
173
     // 提交下一个流程
174
     async submitNextFlow() {
174
     async submitNextFlow() {
175
-      if(this.taskName == '预算编制'){
175
+      if (this.taskName == '预算编制') {
176
         this.preserve();
176
         this.preserve();
177
       }
177
       }
178
       const params = { taskId: this.taskForm.taskId };
178
       const params = { taskId: this.taskForm.taskId };
277
       this.$set(this.budgetForm, 'businessExpense', val.businessExpense);
277
       this.$set(this.budgetForm, 'businessExpense', val.businessExpense);
278
     },
278
     },
279
     getFixCost() {
279
     getFixCost() {
280
-      let total =
281
-        Number(this.budgetForm.staffCost) +
282
-        Number(this.budgetForm.carCost) +
283
-        Number(this.budgetForm.deviceCost);
284
-      this.budgetForm.fixCost = isNaN(total.toFixed(2)) ? null : total.toFixed(2);
280
+      const staffCost = this.safeNumber(this.budgetForm.staffCost);
281
+      const carCost = this.safeNumber(this.budgetForm.carCost);
282
+      const deviceCost = this.safeNumber(this.budgetForm.deviceCost);
283
+      const total = staffCost + carCost + deviceCost;
284
+      this.budgetForm.fixCost = total.toFixed(2);
285
+    },
286
+    safeNumber(value) {
287
+      const num = Number(value);
288
+      return isNaN(num) ? 0 : num;
285
     },
289
     },
286
     // 获取直接成本
290
     // 获取直接成本
287
     getDirectExpense() {
291
     getDirectExpense() {
288
-      let sum =
289
-        Number(this.budgetForm.settleExpense) +
290
-        Number(this.budgetForm.outExpense) +
291
-        Number(this.budgetForm.rentExpense) +
292
-        Number(this.budgetForm.taxExpense) +
293
-        Number(this.budgetForm.businessExpense) +
294
-        Number(this.budgetForm.otherExpense);
295
-      this.budgetForm.directExpense = isNaN(sum.toFixed(2)) ? null : sum.toFixed(2);
292
+      const settleExpense = this.safeNumber(this.budgetForm.settleExpense);
293
+      const outExpense = this.safeNumber(this.budgetForm.outExpense);
294
+      const rentExpense = this.safeNumber(this.budgetForm.rentExpense);
295
+      const taxExpense = this.safeNumber(this.budgetForm.taxExpense);
296
+      const businessExpense = this.safeNumber(this.budgetForm.businessExpense);
297
+      const otherExpense = this.safeNumber(this.budgetForm.otherExpense);
298
+      const sum = settleExpense + outExpense + rentExpense + taxExpense + businessExpense + otherExpense;
299
+      this.budgetForm.directExpense = sum.toFixed(2);
296
     },
300
     },
297
     getTotalBudget() {
301
     getTotalBudget() {
298
       this.budgetForm.totalBudget = (Number(this.budgetForm.fixCost) + Number(this.budgetForm.directExpense)).toFixed(2);
302
       this.budgetForm.totalBudget = (Number(this.budgetForm.fixCost) + Number(this.budgetForm.directExpense)).toFixed(2);

+ 11
- 2
oa-ui/src/views/flowable/form/budget/otherTable.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-12-11 17:21:00
3
  * @Date: 2024-12-11 17:21:00
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-12-12 13:52:17
5
+ * @LastEditTime: 2025-01-23 14:05:03
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div>
8
   <div>
102
     }
102
     }
103
   },
103
   },
104
   created() {
104
   created() {
105
-    
105
+
106
   },
106
   },
107
   methods: {
107
   methods: {
108
     initTable(val) {
108
     initTable(val) {
109
       this.form = val;
109
       this.form = val;
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
113
+      this.form.taxExpense == undefined ? this.form.taxExpense = 0 : this.form.taxExpense
114
+      this.form.businessExpense == undefined ? this.form.businessExpense = 0 : this.form.businessExpense
115
+    },
116
+    safeNumber(value) {
117
+      const num = Number(value);
118
+      return isNaN(num) ? 0 : num;
110
     },
119
     },
111
     computedDirectExpense() {
120
     computedDirectExpense() {
112
       this.$emit('otherCost', this.form)
121
       this.$emit('otherCost', this.form)

+ 0
- 2
oa-ui/src/views/flowable/form/budget/staffTable.vue View File

114
       this.form.staffCost = staffCost
114
       this.form.staffCost = staffCost
115
     },
115
     },
116
     getChooseUser(val) {
116
     getChooseUser(val) {
117
-      console.log(val);
118
-
119
       for (let v of val) {
117
       for (let v of val) {
120
         if (v.deptId === 115) {
118
         if (v.deptId === 115) {
121
           v.salary = { salary: 7898.75 }
119
           v.salary = { salary: 7898.75 }

+ 17
- 9
oa-ui/src/views/flowable/form/business/contractForm.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-05-10 15:31:57
3
  * @Date: 2024-05-10 15:31:57
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-15 11:29:57
5
+ * @LastEditTime: 2025-01-23 09:22:36
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
1051
         Promise.all([
1051
         Promise.all([
1052
           delContractWork(this.form.contractId),
1052
           delContractWork(this.form.contractId),
1053
           delContractPayment(this.form.contractId)
1053
           delContractPayment(this.form.contractId)
1054
-        ]).then(([workRes, paymentRes]) => {
1054
+        ]).then(async ([workRes, paymentRes]) => {
1055
           // 添加工作信息
1055
           // 添加工作信息
1056
-          const workPromises = this.workList.map(async work => {
1056
+          // const workPromises = this.workList.map(async work => {
1057
+          //   work.contractId = this.form.contractId;
1058
+          //   return await addContractWork(work);
1059
+          // });
1060
+          for (const work of this.workList) {
1057
             work.contractId = this.form.contractId;
1061
             work.contractId = this.form.contractId;
1058
-            return await addContractWork(work);
1059
-          });
1062
+            await addContractWork(work);
1063
+          }
1060
           // 添加支付信息
1064
           // 添加支付信息
1061
-          const paymentPromises = this.paymentList.map(async payment => {
1065
+          // const paymentPromises = this.paymentList.map(async payment => {
1066
+          //   payment.contractId = this.form.contractId;
1067
+          //   return await addContractPayment(payment);
1068
+          // });
1069
+          for (const payment of this.paymentList) {
1062
             payment.contractId = this.form.contractId;
1070
             payment.contractId = this.form.contractId;
1063
-            return await addContractPayment(payment);
1064
-          });
1071
+            await addContractPayment(payment);
1072
+          }
1065
           // 等待所有添加操作完成
1073
           // 等待所有添加操作完成
1066
-          return Promise.all([...workPromises, ...paymentPromises]);
1074
+          return Promise.all();
1067
         }).then(() => {
1075
         }).then(() => {
1068
           // this.$modal.msgSuccess("计划工作量和回款计划添加成功");
1076
           // this.$modal.msgSuccess("计划工作量和回款计划添加成功");
1069
         }).catch(error => {
1077
         }).catch(error => {

+ 22
- 52
oa-ui/src/views/flowable/form/projectProcess/arrangeProject.vue View File

1
 <!--
1
 <!--
2
  * @Author: ysh
2
  * @Author: ysh
3
- * @Date: 2024-03-19 09:24:06
3
+ * @Date: 2024-06-21 18:51:54
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-08 10:12:31
5
+ * @LastEditTime: 2025-01-23 14:05:22
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
9
     <h2 style="text-align: center;">项目安排</h2>
9
     <h2 style="text-align: center;">项目安排</h2>
10
     <el-form ref="arrangeForm" :model="form" :rules="rules" label-width="120px" :disabled="disabled">
10
     <el-form ref="arrangeForm" :model="form" :rules="rules" label-width="120px" :disabled="disabled">
11
-      <!-- <el-row :gutter="20">
12
-        <el-col :span="12" :xs="24">
13
-          <el-form-item label="承担部门:" prop="deptId">
14
-            <el-select v-model="form.deptId" multiple clearable style="width:100%" @change="getDeptLeader">
15
-              <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId"
16
-                v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
17
-              </el-option>
18
-            </el-select>
19
-          </el-form-item>
20
-        </el-col>
21
-        <el-col :span="12" :xs="24">
22
-          <el-form-item label="部门负责人:" prop="deptLeader">
23
-            <el-select v-model="form.deptLeader" multiple clearable style="width:100%">
24
-              <el-option v-for="item in $store.state.user.userList" :key="item.userId" :label="item.nickName"
25
-                :value="item.userId">
26
-              </el-option>
27
-            </el-select>
28
-          </el-form-item>
29
-        </el-col>
30
-      </el-row> -->
31
       <el-row :gutter="20">
11
       <el-row :gutter="20">
32
         <el-col :span="12" :xs="24">
12
         <el-col :span="12" :xs="24">
33
           <el-form-item label="项目负责人:" prop="projectLeader">
13
           <el-form-item label="项目负责人:" prop="projectLeader">
34
             <el-select v-model="peopleForm.deptId" @change="handleChangeDept" clearable style="width:60%">
14
             <el-select v-model="peopleForm.deptId" @change="handleChangeDept" clearable style="width:60%">
35
-              <el-option v-for="item in peopleForm.deptList" :key="item.deptId" :label="item.deptName"
15
+              <el-option v-for="item, index in peopleForm.deptList" :key="'d' + index" :label="item.deptName"
36
                 :value="item.deptId" v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
16
                 :value="item.deptId" v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
37
               </el-option>
17
               </el-option>
38
             </el-select>
18
             </el-select>
39
             <el-select v-model="form.projectLeader" placeholder="请选择项目负责人" clearable style="width:40%">
19
             <el-select v-model="form.projectLeader" placeholder="请选择项目负责人" clearable style="width:40%">
40
-              <el-option v-for="item in peopleForm.userList" :key="item.userId" :label="item.nickName"
20
+              <el-option v-for="item, index in peopleForm.userList" :key="'l' + index" :label="item.nickName"
41
                 :value="item.userId" />
21
                 :value="item.userId" />
42
             </el-select>
22
             </el-select>
43
           </el-form-item>
23
           </el-form-item>
45
         <el-col :span="12" :xs="24">
25
         <el-col :span="12" :xs="24">
46
           <el-form-item label="现场负责人:" prop="siteLeader">
26
           <el-form-item label="现场负责人:" prop="siteLeader">
47
             <el-select v-model="form.siteLeader" filterable clearable style="width:100%">
27
             <el-select v-model="form.siteLeader" filterable clearable style="width:100%">
48
-              <el-option v-for="item in peopleForm.allDeptUserList" :key="item.userId" :label="item.nickName"
28
+              <el-option v-for="item, index in peopleForm.allDeptUserList" :key="'s' + index" :label="item.nickName"
49
                 :value="item.userId" v-if="item.nickName != 'admin'">
29
                 :value="item.userId" v-if="item.nickName != 'admin'">
50
               </el-option>
30
               </el-option>
51
             </el-select>
31
             </el-select>
52
           </el-form-item>
32
           </el-form-item>
53
         </el-col>
33
         </el-col>
54
       </el-row>
34
       </el-row>
55
-      <!-- <el-row :gutter="20">
56
-        <el-col :span="12" :xs="24">
57
-          <el-form-item label="组织交底日期:" prop="organizeTime">
58
-            <el-date-picker style="width: 100%;" v-model="form.organizeTime" value-format="yyyy-MM-dd" type="date"
59
-              placeholder="选择日期">
60
-            </el-date-picker>
61
-          </el-form-item>
62
-        </el-col>
63
-        <el-col :span="12" :xs="24">
64
-          <el-form-item label="组织交底文档:" prop="organizeDocument">
65
-            <div v-if="form.organizeDocument" class="upload-list">
66
-              <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.organizeDocument}`)">
67
-                {{ getFileName(form.organizeDocument) }}
68
-              </el-link>
69
-              <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.organizeDocument}`"
70
-                :underline="false" target="_blank">
71
-                <span class="el-icon-download">下载文件</span>
72
-              </el-link>
73
-            </div>
74
-            <FileUpload v-if="taskName == '项目安排'" ref="orz" :limit="1" :filePathName="'组织交底文件'"
75
-              :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setOrganizeDocument">
76
-            </FileUpload>
77
-          </el-form-item>
78
-        </el-col>
79
-      </el-row> -->
80
     </el-form>
35
     </el-form>
81
     <div slot="footer" class="dialog-footer" style="text-align: center;">
36
     <div slot="footer" class="dialog-footer" style="text-align: center;">
37
+      <el-button type="danger" @click="$emit('returnBack')" :disabled="disabled">退 回</el-button>
82
       <el-button type="warning" @click="save" :disabled="disabled">保 存</el-button>
38
       <el-button type="warning" @click="save" :disabled="disabled">保 存</el-button>
83
       <el-button type="primary" @click="confirmPlanForm" :disabled="disabled">提 交</el-button>
39
       <el-button type="primary" @click="confirmPlanForm" :disabled="disabled">提 交</el-button>
84
     </div>
40
     </div>
91
 import { getUsersDeptLeaderByDept, getDeptLeadersByDeptId, getUsersManageLeaderByDept } from '@/api/system/post'
47
 import { getUsersDeptLeaderByDept, getDeptLeadersByDeptId, getUsersManageLeaderByDept } from '@/api/system/post'
92
 import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
48
 import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm, } from "@/api/flowable/todo";
93
 import { listProject, getProject, addProject, updateProject, delProject, submitProject, modifyProject } from "@/api/oa/project/project";
49
 import { listProject, getProject, addProject, updateProject, delProject, submitProject, modifyProject } from "@/api/oa/project/project";
50
+import { listSubProcInstId, delDeployment } from "@/api/flowable/finished"
51
+import { cancelSubProcess } from '@/utils/cancelSubProcess';
94
 export default {
52
 export default {
95
   props: {
53
   props: {
96
     disabled: {
54
     disabled: {
251
         }
209
         }
252
       })
210
       })
253
     },
211
     },
254
-    confirmPlanForm() {
212
+    async confirmPlanForm() {
213
+      let resProcInstId = await listSubProcInstId({ instanceId: this.taskForm.procInsId });
214
+      let ids = resProcInstId.data.map(item => item.id);
215
+      if (ids.length > 0) {
216
+        cancelSubProcess(ids, this.taskForm.formId).then(res => {
217
+          if (res.code == 200) {
218
+            this.sendConfirm();
219
+          }
220
+        })
221
+      } else {
222
+        this.sendConfirm();
223
+      }
224
+    },
225
+    sendConfirm() {
255
       this.$confirm('项目安排之后会自动发起预算编制、技术方案、安全交底三个子流程,将无法进行撤回操作,是否继续提交?', '提示', {
226
       this.$confirm('项目安排之后会自动发起预算编制、技术方案、安全交底三个子流程,将无法进行撤回操作,是否继续提交?', '提示', {
256
         confirmButtonText: '确定',
227
         confirmButtonText: '确定',
257
         cancelButtonText: '取消',
228
         cancelButtonText: '取消',
282
           }
253
           }
283
         })
254
         })
284
       })
255
       })
285
-
286
     },
256
     },
287
     cancel() {
257
     cancel() {
288
       this.form = {}
258
       this.form = {}

+ 4
- 2
oa-ui/src/views/flowable/form/projectProcess/assessWork.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-07-08 16:16:27
3
  * @Date: 2024-07-08 16:16:27
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-29 10:40:31
5
+ * @LastEditTime: 2025-01-22 17:01:42
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
68
     </el-form>
68
     </el-form>
69
 
69
 
70
     <div slot="footer" class="dialog-footer" style="text-align: center;">
70
     <div slot="footer" class="dialog-footer" style="text-align: center;">
71
+      <el-button type="danger" @click="$emit('returnBack')" :disabled="disabled">退 回</el-button>
71
       <el-button type="warning" @click="save" :disabled="disabled">保 存</el-button>
72
       <el-button type="warning" @click="save" :disabled="disabled">保 存</el-button>
72
       <el-button type="primary" @click="confirm" :disabled="disabled">提 交</el-button>
73
       <el-button type="primary" @click="confirm" :disabled="disabled">提 交</el-button>
73
     </div>
74
     </div>
75
+
74
   </div>
76
   </div>
75
 </template>
77
 </template>
76
 
78
 
109
           remark: "",
111
           remark: "",
110
         },
112
         },
111
       ],
113
       ],
112
-
113
     }
114
     }
114
   },
115
   },
115
   created() {
116
   created() {
193
     getDeptLeader(val) {
194
     getDeptLeader(val) {
194
       let deptId = Number(val[0])
195
       let deptId = Number(val[0])
195
       getUsersDeptLeaderByDept({ deptId: Number(deptId) }).then(res => {
196
       getUsersDeptLeaderByDept({ deptId: Number(deptId) }).then(res => {
197
+        this.taskForm.variables = {}
196
         this.$set(this.taskForm.variables, "approval", res.data.userId);
198
         this.$set(this.taskForm.variables, "approval", res.data.userId);
197
       })
199
       })
198
     }
200
     }

+ 6
- 5
oa-ui/src/views/flowable/form/projectProcess/businessReview.vue View File

1
 <!--
1
 <!--
2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-04-08 13:56:14
3
  * @Date: 2024-04-08 13:56:14
4
- * @LastEditors: wrh
5
- * @LastEditTime: 2024-09-24 10:31:28
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2025-01-22 14:55:32
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
18
       <el-form-item label="审核时间:">
18
       <el-form-item label="审核时间:">
19
         {{ form.jyApprovalTime }}
19
         {{ form.jyApprovalTime }}
20
       </el-form-item>
20
       </el-form-item>
21
-      <el-form-item>
22
-        <p style="text-align:center;"><el-button type="primary" @click="confirm">确认审核</el-button></p>
23
-      </el-form-item>
21
+      <el-row class="text-center">
22
+        <el-button type="danger" @click="$emit('returnBack')" :disabled="disabled">退 回</el-button>
23
+        <el-button type="primary" @click="confirm">确认审核</el-button>
24
+      </el-row>
24
     </el-form>
25
     </el-form>
25
   </div>
26
   </div>
26
 </template>
27
 </template>

+ 2
- 1
oa-ui/src/views/flowable/form/projectProcess/inProgress.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-06-21 18:51:54
3
  * @Date: 2024-06-21 18:51:54
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2025-01-22 10:58:59
5
+ * @LastEditTime: 2025-01-23 14:20:57
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div>
8
   <div>
118
         <settle-data :taskForm="taskForm" :taskName="taskName"></settle-data>
118
         <settle-data :taskForm="taskForm" :taskName="taskName"></settle-data>
119
       </div>
119
       </div>
120
       <div slot="footer" class="dialog-footer" style="text-align: center">
120
       <div slot="footer" class="dialog-footer" style="text-align: center">
121
+        <el-button type="danger" @click="$emit('returnBack')" :disabled="disabled">退 回</el-button>
121
         <el-button @click="preserve()" :disabled="disabled" type="warning">保 存</el-button>
122
         <el-button @click="preserve()" :disabled="disabled" type="warning">保 存</el-button>
122
         <el-button type="primary" @click="submitNextFlow()" :disabled="disabled">项目结束</el-button>
123
         <el-button type="primary" @click="submitNextFlow()" :disabled="disabled">项目结束</el-button>
123
       </div>
124
       </div>

+ 28
- 9
oa-ui/src/views/flowable/form/projectProcess/index.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-02-27 14:49:15
3
  * @Date: 2024-02-27 14:49:15
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-11 16:28:20
5
+ * @LastEditTime: 2025-01-22 14:29:46
6
 -->
6
 -->
7
 
7
 
8
 <template>
8
 <template>
9
   <div class="project-wrapper">
9
   <div class="project-wrapper">
10
+    <div class="mt20 mb20" v-if="showAlter">
11
+      <el-alert title="任务被退回,请修改后重新提交" type="error" :closable="false">
12
+        <return-comment :taskForm="taskForm" @isReturn="isReturn"></return-comment>
13
+      </el-alert>
14
+    </div>
10
     <el-row :gutter="20">
15
     <el-row :gutter="20">
11
-      <el-col :xs="24":md="18">
16
+      <el-col :xs="24" :md="18">
12
         <el-tabs tabPosition="left" type="card" class="tabs-border" v-model="activeName">
17
         <el-tabs tabPosition="left" type="card" class="tabs-border" v-model="activeName">
13
           <el-tab-pane label="项目登记" name="项目登记">
18
           <el-tab-pane label="项目登记" name="项目登记">
14
             <addproject :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '项目登记'" @goBack="goBack">
19
             <addproject :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '项目登记'" @goBack="goBack">
15
             </addproject>
20
             </addproject>
16
           </el-tab-pane>
21
           </el-tab-pane>
17
           <el-tab-pane label="核定工作" name="核定工作">
22
           <el-tab-pane label="核定工作" name="核定工作">
18
-            <assess-work :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '核定工作'" @goBack="goBack"></assess-work>
23
+            <assess-work :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '核定工作'"
24
+              @goBack="goBack" @returnBack="returnOpen = true"></assess-work>
19
           </el-tab-pane>
25
           </el-tab-pane>
20
           <el-tab-pane label="项目安排" name="项目安排">
26
           <el-tab-pane label="项目安排" name="项目安排">
21
-            <arrangeProject :taskForm="taskForm" :taskName="'项目安排'" :disabled="taskName != '项目安排'" @goBack="goBack">
27
+            <arrangeProject :taskForm="taskForm" :taskName="'项目安排'" :disabled="taskName != '项目安排'" @goBack="goBack" @returnBack="returnOpen = true">
22
             </arrangeProject>
28
             </arrangeProject>
23
           </el-tab-pane>
29
           </el-tab-pane>
24
           <el-tab-pane label="经营审核" name="经营审核">
30
           <el-tab-pane label="经营审核" name="经营审核">
25
             <business-review :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '经营审核'"
31
             <business-review :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '经营审核'"
26
-              @goBack="goBack"></business-review>
32
+              @goBack="goBack" @returnBack="returnOpen = true"></business-review>
27
           </el-tab-pane>
33
           </el-tab-pane>
28
           <el-tab-pane label="分管审核" name="分管审核">
34
           <el-tab-pane label="分管审核" name="分管审核">
29
             <manage-review :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '分管审核'"
35
             <manage-review :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '分管审核'"
30
-              @goBack="goBack"></manage-review>
36
+              @goBack="goBack" @returnBack="returnOpen = true"></manage-review>
31
           </el-tab-pane>
37
           </el-tab-pane>
32
           <!-- <el-tab-pane label="生产确认" name="生产确认">
38
           <!-- <el-tab-pane label="生产确认" name="生产确认">
33
             <sc-confirm :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '生产确认'"
39
             <sc-confirm :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '生产确认'"
35
           </el-tab-pane> -->
41
           </el-tab-pane> -->
36
           <el-tab-pane label="项目生产" name="项目生产">
42
           <el-tab-pane label="项目生产" name="项目生产">
37
             <in-progress :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '项目生产'"
43
             <in-progress :taskForm="taskForm" :taskName="taskName" :disabled="taskName != '项目生产'"
38
-              @goBack="goBack"></in-progress>
44
+              @goBack="goBack" @returnBack="returnOpen = true"></in-progress>
39
           </el-tab-pane>
45
           </el-tab-pane>
40
           <el-tab-pane label="项目预算" name="项目预算">
46
           <el-tab-pane label="项目预算" name="项目预算">
41
             <budget-tab :taskForm="taskForm" @goBack="goBack"></budget-tab>
47
             <budget-tab :taskForm="taskForm" @goBack="goBack"></budget-tab>
60
         </el-card>
66
         </el-card>
61
       </el-col>
67
       </el-col>
62
     </el-row>
68
     </el-row>
69
+    <el-dialog title="退回" :visible.sync="returnOpen" width="40%" append-to-body>
70
+      <return-btn :taskForm="taskForm" @goBack="$emit('goBack')" @cancel="returnOpen = false"></return-btn>
71
+    </el-dialog>
63
   </div>
72
   </div>
64
 </template>
73
 </template>
65
 
74
 
80
 import SafeTab from './safeTab.vue'
89
 import SafeTab from './safeTab.vue'
81
 import technicalTab from './technicalTab.vue'
90
 import technicalTab from './technicalTab.vue'
82
 import AssessWork from './assessWork.vue'
91
 import AssessWork from './assessWork.vue'
92
+import ReturnComment from '@/views/flowable/form/components/flowBtn/returnComment.vue';
93
+import ReturnBtn from '@/views/flowable/form/components/flowBtn/returnBtn.vue';
83
 export default {
94
 export default {
84
   props: {
95
   props: {
85
     taskName: {
96
     taskName: {
89
       type: Object,
100
       type: Object,
90
     }
101
     }
91
   },
102
   },
92
-  components: { addproject, arrangeProject, businessReview, flow, ManageReview, ScConfirm, InProgress, BudgetTab, planTab, SafeTab, technicalTab, AssessWork },
103
+  components: {
104
+    addproject, arrangeProject, businessReview, flow, ManageReview, ScConfirm, InProgress, BudgetTab, planTab, SafeTab, technicalTab, AssessWork, ReturnComment,
105
+    ReturnBtn
106
+  },
93
   data() {
107
   data() {
94
     return {
108
     return {
95
       activeName: '项目登记',
109
       activeName: '项目登记',
129
         remark: ''
143
         remark: ''
130
       }],
144
       }],
131
       flowData: {},
145
       flowData: {},
146
+      showAlter: true,
147
+      returnOpen:false,
132
     }
148
     }
133
   },
149
   },
134
   created() {
150
   created() {
250
     },
266
     },
251
     goBack() {
267
     goBack() {
252
       this.$emit('goBack')
268
       this.$emit('goBack')
253
-    }
269
+    },
270
+    isReturn(val) {
271
+      this.showAlter = val
272
+    },
254
   },
273
   },
255
 }
274
 }
256
 </script>
275
 </script>

+ 5
- 4
oa-ui/src/views/flowable/form/projectProcess/manageReview.vue View File

2
  * @Author: ysh
2
  * @Author: ysh
3
  * @Date: 2024-04-08 13:56:14
3
  * @Date: 2024-04-08 13:56:14
4
  * @LastEditors: Please set LastEditors
4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-30 09:23:49
5
+ * @LastEditTime: 2025-01-22 15:03:06
6
 -->
6
 -->
7
 <template>
7
 <template>
8
   <div class="app-container">
8
   <div class="app-container">
34
       <el-form-item label="审核时间:">
34
       <el-form-item label="审核时间:">
35
         {{ form.manageApprovalTime }}
35
         {{ form.manageApprovalTime }}
36
       </el-form-item>
36
       </el-form-item>
37
-      <el-form-item>
38
-        <p style="text-align:center;"><el-button type="primary" @click="confirm">确认审核</el-button></p>
39
-      </el-form-item>
37
+      <el-row class="text-center">
38
+        <el-button type="danger" @click="$emit('returnBack')" :disabled="disabled">退 回</el-button>
39
+        <el-button type="primary" @click="confirm">确认审核</el-button>
40
+      </el-row>
40
     </el-form>
41
     </el-form>
41
 
42
 
42
     <el-dialog title="安全交底记录表" :visible.sync="openSafe" width="1000px" append-to-body>
43
     <el-dialog title="安全交底记录表" :visible.sync="openSafe" width="1000px" append-to-body>

+ 1
- 1
oa-ui/src/views/oa/archive/index.vue View File

49
       <el-table-column label="项目编号" align="center" prop="project.projectNumber" />
49
       <el-table-column label="项目编号" align="center" prop="project.projectNumber" />
50
       <el-table-column label="项目名称" align="center" prop="project.projectName" />
50
       <el-table-column label="项目名称" align="center" prop="project.projectName" />
51
       <el-table-column label="备注说明" align="center" :show-overflow-tooltip="true" width="150" prop="submitSituation" />
51
       <el-table-column label="备注说明" align="center" :show-overflow-tooltip="true" width="150" prop="submitSituation" />
52
-      <el-table-column label="项目负责人" align="center" prop="leaderUser.nickName" />
52
+      <el-table-column label="发起人" align="center" prop="leaderUser.nickName" />
53
       <!-- <el-table-column label="生产部门检查员" align="center" prop="produceUser.nickName" /> -->
53
       <!-- <el-table-column label="生产部门检查员" align="center" prop="produceUser.nickName" /> -->
54
       <!-- <el-table-column label="质量检查员" align="center" prop="qualityUser.nickName" /> -->
54
       <!-- <el-table-column label="质量检查员" align="center" prop="qualityUser.nickName" /> -->
55
       <el-table-column label="技术质量与安全部意见" align="center" :show-overflow-tooltip="true" width="150" prop="deptComment" />
55
       <el-table-column label="技术质量与安全部意见" align="center" :show-overflow-tooltip="true" width="150" prop="deptComment" />

+ 1
- 1
oa-ui/vue.config.js View File

35
     proxy: {
35
     proxy: {
36
       // detail: https://cli.vuejs.org/config/#devserver-proxy
36
       // detail: https://cli.vuejs.org/config/#devserver-proxy
37
       [process.env.VUE_APP_BASE_API]: {
37
       [process.env.VUE_APP_BASE_API]: {
38
-        target: `http://localhost:8086`,
38
+        target: `http://localhost:8080`,
39
         // target: `http://localhost:8080`,
39
         // target: `http://localhost:8080`,
40
         changeOrigin: true,
40
         changeOrigin: true,
41
         pathRewrite: {
41
         pathRewrite: {

Loading…
Cancel
Save