From 708f980f0f351bfe47d7936151bf52ed4d4a7bc4 Mon Sep 17 00:00:00 2001
From: wangzhibo <wangzhibo@shsening.com>
Date: 星期六, 18 七月 2026 18:00:56 +0800
Subject: [PATCH] 业务表支持部门数据权限

---
 src/modules/basicdata/controller/admin/iot.ts          |   10 ++
 src/modules/basicdata/controller/admin/buyer.ts        |   14 +++
 src/modules/push/entity/vehiclegps.ts                  |    6 +
 src/modules/basicdata/controller/admin/vehicle.ts      |   10 ++
 src/modules/operation/controller/admin/wastesale.ts    |    9 +
 src/modules/report/controller/admin/dailydepartment.ts |   10 ++
 src/modules/push/controller/admin/siteweight.ts        |   11 ++
 src/modules/basicdata/controller/admin/site.ts         |   12 ++
 src/modules/report/controller/admin/dailysite.ts       |   21 ++++
 src/modules/base/middleware/with-dept-filter-where.ts  |   28 +++++++
 src/modules/basicdata/controller/admin/sorter.ts       |   15 +++
 src/modules/base/middleware/authority.ts               |   12 ++
 src/modules/report/entity/dailysite.ts                 |    6 +
 src/modules/report/service/tasksiteservice.ts          |    2 
 src/modules/basicdata/controller/admin/driver.ts       |   10 ++
 src/modules/push/controller/admin/vehiclegps.ts        |   22 ++++-
 16 files changed, 181 insertions(+), 17 deletions(-)

diff --git a/src/modules/base/middleware/authority.ts b/src/modules/base/middleware/authority.ts
index c2cea8a..2515f94 100644
--- a/src/modules/base/middleware/authority.ts
+++ b/src/modules/base/middleware/authority.ts
@@ -59,7 +59,17 @@
             ctx.status = 401;
             throw new CoolCommException('鐧诲綍澶辨晥~', ctx.status);
           }
