payment-test.factory.ts 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. import { DataSource } from 'typeorm';
  2. import { UserEntityMt } from '@d8d/user-module-mt';
  3. import { MerchantMt } from '@d8d/merchant-module-mt';
  4. import { SupplierMt } from '@d8d/supplier-module-mt';
  5. import { DeliveryAddressMt } from '@d8d/delivery-address-module-mt';
  6. import { OrderMt } from '@d8d/orders-module-mt';
  7. import { AreaEntityMt } from '@d8d/geo-areas-mt';
  8. import { PaymentMtEntity } from '../../src/entities/payment.mt.entity.js';
  9. import { PaymentStatus } from '../../src/entities/payment.types.js';
  10. /**
  11. * 支付测试数据工厂
  12. */
  13. export class PaymentTestFactory {
  14. constructor(private dataSource: DataSource) {}
  15. /**
  16. * 创建测试用户
  17. */
  18. async createTestUser(tenantId: number = 1, options: Partial<UserEntityMt> = {}): Promise<UserEntityMt> {
  19. const userRepository = this.dataSource.getRepository(UserEntityMt);
  20. const timestamp = Date.now();
  21. const user = userRepository.create({
  22. username: `test_user_${timestamp}`,
  23. password: 'test_password',
  24. nickname: '测试用户',
  25. openid: 'oJy1-16IIG18XZLl7G32k1hHMUFg',
  26. tenantId,
  27. ...options
  28. });
  29. return await userRepository.save(user);
  30. }
  31. /**
  32. * 创建测试商户
  33. */
  34. async createTestMerchant(tenantId: number = 1, userId: number, options: Partial<MerchantMt> = {}): Promise<MerchantMt> {
  35. const merchantRepository = this.dataSource.getRepository(MerchantMt);
  36. const timestamp = Date.now();
  37. const merchant = merchantRepository.create({
  38. tenantId,
  39. name: '测试商户',
  40. username: `m${timestamp}`.slice(-19), // 确保不超过20字符
  41. password: 'test_password',
  42. state: 1,
  43. createdBy: userId,
  44. updatedBy: userId,
  45. ...options
  46. });
  47. return await merchantRepository.save(merchant);
  48. }
  49. /**
  50. * 创建测试供货商
  51. */
  52. async createTestSupplier(tenantId: number = 1, userId: number, options: Partial<SupplierMt> = {}): Promise<SupplierMt> {
  53. const supplierRepository = this.dataSource.getRepository(SupplierMt);
  54. const timestamp = Date.now();
  55. const supplier = supplierRepository.create({
  56. tenantId,
  57. name: '测试供货商',
  58. username: `s${timestamp}`.slice(-49), // 确保不超过50字符
  59. password: 'test_password',
  60. state: 1,
  61. createdBy: userId,
  62. updatedBy: userId,
  63. ...options
  64. });
  65. return await supplierRepository.save(supplier);
  66. }
  67. /**
  68. * 创建测试地区记录
  69. */
  70. async createTestArea(id: number, name: string, level: number, tenantId: number = 1, parentId: number | null = null): Promise<AreaEntityMt> {
  71. const areaRepository = this.dataSource.getRepository(AreaEntityMt);
  72. const area = areaRepository.create({
  73. id,
  74. tenantId,
  75. name,
  76. level,
  77. code: id.toString(),
  78. parentId,
  79. isDisabled: 0,
  80. isDeleted: 0,
  81. createdBy: 1,
  82. updatedBy: 1
  83. });
  84. return await areaRepository.save(area);
  85. }
  86. /**
  87. * 创建测试配送地址
  88. */
  89. async createTestDeliveryAddress(tenantId: number = 1, userId: number, options: Partial<DeliveryAddressMt> = {}): Promise<DeliveryAddressMt> {
  90. const addressRepository = this.dataSource.getRepository(DeliveryAddressMt);
  91. // 创建地区记录 - 先创建父级,再创建子级
  92. const province = await this.createTestArea(110000, '北京市', 1, tenantId, null);
  93. const city = await this.createTestArea(110100, '北京市', 2, tenantId, province.id);
  94. const district = await this.createTestArea(110101, '东城区', 3, tenantId, city.id);
  95. const town = await this.createTestArea(110101001, '东华门街道', 4, tenantId, district.id);
  96. const address = addressRepository.create({
  97. tenantId,
  98. userId,
  99. name: '测试收货人',
  100. phone: '13800138000',
  101. receiverProvince: province.id,
  102. receiverCity: city.id,
  103. receiverDistrict: district.id,
  104. receiverTown: town.id,
  105. address: '测试地址',
  106. isDefault: 1,
  107. state: 1,
  108. createdBy: userId,
  109. updatedBy: userId,
  110. ...options
  111. });
  112. return await addressRepository.save(address);
  113. }
  114. /**
  115. * 创建测试订单
  116. */
  117. async createTestOrder(
  118. tenantId: number = 1,
  119. userId: number,
  120. merchantId: number,
  121. supplierId: number,
  122. addressId: number,
  123. options: Partial<OrderMt> = {}
  124. ): Promise<OrderMt> {
  125. const orderRepository = this.dataSource.getRepository(OrderMt);
  126. const timestamp = Date.now();
  127. const order = orderRepository.create({
  128. tenantId,
  129. orderNo: `ORD${timestamp}`,
  130. userId,
  131. amount: 1,
  132. costAmount: 0.5,
  133. payAmount: 1,
  134. orderType: 1,
  135. payType: 2,
  136. payState: 0, // 未支付
  137. state: 0,
  138. addressId,
  139. merchantId,
  140. supplierId,
  141. createdBy: userId,
  142. updatedBy: userId,
  143. ...options
  144. });
  145. return await orderRepository.save(order);
  146. }
  147. /**
  148. * 创建测试支付记录
  149. */
  150. async createTestPayment(
  151. externalOrderId: number,
  152. userId: number,
  153. tenantId: number = 1,
  154. options: Partial<PaymentMtEntity> = {}
  155. ): Promise<PaymentMtEntity> {
  156. const paymentRepository = this.dataSource.getRepository(PaymentMtEntity);
  157. const timestamp = Date.now();
  158. const payment = paymentRepository.create({
  159. externalOrderId,
  160. userId,
  161. tenantId,
  162. totalAmount: 1,
  163. description: '测试支付',
  164. paymentStatus: PaymentStatus.PROCESSING,
  165. openid: 'oJy1-16IIG18XZLl7G32k1hHMUFg',
  166. outTradeNo: `ORDER_${externalOrderId}_${timestamp}`,
  167. ...options
  168. });
  169. return await paymentRepository.save(payment);
  170. }
  171. /**
  172. * 创建完整的测试环境数据
  173. */
  174. async createCompleteTestData(tenantId: number = 1, userOptions: Partial<UserEntityMt> = {}): Promise<{
  175. user: UserEntityMt;
  176. merchant: MerchantMt;
  177. supplier: SupplierMt;
  178. address: DeliveryAddressMt;
  179. order: OrderMt;
  180. payment: PaymentMtEntity;
  181. }> {
  182. const user = await this.createTestUser(tenantId, userOptions);
  183. const merchant = await this.createTestMerchant(tenantId, user.id);
  184. const supplier = await this.createTestSupplier(tenantId, user.id);
  185. const address = await this.createTestDeliveryAddress(tenantId, user.id);
  186. const order = await this.createTestOrder(tenantId, user.id, merchant.id, supplier.id, address.id);
  187. const payment = await this.createTestPayment(order.id, user.id, tenantId);
  188. return {
  189. user,
  190. merchant,
  191. supplier,
  192. address,
  193. order,
  194. payment
  195. };
  196. }
  197. /**
  198. * 创建多租户测试数据
  199. */
  200. async createMultiTenantTestData(): Promise<{
  201. tenant1: {
  202. user: UserEntityMt;
  203. merchant: MerchantMt;
  204. supplier: SupplierMt;
  205. address: DeliveryAddressMt;
  206. order: OrderMt;
  207. payment: PaymentMtEntity;
  208. };
  209. tenant2: {
  210. user: UserEntityMt;
  211. merchant: MerchantMt;
  212. supplier: SupplierMt;
  213. address: DeliveryAddressMt;
  214. order: OrderMt;
  215. payment: PaymentMtEntity;
  216. };
  217. }> {
  218. const timestamp = Date.now();
  219. const tenant1 = await this.createCompleteTestData(1, {
  220. username: `tenant1_user_${timestamp}`,
  221. openid: `tenant1_openid_${timestamp}`
  222. });
  223. const tenant2 = await this.createCompleteTestData(2, {
  224. username: `tenant2_user_${timestamp}`,
  225. openid: `tenant2_openid_${timestamp}`
  226. });
  227. return {
  228. tenant1,
  229. tenant2
  230. };
  231. }
  232. }