Browse Source

补助页面修改(选择,加下拉条件) - 增加了排除部门的条件

bing 11 hours ago
parent
commit
42de207398

+ 3 - 0
src/api/payment/account/types.ts

@@ -507,4 +507,7 @@ export interface PtUserAccountQuery extends PageQuery {
507 507
    * 日期范围参数
508 508
    */
509 509
   params?: any;
510
+
511
+  excludeDepts?: Array<string | number>;
512
+  excludeDeptsAndChildren?: Array<string | number>;
510 513
 }

+ 78 - 8
src/components/UserAccountSelect/index.vue

@@ -29,21 +29,39 @@
29 29
             <template #header>
30 30
               <div><span class="text-red-500 font-bold">待选用户</span></div>
31 31
             </template>
32
-            <el-form ref="queryFormRef" :model="queryParams" :inline="true" class="pt-2 pb-2">
32
+            <el-form ref="queryFormRef" :model="queryParams" :inline="true" class="pt-2">
33 33
               <el-form-item label="姓名" prop="realName" style="width: 25%">
34 34
                 <el-input v-model="queryParams.realName" placeholder="请输入姓名" clearable @keyup.enter="handleQuery" />
35 35
               </el-form-item>
36
-              <el-form-item label="学/工号" prop="userNumb" style="width: 30%">
36
+              <el-form-item label="学/工号" prop="userNumb" style="width: 25%">
37 37
                 <el-input v-model="queryParams.userNumb" placeholder="请输入学/工号" clearable @keyup.enter="handleQuery" />
38 38
               </el-form-item>
39
-              <!-- <el-form-item label="手机号码" prop="phone" style="width: 20%">
40
-                  <el-input v-model="queryParams.phone" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" />
41
-                </el-form-item> -->
42
-              <el-form-item>
43
-                <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
44
-                <el-button icon="Refresh" @click="resetQuery">重置</el-button>
39
+              <el-form-item label="排除部门" prop="phone" style="width: 35%" label-width="6rem">
40
+                <template #label>
41
+                  排除部门
42
+                  <el-tooltip content="查询列表中将排除所选部门及子部门下的所有用户" placement="top">
43
+                    <el-icon>
44
+                      <question-filled />
45
+                    </el-icon>
46
+                  </el-tooltip>
47
+                </template>
48
+                <el-select
49
+                  v-model="queryParams.excludeDepts"
50
+                  multiple
51
+                  collapse-tags
52
+                  collapse-tags-tooltip
53
+                  :max-collapse-tags="1"
54
+                  placeholder="请选择需要排除的部门"
55
+                >
56
+                  <el-option v-for="item in childrenOptions" :key="item.id" :label="item.label" :value="item.id" />
57
+                </el-select>
58
+                <!-- <el-input v-model="queryParams.phone" placeholder="请输入手机号码" clearable @keyup.enter="handleQuery" /> -->
45 59
               </el-form-item>
46 60
             </el-form>
61
+            <div class="flex justify-end mb-2">
62
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
63
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
64
+            </div>
47 65
 
48 66
             <vxe-table
49 67
               ref="table1"
@@ -149,6 +167,7 @@ import { DeptVO } from '@/api/system/dept/types';
149 167
 import { get } from 'http';
150 168
 import { ref } from 'vue';
151 169
 import { useDraggable } from 'vue-draggable-plus';
170
+import { de } from 'element-plus/es/locale/index.mjs';
152 171
 
153 172
 const table1 = ref();
154 173
 const tbody1 = ref<HTMLTableSectionElement>();
@@ -165,6 +184,7 @@ const ids2 = ref<Array<string | number>>([]);
165 184
 const selected2 = ref<PtUserAccountVO[]>([]);
166 185
 
167 186
 const deptOptions = ref<DeptVO[]>([]);
187
+const childrenOptions = ref<DeptVO[]>([]);
168 188
 const deptName = ref('');
169 189
 const expandKeys = ref<number[]>([]);
