余思翰 il y a 9 mois
Parent
révision
b24660c386

+ 7
- 1
oa-ui/src/settings.js Voir le fichier

@@ -1,3 +1,9 @@
1
+/*
2
+ * @Author: ysh
3
+ * @Date: 2024-06-21 18:51:44
4
+ * @LastEditors: 
5
+ * @LastEditTime: 2024-08-29 14:53:06
6
+ */
1 7
 module.exports = {
2 8
   /**
3 9
    * 侧边栏主题 深色主题theme-dark,浅色主题theme-light
@@ -22,7 +28,7 @@ module.exports = {
22 28
   /**
23 29
    * 是否固定头部
24 30
    */
25
-  fixedHeader: false,
31
+  fixedHeader: true,
26 32
 
27 33
   /**
28 34
    * 是否显示logo

+ 6
- 0
oa-ui/src/store/modules/settings.js Voir le fichier

@@ -1,3 +1,9 @@
1
+/*
2
+ * @Author: ysh
3
+ * @Date: 2024-06-21 18:51:45
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-29 17:21:06
6
+ */
1 7
 import defaultSettings from '@/settings'
2 8
 
3 9
 const { sideTheme, showSettings, topNav, tagsView, fixedHeader, sidebarLogo, dynamicTitle } = defaultSettings

+ 157
- 0
oa-ui/src/views/flowable/form/business/components/paymentTable.vue Voir le fichier

@@ -0,0 +1,157 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-08-29 15:21:42
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-30 17:23:40
6
+-->
7
+<template>
8
+  <div style="width:100%">
9
+    <table border="1" style="width:100%">
10
+      <tr>
11
+        <td :colspan="8" style="background-color: #f8f8f9;line-height:40px"><strong>表2:合同回款计划</strong></td>
12
+      </tr>
13
+      <tr>
14
+        <td style="width: 50px;">序号</td>
15
+        <td style="min-width:350px">回款条件</td>
16
+        <td>回款比例(%)</td>
17
+        <td>回款金额(元)</td>
18
+        <td>预计时间</td>
19
+        <td>备注</td>
20
+      </tr>
21
+      <tr v-for="(payment, index) in paymentList" :key="index">
22
+        <td>
23
+          {{ index + 1 }}
24
+        </td>
25
+        <td>
26
+          <el-input v-model="payment.paymentCondition" type="textarea" clearable :autosize="{ minRows: 4 }"
27
+            :disabled="taskName != '合同拟稿'"></el-input>
28
+        </td>
29
+        <td>
30
+          <el-input-number style="width:100px" :controls="false" v-model="payment.paymentPercentage" clearable
31
+            :disabled="taskName != '合同拟稿'" @blur="calculatePaymentAmount(payment)"></el-input-number>
32
+        </td>
33
+        <td>
34
+          <el-input-number style="width:150px" :controls="false" :precision="2" v-model="payment.paymentAmount"
35
+            clearable :disabled="taskName != '合同拟稿'"></el-input-number>
36
+        </td>
37
+        <td>
38
+          <el-date-picker style="width: 140px" v-model="payment.paymentTime" value-format="yyyy-MM-dd" type="date"
39
+            placeholder="选择日期" :disabled="taskName != '合同拟稿'">
40
+          </el-date-picker>
41
+        </td>
42
+        <td>
43
+          <el-input v-model="payment.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
44
+            :disabled="taskName != '合同拟稿'"></el-input>
45
+        </td>
46
+        <td v-show="taskName == '合同拟稿'">
47
+          <div class="delete-btn" @click="deletPaymentItem(index)">
48
+            <i class="el-icon-circle-close"></i>
49
+          </div>
50
+        </td>
51
+      </tr>
52
+    </table>
53
+    <el-button icon="el-icon-plus" size="mini" @click="addPaymentList()" type="primary" plain
54
+      :disabled="taskName != '合同拟稿'"></el-button>
55
+  </div>
56
+</template>
57
+
58
+<script>
59
+import { listContractPayment, addContractPayment, delContractPayment } from "@/api/oa/contract/contractPayment";
60
+export default {
61
+  dicts: ['cmc_scale_grade', 'cmc_unit'],
62
+  props: {
63
+    contractId: {
64
+      type: String,
65
+      default: ''
66
+    },
67
+    taskName: {
68
+      type: String,
69
+      default: ''
70
+    },
71
+    amount: {
72
+      type: Number,
73
+      default: 0
74
+    }
75
+  },
76
+  data() {
77
+    return {
78
+      paymentList: [{
79
+        paymentCondition: "",
80
+        paymentPercentage: "",
81
+        paymentAmount: "",
82
+        paymentTime: undefined,
83
+        remark: "",
84
+      }],
85
+    }
86
+  },
87
+  watch: {
88
+    contractId() {
89
+      this.initTable()
90
+    },
91
+    amount() {
92
+      this.paymentList.forEach(payment => {
93
+        this.calculatePaymentAmount(payment)
94
+      })
95
+    }
96
+  },
97
+  created() {
98
+    this.initTable()
99
+  },
100
+  methods: {
101
+    initTable() {
102
+      if (!this.contractId) return
103
+      listContractPayment({ pageNum: 1, pageSize: 100, contractId: this.contractId }).then(res => {
104
+        if (res.rows.length > 0)
105
+          this.paymentList = res.rows;
106
+      });
107
+    },
108
+    deletPaymentItem(index) {
109
+      let arr = this.paymentList;
110
+      if (arr.length == 1) {
111
+        return;
112
+      }
113
+      if (index >= 0 && index < arr.length) {
114
+        arr.splice(index, 1);
115
+      }
116
+    },
117
+    addPaymentList() {
118
+      this.paymentList.push({
119
+        paymentCondition: "",
120
+        paymentPercentage: "",
121
+        paymentAmount: "",
122
+        paymentTime: undefined,
123
+        remark: "",
124
+      });
125
+    },
126
+    calculatePaymentAmount(payment) {
127
+      let amount = (payment.paymentPercentage / 100) * this.amount
128
+      this.$set(payment, 'paymentAmount', Number(amount))
129
+    },
130
+  },
131
+}
132
+</script>
133
+
134
+<style lang="scss" scoped>
135
+.delete-btn {
136
+  color: #F56C6C;
137
+  cursor: pointer;
138
+
139
+  i {
140
+    font-size: 25px;
141
+  }
142
+}
143
+
144
+table {
145
+  /*边框*/
146
+  /* border: 1px solid black; */
147
+  text-align: center;
148
+  border-collapse: collapse;
149
+  border: 1px solid #a5abb0;
150
+
151
+  /*设置背景颜色*/
152
+  /* background-color: #bfa; */
153
+  td {
154
+    padding: 5px;
155
+  }
156
+}
157
+</style>

+ 155
- 0
oa-ui/src/views/flowable/form/business/components/workTable.vue Voir le fichier

@@ -0,0 +1,155 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-08-29 15:21:42
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-29 16:01:51
6
+-->
7
+<template>
8
+  <div style="width:100%">
9
+    <table border="1" style="width:100%">
10
+      <tr>
11
+        <td :colspan="8" style="background-color: #f8f8f9;line-height:40px"><strong>表1:合同计划工作量</strong></td>
12
+      </tr>
13
+      <tr>
14
+        <td style="width: 50px;">序号</td>
15
+        <td style="min-width:250px">工作内容</td>
16
+        <td style="width:150px">等级或比例尺</td>
17
+        <td style="width:100px">单位</td>
18
+        <td style="width:100px">工作量</td>
19
+        <td>要求完成时间</td>
20
+        <td>备注</td>
21
+      </tr>
22
+      <tr v-for="(work, index) in workList" :key="index">
23
+        <td>
24
+          {{ index + 1 }}
25
+        </td>
26
+        <td>
27
+          <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4 }"
28
+            :disabled="taskName != '合同拟稿'"></el-input>
29
+        </td>
30
+        <td>
31
+          <el-select v-model="work.scale" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
32
+            <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
33
+              :value="dict.label" />
34
+          </el-select>
35
+        </td>
36
+        <td>
37
+          <el-select v-model="work.unit" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
38
+            <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label" :value="dict.label" />
39
+          </el-select>
40
+        </td>
41
+        <td>
42
+          <el-input-number :controls="false" style="width: 60px" v-model="work.workload" clearable
43
+            :disabled="taskName != '合同拟稿'"></el-input-number>
44
+        </td>
45
+        <td>
46
+          <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
47
+            placeholder="选择日期" :disabled="taskName != '合同拟稿'">
48
+          </el-date-picker>
49
+        </td>
50
+        <td>
51
+          <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
52
+            :disabled="taskName != '合同拟稿'"></el-input>
53
+        </td>
54
+        <td v-show="taskName == '合同拟稿'">
55
+          <div class="delete-btn" @click="deletWorkItem(index)">
56
+            <i class="el-icon-circle-close"></i>
57
+          </div>
58
+        </td>
59
+      </tr>
60
+    </table>
61
+    <el-button class="mb20" icon="el-icon-plus" size="mini" @click="addWorkList()" type="primary" plain
62
+      :disabled="taskName != '合同拟稿'">
63
+    </el-button>
64
+  </div>
65
+</template>
66
+
67
+<script>
68
+import { listContractWork, addContractWork, delContractWork } from "@/api/oa/contract/contractWork";
69
+export default {
70
+  dicts: ['cmc_scale_grade', 'cmc_unit'],
71
+  props: {
72
+    contractId: {
73
+      type: String,
74
+      default: ''
75
+    },
76
+    taskName: {
77
+      type: String,
78
+      default: ''
79
+    }
80
+  },
81
+  data() {
82
+    return {
83
+      workList: [{
84
+        content: "",
85
+        scale: "",
86
+        unit: "",
87
+        workload: "",
88
+        deadline: undefined,
89
+        remark: "",
90
+      }],
91
+    }
92
+  },
93
+  watch: {
94
+    contractId() {
95
+      this.initTable()
96
+    }
97
+  },
98
+  created() {
99
+    this.initTable()
100
+  },
101
+  methods: {
102
+    initTable() {
103
+      if(!this.contractId) return
104
+      listContractWork({ pageNum: 1, pageSize: 100, contractId: this.contractId }).then(res => {
105
+        if (res.rows.length > 0)
106
+          this.workList = res.rows;
107
+      });
108
+    },
109
+    deletWorkItem(index) {
110
+      let arr = this.workList;
111
+      if (arr.length == 1) {
112
+        return;
113
+      }
114
+      if (index >= 0 && index < arr.length) {
115
+        arr.splice(index, 1);
116
+      }
117
+    },
118
+    addWorkList() {
119
+      this.workList.push({
120
+        content: "",
121
+        scale: "",
122
+        unit: "",
123
+        workload: "",
124
+        deadline: undefined,
125
+        remark: "",
126
+      });
127
+    },
128
+  },
129
+}
130
+</script>
131
+
132
+<style lang="scss" scoped>
133
+.delete-btn {
134
+  color: #F56C6C;
135
+  cursor: pointer;
136
+
137
+  i {
138
+    font-size: 25px;
139
+  }
140
+}
141
+
142
+table {
143
+  /*边框*/
144
+  /* border: 1px solid black; */
145
+  text-align: center;
146
+  border-collapse: collapse;
147
+  border: 1px solid #a5abb0;
148
+
149
+  /*设置背景颜色*/
150
+  /* background-color: #bfa; */
151
+  td {
152
+    padding: 5px;
153
+  }
154
+}
155
+</style>

