WeibanExternal.php 7.5 KB

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