StoreTestDataSeeder.php 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  1. <?php
  2. namespace Database\Seeders;
  3. use Illuminate\Database\Seeder;
  4. use Illuminate\Support\Facades\DB;
  5. use Illuminate\Support\Str;
  6. /**
  7. * 商家三表关联测试数据生成器
  8. * 生成 stores、user、member 三表关联的测试数据
  9. */
  10. class StoreTestDataSeeder extends Seeder
  11. {
  12. /**
  13. * 运行数据填充
  14. *
  15. * @return void
  16. */
  17. public function run()
  18. {
  19. // 清空现有测试数据(可选)
  20. // DB::table('stores')->where('id', '>', 0)->delete();
  21. // DB::table('user')->where('id', '>', 0)->delete();
  22. // DB::table('member')->where('id', '>', 0)->delete();
  23. $now = time();
  24. // 定义商家类型模板
  25. $storeTemplates = [
  26. ['name' => '餐厅', 'prefix' => 'restaurant', 'category_id' => 1],
  27. ['name' => '服装店', 'prefix' => 'clothing', 'category_id' => 2],
  28. ['name' => '咖啡厅', 'prefix' => 'coffee', 'category_id' => 3],
  29. ['name' => '健身房', 'prefix' => 'fitness', 'category_id' => 4],
  30. ['name' => '书店', 'prefix' => 'bookstore', 'category_id' => 5],
  31. ['name' => '超市', 'prefix' => 'supermarket', 'category_id' => 1],
  32. ['name' => '美容院', 'prefix' => 'beauty', 'category_id' => 2],
  33. ['name' => '药店', 'prefix' => 'pharmacy', 'category_id' => 3],
  34. ['name' => '电影院', 'prefix' => 'cinema', 'category_id' => 4],
  35. ['name' => '酒店', 'prefix' => 'hotel', 'category_id' => 5],
  36. ];
  37. // 城市列表
  38. $cities = [
  39. '北京市朝阳区',
  40. '上海市浦东新区',
  41. '广州市天河区',
  42. '深圳市南山区',
  43. '杭州市西湖区',
  44. '成都市武侯区',
  45. '重庆市渝中区',
  46. '武汉市江汉区',
  47. '西安市雁塔区',
  48. '南京市鼓楼区',
  49. '天津市和平区',
  50. '苏州市姑苏区',
  51. '长沙市岳麓区',
  52. '郑州市金水区',
  53. '济南市历下区',
  54. ];
  55. // 姓氏列表
  56. $surnames = ['张', '李', '王', '刘', '陈', '杨', '赵', '黄', '周', '吴', '徐', '孙', '胡', '朱', '高', '林', '何', '郭', '马', '罗'];
  57. $names = ['伟', '芳', '娜', '秀英', '敏', '静', '丽', '强', '磊', '军', '洋', '勇', '艳', '杰', '娟', '涛', '明', '超', '秀兰', '霞'];
  58. // 状态配置(按比例分配)
  59. $statusConfig = [
  60. 1 => 70, // 70% 已审核(营业中)
  61. 2 => 20, // 20% 待审核
  62. 3 => 10, // 10% 审核失败
  63. ];
  64. // 生成测试数据(循环创建50条)
  65. $testData = [];
  66. $totalCount = 50; // 可以修改这个数字来生成更多或更少的数据
  67. for ($i = 1; $i <= $totalCount; $i++) {
  68. // 随机选择商家类型
  69. $template = $storeTemplates[array_rand($storeTemplates)];
  70. // 随机选择城市
  71. $city = $cities[array_rand($cities)];
  72. // 随机生成姓名
  73. $surname = $surnames[array_rand($surnames)];
  74. $name = $names[array_rand($names)];
  75. $realName = $surname . $name;
  76. // 根据比例随机分配状态
  77. $rand = mt_rand(1, 100);
  78. if ($rand <= 70) {
  79. $status = 1; // 已审核
  80. $confirmRemark = '审核通过';
  81. } elseif ($rand <= 90) {
  82. $status = 2; // 待审核
  83. $confirmRemark = '';
  84. } else {
  85. $status = 3; // 审核失败
  86. $confirmRemark = '资料不完整,请补充完善';
  87. }
  88. // 随机生成订单数据
  89. $orderCount = $status == 1 ? mt_rand(10, 500) : 0;
  90. $orderTotal = $status == 1 ? mt_rand(5000, 200000) + (mt_rand(0, 99) / 100) : 0.00;
  91. // 随机性别
  92. $gender = mt_rand(1, 3);
  93. // 用户状态(10%概率禁用)
  94. $userStatus = mt_rand(1, 100) <= 90 ? 1 : 2;
  95. $memberStatus = $userStatus;
  96. // 生成唯一标识
  97. $uniqueId = str_pad($i, 3, '0', STR_PAD_LEFT);
  98. $phone = '138' . str_pad($i, 8, '0', STR_PAD_LEFT);
  99. $testData[] = [
  100. 'store' => [
  101. 'name' => $template['name'] . $i . '号店',
  102. 'real_name' => $realName,
  103. 'phone' => $phone,
  104. 'address' => $city . mt_rand(1, 999) . '号',
  105. 'category_id' => $template['category_id'],
  106. 'sort' => 100 - $i,
  107. 'business_license' => '',
  108. 'other_photo' => '',
  109. 'order_count' => $orderCount,
  110. 'order_total' => $orderTotal,
  111. 'status' => $status,
  112. 'confirm_remark' => $confirmRemark,
  113. ],
  114. 'user' => [
  115. 'realname' => $realName,
  116. 'nickname' => $template['name'] . '老板' . $i,
  117. 'gender' => $gender,
  118. 'avatar' => '',
  119. 'mobile' => $phone,
  120. 'email' => $template['prefix'] . $uniqueId . '@example.com',
  121. 'username' => $template['prefix'] . $uniqueId,
  122. 'password' => md5('123456'),
  123. 'salt' => Str::random(10),
  124. 'status' => $userStatus,
  125. ],
  126. 'member' => [
  127. 'openid' => 'test_openid_' . $uniqueId,
  128. 'mobile' => $phone,
  129. 'user_type' => 2,
  130. 'password' => md5('123456'),
  131. 'realname' => $realName,
  132. 'nickname' => $template['name'] . $i . '号店',
  133. 'gender' => $gender,
  134. 'status' => $memberStatus,
  135. ]
  136. ];
  137. }
  138. foreach ($testData as $index => $data) {
  139. DB::beginTransaction();
  140. try {
  141. // 1. 先插入 member 表(会员表,获取 member.id)
  142. $memberId = DB::table('member')->insertGetId([
  143. 'openid' => $data['member']['openid'],
  144. 'mobile' => $data['member']['mobile'],
  145. 'user_type' => $data['member']['user_type'],
  146. 'password' => $data['member']['password'],
  147. 'realname' => $data['member']['realname'],
  148. 'nickname' => $data['member']['nickname'],
  149. 'gender' => $data['member']['gender'],
  150. 'status' => $data['member']['status'],
  151. 'create_time' => $now,
  152. 'update_time' => $now,
  153. 'mark' => 1,
  154. ]);
  155. // 2. 插入 user 表(管理员表,user.user_id 关联 member.id)
  156. $userId = DB::table('user')->insertGetId([
  157. 'user_id' => $memberId, // 关联会员ID
  158. 'realname' => $data['user']['realname'],
  159. 'nickname' => $data['user']['nickname'],
  160. 'gender' => $data['user']['gender'],
  161. 'avatar' => $data['user']['avatar'],
  162. 'mobile' => $data['user']['mobile'],
  163. 'email' => $data['user']['email'],
  164. 'username' => $data['user']['username'],
  165. 'password' => $data['user']['password'],
  166. 'salt' => $data['user']['salt'],
  167. 'status' => $data['user']['status'],
  168. 'sort' => 125,
  169. 'create_time' => $now,
  170. 'update_time' => $now,
  171. 'mark' => 1,
  172. ]);
  173. // 3. 插入 stores 表(商家表,store.user_id 关联 member.id)
  174. DB::table('stores')->insert([
  175. 'user_id' => $memberId, // 关联会员ID,确保 user.user_id = member.id = store.user_id
  176. 'name' => $data['store']['name'],
  177. 'real_name' => $data['store']['real_name'],
  178. 'phone' => $data['store']['phone'],
  179. 'address' => $data['store']['address'],
  180. 'category_id' => $data['store']['category_id'],
  181. 'sort' => $data['store']['sort'],
  182. 'business_license' => $data['store']['business_license'],
  183. 'other_photo' => $data['store']['other_photo'],
  184. 'order_count' => $data['store']['order_count'],
  185. 'order_total' => $data['store']['order_total'],
  186. 'status' => $data['store']['status'],
  187. 'confirm_remark' => $data['store']['confirm_remark'],
  188. 'create_time' => $now,
  189. 'update_time' => $now,
  190. 'mark' => 1,
  191. ]);
  192. DB::commit();
  193. echo "成功创建测试数据 #" . ($index + 1) . ": {$data['store']['name']}\n";
  194. } catch (\Exception $e) {
  195. DB::rollBack();
  196. echo "创建测试数据失败 #" . ($index + 1) . ": " . $e->getMessage() . "\n";
  197. }
  198. }
  199. echo "\n测试数据生成完成!\n";
  200. echo "共生成 " . count($testData) . " 条商家数据\n";
  201. echo "所有账号密码均为: 123456\n";
  202. }
  203. }