test-data-factory.ts 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. import { DataSource } from 'typeorm';
  2. import { UserEntityMt } from '@d8d/core-module-mt/user-module-mt/entities';
  3. import { OrderMt } from '@d8d/orders-module-mt';
  4. import { MerchantMt } from '@d8d/merchant-module-mt';
  5. import { SupplierMt } from '@d8d/supplier-module-mt';
  6. import { DeliveryAddressMt } from '@d8d/delivery-address-module-mt';
  7. import { AreaEntityMt, AreaLevel } from '@d8d/geo-areas-mt';
  8. import { JWTUtil } from '@d8d/shared-utils';
  9. /**
  10. * 数据概览模块测试数据工厂类
  11. */
  12. export class DataOverviewTestDataFactory {
  13. /**
  14. * 创建测试用户数据
  15. */
  16. static createUserData(overrides: Partial<UserEntityMt> = {}): Partial<UserEntityMt> {
  17. const timestamp = Math.floor(Math.random() * 100000);
  18. return {
  19. username: `test_user_${timestamp}`,
  20. password: 'test_password',
  21. nickname: '测试用户',
  22. registrationSource: 'web',
  23. isDisabled: 0,
  24. ...overrides
  25. };
  26. }
  27. /**
  28. * 在数据库中创建测试用户
  29. */
  30. static async createTestUser(dataSource: DataSource, tenantId: number, overrides: Partial<UserEntityMt> = {}): Promise<UserEntityMt> {
  31. const userData = this.createUserData({ tenantId, ...overrides });
  32. const userRepository = dataSource.getRepository(UserEntityMt);
  33. const user = userRepository.create(userData);
  34. return await userRepository.save(user);
  35. }
  36. /**
  37. * 创建测试商户
  38. */
  39. static async createTestMerchant(dataSource: DataSource, tenantId: number, overrides: Partial<MerchantMt> = {}): Promise<MerchantMt> {
  40. const merchantRepository = dataSource.getRepository(MerchantMt);
  41. const randomNum = Math.floor(Math.random() * 1000000); // 0-999999的随机数
  42. const merchantData: Partial<MerchantMt> = {
  43. tenantId,
  44. name: `测试商户_${randomNum}`,
  45. username: `m${randomNum}`, // 确保不超过20个字符
  46. password: 'test_password',
  47. phone: '13800138000',
  48. realname: '测试联系人',
  49. state: 1, // 1=启用
  50. ...overrides
  51. };
  52. const merchant = merchantRepository.create(merchantData);
  53. return await merchantRepository.save(merchant);
  54. }
  55. /**
  56. * 创建测试供应商
  57. */
  58. static async createTestSupplier(dataSource: DataSource, tenantId: number, overrides: Partial<SupplierMt> = {}): Promise<SupplierMt> {
  59. const supplierRepository = dataSource.getRepository(SupplierMt);
  60. const randomNum = Math.floor(Math.random() * 1000000); // 0-999999的随机数
  61. const supplierData: Partial<SupplierMt> = {
  62. tenantId,
  63. name: `测试供应商_${randomNum}`,
  64. username: `s${randomNum}`, // 确保不超过50个字符
  65. password: 'test_password',
  66. phone: '13800138000',
  67. realname: '测试联系人',
  68. state: 1, // 1=启用
  69. ...overrides
  70. };
  71. const supplier = supplierRepository.create(supplierData);
  72. return await supplierRepository.save(supplier);
  73. }
  74. /**
  75. * 创建测试地区实体
  76. */
  77. static async createTestArea(dataSource: DataSource, tenantId: number, level: AreaLevel = AreaLevel.PROVINCE, overrides: Partial<AreaEntityMt> = {}): Promise<AreaEntityMt> {
  78. const areaRepository = dataSource.getRepository(AreaEntityMt);
  79. const randomNum = Math.floor(Math.random() * 1000000);
  80. const areaData: Partial<AreaEntityMt> = {
  81. tenantId,
  82. name: `测试地区_${randomNum}`,
  83. code: `CODE${randomNum}`,
  84. level,
  85. parentId: null,
  86. isDisabled: 0, // 启用
  87. isDeleted: 0, // 未删除
  88. ...overrides
  89. };
  90. const area = areaRepository.create(areaData);
  91. return await areaRepository.save(area);
  92. }
  93. /**
  94. * 创建测试配送地址
  95. */
  96. static async createTestDeliveryAddress(dataSource: DataSource, tenantId: number, userId: number, overrides: Partial<DeliveryAddressMt> = {}): Promise<DeliveryAddressMt> {
  97. // 创建测试地区实体(省级)
  98. const provinceArea = await this.createTestArea(dataSource, tenantId, AreaLevel.PROVINCE);
  99. const addressRepository = dataSource.getRepository(DeliveryAddressMt);
  100. const addressData: Partial<DeliveryAddressMt> = {
  101. tenantId,
  102. userId,
  103. name: '测试收货人',
  104. phone: '13800138000',
  105. address: '测试详细地址',
  106. receiverProvince: provinceArea.id, // 使用实际地区ID
  107. receiverCity: provinceArea.id, // 简化:使用同一个ID
  108. receiverDistrict: provinceArea.id, // 简化:使用同一个ID
  109. receiverTown: provinceArea.id, // 简化:使用同一个ID
  110. isDefault: 0, // 0=不常用
  111. state: 1, // 1=正常
  112. ...overrides
  113. };
  114. const address = addressRepository.create(addressData);
  115. return await addressRepository.save(address);
  116. }
  117. /**
  118. * 创建测试订单(用于统计数据)
  119. */
  120. static async createTestOrder(
  121. dataSource: DataSource,
  122. tenantId: number,
  123. userId: number,
  124. options: {
  125. merchantId?: number;
  126. supplierId?: number;
  127. addressId?: number;
  128. } = {},
  129. overrides: Partial<OrderMt> = {}
  130. ): Promise<OrderMt> {
  131. const orderRepository = dataSource.getRepository(OrderMt);
  132. const timestamp = Date.now();
  133. const orderNo = `ORD${timestamp}${Math.floor(Math.random() * 1000)}`;
  134. // 创建必需的外键实体(如果未提供)
  135. let merchantId = options.merchantId;
  136. let supplierId = options.supplierId;
  137. let addressId = options.addressId;
  138. if (!merchantId) {
  139. const merchant = await this.createTestMerchant(dataSource, tenantId);
  140. merchantId = merchant.id;
  141. }
  142. if (!supplierId) {
  143. const supplier = await this.createTestSupplier(dataSource, tenantId);
  144. supplierId = supplier.id;
  145. }
  146. if (!addressId) {
  147. const address = await this.createTestDeliveryAddress(dataSource, tenantId, userId);
  148. addressId = address.id;
  149. }
  150. // 默认创建一个已支付的订单,用于统计
  151. const defaultOrder: Partial<OrderMt> = {
  152. tenantId,
  153. orderNo,
  154. userId,
  155. amount: 100.00,
  156. costAmount: 80.00,
  157. payAmount: 100.00,
  158. orderType: 1,
  159. payType: 1, // 1=积分支付(假设为微信支付)
  160. payState: 2, // 2=支付成功
  161. state: 1,
  162. addressId,
  163. merchantId,
  164. supplierId,
  165. createdBy: userId,
  166. updatedBy: userId,
  167. createdAt: new Date(),
  168. updatedAt: new Date()
  169. };
  170. const order = orderRepository.create({
  171. ...defaultOrder,
  172. ...overrides
  173. });
  174. return await orderRepository.save(order);
  175. }
  176. /**
  177. * 批量创建测试订单
  178. */
  179. static async createTestOrders(
  180. dataSource: DataSource,
  181. tenantId: number,
  182. count: number,
  183. options: {
  184. userId?: number;
  185. payType?: 1 | 3; // 1=积分支付(微信支付),3=额度支付(信用支付)
  186. dateOffsetDays?: number; // 日期偏移(负数表示过去)
  187. } = {}
  188. ): Promise<OrderMt[]> {
  189. const orders: OrderMt[] = [];
  190. // 如果没有提供userId,创建一个测试用户
  191. let userId = options.userId;
  192. if (!userId) {
  193. const user = await this.createTestUser(dataSource, tenantId);
  194. userId = user.id;
  195. }
  196. for (let i = 0; i < count; i++) {
  197. // 交替创建积分支付和额度支付的订单
  198. const payType = options.payType || (i % 2 === 0 ? 1 : 3); // 1=积分支付,3=额度支付
  199. const amount = 50.00 + (i * 25.00); // 不同金额
  200. // 处理日期偏移
  201. let createdAt = new Date();
  202. if (options.dateOffsetDays) {
  203. createdAt.setDate(createdAt.getDate() + options.dateOffsetDays);
  204. }
  205. const order = await this.createTestOrder(dataSource, tenantId, userId, {}, {
  206. orderNo: `ORD${Date.now()}${i}`,
  207. payType,
  208. amount,
  209. payAmount: amount,
  210. createdAt,
  211. updatedAt: createdAt
  212. });
  213. orders.push(order);
  214. }
  215. return orders;
  216. }
  217. /**
  218. * 创建今日测试订单
  219. */
  220. static async createTodayTestOrders(
  221. dataSource: DataSource,
  222. tenantId: number,
  223. count: number
  224. ): Promise<OrderMt[]> {
  225. return await this.createTestOrders(dataSource, tenantId, count, {
  226. dateOffsetDays: 0 // 今天
  227. });
  228. }
  229. /**
  230. * 创建历史测试订单(过去几天)
  231. */
  232. static async createHistoricalTestOrders(
  233. dataSource: DataSource,
  234. tenantId: number,
  235. count: number,
  236. daysAgo: number = 7
  237. ): Promise<OrderMt[]> {
  238. return await this.createTestOrders(dataSource, tenantId, count, {
  239. dateOffsetDays: -daysAgo
  240. });
  241. }
  242. /**
  243. * 为测试用户生成JWT token
  244. */
  245. static generateUserToken(user: UserEntityMt): string {
  246. return JWTUtil.generateToken({
  247. id: user.id,
  248. username: user.username,
  249. tenantId: user.tenantId
  250. });
  251. }
  252. /**
  253. * 为管理员生成JWT token
  254. */
  255. static generateAdminToken(tenantId: number): string {
  256. return JWTUtil.generateToken({
  257. id: 1,
  258. username: 'admin',
  259. tenantId
  260. });
  261. }
  262. /**
  263. * 生成指定租户和用户ID的测试token
  264. */
  265. static generateTokenForUser(tenantId: number, userId: number, username: string = 'test_user'): string {
  266. return JWTUtil.generateToken({
  267. id: userId,
  268. username,
  269. tenantId
  270. });
  271. }
  272. }