MerchantIntention.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | CRMEB [ CRMEB赋能开发者,助力企业发展 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2016~2024 https://www.crmeb.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权
  8. // +----------------------------------------------------------------------
  9. // | Author: CRMEB Team <admin@crmeb.com>
  10. // +----------------------------------------------------------------------
  11. namespace app\controller\api\store\merchant;
  12. use app\common\repositories\system\merchant\MerchantAdminRepository;
  13. use app\common\repositories\system\merchant\MerchantCategoryRepository;
  14. use app\common\repositories\system\merchant\MerchantRepository;
  15. use app\common\repositories\system\merchant\MerchantTypeRepository;
  16. use app\validate\api\MerchantIntentionValidate;
  17. use crmeb\services\SmsService;
  18. use crmeb\services\SwooleTaskService;
  19. use crmeb\services\YunxinSmsService;
  20. use think\App;
  21. use crmeb\basic\BaseController;
  22. use app\common\repositories\system\merchant\MerchantIntentionRepository as repository;
  23. use think\exception\ValidateException;
  24. class MerchantIntention extends BaseController
  25. {
  26. protected $repository;
  27. protected $userInfo;
  28. public function __construct(App $app, repository $repository)
  29. {
  30. parent::__construct($app);
  31. $this->repository = $repository;
  32. $this->userInfo = $this->request->isLogin() ? $this->request->userInfo() : null;
  33. }
  34. /**
  35. * 创建商户入驻意向
  36. * 该方法用于处理商户入驻的申请创建流程。它首先验证参数,然后检查商户名称和电话是否已存在,
  37. * 防止重复申请。如果一切检查通过,则创建入驻意向,并通过消息通知管理员有新的入驻申请。
  38. *
  39. * @return \think\response\Json
  40. * @throws ValidateException
  41. */
  42. public function create()
  43. {
  44. // 验证参数
  45. $data = $this->checkParams();
  46. // 检查商户入驻功能是否开启
  47. if (!systemConfig('mer_intention_open')) {
  48. return app('json')->fail('未开启商户入驻');
  49. }
  50. // 如果用户已登录,记录用户ID
  51. if ($this->userInfo) {
  52. $data['uid'] = $this->userInfo->uid;
  53. }
  54. // 实例化商户仓库,用于后续的商户名称和电话存在性检查
  55. $make = app()->make(MerchantRepository::class);
  56. // 检查商户名称是否已存在
  57. if ($make->fieldExists('mer_name', $data['mer_name'])) {
  58. throw new ValidateException('商户名称已存在,不可申请');
  59. }
  60. // 检查申请电话是否已存在
  61. if ($make->fieldExists('mer_phone', $data['phone'])) {
  62. throw new ValidateException('手机号已存在,不可申请');
  63. }
  64. // 实例化管理员仓库,用于检查手机号是否已是管理员
  65. $adminRepository = app()->make(MerchantAdminRepository::class);
  66. // 检查手机号是否已是管理员
  67. if ($adminRepository->fieldExists('account', $data['phone'])) {
  68. throw new ValidateException('手机号已是管理员,不可申请');
  69. }
  70. // 创建商户入驻意向create
  71. $intention = $this->repository->create($data);
  72. // 发送管理员通知,提示有新的商户入驻申请
  73. SwooleTaskService::admin('notice', [
  74. 'type' => 'new_intention',
  75. 'data' => [
  76. 'title' => '商户入驻申请',
  77. 'message' => '您有一个新的商户入驻申请',
  78. 'id' => $intention->mer_intention_id
  79. ]
  80. ]);
  81. // 返回成功响应
  82. return app('json')->success('提交成功');
  83. }
  84. /**
  85. * 更新商户入驻意向信息。
  86. *
  87. * 本函数用于处理商户入驻意向的更新操作。首先,它验证指定的意向记录是否存在,
  88. * 然后检查商户入驻功能是否开启。如果一切就绪,它将更新意向记录,并发送通知。
  89. *
  90. * @param int $id 商户入驻意向的ID。
  91. * @return json 返回操作的结果,成功或失败。
  92. */
  93. public function update($id)
  94. {
  95. // 检查指定的商户入驻意向是否存在且未被删除
  96. if (!$this->repository->getWhere(['mer_intention_id' => (int)$id, 'uid' => $this->userInfo->uid, 'is_del' => 0]))
  97. return app('json')->fail('数据不存在');
  98. // 验证并获取提交的参数
  99. $data = $this->checkParams();
  100. // 检查商户入驻功能是否开启
  101. if (!systemConfig('mer_intention_open')) {
  102. return app('json')->fail('未开启商户入驻');
  103. }
  104. // 设置更新时间
  105. $data['create_time'] = date('Y-m-d H:i:s', time());
  106. // 更新商户入驻意向信息
  107. $this->repository->updateIntention((int)$id, $data);
  108. // 发送通知,提示有新的商户入驻申请
  109. SwooleTaskService::admin('notice', [
  110. 'type' => 'new_intention',
  111. 'data' => [
  112. 'title' => '商户入驻申请',
  113. 'message' => '您有一个新的商户入驻申请',
  114. 'id' => $id
  115. ]
  116. ]);
  117. return app('json')->success('修改成功');
  118. }
  119. /**
  120. * 获取用户列表
  121. *
  122. * 本方法用于获取当前登录用户的相关列表信息。通过调用repository层的getList方法,结合当前用户的uid,
  123. * 进行数据查询。支持分页查询,以提高数据检索的效率和灵活性。
  124. *
  125. * @return \Illuminate\Http\JsonResponse
  126. * 返回一个JSON响应,包含查询到的数据。如果查询成功,数据将被封装在success方法返回的对象中。
  127. */
  128. public function lst()
  129. {
  130. // 获取当前请求的分页信息
  131. [$page, $limit] = $this->getPage();
  132. // 根据当前用户的uid,调用repository获取列表数据
  133. $data = $this->repository->getList(['uid' => $this->userInfo->uid], $page, $limit);
  134. // 返回查询结果的JSON响应
  135. return app('json')->success($data);
  136. }
  137. /**
  138. * 根据ID获取详细信息。
  139. *
  140. * 本函数旨在通过提供的ID从仓库中检索特定资源的详细信息。如果资源不存在或被禁用,
  141. * 函数将返回一个错误消息。如果资源存在且启用,将返回资源的详细信息。
  142. *
  143. * @param int $id 要查询的资源ID。强制转换为整数以确保数据类型正确。
  144. * @return mixed 如果资源不存在或已被禁用,返回一个错误的JSON响应;
  145. * 如果资源存在且启用,返回包含资源详细信息的JSON响应。
  146. */
  147. function detail($id)
  148. {
  149. // 从仓库中根据ID和当前用户UID获取资源详细信息
  150. $data = $this->repository->detail((int)$id, $this->userInfo->uid);
  151. // 检查数据是否存在,如果不存在,返回一个失败的JSON响应
  152. if (!$data) {
  153. return app('json')->fail('数据不存在');
  154. }
  155. // 如果资源的状态为1(启用状态),构造登录URL
  156. if ($data->status == 1) {
  157. $data['login_url'] = rtrim(systemConfig('site_url'), '/') . '/' . config('admin.merchant_prefix');
  158. }
  159. // 返回成功的JSON响应,包含资源详细信息
  160. return app('json')->success($data);
  161. }
  162. /**
  163. * 检查参数有效性并处理商户注册请求。
  164. * 该方法从请求中提取参数,验证参数的正确性,包括手机号、商户名、验证码等,
  165. * 并对验证码和商户分类、店铺类型的存在性进行校验。
  166. *
  167. * @return array 提交的参数数据,经过验证和处理。
  168. * @throws ValidateException 如果验证码不正确、商户分类或店铺类型不存在,则抛出验证异常。
  169. */
  170. protected function checkParams()
  171. {
  172. // 从请求中提取相关参数
  173. $data = $this->request->params(['phone', 'mer_name', 'name', 'code', 'images', 'merchant_category_id', 'mer_type_id']);
  174. // 执行参数验证
  175. app()->make(MerchantIntentionValidate::class)->check($data);
  176. // 验证短信验证码的正确性
  177. $check = app()->make(SmsService::class)->checkSmsCode($data['phone'], $data['code'], 'intention');
  178. // 将商户类型ID转换为整数类型
  179. $data['mer_type_id'] = (int)$data['mer_type_id'];
  180. // 如果验证码验证失败,则抛出异常
  181. // if (!$check) throw new ValidateException('验证码不正确');
  182. // 校验商户分类是否存在
  183. if (!app()->make(MerchantCategoryRepository::class)->get($data['merchant_category_id'])) throw new ValidateException('商户分类不存在');
  184. // 如果指定的店铺类型不存在,则抛出异常
  185. if ($data['mer_type_id'] && !app()->make(MerchantTypeRepository::class)->exists($data['mer_type_id']))
  186. throw new ValidateException('店铺类型不存在');
  187. // 移除验证码参数
  188. unset($data['code']);
  189. // 返回验证通过的参数数据
  190. return $data;
  191. }
  192. /**
  193. * 商户分类
  194. * @Author:Qinii
  195. * @Date: 2020/9/15
  196. * @return mixed
  197. */
  198. public function cateLst()
  199. {
  200. $lst = app()->make(MerchantCategoryRepository::class)->getSelect();
  201. return app('json')->success($lst);
  202. }
  203. /**
  204. * 获取商家类型列表
  205. *
  206. * 本函数用于查询并返回商家类型的列表数据。通过调用MerchantTypeRepository类中的getSelect方法,
  207. * 获取到商家类型的下拉选项列表,以便在前端展示或进行进一步的操作。
  208. *
  209. * @return \Illuminate\Http\JsonResponse 返回一个包含商家类型列表的JSON响应
  210. */
  211. public function typeLst()
  212. {
  213. // 通过依赖注入的方式获取MerchantTypeRepository实例,并调用其getSelect方法获取商家类型列表
  214. $lst = app()->make(MerchantTypeRepository::class)->getSelect();
  215. // 使用app容器中定义的json助手函数,将获取到的商家类型列表封装到一个成功响应中并返回
  216. return app('json')->success($lst);
  217. }
  218. }