瀏覽代碼

修改经营选承担部门,并可以填工作量,由部门负责人安排项目负责人

余思翰 9 月之前
父節點
當前提交
3557d56fef

+ 6
- 2
oa-ui/src/views/flowable/form/components/chooseContract.vue 查看文件

@@ -2,12 +2,16 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-05-22 11:12:57
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-04 11:20:46
5
+ * @LastEditTime: 2024-09-05 14:08:32
6 6
 -->
7 7
 <template>
8 8
   <div>
9 9
     <el-row>
10 10
       <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="88px">
11
+        <el-form-item label="合同名称" prop="contractName">
12
+          <el-input v-model="queryParams.contractName" placeholder="请输入合同名称" clearable
13
+            @keyup.enter.native="handleQuery" />
14
+        </el-form-item>
11 15
         <el-form-item label="合同编码" prop="contractCode">
12 16
           <el-input v-model="queryParams.contractCode" placeholder="请输入合同编码" clearable
13 17
             @keyup.enter.native="handleQuery" />
@@ -30,7 +34,7 @@
30 34
       <el-table-column label="合同金额" align="center" prop="amount" min-width="100px" />
31 35
     </el-table>
32 36
     <div style="text-align: right;" class="mt20 mr20">
33
-      <el-pagination @current-change="getList" :current-page.sync="queryParams.pageNum"
37
+      <el-pagination @current-change="getList" :current-page.sync="queryParams.pageNum" :autoScroll="false"
34 38
         :page-size="queryParams.pageSize" layout="total, prev, pager, next" :total="total">
35 39
       </el-pagination>
36 40
     </div>

+ 1
- 1
oa-ui/src/views/flowable/form/components/choosePartner.vue 查看文件

@@ -30,7 +30,7 @@
30 30
       <el-table-column label="擅长业务方向" align="center" prop="strength" />
31 31
       <el-table-column label="履约能力评价" align="center" prop="fulfill" />
32 32
     </el-table>
33
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
33
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" :autoScroll="false"
34 34
       @pagination="getList" />
35 35
     <div>
36 36
       已选单位:<el-tag v-for="item in partners" style="margin: 5px;" :key="item.partnerId">{{ item.partnerName }}</el-tag>

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

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-06-18 17:38:50
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-30 11:25:29
5
+ * @LastEditTime: 2024-09-05 14:09:31
6 6
 -->
7 7
 <template>
8 8
   <div>
@@ -32,7 +32,7 @@
32 32
       <el-table-column label="备注说明" align="center" prop="remark" />
33 33
     </el-table>
34 34
 
35
-    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
35
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize" :autoScroll="false"
36 36
       @pagination="getList" />
37 37
     <div>
38 38
       已选单位:<el-tag v-for="item in choosePartyA" style="margin: 5px;" :key="item.partyAId">{{ item.partyAName }}</el-tag>

oa-ui/src/views/flowable/form/components/actualWork.vue → oa-ui/src/views/flowable/form/projectProcess/actualWork.vue 查看文件


+ 70
- 5
oa-ui/src/views/flowable/form/projectProcess/addproject.vue 查看文件

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-03-18 11:00:04
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-29 14:31:38
5
+ * @LastEditTime: 2024-09-05 16:35:08
6 6
 -->
7 7
 <template>
8 8
   <div class="project-wrapper">
@@ -66,6 +66,23 @@
66 66
           :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="setProjectDocument">
67 67
         </FileUpload>
68 68
       </el-form-item>
69
+      <el-form-item label="计划工作量:" prop="taskDocument">
70
+        <plan-workload ref="planworkRef" :projectId="taskForm.formId"></plan-workload>
71
+      </el-form-item>
72
+      <el-form-item label="承担部门:" prop="deptId">
73
+        <el-select v-model="addForm.deptId" multiple clearable style="width:100%" @change="getDeptLeader">
74
+          <el-option v-for="item in deptList" :key="item.deptId" :label="item.deptName" :value="item.deptId"
75
+            v-if="item.deptName != '四川中水成勘院测绘工程有限责任公司'">
76
+          </el-option>
77
+        </el-select>
78
+      </el-form-item>
79
+      <el-form-item label="部门负责人:" prop="deptLeader">
80
+        <el-select v-model="addForm.deptLeader" multiple clearable style="width:100%">
81
+          <el-option v-for="item in $store.state.user.userList" :key="item.userId" :label="item.nickName"
82
+            :value="item.userId">
83
+          </el-option>
84
+        </el-select>
85
+      </el-form-item>
69 86
       <el-form-item label="资料提交要求:" prop="projectRequest">
70 87
         <el-input v-model="addForm.projectRequest" type="textarea" :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
71 88
       </el-form-item>
@@ -104,6 +121,7 @@
104 121
 import { parseTime } from "@/utils/ruoyi";