+ 64
- 171
oa-ui/src/views/flowable/form/business/contractForm.vue Voir le fichier

@@ -1,8 +1,8 @@
1 1
 <!--
2 2
  * @Author: ysh
3 3
  * @Date: 2024-05-10 15:31:57
4
- * @LastEditors: wrh
5
- * @LastEditTime: 2024-08-13 13:57:33
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-30 14:37:25
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
@@ -63,16 +63,22 @@
63 63
             </el-col>
64 64
 
65 65
             <el-col :span="12" :xs="24">
66
-              <el-alert title="后签合同的项目,必须选择关联项目;先签合同的项目不选关联项目" type="error">
66
+              <el-alert v-show="taskName == '合同拟稿'" title="后签合同的项目,必须选择关联项目;先签合同的项目不选关联项目" type="error">
67 67
               </el-alert>
68 68
               <el-form-item label="关联项目:" prop="projectIds">
69 69
                 <el-button type="primary" size="mini" @click="open = true" v-if="taskName == '合同拟稿'">选择项目</el-button>
70 70
               </el-form-item>
71 71
               <el-table v-loading="projectloading" :data="chooseProjectList">
72
+                <el-table-column label="序号" type="index" width="50px"></el-table-column>
72 73
                 <el-table-column label="项目编号" align="center" prop="projectNumber"></el-table-column>
73 74
                 <el-table-column label="项目名称" align="center" prop="projectName"></el-table-column>
74 75
                 <el-table-column label="项目负责人" align="center" prop="projectLeaderUser.nickName"></el-table-column>
75 76
                 <el-table-column label="承担部门" align="center" prop="undertakingDeptName"></el-table-column>
77
+                <el-table-column label="操作" align="center">
78
+                  <template slot-scope="scope">
79
+                    <el-button type="text" icon="el-icon-view" @click="clickProjectFn(scope.row)">查看</el-button>
80
+                  </template>
81
+                </el-table-column>
76 82
               </el-table>
77 83
             </el-col>
78 84
 
@@ -92,103 +98,15 @@
92 98
               </el-link>
93 99
             </div>
94 100
           </el-form-item>
95
-          <el-form-item label="合同计划工作量:">
96
-            <table border="1" style="width:100%">
97
-              <tr>
98
-                <td style="width: 50px;">序号</td>
99
-                <td style="min-width:160px">工作内容</td>
100
-                <td style="width:150px">等级或比例尺</td>
101
-                <td style="width:100px">单位</td>
102
-                <td style="width:100px">工作量</td>
103
-                <td>要求完成时间</td>
104
-                <td>备注</td>
105
-              </tr>
106
-              <tr v-for="(work, index) in workList" :key="index">
107
-                <td>
108
-                  {{ index + 1 }}
109
-                </td>
110
-                <td>
111
-                  <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4 }"
112
-                    :disabled="taskName != '合同拟稿'"></el-input>
113
-                </td>
114
-                <td>
115
-                  <el-select v-model="work.scale" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
116
-                    <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
117
-                      :value="dict.label" />
118
-                  </el-select>
119
-                </td>
120
-                <td>
121
-                  <el-select v-model="work.unit" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
122
-                    <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label"
123
-                      :value="dict.label" />
124
-                  </el-select>
125
-                </td>
126
-                <td>
127
-                  <el-input-number :controls="false" style="width: 60px" v-model="work.workload" clearable
128
-                    :disabled="taskName != '合同拟稿'"></el-input-number>
129
-                </td>
130
-                <td>
131
-                  <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
132
-                    placeholder="选择日期" :disabled="taskName != '合同拟稿'">
133
-                  </el-date-picker>
134
-                </td>
135
-                <td>
136
-                  <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
137
-                    :disabled="taskName != '合同拟稿'"></el-input>
138
-                </td>
139
-                <td>
140
-                  <el-button type="text" style="color:#F56C6C" size="mini" circle @click="deletWorkItem(index)"
141
-                    :disabled="taskName != '合同拟稿'">删除行</el-button>
142
-                </td>
143
-              </tr>
144
-            </table>
145
-            <el-button icon="el-icon-plus" size="mini" @click="addWorkList()" type="primary" plain
146
-              :disabled="taskName != '合同拟稿'"></el-button>
147
-          </el-form-item>
148
-          <el-form-item label="合同回款计划:">
149
-            <table border="1" style="width:100%">
150
-              <tr>
151
-                <td style="width: 50px;">序号</td>
152
-                <td style="width: 250px;">回款条件</td>
153
-                <td>回款比例(%)</td>
154
-                <td>回款金额(元)</td>
155
-                <td>预计时间</td>
156
-                <td>备注</td>
157
-              </tr>
158
-              <tr v-for="(payment, index) in paymentList" :key="index">
159
-                <td>
160
-                  {{ index + 1 }}
161
-                </td>
162
-                <td>
163
-                  <el-input v-model="payment.paymentCondition" type="textarea" clearable :autosize="{ minRows: 4 }"
164
-                    :disabled="taskName != '合同拟稿'"></el-input>
165
-                </td>
166
-                <td>
167
-                  <el-input-number style="width:100px" :controls="false" v-model="payment.paymentPercentage" clearable
168
-                    :disabled="taskName != '合同拟稿'" @change="calculatePaymentAmount(payment)"></el-input-number>
169
-                </td>
170
-                <td>
171
-                  <el-input-number style="width:150px" :controls="false" :precision="2" v-model="payment.paymentAmount"
172
-                    clearable :disabled="taskName != '合同拟稿'"></el-input-number>
173
-                </td>
174
-                <td>
175
-                  <el-date-picker style="width: 140px" v-model="payment.paymentTime" value-format="yyyy-MM-dd"
176
-                    type="date" placeholder="选择日期" :disabled="taskName != '合同拟稿'">
177
-                  </el-date-picker>
178
-                </td>
179
-                <td>
180
-                  <el-input v-model="payment.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
181
-                    :disabled="taskName != '合同拟稿'"></el-input>
182
-                </td>
183
-                <td>
184
-                  <el-button type="danger" icon="el-icon-minus" size="mini" circle @click="deletPaymentItem(index)"
185
-                    :disabled="taskName != '合同拟稿'"></el-button>
186
-                </td>
187
-              </tr>
188
-            </table>
189
-            <el-button icon="el-icon-plus" size="mini" @click="addPaymentList()" type="primary" plain
190
-              :disabled="taskName != '合同拟稿'"></el-button>
191
-          </el-form-item>
101
+          <!-- 表1:合同计划工作量 -->
102
+          <work-table ref="workTableRef" :contractId="taskForm.formId" :taskName="taskName"></work-table>
103
+
104
+          <p class="mb20 mt20"></p>
105
+
106
+          <!-- 表2:合同回款计划  -->
107
+          <payment-table ref="paymentRef" :contractId="taskForm.formId" :amount="form.amount"
108
+            :taskName="taskName"></payment-table>
109
+
192 110
           <el-form-item label="合同备注" prop="remark">
193 111
             <el-input v-model="form.remark" :autosize="{ minRows: 4 }" type="textarea" placeholder="请输入合同备注"
194 112
               :disabled="taskName != '合同拟稿'" />
@@ -281,9 +199,10 @@
281 199
                     :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)" type="date"
282 200
                     value-format="yyyy-MM-dd" style="width:140px;" placeholder="选择日期"></el-date-picker>
283 201
                 </td>
284
-                <td>
285
-                  <el-button type="text" style="color: #F56C6C;" size="mini" @click="deletCommentItem(index)"
286
-                    :disabled="taskName != '合同拟稿'">删除行</el-button>
202
+                <td v-show="taskName == '合同拟稿'">
203
+                  <div class="delete-btn" @click="deletCommentItem(index)">
204
+                    <i class="el-icon-circle-close"></i>
205
+                  </div>
287 206
                 </td>
288 207
               </tr>
289 208
             </table>
@@ -436,15 +355,18 @@
436 355
       </el-col>
437 356
     </el-row>
438 357
 
439
-    <el-dialog title="选择项目" :visible.sync="open" width="70%" append-to-body>
358
+    <el-dialog title="选择项目" :visible.sync="open" width="60%" append-to-body>
440 359
       <choose-project @chooseProject="confirmProject"></choose-project>
441 360
     </el-dialog>
442
-    <el-dialog title="选择投标项目" :visible.sync="tbOpen" width="70%" append-to-body>
361
+    <el-dialog title="选择投标项目" :visible.sync="tbOpen" width="60%" append-to-body>
443 362
       <choose-tender @choose="confirmTender"></choose-tender>
444 363
     </el-dialog>
445
-    <el-dialog title="选择甲方单位" :visible.sync="partyAOpen" width="70%" append-to-body>
364
+    <el-dialog title="选择甲方单位" :visible.sync="partyAOpen" width="60%" append-to-body>
446 365
       <choose-party-a @confirm="confirmPartyA"></choose-party-a>
447 366
     </el-dialog>
367
+    <el-drawer :visible.sync="drawerOpen" title="" :size="'70%'" append-to-body>
368
+      <projectInfo :needReturn="false"></projectInfo>
369
+    </el-drawer>
448 370
   </div>
449 371
 </template>
450 372
 
@@ -470,6 +392,9 @@ import { listPartyA } from "@/api/oa/partyA/partyA";
470 392
 import FileItem from './fileItem.vue';
471 393
 import { mapGetters } from "vuex";
472 394
 import ChoosePartyA from '@/views/flowable/form/components/choosePartyA.vue';
