126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
			Executable File
		
	
| <?php
 | ||
| namespace app\traits\account;
 | ||
| 
 | ||
| use app\validate\FeedbackValidate;
 | ||
| use app\model\{
 | ||
|     Feedback,
 | ||
|     FeedbackType
 | ||
| };
 | ||
| use app\exception\TraitException;
 | ||
| use think\Collection;
 | ||
| use think\Exception;
 | ||
| 
 | ||
| /**
 | ||
|  * 投诉与意见关联
 | ||
|  * Trait FeedbackTrait
 | ||
|  * @package app\traits\account
 | ||
|  */
 | ||
| trait FeedbackTrait
 | ||
| {
 | ||
|     /**
 | ||
|      * 投诉与意见分类
 | ||
|      */
 | ||
|     public function feedbackTypes()
 | ||
|     {
 | ||
|         try {
 | ||
|             return (new FeedbackType)->select();
 | ||
|         } catch (\Exception $e) {
 | ||
|             return new Collection();
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 添加投诉与意见
 | ||
|      * 限制每个用户每日每个问题类型最多提交3次
 | ||
|      *
 | ||
|      * @param int $accountId
 | ||
|      * @param array $data 内容参数 ['type_id', 'content', 'user_name', 'user_phone']
 | ||
|      * @throws TraitException
 | ||
|      */
 | ||
|     public function addFeedback(int $accountId, array $data)
 | ||
|     {
 | ||
|         try {
 | ||
|             $validate = new FeedbackValidate();
 | ||
|             if (!$validate->scene('add')->check($data)) {
 | ||
|                 throw new TraitException($validate->getError());
 | ||
|             }
 | ||
| 
 | ||
|             $allowTypeIds = $this->feedbackTypes()->column('id');
 | ||
|             if (!in_array($data['type_id'], $allowTypeIds)) {
 | ||
|                 throw new TraitException('暂不支持该问题类型信息的提交');
 | ||
|             }
 | ||
| 
 | ||
|             $btStart    = date('Y-m-d 00:00:00');
 | ||
|             $btEnd      = date('Y-m-d 23:59:59');
 | ||
|             $hasCount   = Feedback::where('account_id', $accountId)
 | ||
|                 ->where('type_id', $data['type_id'])
 | ||
|                 ->whereBetweenTime('created_at', $btStart, $btEnd)
 | ||
|                 ->count();
 | ||
|             if ($hasCount >= 3) {
 | ||
|                 throw new TraitException('同一问题类型每日最多可提交3次,请勿频繁提交!谢谢您的反馈!');
 | ||
|             }
 | ||
| 
 | ||
|             Feedback::create([
 | ||
|                 'account_id'    => $accountId,
 | ||
|                 'type_id'       => $data['type_id'],
 | ||
|                 'content'       => $data['content'],
 | ||
|                 'user_name'     => $data['user_name'],
 | ||
|                 'user_phone'    => $data['user_phone'],
 | ||
|                 'ip'            => request()->ip(),
 | ||
|                 'status'        => Feedback::STATUS_WAITING,
 | ||
|                 'created_at'    => date('Y-m-d H:i:s'),
 | ||
|             ]);
 | ||
| 
 | ||
|         } catch (TraitException $e) {
 | ||
|             throw $e;
 | ||
|         }  catch (\Exception $e) {
 | ||
|             throw new TraitException('反馈信息提交失败!');
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
| 
 | ||
|     /**
 | ||
|      * 反馈意见列表
 | ||
|      *
 | ||
|      * @param array $where
 | ||
|      * @param array $fields
 | ||
|      * @param int $page
 | ||
|      * @param int $size
 | ||
|      * @param callable|null $callback
 | ||
|      * @param array $orders
 | ||
|      * @return array
 | ||
|      */
 | ||
|     public function feedbackList(array $where = [], array $fields = [], int $page = 1, int $size = 10, callable $callback = null, array $orders = []): array
 | ||
|     {
 | ||
|         try {
 | ||
|             return Feedback::findList($where, $fields, $page, $size, $callback, $orders);
 | ||
|         } catch (\Exception $e) {
 | ||
|             return [
 | ||
|                 'total'   => 0,
 | ||
|                 'current' => $page,
 | ||
|                 'size'    => $size,
 | ||
|                 'list'    => new Collection(),
 | ||
|             ];
 | ||
|         }
 | ||
|     }
 | ||
| 
 | ||
|     /**
 | ||
|      * 更新反馈意见的状态为已处理
 | ||
|      *
 | ||
|      * @param array $ids
 | ||
|      * @return bool
 | ||
|      */
 | ||
|     public function feedbacksToDone(array $ids): bool
 | ||
|     {
 | ||
|         try {
 | ||
|             Feedback::whereIn('id', $ids)->update([
 | ||
|                 'status'        => Feedback::STATUS_DONE,
 | ||
|                 'updated_at'    => date('Y-m-d H:i:s')
 | ||
|             ]);
 | ||
|         } catch (\Exception $e) {
 | ||
|             return false;
 | ||
|         }
 | ||
| 
 | ||
|         return true;
 | ||
|     }
 | ||
| } |