-        } catch (error) {}
+          // 娣诲姞鐢ㄦ埛鐨勬暟鎹潈闄�
+          if (ctx.admin && ctx.admin.userId) {
+            const departmentIds = await this.midwayCache.get(
+              `admin:department:${ctx.admin.userId}`
+            );
+            ctx.admin.departmentIds = Array.isArray(departmentIds)
+              ? departmentIds
+              : [];
+          }
+
+        } catch (error) { }
         // 浣跨敤matchUrl鏂规硶鏉ユ鏌RL鏄惁搴旇琚拷鐣�
         const isIgnored = this.ignoreUrls.some(pattern =>
           this.utils.matchUrl(pattern, url)
diff --git a/src/modules/base/middleware/with-dept-filter-where.ts b/src/modules/base/middleware/with-dept-filter-where.ts
new file mode 100644
index 0000000..dbb6a4d
--- /dev/null
+++ b/src/modules/base/middleware/with-dept-filter-where.ts
@@ -0,0 +1,28 @@
+import { Context } from '@midwayjs/koa';
+
+
+export interface DeptFilterOptions {
+  alias?: string;
+  field?: string;
+}
+
+export async function WithDeptFilterWhere(
+  ctx: Context,
+  options: DeptFilterOptions = {}
+): Promise<any[][]> {
+  const { alias = 'a', field = 'departmentId' } = options;
+  const admin = ctx.admin;
+  if (!admin || admin.username == 'admin') return [];
+
+  const deptIds = admin.departmentIds;
+  if (!Array.isArray(deptIds) || deptIds.length === 0) {
+    return [['1 = 0']];
+  }
+
+  return [
+    [
+      `${alias}.${field} IN (:departmentIds)`,
+      { departmentIds: deptIds },
+    ],
+  ];
+}
\ No newline at end of file
diff --git a/src/modules/basicdata/controller/admin/buyer.ts b/src/modules/basicdata/controller/admin/buyer.ts
index 1359b0f..8a0c2a2 100644
--- a/src/modules/basicdata/controller/admin/buyer.ts
+++ b/src/modules/basicdata/controller/admin/buyer.ts
@@ -2,6 +2,7 @@
 import { BasicdataBuyerEntity } from '../../entity/buyer';
 import { BasicdataBuyerService } from '../../service/buyer';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 璐拱鏂圭鐞�
@@ -12,7 +13,7 @@
   service: BasicdataBuyerService,
   pageQueryOp: {
     fieldEq: ['a.departmentId', 'a.name', 'a.contact'],
-    fieldLike: ['a.name','a.address'],
+    fieldLike: ['a.name', 'a.address'],
     select: ['a.*', 'b.name AS departmentName'],
     join: [
       {
@@ -22,6 +23,15 @@
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
-export class AdminOperationBuyerController extends BaseController {}
\ No newline at end of file
+export class AdminOperationBuyerController extends BaseController { }
\ No newline at end of file
diff --git a/src/modules/basicdata/controller/admin/driver.ts b/src/modules/basicdata/controller/admin/driver.ts
index 8bb26e6..ede75d6 100644
--- a/src/modules/basicdata/controller/admin/driver.ts
+++ b/src/modules/basicdata/controller/admin/driver.ts
@@ -3,6 +3,7 @@
 import { BasicdataDriverEntity } from '../../entity/driver';
 import { BasicdataDriverService } from '../../service/driver';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 杞繍鍙告満
@@ -28,6 +29,15 @@
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
 
   },
 })
diff --git a/src/modules/basicdata/controller/admin/iot.ts b/src/modules/basicdata/controller/admin/iot.ts
index 7b42284..4c1e25e 100644
--- a/src/modules/basicdata/controller/admin/iot.ts
+++ b/src/modules/basicdata/controller/admin/iot.ts
@@ -3,6 +3,7 @@
 import { BasicdataIotEntity } from '../../entity/iot';
 import { BasicdataIotService } from '../../service/iot';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 鏁版嵁婧愬畾涔変俊鎭悗鍙扮鐞�
@@ -23,6 +24,15 @@
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
 export class AdminBasicdataIotController extends BaseController {
diff --git a/src/modules/basicdata/controller/admin/site.ts b/src/modules/basicdata/controller/admin/site.ts
index 87b0791..23112ad 100644
--- a/src/modules/basicdata/controller/admin/site.ts
+++ b/src/modules/basicdata/controller/admin/site.ts
@@ -2,6 +2,7 @@
 import { BasicdataSiteEntity } from '../../entity/site';
 import { BasicdataSiteService } from '../../service/site';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 绔欑偣淇℃伅鍚庡彴绠$悊
@@ -22,6 +23,15 @@
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
-export class AdminBasicdataSiteController extends BaseController {}
+export class AdminBasicdataSiteController extends BaseController { }
diff --git a/src/modules/basicdata/controller/admin/sorter.ts b/src/modules/basicdata/controller/admin/sorter.ts
index 1cf784e..f828211 100644
--- a/src/modules/basicdata/controller/admin/sorter.ts
+++ b/src/modules/basicdata/controller/admin/sorter.ts
@@ -3,6 +3,8 @@
 import { BasicdataSorterService } from '../../service/sorter';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
 import { BasicdataSiteEntity } from '../../entity/site';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
+
 /**
  * 鍒嗘嫞浜哄憳鍚庡彴绠$悊
  */
@@ -30,10 +32,19 @@
       {
         entity: BasicdataSiteEntity,
         alias: 'c',
-        condition: 'a.workSiteId = c.businessId',   
+        condition: 'a.workSiteId = c.businessId',
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
-export class AdminBasicdataSorterController extends BaseController {}
+export class AdminBasicdataSorterController extends BaseController { }
diff --git a/src/modules/basicdata/controller/admin/vehicle.ts b/src/modules/basicdata/controller/admin/vehicle.ts
index 54be2fa..2ff1422 100644
--- a/src/modules/basicdata/controller/admin/vehicle.ts
+++ b/src/modules/basicdata/controller/admin/vehicle.ts
@@ -2,6 +2,7 @@
 import { BasicdataVehicleEntity } from '../../entity/vehicle';
 import { BasicdataVehicleService } from '../../service/vehicle';
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 杞繍杞﹁締鍚庡彴绠$悊
@@ -22,6 +23,15 @@
         type: 'leftJoin',
       }
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
 export class AdminBasicdataVehicleController extends BaseController {}
diff --git a/src/modules/operation/controller/admin/wastesale.ts b/src/modules/operation/controller/admin/wastesale.ts
index be277fe..6a24db6 100644
--- a/src/modules/operation/controller/admin/wastesale.ts
+++ b/src/modules/operation/controller/admin/wastesale.ts
@@ -7,6 +7,7 @@
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
 import { BasicdataSiteEntity } from '../../../basicdata/entity/site'
 import { BasicdataWastetypeEntity } from '../../../basicdata/entity/wastetype';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 鍙洖鏀剁墿鏀剁泭绠$悊
@@ -64,11 +65,13 @@
     fieldEq: ['a.departmentId', 'a.collectionPointId'],
     where: async (ctx) => {
       const { startTime, endTime } = ctx.request.body;
-      const condition = [];
+      const conditions: any[][] = [];
       if (startTime && endTime) {
-        condition.push(['a.dateTime BETWEEN :startTime AND :endTime', { startTime, endTime }]);
+        conditions.push(['a.dateTime BETWEEN :startTime AND :endTime', { startTime, endTime }]);
       }
-      return condition;
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      return conditions;
     },
   },
 })