395
+import workTable from './components/workTable.vue';
396
+import paymentTable from './components/paymentTable.vue';
397
+import projectInfo from '@/views/oa/project/info'
473 398
 export default {
474 399
   dicts: ['cmc_scale_grade', 'cmc_unit'],
475 400
   components: {
@@ -477,7 +402,9 @@ export default {
477 402
     ChooseProject,
478 403
     ChooseTender,
479 404
     FileItem,
480
-    ChoosePartyA
405
+    ChoosePartyA,
406
+    workTable,
407
+    paymentTable,projectInfo
481 408
   },
482 409
   props: {
483 410
     taskName: {
@@ -548,27 +475,15 @@ export default {
548 475
       rules: {},
549 476
       meetingOpen: false,
550 477
       commentOpen: false,
478
+      drawerOpen: false,
551 479
       chooseProjectList: [],
552 480
       partyAList: [],
553 481
       projectList: [],
554 482
       deptList: [],
555 483
       userList: [],
556 484
       users: undefined,
557
-      workList: [{
558
-        content: "",
559
-        scale: "",
560
-        unit: "",
561
-        workload: "",
562
-        deadline: undefined,
563
-        remark: "",
564
-      }],
565
-      paymentList: [{
566
-        paymentCondition: "",
567
-        paymentPercentage: "",
568
-        paymentAmount: "",
569
-        paymentTime: undefined,
570
-        remark: "",
571
-      }],
485
+      workList: [],
486
+      paymentList: [],
572 487
       placeList: [{ id: '0', name: '301会议室' }, { id: '1', name: '216会议室' }],
573 488
       commentList: [
574 489
         {
@@ -688,14 +603,6 @@ export default {
688 603
               this.isSelect = true
689 604
             })
690 605
           }
691
-          listContractWork({ pageNum: 1, pageSize: 100, contractId: this.taskForm.formId }).then(res => {
692
-            if (res.rows)
693
-              this.workList = res.rows;
694
-          });
695
-          listContractPayment({ pageNum: 1, pageSize: 100, contractId: this.taskForm.formId }).then(res => {
696
-            if (res.rows)
697
-              this.paymentList = res.rows;
698
-          });
699 606
           listContractComment({ pageNum: 1, pageSize: 100, contractId: this.taskForm.formId }).then(res => {
700 607
             if (res.rows && res.rows.length != 0) {
701 608
               this.commentList = res.rows;
@@ -838,25 +745,6 @@ export default {
838 745
       }
839 746
       return chooseTender.partyA.partyAName.includes(TARGET_COMPANY) ? '院内' : '院外';
840 747
     },
841
-    addWorkList() {
842
-      this.workList.push({
843
-        content: "",
844
-        scale: "",
845
-        unit: "",
846
-        workload: "",
847
-        deadline: undefined,
848
-        remark: "",
849
-      });
850
-    },
851
-    addPaymentList() {
852
-      this.paymentList.push({
853
-        paymentCondition: "",
854
-        paymentPercentage: "",
855
-        paymentAmount: "",
856
-        paymentTime: undefined,
857
-        remark: "",
858
-      });
859
-    },
860 748
     addCommentList() {
861 749
       this.commentList.push({
862 750
         deptId: "",
@@ -866,24 +754,6 @@ export default {
866 754
         commentTime: undefined,
867 755
       });
868 756
     },
869
-    deletWorkItem(index) {
870
-      let arr = this.workList;
871
-      if (arr.length == 1) {
872
-        return;
873
-      }
874
-      if (index >= 0 && index < arr.length) {
875
-        arr.splice(index, 1);
876
-      }
877
-    },
878
-    deletPaymentItem(index) {
879
-      let arr = this.paymentList;
880
-      if (arr.length == 1) {
881
-        return;
882
-      }
883
-      if (index >= 0 && index < arr.length) {
884
-        arr.splice(index, 1);
885
-      }
886
-    },
887 757
     setCommentDocument(val) {
888 758
       let arr = val.split('/upload');
889 759
       this.clickTd.document = arr[1];
@@ -1104,6 +974,8 @@ export default {
1104 974
       });
1105 975
     },
1106 976
     updateContractData() {
977
+      this.workList = this.$refs.workTableRef.workList;
978
+      this.paymentList = this.$refs.paymentRef.paymentList;
1107 979
       updateContract(this.form).then(response => {
1108 980
         this.$modal.msgSuccess("修改成功");
1109 981
         this.open = false;
@@ -1222,10 +1094,6 @@ export default {
1222 1094
         this.$set(this.form, 'partyAId', val[0].partyAId)
1223 1095
       }
1224 1096
     },
1225
-    calculatePaymentAmount(payment) {
1226
-      let amount = (payment.paymentPercentage / 100) * this.form.amount
1227
-      this.$set(payment, 'paymentAmount', Number(amount))
1228
-    },
1229 1097
     reviewWord(url) {
1230 1098
       this.$router.push({
1231 1099
         path: '/preview',
@@ -1233,6 +1101,10 @@ export default {
1233 1101
           url: url
1234 1102
         }
1235 1103
       })
1104
+    },
1105
+    clickProjectFn(row) {
1106
+      this.$router.replace({ query: { ...this.$route.query, projectId: row.projectId } });
1107
+      this.drawerOpen = true;
1236 1108
     }
1237 1109
   }
1238 1110
 }
@@ -1241,11 +1113,21 @@ export default {
1241 1113
 <style lang="scss" scoped>
1242 1114
 @import "@/assets/styles/element-reset.scss";
1243 1115
 
1116
+.delete-btn {
1117
+  color: #F56C6C;
1118
+  cursor: pointer;
1119
+
1120
+  i {
1121
+    font-size: 25px;
1122
+  }
1123
+}
1124
+
1244 1125
 table {
1245 1126
   /*边框*/
1246 1127
   /* border: 1px solid black; */
1247 1128
   text-align: center;
1248 1129
   border-collapse: collapse;
1130
+  border: 1px solid #a5abb0;
1249 1131
 
1250 1132
   /*设置背景颜色*/
1251 1133
   /* background-color: #bfa; */
@@ -1275,4 +1157,15 @@ table {
1275 1157
 .ele-upload-list__item-content-action .el-link {
1276 1158
   margin-right: 10px;
1277 1159
 }
1160
+
1161
+::v-deep .el-descriptions-item__label.is-bordered-label {
1162
+  color: #5a5757;
1163
+  background: rgba($color: #a9adb3, $alpha: 0.1);
1164
+  width: 150px;
1165
+  min-width: 150px;
1166
+}
1167
+
1168
+::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell {
1169
+  border: 1px solid #cdd0d3;
1170
+}
1278 1171
 </style>

+ 127
- 108
oa-ui/src/views/flowable/form/business/subContract.vue Voir le fichier

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-05-10 15:31:57
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-07 09:41:32
5
+ * @LastEditTime: 2024-08-28 15:51:59
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
@@ -11,7 +11,7 @@
11 11
         <h2 class="text-center">分包合同评审表</h2>
12 12
         <el-form ref="form" :model="form" :rules="rules" label-width="130px" :formDisabled="formDisabled">
13 13
           <el-divider></el-divider>
14
-          <el-form-item label="项目编号:" prop="projectId">
14
+          <el-form-item label="关联项目:" prop="projectId">
15 15
             <el-button type="primary" size="mini" @click="open = true" v-if="taskName == '合同拟稿'">选择项目</el-button>
16 16
             <el-table :data="chooseProjectList" border v-if="isSelect">
17 17
               <el-table-column type="index" width="50" label="序号" />
@@ -43,7 +43,7 @@
43 43
             <el-col :span="16" :xs="24">
44 44
               <el-form-item label="承接单位" prop="partnerId">
45 45
                 <el-select allow-create v-model="form.partnerId" multiple filterable placeholder="请选择"
46
-                  style="width: 84%;" disabled clearable>
46
+                  :style="taskName == '合同拟稿' ? {width: '84%' }: {width: '100%' }" disabled clearable>
47 47
                   <el-option v-for="item in partnerList" :key="item.value" :label="item.partnerName"
48 48
                     :value="item.partnerId">
49 49
                   </el-option>
@@ -83,104 +83,112 @@
83 83
               </el-form-item>
84 84
             </el-col>
85 85
           </el-row>
86
-          <el-form-item label="合同计划工作量:">
87
-            <table border="1">
88
-              <tr>
89
-                <td style="width:50px;">序号</td>
90
-                <td>工作内容</td>
91
-                <td>等级或比例尺</td>
92
-                <td>单位</td>
93
-                <td>工作量</td>
94
-                <td>要求完成时间</td>
95
-                <td>备注</td>
96
-              </tr>
97
-              <tr v-for="(work, index) in workList" :key="index">
98
-                <td>
99
-                  {{ index + 1 }}
100
-                </td>
101
-                <td>
102
-                  <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
103
-                    :disabled="taskName != '合同拟稿'"></el-input>
104
-                </td>
105
-                <td>
106
-                  <el-select v-model="work.scale" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
107
-                    <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
108
-                      :value="dict.label" />
109
-                  </el-select>
110
-                </td>
111
-                <td>
112
-                  <el-select v-model="work.unit" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
113
-                    <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label"
114
-                      :value="dict.label" />
115
-                  </el-select>
116
-                </td>
117
-                <td>
118
-                  <el-input v-model="work.workload" clearable :disabled="taskName != '合同拟稿'"></el-input>
119
-                </td>
120
-                <td>
121
-                  <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
122
-                    placeholder="选择日期" :disabled="taskName != '合同拟稿'">
123
-                  </el-date-picker>
124
-                </td>
125
-                <td>
126
-                  <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
127
-                    :disabled="taskName != '合同拟稿'"></el-input>
128
-                </td>
129
-                <td>
130
-                  <el-button type="text" style="color:#F56C6C" size="mini" circle @click="deletWorkItem(index)"
131
-                    :disabled="taskName != '合同拟稿'">删除行</el-button>
132
-                </td>
133
-              </tr>
134
-            </table>
135
-            <el-button icon="el-icon-plus" size="mini" @click="addWorkList()" type="primary" plain
136
-              :disabled="taskName != '合同拟稿'"></el-button>
137
-          </el-form-item>
138
-          <el-form-item label="合同付款计划:">
139
-            <table border="1">
140
-              <tr>
141
-                <td style="min-width:50px;">序号</td>
142
-                <td style="min-width:200px;">付款条件</td>
143
-                <td style="max-width:100px;">付款比例(%)</td>
144
-                <td style="max-width:100px;">付款金额(元)</td>
145
-                <td>预计时间</td>
146
-                <td>备注</td>
147
-              </tr>
148
-              <tr v-for="(payment, index) in paymentList" :key="index">
149
-                <td>
150
-                  {{ index + 1 }}
151
-                </td>
152
-                <td>
153
-                  <el-input v-model="payment.paymentCondition" type="textarea" clearable
154
-                    :autosize="{ minRows: 4, maxRows: 10 }" :disabled="taskName != '合同拟稿'"></el-input>
155
-                </td>
156
-                <td>
157
-                  <el-input-number :controls="false" style="width:100%" v-model="payment.paymentPercentage" clearable
158
-                    @change="calculatePaymentAmount(payment)" :disabled="taskName != '合同拟稿'"></el-input-number>
159
-                </td>
160
-                <td>
161
-                  <el-input-number :controls="false" style="width:100%" v-model="payment.paymentAmount" clearable
162
-                    :disabled="taskName != '合同拟稿'"></el-input-number>
163
-                </td>
164
-                <td>
165
-                  <el-date-picker style="width: 140px" v-model="payment.paymentTime" value-format="yyyy-MM-dd"
166
-                    type="date" placeholder="选择日期" :disabled="taskName != '合同拟稿'">
167
-                  </el-date-picker>
168
-                </td>
169
-                <td>
170
-                  <el-input v-model="payment.remark" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
171
-                    :disabled="taskName != '合同拟稿'"></el-input>
172
-                </td>
173
-                <td>
174
-                  <el-button type="text" style="color:#F56C6C" size="mini" @click="deletPaymentItem(index)"
175
-                    :disabled="taskName != '合同拟稿'">删除行</el-button>
176
-                </td>
177
-              </tr>
178
-            </table>
179
-            <el-button icon="el-icon-plus" size="mini" @click="addPaymentList()" type="primary" plain
180
-              :disabled="taskName != '合同拟稿'"></el-button>
181
-          </el-form-item>
86
+          <table border="1" style="width:100%">
87
+            <tr>
88
+              <td :colspan="8" style="background-color: #f8f8f9;line-height:40px"><strong>表1:合同计划工作量</strong></td>
89
+            </tr>
90
+            <tr>
91
+              <td style="width: 50px;">序号</td>
92
+              <td style="min-width:250px">工作内容</td>
93
+              <td style="width:150px">等级或比例尺</td>
94
+              <td style="width:100px">单位</td>
95
+              <td style="width:100px">工作量</td>
96
+              <td>要求完成时间</td>
97
+              <td>备注</td>
98
+            </tr>
99
+            <tr v-for="(work, index) in workList" :key="index">
100
+              <td>
101
+                {{ index + 1 }}
102
+              </td>
103
+              <td>
104
+                <el-input v-model="work.content" type="textarea" clearable :autosize="{ minRows: 4 }"
105
+                  :disabled="taskName != '合同拟稿'"></el-input>
106
+              </td>
107
+              <td>
108
+                <el-select v-model="work.scale" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
109
+                  <el-option v-for="dict in dict.type.cmc_scale_grade" :key="dict.value" :label="dict.label"
110
+                    :value="dict.label" />
111
+                </el-select>
112
+              </td>
113
+              <td>
114
+                <el-select v-model="work.unit" placeholder="请选择" clearable :disabled="taskName != '合同拟稿'">
115
+                  <el-option v-for="dict in dict.type.cmc_unit" :key="dict.value" :label="dict.label"
116
+                    :value="dict.label" />
117
+                </el-select>
118
+              </td>
119
+              <td>
120
+                <el-input v-model="work.workload" clearable :disabled="taskName != '合同拟稿'"></el-input>
121
+              </td>
122
+              <td>
123
+                <el-date-picker style="width: 140px" v-model="work.deadline" value-format="yyyy-MM-dd" type="date"
124
+                  placeholder="选择日期" :disabled="taskName != '合同拟稿'">
125
+                </el-date-picker>
126
+              </td>
127
+              <td>
128
+                <el-input v-model="work.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
129
+                  :disabled="taskName != '合同拟稿'"></el-input>
130
+              </td>
131
+              <td v-show="taskName == '合同拟稿'">
132
+                <div class="delete-btn" @click="deletWorkItem(index)">
133
+                  <i class="el-icon-circle-close"></i>
134
+                </div>
135
+              </td>
136
+            </tr>
137
+          </table>
138
+          <el-button icon="el-icon-plus" size="mini" @click="addWorkList()" type="primary" plain
139
+            :disabled="taskName != '合同拟稿'"></el-button>
140
+
141
+          <p class="mb20 mt20"></p>
142
+
143
+          <!-- 表2:合同回款计划  -->
144
+          <table border="1" style="width:100%">
145
+            <tr>
146
+              <td :colspan="8" style="background-color: #f8f8f9;line-height:40px"><strong>表2:合同回款计划</strong></td>
147
+            </tr>
148
+            <tr>
149
+              <td style="width: 50px;">序号</td>
150
+              <td style="min-width:350px">回款条件</td>
151
+              <td>回款比例(%)</td>
152
+              <td>回款金额(元)</td>
153
+              <td>预计时间</td>
154
+              <td>备注</td>
155
+            </tr>
156
+            <tr v-for="(payment, index) in paymentList" :key="index">
157
+              <td>
158
+                {{ index + 1 }}
159
+              </td>
160
+              <td>
161
+                <el-input v-model="payment.paymentCondition" type="textarea" clearable
162
+                  :autosize="{ minRows: 4 }" :disabled="taskName != '合同拟稿'"></el-input>
163
+              </td>
164
+              <td>
165
+                <el-input-number :controls="false" style="width:100%" v-model="payment.paymentPercentage" clearable
166
+                  @change="calculatePaymentAmount(payment)" :disabled="taskName != '合同拟稿'"></el-input-number>
167
+              </td>
168
+              <td>
169
+                <el-input-number :controls="false" style="width:100%" v-model="payment.paymentAmount" clearable
170
+                  :disabled="taskName != '合同拟稿'"></el-input-number>
171
+              </td>
172
+              <td>
173
+                <el-date-picker style="width: 140px" v-model="payment.paymentTime" value-format="yyyy-MM-dd" type="date"
174
+                  placeholder="选择日期" :disabled="taskName != '合同拟稿'">
175
+                </el-date-picker>
176
+              </td>
177
+              <td>
178
+                <el-input v-model="payment.remark" type="textarea" clearable :autosize="{ minRows: 4 }"
179
+                  :disabled="taskName != '合同拟稿'"></el-input>
180
+              </td>
181
+              <td v-show="taskName == '合同拟稿'">
182
+                <div class="delete-btn" @click="deletPaymentItem(index)">
183
+                  <i class="el-icon-circle-close"></i>
184
+                </div>
185
+              </td>
186
+            </tr>
187
+          </table>
188
+          <el-button icon="el-icon-plus" size="mini" @click="addPaymentList()" type="primary" plain
189
+            :disabled="taskName != '合同拟稿'"></el-button>
182 190
           <el-form-item label="合同备注" prop="remark">
183
-            <el-input type="textarea" v-model="form.remark" placeholder="请输入合同备注" :disabled="taskName != '合同拟稿'" />
191
+            <el-input type="textarea" v-model="form.remark" :autosize="{ minRows: 4 }" placeholder="请输入合同备注" :disabled="taskName != '合同拟稿'" />
184 192
           </el-form-item>
185 193
           <el-row>
186 194
             <el-col :span="6" :xs="24" :offset="11">
@@ -204,7 +212,7 @@
204 212
             </el-radio-group>
205 213
           </el-form-item>
206 214
           <el-form-item label="线上会审:" v-if="commentOpen">
207
-            <table border="1">
215
+            <table border="1" style="width:100%;">
208 216
               <tr>
209 217
                 <td style="width: 50px;">序号</td>
210 218
                 <td>会审部门</td>
@@ -233,7 +241,7 @@
233 241
                   </el-select>
234 242
                 </td>
235 243
                 <td>
236
-                  <el-input v-model="comment.comment" type="textarea" clearable :autosize="{ minRows: 4, maxRows: 10 }"
244
+                  <el-input v-model="comment.comment" type="textarea" clearable :autosize="{ minRows: 4 }"
237 245
                     :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)"></el-input>
238 246
                 </td>
239 247
                 <!-- 线上会审附件 -->
@@ -253,7 +261,8 @@
253 261
                             {{ getFileName(comment.document) }}
254 262
                           </span>
255 263
                         </el-link>
256
-                        <div class="ele-upload-list__item-content-action" v-if="taskName == '线上会审' && comment.userId == userId">
264
+                        <div class="ele-upload-list__item-content-action"
265
+                          v-if="taskName == '线上会审' && comment.userId == userId">
257 266
                           <el-link :underline="false" @click="handleFileDelete(comment, 'document')"
258 267
                             type="danger">删除</el-link>
259 268
                         </div>
@@ -269,9 +278,10 @@
269 278
                     :disabled="taskName != '线上会审' || (taskName == '线上会审' && comment.userId != userId)" type="date"
270 279
                     value-format="yyyy-MM-dd" style="width:140px;" placeholder="选择日期"></el-date-picker>
271 280
                 </td>
272
-                <td>
273
-                  <el-button type="text" style="color:#F56C6C" size="mini" circle @click="deletCommentItem(index)"
274
-                    :disabled="taskName != '合同拟稿'">删除行</el-button>
281
+                <td v-show="taskName == '合同拟稿'">
282
+                  <div class="delete-btn" @click="deletCommentItem(index)">
283
+                    <i class="el-icon-circle-close"></i>
284
+                  </div>
275 285
                 </td>
276 286
               </tr>
277 287
             </table>
@@ -345,7 +355,7 @@
345 355
             </table>
346 356
           </el-form-item>
347 357
           <el-form-item label="分管审批意见" prop="remark">
348
-            <el-input v-model="form.managerComment" type="textarea" placeholder="请输入分管审批意见"
358
+            <el-input v-model="form.managerComment" type="textarea" :autosize="{ minRows: 4 }" placeholder="请输入分管审批意见"
349 359
               :disabled="taskName != '分管审核'" />
350 360
           </el-form-item>
351 361
           <el-row>
@@ -1050,7 +1060,7 @@ export default {
1050 1060
             })
1051 1061
 
1052 1062
           }
1053
-        }else{
1063
+        } else {
1054 1064
           this.$message.error('必填项未填写完毕')
1055 1065
         }
1056 1066
       });
@@ -1259,6 +1269,15 @@ export default {
1259 1269
 <style lang="scss" scoped>
1260 1270
 @import "@/assets/styles/element-reset.scss";
1261 1271
 
1272
+.delete-btn {
1273
+  color: #F56C6C;
1274
+  cursor: pointer;
1275
+
1276
+  i {
1277
+    font-size: 25px;
1278
+  }
1279
+}
1280
+
1262 1281
 table {
1263 1282
   /*边框*/
1264 1283
   /* border: 1px solid black; */

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

@@ -2,14 +2,15 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-06-18 17:38:50
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-20 16:33:37
5
+ * @LastEditTime: 2024-08-30 11:25:29
6 6
 -->
7 7
 <template>
8 8
   <div>
9 9
     <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
10 10
       <el-form-item label="单位名称" prop="partyAName">
11
-        <el-input v-model="queryParams.partyAName" placeholder="请输入单位名称" clearable @keyup.enter.native="handleQuery" />
11
+        <el-input v-model="queryParams.partyAName" placeholder="请输入单位名称" clearable @keyup.enter.native="handleQuery()"/>
12 12
       </el-form-item>
13
+      <el-form-item style="margin-bottom:0;display:none;"> <el-input></el-input> </el-form-item>
13 14
       <el-form-item>
14 15
         <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
15 16
       </el-form-item>
@@ -129,7 +130,7 @@ export default {
129 130
       this.loading = true;
130 131
       if (this.projectSource == '0') {
131 132
         this.queryParams.partyAName = '中国电建集团成都勘测设计研究院有限公司'
132
-      } else {
133
+      } else if (this.projectSource == '1') {
133 134
         this.queryParams.partyAName = null
134 135
       }
135 136
       listPartyA(this.queryParams).then(response => {

+ 11
- 6
oa-ui/src/views/flowable/form/finance/borrowForm.vue Voir le fichier

@@ -118,8 +118,7 @@
118 118
           <el-row :gutter="20">
119 119
             <el-col :span="8" :xs="24">
120 120
               <el-form-item label="申请金额" prop="applyAmount">
121
-                <el-input v-model="form.applyAmount" placeholder="请输入申请金额" :disabled="taskName != '借款申请'"
122
-                  @blur="VerificationAmount" />
121
+                <el-input v-model="form.applyAmount" placeholder="请输入申请金额" :disabled="taskName != '借款申请'" />
123 122
                 <span style="color:#E74C3C" v-if="exceed && form.borrowUsage == 0">超过预算金额:{{ getMoreAmount('0')
124 123
                   }}</span>
125 124
               </el-form-item>
@@ -490,7 +489,7 @@ export default {
490 489
       }
491 490
     },
492 491
     initForm() {
493
-      listBorrowDetail({ pageSize:999, borrowId: this.taskForm.formId }).then(res => {
492
+      listBorrowDetail({ pageSize: 999, borrowId: this.taskForm.formId }).then(res => {
494 493
         if (res.rows.length != 0) {
495 494
           this.detailList = res.rows
496 495
         }
@@ -599,7 +598,10 @@ export default {
599 598
       });
600 599
     },
601 600
     /** 提交按钮 */
602
-    submitForm() {
601
+    async submitForm() {
602
+      if (this.taskName == '借款申请') {
603
+        await this.VerificationAmount();
604
+      }
603 605
       this.$refs["form"].validate(valid => {
604 606
         if (valid) {
605 607
           if (this.form.borrowUsage == '0' && !this.form.projectId) {
@@ -678,6 +680,7 @@ export default {
678 680
           }
679 681
         }
680 682
       });
683
+
681 684
     },
682 685
     handleComplete(taskForm) {
683 686
       complete(taskForm).then(response => {
@@ -782,7 +785,6 @@ export default {
782 785
         sum = sum + Number(user[name1]);
783 786
       }
784 787
       this.form[name2] = sum.toFixed(2);
785
-      this.VerificationAmount();
786 788
     },
787 789
     getBorrowPath(val) {
788 790
       let arr = val.split('/upload')
@@ -822,17 +824,20 @@ export default {
822 824
     VerificationAmount() {
823 825
       if (this.isSelect) {
824 826
         if (this.form.applyAmount > (this.totalBudget - this.hasBorrow)) {
825
-          this.$confirm('借款总额已经超过项目预算,将走《超预算或预算外支付(报销)》流程', '提示', {
827
+          return this.$confirm('借款总额已经超过项目预算,将走《超预算或预算外支付(报销)》流程', '提示', {
826 828
             confirmButtonText: '确定',
827 829
             type: 'warning'
828 830
           }).then(() => {
829 831
             this.exceed = true;
830 832
             this.$set(this.taskForm.variables, "exceed", true);
833
+            return '1'
834
+          }).catch(() => {
831 835
             return
832 836
           })
833 837
         } else {
834 838
           this.exceed = false;
835 839
           this.$set(this.taskForm.variables, "exceed", false);
840
+          return
836 841
         }
837 842
       }
838 843
     },

+ 46
- 31
oa-ui/src/views/flowable/form/projectProcess/addproject.vue Voir le fichier

@@ -2,13 +2,19 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-03-18 11:00:04
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-20 16:34:35
5
+ * @LastEditTime: 2024-08-29 14:31:38
6 6
 -->
7 7
 <template>
8 8
   <div class="project-wrapper">
9 9
     <!-- 项目登记 -->
10 10
     <h2 style="text-align: center" id="scrollToMe">项目登记</h2>
11 11
     <el-form ref="projectAdd" :model="addForm" :rules="rules" label-width="130px" :disabled="disabled">
12
+      <el-form-item label="项目来源:" prop="projectSource">
13
+        <el-radio-group v-model="addForm.projectSource" @change="changeProjectSource">
14
+          <el-radio label="0" border>院内</el-radio>
15
+          <el-radio label="1" border>院外</el-radio>
16
+        </el-radio-group>
17
+      </el-form-item>
12 18
       <el-form-item label="项目编号:" prop="projectNumber">
13 19
         <el-input v-model="addForm.projectNumber"></el-input>
14 20
       </el-form-item><el-form-item label="项目名称:" prop="projectName">
@@ -21,12 +27,6 @@
21 27
         <el-radio v-model="addForm.projectLevel" label="0" border>一般项目</el-radio>
22 28
         <el-radio v-model="addForm.projectLevel" label="1" border>重大项目</el-radio>
23 29
       </el-form-item>
24
-      <el-form-item label="项目来源:" prop="projectSource">
25
-        <el-radio-group v-model="addForm.projectSource" @change="changeProjectSource">
26
-          <el-radio label="0" border>院内</el-radio>
27
-          <el-radio label="1" border>院外</el-radio>
28
-        </el-radio-group>
29
-      </el-form-item>
30 30
       <el-form-item label="合同编码:">
31 31
         <el-input v-model="chooseContractInfo.contractCode">
32 32
           <el-button slot="append" @click="openContract = true">选择</el-button>
@@ -270,33 +270,27 @@ export default {
270 270
       this.openContract = false;
271 271
     },
272 272
     // 暂存
273
-    save() {
273
+    async save() {
274 274
       // 新增项目数据
275 275
       if (this.formTotal == 0) {
276
-        this.$refs['projectAdd'].validate((vaild) => {
277
-          if (vaild) {
278
-            this.addForm.projectId = this.taskForm.formId;
279
-            addProject(this.addForm).then(response => {
280
-              this.$modal.msgSuccess("项目登记成功");
281
-              this.getList();
282
-            });
283
-            let contractId = this.chooseContractInfo.contractId ? this.chooseContractInfo.contractId : ''
284
-            let pcobj = { projectId: this.taskForm.formId, contractId }
285
-            if (contractId != '') {
286
-              addProjectContract(pcobj).then(response => {
287
-                this.$modal.msgSuccess("合同关联成功");
288
-              })
289
-            }
290
-          } else {
291
-            let dom = document.getElementById('scrollToMe')
292
-            dom.scrollIntoView({ behavior: 'smooth' });
293
-          }
294
-        })
276
+        this.addForm.projectId = this.taskForm.formId;
277
+        await addProject(this.addForm)
278
+        this.$modal.msgSuccess("新增项目成功");
279
+        this.getList();
280
+        let contractId = this.chooseContractInfo.contractId ? this.chooseContractInfo.contractId : ''
281
+        let pcobj = { projectId: this.taskForm.formId, contractId }
282
+        if (contractId != '') {
283
+          await addProjectContract(pcobj)
284
+          this.$modal.msgSuccess("合同关联成功");
285
+        }
286
+        // setTimeout(() => {
287
+        //   this.$router.go(0);
288
+        // }, 500);
289
+        this.initProjectForm();
295 290
       } else {
296 291
         // 修改项目数据
297
-        updateProject(this.addForm).then(
298
-          this.$modal.msgSuccess("保存成功")
299
-        );
292
+        await updateProject(this.addForm)
293
+        this.$modal.msgSuccess("保存成功")
300 294
       }
301 295
     },
302 296
     async confirmAddForm() {
@@ -307,10 +301,28 @@ export default {
307 301
       }
308 302
       this.$set(this.taskForm.variables, "approval", approvalId);
309 303
       this.$set(this.taskForm.variables, "formId", this.taskForm.formId);
310
-      this.save()
311 304
       // 获取下一个流程节点
312 305
       this.$refs['projectAdd'].validate((vaild) => {
313 306
         if (vaild) {
307
+          if (this.formTotal == 0) {
308
+            this.addForm.projectId = this.taskForm.formId;
309
+            addProject(this.addForm).then(response => {
310
+              this.$modal.msgSuccess("项目登记成功");
311
+              this.getList();
312
+            });
313
+            let contractId = this.chooseContractInfo.contractId ? this.chooseContractInfo.contractId : ''
314
+            let pcobj = { projectId: this.taskForm.formId, contractId }
315
+            if (contractId != '') {
316
+              addProjectContract(pcobj).then(response => {
317
+                this.$modal.msgSuccess("合同关联成功");
318
+              })
319
+            }
320
+          } else {
321
+            // 修改项目数据
322
+            updateProject(this.addForm).then(
323
+              this.$modal.msgSuccess("保存成功")
324
+            );
325
+          }
314 326
           const params = { taskId: this.taskForm.taskId };
315 327
           getNextFlowNode(params).then(res => {
316 328
             complete(this.taskForm).then(response => {
@@ -318,6 +330,9 @@ export default {
318 330
               this.$emit('goBack');
319 331
             });
320 332
           })
333
+        } else {
334
+          let dom = document.getElementById('scrollToMe')
335
+          dom.scrollIntoView({ behavior: 'smooth' });
321 336
         }
322 337
       })
323 338
 

+ 10
- 4
oa-ui/src/views/flowable/form/projectProcess/businessReview.vue Voir le fichier

@@ -2,7 +2,7 @@
2 2
  * @Author: ysh
3 3
  * @Date: 2024-04-08 13:56:14
4 4
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-07-08 17:48:47
5
+ * @LastEditTime: 2024-08-28 10:13:07
6 6
 -->
7 7
 <template>
8 8
   <div class="app-container">
@@ -29,7 +29,7 @@
29 29
 import { mapGetters } from 'vuex';
30 30
 import { parseTime } from "@/utils/ruoyi";
31 31
 import { complete, rejectTask, returnList, returnTask, getNextFlowNode, delegate, flowTaskForm } from "@/api/flowable/todo";
32
-import { getProjectComment, addProjectComment } from "@/api/oa/project/projectComment"
32
+import { getProjectComment, addProjectComment, updateProjectComment } from "@/api/oa/project/projectComment"
33 33
 import { listProject, getProject, addProject, updateProject, delProject, submitProject, modifyProject } from "@/api/oa/project/project";
34 34
 import { getUsersManageLeaderByDept } from '@/api/system/post'
35 35
 export default {
@@ -61,7 +61,8 @@ export default {
61 61
         jyComment: [{ required: true, message: "请输入审核意见", trigger: "blur" }]
62 62
       },
63 63
       jyApprovalTime: "",
64
-      managerList: []
64
+      managerList: [],
65
+      formTotal: 0,
65 66
     }
66 67
   },
67 68
   created() {
@@ -78,6 +79,7 @@ export default {
78 79
     initForm() {
79 80
       getProjectComment(this.taskForm.formId).then(res => {
80 81
         if (res.data) {
82
+          this.formTotal = 1;
81 83
           this.form = res.data
82 84
           if (this.form.jyUser) {
83 85
             this.form.jyApproverName = this.form.jyUser.nickName
@@ -114,7 +116,11 @@ export default {
114 116
     },
115 117
     confirm() {
116 118
       this.form.projectId = this.taskForm.formId
117
-      addProjectComment({ projectId: this.taskForm.formId, jyComment: this.form.jyComment })
119
+      if (this.formTotal) {
120
+        updateProjectComment(this.form)
121
+      } else {
122
+        addProjectComment({ projectId: this.taskForm.formId, jyComment: this.form.jyComment })
123
+      }
118 124
       const params = { taskId: this.taskForm.taskId };
119 125
       // 获取下一个流程节点
120 126
       getNextFlowNode(params).then(res => {

+ 396
- 0
oa-ui/src/views/oa/contract/components/edit.vue Voir le fichier

@@ -0,0 +1,396 @@
1
+<template>
2
+  <div class="app-container">
3
+    <el-form ref="form" :model="form" :rules="rules" label-width="130px">
4
+      <el-form-item label="投标项目名称" prop="tenderId">
5
+        <el-button type="primary" size="mini" @click="tbOpen = true">选择投标项目</el-button>
6
+        <el-button type="danger" size="mini" @click="form.tenderId = null" v-if="form.tenderId != null">删除投标项目</el-button>
7
+        <el-descriptions border v-if="form.tenderId" style="margin-top: 10px;" :column="1">
8
+          <el-descriptions-item label="投标项目名称" label-class-name="my-label" :span="3">
9
+            {{ chooseTender.projectName }}
10
+          </el-descriptions-item>
11
+          <el-descriptions-item label="项目来源" label-class-name="my-label">
12
+            {{ getProjectSource(chooseTender) }}
13
+          </el-descriptions-item>
14
+          <el-descriptions-item label="联系人" label-class-name="my-label">
15
+            {{ chooseTender.aPerson }}
16
+          </el-descriptions-item>
17
+          <el-descriptions-item label="联系电话" label-class-name="my-label">
18
+            {{ chooseTender.aPhone }}
19
+          </el-descriptions-item>
20
+        </el-descriptions>
21
+      </el-form-item>
22
+      <el-form-item label="合同名称" prop="contractName">
23
+        <el-input style="width: 100%;" v-model="form.contractName" placeholder="请输入合同名称"></el-input>
24
+      </el-form-item>
25
+      <el-form-item label="甲方单位" prop="partyAId">
26
+        <el-select v-model="form.partyAId" filterable placeholder="请选择" disabled style="width: 90%;">
27
+          <el-option v-for="item in partyAList" :key="item.value" :label="item.partyAName" :value="item.partyAId">
28
+          </el-option>
29
+        </el-select>
30
+        <el-button type="primary" @click="partyAOpen = true" size="mini">选择单位</el-button>
31
+      </el-form-item>
32
+      <el-form-item label="合同编码" prop="contractCode">
33
+        <el-input style="width: 100%;" v-model="form.contractCode" placeholder="请输入合同编码"></el-input>
34
+      </el-form-item>
35
+      <el-form-item label="合同编号" prop="contractNumber">
36
+        <el-input style="width:  100%;" v-model="form.contractNumber" placeholder="请输入合同编号"></el-input>
37
+      </el-form-item>
38
+      <el-form-item label="合同金额" prop="amount">
39
+        <el-input style="width:50%;" v-model="form.amount" placeholder="请输入合同金额">
40
+          <template slot="append">元</template>
41
+        </el-input>
42
+      </el-form-item>
43
+      <el-form-item style="text-align: left;" label="履约保证金" prop="deposit">
44
+        <el-input style="width:50%;" v-model="form.deposit" placeholder="请输入履约保证金">
45
+          <template slot="append">元</template>
46
+        </el-input>
47
+      </el-form-item>
48
+      <el-form-item label="合同文件" prop="contractDocument">
49
+        <FileUpload ref="contractFile" :limit="1" :filePathName="'承接合同/合同文件'" :isModify="true" :isShowTip="false"
50
+          :fileType="['doc', 'docx', 'xls', 'xlsx', 'pdf', 'rar', 'zip']" @input="getContractPath">
51
+        </FileUpload>
52
+        <div>
53
+          <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + form.contractDocument}`)">
54
+            {{ getFileName(form.contractDocument) }}
55
+          </el-link>
56
+          <el-link class="ml20" type="warning" :href="`${baseUrl}${'/profile/upload' + form.contractDocument}`"
57
+            :underline="false" target="_blank">
58
+            <span class="el-icon-download">下载文件</span>
59
+          </el-link>
60
+        </div>
61
+      </el-form-item>
62
+      <el-form-item label="关联项目:" prop="projectIds">
63
+        <el-button type="primary" size="mini" @click="open = true" icon="el-icon-plus">新增关联项目</el-button>
64
+        <el-table v-loading="projectloading" :data="connectProjectList">
65
+          <el-table-column label="序号" type="index" width="50px"></el-table-column>
66
+          <el-table-column label="项目编号" align="center" prop="projectNumber"></el-table-column>
67
+          <el-table-column label="项目名称" align="center" prop="projectName"></el-table-column>
68
+          <el-table-column label="项目负责人" align="center" prop="projectLeaderUser.nickName"></el-table-column>
69
+          <el-table-column label="承担部门" align="center" prop="undertakingDeptName"></el-table-column>
70
+          <el-table-column label="操作" align="center">
71
+            <template slot-scope="scope">
72
+              <el-button type="text" icon="el-icon-view" @click="clickProjectFn(scope.row)">查看</el-button>
73
+              <el-button type="text" style="color:#F56C6C;" icon="el-icon-delete"
74
+                @click="handleDelete(scope.$index,scope.row)">删除</el-button>
75
+            </template>
76
+          </el-table-column>
77
+        </el-table>
78
+      </el-form-item>
79
+      <el-form-item label="关联分包合同:">
80
+
81
+      </el-form-item>
82
+      <!-- 表1:工作量计划-->
83
+      <work-table ref="workTableRef" :contractId="form.contractId" :taskName="'合同拟稿'"></work-table>
84
+
85
+      <p class="mb20 mt20"></p>
86
+      <!-- 表2:回款计划 -->
87
+      <payment-table ref="paymentRef" :contractId="form.contractId" :amount="form.amount"
88
+        :taskName="'合同拟稿'"></payment-table>
89
+
90
+      <el-form-item label="合同备注" prop="remark">
91
+        <el-input v-model="form.remark" :autosize="{ minRows: 4 }" type="textarea" placeholder="请输入合同备注" />
92
+      </el-form-item>
93
+
94
+
95
+      <el-divider></el-divider>
96
+      <el-form-item label="拟稿日期" prop="draftTime">
97
+        <el-date-picker clearable v-model="form.draftTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择拟稿日期">
98
+        </el-date-picker>
99
+      </el-form-item>
100
+      <el-form-item label="分管审批日期" prop="managerTime">
101
+        <el-date-picker clearable v-model="form.managerTime" type="date" value-format="yyyy-MM-dd"
102
+          placeholder="请选择分管审批日期">
103
+        </el-date-picker>
104
+      </el-form-item>
105
+      <el-form-item label="总经理审批日期" prop="gmTime">
106
+        <el-date-picker clearable v-model="form.gmTime" type="date" value-format="yyyy-MM-dd" placeholder="请选择总经理审批日期">
107
+        </el-date-picker>
108
+      </el-form-item>
109
+      <el-form-item label="签订日期" prop="signDate">
110
+        <el-date-picker clearable v-model="form.signDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择签订日期">
111
+        </el-date-picker>
112
+      </el-form-item>
113
+      <el-form-item label="评审方式">
114
+        <el-tag :type="form.commentType == '2' ? 'success' : 'warning'">
115
+          {{ getCommentType(form.commentType) }}</el-tag>
116
+      </el-form-item>
117
+      <el-form-item label="" label-width="0" v-if="form.commentType == '2'">
118
+        <table border="1" style="width:100%;">
119
+          <tr>
120
+            <td style="width: 50px;">序号</td>
121
+            <td>会审部门</td>
122
+            <td>会审人</td>
123
+            <td>会审意见</td>
124
+            <td style="width: 200px;">会审附件</td>
125
+            <td style="width: 100px;">日期</td>
126
+          </tr>
127
+          <tr v-for="(comment, index) in commentList" :key="index">
128
+            <td>
129
+              {{ index + 1 }}
130
+            </td>
131
+            <td>
132
+              {{ getDeptName(comment.deptId) }}
133
+            </td>
134
+            <td>
135
+              {{ getUserName(comment.userId) }}
136
+            </td>
137
+            <td>
138
+              {{ comment.comment }}
139
+            </td>
140
+            <td>
141
+              <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + comment.document}`)">
142
+                {{ getFileName(comment.document) }}
143
+              </el-link>
144
+            </td>
145
+            <td>
146
+              <el-date-picker v-model="comment.commentTime" type="date" value-format="yyyy-MM-dd" style="width:140px;"
147
+                placeholder="选择日期"></el-date-picker>
148
+            </td>
149
+          </tr>
150
+        </table>
151
+      </el-form-item>
152
+    </el-form>
153
+    <div slot="footer" class="dialog-footer text-center">
154
+      <el-button type="primary" @click="submitForm">修 改</el-button>
155
+      <el-button @click="$emit('cancel')">取 消</el-button>
156
+    </div>
157
+
158
+    <el-dialog title="选择项目" :visible.sync="open" width="60%" append-to-body>
159
+      <choose-project @chooseProject="confirmProject"></choose-project>
160
+    </el-dialog>
161
+    <el-dialog title="选择投标项目" :visible.sync="tbOpen" width="60%" append-to-body>
162
+      <choose-tender @choose="confirmTender"></choose-tender>
163
+    </el-dialog>
164
+    <el-drawer :visible.sync="partyAOpen" title="选择甲方单位" :size="'40%'" append-to-body>
165
+      <div class="app-container">
166
+        <choose-party-a @confirm="confirmPartyA"></choose-party-a>
167
+      </div>
168
+    </el-drawer>
169
+    <el-drawer :visible.sync="drawerOpen" title="" :size="'70%'" append-to-body>
170
+      <projectInfo :needReturn="false"></projectInfo>
171
+    </el-drawer>
172
+  </div>
173
+
174
+</template>
175
+
176
+<script>
177
+import { listContractWork, addContractWork, delContractWork } from "@/api/oa/contract/contractWork";
178
+import { listContractPayment, addContractPayment, delContractPayment } from "@/api/oa/contract/contractPayment";
179
+import { listContractComment, addContractComment, updateContractComment } from "@/api/oa/contract/contractComment";
180
+import { listContract, getContract, delContract, addContract, updateContract } from "@/api/oa/contract/contract";
181
+import { listProjectContract, addProjectContract, delProjectContract } from "@/api/oa/contract/projectContract";
182
+import { listProject, getProject } from "@/api/oa/project/project";
183
+import { listPartyA } from "@/api/oa/partyA/partyA";
184
+import chooseProject from "@/views/flowable/form/components/chooseProject.vue";
185
+import chooseTender from "@/views/flowable/form/components/chooseTender.vue";
186
+import ChoosePartyA from '@/views/flowable/form/components/choosePartyA.vue';
187
+import WorkTable from '@/views/flowable/form/business/components/workTable.vue';
188
+import paymentTable from '@/views/flowable/form/business/components/paymentTable.vue';
189
+import projectInfo from '@/views/oa/project/info'
190
+export default {
191
+  components: { chooseProject, chooseTender, ChoosePartyA, WorkTable, paymentTable, projectInfo },
192
+  props: {
193
+    form: {
194
+      type: Object
195
+    },
196
+  },
197
+  data() {
198
+    return {
199
+      baseUrl: process.env.VUE_APP_BASE_API,
200
+      open: false,
201
+      tbOpen: false,
202
+      partyAOpen: false,
203
+      drawerOpen: false,
204
+      commentList: [],
205
+      workList: [],
206
+      paymentList: [],
207
+      partyAList: [],
208
+      chooseTender: {},
209
+      rules: {
210
+        contractCode: [
211
+          { required: true, message: '请输入合同编码', trigger: 'blur' },
212
+        ],
213
+        amount: [
214
+          { required: true, message: '请输入合同金额', trigger: 'blur' },
215
+        ],
216
+      },
217
+      projectloading: false,
218
+      connectProjectList: [],
219
+      projectContractForm: {
220
+        projectIds: [],
221
+      },
222
+    }
223
+  },
224
+  watch: {
225
+    'form.contractId'() {
226
+      this.init();
227
+    }
228
+  },
229
+  created() {
230
+    this.getPartyAList();
231
+    this.init();
232
+  },
233
+  methods: {
234
+    init() {
235
+      const contractId = this.form.contractId;
236
+      this.chooseTender = this.form.tender;
237
+      const tenderId = this.form.tenderId;
238
+      listContractComment({ pageNum: 1, pageSize: 100, contractId: contractId }).then(res => {
239
+        if (res.rows && res.rows.length != 0) {
240
+          this.commentList = res.rows;
241
+        }
242
+      })
243
+      listProjectContract({ contractId: contractId }).then(res => {
244
+        if (res.rows) {
245
+          let list = []
246
+          for (let row of res.rows) {
247
+            getProject(row.projectId).then(response => {
248
+              list.push(response.data)
249
+            })
250
+          }
251
+          this.connectProjectList = list;
252
+          this.projectloading = false;
253
+        }
254
+      })
255
+    },
256
+    /** 提交按钮 */
257
+    submitForm() {
258
+      this.$refs["form"].validate(valid => {
259
+        if (valid) {
260
+          if (this.form.contractId != null) {
261
+            for (let comment of this.commentList) {
262
+              updateContractComment(comment);
263
+            }
264
+            this.updateContractData();
265
+            this.updateRelatedProject();
266
+            this.$emit('cancel')
267
+          }
268
+        }
269
+      });
270
+    },
271
+    // 查询业主单位列表
272
+    getPartyAList() {
273
+      listPartyA({
274
+        pageNum: 1,
275
+        pageSize: 99999999
276
+      }).then(response => {
277
+        this.partyAList = response.rows;
278
+      })
279
+    },
280
+    getCommentType(row) {
281
+      let name = '';
282
+      if (row == '0') {
283
+        name = '无须评审'
284
+      } else if (row == '1') {
285
+        name = '会议评审'
286
+      } else {
287
+        name = '线上评审'
288
+      }
289
+      return name
290
+    },
291
+    getProjectSource(chooseTender) {
292
+      const TARGET_COMPANY = '中国电建集团成都勘测设计研究院有限公司';
293
+      if (!chooseTender || !chooseTender.partyA || !chooseTender.partyA.partyAName) {
294
+        return '';
295
+      }
296
+      return chooseTender.partyA.partyAName.includes(TARGET_COMPANY) ? '院内' : '院外';
297
+    },
298
+    confirmProject(val) {
299
+      this.open = false
300
+      for (let v of val) {
301
+        this.projectContractForm.projectIds.push(v.projectId);
302
+        this.connectProjectList.push(v)
303
+      }
304
+    },
305
+    confirmTender(val) {
306
+      this.tbOpen = false
307
+      this.form.amount = val.quote
308
+      this.form.deposit = val.deposit
309
+      this.form.tenderId = val.tenderId
310
+      this.chooseTender = val
311
+      this.isSelect = true
312
+      this.form.partyAId = val.partyAId
313
+    },
314
+    confirmPartyA(val) {
315
+      this.partyAOpen = false
316
+      if (val && val.length > 1) {
317
+        return this.$message.error('请选择一个甲方单位')
318
+      }
319
+      if (val) {
320
+        this.getPartyAList();
321
+        this.$set(this.form, 'partyAId', val[0].partyAId)
322
+      }
323
+    },
324
+    getContractPath(val) {
325
+      let arr = val.split('/upload')
326
+      this.form.contractDocument = arr[1]
327
+      if (val == "") {
328
+        this.form.contractDocument = ""
329
+      }
330
+    },
331
+    updateContractData() {
332
+      this.workList = this.$refs.workTableRef.workList;
333
+      this.paymentList = this.$refs.paymentRef.paymentList;
334
+      updateContract(this.form).then(response => {
335
+        this.$modal.msgSuccess("修改成功");
336
+        this.open = false;
337
+        delContractWork(this.form.contractId).then(res => {
338
+          for (let work of this.workList) {
339
+            work.contractId = this.form.contractId
340
+            addContractWork(work);
341
+          }
342
+        })
343
+        delContractPayment(this.form.contractId).then(res => {
344
+          for (let payment of this.paymentList) {
345
+            payment.contractId = this.form.contractId
346
+            addContractPayment(payment);
347
+          }
348
+        })
349
+      });
350
+    },
351
+    updateRelatedProject() {
352
+      delProjectContract(this.form.contractId).then(() => {
353
+        for (let projectId of this.projectContractForm.projectIds) {
354
+          addProjectContract({ projectId: projectId, contractId: this.form.contractId });
355
+        }
356
+      })
357
+    },
358
+    clickProjectFn(row) {
359
+      this.$router.replace({ query: { ...this.$route.query, projectId: row.projectId } });
360
+      this.drawerOpen = true;
361
+    },
362
+    handleDelete(index, row) {
363
+      this.connectProjectList.splice(index, 1)
364
+      this.projectContractForm.projectIds.splice(row.contractId)
365
+    }
366
+  },
367
+}
368
+</script>
369
+
370
+<style lang="scss" scoped>
371
+@import "@/assets/styles/element-reset.scss";
372
+
373
+table {
374
+  /*边框*/
375
+  /* border: 1px solid black; */
376
+  text-align: center;
377
+  border-collapse: collapse;
378
+
379
+  /*设置背景颜色*/
380
+  /* background-color: #bfa; */
381
+  td {
382
+    padding: 5px;
383
+  }
384
+}
385
+
386
+::v-deep .el-descriptions-item__label.is-bordered-label {
387
+  color: #5a5757;
388
+  background: rgba($color: #a9adb3, $alpha: 0.1);
389
+  width: 150px;
390
+  min-width: 150px;
391
+}
392
+
393
+::v-deep .el-descriptions .is-bordered .el-descriptions-item__cell {
394
+  border: 1px solid #cdd0d3;
395
+}
396
+</style>

+ 13
- 108
oa-ui/src/views/oa/contract/index.vue Voir le fichier

@@ -1,8 +1,14 @@
1
+<!--
2
+ * @Author: ysh
3
+ * @Date: 2024-06-21 18:52:00
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-28 17:30:44
6
+-->
1 7
 <!--
2 8
  * @Author: ysh
3 9
  * @Date: 2024-03-18 09:05:41
4 10
  * @LastEditors: Please set LastEditors
5
- * @LastEditTime: 2024-08-06 14:38:13
11
+ * @LastEditTime: 2024-08-28 16:13:14
6 12
 -->
7 13
 <template>
8 14
   <div class="app-container">
@@ -22,18 +28,6 @@
22 28
     </el-form>
23 29
 
24 30
     <el-row :gutter="10" class="mb8">
25
-      <!-- <el-col :span="1.5">
26
-        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
27
-          v-hasPermi="['oa:contract:add']">新增</el-button>
28
-      </el-col>
29
-      <el-col :span="1.5">
30
-        <el-button type="success" plain icon="el-icon-edit" size="mini" :disabled="single" @click="handleUpdate"
31
-          v-hasPermi="['oa:contract:edit']">修改</el-button>
32
-      </el-col>
33
-      <el-col :span="1.5">
34
-        <el-button type="danger" plain icon="el-icon-delete" size="mini" :disabled="multiple" @click="handleDelete"
35
-          v-hasPermi="['oa:contract:remove']">删除</el-button>
36
-      </el-col> -->
37 31
       <el-col :span="1.5">
38 32
         <el-button type="success" plain icon="el-icon-plus" size="mini" @click="handleRegister"
39 33
           v-hasPermi="['oa:contract:add']">登记承接合同</el-button>
@@ -98,8 +92,6 @@
98 92
             v-hasPermi="['oa:contract:query']">查看</el-button>
99 93
           <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
100 94
             v-hasPermi="['oa:contract:edit']">修改</el-button>
101
-          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
102
-            v-hasPermi="['oa:contract:remove']">删除</el-button> -->
103 95
         </template>
104 96
       </el-table-column>
105 97
     </el-table>
@@ -108,85 +100,11 @@
108 100
       @pagination="getList" />
109 101
 
110 102
     <!-- 添加或修改cmc合同评审对话框 -->
111
-    <el-dialog :title="title" :visible.sync="open" width="50%" append-to-body>
112
-      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
113
-        <el-form-item label="合同名称" prop="contractName">
114
-          {{ form.contractName }}
115
-        </el-form-item>
116
-        <el-form-item label="合同编号" prop="contractNumber">
117
-          {{ form.contractNumber }}
118
-        </el-form-item>
119
-        <el-form-item label="拟稿日期" prop="draftTime">
120
-          <el-date-picker clearable v-model="form.draftTime" type="date" value-format="yyyy-MM-dd"
121
-            placeholder="请选择拟稿日期">
122
-          </el-date-picker>
123
-        </el-form-item>
124
-        <el-form-item label="分管审批日期" prop="managerTime">
125
-          <el-date-picker clearable v-model="form.managerTime" type="date" value-format="yyyy-MM-dd"
126
-            placeholder="请选择分管审批日期">
127
-          </el-date-picker>
128
-        </el-form-item>
129
-        <el-form-item label="总经理审批日期" prop="gmTime">
130
-          <el-date-picker clearable v-model="form.gmTime" type="date" value-format="yyyy-MM-dd"
131
-            placeholder="请选择总经理审批日期">
132
-          </el-date-picker>
133
-        </el-form-item>
134
-        <el-form-item label="签订日期" prop="signDate">
135
-          <el-date-picker clearable v-model="form.signDate" type="date" value-format="yyyy-MM-dd" placeholder="请选择签订日期">
136
-          </el-date-picker>
137
-        </el-form-item>
138
-        <el-form-item label="评审方式">
139
-          <el-tag :type="form.commentType == '2' ? 'success' : 'warning'">
140
-            {{ getCommentType(form.commentType) }}</el-tag>
141
-        </el-form-item>
142
-        <el-form-item label="" label-width="0" v-if="form.commentType == '2'">
143
-          <table border="1" style="width:100%;">
144
-            <tr>
145
-              <td style="width: 50px;">序号</td>
146
-              <td>会审部门</td>
147
-              <td>会审人</td>
148
-              <td>会审意见</td>
149
-              <td style="width: 200px;">会审附件</td>
150
-              <!-- <td style="width: 90px;">签名</td> -->
151
-              <td style="width: 100px;">日期</td>
152
-            </tr>
153
-            <tr v-for="(comment, index) in commentList" :key="index">
154
-              <td>
155
-                {{ index + 1 }}
156
-              </td>
157
-              <td>
158
-                {{ getDeptName(comment.deptId) }}
159
-              </td>
160
-              <td>
161
-                {{ getUserName(comment.userId) }}
162
-              </td>
163
-              <td>
164
-                {{ comment.comment }}
165
-              </td>
166
-              <td>
167
-                <el-link type="primary" @click="reviewWord(`${baseUrl}${'/profile/upload' + comment.document}`)">
168
-                  {{ getFileName(comment.document) }}
169
-                </el-link>
170
-              </td>
171
-              <!-- <td>
172
-                <span class="auditor">{{ comment.commentUser ? comment.commentUser.nickName : '' }}</span>
173
-              </td> -->
174
-              <td>
175
-                <el-date-picker v-model="comment.commentTime" type="date" value-format="yyyy-MM-dd" style="width:140px;"
176
-                  placeholder="选择日期"></el-date-picker>
177
-              </td>
178
-            </tr>
179
-          </table>
180
-        </el-form-item>
181
-      </el-form>
182
-      <div slot="footer" class="dialog-footer text-center">
183
-        <el-button type="primary" @click="submitForm">确 定</el-button>
184
-        <el-button @click="cancel">取 消</el-button>
185
-      </div>
103
+    <el-dialog :title="title" :visible.sync="open" width="60%" append-to-body>
104
+      <contract-edit :form="form" @cancel="open = false"></contract-edit>
186 105
     </el-dialog>
187 106
     <!-- 查看详情 -->
188
-    <el-dialog :title="title" :visible.sync="openInfo" width="80%" append-to-body>
189
-      <!-- <contract-info :form="form"></contract-info> -->
107
+    <el-dialog :title="title" :visible.sync="openInfo" width="70%" append-to-body>
190 108
       <contract-form :taskForm="taskForm" :taskName="''" :flowDisabled="false"></contract-form>
191 109
     </el-dialog>
192 110
   </div>
@@ -201,8 +119,9 @@ import { definitionStart, flowXmlAndNode } from "@/api/flowable/definition";
201 119
 import { todoList, getNextFlowNodeByStart } from "@/api/flowable/todo";
202 120
 import { Snowflake } from '@/utils/snowFlake.js'
203 121
 import { listContractComment, addContractComment, updateContractComment } from "@/api/oa/contract/contractComment";
122
+import contractEdit from './components/edit.vue'
204 123
 export default {
205
-  components: { contractInfo, ContractForm },
124
+  components: { contractInfo, ContractForm, contractEdit },
206 125
   name: "Contract",
207 126
   data() {
208 127
     return {
@@ -334,7 +253,7 @@ export default {
334 253
       getContract(contractId).then(response => {
335 254
         this.form = response.data;
336 255
         this.open = true;
337
-        this.title = "修改承接合同评审_日期";
256
+        this.title = "修改承接合同评审";
338 257
         listContractComment({ pageNum: 1, pageSize: 100, contractId: contractId }).then(res => {
339 258
           if (res.rows && res.rows.length != 0) {
340 259
             this.commentList = res.rows;
@@ -456,17 +375,3 @@ export default {
456 375
   }
457 376
 };
458 377
 </script>
459
-<style lang="scss" scoped>
460
-table {
461
-  /*边框*/
462
-  /* border: 1px solid black; */
463
-  text-align: center;
464
-  border-collapse: collapse;
465
-
466
-  /*设置背景颜色*/
467
-  /* background-color: #bfa; */
468
-  td {
469
-    padding: 5px;
470
-  }
471
-}
472
-</style>

+ 3
- 2
oa-ui/src/views/oa/project/index.vue Voir le fichier

@@ -1,8 +1,8 @@
1 1
 <!--
2 2
  * @Author: ysh
3 3
  * @Date: 2024-02-27 14:49:15
4
- * @LastEditors: wrh
5
- * @LastEditTime: 2024-08-20 17:09:10
4
+ * @LastEditors: Please set LastEditors
5
+ * @LastEditTime: 2024-08-30 15:34:36
6 6
 -->
7 7
 <template>
8 8
   <div class="project-wrapper">
@@ -252,6 +252,7 @@ import { todoList, getNextFlowNodeByStart } from "@/api/flowable/todo";
252 252
 import { Snowflake } from '@/utils/snowFlake.js'
253 253
 
254 254
 export default {
255
+  name:'Project',
255 256
   computed: {
256 257
     ...mapGetters(['deptId', 'userId'])
257 258
   },

+ 11
- 3
oa-ui/src/views/oa/project/info.vue Voir le fichier

@@ -1,7 +1,7 @@
1 1
 <template>
2 2
   <div class="app-container">
3 3
     <div class="header">
4
-      <el-button icon="el-icon-d-arrow-left" plain type="primary" class="back" @click="goBack">返回</el-button>
4
+      <el-button icon="el-icon-d-arrow-left" plain type="primary" class="back" @click="goBack" v-show="needReturn">返回</el-button>
5 5
       <el-button type="success" plain @click="printOpen = true" class="print" icon="el-icon-printer">打印任务通知单</el-button>
6 6
       <h1>{{ '【' + project.projectNumber + '】' + project.projectName }}</h1>
7 7
       <el-button icon="el-icon-search" type="primary" class="records" @click="clickRecords">流转记录</el-button>
@@ -138,6 +138,7 @@
138 138
                   <el-table-column label="单位" prop="unit" />
139 139
                   <el-table-column label="工作量" prop="workload" />
140 140
                   <el-table-column label="要求完成时间" prop="deadline" />
141
+                  <el-table-column label="备注" prop="remark" />
141 142
                 </el-table>
142 143
               </div>
143 144
             </el-descriptions-item>
@@ -499,7 +500,8 @@
499 500
       </div>
500 501
     </el-dialog>
501 502
     <el-dialog title="打印预览" :visible.sync="printOpen" width="1000px" append-to-body>
502
-      <project-print :project="project" :workList="workList" :projectComment="projectComment" @cancel="printOpen = false"></project-print>
503
+      <project-print :project="project" :workList="workList" :projectComment="projectComment"
504
+        @cancel="printOpen = false"></project-print>
503 505
     </el-dialog>
504 506
     <el-drawer title="流程图" :visible.sync="drawerOpen" direction="rtl">
505 507
       <div class="app-container">
@@ -543,6 +545,12 @@ import projectPrint from '@/views/flowable/form/components/print/projectPrint.vu
543 545
 
544 546
 export default {
545 547
   components: { budgetInfo, SafeTab, TechnicalTab, PlanTab, SettleData, BorrowData, BudgetTab, achiData, choosePeople, flow, RowDetail, projectPrint },
548
+  props: {
549
+    needReturn: {
550
+      type: Boolean,
551
+      default: true
552
+    }
553
+  },
546 554
   created() {
547 555
     this.getUserList();
548 556
     this.getDeviceList();
@@ -609,7 +617,7 @@ export default {
609 617
           if (this.project.projectLeader == this.$store.state.user.id) {
610 618
             this.isProjectLeader = true;
611 619
           }
612
-          let deptArr =  [];
620
+          let deptArr = [];
613 621
           if (this.project.undertakingDept && this.project.undertakingDept.trim() !== '') {
614 622
             deptArr = (this.project.undertakingDept.split(',')).map(Number)
615 623
           }

+ 33
- 3
oa-ui/src/views/oa/staff/index.vue Voir le fichier

@@ -130,13 +130,13 @@
130 130
             </template>
131 131
           </el-table-column>
132 132
           <el-table-column label="合同签订" align="center" key="contractSign" prop="contractSign" v-if="columns[7].visible"
133
-            :show-overflow-tooltip="true" sortable>
133
+            :show-overflow-tooltip="true" sortable :sort-method="sortContractSign">
134 134
             <template slot-scope="scope">
135 135
               <span>{{ parseTime(scope.row.contractSign, '{y}-{m}-{d}') }}</span>
136 136
             </template>
137 137
           </el-table-column>
138 138
           <el-table-column label="合同期满" align="center" key="contractExpire" prop="contractExpire"
139
-            v-if="columns[8].visible" :show-overflow-tooltip="true" sortable>
139
+            v-if="columns[8].visible" :show-overflow-tooltip="true" sortable :sort-method="sortContractExpire">
140 140
             <template slot-scope="scope">
141 141
               <span>{{ parseTime(scope.row.contractExpire, '{y}-{m}-{d}') }}</span>
142 142
             </template>
@@ -230,7 +230,7 @@
230 230
             </el-form-item>
231 231
             <el-form-item label="入职年月" prop="entryDate">
232 232
               <el-date-picker v-model="form.entryDate" type="date" placeholder="请输入入职年月" style="width:100%;"
233
-                format="yyyy-MM-dd" />
233
+              value-format="yyyy-MM-dd" />
234 234
             </el-form-item>
235 235
             <el-form-item label="合同签订" prop="contractSign">
236 236
               <el-date-picker v-model="form.contractSign" type="date" placeholder="请输入合同签订" style="width:100%;"
@@ -852,6 +852,36 @@ export default {
852 852
       let res = Number(a.status) - Number(b.status)
853 853
       return res
854 854
     },
855
+    sortContractSign(a, b) {
856
+      a = a.contractSign;
857
+      b = b.contractSign;
858
+      if (!a && b) return 1; // 如果a为空且b不为空,则a排在b前面  
859
+      if (a && !b) return -1; // 如果a不为空且b为空,则b排在a前面  
860
+      if (!a && !b) return 0; // 如果a和b都为空,则它们相等,排序位置不变  
861
+      // 将字符串转换为日期对象进行比较  
862
+      const dateA = new Date(a);
863
+      const dateB = new Date(b);
864
+      // 如果日期有效,则比较日期;如果无效,则将它们视为大于有效日期  
865
+      if (isNaN(dateA.getTime())) return 1; // a不是有效日期,则b(假设为有效日期)应该排在a前面  
866
+      if (isNaN(dateB.getTime())) return -1; // b不是有效日期,则a(假设为有效日期)应该排在b前面  
867
+      // 比较两个日期  
868
+      return dateA - dateB;
869
+    },
870
+    sortContractExpire(a, b) {
871
+      a = a.contractExpire;
872
+      b = b.contractExpire;
873
+      if (!a && b) return -1; // 如果a为空且b不为空,则a排在b前面  
874
+      if (a && !b) return 1; // 如果a不为空且b为空,则b排在a前面  
875
+      if (!a && !b) return 0; // 如果a和b都为空,则它们相等,排序位置不变  
876
+      // 将字符串转换为日期对象进行比较  
877
+      const dateA = new Date(a);
878
+      const dateB = new Date(b);
879
+      // 如果日期有效,则比较日期;如果无效,则将它们视为大于有效日期  
880
+      if (isNaN(dateA.getTime())) return 1; // a不是有效日期,则b(假设为有效日期)应该排在a前面  
881
+      if (isNaN(dateB.getTime())) return -1; // b不是有效日期,则a(假设为有效日期)应该排在b前面  
882
+      // 比较两个日期  
883
+      return dateA - dateB;
884
+    },
855 885
     sortGraduateSchool(a, b) {
856 886
 
857 887
     },

Loading…
Annuler
Enregistrer