wangzhibo
6 天以前 3f249e399659dcd09d3fe58071b146e50e45c17f
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
import { Provide } from "@midwayjs/core";
import { BaseService, CoolTransaction } from "@cool-midway/core";
import { InjectEntityModel } from "@midwayjs/typeorm";
import { Repository, QueryRunner, EntityManager } from "typeorm";
import { RecycleItemEntity } from "../entity/recycleitem";
import { RecycleOrderEntity } from "../entity/recycleorder";
import { RecycleOrderItemEntity } from '../entity/recycleorderitem';
import { UserInfoEntity } from '../../user/entity/info';
import { RecycleTransactionEntity } from '../entity/transaction';
 
 
/**
 * 回收物品订单服务
 */
@Provide()
export class RecycleOrderService extends BaseService {
  @InjectEntityModel(RecycleOrderEntity)
  recycleOrderEntity: Repository<RecycleOrderEntity>;
 
  @InjectEntityModel(RecycleItemEntity)
  recycleItemEntity: Repository<RecycleItemEntity>;
 
  @InjectEntityModel(RecycleOrderItemEntity)
  recycleOrderItemEntity: Repository<RecycleOrderItemEntity>;
 
  @InjectEntityModel(RecycleTransactionEntity)
  recycleTransactionEntity: Repository<RecycleTransactionEntity>;
 
  /**
   * 重写新增,处理订单及详情
   */
  @CoolTransaction()
  async add(param: any, queryRunner?: QueryRunner) {
    const { items, ...orderData } = param;
    // 保存订单
    const order = await queryRunner?.manager.save(RecycleOrderEntity, orderData);
    // 保存详情
    if (items && items.length > 0) {
      const itemEntities = items.map(e => {
        return {
          ...e,
          orderId: order.id,
        };
      });
      await queryRunner?.manager.save(RecycleItemEntity, itemEntities);
    }
    return order;
  }
 
  /**
   * 重写更新
   */
  @CoolTransaction()
  async update(param: any, queryRunner?: QueryRunner) {
    const { items, id, ...orderData } = param;
    await queryRunner?.manager.update(RecycleOrderEntity, id, orderData);
    if (items) {
      // 先删除旧详情再插入新详情(简单处理)
      await queryRunner?.manager.delete(RecycleItemEntity, { orderId: id });
      const itemEntities = items.map(e => {
        return {
          ...e,
          orderId: id,
        };
      });
      await queryRunner?.manager.save(RecycleItemEntity, itemEntities);
    }
  }
 
  /**
 * 重写删除逻辑,同步删除订单项
 */
  @CoolTransaction()
  async delete(ids: number[], queryRunner?: QueryRunner) {
    for (const id of ids) {
      const order = await this.recycleOrderEntity.findOneBy({ id });
      if (order) {
        await queryRunner?.manager.delete(RecycleOrderItemEntity, {
          orderNo: order.orderNo,
        });
      }
    }
    await queryRunner?.manager.delete(RecycleOrderEntity, ids);
  }
 
  @CoolTransaction()
  async saveWithSummary(orderNo: string, items: any[]) {
 
 
    // 1️⃣ 先删掉旧明细
    await RecycleOrderItemEntity.delete({ orderNo });
 
    // 2️⃣ 重新插入
    const newItems = items.map(i => ({
      ...i,
      orderNo
    }));
    console.log(newItems)
    await RecycleOrderItemEntity.save(newItems);
 
    // 3️⃣ 汇总
    const all = await RecycleOrderItemEntity.find({
      where: { orderNo }
    });
 
    const totalWeight = all.reduce((s, i) => s + Number(i.weight), 0);
    const totalCarbonPoint = all.reduce((s, i) => s + Number(i.carbonPoint), 0);
    const totalAmount = all.reduce((s, i) => s + Number(i.amount), 0);
 
    await RecycleOrderEntity.update(
      { orderNo },
      { totalWeight, totalCarbonPoint, totalAmount }
    );
 
    // 5️⃣ 更新用户碳余额
    const order = await RecycleOrderEntity.findOne({
      where: { orderNo },
      select: ['campusUserId']
    });
 
    if (order?.campusUserId) {
      await UserInfoEntity.getRepository().increment(
        { unionid: order.campusUserId },
        'carbonBalance',
        totalCarbonPoint
      );
    }
 
    // 7️⃣ ✅ 用 add() 写流水(重点)
    await RecycleTransactionEntity.save({
      userId: order?.campusUserId,
      departmentId: order?.departmentId,
      type: '收入',
      amount: totalCarbonPoint,
      sourceType: '回收',
      remark: `回收订单 ${orderNo} 获得碳积分`,
      orderId: orderNo
    });
 
  };
 
}