123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008 |
- <?php
- namespace app\api\controller;
- use app\logics\SmsLogic;
- use app\logics\UserLogic;
- use app\model\Customer;
- use app\model\Employee;
- use app\model\Miniprogram;
- use app\model\Org;
- use app\model\User;
- use app\model\UserSignLog;
- use app\model\WeworksingleCompanySetting;
- use app\model\WeworksingleChatRecord;
- use app\model\WeworksingleCustomer;
- use app\model\WeworksingleUser;
- use EasyWeChat\Factory;
- use Firebase\JWT\JWT;
- use openssl\Aes;
- use think\facade\Log;
- use app\model\Company;
- use toolkits\Aec;
- use weworkapi\api\apiSingle;
- /**
- * 企业微信登录相关(单应用部署)
- * Class Wework
- * @package app\apiSingle\controller
- */
- class WeworkSingle extends Base
- {
- /**
- * 获取授权链接
- */
- public function getAuthLink(){
- $ticket = input('ticket', '', 'trim');
- $config = WeworksingleCompanySetting::where('ticket', '=', $ticket)->find();
- $single_config['corp_id'] = $config['corp_id'];
- $single_config['agent_id'] = $config['agent_id'];
- $single_config['secret'] = $config['agent_secret'];
- /*$single_config['token'] = $config['receive_token'];
- $single_config['aes_key'] = $config['receive_aes_key'];*/
- $app = Factory::work($single_config);
- $redirectUrl = request()->domain() . '/weworksingle.html#/signLogin';
- //$redirectUrl = input('redirectUrl', '', 'trim');
- $app->oauth->redirect($redirectUrl);
- $link = $app->oauth->getAuthUrl();
- return json(['code' => self::success, 'data' => $link, 'msg' => '获取成功']);
- }
- /**
- * 根据授权code换取用户信息,查询到信息则返回token,没有则返回对应的状态节点信息。
- * 返回码 -1、未绑定企业 0、正常 2、跳转到手机号登录页 3、跳转到选择企业页面,选择完之后再去登录 4、选择企业页面,选择完直接进入系统(弃用,不安全,默认进入最近进入的账号)
- * @return \think\response\Json
- * @throws \EasyWeChat\Kernel\Exceptions\InvalidConfigException
- * @throws \think\db\exception\DataNotFoundException
- * @throws \think\db\exception\DbException
- * @throws \think\db\exception\ModelNotFoundException
- */
- public function getUserByCode(){
- $code = input('code', '', 'trim');
- $ticket = input('ticket', '', 'trim');
- $config = WeworksingleCompanySetting::where('ticket', '=', $ticket)->find();
- $single_config['corp_id'] = $config['corp_id'];
- $single_config['agent_id'] = $config['agent_id'];
- $single_config['secret'] = $config['agent_secret'];
- $single_config['token'] = $config['receive_token'];
- $single_config['aes_key'] = $config['receive_aes_key'];
- $app = Factory::work($single_config);
- $user = $app->oauth->detailed()->userFromCode($code);
- //return json(['code'=> self::error_msg, 'msg'=> '获取授权信息失败', 'data'=> '']);
- // 获取用户信息
- $userid = $user->getId(); // 对应企业微信英文名(userid)
- $info = $user->getRaw(); // 获取企业微信接口返回的原始信息
- $where[] = ['userid', '=', $userid];
- $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id');
- if (empty($company_ids)){
- return json(['code'=> -1, 'msg'=> '未绑定企业', 'data'=> []]);
- }
- $where[] = ['company_id', 'in', $company_ids];
- $users = WeworksingleUser::where($where)->select()->toArray();
- $wx_uid = 0;
- $company_id = 0; //能直接登录的企业
- if (empty($users)) {
- // 查询有已创建的用户信息,但是未绑定所在店面的企业微信用户数据
- $wx_result = WeworksingleUser::where([['userid', '=', $userid], ['company_id', '=', 0]])->findOrEmpty();
- if ($wx_result->isEmpty()) {
- $info['company_id'] = 0;
- $info['name'] = !empty($info['name']) ? $info['name'] : '';
- $info['mobile'] = !empty($info['mobile']) ? $info['mobile'] : '';
- $info['department'] = !empty($info['department']) ? implode(',', $info['department']) : '';
- $info['order_department'] = !empty($info['order']) ? implode(',', $info['order']) : '';
- $info['position'] = !empty($info['position']) ? $info['position'] : '';
- $info['gender'] = !empty($info['gender']) ? $info['gender'] : '';
- $info['email'] = !empty($info['email']) ? $info['email'] : '';
- $info['biz_mail'] = !empty($info['biz_mail']) ? $info['biz_mail'] : '';
- $info['is_leader_in_dept'] = !empty($info['is_leader_in_dept']) ? implode(',', $info['is_leader_in_dept']) : '';
- $info['direct_leader'] = !empty($info['direct_leader']) ? implode(',', $info['direct_leader']) : '';
- $info['avatar'] = !empty($info['avatar']) ? $info['avatar'] : '';
- $info['thumb_avatar'] = !empty($info['thumb_avatar']) ? $info['thumb_avatar'] : '';
- $info['telephone'] = !empty($info['telephone']) ? $info['telephone'] : '';
- $info['alias'] = !empty($info['alias']) ? $info['alias'] : '';
- $info['extattr'] = !empty($info['extattr']) ? json_encode($info['extattr']) : '';
- $info['status'] = !empty($info['status']) ? $info['status'] : '';
- $info['qr_code'] = !empty($info['qr_code']) ? $info['qr_code'] : '';
- $info['external_profile'] = !empty($info['external_profile']) ? json_encode($info['external_profile']) : '';
- $info['external_position'] = !empty($info['external_position']) ? $info['external_position'] : '';
- $info['address'] = !empty($info['address']) ? $info['address'] : '';
- $info['open_userid'] = !empty($info['open_userid']) ? $info['open_userid'] : '';
- $info['main_department'] = !empty($info['main_department']) ? $info['main_department'] : '';
- $info['chat_record'] = 0;
- $wx_result = WeworksingleUser::create($info);
- $wx_uid = $wx_result->id;
- } else {
- $wx_uid = $wx_result->id;
- }
- if (count($company_ids) > 1) {
- return json(['code'=> 3, 'msg'=> '请选择要进入的企业', 'data'=> ['wx_uid'=> $wx_uid]]);
- } else {
- $wx_result->company_id = $company_ids[0];
- $wx_result->save();
- return json(['code'=> 2, 'msg'=> '请先登录', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_ids[0]]]);
- }
- } else {
- $bind_count = 0; //判断这多个用户信息绑定了几家店面
- $weworksingle_uid = array_column($users, 'id');
- $bind_employee = Employee::where([['weworksingle_uid', 'in', $weworksingle_uid], ['state', '=', '在职']])->order('updatetime desc')->select();
- $bind_count = $bind_employee->count();
- if ($bind_count > 0){ //多店面账号 和 单一账号都默认最近登录的账号进入
- // 找最近登录的账号默认进入
- $wx_uid = $bind_employee[0]['weworksingle_uid'];
- foreach ($users as $u) {
- if ($u['id'] == $wx_uid){
- $company_id = $u['company_id'];
- }
- }
- } else {
- //没有有效用户,去登陆 离职、审核中、企业微信没绑定 这些用户
- $wx_uid = implode(',', array_column($users, 'id'));
- if (count($company_ids) > 1) {
- return json(['code'=> 3, 'msg'=> '请选择要进入的企业', 'data'=> ['wx_uid'=> $wx_uid]]);
- } else {// 企业微信没绑定
- return json(['code'=> 2, 'msg'=> '请先登录', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_ids[0]]]);
- }
- }
- }
- // 先判断公司账号情况
- $company = Company::where(['id'=> $company_id])->find();
- if ($company['status'] == 1) {
- return json(['code' => 2, 'msg' => '集团账号被禁用,请联系管理员', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_id]]);
- } elseif ($company['end_date'] . ' 23:59:59' < date('Y-m-d H:i:s', time())) {
- return json(['code' => 2, 'msg' => '集团账号已过期,请联系管理员', 'data'=> ['wx_uid'=> $wx_uid, 'company_id'=> $company_id]]);
- }
- // 查询是否有绑定员工
- $employee = Employee::where('weworksingle_uid', '=', $wx_uid)->find();
- $employee->save(['updatetime' => date('Y-m-d H:i:s')]);
- // 查询到员工,返回token
- $token = [
- 'root_org' => $employee['root_id'],
- 'isEmployee' => true,
- 'uid' => $employee['uid'],
- 'employee_id'=> $employee['id'],
- 'org_id' => $employee['org_id'],
- 'isManager' => $employee['is_manager']
- ];
- $logic = new UserLogic();
- $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']);
- $company = Company::where('root_id', $employee['root_id'])->find();
- $company['client_type'] = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify');
- $token['client_type'] = $company['client_type'];
- // 查询是设计部门还是销售部门
- $orgType = Org::where('id', $employee->org_id)->value('org_type');
- $token['org_type'] = $orgType;
- // 信息加密
- $data = http_build_query($token);
- $aes = new Aes(config('app.jwt_key'));
- $key = $aes->encrypt($data);
- // token数据设置
- $payload = array(
- "iss" => "https://" . request()->domain(),
- "aud" => 'mini',
- "iat" => time(),
- "nbf" => time(),
- "data" => $key
- );
- // 自定义登陆状态
- $token = JWT::encode($payload, config('app.jwt_key'));
- $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company];
- return json($returnData);
- }
- /**
- * 根据ticket获取绑定的企业列表
- */
- public function getCompanyByTicket(){
- $ticket = input('ticket', '', 'trim');
- $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id');
- $companyList = Company::where([['id', 'in', $company_ids]])->field('id,company_name,logo,status,end_date')->select()->toArray();
- foreach ($companyList as $k => $v) {
- if ($v['status'] == 1 || $v['end_date'] < date('Y-m-d')) {
- unset($companyList[$k]);
- }
- }
- return json(['code' => 0, 'data' => array_values($companyList)]);
- }
- /**
- * 获取手机验证码
- */
- public function sms($phone)
- {
- $content = '验证码:%code%(请勿转告他人),有效时间15分钟,请尽快完成验证';
- $smsLogic = new SmsLogic();
- $rs = $smsLogic->sendSms($phone, 'employee_login_phone', $content);
- if (!$rs) return json(['code' => 1, 'msg' => '短信发送失败']);
- return json(['code' => 0, 'msg' => '短信发送成功']);
- }
- /**
- * 手机号验证码登陆
- */
- public function phone_login($phone)
- {
- $aec = new Aec(config('app.aec_key'), config('app.aec_iv'));
- $phone = $aec->encrypt($phone);
- $wx_uid = input('wx_uid', '', 'trim');
- $company_id = input('company_id', '', 'intval');
- $wx_user = WeworksingleUser::where([['id', 'in', $wx_uid], ['company_id', '=', $company_id]])->findOrEmpty();
- if ($wx_user->isEmpty()) {
- // 首次绑定
- $wx_user = WeworksingleUser::where([['id', 'in', $wx_uid], ['company_id', '=', 0]])->findOrEmpty();
- if ($wx_user->isEmpty()){
- return json(['code' => self::error_msg, 'msg' => '账号异常']);
- } else {
- $wx_user->company_id = $company_id;
- $wx_user->save();
- }
- }
- $company = Company::where(['id'=> $company_id])->find();
- if ($company['status'] == 1) {
- return json(['code' => self::error_msg, 'msg' => '账号被禁用,请联系管理员']);
- } elseif ($company['end_date'] . ' 23:59:59' < date('Y-m-d H:i:s', time())) {
- return json(['code' => self::error_msg, 'msg' => '账号已过期,请联系管理员']);
- }
- $employee = Employee::where([['phone', '=', $phone], ['root_id', '=', $company['root_id']], ['state', '=', '在职'], ['uid', '>', 0]])->find();
- if (empty($employee)) return json(['code' => self::error_msg, 'msg' => '未查询到此账号']);
- $employee->weworksingle_uid = $wx_user->id; // 关联企业微信用户信息到系统用户
- $employee->updatetime = date('Y-m-d H:i:s');
- $employee->save();
- // 查询到员工,返回token
- $token = [
- 'root_org' => $employee['root_id'],
- 'isEmployee' => true,
- 'uid' => $employee['uid'],
- 'employee_id'=> $employee['id'],
- 'org_id' => $employee['org_id'],
- 'isManager' => $employee['is_manager']
- ];
- $logic = new UserLogic();
- $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']);
- $company = Company::where('root_id', $employee['root_id'])->find();
- $company['client_type'] = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify');
- $token['client_type'] = $company['client_type'];
- // 查询是设计部门还是销售部门
- $orgType = Org::where('id', $employee->org_id)->value('org_type');
- $token['org_type'] = $orgType;
- // 信息加密
- $data = http_build_query($token);
- $aes = new Aes(config('app.jwt_key'));
- $key = $aes->encrypt($data);
- // token数据设置
- $payload = array(
- "iss" => "https://" . request()->domain(),
- "aud" => 'mini',
- "iat" => time(),
- "nbf" => time(),
- "data" => $key
- );
- // 自定义登陆状态
- $token = JWT::encode($payload, config('app.jwt_key'));
- $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company];
- return json($returnData);
- }
- public function company()
- {
- $ticket = input('ticket', '', 'trim');
- if (empty($ticket)) {
- return json(['code' => 0, 'data' => []]);
- }
- $token = $this->request->token;
- // 用token中的openid获取用户的uid列表
- $uidList = User::where(['mini_openid' => $token['openid']])->column('id');
- $employees = Employee::where([['uid', 'in', $uidList], ['state', '=', '在职']])->column('root_id, is_manager, org_id', 'root_id');
- $orgs = Org::where([['id', 'in', array_column($employees, 'org_id')]])->column('id,name', 'id');
- $notifyList = Miniprogram::where([['root_id', 'in', array_column($employees, 'root_id')]])->column('root_id,notify', 'root_id');
- $company_ids = WeworksingleCompanySetting::where('ticket', '=', $ticket)->column('company_id');
- $companyList = Company::with(['brand'])->where([['root_id', 'in', array_column($employees, 'root_id')], ['id', 'in', $company_ids]])->select()->visible(['company_name', 'root_id','status','end_date'])->toArray();
- foreach ($companyList as &$item) {
- $item['client_type'] = isset($notifyList[$item['root_id']]) ? $notifyList[$item['root_id']]['notify'] : '';
- $item['is_manager'] = isset($employees[$item['root_id']]) ? $employees[$item['root_id']]['is_manager'] : 0;
- $item['org_name'] = (isset($employees[$item['root_id']]) && isset($orgs[$employees[$item['root_id']]['org_id']])) ? $orgs[$employees[$item['root_id']]['org_id']]['name'] : '';
- if ($item['status']==1) {
- $item['off'] = 1;
- $item['off_remark'] = '账号被禁用';
- }elseif ($item['end_date']<date('Y-m-d')) {
- $item['off'] = 1;
- $item['off_remark'] = '账号已过期';
- }else{
- $item['off'] = 0;
- $item['off_remark'] = '账号正常';
- }
- }
- return json(['code' => self::success, 'data' => $companyList]);
- }
- /**
- * 切换店面
- */
- public function changeCompany(){
- $company_id = input('company_id', '', 'intval');
- $company_info = Company::where('id', $company_id)->find();
- if ($company_info['end_date'] < date('Y-m-d') || $company_info['status'] == 1) { //账号过期或关闭
- return json(['code'=> self::error_msg, 'msg'=> '店面账号异常']);
- }
- $token = $this->request->token;
- $wx_uid = Employee::where('id', '=', $token['employee_id'])->value('weworksingle_uid');
- $wx_user = WeworksingleUser::where('id', '=', $wx_uid)->findOrEmpty();
- if ($wx_user->isEmpty()) {
- return json(['code'=> self::error_msg, 'msg'=> '操作失败']);
- }
- $old_user = User::where('id', '=', $token['uid'])->find();
- // 选择的企业
- $company_root = Company::where('id', '=', $company_id)->value('root_id');
- $uidList = User::where([['mini_openid', '=', $old_user['mini_openid']], ['root_id', '=', $company_root]])->column('id');
- if (count($uidList) == 0) {
- $employee = null;
- } else {
- $condition = [['uid', 'in', $uidList], ['state', 'in', ['在职']]];
- $employee = Employee::where($condition)->order('updatetime desc')->find();
- }
- if (empty($employee)) {
- return json(['code'=> self::error_msg, 'msg'=> '操作失败', 'data'=> []]);
- } else {
- $employee->updatetime = date('Y-m-d H:i:s');
- $employee->save();
- }
- //企业微信用户表信息copy
- $company_user = WeworksingleUser::where([['userid', '=', $wx_user['userid']], ['company_id', '=', $company_id]])->findOrEmpty();
- if ($company_user->isEmpty()){
- $data = $wx_user;
- unset($data['id']);
- $data['company_id'] = $company_id;
- WeworksingleUser::create($data);
- }
- $user = User::where('id', '=', $employee['uid'])->find();
- $miniType = Miniprogram::where('root_id', '=', $employee['root_id'])->value('notify');
- // 初始token
- $token = [
- 'client_type' => $miniType,
- 'root_org' => $employee['root_id'],
- 'isEmployee' => true,
- 'uid' => $employee['uid'],
- 'employee_id'=> $employee['id'],
- 'org_id' => $employee['org_id'],
- 'isManager' => $employee['is_manager']
- ];
- // 查询是设计部门还是销售部门
- $orgType = Org::where('id', $employee->org_id)->value('org_type');
- $token['org_type'] = $orgType;
- $user->updatetime = date('Y-m-d H:i:s');
- $user->save();
- $logic = new UserLogic();
- $user = $logic->getInfo([['id', '=', $employee['uid']]], ['id', 'nickname', 'headimgurl', 'sex', 'subscribe', 'phone']);
- $company = Company::where('root_id', $employee['root_id'])->find();
- $company['client_type'] = $miniType;
- // 信息加密
- $data = http_build_query($token);
- $aes = new Aes(config('app.jwt_key'));
- $key = $aes->encrypt($data);
- // token数据设置
- $payload = array(
- "iss" => "https://" . request()->domain(),
- "aud" => 'mini',
- "iat" => time(),
- "nbf" => time(),
- "data" => $key
- );
- // 自定义登陆状态
- $token = JWT::encode($payload, config('app.jwt_key'));
- $returnData = ['code' => self::success, 'token' => $token, 'user' => $user, 'company' =>$company->company_name, 'company_data'=>$company];
- return json($returnData);
- }
- /**
- * 企业微信和员工账号解绑
- */
- public function unbind(){
- $token = $this->request->token;
- $employee = Employee::where('id', '=', $token['employee_id'])->find();
- $employee->weworksingle_uid = '';
- $result = $employee->save();
- if ($result){
- return json(['code'=> self::success, 'msg'=> '解绑成功']);
- } else {
- return json(['code'=> self::error_msg, 'msg'=> '操作失败']);
- }
- }
- /**
- * 返回JS-SDK所需配置
- */
- public function getJsSdk(){
- $url = input('url', '', 'trim');
- $root_org = $this->request->token['root_org'];
- $company_id = Company::where('root_id', '=', $root_org)->value('id');
- $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
- if (empty($setting)) {
- return json(['code'=> self::error_msg, 'msg'=> '请求失败']);
- }
- $config['corp_id'] = $setting['corp_id'];
- $config['agent_id'] = $setting['agentid'];
- $config['secret'] = $setting['agent_secret'];
- $app = Factory::work($config);
- $jssdk = $app->jssdk->buildConfig([],false, false, false, [], $url);
- return json(['code'=> self::success, 'data'=> $jssdk, 'msg'=> '请求成功']);
- }
- /**
- * 返回应用的JS-SDK所需配置
- */
- public function getAgentJsSdk(){
- $url = input('url', '', 'trim');
- $root_org = $this->request->token['root_org'];
- $company_id = Company::where('root_id', '=', $root_org)->value('id');
- $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
- if (empty($setting)) {
- return json(['code'=> self::error_msg, 'msg'=> '请求失败']);
- }
- $config['corp_id'] = $setting['corp_id'];
- $config['agent_id'] = $setting['agentid'];
- $config['secret'] = $setting['agent_secret'];
- $app = Factory::work($config);
- $jssdk = $app->jssdk->buildAgentConfig([], $setting['agentid'], true, false, false, [], $url);
- return json(['code'=> self::success, 'data'=> $jssdk, 'msg'=> '请求成功']);
- }
- /**
- * 获取某位员工的外部联系人列表
- */
- public function getExternalContact(){
- $search = $this->request->param('name', '', 'trim');
- $external_userid = $this->request->param('external_userid', '', 'trim');
- $page = $this->request->param('page', 1, 'intval');
- $employee_id = $this->request->token['employee_id'];
- $employee = Employee::find($employee_id)->toArray();
- $wx_user = WeworksingleUser::find($employee['weworksingle_uid']);
- if (empty($wx_user)){
- return json(['code'=> self::error_msg, 'msg'=> '获取失败']);
- }
- $config = WeworksingleCompanySetting::where('company_id', '=', $wx_user['company_id'])->find();
- if (empty($config['customer_secret']) || empty($config['customer_token']) || empty($config['customer_aes_key'])){
- return json(['code'=> self::error_msg, 'msg'=> '获取失败']);
- }
- $customer_config['corp_id'] = $config['corp_id'];
- $customer_config['secret'] = $config['customer_secret'];
- $customer_config['token'] = $config['customer_token'];
- $customer_config['aes_key'] = $config['customer_aes_key'];
- // 外部联系人id
- /*$external_ids_result = Factory::work($customer_config)->external_contact->list($wx_user['userid']);
- $external_ids = $external_ids_result['external_userid'];*/
- // 外部联系人拉取并更新
- $app = (new apiSingle($customer_config));
- $external_list = $app->getCustomerDetailByUser([$wx_user['userid']]);
- $old_list = (new WeworksingleCustomer())->where('userid', '=', $wx_user['userid'])->select()->toArray();
- $save_data = []; // 需要保存的数组
- foreach ($external_list as $k => $v) {
- unset($data);
- $data['customer_id'] = 0;
- // 如果用户存在,则默认更新
- foreach ($old_list as $h_k => $h_v){
- if ($v['external_contact']['external_userid'] == $h_v['external_userid'] && $v['follow_info']['userid'] == $h_v['userid']) {
- $data['id'] = $h_v['id'];
- $data['customer_id'] = $h_v['customer_id'];
- unset($old_list[$h_k]); // 匹配到则删除,剩余的为被删除的客户。
- }
- }
- $data['userid'] = $wx_user['userid'];
- $data['employee_id'] = $employee_id;
- $data['company_id'] = $wx_user['company_id'];
- $data['external_userid'] = !empty($v['external_contact']['external_userid']) ? $v['external_contact']['external_userid'] : '';
- $data['status'] = 0;
- $data['name'] = !empty($v['external_contact']['name']) ? $v['external_contact']['name'] : '';
- $data['avatar'] = !empty($v['external_contact']['avatar']) ? $v['external_contact']['avatar'] : '';
- $data['type'] = !empty($v['external_contact']['type']) ? $v['external_contact']['type'] : '';
- $data['gender'] = !empty($v['external_contact']['gender']) ? $v['external_contact']['gender'] : '';
- $data['unionid'] = !empty($v['external_contact']['unionid']) ? $v['external_contact']['unionid'] : '';
- $data['position'] = !empty($v['external_contact']['position']) ? $v['external_contact']['position'] : '';
- $data['corp_name'] = !empty($v['external_contact']['corp_name']) ? $v['external_contact']['corp_name'] : '';
- $data['corp_full_name'] = !empty($v['external_contact']['corp_full_name']) ? $v['external_contact']['corp_full_name'] : '';
- $data['external_profile'] = !empty($v['external_contact']['external_profile']) ? json_encode($v['external_contact']['external_profile']) : '';
- $data['remark'] = !empty($v['follow_info']['remark']) ? $v['follow_info']['remark'] : '';
- $data['description'] = !empty($v['follow_info']['description']) ? $v['follow_info']['description'] : '';
- $data['createtime'] = !empty($v['follow_info']['createtime']) ? $v['follow_info']['createtime'] : '';
- $data['tags'] = !empty($v['follow_info']['tag_id']) ? json_encode($v['follow_info']['tag_id']) : '';
- $data['remark_corp_name'] = !empty($v['follow_info']['remark_corp_name']) ? $v['follow_info']['remark_corp_name'] : '';
- $data['remark_mobiles'] = !empty($v['follow_info']['remark_mobiles']) ? implode(',', $v['follow_info']['remark_mobiles']) : '';
- $data['add_way'] = !empty($v['follow_info']['add_way']) ? $v['follow_info']['add_way'] : '';
- $data['oper_userid'] = !empty($v['follow_info']['oper_userid']) ? $v['follow_info']['oper_userid'] : '';
- $data['state'] = !empty($v['follow_info']['state']) ? $v['follow_info']['state'] : '';
- $save_data[] = $data;
- }
- // 被删除的客户
- if (!empty($old_list)){
- foreach ($old_list as $k => $v){
- unset($data);
- if ($v['status'] !== 1) {
- //
- $data['status'] = 1;
- $data['deletetime'] = date('Y-m-d H:i:s', time());
- $data['id'] = $v['id'];
- $save_data[] = $data;
- }
- }
- }
- // 更新此用户的所有外部联系人状态
- (new WeworksingleCustomer())->saveAll($save_data);
- $where[] = ['status', '=', 0];
- $where[] = ['employee_id', '=', $employee_id];
- $where[] = ['customer_id', '=', 0];
- if ($search) {
- $where[] = ['name', 'like', '%'.$search.'%'];
- }
- if ($external_userid) {
- $where[] = ['external_userid', '=', $external_userid];
- }
- $list = WeworksingleCustomer::where($where)->page($page, 10)->select();
- return json(['code'=> self::success, 'data'=> $list, 'msg'=> '请求成功']);
- }
- /**
- * 通过手机号返回此员工名下对应的客户ID
- */
- public function getCustomerByPhone(){
- $phone = input('phone', '', 'trim');
- if (empty($phone)) {
- return json(['code'=> self::error_msg, 'msg'=> '请输入手机号']);
- }
- $phone = cypherphone($phone);
- $orgids = orgSubIds($this->request->token['root_org']);
- $c_where = [
- ['phone', '=', $phone],
- ['org_id', 'in', $orgids],
- ['employee_id', '=', $this->request->token['employee_id']]
- ];
- $customer = Customer::where($c_where)->find();
- if (empty($customer)) {
- return json(['code'=> self::success, 'msg'=> '未匹配到客户', 'data'=> []]);
- } else {
- $external_where['customer_id'] = $customer['id'];
- $external_where['employee_id'] = $this->request->token['employee_id'];
- $external_find = WeworksingleCustomer::where($external_where)->find();
- if (!empty($external_find)) {
- if ($external_find['status'] == 1) {
- // 该外部联系人被删除,可以选择绑定新的外部联系人
- $external_find->customer_id = 0;
- $external_find->save();
- } else {
- return json(['code'=> self::error_msg, 'msg'=> '该客户已绑定', 'data'=> []]);
- }
- }
- return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> $customer]);
- }
- }
- /**
- * 企业微信外部联系人绑定已有客户
- */
- public function bindCustomer(){
- $external_userid = $this->request->param('external_userid', '', 'trim');
- $employee_id = $this->request->token['employee_id'];
- $phone = $this->request->param('phone', '', 'trim');
- if (empty($external_userid) || empty($phone)) {
- return json(['code'=> self::error_msg, 'msg'=> '绑定失败']);
- }
- $phone = cypherphone($phone);
- $orgids = orgSubIds($this->request->token['root_org']);
- $c_where = [
- ['phone', '=', $phone],
- ['org_id', 'in', $orgids]
- ];
- $customer = Customer::where($c_where)->find();
- if (empty($customer)) {
- return json(['code'=> self::error_msg, 'msg'=> '客户不存在,请手动添加']);
- } else {
- // 属于本员工( 或者 无人跟进且此客户属于本组织 此情况排除)
- if ($customer['employee_id'] == $employee_id) {
- // 先查询是否有之前的绑定数据,清除
- WeworksingleCustomer::where('customer_id', '=', $customer['id'])->save(['customer_id'=> 0]);
- // 匹配上客户则绑定
- $where['external_userid'] = $external_userid;
- $where['employee_id'] = $employee_id;
- $result = WeworksingleCustomer::where($where)->save(['customer_id'=> $customer['id']]);
- // Customer::where('id', '=', $customer['id'])->save(['employee_id'=> $employee_id]); // 客户自动领取
- if ($result !== false) {
- return json(['code'=> self::success, 'msg'=> '绑定成功']);
- } else {
- return json(['code'=> self::error_msg, 'msg'=> '绑定失败']);
- }
- } else {
- return json(['code'=> self::error_msg, 'msg'=> '绑定失败']);
- }
- }
- }
- /**
- * 根据外部联系人userid返回系统内对应的客户信息
- */
- public function getCustomerByExternalUid(){
- $externalUid = input('uid', '', 'trim');
- $employee_id = $this->request->token['employee_id'];
- $where['employee_id'] = $employee_id;
- $where['external_userid'] = $externalUid;
- $find = WeworksingleCustomer::where($where)->find();
- if (empty($find)) {
- // 判断系统内是否有这个外部联系人,没有则拉取
- $wx_uid = Employee::where('id','=', $employee_id)->value('weworksingle_uid');
- if (!empty($wx_uid)) {
- // 企业微信用户
- $wx_user = WeworksingleUser::find($wx_uid);
- $e_where['userid'] = $wx_user['userid'];
- $e_where['external_userid'] = $externalUid;
- $e_find = WeworksingleCustomer::where($e_where)->find();
- if (empty($e_find)) {
- $root_org = $this->request->token['root_org'];
- $company_id = Company::where('root_id', '=', $root_org)->value('id');
- $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
- if (!empty($setting)) {
- $config['corp_id'] = $setting['corp_id'];
- $config['agent_id'] = $setting['agentid'];
- $config['secret'] = $setting['customer_secret'];
- $config['token'] = $setting['customer_token'];
- $config['aes_key'] = $setting['customer_aes_key'];
- $app = (new apiSingle($config));
- $external_info = $app->getCustomerDetailById($externalUid);
- $data['userid'] = $wx_user['userid'];
- $data['employee_id'] = $employee_id;
- $data['company_id'] = $company_id;
- $data['customer_id'] = 0;
- $data['external_userid'] = $externalUid;
- $data['status'] = 0;
- $data['deletetime'] = null;
- $data['name'] = !empty($external_info['external_contact']['name']) ? $external_info['external_contact']['name'] : '';
- $data['avatar'] = !empty($external_info['external_contact']['avatar']) ? $external_info['external_contact']['avatar'] : '';
- $data['type'] = !empty($external_info['external_contact']['type']) ? $external_info['external_contact']['type'] : '';
- $data['gender'] = !empty($external_info['external_contact']['gender']) ? $external_info['external_contact']['gender'] : '';
- $data['unionid'] = !empty($external_info['external_contact']['unionid']) ? $external_info['external_contact']['unionid'] : '';
- $data['position'] = !empty($external_info['external_contact']['position']) ? $external_info['external_contact']['position'] : '';
- $data['corp_name'] = !empty($external_info['external_contact']['corp_name']) ? $external_info['external_contact']['corp_name'] : '';
- $data['corp_full_name'] = !empty($external_info['external_contact']['corp_full_name']) ? $external_info['external_contact']['corp_full_name'] : '';
- $data['external_profile'] = !empty($external_info['external_contact']['external_profile']) ? json_encode($external_info['external_contact']['external_profile']) : '';
- foreach ($external_info['follow_user'] as $v){
- if ($v['userid'] == $wx_user['userid']) {
- $data['remark'] = !empty($v['remark']) ? $v['remark'] : '';
- $data['description'] = !empty($v['description']) ? $v['description'] : '';
- $data['createtime'] = !empty($v['createtime']) ? $v['createtime'] : '';
- $data['tags'] = !empty($v['tags']) ? json_encode($v['tags']) : '';
- $data['remark_corp_name'] = !empty($v['remark_corp_name']) ? $v['remark_corp_name'] : '';
- $data['remark_mobiles'] = !empty($v['remark_mobiles']) ? implode(',', $v['remark_mobiles']) : '';
- $data['add_way'] = !empty($v['add_way']) ? $v['add_way'] : '';
- $data['oper_userid'] = !empty($v['oper_userid']) ? $v['oper_userid'] : '';
- $data['state'] = !empty($v['state']) ? $v['state'] : '';
- }
- }
- WeworksingleCustomer::create($data);
- }
- } else {
- $data['id'] = $e_find['id'];
- $data['status'] = 0;
- $data['deletetime'] = null;
- $e_find->save($data);
- }
- }
- return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> '']);
- } else {
- return json(['code'=> self::success, 'msg'=> '请求成功', 'data'=> $find['customer_id']]);
- }
- }
- public function sendMessage(){
- $msg = [
- 'external_userid' => [
- 'wmpEonCwAA1WyNGdGcPr5h7WO_Gy_elA',
- 'wmpEonCwAA9BWQW6_yFQ8YLgyrWidZ7g',
- ],
- 'sender' => 'WuHao',
- 'text' => [
- 'content' => '此条是测试消息',
- ]/*,
- 'image' => [
- 'media_id' => 'MEDIA_ID',
- ],
- 'link' => [
- 'title' => '消息标题',
- 'picurl' => '',
- 'desc' => '消息描述',
- 'url' => 'https://example.link.com/path',
- ],
- 'miniprogram' => [
- 'title' => '消息标题',
- 'pic_media_id' => 'MEDIA_ID',
- 'appid' => 'wx8bd80126147df384',
- 'page' => '/path/index',
- ],*/
- ];
- $config = WeworksingleCompanySetting::where('company_id', '=', 2)->find();
- if (empty($config['customer_secret']) || empty($config['customer_token']) || empty($config['customer_aes_key'])){
- return json(['code'=> self::error_msg, 'msg'=> '发送失败']);
- }
- $customer_config['corp_id'] = $config['corp_id'];
- $customer_config['secret'] = $config['customer_secret'];
- $customer_config['token'] = $config['customer_token'];
- $customer_config['aes_key'] = $config['customer_aes_key'];
- $app = Factory::work($customer_config);
- $result = $app->external_contact_message->submit($msg);
- Log::record($result)->save();
- }
- /**
- * 获取客户聊天记录(企业微信)
- */
- public function getChatRecord(){
- $customer_id = input('customer_id', '', 'intval');
- $customer_id = input('customer_id', '', 'intval');
- $employee_id = request()->token['employee_id'];
- $p = input('page', 1, 'intval');
- $wework_customer = WeworksingleCustomer::where([['employee_id', '=', $employee_id], ['customer_id', '=', $customer_id]])->findOrEmpty();
- if ($wework_customer->isEmpty()) {
- return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]);
- }
- $employee_uid = Employee::where('id', $employee_id)->value('weworksingle_uid');
- if (empty($employee_uid)) {
- return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]);
- }
- $employee_user = WeworksingleUser::where('id', $employee_uid)->findOrEmpty();
- if ($employee_user->isEmpty()) {
- return json(['code'=> 0, 'msg'=> 'success', 'data'=> []]);
- }
- $company_id = Company::where('root_id', '=', request()->token['root_org'])->value('id');
- $where[] = ['msgtype', '<>', 'revoke'];
- $where[] = ['company_id', '=', $company_id];
- $where[] = ['msgfrom', 'in', [$employee_user['userid'], $wework_customer['external_userid']]];
- $where[] = ['msgtype', 'not in', ['revoke', 'switch', 'meeting_voice_call']];
- $chat_list = WeworksingleChatRecord::with('chatFile')->where($where)->order('msgtime desc id desc')->field('id,msgid,action,msgfrom,msgtime,msgtype,content,json_content,is_recall')->page($p, 10)->select()->each(function($item) use ($wework_customer, $employee_user){
- $msgtime = strtotime(get_microtime_format($item['msgtime']));
- $item['msgtime'] = date('Y-m-d H:i:s', $msgtime);
- $item['json_content'] = json_decode($item['json_content'], 'true');
- $msgfrom = $item['msgfrom'];
- if ($wework_customer['external_userid'] == $msgfrom) {
- $item['msgfrom'] = $wework_customer['name'];
- $item['msg_loaction'] = 'left';
- } else if ($employee_user['userid'] == $msgfrom) {
- $item['msgfrom'] = $employee_user['name'];
- $item['msg_loaction'] = 'right';
- }
- // 判断聊天文件位置
- if (!empty($item['chatFile'])) {
- if ($item['chatFile']['is_local'] == 1) {
- $item['chatFile']['path'] = request()->domain() . '/' . $item['chatFile']['path'];
- } else {
- $ali_oss_bindurl = config('app.wework_ali_oss_bindurl');
- $url = 'https://' . $ali_oss_bindurl . '/';
- $item['chatFile']['path'] = $url . $item['chat_file']['oss_path'];
- }
- }
- switch ($item['msgtype']) {
- case 'text':
- $item['msgtype_name'] = '文本';
- break;
- case 'image':
- $item['msgtype_name'] = '图片';
- break;
- case 'revoke':
- $item['msgtype_name'] = '撤回消息';
- break;
- case 'agree':
- $item['msgtype_name'] = '同意会话聊天内容';
- break;
- case 'voice':
- $item['msgtype_name'] = '语音消息';
- break;
- case 'video':
- $item['msgtype_name'] = '视频消息';
- break;
- case 'card':
- $item['msgtype_name'] = '名片消息';
- break;
- case 'location':
- $item['msgtype_name'] = '位置消息';
- break;
- case 'emotion':
- $item['msgtype_name'] = '表情消息';
- $item['width'] = $item['json_content']['emotion']['width'] ?? 240;
- $item['height'] = $item['json_content']['emotion']['height'] ?? 240;
- break;
- case 'file':
- $item['msgtype_name'] = '文件消息';
- break;
- case 'link':
- $item['msgtype_name'] = '链接消息';
- break;
- case 'weapp':
- $item['msgtype_name'] = '小程序消息';
- break;
- case 'chatrecord':
- $item['msgtype_name'] = '会话记录消息';
- break;
- case 'todo':
- $item['msgtype_name'] = '待办消息';
- break;
- case 'vote':
- $item['msgtype_name'] = '投票消息';
- break;
- case 'collect':
- $item['msgtype_name'] = '填表消息';
- break;
- case 'redpacket':
- $item['msgtype_name'] = '红包消息';
- break;
- case 'meeting':
- $item['msgtype_name'] = '会议邀请消息';
- break;
- case 'docmsg':
- $item['msgtype_name'] = '在线文档消息';
- break;
- case 'markdown':
- $item['msgtype_name'] = '系统消息';
- break;
- case 'news':
- $item['msgtype_name'] = '图文消息';
- break;
- case 'calendar':
- $item['msgtype_name'] = '日程消息';
- break;
- case 'mixed':
- $item['msgtype_name'] = '混合消息';
- break;
- case 'meeting_voice_call':
- $item['msgtype_name'] = '音频存档消息';
- break;
- case 'voip_doc_share':
- $item['msgtype_name'] = '音频共享文档消息';
- break;
- case 'external_redpacket':
- $item['msgtype_name'] = '互通红包消息';
- if (!empty($item['json_content']['redpacket'])) {
- switch (intval($item['json_content']['redpacket']['type'])) {
- case 1:
- $item['redpacket_type'] = '普通红包';
- break;
- case 2:
- $item['redpacket_type'] = '拼手气群红包';
- break;
- case 3:
- $item['redpacket_type'] = '激励群红包';
- break;
- default:
- $item['redpacket_type'] = '普通红包';
- break;
- }
- $item['redpacket_wish'] = $item['json_content']['redpacket']['wish'];
- $item['redpacket_total'] = $item['json_content']['redpacket']['totalcnt'];
- $item['redpacket_totalamount'] = round($item['json_content']['redpacket']['totalcnt']/100, 2);
- } else {
- $item['redpacket_type'] = '未知';
- $item['redpacket_wish'] = '未知';
- $item['redpacket_total'] = '未知';
- $item['redpacket_totalamount'] = '未知';
- }
- break;
- case 'sphfeed':
- $item['msgtype_name'] = '视频号消息';
- break;
- case 'voiptext':
- // 音视频通话
- switch ($item['json_content']['info']['invitetype']) {
- case 1:
- $voiptext_name = '视频通话';
- break;
- case 2:
- $voiptext_name = '语音通话';
- break;
- case 3:
- $voiptext_name = '多人视频通话';
- break;
- case 4:
- $voiptext_name = '多人语音通话';
- break;
- default:
- $voiptext_name = '音视频通话';
- break;
- }
- $item['msgtype_name'] = $voiptext_name;
- $long = $item['json_content']['info']['callduration'];
- $long_s = $long > 60 ? $long % 60 : $long;
- $long_m = $long > 60 ? intval($long / 60) : 0;
- $item['content'] = $long_m > 0 ? $long_m . '分' . $long_s . '秒' : $long_s . '秒';
- break;
- case 'qydiskfile':
- // 微盘文件
- $once_msg['content'] = $msg['info']['filename'];
- break;
- default:
- $item['msgtype_name'] = '未知格式消息';
- break;
- }
- });
- return json(['code'=> 0, 'msg'=> 'success', 'data'=> $chat_list]);
- }
- }
|