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;
 | 
						||
    }
 | 
						||
} |