WorkExternal.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. <?php
  2. namespace App\Http\Controllers\Admin;
  3. use App\Models\Custom;
  4. use App\Models\Work\External as Model;
  5. use App\Models\Work\Tag as WorkTags;
  6. use App\Facades\Servers\WechatWork\User as WorkUser;
  7. use App\Facades\Servers\WechatWork\CorpTag as WorkTag;
  8. use Illuminate\Support\Carbon;
  9. use Illuminate\Support\Facades\DB;
  10. /**
  11. * 客户管理
  12. *
  13. * @author 刘相欣
  14. *
  15. */
  16. class WorkExternal extends Auth
  17. {
  18. protected function _initialize()
  19. {
  20. parent::_initialize();
  21. $this->assign('breadcrumb1', '用户管理');
  22. $this->assign('breadcrumb2', '企微客户');
  23. }
  24. /**
  25. * 列表页
  26. *
  27. * */
  28. public function index(Model $Model, Custom $Custom, WorkTags $WorkTags){
  29. // 接受参数
  30. $id = request('id', '');
  31. $status = request('status');
  32. $name = request('name');
  33. $phone = request('phone');
  34. $remark = request('remark');
  35. $startTime = request('start_time', '');
  36. // 查询条件
  37. $map = [];
  38. // 编码ID
  39. if ($id) $map[] = ['work_external.external_userid', '=', $id];
  40. if ($name) $map[] = ['work_external.name', '=', $name];
  41. if ($phone) $map[] = ['work_user.remark_mobiles', 'LIKE', '%' . $phone . '%'];
  42. if ($remark) $map[] = ['work_user.remark', '=', $remark];
  43. if ($startTime) $map[] = ['work_external.insert_time', '>=', Carbon::createFromFormat('Y-m-d', $startTime)->startOfDay()->getTimestamp()];
  44. if ($startTime) $map[] = ['work_external.insert_time', '<=', Carbon::createFromFormat('Y-m-d', $startTime)->endOfDay()->getTimestamp()];
  45. if (!is_null($status)) $map[] = ['work_external.status', '=', $status];
  46. // 查询数据
  47. $list = $Model->query()->join('work_user', 'work_user.external_userid', '=', 'work_external.external_userid')->where($map)->groupBy('work_external.external_userid')->orderByDesc('id')->paginate(config('page_num', 10), ['work_external.*', 'work_user.work_userid', 'work_user.remark', 'work_user.remark_company', 'work_user.remark_mobiles'])->appends(request()->all());
  48. // 循环处理数据
  49. foreach ($list as $key => $value) {
  50. // 如果有手机号,但是没有客户ID
  51. if ($value['remark_mobiles'] && !$value['custom_uid']) {
  52. // 获取手机号
  53. $phone = explode(',', $value['remark_mobiles']);
  54. // 通过手机号查询
  55. $custom = $Custom->getOneByPhone($phone);
  56. // 如果已经注册
  57. $value['custom_uid'] = $custom ? $Custom->edit($custom['uid'], ['username' => $value['name'], 'userpic' => $value['avatar'], 'sex' => $value['gender'], 'external_userid' => $value['external_userid']]) : $Custom->add(['phone' => $phone, 'username' => $value['name'], 'userpic' => $value['avatar'], 'sex' => $value['gender'], 'external_userid' => $value['external_userid']]);
  58. // 如果有系统用户
  59. if ($value['custom_uid']) $Model->edit($value['id'], ['custom_uid' => $value['custom_uid']]);
  60. }
  61. // id转编号
  62. $value['custom_code'] = $value['custom_uid'] ? $Custom->idToCode($value['custom_uid']) : '';
  63. // 获取标签
  64. $value['tags_list'] = $WorkTags->getListByExtUserId($value['external_userid']);
  65. // 重组
  66. $list[$key] = $value;
  67. }
  68. // 获取部门数据
  69. $partUserList = WorkUser::getListDepart();
  70. // 获取标签数据
  71. $corpTagList = WorkTag::getList();
  72. // 分配数据
  73. $this->assign('empty', '<tr><td colspan="20">~~暂无数据</td></tr>');
  74. $this->assign('list', $list);
  75. $this->assign('partUserList', $partUserList);
  76. $this->assign('corpTagList', $corpTagList);
  77. // 加载模板
  78. return $this->fetch();
  79. }
  80. /**
  81. * 打标签
  82. *
  83. */
  84. public function mark_tags(Model $Model, WorkTags $WorkTags){
  85. // 接受参数
  86. $extUserid = request('external_userid', '');
  87. $userid = request('work_userid', '');
  88. // 查询条件
  89. $map = [];
  90. // 编码ID
  91. if ($extUserid) $map[] = ['work_external.external_userid', '=', $extUserid];
  92. if ($userid) $map[] = ['work_user.work_userid', '=', $userid];
  93. // 查询数据
  94. $oldData = $Model->query()->join('work_user', 'work_user.external_userid', '=', 'work_external.external_userid')->where($map)->first(['work_external.*', 'work_user.work_userid', 'work_user.remark', 'work_user.remark_company', 'work_user.remark_mobiles']);
  95. // 修改
  96. if( request()->isMethod('post') ){
  97. // 如果数据不存在
  98. if( !$oldData ) return json_send(['code'=>'error','msg'=>'查无该客户信息']);
  99. // 数据处理
  100. $oldData = $oldData->toArray();
  101. // 组合数据
  102. $tags = request('tags',[]);
  103. // 获取客户的原来标签
  104. $oldData = $WorkTags->getListByExtUserId($oldData['external_userid']);
  105. // 原标签对比新标签多出来的,移除
  106. $rmTags = array_diff($oldData,$tags);
  107. // 新标签对比原标签多出来的,新增
  108. $addTags = array_diff($tags,$oldData);
  109. // 获取标签数据
  110. $corpTagList = WorkTag::getList();
  111. // 事务
  112. DB::beginTransaction();
  113. // 尝试执行代码
  114. try {
  115. // 删除结果
  116. $tagList = [];
  117. // 循环标签
  118. foreach ($corpTagList as $group){
  119. foreach ($group['tag'] as $tag){
  120. if( in_array($tag['id'],$tags)) $tagList[] = ['group_name'=>$group['group_name'],'tag_name'=>$tag['name'],'tag_id'=>$tag['id'],'type'=>1];
  121. }
  122. }
  123. // 修改标签
  124. $result = $WorkTags->upsertTags($userid,$extUserid,$tagList);
  125. // 修改结果
  126. if( !$result ) {
  127. // 回滚
  128. DB::rollBack();
  129. // 提示
  130. return json_send(['code'=>'error','msg'=>'客户标签更新失败']);
  131. }
  132. // 企微打标签
  133. $result = WorkTag::markTags($userid,$extUserid,$addTags,$rmTags);
  134. // 修改结果
  135. if( !$result ) {
  136. // 回滚
  137. DB::rollBack();
  138. // 提示
  139. return json_send(['code'=>'error','msg'=>'客户标签同步失败']);
  140. }
  141. // 提交
  142. DB::commit();
  143. // 告知结果
  144. return json_send(['code'=>'success','msg'=>'客户标签成功','action'=>'add']);
  145. } catch (\Throwable $th) {
  146. // 回滚
  147. DB::rollBack();
  148. // 修改结果
  149. return json_send(['code'=>'error','msg'=>'客户标签标记失败','data'=>['error'=>$th->getMessage()]]);
  150. }
  151. }
  152. // 如果数据不存在
  153. if( !$oldData ) return $this->error('查无该客户信息');
  154. // 数据处理
  155. $oldData = $oldData->toArray();
  156. // 获取标签
  157. $oldData['tags'] = $WorkTags->getPulckByExtUserId($oldData['external_userid'],$oldData['work_userid']);
  158. // 获取部门数据
  159. $partUserList = WorkUser::getListDepart();
  160. // 获取标签数据
  161. $corpTagList = WorkTag::getList();
  162. // 分配数据
  163. $this->assign('crumbs','客户标签');
  164. $this->assign('oldData', $oldData);
  165. $this->assign('partUserList', $partUserList);
  166. $this->assign('corpTagList', $corpTagList);
  167. // 加载模板
  168. return $this->fetch();
  169. }
  170. }