105 122
 import { mapGetters } from "vuex";
106 123
 import { listProject, getProject, addProject, updateProject, delProject, getProjectNmuber } from "@/api/oa/project/project";
124
+import { listDept } from '@/api/system/dept'
107 125
 import { getUser } from "@/api/system/user";
108 126
 import { getUsersDeptLeaderByDept } from "@/api/system/post";
109 127
 import { complete, getNextFlowNode } from "@/api/flowable/todo";
@@ -114,8 +132,9 @@ import { listPartyA } from "@/api/oa/partyA/partyA";
114 132
 import chooseContract from '../components/chooseContract.vue';
115 133
 import ChoosePartyA from '@/views/flowable/form/components/choosePartyA.vue';
116 134
 import ArrangeProject from './arrangeProject.vue';
135
+import planWorkload from "./planWorkload.vue";
117 136
 export default {
118
-  components: { chooseContract, ArrangeProject, ChoosePartyA },
137
+  components: { chooseContract, ArrangeProject, ChoosePartyA, planWorkload },
119 138
   dicts: ['cmc_scale_grade', 'cmc_unit'],
120 139
   props: {
121 140
     disabled: {
@@ -147,6 +166,8 @@ export default {
147 166
       },
148 167
       projectList: [],
149 168
       partyAList: [],
169
+      deptList: [],
170
+      deptLeaderList: [],
150 171
       total: 0,
151 172
       loading: true,
152 173
       modifyOpen: false,
@@ -175,6 +196,12 @@ export default {
175 196
         partyAId: [{ required: true, message: "请选择甲方单位", trigger: "change" }],
176 197
         contactPerson: [{ required: true, message: "请输入联系人", trigger: "blur" }],
177 198
         telephone: [{ required: true, message: "请输入联系人联系方式", trigger: "blur" }],
199
+        deptId: [
200
+          { required: true, message: "请选择承担部门", trigger: "change" }
201
+        ],
202
+        deptLeader: [
203
+          { required: true, message: "部门负责人不能为空", trigger: "change" }
204
+        ]
178 205
         // projectRequest: [{ required: true, message: "请输入资料提交要求", trigger: "blur" }],
179 206
         // taskDocument: [{ required: true, message: "请上传任务书", trigger: "blur" }]
180 207
       },
@@ -196,6 +223,7 @@ export default {
196 223
     this.registerTime = parseTime(new Date(), '{y}-{m}-{d}')
197 224
     this.initProjectForm();
198 225
     this.getPartyAList();
226
+    this.getDeptList();
199 227
     this.getContractDataList();
200 228
     // this.getList();
201 229
   },
@@ -219,6 +247,14 @@ export default {
219 247
         this.loading = false;
220 248
       });
221 249
     },
250
+    getDeptList() {
251
+      listDept({
252
+        deptName: undefined,
253
+        status: undefined
254
+      }).then(res => {
255
+        this.deptList = res.data
256
+      })
257
+    },
222 258
     async initProjectForm() {
223 259
       let datas = await listProject({ projectId: this.taskForm.formId });
224 260
       if (datas.rows.length > 0) {
@@ -230,9 +266,29 @@ export default {
230 266
         this.registrantUser = this.name;
231 267
       }
232 268
     },
269
+    async getDeptLeader(val) {
270
+      this.deptLeaderList = [];
271
+      for (let v of val) {
272
+        let res = await getUsersDeptLeaderByDept({ deptId: Number(v) })
273
+        this.deptLeaderList.push(res.data.userId);
274
+      }
275
+      this.$set(this.addForm, 'deptLeader', this.deptLeaderList);
276
+      this.addForm.undertakingDept = this.addForm.deptId.join(',');
277
+    },
233 278
     getProjectInfo() {
234 279
       getProject(this.taskForm.formId).then(res => {
235 280
         this.addForm = res.data;
281
+        if (this.addForm.undertakingDept != null && this.addForm.undertakingDept != "" && this.addForm.undertakingDept != undefined) {
282
+          this.addForm.deptId = this.addForm.undertakingDeptName.split(',')
283
+        }
284
+        this.$set(this.addForm, 'deptLeader', [])
285
+        if (this.addForm.undertakingDept) {
286
+          let arr = (this.addForm.undertakingDept.split(',')).map(Number)
287
+          this.$set(this.addForm, 'deptId', arr)
288
+          this.getDeptLeader(arr);
289
+        } else {
290
+          this.$set(this.addForm, 'deptId', [])
291
+        }
236 292
       })
237 293
     },
238 294
     getProjectWorkList() {
@@ -269,8 +325,19 @@ export default {
269 325
       }
270 326
       this.openContract = false;
271 327
     },
328
+    updatePlanWorkload() {
329
+      const workList = this.$refs.planworkRef.workList;
330
+      const projectId = this.taskForm.formId
331
+      delProjectWork(projectId).then(() => {
332
+        workList.forEach(work => {
333
+          work.projectId = projectId;
334
+          addProjectWork(work);
335
+        })
336
+      })
337
+    },
272 338
     // 暂存
273 339
     async save() {
340
+      this.updatePlanWorkload();
274 341
       // 新增项目数据
275 342
       if (this.formTotal == 0) {
276 343
         this.addForm.projectId = this.taskForm.formId;
@@ -283,9 +350,6 @@ export default {
283 350
           await addProjectContract(pcobj)
284 351
           this.$modal.msgSuccess("合同关联成功");
285 352
         }
286
-        // setTimeout(() => {
287
-        //   this.$router.go(0);
288
-        // }, 500);
289 353
         this.initProjectForm();
290 354
       } else {
291 355
         // 修改项目数据
@@ -304,6 +368,7 @@ export default {
304 368
       // 获取下一个流程节点
305 369
       this.$refs['projectAdd'].validate((vaild) => {
306 370
         if (vaild) {
371
+          this.updatePlanWorkload();
307 372
           if (this.formTotal == 0) {
308 373
             this.addForm.projectId = this.taskForm.formId;
309 374
             addProject(this.addForm).then(response => {

+ 4
- 4
oa-ui/src/views/flowable/form/projectProcess/arrangeProject.vue 查看文件

@@ -1,14 +1,14 @@
1 1
 <!--
2 2
  * @Author: ysh
3 3
  * @Date: 2024-03-19 09:24:06
4
- * @LastEditors: wrh
5
- * @LastEditTime: 2024-08-23 15:59:39
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-09-05 16:56:04
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
9 9
     <h2 style="text-align: center;">项目安排</h2>
10 10
     <el-form ref="arrangeForm" :model="form" :rules="rules" label-width="120px" :disabled="disabled">
11
-      <el-row :gutter="20">
11
+      <!-- <el-row :gutter="20">
12 12
         <el-col :span="12" :xs="24">
13 13
           <el-form-item label="承担部门:" prop="deptId">
14 14
             <el-select v-model="form.deptId" multiple clearable style="width:100%" @change="getDeptLeader">
@@ -27,7 +27,7 @@
27 27
             </el-select>
28 28
           </el-form-item>
29 29
         </el-col>
30
-      </el-row>
30
+      </el-row> -->
31 31
       <el-row :gutter="20">
32 32
         <el-col :span="12" :xs="24">
33 33
           <el-form-item label="项目负责人:" prop="projectLeader">

+ 12
- 9
oa-ui/src/views/flowable/form/projectProcess/assessWork.vue 查看文件

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-07-08 16:16:27
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-05 14:40:00
5
+ * @LastEditTime: 2024-09-05 16:54:57
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
@@ -124,12 +124,16 @@ export default {
124 124
       let projectRes = await getProject(this.taskForm.formId)
125 125
       if (projectRes.code == 200 && projectRes.data) {
126 126
         this.form = projectRes.data
127
+        if (this.form.undertakingDept) {
128
+          let arr = (this.form.undertakingDept.split(',')).map(Number)
129
+          this.getDeptLeader(arr)
130
+        }
127 131
         this.total = 1
128 132
         this.getProjectWorkList();
129 133
       }
130 134
     },
131 135
     getProjectWorkList() {
132
-      listProjectWork({ projectId: this.taskForm.formId }).then(res => {
136
+      listProjectWork({ pageNum: 1, pageSize: 100, projectId: this.taskForm.formId }).then(res => {
133 137
         if (res.rows.length != 0) {
134 138
           this.workList = res.rows;
135 139
         }
@@ -179,13 +183,6 @@ export default {
179 183
     },
180 184
     async confirm() {
181 185
       this.save();
182
-      // let resData = await getUsersDeptLeaderByDept({ deptId: 105 });
183
-      // let approval;
184
-      // if (resData.data) {
185
-      //   approval = resData.data.userId;
186
-      // }
187
-      let approval = this.form.projectRegistrant;
188
-      this.$set(this.taskForm.variables, "approval", approval);
189 186
       const params = { taskId: this.taskForm.taskId };
190 187
       getNextFlowNode(params).then(res => {
191 188
         complete(this.taskForm).then(response => {
@@ -193,6 +190,12 @@ export default {
193 190
           this.$emit('goBack');
194 191
         });
195 192
       })
193
+    },
194
+    getDeptLeader(val) {
195
+      let deptId = Number(val[0])
196
+      getUsersDeptLeaderByDept({ deptId: Number(deptId) }).then(res => {
197
+        this.$set(this.taskForm.variables, "approval", res.data.userId);
198
+      })
196 199
     }
197 200
   },
198 201
 }

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

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-06-21 18:51:54
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-09-05 10:30:20
5
+ * @LastEditTime: 2024-09-05 13:55:35
6 6
 -->
7 7
 <template>
8 8
   <div>
@@ -155,7 +155,7 @@ import ChoosePeople from '../budget/components/choosePeople.vue';
155 155
 import ChooseCar from '../budget/components/chooseCar.vue';
156 156
 import ChooseDevice from "../budget/components/chooseDevice.vue";
157 157
 import AchiData from '../inProgress/achiData.vue';
158
-import actualWork from '@/views/flowable/form/components/actualWork.vue';
158
+import actualWork from '@/views/flowable/form/projectProcess/actualWork.vue';
159 159
 export default {
160 160
   components: {
161 161
     borrowData,

+ 132
- 0
oa-ui/src/views/flowable/form/projectProcess/planWorkload.vue 查看文件

@@ -0,0 +1,132 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-09-05 13:57:44
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-09-05 14:45:48
6
+-->
7
+<template>
8
+  <div style="width:100%">
9
+    <table class="table" border="1" style="width:100%">
10
+      <tr>
11
+        <td style="width: 180px">工作内容</td>
12
+        <td>等级或比例尺</td>
13
+        <td>单位</td>
14
+        <td>工作量</td>
15
+        <td style="width: 100px">要求完成时间</td>
16
+        <td>备注</td>
17
+      </tr>
18
+      <tr v-for="(work, index) in workList" :key="index">
19
+        <td>
20
+          <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
21
+        </td>
22
+        <td>
23
+          <el-select v-model="work.scale" placeholder="请选择" clearable>
24
+            <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
25
+              :value="dict.label" />
26
+          </el-select>
27
+        </td>
28
+        <td>
29
+          <el-select v-model="work.unit" placeholder="请选择" clearable>
30
+            <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label" :value="dict.label" />
31
+          </el-select>
32
+        </td>
33
+        <td>
34
+          <el-input v-model="work.workload" clearable></el-input>
35
+        </td>
36
+        <td>
37
+          <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
38
+            placeholder="选择日期">
39
+          </el-date-picker>
40
+        </td>
41
+        <td>
42
+          <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"></el-input>
43
+        </td>
44
+        <td>
45
+          <div class="delete-btn" @click="deletWorkItem(index)">
46
+            <i class="el-icon-circle-close"></i>
47
+          </div>
48
+        </td>
49
+      </tr>
50
+    </table>
51
+    <el-button icon="el-icon-plus" type="primary" plain size="mini" @click="addWorkList"></el-button>
52
+  </div>
53
+</template>
54
+
55
+<script>
56
+import { listProject, getProject, addProject, updateProject, delProject } from "@/api/oa/project/project";
57
+import { listProjectWork, addProjectWork, delProjectWork } from "@/api/oa/project/projectWork";
58
+export default {
59
+  dicts: ['cmc_scale_grade', 'cmc_unit'],
60
+  props: {
61
+    projectId: {
62
+      type: String,
63
+      require: true
64
+    }
65
+  },
66
+  data() {
67
+    return {
68
+      workList: [{
69
+        content: "",
70
+        scale: "",
71
+        unit: "",
72
+        workload: "",
73
+        deadline: undefined,
74
+        remark: "",
75
+      }],
76
+
77
+    }
78
+  },
79
+  created() {
80
+    this.getList();
81
+  },
82
+  methods: {
83
+    getList() {
84
+      listProjectWork({ pageNum: 1, pageSize: 100, projectId: this.projectId }).then(res => {
85
+        if (res.total != 0) {
86
+          this.workList = res.rows;
87
+        }
88
+      })
89
+    },
90
+    addWorkList() {
91
+      this.workList.push({
92
+        content: "",
93
+        scale: "",
94
+        unit: "",
95
+        workload: "",
96
+        deadline: undefined,
97
+        remark: "",
98
+      });
99
+    },
100
+    deletWorkItem(index) {
101
+      let arr = this.workList;
102
+      if (arr.length == 1) {
103
+        return;
104
+      }
105
+      if (index >= 0 && index < arr.length) {
106
+        arr.splice(index, 1);
107
+      }
108
+    },
109
+  },
110
+}
111
+</script>
112
+
113
+<style lang="scss" scoped>
114
+table {
115
+  /*居中*/
116
+  margin: 0 auto;
117
+  /*边框*/
118
+  /* border: 1px solid black; */
119
+  text-align: center;
120
+  border-collapse: collapse;
121
+  /*设置背景颜色*/
122
+  /* background-color: #bfa; */
123
+}
124
+.delete-btn {
125
+  color: #F56C6C;
126
+  cursor: pointer;
127
+
128
+  i {
129
+    font-size: 25px;
130
+  }
131
+}
132
+</style>

Loading…
取消
儲存