diff --git a/src/modules/push/controller/admin/siteweight.ts b/src/modules/push/controller/admin/siteweight.ts
index 4176185..3a27caa 100644
--- a/src/modules/push/controller/admin/siteweight.ts
+++ b/src/modules/push/controller/admin/siteweight.ts
@@ -4,6 +4,8 @@
 import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department';
 import {BasicdataWastetypeEntity} from '../../../basicdata/entity/wastetype'
 import { BasicdataSiteEntity } from '../../../basicdata/entity/site';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
+
 /**
  * 涓氬姟绉伴噸鏁版嵁绠$悊
  */
@@ -41,6 +43,15 @@
         type: 'leftJoin',
       },
     ],
+    where: async ctx => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      // 鍏朵粬鍏宠仈琛紙涓句緥锛�
+      // conditions.push(...(await deptFilterWhere(ctx, 'd', 'id')));
+
+      return conditions;
+    },
   },
 })
 export class AdminPushSiteweightController extends BaseController {}
diff --git a/src/modules/push/controller/admin/vehiclegps.ts b/src/modules/push/controller/admin/vehiclegps.ts
index f7d430f..3545e19 100644
--- a/src/modules/push/controller/admin/vehiclegps.ts
+++ b/src/modules/push/controller/admin/vehiclegps.ts
@@ -2,6 +2,8 @@
 import { CoolController, BaseController } from '@cool-midway/core';
 import { PushVehicleGpsEntity } from '../../entity/vehiclegps';
 import { PushVehicleGpsService } from '../../service/vehiclegps';
+import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department'
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 杞﹁浇鐩戞帶GPS浣嶇疆鏁版嵁
@@ -13,16 +15,28 @@
   pageQueryOp: {
     keyWordLikeFields: ['a.sn', 'a.vehicleNo'],
     fieldEq: ['a.status'],
+    select: ['a.*', 'b.name AS departmentName'],
+    join: [
+      {
+        entity: BaseSysDepartmentEntity,
+        alias: 'b',
+        condition: 'a.departmentId = b.id',
+        type: 'leftJoin',
+      },
+    ],
     where: async (ctx) => {
       const { createDate, gpsTime } = ctx.request.body;
-      const condition = [];
+      const conditions: any[][] = [];
       if (createDate && createDate.length === 2) {
-        condition.push(['a.createDate BETWEEN :createStartDate AND :createEndDate', { createStartDate: createDate[0], createEndDate: createDate[1] }]);
+        conditions.push(['a.createDate BETWEEN :createStartDate AND :createEndDate', { createStartDate: createDate[0], createEndDate: createDate[1] }]);
       }
       if (gpsTime && gpsTime.length === 2) {
-        condition.push(['a.gpsTime BETWEEN :gpsStartDate AND :gpsEndDate', { gpsStartDate: gpsTime[0], gpsEndDate: gpsTime[1] }]);
+        conditions.push(['a.gpsTime BETWEEN :gpsStartDate AND :gpsEndDate', { gpsStartDate: gpsTime[0], gpsEndDate: gpsTime[1] }]);
       }
-      return condition;
+
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+
+      return conditions;
     }
   }
 })
diff --git a/src/modules/push/entity/vehiclegps.ts b/src/modules/push/entity/vehiclegps.ts
index 5874af6..3f21e07 100644
--- a/src/modules/push/entity/vehiclegps.ts
+++ b/src/modules/push/entity/vehiclegps.ts
@@ -21,6 +21,12 @@
   @Column({ comment: '杞︾墝鍙�', nullable: true })
   vehicleNo: string;
 
+   @Index()
+  @Column({ comment: '褰掑睘鍗曚綅' })
+  departmentId: number;
+
+  departmentName: string;
+
   @Column({ comment: 'GPS瀹氫綅鏃堕棿', nullable: true })
   gpsTime: Date;
 
