user-order-goods.mt.service.ts 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. import { DataSource } from 'typeorm';
  2. import { OrderGoodsMt } from '../entities/order-goods.mt.entity';
  3. import { GenericCrudService } from '@d8d/shared-crud';
  4. export class UserOrderGoodsMtService extends GenericCrudService<OrderGoodsMt> {
  5. constructor(dataSource: DataSource) {
  6. super(dataSource, OrderGoodsMt, {
  7. userTracking: {
  8. createdByField: 'createdBy',
  9. updatedByField: 'updatedBy'
  10. },
  11. tenantOptions: { enabled: true, tenantIdField: 'tenantId' }
  12. });
  13. }
  14. /**
  15. * 获取当前用户的订单商品列表
  16. */
  17. async getUserOrderGoodsList(
  18. page: number = 1,
  19. pageSize: number = 10,
  20. keyword?: string,
  21. userId?: string | number,
  22. tenantId?: number
  23. ): Promise<[OrderGoodsMt[], number]> {
  24. const skip = (page - 1) * pageSize;
  25. const query = this.repository.createQueryBuilder('orderGoods')
  26. .leftJoinAndSelect('orderGoods.order', 'order')
  27. .leftJoinAndSelect('orderGoods.goods', 'goods')
  28. .leftJoinAndSelect('orderGoods.supplier', 'supplier')
  29. .leftJoinAndSelect('orderGoods.imageFile', 'imageFile');
  30. // 租户过滤
  31. if (tenantId) {
  32. query.andWhere('orderGoods.tenantId = :tenantId', { tenantId });
  33. }
  34. // 数据权限过滤:只返回当前用户订单的商品
  35. if (userId) {
  36. query.andWhere('order.userId = :userId', { userId });
  37. }
  38. // 关键词搜索
  39. if (keyword) {
  40. query.andWhere('(orderGoods.orderNo LIKE :keyword OR orderGoods.goodsName LIKE :keyword)', {
  41. keyword: `%${keyword}%`
  42. });
  43. }
  44. query.skip(skip).take(pageSize).orderBy('orderGoods.id', 'DESC');
  45. return query.getManyAndCount();
  46. }
  47. /**
  48. * 获取当前用户的订单商品详情
  49. */
  50. async getUserOrderGoodsById(id: number, userId?: string | number, tenantId?: number): Promise<OrderGoodsMt | null> {
  51. const orderGoods = await this.repository.findOne({
  52. where: { id, ...(tenantId && { tenantId }) },
  53. relations: ['order', 'goods', 'supplier', 'imageFile']
  54. });
  55. if (!orderGoods) {
  56. return null;
  57. }
  58. // 数据权限验证:检查订单是否属于当前用户
  59. if (userId && orderGoods.order && orderGoods.order.userId !== userId) {
  60. throw new Error('无权访问该订单商品');
  61. }
  62. return orderGoods;
  63. }
  64. /**
  65. * 为当前用户创建订单商品
  66. */
  67. async createUserOrderGoods(data: Partial<OrderGoodsMt>, userId?: string | number, tenantId?: number): Promise<OrderGoodsMt> {
  68. // 验证订单是否属于当前用户
  69. if (userId && data.orderId) {
  70. const orderRepository = this.dataSource.getRepository('OrderMt');
  71. const order = await orderRepository.findOne({
  72. where: { id: data.orderId, ...(tenantId && { tenantId }) },
  73. select: ['userId']
  74. });
  75. if (!order || order.userId !== userId) {
  76. throw new Error('无权为该订单创建商品');
  77. }
  78. }
  79. return this.create(data, userId);
  80. }
  81. /**
  82. * 更新当前用户的订单商品
  83. */
  84. async updateUserOrderGoods(id: number, data: Partial<OrderGoodsMt>, userId?: string | number, tenantId?: number): Promise<OrderGoodsMt | null> {
  85. // 先验证权限
  86. const existing = await this.getUserOrderGoodsById(id, userId, tenantId);
  87. if (!existing) {
  88. return null;
  89. }
  90. return this.update(id, data, userId);
  91. }
  92. /**
  93. * 删除当前用户的订单商品
  94. */
  95. async deleteUserOrderGoods(id: number, userId?: string | number, tenantId?: number): Promise<boolean> {
  96. // 先验证权限
  97. const existing = await this.getUserOrderGoodsById(id, userId, tenantId);
  98. if (!existing) {
  99. return false;
  100. }
  101. return this.delete(id, userId);
  102. }
  103. }