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