123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602 |
- <?php
- namespace App\Services\Info;
- use App\Repositories\Criteria\Info\ComplaintCriteria;
- use App\Repositories\Eloquent\Info\ComplaintRepositoryEloquent;
- use App\Repositories\Enums\Check\CheckTypeEnum;
- use App\Repositories\Enums\Check\StatusEnum;
- use App\Repositories\Enums\Info\ComplaintDealStatusEnum;
- use App\Repositories\Enums\Manage\DealStatusEnum;
- use App\Repositories\Enums\ModelStatusEnum;
- use App\Repositories\Enums\ResponseCodeEnum;
- use App\Repositories\Models\Base\Department;
- use App\Repositories\Models\Base\DictDetail;
- use App\Repositories\Models\Base\Resource;
- use App\Repositories\Models\Info\Complaint;
- use App\Repositories\Models\Info\ComplaintMessage;
- use App\Repositories\Models\Manage\Category;
- use App\Repositories\Models\Manage\Message;
- use App\Repositories\Presenters\Info\ComplaintPresenter;
- use Carbon\Carbon;
- use Fukuball\Jieba\Finalseg;
- use Fukuball\Jieba\Jieba;
- use Illuminate\Http\Request;
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Str;
- class ComplaintService
- {
- /**
- * @var ComplaintRepositoryEloquent
- */
- private $complaintRepository;
- /**
- * ComplaintService constructor.
- *
- * @param ComplaintRepositoryEloquent $complaintRepositoryEloquent
- */
- public function __construct(ComplaintRepositoryEloquent $complaintRepositoryEloquent)
- {
- $this->complaintRepository = $complaintRepositoryEloquent;
- }
- /**
- * @param Request $request
- *
- * @return mixed
- * @throws \Prettus\Repository\Exceptions\RepositoryException
- */
- public function handleList(Request $request)
- {
- $this->complaintRepository->pushCriteria(new ComplaintCriteria($request));
- $this->complaintRepository->setPresenter(ComplaintPresenter::class);
- return $this->complaintRepository->searchComplaintsByPage();
- }
- /**
- * @param $id
- *
- * @return \Illuminate\Database\Eloquent\Model
- */
- public function handleProfile($id)
- {
- $this->complaintRepository->setPresenter(ComplaintPresenter::class);
- return $this->complaintRepository->searchComplaintBy($id);
- }
- /**
- * @param array $data
- *
- * @return mixed
- * @throws \Prettus\Validator\Exceptions\ValidatorException
- */
- public function handleStore($data)
- {
- $complaint = $this->complaintRepository->create($data);
- ComplaintMessage::query()->create([
- 'complaint_id' => $complaint->id,
- ]);
- return $complaint;
- }
- /**
- * @param array $data
- *
- * @return mixed
- * @throws \Prettus\Validator\Exceptions\ValidatorException
- */
- public function handleUpdate($data)
- {
- $data_temp = $data;
- /**
- * 修改-mead
- * 判断是否可以指派
- * --已修改
- */
- $com = Complaint::query()->where('id', $data['id'])->first();
- if ($com->manage_messages_id) {
- // abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '该投诉已经指派');
- return false;
- }
- $complaint = Complaint::query()->where('id', $data['id'])->update([
- 'deal_idea' => $data['multiData'][0]['body'],
- 'deal_department_id' => $data['multiData'][0]['department_id'],
- 'deal_status' => ComplaintDealStatusEnum::IN,
- ]);
- ComplaintMessage::query()->where('complaint_id', $data['id'])->where('complaint_status', ComplaintDealStatusEnum::IN)->delete();
- ComplaintMessage::query()->create([
- 'complaint_id' => $data['id'],
- 'complaint_status' => ComplaintDealStatusEnum::IN,
- 'deal_department_id' => $data['multiData'][0]['department_id'],
- ]);
- $arr = Category::byCategoryIdGetCategoryArr($data['category_id']);
- $category_1_id = 0;
- $category_2_id = 0;
- $category_3_id = 0;
- $category_4_id = 0;
- $category_5_id = 0;
- if (count($arr) >= 1) $category_1_id = $arr[0];
- if (count($arr) >= 2) $category_2_id = $arr[1];
- if (count($arr) >= 3) $category_3_id = $arr[2];
- if (count($arr) >= 4) $category_4_id = $arr[3];
- if (count($arr) >= 5) $category_5_id = $arr[4];
- unset($data['category_id']);
- //指挥交办里面添加一条数据
- $comp = Complaint::query()->where('id', $data['id'])->first();
- Jieba::init();
- Finalseg::init();
- $deal_idea = Jieba::cut(remove_symbol($comp->deal_idea));
- $md5 = md5($comp->deal_idea);
- $message = Message::query()->create([
- 'type_id' => config('site.complaint'),
- 'category_1_id' => $category_1_id,
- 'category_2_id' => $category_2_id,
- 'category_3_id' => $category_3_id,
- 'category_4_id' => $category_4_id,
- 'category_5_id' => $category_5_id,
- 'no' => Str::random(8),
- 'name' => $comp->complaint_name,
- 'mobile' => $comp->complaint_phone,
- 'keywords' => $deal_idea,
- 'body' => $comp->deal_idea,
- 'body_md5' => $md5,
- 'complain_date' => $comp->created_at,
- 'deal_department_id' => $comp->deal_department_id,
- 'deal_status' => $comp->deal_status,
- 'deal_limit_day' => $data['multiData'][0]['limit_day'],
- 'deal_limit_date' => Carbon::parse($comp->created_at)->addDays($data['multiData'][0]['limit_day'])->toDateTimeString(),
- 'assign_deal_time' => Carbon::now(),
- 'assign_admin_id' => login_admin_id(),
- 'is_assign_status' => 1,
- 'status' => 1,
- 'warn_type_id' => 1,
- ]);
- $comp->update(['manage_messages_id' => $message->id]);
- //多部门协作
- $data['id'] = $message->id;
- $model = Message::query()->where('id', $data['id'])->first();
- if (!$model) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到该记录');
- if ($model->deal_status == DealStatusEnum::OK) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '已经处理完成,暂不能申请');
- if ($model->is_more_department == 1 && $model->check_status == StatusEnum::SUCCESS) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '管理员已经审核通过,暂不支持操作');
- $department_ids = array_column($data['multiData'], 'department_id');
- if (!in_array($model->deal_department_id, $department_ids)) {
- abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '协助部门必须有本部门');
- }
- unset($data['id']);
- unset($data['multiData']['*']);
- $model->check_status = StatusEnum::WAIT;
- $model->extra = $data;
- $model->deal_status = DealStatusEnum::IN;
- $model->is_more_department = 1;
- $model->save();
- $data_temp['id'] = $message->id;
- $this->handleCheckApplicationMultiDepartment($data_temp);
- return $complaint;
- }
- /**
- * @param $id
- *
- * @return \Illuminate\Database\Eloquent\Model
- */
- public function revoke($data)
- {
- //return $this->complaintRepository->update($data, $data['id']);
- return $this->complaintRepository->delete($data['id']);
- }
- /**
- * @param Request $request
- *
- * @return mixed
- * @throws \Prettus\Validator\Exceptions\ValidatorException
- */
- public function handleDelete($id)
- {
- $complaint = Complaint::query()->where('id', $id)->first();
- if ($complaint->deal_status == ComplaintDealStatusEnum::WAIT) return $complaint->delete();
- return false;
- }
- /**
- * 满意度
- * @param array $data
- * @return mixed
- * @throws \Prettus\Validator\Exceptions\ValidatorException
- */
- public function evaluation($data)
- {
- $complaint = Complaint::query()->where('id', $data['id'])->update(['deal_evaluation' => $data['deal_evaluation'], 'deal_status' => ComplaintDealStatusEnum::OK]);
- $manage_messages_id = Complaint::query()->where('id', $data['id'])->value('manage_messages_id');
- //同步指挥交办里面的满意度分数
- Message::query()->where('id', $manage_messages_id)->update([
- 'deal_evaluation' => $data['deal_evaluation'],
- 'deal_status' => DealStatusEnum::OK
- ]);
- ComplaintMessage::query()->where('complaint_id', $data['id'])->where('complaint_status', ComplaintDealStatusEnum::OK)->delete();
- ComplaintMessage::query()->create([
- 'complaint_id' => $data['id'],
- 'complaint_status' => ComplaintDealStatusEnum::OK
- ]);
- return $complaint;
- }
- /**
- * 办理结果反馈
- * @param array $data
- * @return mixed
- * @throws \Prettus\Validator\Exceptions\ValidatorException
- */
- public function feedback($data)
- {
- $complaint = Complaint::query()->where('id', $data['id'])->update(['feedback' => $data['feedback'], 'deal_status' => ComplaintDealStatusEnum::FEEDBACK]);
- return $complaint;
- }
- /**
- * 用户投诉数量查询--客户端
- */
- public function nums($request)
- {
- $data = [];
- //查询全部
- $all_nums = Complaint::query()->where('status', ModelStatusEnum::OK)->where('user_id', login_user_id())->count();
- //待处理
- $wait_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::WAIT)->where('status', ModelStatusEnum::OK)->where('user_id', login_user_id())->count();
- //处理中
- $in_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::IN)->where('status', ModelStatusEnum::OK)->where('user_id', login_user_id())->count();
- //待评价
- $satisfaction_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::SATISFACTION)->where('status', ModelStatusEnum::OK)->where('user_id', login_user_id())->count();
- //处理完结
- $ok_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::OK)->where('status', ModelStatusEnum::OK)->where('user_id', login_user_id())->count();
- $data[] = [
- 'name' => '全部',
- 'count' => $all_nums,
- ];
- $data[] = [
- 'name' => '待处理',
- 'count' => $wait_nums,
- ];
- $data[] = [
- 'name' => '处理中',
- 'count' => $in_nums,
- ];
- $data[] = [
- 'name' => '待评价',
- 'count' => $satisfaction_nums,
- ];
- $data[] = [
- 'name' => '处理完结',
- 'count' => $ok_nums,
- ];
- return $data;
- }
- /**
- * 用户投诉数量查询--员工端
- */
- public function complaintNums($request)
- {
- $data = [];
- //查询全部
- $all_nums = Complaint::query()->where('status', ModelStatusEnum::OK)->count();
- //待处理
- $wait_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::WAIT)->where('status', ModelStatusEnum::OK)->count();
- //处理中
- $in_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::IN)->where('status', ModelStatusEnum::OK)->count();
- //待评价
- $satisfaction_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::SATISFACTION)->where('status', ModelStatusEnum::OK)->count();
- //处理完结
- $ok_nums = Complaint::query()->where('deal_status', ComplaintDealStatusEnum::OK)->where('status', ModelStatusEnum::OK)->count();
- $data[] = [
- 'name' => '全部',
- 'count' => $all_nums,
- ];
- $data[] = [
- 'name' => '待处理',
- 'count' => $wait_nums,
- ];
- $data[] = [
- 'name' => '处理中',
- 'count' => $in_nums,
- ];
- $data[] = [
- 'name' => '待评价',
- 'count' => $satisfaction_nums,
- ];
- $data[] = [
- 'name' => '处理完结',
- 'count' => $ok_nums,
- ];
- return $data;
- }
- /***
- * 吹哨处理完结消息通知--客户端
- * @param $request
- * @return mixed
- */
- public function messages($request)
- {
- $data = [];
- $complaints = Complaint::query()->where('user_id', login_user_id())->where('deal_status', ComplaintDealStatusEnum::OK)
- ->where('status', ModelStatusEnum::OK)->get();
- foreach ($complaints as $complaint) {
- $department_name = Department::query()->where('id', $complaint->deal_department_id)->value('name');
- $message = Message::query()->where('id', $complaint->manage_messages_id)->where('status', ModelStatusEnum::OK)->first();
- $category_name = '';
- $category_1_name = null;
- $category_2_name = null;
- $category_3_name = null;
- $category_4_name = null;
- $category_5_name = null;
- if ($message->category_1_id != 0) $category_1_name = Category::query()->where('id', $message->category_1_id)->value('name');
- if ($message->category_2_id != 0) $category_2_name = Category::query()->where('id', $message->category_2_id)->value('name');
- if ($message->category_3_id != 0) $category_3_name = Category::query()->where('id', $message->category_3_id)->value('name');
- if ($message->category_4_id != 0) $category_4_name = Category::query()->where('id', $message->category_4_id)->value('name');
- if ($message->category_5_id != 0) $category_5_name = Category::query()->where('id', $message->category_5_id)->value('name');
- if ($category_1_name != null) $category_name = $category_1_name;
- if ($category_2_name != null) $category_name = $category_name . '/' . $category_2_name;
- if ($category_3_name != null) $category_name = $category_name . '/' . $category_3_name;
- if ($category_4_name != null) $category_name = $category_name . '/' . $category_4_name;
- if ($category_5_name != null) $category_name = $category_name . '/' . $category_5_name;
- $data[] = [
- 'id' => $complaint->id,
- 'category_name' => $category_name,
- 'deal_department' => $department_name,
- 'time' => date('Y-m-d H:m:s', strtotime($complaint->updated_at))
- ];
- }
- $data = arraySort($data, 'time');
- $data_temp = ['data' => $data];
- return $data_temp;
- }
- /***
- * 吹哨处理完结消息详情--客户端
- * @param $request
- * @return mixed
- */
- public function message($req)
- {
- $data = [];
- $complaint = Complaint::query()->where('id', $req['id'])->first();
- $message = Message::query()->where('id', $complaint->manage_messages_id)->where('status', ModelStatusEnum::OK)->first();
- $category_name = '';
- $category_1_name = null;
- $category_2_name = null;
- $category_3_name = null;
- $category_4_name = null;
- $category_5_name = null;
- if ($message->category_1_id != 0) $category_1_name = Category::query()->where('id', $message->category_1_id)->value('name');
- if ($message->category_2_id != 0) $category_2_name = Category::query()->where('id', $message->category_2_id)->value('name');
- if ($message->category_3_id != 0) $category_3_name = Category::query()->where('id', $message->category_3_id)->value('name');
- if ($message->category_4_id != 0) $category_4_name = Category::query()->where('id', $message->category_4_id)->value('name');
- if ($message->category_5_id != 0) $category_5_name = Category::query()->where('id', $message->category_5_id)->value('name');
- if ($category_1_name != null) $category_name = $category_1_name;
- if ($category_2_name != null) $category_name = $category_name . '/' . $category_2_name;
- if ($category_3_name != null) $category_name = $category_name . '/' . $category_3_name;
- if ($category_4_name != null) $category_name = $category_name . '/' . $category_4_name;
- if ($category_5_name != null) $category_name = $category_name . '/' . $category_5_name;
- $data = [
- 'category_name' => $category_name,
- 'content' => $complaint->content,
- 'deal_result' => $complaint->deal_result,
- 'time' => date('Y-m-d H:m:s', strtotime($complaint->updated_at))
- ];
- return $data;
- }
- /***
- * 吹哨处理完结消息通知--员工端
- * @param $request
- * @return mixed
- */
- public function messagesAdmin($request)
- {
- $data = [];
- $complaints = Complaint::query()->where('deal_admin_id', login_admin_id())->where('deal_status', ComplaintDealStatusEnum::OK)
- ->where('status', ModelStatusEnum::OK)->get();
- foreach ($complaints as $complaint) {
- $message = Message::query()->where('id', $complaint->manage_messages_id)->where('status', ModelStatusEnum::OK)->first();
- $category_name = '';
- $category_1_name = null;
- $category_2_name = null;
- $category_3_name = null;
- $category_4_name = null;
- $category_5_name = null;
- if ($message->category_1_id != 0) $category_1_name = Category::query()->where('id', $message->category_1_id)->value('name');
- if ($message->category_2_id != 0) $category_2_name = Category::query()->where('id', $message->category_2_id)->value('name');
- if ($message->category_3_id != 0) $category_3_name = Category::query()->where('id', $message->category_3_id)->value('name');
- if ($message->category_4_id != 0) $category_4_name = Category::query()->where('id', $message->category_4_id)->value('name');
- if ($message->category_5_id != 0) $category_5_name = Category::query()->where('id', $message->category_5_id)->value('name');
- if ($category_1_name != null) $category_name = $category_1_name;
- if ($category_2_name != null) $category_name = $category_name . '/' . $category_2_name;
- if ($category_3_name != null) $category_name = $category_name . '/' . $category_3_name;
- if ($category_4_name != null) $category_name = $category_name . '/' . $category_4_name;
- if ($category_5_name != null) $category_name = $category_name . '/' . $category_5_name;
- $data[] = [
- 'id' => $complaint->id,
- 'complaint_name' => $complaint->complaint_name,
- 'deal_evaluation' => $complaint->deal_evaluation,
- 'category_name' => $category_name,
- 'time' => date('Y-m-d H:m:s', strtotime($complaint->updated_at))
- ];
- }
- $data = arraySort($data, 'time');
- $data_temp = ['data' => $data];
- return $data_temp;
- }
- /***
- * 吹哨处理完结消息详情--员工端
- * @param $request
- * @return mixed
- */
- public function messageAdmin($req)
- {
- $data = [];
- $data_image = [];
- $complaint = Complaint::query()->where('id', $req['id'])->first();
- if (count($complaint->relevant_documents)) {
- foreach ($complaint->relevant_documents as $id) {
- $resource = Resource::query()->where('id', $id)->first();
- //判断图片还是视频,供前端判断
- $type = 0;
- $img_type = config('site.img_type');
- $video_type = config('site.video_type');
- $arr = explode('.', $resource->path);
- if (strpos($img_type, $arr[1]) !== false) $type = 1;
- if (strpos($video_type, $arr[1]) !== false) $type = 2;
- $data_image[] = [
- 'path' => $resource->path,
- 'url' => $resource->url,
- 'type' => $type
- ];
- }
- }
- $message = Message::query()->where('id', $complaint->manage_messages_id)->where('status', ModelStatusEnum::OK)
- ->with(['deal_department'])->with(['deal_admin'])->first();
- $data = [
- 'content' => $complaint->content,
- 'images' => $data_image,
- 'complaint_name' => $complaint->complaint_name,
- 'complaint_phone' => $complaint->complaint_phone,
- 'create_time' => date('Y-m-d H:m:s', strtotime($complaint->updated_at)),
- // 'assign_deal_time' => date('Y-m-d H:m:s', strtotime($complaint->updated_at)),
- 'deal_department' => $message['deal_department']['name'],
- 'deal_admin' => $message['deal_admin']['name'],
- 'deal_status' => $complaint->deal_status,
- 'assign_deal_time' => date('Y-m-d H:m:s', strtotime($message->deal_time)),
- 'deal_limit_day' => $message->deal_limit_day,
- 'deal_idea' => $message->deal_idea,
- 'deal_evaluation' => $complaint->deal_evaluation,
- ];
- return $data;
- }
- /**
- * 审核申请--民意直通车自动审核成功
- * @param $data
- * @return bool
- */
- public function handleCheckApplicationMultiDepartment($data)
- {
- ini_set('memory_limit', '1024M');
- $model = Message::query()->where('id', $data['id'])->first();
- if (!$model) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '找不到该记录');
- if ($model->deal_status == DealStatusEnum::OK) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '已经处理完成,暂不能申请');
- if ($model->is_more_department == 1 && $model->check_status == StatusEnum::SUCCESS) abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '管理员已经审核通过,暂不支持操作');
- $department_ids = array_column($data['multiData'], 'department_id');
- if (!in_array($model->deal_department_id, $department_ids)) {
- abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, '协助部门必须有本部门');
- }
- $admin = login_admin();
- unset($data['id']);
- unset($data['multiData']['*']);
- DB::beginTransaction();
- try {
- $model->check_status = StatusEnum::SUCCESS;
- $model->extra = $data;
- $model->is_more_department = 1;
- $day = 0;
- Jieba::init();
- Finalseg::init();
- foreach ($data['multiData'] as $key => $item) {
- $seg_list = Jieba::cut($item['body']);
- Message::query()->create([
- 'no' => $model['no'] . '-' . ($key + 1),
- 'type_id' => $model['type_id'],
- 'category_1_id' => $model['category_1_id'],
- 'category_2_id' => $model['category_2_id'],
- 'category_3_id' => $model['category_3_id'],
- 'category_4_id' => $model['category_4_id'],
- 'category_5_id' => $model['category_5_id'],
- 'name' => $model['name'],
- 'mobile' => $model['mobile'],
- 'address_id' => $model['address_id'],
- 'address_name' => $model['address_name'],
- 'complain_date' => $model['complain_date'],
- 'warn_type_id' => $model['warn_type_id'],
- 'body' => $item['body'],
- 'body_md5' => md5($item['body']),
- 'keywords' => $seg_list,
- 'deal_department_id' => $item['department_id'],
- 'deal_admin_id' => 0,
- 'deal_evaluation' => 0,
- 'deal_status' => DealStatusEnum::IN,
- 'assign_deal_time' => Carbon::now()->toDateTimeString(),
- 'assign_admin_id' => $admin['id'],
- 'is_assign_status' => 1,
- 'deal_limit_day' => $item['limit_day'],
- 'deal_limit_date' => Carbon::now()->addDays($item['limit_day'])->toDateTimeString(),
- 'is_more_department' => 1,
- 'extra' => $item,
- 'more_pid' => $model->id,
- 'import_department_id' => $item['department_id'],
- 'status' => 1
- ]);
- if ($day < $item['limit_day']) $day = $item['limit_day'];
- }
- $model->deal_limit_day = $day;
- $model->deal_limit_date = Carbon::now()->addDays($day);
- $model->save();
- DB::commit();
- } catch (\Exception $exception) {
- DB::rollBack();
- abort(ResponseCodeEnum::SERVICE_OPERATION_ERROR, $exception->getMessage());
- }
- return true;
- }
- }
|