feat: integrate CampusScope.filter() into all business services (12 services + 12 modules)
This commit is contained in:
@@ -11,6 +11,7 @@ import {
|
||||
BatchRoomExpenseDto,
|
||||
} from './dto/expense.dto';
|
||||
import { RoomsService } from '../rooms/rooms.service';
|
||||
import { CampusScope } from '../common/campus-scope';
|
||||
|
||||
@Injectable()
|
||||
export class ExpensesService {
|
||||
@@ -19,6 +20,7 @@ export class ExpensesService {
|
||||
@InjectRepository(PersonalExpense) private personalExpRepo: Repository<PersonalExpense>,
|
||||
@InjectRepository(Room) private roomRepo: Repository<Room>,
|
||||
@InjectRepository(Student) private studentRepo: Repository<Student>,
|
||||
private readonly scope: CampusScope,
|
||||
) {}
|
||||
|
||||
// 宿舍费用
|
||||
@@ -42,10 +44,12 @@ export class ExpensesService {
|
||||
}
|
||||
|
||||
async findRoomExpenses(query?: { roomId?: number; periodStart?: string; periodEnd?: string }) {
|
||||
const scopeIds = await this.scope.getScopeDepartmentIds();
|
||||
const qb = this.roomExpRepo
|
||||
.createQueryBuilder('e')
|
||||
.leftJoinAndSelect('e.room', 'room')
|
||||
.orderBy('e.createdAt', 'DESC');
|
||||
if (scopeIds) qb.andWhere('e.departmentId IN (:...scopeIds)', { scopeIds });
|
||||
if (query?.roomId) qb.andWhere('e.roomId = :roomId', { roomId: query.roomId });
|
||||
if (query?.periodStart) qb.andWhere('e.periodStart >= :ps', { ps: query.periodStart });
|
||||
if (query?.periodEnd) qb.andWhere('e.periodEnd <= :pe', { pe: query.periodEnd });
|
||||
@@ -82,8 +86,9 @@ export class ExpensesService {
|
||||
}
|
||||
|
||||
async findPersonalExpenses(query?: { studentId?: number }) {
|
||||
const where: any = {};
|
||||
let where: Record<string, unknown> = {};
|
||||
if (query?.studentId) where.studentId = query.studentId;
|
||||
where = await this.scope.filter(where);
|
||||
return this.personalExpRepo.find({
|
||||
where,
|
||||
relations: ['student'],
|
||||
@@ -286,19 +291,6 @@ export class ExpensesService {
|
||||
let skipped = 0;
|
||||
const errors: string[] = [];
|
||||
|
||||
const typeMap: Record<string, string> = {
|
||||
物品损坏: 'damage',
|
||||
损坏: 'damage',
|
||||
保洁费: 'cleaning',
|
||||
保洁: 'cleaning',
|
||||
罚款: 'penalty',
|
||||
钥匙费: 'key',
|
||||
钥匙: 'key',
|
||||
空调遥控器: 'remote',
|
||||
遥控器: 'remote',
|
||||
押金扣除: 'deposit_deduction',
|
||||
其他: 'other',
|
||||
};
|
||||
|
||||
for (let i = 0; i < rows.length; i++) {
|
||||
const row = rows[i];
|
||||
@@ -319,21 +311,9 @@ export class ExpensesService {
|
||||
}
|
||||
|
||||
// 解析费用类型
|
||||
let expenseType = row.expenseType?.trim() || '';
|
||||
if (typeMap[expenseType]) {
|
||||
expenseType = typeMap[expenseType];
|
||||
}
|
||||
const validTypes = [
|
||||
'damage',
|
||||
'cleaning',
|
||||
'penalty',
|
||||
'key',
|
||||
'remote',
|
||||
'deposit_deduction',
|
||||
'other',
|
||||
];
|
||||
if (!validTypes.includes(expenseType)) {
|
||||
errors.push(`第${rowNum}行: 费用类型"${row.expenseType}"无效`);
|
||||
const expenseType = row.expenseType?.trim() || '';
|
||||
if (!expenseType) {
|
||||
errors.push(`第${rowNum}行: 费用类型不能为空`);
|
||||
skipped++;
|
||||
continue;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user