InspectionService.php 9.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301
  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. * @param int $supplierId 供应商ID(可选)
  180. * @return bool
  181. * @throws Exception
  182. */
  183. public static function auditApplication($applicationId, $auditStatus, $rejectReason = '', $supplierId = 0)
  184. {
  185. $application = InspectionApplication::get($applicationId);
  186. if (!$application) {
  187. throw new BusinessException('申请记录不存在');
  188. }
  189. if ($application->audit_status != InspectionApplication::AUDIT_STATUS_PENDING) {
  190. throw new BusinessException('该申请已被审核,无法重复操作');
  191. }
  192. // 验证审核状态
  193. $validStatuses = [
  194. InspectionApplication::AUDIT_STATUS_PASSED,
  195. InspectionApplication::AUDIT_STATUS_REJECTED
  196. ];
  197. if (!in_array($auditStatus, $validStatuses)) {
  198. throw new BusinessException('无效的审核状态');
  199. }
  200. // 如果是驳回,必须填写驳回原因
  201. if ($auditStatus == InspectionApplication::AUDIT_STATUS_REJECTED && empty($rejectReason)) {
  202. throw new BusinessException('驳回申请必须填写驳回原因');
  203. }
  204. // 如果是审核通过,检查供应商ID
  205. if ($auditStatus == InspectionApplication::AUDIT_STATUS_PASSED && empty($supplierId)) {
  206. throw new BusinessException('审核通过时必须选择绑定的供应商');
  207. }
  208. // 启动事务
  209. Db::startTrans();
  210. try {
  211. $application->audit_status = $auditStatus;
  212. $application->audit_time = time();
  213. $application->reject_reason = $rejectReason;
  214. // 审核通过时设置供应商ID,驳回时清空供应商ID
  215. if ($auditStatus == InspectionApplication::AUDIT_STATUS_PASSED) {
  216. $application->supplier_id = $supplierId;
  217. } else {
  218. $application->supplier_id = 0;
  219. }
  220. $application->save();
  221. // 提交事务
  222. Db::commit();
  223. return true;
  224. } catch (Exception $e) {
  225. // 回滚事务
  226. Db::rollback();
  227. throw new BusinessException('审核失败:' . $e->getMessage());
  228. }
  229. }
  230. /**
  231. * 获取管理员申请列表(分页)
  232. * @param array $param 查询参数
  233. * @return \think\Paginator
  234. */
  235. public static function getAdminApplicationList($param = [])
  236. {
  237. $where = [];
  238. // 审核状态筛选
  239. if (isset($param['audit_status']) && $param['audit_status'] !== '') {
  240. $where['inspection_application.audit_status'] = $param['audit_status'];
  241. }
  242. // 关键词搜索(姓名、手机号)
  243. if (!empty($param['keywords'])) {
  244. $where['inspection_application.name|inspection_application.phone'] = ['like', '%' . $param['keywords'] . '%'];
  245. }
  246. // 时间范围筛选
  247. if (!empty($param['start_time']) && !empty($param['end_time'])) {
  248. $where['inspection_application.apply_time'] = ['between', [strtotime($param['start_time']), strtotime($param['end_time'])]];
  249. }
  250. $pageSize = $param['pageSize'] ?? 20;
  251. return InspectionApplication::where($where)
  252. ->with(['user'])
  253. ->order('inspection_application.id', 'desc')
  254. ->paginate($pageSize);
  255. }
  256. }