InspectionService.php 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. <?php
  2. namespace app\common\Service;
  3. use app\common\model\inspection\InspectionApplication;
  4. use think\Db;
  5. use think\Exception;
  6. use app\common\exception\BusinessException;
  7. /**
  8. * 验货员申请服务类
  9. */
  10. class InspectionService
  11. {
  12. /**
  13. * 创建验货员申请
  14. * @param int $userId 用户ID
  15. * @param array $data 申请数据
  16. * @return InspectionApplication
  17. * @throws Exception
  18. */
  19. public static function createApplication($userId, $data)
  20. {
  21. // 检查用户是否可以申请
  22. if (!InspectionApplication::canApply($userId)) {
  23. throw new BusinessException('您已有申请记录,请勿重复申请');
  24. }
  25. // 检查手机号是否已被使用
  26. if (InspectionApplication::isPhoneApplied($data['phone'])) {
  27. throw new BusinessException('该手机号已被其他用户申请');
  28. }
  29. // 补充数据
  30. $data['user_id'] = $userId;
  31. $data['apply_time'] = time();
  32. $data['audit_status'] = InspectionApplication::AUDIT_STATUS_PENDING;
  33. $data['audit_time'] = 0;
  34. $data['reject_reason'] = '';
  35. // 启动事务
  36. Db::startTrans();
  37. try {
  38. $application = InspectionApplication::create($data);
  39. // 提交事务
  40. Db::commit();
  41. return $application;
  42. } catch (Exception $e) {
  43. // 回滚事务
  44. Db::rollback();
  45. throw new BusinessException('申请提交失败:' . $e->getMessage());
  46. }
  47. }
  48. /**
  49. * 获取申请详情
  50. * @param int $applicationId 申请ID
  51. * @param int $userId 用户ID
  52. * @return InspectionApplication|null
  53. * @throws Exception
  54. */
  55. public static function getApplicationDetail($applicationId = 0, $userId = 0)
  56. {
  57. $application = InspectionApplication::where(function($query) use ($applicationId,$userId){
  58. if($applicationId){
  59. $query->where('inspection_application.id', $applicationId);
  60. }
  61. if($userId){
  62. $query->where('inspection_application.user_id', $userId);
  63. }
  64. })
  65. ->find();
  66. // if (!$application) {
  67. // throw new BusinessException('申请记录不存在或无权访问');
  68. // }
  69. return $application;
  70. }
  71. /**
  72. * 获取用户申请列表
  73. * @param int $userId 用户ID
  74. * @return \think\Collection
  75. */
  76. public static function getApplicationList($userId)
  77. {
  78. return InspectionApplication::where('inspection_application.user_id', $userId)
  79. ->order('inspection_application.id', 'desc')
  80. ->select();
  81. }
  82. /**
  83. * 查询用户申请信息
  84. * @param int $userId 用户ID
  85. * @param bool $withUser 是否关联用户信息
  86. * @return InspectionApplication|null
  87. */
  88. public static function getUserApplication($userId, $withUser = false,$withSupplier = false)
  89. {
  90. $query = InspectionApplication::where('user_id', $userId);
  91. if ($withUser) {
  92. $query->with(['user']);
  93. }
  94. if ($withSupplier) {
  95. $query->with(['supplier']);
  96. }
  97. return $query->order('id', 'desc')->find();
  98. }
  99. /**
  100. * 修改申请信息
  101. * @param int $applicationId 申请ID
  102. * @param int $userId 用户ID
  103. * @param array $data 修改数据
  104. * @return InspectionApplication
  105. * @throws Exception
  106. */
  107. public static function updateApplication($applicationId, $userId, $data)
  108. {
  109. $application = InspectionApplication::where('inspection_application.id', $applicationId)
  110. ->where('inspection_application.user_id', $userId)
  111. ->find();
  112. if (!$application) {
  113. throw new BusinessException('申请记录不存在或无权访问');
  114. }
  115. if (!$application->canEdit()) {
  116. throw new BusinessException('该申请状态下不允许修改');
  117. }
  118. // 检查手机号是否已被其他用户使用
  119. if (InspectionApplication::isPhoneApplied($data['phone'], $applicationId)) {
  120. throw new BusinessException('该手机号已被其他用户申请');
  121. }
  122. // 更新申请信息
  123. $application->allowField(true)->save($data);
  124. return $application;
  125. }
  126. /**
  127. * 检查申请资格
  128. * @param int $userId 用户ID
  129. * @return array
  130. */
  131. public static function checkEligibility($userId)
  132. {
  133. $application = InspectionApplication::where('inspection_application.user_id', $userId)
  134. ->order('inspection_application.id', 'desc')
  135. ->find();
  136. if (!$application) {
  137. return [
  138. 'can_apply' => true,
  139. 'status' => 'no_application',
  140. 'message' => '您还未申请验货员,可以提交申请'
  141. ];
  142. }
  143. switch ($application->audit_status) {
  144. case InspectionApplication::AUDIT_STATUS_PENDING:
  145. return [
  146. 'can_apply' => false,
  147. 'status' => 'pending',
  148. 'message' => '您的申请正在审核中,请耐心等待',
  149. 'application' => $application
  150. ];
  151. case InspectionApplication::AUDIT_STATUS_PASSED:
  152. return [
  153. 'can_apply' => false,
  154. 'status' => 'passed',
  155. 'message' => '您已是认证验货员',
  156. 'application' => $application
  157. ];
  158. case InspectionApplication::AUDIT_STATUS_REJECTED:
  159. return [
  160. 'can_apply' => true,
  161. 'status' => 'rejected',
  162. 'message' => '您的申请被驳回,可以重新申请',
  163. 'reject_reason' => $application->reject_reason,
  164. 'application' => $application
  165. ];
  166. default:
  167. return [
  168. 'can_apply' => true,
  169. 'status' => 'unknown',
  170. 'message' => '状态异常,可以重新申请'
  171. ];
  172. }
  173. }
  174. /**
  175. * 管理员审核申请
  176. * @param int $applicationId 申请ID
  177. * @param int $auditStatus 审核状态
  178. * @param string $rejectReason 驳回原因(可选)
  179. * @return bool
  180. * @throws Exception
  181. */
  182. public static function auditApplication($applicationId, $auditStatus, $rejectReason = '')
  183. {
  184. $application = InspectionApplication::get($applicationId);
  185. if (!$application) {
  186. throw new BusinessException('申请记录不存在');
  187. }
  188. if ($application->audit_status != InspectionApplication::AUDIT_STATUS_PENDING) {
  189. throw new BusinessException('该申请已被审核,无法重复操作');
  190. }
  191. // 验证审核状态
  192. $validStatuses = [
  193. InspectionApplication::AUDIT_STATUS_PASSED,
  194. InspectionApplication::AUDIT_STATUS_REJECTED
  195. ];
  196. if (!in_array($auditStatus, $validStatuses)) {
  197. throw new BusinessException('无效的审核状态');
  198. }
  199. // 如果是驳回,必须填写驳回原因
  200. if ($auditStatus == InspectionApplication::AUDIT_STATUS_REJECTED && empty($rejectReason)) {
  201. throw new BusinessException('驳回申请必须填写驳回原因');
  202. }
  203. // 启动事务
  204. Db::startTrans();
  205. try {
  206. $application->audit_status = $auditStatus;
  207. $application->audit_time = time();
  208. $application->reject_reason = $rejectReason;
  209. $application->save();
  210. // 提交事务
  211. Db::commit();
  212. return true;
  213. } catch (Exception $e) {
  214. // 回滚事务
  215. Db::rollback();
  216. throw new BusinessException('审核失败:' . $e->getMessage());
  217. }
  218. }
  219. /**
  220. * 获取管理员申请列表(分页)
  221. * @param array $param 查询参数
  222. * @return \think\Paginator
  223. */
  224. public static function getAdminApplicationList($param = [])
  225. {
  226. $where = [];
  227. // 审核状态筛选
  228. if (isset($param['audit_status']) && $param['audit_status'] !== '') {
  229. $where['inspection_application.audit_status'] = $param['audit_status'];
  230. }
  231. // 关键词搜索(姓名、手机号)
  232. if (!empty($param['keywords'])) {
  233. $where['inspection_application.name|inspection_application.phone'] = ['like', '%' . $param['keywords'] . '%'];
  234. }
  235. // 时间范围筛选
  236. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  237. $where['inspection_application.apply_time'] = ['between', [strtotime($param['start_time']), strtotime($param['end_time'])]];
  238. }
  239. $pageSize = $param['pageSize'] ?? 20;
  240. return InspectionApplication::where($where)
  241. ->with(['user'])
  242. ->order('inspection_application.id', 'desc')
  243. ->paginate($pageSize);
  244. }
  245. }