170 190
 const initFormData: PtUserAccountForm = {
@@ -204,6 +224,8 @@ const initData: PageData<PtUserAccountForm, PtUserAccountQuery> = {
204 224
     realName: '',
205 225
     userNumb: '',
206 226
     phone: '',
227
+    excludeDepts: [],
228
+    excludeDeptsAndChildren: [],
207 229
     category: '1'
208 230
   },
209 231
   rules: {}
@@ -296,16 +318,61 @@ const filterNode = (value: string, data: any) => {
296 318
 
297 319
 /** 节点单击事件 */
298 320
 const handleNodeClick = (data: DeptVO) => {
321
+  if (queryParams.value.deptId && data.id !== queryParams.value.deptId) {
322
+    // 重新选择不同部门时清空
323
+    queryParams.value.excludeDepts = [];
324
+  }
299 325
   queryParams.value.deptId = data.id;
326
+  childrenOptions.value = data.children;
300 327
   handleQuery();
301 328
 };
302 329
 
303 330
 /** 搜索按钮操作 */
304 331
 const handleQuery = () => {
305 332
   queryParams.value.pageNum = 1;
333
+  queryParams.value.excludeDeptsAndChildren = [];
334
+  if (queryParams.value.excludeDepts && queryParams.value.excludeDepts.length > 0) {
335
+    // 查询所有子部门的id
336
+    queryParams.value.excludeDepts.forEach((item: string | number) => {
337
+      queryParams.value.excludeDeptsAndChildren.push(...getAllChildrenIds(deptOptions.value, item));
338
+    });
339
+    // queryParams.value.excludeDeptsAndChildren.push(...queryParams.value.excludeDepts);
340
+  }
341
+  console.log(queryParams.value.excludeDeptsAndChildren, 'excludeDeptsAndChildren');
306 342
   getList();
307 343
 };
308 344
 
345
+// 查询所有子部门的id
346
+const getAllChildrenIds = (departments, id: number | string) => {
347
+  const ids: Array<number | string> = [];
348
+  if (departments instanceof Array) {
349
+  } else {
350
+    departments = [departments];
351
+  }
352
+  for (let item of departments) {
353
+    if (id === 'all') {
354
+      // 直接将其下的所有部门都添加到ids中
355
+      ids.push(item.id);
356
+      if (item.children && item.children.length > 0) {
357
+        ids.push(...getAllChildrenIds(item.children, 'all'));
358
+      }
359
+    } else {
360
+      if (item.id === id) {
361
+        ids.push(item.id);
362
+        if (item.children && item.children.length > 0) {
363
+          ids.push(...getAllChildrenIds(item.children, 'all'));
364
+        }
365
+        return ids;
366
+      } else {
367
+        if (item.children && item.children.length > 0) {
368
+          ids.push(...getAllChildrenIds(item.children, id));
369
+        }
370
+      }
371
+    }
372
+  }
373
+  return ids;
374
+};
375
+
309 376
 /** 查询用户列表 */
310 377
 const getList = async () => {
311 378
   loading.value = true;
@@ -335,6 +402,8 @@ const resetQuery = () => {
335 402
   queryParams.value.deptId = undefined;
336 403
   queryParams.value.category = '1';
337 404
   deptTreeRef.value?.setCurrentKey(undefined);
405
+  queryParams.value.excludeDepts = [];
406
+  childrenOptions.value = deptOptions.value[0].children;
338 407
   handleQuery();
339 408
 };
340 409
 
@@ -343,6 +412,7 @@ const getTreeSelect = async () => {
343 412
   deptLoading.value = true;
344 413
   const res = await api.deptTreeSelect();
345 414
   deptOptions.value = res.data;
415
+  childrenOptions.value = deptOptions.value[0].children;
346 416
   expandKeys.value = [deptOptions.value[0].id as number];
347 417
   deptLoading.value = false;
348 418
 };

+ 53 - 53
src/views/cardCenter/subsidy/ptSubsidy/DetailForm.vue

@@ -1,71 +1,72 @@
1 1
 <template>
2 2
   <div class="p-2">
3 3
     <el-dialog v-model="dialog.visible" :title="dialog.title" width="1200px" :draggable="draggable">
4
-      <el-form ref="formRef" :inline="true" v-loading="formLoading" :model="formData" :rules="formRules" label-width="80px">
4
+      <el-form ref="formRef" v-loading="formLoading" :inline="true" :model="formData" :rules="formRules" label-width="110px">
5 5
         <el-form-item label="补助名称" prop="subsidyName">
6 6
           <el-input v-model="formData.subsidyName" placeholder="请输入补助名称" />
7 7
         </el-form-item>
8 8
         <el-form-item label="补助类型" prop="subsidyType">
9 9
           <el-select v-model="formData.subsidyType" placeholder="请选择补助类型">
10
-            <el-option
11
-                v-for="dict in SUBTYPE"
12
-                :key="dict.value"
13
-                :label="dict.label"
14
-                :value="dict.value"
15
-            ></el-option>
10
+            <el-option v-for="dict in SUBTYPE" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
16 11
           </el-select>
17 12
         </el-form-item>
18 13
         <el-form-item label="补助金额" prop="fillMoney">
19 14
           <el-input v-model="formData.fillMoney" placeholder="请输入补助金额" />
20 15
         </el-form-item>
21
-        <el-form-item label="预计到账时间" prop="fillDate" label-width="108px">
16
+        <el-form-item label="预计到账时间" prop="fillDate" label-width="120px">
22 17
           <el-date-picker v-model="formData.fillDate" clearable type="date" value-format="YYYY-MM-DD HH:mm:ss" placeholder="请选择预计到账时间">
23 18
           </el-date-picker>
24 19
         </el-form-item>
25 20
         <el-form-item label="入账钱包" prop="bagCode">
26 21
           <el-select v-model="formData.bagCode" placeholder="请选择入账钱包">
27
-            <el-option
28
-                v-for="dict in CARDBAGTYPE"
29
-                :key="dict.value"
30
-                :label="dict.label"
31
-                :value="parseInt(dict.value)"
32
-            ></el-option>
22
+            <el-option v-for="dict in CARDBAGTYPE" :key="dict.value" :label="dict.label" :value="parseInt(dict.value)"></el-option>
33 23
           </el-select>
34 24
         </el-form-item>
35 25
         <el-form-item label="补助说明" prop="remark">
36 26
           <el-input v-model="formData.remark" placeholder="请输入补助说明" />
37 27
         </el-form-item>
38 28
       </el-form>
39
-      <el-divider/>
29
+      <el-divider />
40 30
 
41 31
       <el-form ref="queryFormRef" :model="itemQuery" :inline="true" label-width="80px" class="-mb-15px">
42
-          <el-form-item label="人员名称" prop="realName">
43
-            <el-input v-model="itemQuery.realName" placeholder="请输入人员姓名" clearable style="width: 240px" @keyup.enter="handleQuery" />
44
-          </el-form-item>
45
-          <el-form-item label="部门名称" prop="deptName">
46
-            <el-input v-model="itemQuery.deptName" placeholder="请输入部门姓名" clearable style="width: 240px" @keyup.enter="handleQuery" />
47
-          </el-form-item>
48
-          <el-form-item>
49
-            <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
50
-            <el-button icon="Refresh" @click="resetQuery">重置</el-button>
51
-          </el-form-item>
52
-          <el-form-item>
53
-            <el-button v-if="visible" v-hasPermi="['subsidy:ptSubsidy:add']" type="primary" plain icon="Plus" @click="openWindowDailog()">新增</el-button>
54
-            <el-button v-if="visible" v-hasPermi="['subsidy:ptSubsidy:remove']" type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">删除</el-button>
55
-          </el-form-item>
32
+        <el-form-item label="人员名称" prop="realName">
33
+          <el-input v-model="itemQuery.realName" placeholder="请输入人员姓名" clearable style="width: 240px" @keyup.enter="handleQuery" />
34
+        </el-form-item>
35
+        <el-form-item label="部门名称" prop="deptName">
36
+          <el-input v-model="itemQuery.deptName" placeholder="请输入部门姓名" clearable style="width: 240px" @keyup.enter="handleQuery" />
37
+        </el-form-item>
38
+        <el-form-item>
39
+          <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
40
+          <el-button icon="Refresh" @click="resetQuery">重置</el-button>
41
+        </el-form-item>
42
+        <el-form-item>
43
+          <el-button v-if="visible" v-hasPermi="['subsidy:ptSubsidy:add']" type="primary" plain icon="Plus" @click="openWindowDailog()"
44
+            >新增</el-button
45
+          >
46
+          <el-button
47
+            v-if="visible"
48
+            v-hasPermi="['subsidy:ptSubsidy:remove']"
49
+            type="danger"
50
+            plain
51
+            icon="Delete"
52
+            :disabled="multiple"
53
+            @click="handleDelete()"
54
+            >删除</el-button
55
+          >
56
+        </el-form-item>
56 57
       </el-form>
57 58
 
58
-      <br><br>
59
+      <br /><br />
59 60
       <el-table v-loading="loading" :data="formData.ptSubsidyItemList" @selection-change="handleSelectionChange">
60 61
         <el-table-column type="selection" width="35" align="center" />
61
-        <el-table-column type="index" width="50" label="序号"/>
62
+        <el-table-column type="index" width="70" label="序号" />
62 63
         <el-table-column v-if="false" label="ID" align="center" prop="itemId" />
63 64
         <el-table-column v-if="false" label="mainId" align="center" prop="mainId" />
64 65
         <el-table-column label="工号" align="center" prop="userNumb" />
65 66
         <el-table-column label="姓名" align="center" prop="realName" />
66 67
         <el-table-column label="部门" align="center" prop="deptName" />
67 68
         <el-table-column label="补助金额" align="center" prop="fillMoney" />
68
-        <el-table-column label="到账日期" align="center" prop="fillDate" >
69
+        <el-table-column label="到账日期" align="center" prop="fillDate">
69 70
           <template #default="scope">
70 71
             <span>{{ parseTime(scope.row.fillDate, '{y}-{m}-{d}') }}</span>
71 72
           </template>
@@ -88,7 +89,7 @@
88 89
 import * as PtSubsidyApi from '@/api/cardCenter/subsidy/ptSubsidy';
89 90
 import * as PtSubsidyItemApi from '@/api/cardCenter/subsidy/ptSubsidyitem';
90 91
 import { PtSubsidyForm } from '@/api/cardCenter/subsidy/ptSubsidy/types';
91
-import { PtSubsidyitemVO} from '@/api/cardCenter/subsidy/ptSubsidyitem/types';
92
+import { PtSubsidyitemVO } from '@/api/cardCenter/subsidy/ptSubsidyitem/types';
92 93
 import { useI18n } from 'vue-i18n';
93 94
 
94 95
 defineOptions({ name: 'PtSubsidyForm' });
@@ -128,7 +129,7 @@ const formData = ref<PtSubsidyForm>({
128 129
   auditUser: undefined,
129 130
   auditDate: undefined,
130 131
   remark: '',
131
-  ptSubsidyItemList: [],
132
+  ptSubsidyItemList: []
132 133
 });
133 134
 // 表单校验规则
134 135
 const formRules = reactive({
@@ -137,7 +138,7 @@ const formRules = reactive({
137 138
   subsidyType: [{ required: true, message: '补助类型不能为空', trigger: 'change' }],
138 139
   fillMoney: [{ required: true, message: '补助金额不能为空', trigger: 'blur' }],
139 140
   fillDate: [{ required: true, message: '预计到账时间不能为空', trigger: 'blur' }],
140
-  bagCode: [{ required: true, message: '入账钱包不能为空', trigger: 'change' }],
141
+  bagCode: [{ required: true, message: '入账钱包不能为空', trigger: 'change' }]
141 142
 });
142 143
 
143 144
 /** 当前组件方法 */
@@ -164,7 +165,6 @@ const open = async (type: string, id?: number, isEdit?: boolean) => {
164 165
 };
165 166
 /** 表单重置 */
166 167
 const resetForm = () => {
167
-  
168 168
   formData.value = {
169 169
     mainId: undefined,
170 170
     subsidyName: PtSubsidyApi.getSubsidyName(),
@@ -177,7 +177,7 @@ const resetForm = () => {
177 177
     auditUser: undefined,
178 178
     auditDate: undefined,
179 179
     remark: '',
180
-    ptSubsidyItemList: [],
180
+    ptSubsidyItemList: []
181 181
   };
182 182
   formRef.value?.resetFields();
183 183
 };
@@ -190,7 +190,7 @@ const emit = defineEmits(['success']);
190 190
 /** 提交按钮 */
191 191
 const submitForm = async () => {
192 192
   // 校验表单
193
-  if (!formRef) return;
193
+  if (!formRef.value) return;
194 194
   const valid = await formRef.value?.validate();
195 195
   if (!valid) return;
196 196
   // 提交请求
@@ -225,16 +225,16 @@ const multiple = ref(true);
225 225
 const total = ref(0);
226 226
 //查询补助明细列表
227 227
 const itemQuery = reactive({
228
-    pageNum: 1,
229
-    pageSize: 10,
230
-    mainId: undefined,
231
-    realName: undefined,
232
-    deptName: undefined,
233
-    params: {}
234
-  });
228
+  pageNum: 1,
229
+  pageSize: 10,
230
+  mainId: undefined,
231
+  realName: undefined,
232
+  deptName: undefined,
233
+  params: {}
234
+});
235 235
 const getList = async () => {
236 236
   loading.value = true;
237
-  if(itemQuery.mainId){
237
+  if (itemQuery.mainId) {
238 238
     const res = await PtSubsidyItemApi.listPtSubsidyitem(itemQuery);
239 239
     formData.value.ptSubsidyItemList = res.rows;
240 240
     total.value = res.total;
@@ -275,16 +275,16 @@ import UserAccountSelect from '@/components/UserAccountSelect/index.vue';
275 275
 
276 276
 /**新增按钮弹窗 */
277 277
 const userAccountSelect = ref();
278
-const openWindowDailog = () =>{
278
+const openWindowDailog = () => {
279 279
   userAccountSelect.value.open('选择发放补助人员', formData.value.ptSubsidyItemList);
280
-}
280
+};
281 281
 
282 282
 const selectUser = (data) => {
283
-  formData.value.ptSubsidyItemList = data
284
-  console.log(formData.value.ptSubsidyItemList)
285
-  formData.value.ptSubsidyItemList.forEach(e => {
286
-    e.fillMoney = formData.value.fillMoney
287
-    e.fillDate = formData.value.fillDate
283
+  formData.value.ptSubsidyItemList = data;
284
+  console.log(formData.value.ptSubsidyItemList);
285
+  formData.value.ptSubsidyItemList.forEach((e) => {
286
+    e.fillMoney = formData.value.fillMoney;
287
+    e.fillDate = formData.value.fillDate;
288 288
   });
289 289
 };
290 290