126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
		
		
			
		
	
	
			126 lines
		
	
	
		
			3.6 KiB
		
	
	
	
		
			PHP
		
	
	
| 
								 | 
							
								<?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;
							 | 
						|||
| 
								 | 
							
								    }
							 | 
						|||
| 
								 | 
							
								}
							 |