diff --git a/src/modules/report/controller/admin/dailydepartment.ts b/src/modules/report/controller/admin/dailydepartment.ts
index 0ffc292..1dbd914 100644
--- a/src/modules/report/controller/admin/dailydepartment.ts
+++ b/src/modules/report/controller/admin/dailydepartment.ts
@@ -1,6 +1,7 @@
 import { CoolController, BaseController } from '@cool-midway/core';
 import { ReportDailyDepartmentEntity } from '../../entity/dailydepartment';
 import { ReportDailyDepartmentService } from '../../service/dailydepartment';
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 姣忔棩閮ㄩ棬姹囨�绘帶鍒跺櫒
@@ -11,7 +12,12 @@
   service: ReportDailyDepartmentService,
   pageQueryOp: {
     keyWordLikeFields: ['a.departmentName'],
-    fieldEq: ['a.date', 'a.departmentId']
+    fieldEq: ['a.date', 'a.departmentId'],
+    where: async (ctx) => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+      return conditions;
+    }
   }
 })
-export class AdminReportDailydepartmentController extends BaseController {}
\ No newline at end of file
+export class AdminReportDailydepartmentController extends BaseController { }
\ No newline at end of file
diff --git a/src/modules/report/controller/admin/dailysite.ts b/src/modules/report/controller/admin/dailysite.ts
index 7658a8d..2907c7a 100644
--- a/src/modules/report/controller/admin/dailysite.ts
+++ b/src/modules/report/controller/admin/dailysite.ts
@@ -1,6 +1,8 @@
 import { CoolController, BaseController } from '@cool-midway/core';
 import { ReportDailysiteEntity } from '../../entity/dailysite';
 import { ReportDailysiteService } from '../../service/dailysite';
+import { BaseSysDepartmentEntity } from '../../../base/entity/sys/department'
+import { WithDeptFilterWhere } from '../../../base/middleware/with-dept-filter-where'
 
 /**
  * 姣忔棩绔欑偣姹囨�绘帶鍒跺櫒
@@ -11,7 +13,22 @@
   service: ReportDailysiteService,
   pageQueryOp: {
     keyWordLikeFields: ['a.siteName'],
-    fieldEq: ['a.date', 'a.siteId']
+    fieldEq: ['a.date', 'a.siteId'],
+    select: ['a.*', 'b.name AS departmentName'],
+        join: [
+          {
+            entity: BaseSysDepartmentEntity,
+            alias: 'b',
+            condition: 'a.departmentId = b.id',
+            type: 'leftJoin',
+          },
+        ],
+
+    where: async (ctx) => {
+      const conditions: any[][] = [];
+      conditions.push(...(await WithDeptFilterWhere(ctx, { alias: 'a', field: 'departmentId' })));
+      return conditions;
+    }
   }
 })
-export class AdminReportDailysiteController extends BaseController {}
\ No newline at end of file
+export class AdminReportDailysiteController extends BaseController { }
\ No newline at end of file
diff --git a/src/modules/report/entity/dailysite.ts b/src/modules/report/entity/dailysite.ts
index f29bd5c..7c00c00 100644
--- a/src/modules/report/entity/dailysite.ts
+++ b/src/modules/report/entity/dailysite.ts
@@ -19,6 +19,12 @@
   @Column({ comment: '绔欑偣鍚嶇О' })
   siteName: string;
 
+  @Index()
+  @Column({ comment: '閮ㄩ棬ID' })
+  departmentId: number;
+
+  departmentName: string;
+
   @Column({ comment: '鎬婚噸閲�', type: 'decimal', precision: 15, scale: 2, default: 0.00 })
   weightTotal: number;
 
diff --git a/src/modules/report/service/tasksiteservice.ts b/src/modules/report/service/tasksiteservice.ts
index 3fce08c..0e3efe4 100644
--- a/src/modules/report/service/tasksiteservice.ts
+++ b/src/modules/report/service/tasksiteservice.ts
@@ -42,6 +42,7 @@
             .select([
                 'site.id AS siteId',             // 鎷挎渶鏂扮殑鑷ID浣滀负姣忔棩琛ㄧ殑 siteId
                 'site.businessName AS siteName', // 姘歌繙鎷垮綋鍓嶅悗鍙版渶鏂扮殑绔欑偣鍚嶇О锛岄槻姝㈣澶囦紶鏃у悕绉�
+                'site.departmentId AS departmentId',
                 'weight.weight AS weight',
                 'weight.garbageType AS garbageType'
             ])
@@ -74,6 +75,7 @@
                     date: targetDate,
                     siteId: siteId,
                     siteName: row.siteName,
+                    departmentId:row.departmentId,
                     weightTotal: 0, timeTotal: 0, carbonTotal: 0
                 };
                 // 鍔ㄦ�佸垵濮嬪寲瀹借〃閲屽悇瀛愮被鍨嬬殑 0 鍊�

--
Gitblit v1.9.1