From 8847490cf765ddc157b392c66e877e7f05db8cab Mon Sep 17 00:00:00 2001 From: dengbw Date: Mon, 28 Mar 2022 13:41:01 +0800 Subject: [PATCH] lichene_325 --- api/controllers/wechat/Lichene.php | 4 +- api/controllers/wxapp/licheb/Customers.php | 4 +- common/libraries/Wx_qyapi.php | 24 +- common/libraries/Wx_qyapi_agent.php | 133 ++++++++++ home/controllers/h5/Lichene.php | 283 ++++++++++++++++++++- home/views/h5/lichene/index.php | 219 ++++++++++------ www/home/WW_verify_R9RF2Dg5N4r5SCCc.txt | 1 + www/home/img/h5/avatar.png | Bin 0 -> 13376 bytes 8 files changed, 564 insertions(+), 104 deletions(-) create mode 100644 common/libraries/Wx_qyapi_agent.php create mode 100644 www/home/WW_verify_R9RF2Dg5N4r5SCCc.txt create mode 100644 www/home/img/h5/avatar.png diff --git a/api/controllers/wechat/Lichene.php b/api/controllers/wechat/Lichene.php index 08be8bf2..e4bda7fd 100644 --- a/api/controllers/wechat/Lichene.php +++ b/api/controllers/wechat/Lichene.php @@ -175,9 +175,9 @@ Class Lichene extends HD_Controller $c_id = $re_cus['id']; if ($param['mobile']) { if (!$re_cus['mobile']) {//更新手机 - $re_cus2 = $this->mdCustomers->get(['biz_id' => $re_cus['biz_id'], 'mobile' => $param['mobile'], 'stats<>' => -1]); + $re_cus2 = $this->mdCustomers->get(['biz_id' => $re_cus['biz_id'], 'mobile' => $param['mobile'], 'status<>' => -1]); if ($re_cus2) {//合并用户 - $this->mdCustomers->update(['stats' => -1], ['id' => $re_cus['id']]);//删除原有数据 + $this->mdCustomers->update(['status' => -1], ['id' => $re_cus['id']]);//删除原有数据 $c_id = $re_cus2['id']; $this->mdCustomers->update(['unionid' => $param['unionid']], ['id' => $re_cus2['id']]);//合并到现有手机 } else { diff --git a/api/controllers/wxapp/licheb/Customers.php b/api/controllers/wxapp/licheb/Customers.php index 9450d9bf..37c46d43 100644 --- a/api/controllers/wxapp/licheb/Customers.php +++ b/api/controllers/wxapp/licheb/Customers.php @@ -71,6 +71,7 @@ class Customers extends Wxapp 'is_top' => $row['is_top'], 'status' => $row['status'], 'other_data' => $other_data, + 'is_weChat' => $row['unionid'] ? true : false, 'tags' => $tags ]; return $data; @@ -555,7 +556,7 @@ class Customers extends Wxapp $lists = []; if ($count) { $fileds = 'id,name,admin_id,mobile,level,car_json,is_top,cf_title,brand_id,s_id,cont_time,c_time,defeat_time - ,of_id,of2_id'; + ,of_id,of2_id,unionid'; $rows = $this->customers_model->select($where, $orderby, $page, $size, $fileds); //获取管理员 $admin_arr = array_unique(array_column($rows, 'admin_id')); @@ -607,6 +608,7 @@ class Customers extends Wxapp 'tags' => $tags, 'defeat' => $defeat, 'group_id' => $group_id, + 'is_weChat' => $val['unionid'] ? true : false, 'allot' => $allot ]; } diff --git a/common/libraries/Wx_qyapi.php b/common/libraries/Wx_qyapi.php index 1b69c4bc..32244cd5 100644 --- a/common/libraries/Wx_qyapi.php +++ b/common/libraries/Wx_qyapi.php @@ -40,7 +40,7 @@ class Wx_qyapi $this->init($params); } - function init($params) + public function init($params) { $configs = array( //狸车新能源 @@ -155,22 +155,20 @@ class Wx_qyapi } else if ($param['url'] == 'get_corp_tag_list') {//获取企业标签库 https://work.weixin.qq.com/api/doc/90001/90143/92696#获取企业标签库 $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/get_corp_tag_list?access_token={$access_token}"; $res = $this->ci->mycurl->httpPost($url, array('group_id' => $param['group_id']), 'is_json'); - } else if ($param['url'] == 'mark_tag') {//编辑客户企业标签 https://work.weixin.qq.com/api/doc/90001/90143/92697 - $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag?access_token={$access_token}"; - $res = $this->ci->mycurl->httpPost($url, array('userid' => $param['userid'], 'external_userid' => $param['external_userid'] - , 'add_tag' => $param['add_tag']), 'is_json'); } else if ($param['url'] == 'add_corp_tag') {//添加企业客户标签 https://developer.work.weixin.qq.com/document/path/92117# $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/add_corp_tag?access_token={$access_token}"; $res = $this->ci->mycurl->httpPost($url, array('group_id' => $param['group_id'], 'group_name' => $param['group_name'], 'order' => $param['order'], 'tag' => $param['tag']), 'is_json'); } else if ($param['url'] == 'mark_tag') {//编辑客户企业标签 https://developer.work.weixin.qq.com/document/path/92118 - $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag?access_token={$access_token}"; - $res = $this->ci->mycurl->httpPost($url, array('userid' => $param['userid'], 'external_userid' => $param['external_userid'], 'add_tag' => $param['add_tag'], - 'remove_tag' => $param['remove_tag']), 'is_json'); + $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/mark_tag?access_token={$access_token}&debug=1"; + $params = ['userid' => $param['userid'], 'external_userid' => $param['external_userid']]; + $param['add_tag'] && $params['add_tag'] = $param['add_tag']; + $param['remove_tag'] && $params['remove_tag'] = $param['remove_tag']; + $res = $this->ci->mycurl->httpPost($url, $params, 'is_json'); } else if ($param['url'] == 'remark') {//修改客户备注信息 https://developer.work.weixin.qq.com/document/path/92115 $url = "https://qyapi.weixin.qq.com/cgi-bin/externalcontact/remark?access_token={$access_token}"; $res = $this->ci->mycurl->httpPost($url, array('userid' => $param['userid'], 'external_userid' => $param['external_userid'] - , 'remark_mobiles' => $param['remark_mobiles']), 'is_json'); + , 'remark_mobiles' => $param['remark_mobiles'], 'description' => $param['description']), 'is_json'); } $data = trim($res, chr(239) . chr(187) . chr(191)); $result = json_decode($data, true); @@ -186,6 +184,7 @@ class Wx_qyapi // 这里参数的顺序要按照 key 值 ASCII 码升序排序 $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; $signature = sha1($string); + //$access_token = $this->access_token(); $signPackage = array( "appId" => $this->corpid, "nonceStr" => $nonceStr, @@ -193,6 +192,7 @@ class Wx_qyapi "url" => $url, "signature" => $signature, "rawString" => $string, + //"access_token" => $access_token, 'jsapi_ticket' => $jsapiTicket ); return $signPackage; @@ -200,9 +200,11 @@ class Wx_qyapi public function getJsApiTicket() { - $jsapi_ticket = $this->redis->get('jsapi_ticket_' . $this->corpsecret); + $key = 'jsapi_ticket_' . $this->corpsecret; + $jsapi_ticket = $this->redis->get($key); if (!$jsapi_ticket) { //获取企业的jsapi_ticket https://developer.work.weixin.qq.com/document/path/90506#14924 + //https://developer.work.weixin.qq.com/document/10029#%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%9A%84jsapi_ticket $access_token = $this->access_token(); $url = "https://qyapi.weixin.qq.com/cgi-bin/get_jsapi_ticket?access_token={$access_token}"; $res = $this->ci->mycurl->httpGet($url); @@ -211,7 +213,7 @@ class Wx_qyapi debug_log('error:__FUNCTION__:' . $res, $this->log_file); } else { $jsapi_ticket = $result->ticket; - $this->redis->save('jsapi_ticket_' . $this->corpsecret, $result->ticket, $result->expires_in); + $this->redis->save($key, $result->ticket, $result->expires_in); } } return $jsapi_ticket; diff --git a/common/libraries/Wx_qyapi_agent.php b/common/libraries/Wx_qyapi_agent.php new file mode 100644 index 00000000..7789dce8 --- /dev/null +++ b/common/libraries/Wx_qyapi_agent.php @@ -0,0 +1,133 @@ +env = 'd'; + } elseif (false !== strpos($_SERVER['HTTP_HOST'], 'test')) {//test 测试 + $this->env = 't'; + } else { // 正式 + $this->env = 'p'; + } + $this->redis = &load_cache('redis'); + $this->ci = &get_instance(); + $this->ci->load->library('mycurl'); + + $this->init($params); + } + + public function init($params) + { + $configs = array( + //狸车新能源_客户画像 + 'lichene_1000005' => array( + 'corpid' => 'wwff2d727ce47d6852', + 'corpsecret' => 'QBkmK9hm1WgrWI9RUE5-Al10qVtHCM2eEoa8NQzTKkI', + ) + ); + $params['corpid'] && $this->corpid = $params['corpid']; + $params['corpsecret'] && $this->corpsecret = $params['corpsecret']; + $app = $params['app'] ? $params['app'] : 'lichene_1000005'; + if ($configs[$app]) { + $config = $configs[$app]; + !$this->corpid && $config['corpid'] && $this->corpid = $config['corpid']; + !$this->corpsecret && $config['corpsecret'] && $this->corpsecret = $config['corpsecret']; + } + $this->corpid && $this->log_file = "wx_qyapi_{$this->corpid}.log"; + } + + public function access_token() + { + $access_token = $this->redis->get($this->corpsecret); + if (!$access_token) { + $url = self::BASE_URL . sprintf(self::TOKEN_API, $this->corpid, $this->corpsecret); + $res = $this->ci->mycurl->httpGet($url); + $result = json_decode($res); + if ($result->errcode) { + debug_log('error:__FUNCTION__:' . $res, $this->log_file); + } else { + $access_token = $result->access_token; + $this->redis->save($this->corpsecret, $result->access_token, $result->expires_in); + } + } + return $access_token; + } + + public function getSignPackage() + { + $jsapiTicket = $this->getJsApiTicket(); + $url = "https://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]"; + $timestamp = time(); + $nonceStr = $this->createNonceStr(); + // 这里参数的顺序要按照 key 值 ASCII 码升序排序 + $string = "jsapi_ticket=$jsapiTicket&noncestr=$nonceStr×tamp=$timestamp&url=$url"; + $signature = sha1($string); + //$access_token = $this->access_token(); + $signPackage = array( + "appId" => $this->corpid, + "nonceStr" => $nonceStr, + "timestamp" => $timestamp, + "url" => $url, + "signature" => $signature, + "rawString" => $string, + //"access_token" => $access_token, + 'jsapi_ticket' => $jsapiTicket + ); + return $signPackage; + } + + public function getJsApiTicket() + { + $key = 'jsapi_ticket_' . $this->corpsecret; + $jsapi_ticket = $this->redis->get($key); + if (!$jsapi_ticket) { + //https://developer.work.weixin.qq.com/document/10029#%E8%8E%B7%E5%8F%96%E5%BA%94%E7%94%A8%E7%9A%84jsapi_ticket + $access_token = $this->access_token(); + $url = "https://qyapi.weixin.qq.com/cgi-bin/ticket/get?access_token={$access_token}&type=agent_config"; + $res = $this->ci->mycurl->httpGet($url); + $result = json_decode($res); + if ($result->errcode) { + debug_log('error:__FUNCTION__:' . $res, $this->log_file); + } else { + $jsapi_ticket = $result->ticket; + $this->redis->save($key, $result->ticket, $result->expires_in); + } + } + return $jsapi_ticket; + } + + private function createNonceStr($length = 16) + { + $chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; + $str = ""; + for ($i = 0; $i < $length; $i++) { + $str .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); + } + return $str; + } +} + +?> diff --git a/home/controllers/h5/Lichene.php b/home/controllers/h5/Lichene.php index 35949410..03cd14a1 100644 --- a/home/controllers/h5/Lichene.php +++ b/home/controllers/h5/Lichene.php @@ -19,37 +19,116 @@ class Lichene extends CI_Controller { $this->load->library('wx_qyapi', ['app' => 'lichene']); $sign_package = $this->wx_qyapi->getSignPackage(); - echo json_encode($sign_package, JSON_UNESCAPED_UNICODE); - $data = ['_title' => '客户画像', 'sign_package' => $sign_package]; + + $this->load->library('wx_qyapi_agent'); + $sign_package2 = $this->wx_qyapi_agent->getSignPackage(); + $sign_package2['agentid'] = '1000005'; + //echo json_encode($sign_package, JSON_UNESCAPED_UNICODE); + //echo '

'; + //echo json_encode($sign_package2, JSON_UNESCAPED_UNICODE); + $data = ['_title' => '客户画像', 'sign_package' => $sign_package, 'sign_package2' => $sign_package2]; $this->load->view('/h5/lichene/index', $data); } + /** + * Notes:获取用户信息 + * Created on: 2022/3/27 0:55 + * Created by: dengbw + */ public function get_user() { + $params = $this->input->get(); $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); $this->load->model('receiver/receiver_customer_tag_model', 'mdCustomerTag'); $this->load->model('receiver/receiver_customer_tagdata_model', 'mdCustomerTagdata'); - $id = 0; - $tagList = $res_td = $sources = []; + $c_id = $of_id = $of2_id = 0; + $of_id_index = -1; + $tagList = $res_td = $sources = $userInfo = []; + $tag_data = $tags_name = $description = ''; + if (!$params['external_userid']) { + $this->show_json(400, '加载失败请重试~'); + } + if ($params['external_userid']) { + $this->load->library('wx_qyapi', ['app' => 'lichene']); + //外部联系人 + $re = $this->wx_qyapi->get_external_contact(array('url' => 'get', 'external_userid' => $params['external_userid'])); + if (!$re) { + $this->show_json(400, '加载失败请重试!'); + } + $tags_ary = $re['follow_user'][0]['tags'];//客户画像 + if ($tags_ary && $tags_ary != '[]' && is_array($tags_ary)) { + foreach ($tags_ary as $key => $val) { + if ($val['type'] == 1) {//企业标签 + $tag_data[] = $val['tag_id']; + $tags_name[] = $val['tag_name']; + } + } + } + $userid = $re['follow_user'][0]['userid'] ? $re['follow_user'][0]['userid'] : ''; + $avatar = $mobile = $name = $unionid = ''; + $gender = $biz_id = 0; + $remark_mobiles = $re['follow_user'][0]['remark_mobiles'];//用户手机 + $description = $re['follow_user'][0]['description'];//描述 + if ($remark_mobiles && $remark_mobiles != '[]' && is_array($remark_mobiles)) { + $mobile = $remark_mobiles[0];//取第一个手机号 + } + $external_contact = $re['external_contact'] ? $re['external_contact'] : '';//用户信息 + if ($external_contact) { + $external_contact['avatar'] && $avatar = $external_contact['avatar']; + $external_contact['name'] && $name = $external_contact['name']; + $gender = intval($external_contact['gender']); + $external_contact['unionid'] && $unionid = $external_contact['unionid']; + } + $userInfo = [ + 'avatar' => $avatar, 'mobile' => $mobile, 'name' => $name, 'gender' => $gender, 'source' => '@微信' + , 'unionid' => $unionid, 'external_userid' => $params['external_userid'], 'userid' => $userid, 'tags_name' => $tags_name + ]; + //企业成员 + $re_wx = $this->wx_qyapi->get_external_contact(array('url' => 'user_get', 'userid' => $userid)); + if ($re_wx['errcode'] == 0 && $re_wx['mobile']) { + $admin_id = 0; + $admin_name = ''; + $this->load->model('app/licheb/App_licheb_users_model', 'mdUsers'); + $re_u = $this->mdUsers->get(array('mobile' => $re_wx['mobile'])); + if ($re_u) { + $biz_id = intval($re_u['biz_id']); + $admin_id = $re_u['id']; + $admin_name = $re_u['uname']; + } + $userInfo['biz_id'] = $biz_id; + $userInfo['admin_id'] = $admin_id; + $userInfo['admin_name'] = $admin_name; + } + if ($biz_id && $mobile) {//查找已存在客户 + $re_cus = $this->mdCustomers->get(['biz_id' => $biz_id, 'mobile' => $mobile, 'status<>' => -1]); + if ($re_cus) { + $c_id = $re_cus['id']; + $of_id = $re_cus['of_id']; + $of2_id = $re_cus['of2_id']; + $res_td = $this->mdCustomerTagdata->select(['c_id' => $re_cus['id']], 'id desc', 0, 0, 't_id');//查找用户选择 + $tag_data = $res_td ? array_unique(array_column($res_td, 't_id')) : ''; + } + } + } + $userInfo['c_id'] = $c_id; //标签 $res = $this->mdCustomerTag->select(['status' => 1, 'pid' => 0], 'sort desc,id desc', 0, 0, 'id,name,type'); if ($res) { - $id && $res_td = $this->mdCustomerTagdata->select(['c_id' => $id], 'id desc', 0, 0, 't_id');//查找用户选择 - $tag_data = $res_td ? array_unique(array_column($res_td, 't_id')) : ''; + $key_tag_id = $c_id ? 'id' : 'qy_id';//比对key值 foreach ($res as $key => $val) { $list = []; $value = ''; - $res2 = $this->mdCustomerTag->select(['status' => 1, 'pid' => $val['id']], 'sort desc,id desc', 0, 0, 'id,name'); + $res2 = $this->mdCustomerTag->select(['status' => 1, 'pid' => $val['id']], 'sort desc,id desc', 0, 0, 'id,name,qy_id'); foreach ($res2 as $key2 => $val2) { //检查是否选中标签 - $setValue = ['id' => $val2['id'], 'name' => $val2['name']]; + $setValue = ['id' => $val2['id'], 'name' => $val2['name'], 'qy_id' => $val2['qy_id']]; if ($val['type'] == 'checkbox') { - $setValue['checked'] = $tag_data && in_array($val2['id'], $tag_data) ? true : false; + $setValue['checked'] = $tag_data && in_array($val2[$key_tag_id], $tag_data) ? true : false; } else { $checked = false; - if ($tag_data && in_array($val2['id'], $tag_data)) { + if ($tag_data && in_array($val2[$key_tag_id], $tag_data)) { !$value && $checked = true; - $value = $val2['id']; + $value = $val2['qy_id']; } $setValue['checked'] = $checked; } @@ -64,18 +143,200 @@ class Lichene extends CI_Controller if (strlen($status) && $status == 0) {//未见客户 unset($offline_sources[1]); } + $ii = 0; + $description_arr = $description ? explode('-', $description) : []; foreach ($offline_sources as $key => $val) { $list = []; + if (!$c_id) { + if ($description_arr[0] == $val['name']) { + $of_id = $key; + $of_id_index = $ii; + } + } else { + $of_id == $key && $of_id_index = $ii; + } foreach ($val['list'] as $key2 => $val2) { + if (!$c_id) { + $description_arr[1] == $val2 && $of2_id = $key2; + } $list[] = ['id' => $key2, 'name' => $val2]; } $sources[] = ['id' => $key, 'name' => $val['name'], 'list' => $list]; + $ii++; } $data['tagList'] = $tagList; $data['sources'] = $sources; + $data['userInfo'] = $userInfo; + $data['of_id'] = $of_id; + $data['of2_id'] = $of2_id; + $data['of_id_index'] = $of_id_index; $this->show_json(200, '获取用户信息成功', $data); } + /** + * Notes:到店 + * Created on: 2022/3/27 0:57 + * Created by: dengbw + */ + public function post_to_biz() + { + $params = $this->input->post(); + $userInfo = $params['userInfo']; + $mobile = $userInfo['mobile']; + $biz_id = intval($userInfo['biz_id']); + if (!$mobile) { + $this->show_json(400, '请输入手机号!'); + } + if (!$biz_id) { + $this->show_json(400, '未绑定狸车宝门店!'); + } + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->load->model("biz/biz_model", 'mdBiz'); + $re_biz = $this->mdBiz->get(['id' => $biz_id, 'status' => 1]); + if (!$re_biz) { + $this->show_json(400, '门店不存在!'); + } + $re_cus = $this->mdCustomers->get(['biz_id' => $biz_id, 'mobile' => $mobile, 'status<>' => -1]); + $date = date('Y-m-d H:i:s'); + if (!$re_cus) {//新增客户 + $add_data = [ + 'name' => $userInfo['name'], + 'mobile' => $mobile, + 'biz_id' => $biz_id, + 'city_id' => $re_biz['city_id'], + 'county_id' => $re_biz['county_id'], + 'unionid' => $userInfo['unionid'], + 'of_id' => $params['of_id'], + 'of2_id' => $params['of2_id'], + 'cf_title' => '自有资源', + 'admin_id' => $userInfo['admin_id'], + 'status' => 1,//到店 + 'a_num' => 1,//到店次数 + 'dt_time' => $date,//到店时间 + 'cont_time' => $date,//最后联系时间 + 'p_time' => $date,//分配时间 + 'c_time' => time() + ]; + $c_id = $this->mdCustomers->add($add_data); + $log = '创建客户'; + } else { + $c_id = $re_cus['id']; + !$re_cus['unionid'] && $up_data['unionid'] = $userInfo['unionid']; + $re_cus['status'] == 0 && $up_data['status'] = 1;//改为到店 + $up_data['a_num = a_num+1'] = null;//加到店次数 + if ($re_cus['dt_time'] == '0000-00-00 00:00:00') {//首次到店时间 + $up_data['dt_time'] = $date; + } + $up_data['cont_time'] = $date; + $this->mdCustomers->update($up_data, ['id' => $c_id]); + $log = '到店+1'; + } + $this->load->library('receiver/customers_entity'); + $this->customers_entity->add_log($c_id, $userInfo['admin_id'], $userInfo['admin_name'], $log); + //客户标签 + if ($params['taglList']) { + $this->load->model('receiver/receiver_customer_tagdata_model', 'mdCustomerTagdata'); + $add_tag = []; + //查找已加入标签 + $res_td = $this->mdCustomerTagdata->select(['c_id' => $c_id], 'id desc', 0, 0, 't_id'); + $tag_data = $res_td ? array_unique(array_column($res_td, 't_id')) : ''; + foreach ($params['taglList'] as $key => $val) { + foreach ($val['list'] as $key2 => $val2) { + if ($val2['checked'] == 'true') { + if (!$tag_data || !in_array($val2['id'], $tag_data)) {//未加标签,新增 + $add_tag[] = ['c_id' => $c_id, 't_id' => $val2['id'], 'c_time' => time()]; + } + } else { + if ($tag_data && in_array($val2['id'], $tag_data)) {//删除标签 + $this->mdCustomerTagdata->delete(['c_id' => $c_id, 't_id' => $val2['id']]); + } + } + } + } + if ($add_tag && count($add_tag)) { + $this->mdCustomerTagdata->add_batch($add_tag); + } + } + $this->show_json(200, '操作成功'); + } + + /** + * Notes:保存用户信息 + * Created on: 2022/3/27 0:55 + * Created by: dengbw + */ + public function post_user() + { + $params = $this->input->post(); + $userInfo = $params['userInfo']; + $this->load->library('wx_qyapi', ['app' => 'lichene']); + $remark_mobiles = $userInfo['mobile'] ? [$userInfo['mobile']] : ''; + $description = $params['of_title'] ? $params['of_title'] : ''; + if ($description && $params['of2_title']) { + $description .= '-' . $params['of2_title']; + } + //企微备注操作 + $re_remark = $this->wx_qyapi->get_external_contact(['url' => 'remark', 'userid' => $userInfo['userid'] + , 'external_userid' => $userInfo['external_userid'], 'remark_mobiles' => $remark_mobiles, 'description' => $description]); + //标签操作 + $tags_name = $userInfo['tags_name']; + $add_tag = $remove_tag = ''; + if ($params['taglList']) { + foreach ($params['taglList'] as $key => $val) { + foreach ($val['list'] as $key2 => $val2) { + if ($val2['checked'] == 'true') { + if (!$tags_name || !in_array($val2['name'], $tags_name)) {//未加标签,新增 + $add_tag[] = $val2['qy_id']; + } + } else { + if ($tags_name && in_array($val2['name'], $tags_name)) {//删除标签 + $remove_tag[] = $val2['qy_id']; + } + } + } + } + } + //企微标签操作 + $re_tag = $this->wx_qyapi->get_external_contact(['url' => 'mark_tag', 'userid' => $userInfo['userid'], + 'external_userid' => $userInfo['external_userid'], 'add_tag' => $add_tag, 'remove_tag' => $remove_tag]); + $c_id = $userInfo['c_id']; + if ($c_id) {//已存在客户,更新资料 + $this->load->library('receiver/customers_entity'); + $this->load->model('receiver/receiver_customers_model', 'mdCustomers'); + $this->load->model('receiver/receiver_customer_tagdata_model', 'mdCustomerTagdata'); + $up_data = [ 'of_id' => $params['of_id'], 'of2_id' => $params['of2_id']]; + $this->mdCustomers->update($up_data, ['id' => $c_id]); + $this->customers_entity->add_log($c_id, $userInfo['admin_id'], $userInfo['admin_name'], '修改用户基本信息'); + if ($params['taglList']) { + $add_tag = []; + //查找已加入标签 + $res_td = $this->mdCustomerTagdata->select(['c_id' => $c_id], 'id desc', 0, 0, 't_id'); + $tag_data = $res_td ? array_unique(array_column($res_td, 't_id')) : ''; + foreach ($params['taglList'] as $key => $val) { + foreach ($val['list'] as $key2 => $val2) { + if ($val2['checked'] == 'true') { + if (!$tag_data || !in_array($val2['id'], $tag_data)) {//未加标签,新增 + $add_tag[] = ['c_id' => $c_id, 't_id' => $val2['id'], 'c_time' => time()]; + } + } else { + if ($tag_data && in_array($val2['id'], $tag_data)) {//删除标签 + $this->mdCustomerTagdata->delete(['c_id' => $c_id, 't_id' => $val2['id']]); + } + } + } + } + if ($add_tag && count($add_tag)) { + $this->mdCustomerTagdata->add_batch($add_tag); + } + } + } + if ($re_remark || $re_tag['errcode'] == 0) { + $this->show_json(200, '操作成功'); + } else { + $this->show_json(400, '操作失败'); + } + } + private function show_json($code, $msg, $info = []) { $data['code'] = $code; diff --git a/home/views/h5/lichene/index.php b/home/views/h5/lichene/index.php index f063d0c7..e793d742 100644 --- a/home/views/h5/lichene/index.php +++ b/home/views/h5/lichene/index.php @@ -13,6 +13,7 @@ + @@ -21,28 +22,29 @@
- # + #
- {{userInfo.nickname}} - - + {{userInfo.name}} + + {{userInfo.source}}
-
- 到店 -
+
手机号
- {{userInfo.mobile}}
+
线索来源
@@ -53,7 +55,7 @@
{{sources[of_id_index].name}}
@@ -85,7 +87,7 @@
@@ -94,18 +96,13 @@
diff --git a/www/home/WW_verify_R9RF2Dg5N4r5SCCc.txt b/www/home/WW_verify_R9RF2Dg5N4r5SCCc.txt new file mode 100644 index 00000000..56710762 --- /dev/null +++ b/www/home/WW_verify_R9RF2Dg5N4r5SCCc.txt @@ -0,0 +1 @@ +R9RF2Dg5N4r5SCCc \ No newline at end of file diff --git a/www/home/img/h5/avatar.png b/www/home/img/h5/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..d08cf3761c991e4d8e8cf6239df191fc25f1649f GIT binary patch literal 13376 zcmV-GG{4JBI&x7fXG82IO5~?0Z|kkNZkq}0mlcyVMYl; z*R6m8Vn2aZDmLFJjc6(NI)L`8>;I3^;Z$gd#@kfiIL{jXD9-Kp-bs&mf0w_e?K z*Xk8mcb|Rs-sgUGUi(4lKOM8c*|)Ou=O-~s$`@u~=I(oPh*_ds-i?U23TI&J_5p0& z@u#P@J-p<==Q}3kH1C+Ex&AFt|Ck$iVAggVPK?7tl1C8uaF93{j9CEBV#X{I*b|IB z34*v# z06LtRk08RUVzQ0aobW7|HvrhcpbZX-$94igejrD`i^j0ust*v$Z@?Ym<5`F;}4x?+}o-w7dlvClq0G@~{+#BU%W2f;i@L~{V_--`o1PG-hW z0R#ZA>jS3wX!Ze8$3E!-pG2~J8c4hqz-xLQ5IO~j)`9u^B*h)YMYLW=KAqn80a6|9 z%reeMDNiHNsQ@22oj!u`vkTo1@M@;v)g^D{ucxgYs)|o*fXp2lK3+QFR4`5h@cQZg zF-*{(L39VCTrJsIy><~jH686U?Eo@3#0QX&A0_Z<0KIWK4!X6@jIC-`AvoVC=4iEb z`yOsEZ2+#*o_2Ql3^U4Sy>0n%w;Fz^=wKMK&JM0kpU9RPL^MCD(} z;ZA1kaDW{Q-T_LL3D`~jg$OJEsy_*;{0m?=24)b^YXKYyX7z6ep6LOUDGQJe0OL7U zAb|WOm>vbhqmuDxJJ#-l1wK;9@U={IWcz_LwSh9_0CK{${NmwIUPx%|Qi_2sAX=v` z-$I1<{m`57a0h&`)DP<%nke!`FxlL(I6290UXnc{+M|=$horQ(UdqMo)Q3=o8S2+DN>8U z{ElP?ot`4*+a>Ys;dW>31DDX&WchcFTY6~6Ylu=OL(myu&Lk-bGoB{Gm4WA6lO*3x z@ak!R9KW1r4Q!K_Fyj&sQVAJwn8CLbuxj81=k|LqrDqf3+qG;43p*g1oNGXcCV zF+qun2<6gXQR@4N@oY1ro&`wS=l@HnET@i2#Aa$RCEp&hSoOn2^uLMl>_H}JzkI4- zI)jPM0Qi7}RQR&vh%4{EkTxa6uWf944j_YhK1z`MB!KrMU?nwMEN7B8t56@;`K|&k+->YR;G3#90OGfG`fVhS7d%@!B1b*4J5wKi_<>jS|cKbyy z4Ok~+O)o3I8!Q$O^V<^W|LanU#qBu$PC!=l3_vn|cm)HWilg+%r5(N!I%4?`FQos8 z!)rRWP5XQ*ffoS$&UpIMqY$(>SV&#JH|ctS%o*DLD#w{|HJIne7?h`&u{@O$U+Kkl za16a$($p>RAXqLyW%(875&s-`^!Yd(THUs*0pb?Qr-SKg0I!Z}2qs($M=UK}Ku<*F z(QjAZ0+~F|Vd75$d}<6E-Rd}Eaku_(buB@tkHv)KnBx5t4AYf@R*Z$Lz%nUBrgL&-9{@w)P0f!2!n%?m(t#TtC@=&?7b#SK@@vNX_HyT^I2Aw zUB^ag4`5l~IoXJ96K~cv02$2hI7%S(4Gl$teI$iM1F#`L2$nL$i> zW&AMDfCpeRn2JntrI1cgTtwrSZ#v;E-=9+8-JWB4DFNCUvjOXG1fKIg%Whjj-W32* zxusZ$HBmHV@bx0~my3%R?6)mS`y|@9eyH{ax{%%Vf#)2p>(2xr7PHYKqf5MT{W7hr zf@PJ-zDOr?qxY^~J`13$032$|gNg1cWyQ(1?UJVNI6%^c@;iv>yAc#qmwgu(J?Hue zZM99*%%GM`CRsi*ez=5z%XCal_6Z+=;FRl`{88~mt4OMJf}06 zDn|}iI`g=B`CX8`dwQ#uRF#jM91k@9LXxC7#AMBG^vf^h+~T5vVl#`U{c@2&ZgYT` z@CjECaE@+t$v`F@57YNims~0qr{p6;Gu%+t=K+=ABHGx#B9h)a4;KHPrR25)2 zbQzfHo(d7*7d9U!h>{u)3ZuoQYLB)>b!xPr=3$_a031dJN_HV2-wuTEZ*eTd2CI#Vd03#M@& zt;9$`6M@ve==Hk2Ohq>#6+oIkL|9bJI(Z#kbw38(@=(X8_Py(uzY37u-iPsckaHq? zRoKWkO50X|qzmB?F|@zN6BPNAfH-Z9M~TLKSN9t0b?g1ghe^Dkm`$x{X5c#ekWCC) zFTm>|)eX3#ZqnP5)>DCunQqd35GH#f#iI)Tb4cEda^*U(l)AdY2Z03?7C%7O93+1-+7FLqrhR2>XRP~ zywve6)3^>}*AJEJ#X(K_+(d-D$%eL_a!2h;&73AnK(|m{V{nLpq-K+ouHqN%m?5n^ zBADeBrQCqJPix83GJw3Pzcx?>+uOQk_b3V-&k~E-Np0Gd zUDV!*g;aiIh7WBK4xO~-LVC!sfiYQ20Fo($Ic5wQOQ8;mWO#IO(TvDz*~*6732&RQ zB-l(+9BndqYEYyI^V1y|l@HYLm{`%;{0P~651D-V?X2pP7(Z0ngXpC1XGtXmPwYt? zAa0)D3X(st+mwsFvMxDy-)$y;5KUU3wjk;8v8yO^(6hrcE0K1#mmw_*qJm+E)+LkY|OkA{g z2|<65OsA~P(a+-wuiBe}gh8u>q;sPVP!h6EHy(9P!(xHN^}~e#3dVMnd}>?|@Ypj* zCLdnNgk`2eGxK{&xzx8!=}qW#E)o4rx``E&rD<|h92X?Z0er|zT3Q=;B5g)npDGqW zGS~6TxGYuJ>mepWB;}G&udliTQrS$(`P2Er&tzPZrZKoji3}1|Vy`Ua-C(@IQ0`a< zL9qbh=EJ2R7_IY&@axSQr4%Q(BjtS+B)N8+(HrPJtw>Dnq{bP9u_9_l zl}sW0CuV%n$iPJ339{l{Mzj-%A_F8{2){*)cbjxd5brH|^eq$GS{j?wJGQ+0^vPSm zU}-hJ)0nfo>zD5Y$S`p>e<<)$+9=D3R*3|VOriWvX8MkqiTPWBmwK-m?RcuHyY*}$ zUNjv&YNOb!(`_t3qHf~Vsbb{I#&pOOgPX}{8*|%0E7P=~I-_;^ecI<&Lx#tapm`vg zoQGEOJTS}hw1nb3a%a~*6ozjsUNqw;TEZHFYW^j4nWJ@GuLy3K70^b8cGAxI62D69lnaPxKESUt z>zked_;wazRcRraEh)?xPYJ4YAv~WLCIMED?LlI;N%W!d43hTC_Y&v?ttBHS_0pYu z)b^_!4@;hiQ}tG>Mym*_&Xo&5mGnD%MeT=)9stqOsR$HxNTcjx>msB!>`y;ciDf_1 zz^>;9o})_rHGPZ#VpGF|gqT}gNKG@CHr2X*o1YD{c z6wCKt9hfODy7zo~*0NpKk&ndq@J-bW`x^t#G4k=NRV3qwpI|^0?a_Vu4+fslrk64T zh?_5e4@9Tvx&-L9z!UG#(>14<6v0+Q-iwieZ}~FsH?ULQ3&1!O+0up^S%@=A3+We@ z?Yf3M?U&CXkV>RIw#1I&g1atb?^-@63}s7e0*;C#NxXJ#mVRX^Vn@j}S@w;y z($p$petAf%15cbD3n1qCt?1ss6K_r0+LZ)mL@Pkp*lP}mXWz=s(@)7i1JIUFNXl-# z1d?hFGnMVX;lWIli$$9QA6>esrZdP}uHyX$W=Qpm^kUrrGUBD~X~w_mw5ZZ$w&j;t zr>p6E^B)&ejs|o@zhs9_DP2HM7*KbN#HRE?HMg17otNu}*8tEbw`P1U$T3Nz_B5GX)r&7>9TlG1wU1TO4a4#iwaTWK@!yfGoM`F7 zF@6zv&QXmF)f^xN`2%8po6gF_SXj(C*Xrn|%lpA0K0pZm3BVRfyA!q!%ab}$H{M1I z437G`j1&7du4YDjMvzU_&EnV)Al1z5CYOEBb4nc1?NhqVz{REQvK~;o2q{!ReeI0WH54`9F`4|y&Wu!Mt zx&6qsi(d59L|Zfji0g;SC0KhSY3r0Yslfe+3;UD-id!gu1Wei++V*^uy)lb4NE@|@ zfE7`IQEOX^&H4pF&iRrNK#XfcFrL`9yEwwerM=<0lW8S!=-av%wC6)J@5L>IH-qs( z^A@e7q$dMU#ICo}N(mM33A4y1B3_bI1gUn08dHw%4ZPH(Yl^xvh?@^@2I&Vm%4vzV z?nI?XBwyaEKyiKf8-R6FdaJ*=G5(Yi2iS(0woSO2j+9%xATA~ajPbKb`5}Og)#)X} z@J(wknlY{nTz!D(OOlQBWqDF!;gHz&0{1%OnY^DfwEb0%82F6|ZM$fqoc^>+ws!TC z_QOvRaD}!%#^NC7jPv7~1Q3hrK92;RW176HB3s&*D{Eax8VTI1uI!n@&NnkV>$C&W zMgj?*zt&5wYGapO*Hy;n*D<7lpBmp0c&TwGf0F>>=F1-e={K3S@#d2@=Z(xbk_tuz z*z}yYZf4nzBUq;XyPLicWe|0viL`NDMe)1QDc!F3nI$}v_mwZS zt3Q)|i1C?X&e5;GO_=pCO{Oq>BD1(hrvd|CD0$8&>jGrn7x|!Yz{oZG*1&U&vMP?v zAVcN(QqX)Az~7{vM^A3fYmM&up-N1)ziuGf_CA3U0Bw_1)6q!n#PCdFF`tQ_EqRV% z)u|E2t{*<5bG&8d2THlroVozX6!@LYQkyZ6feTBX6QizRc|HVX7*Jue2aO5S<8kIA zgCOq$_@r+6sJ4^X`=Kmt=@xlx<){TkHPUdD#pb|stilM~f?Ne=t^3VxJH?)NUrf(U zT4K3=sEU(ly+9?4*C$y32ST2!z*3F(=qZ=>i34tGL)#A}3Oy6uRmzH!qqOa0n~`8S zc_yI}x8HDCZo3>e4#%x=UL3avaSL)in486eE3dI9gPha#x3irZ;LI|f&r;sjss3yG zwLNL<2AP!%rdJKNA-RKjK1z`MnSq`|f#+N_ZU#B#2Hs=O?XohhXr5aF&*>6Z3Z1B( zdGGq=53wX$`UffL?@be=byn8Ny}S8vvq9}i>l!1jA3g~{6NbP)3cOS$mFd_F zk}mMk#PX*)LlKDu#Vo1JBmJj=1=9KQhl%JboitFd&K{#St7K#Z&e7R0@EmPkg<2l2 zAF4Z{4`}#~?Qh1IXMBDSLuwPl^-|2U&bY07?-t~3VD3=vF6!yoqq58@l+R@*Z9NZL zR~k1TWFHfFh#y`?z!F_UTg2-4P1X0Ap`Ei?IBQHZMJ8;Ap1&M4 z^}Mj%hopTzl_2$5dP12FE*e-n1`yXTe-ohQH3W%%8DxcFn#_cUya(C2e)v%UH?&i9 zX8v|5muhJ($ad*t5^bnzjg-7pB@?5`GdItNOOlW2XqoxEQZBW;1|Xr@e;nPkp=GT% zbzDad4qB6?Kqt^tec#sbTgDSX&Uxijv1QYJ2;*5MUN4AN7PF2@IA`=!Q!$kdh?fSQ zb4e{g)Ctxe%^KQn{3ZlPtp{U06E->|iX7r+z37l=VAx3{?U_m9*94EETPxetWc%O5 zp!EX09+KAs&iXi^+S-^Tr4-T1AS=$Q03>}KzksN`W&`k6a4e7qE5Ie^2HR&;bZkTl;;^Q-1VL()H_Mv2%N{~hF}Bs=+Yd5;GgpOY?yjMR+OhTRUpF+Uj*vm|J5Yvs_ zp0UJUulBTX^WnuHEY|TeqR*36`HHKY#q*YO7-&lIYa!a6w2dHp+fMMwTotGJsf&j?{>@X4h24vs30(1G<{E_bs5az+i!o6fCu+ph<`ijO;;t`5z4a zhh~f!SYGm+^K_k$zBkRg+6RcKMf-F~Ss+v3|HCZx+3yMeSlxq^?*gcKkPl-h$c?xF zn>>a9>G=pk6I=9Yy2}D@D)3%2S(=or8@VWS^W_IYbev`eSyJ*GZP5GJ3^K&CA>=q` zJqe!V5@6#d&|PNkOVbVusJjqyMru}uEXRF6M7zEx3Y|s8MPyt<#N>pP8CO*IAoAy6 zZeBl+aZ!+ShT372ejj}c?E0ZK+soQ|^``ysS<+M)W1=ZC45W7{o76IfzFgM+IgZcY?fVBCmP)CemSUyNNsaKMe2Z8W1 zChSK{`!RTbX6#3V{h0AI5uPT{pP2Y*VmuATAEn?Y2+r>)#1olk@w+8UNVZvpws+Sl zfH3$z<0Y0!(e<`luFE@AH?}OqJR&*~%qstvx+T{Ym9*9BNr0bVrUx8|d!83q*UNdZ z>M7q6faJqRL1@0jQZ;L;dl3C5o%qA0Z0f7Fqc@%CD=rKq-ps_ukAMPucSL{Y`JQW%DxU&Dr+{$^2#2-0zX<&Q9|(6c z^PPLobXMPSK0P0SN5`6&`}EmW!F7H4SAh4?DE1}ei$X9i3v$lqqFPFM_mZ>g7d2!# zTM$3nii$!}Wi)Nq1E8p{3gbx--wAS72Y?C5fBYW@%h~z8=)YNaW*}@qsBRRfa{)76hKTyF2i$z;oWK z<2m}?v{G)j0%Yzoew$RlU>NIcYMZX5BYabkxOvS&n$iJTnJ?}*f(P`Kz*H7dKL3lO`sj5mfeQY;ZI(~89XM8@7S$-abm&D;SMcO{kz)~9z z?q1QmddTuUoxG|Xn@!S&=K{~!Q^&OSz0m~^aCy;lv?)(*`i(;C`sLdJIz39;Dc?*OrzRpK~?IIZN7c4`_mhC$*u*ydJE+R&~as*LtiBA0E_wi(Bd zu{Fp!d$qKWHZgbo@*M!ZUDI9V3c@P&C>V=_oO6|_9(9j;M{}xziq$ld8#}d0H?0Y8 zs_&GiWBhxNb5ug^wmj7m2ty!V&rC%IuXm)gDem{;`tnx*zoxkoe0SibM)n};aeb5I z)mRZ^odu@WQ3^^H^G9;3$|8_bVCae(gr?afO?90{bpI51&Nc1OH{*wS2E4j`5f@p~ zdJs02JV#saqn3y3hdTibG}D2ZuPx7uSe|6H!-!G(s5-!@W4>2MX+PcDsMDQN zmb9sA9;<~ifg1+v`-I}-$8=D+X~*( zfhQ3@Q_MP7v|3k_!xP&>9@po&fV^KP`{<9r7(h%*u-Tqu=>+M-`*a~(mRthqPH52S zKKYKoOKIzk$C1+16GLS`v`JlSy6+tQ&UeiqrbRr3IIFmjdODY`VLWo2@txXjiT)U5 z#R08Uvg!V#reoV5Y&ReJAY_~GKd`fub9PfSV*s%z1HCNpoTeSL(r|Hko326Q_A}Mn zGsNGv(iO$1$PHkfc+ltsi|7|YRva}BAnJcyKm0j>=J~Nej|QI5&~)$TVd^8+y&80f zWUX`&QZXPbq>6HF`qI8F!cOHEICwAAK z1nBsTzE`J8QiNv;>8wh+n$ScU`T#Kulv~UKhg#M5V2HM zzI4$0VBn>0nGBFZ`MqHJhORj=f1sF4eO*V_?7jMxkRo)6#eC36J#ivl(CP@oK0xA( z+OD>(1W2ufDiT#i6xIU^NwKfZ531{j>Z8|sX%mT86tndENdU=Qv;8o3225O>t%9d& zW{QKQkY^Gqr50vS94ZE_DtTgDKHp@90S-!+000yFNkl zvHi5_)At%cTt8GF{kt^UOG)BoYqRv{h5)J7^ZudUjC4=niRMLjCNOdRP}Og!)Ou+4 zv~siF2Z+x4X776mAermfk%vZ=XRx(Eb)fJ87_ohH2mkaQtDpBUHcG$-I+i=Ol8rT|edU0>b_ z@Toe64A@qk+J{MQ1T{~|se-74bmrS^!gR8Zfpo~MAd4x#=}MP0K-7;XLT7#4SdV(+ zVfsA_Ax@r{(Ph#MqB_X<hdFrXVFY35@y0t{YKTr^O$;b}wLpFwP_ z)tEL(fQ;Lp5*I1t%ai&BGCseKA%CIQn$`!NIC>&oU4Wc$Ex))d<*&flPs^C)NkMMl z9xYv!px$O(xeN#?@~!ywm?&2tAf_YLoGwX#r2TLOjU?vV^$-^&Bfr*5t%@UY+7CZP zfZjEqa9NO@oLaXoKq|9HKD?d@+DwW}xVDsa7TPE=dM8o^#*%hM8TJ8UGg7UeK@3he zH!^rh$xGcFMRM0KKLn6AT@?#)RB0hinrRvWWH3McHbLSCTA>(EY};KN@vueK@QV8Y zu(_SU=6I|5JCjc;iP5GA1N%bx&zjLvcd z@!q0G-_p@_!+Ue1b%V6sD?<_hu^EdfNB^!Ls@VBOdMomW0xwnfbhRl!OxJJi@S)Nx zX+~i)C}td|Csh&vF^u_82L4&#Ig@<%npu9Zz%Lb2J_5qaHM^;&NYaswPE4BuWU#C5%Q#Q?4}(DqA#=UmW;t|>q& z%dCRD4LstGu6e#5c+LlOL{Z*X5=szflDItV10>1_Ol}k9qpjsK5(C65bPlYM_8vF! zOx{w-3w?x6TO#q+VwUcW43Ko8{6S(eJ3(M^Y>*=pk4c@}mG{+;d1%x%-q!!CUMGEk z7@1y66c-?)9aP6-MWeu|DE+vF@Z(^7Nvj0tM}a5a)QnC$gMgV_U;Y#{Iew!K<8iLS zdI9TGRDNAZUPd%2f9htEm2wG@lh5@55_MF@w~O-OHtJc8H-yYFa9J&lZAk5CTh}lD z2%tCWG$q2qV%E7f9zX!3{qO<;nlh?(vYmuDy10-Y(+StuSQS?gb)qmj1KAHmQ`%P_xPF!FZNf9Bk`ul*yOh&qS4QSl95xx%)+mWeHpX3ZO>02m-Ie<4u z3BPvp<@-Q1Ppf5voAZh7i~ynLfgB^M1y|$OaY^uZJQlO%)b9ZeK`kXfE<4%&q~eY zhXFPTwT(85_@T;VF>W2&WB}BDWNsAyEjM328$v7s^KsoYz&#-g(K<*u6y#Fh={9*y zXAcJalILjagDCxs0iuZ0`S21Ve8I#pLdrR777aXLLR(8?8dRk&CxxVQZP%!_^7QHB zS)dvNbQwu;R+Jwz)7~xaJ-`&cp_H9r6vt!*kcyXYC{-MK!(2t93K3{kF+zqC<)@{q zZD^aY*wn~41qpT*{`tYC>B}lPQEbW~lp*Nlz4?9NYf;^zkiF{h?a}V4qrU4CHLY z=`RvMDj+dEZw3%`!>)`ih0F;la{bM?&9HWc)&d-(0!BWGto~3dcao2rXlt84A@UMy zv|+~QlNs{+Cc;JCu$%CnNHgLDC%uyATpp!;zfE)t7-y~7)rDFasAaSDEaLj*vjF-} z6KNUr&@+Ff^sknXs!eG1M4mxZFQ#F+6^R)C7UY~ySxIL}T&+E*HiolN3I2D~(W15S zExYZL*I2*;B$2_9UiQKv6wbICgu_gXFTwMp#s%AP`ZVJ$pan_H0~gmXe+Qss-_R`*agP(#R_!E;tI|KZEhFCiZ6FcOi?x2Xgc~ z6Z)0_L@{-Jxfb9#WQhx4#1=cU)5bQgAASKv9bL^bdQygV z)3){K5(S9rAe}G2o5(7O+><259Gi7*U64r1H_95{%ILQ^#_#5~X}^39fmB7Nan6Rd zG81rl(Q}rxN)OlPxqviICB>jSOP+XplJX=DkP1lr@bd&*Y9Z)jf#nhe-7go7X65P#wCcxa&b9ovPAE56d=pPf5+|+A(yuJqXh~ZF5Y?;e zD>oEASu4R9fj$L`j#stb`bq+gRtYlB$XD}GY-S)Yr0}ORP+UJ$j-lGPA5}81nrS96 zkA>53;61jyApfANBUAf5F!+5XFQqMEuKR{2zHb>o(#!boNLKbEFEba4zZZC^)6D7X zQ&wt_FwP|wvrU(7b<$vNX2uG^6`)KzFJhZn1WYS~oH#4)xQ(`V3-Z@sHgY4Wv|(Ho zJGrom)dNgVn~6?L()M+b@1ez{mP z8#k0B$?#{_FRugW&E{$+bKlXZzm@_-b!w4QYfMH4zEJWUb+p&=r|QF{YQs0&j8=u% z6nIYkTwN`fGMNr4SwEQOgOCY4=MWuNZKj#Z=^&q*R2Z%6hyMe>Bq>N$bh?L9^p4^M zv`wc=)b}k1h!V^#gr5b&*8O~0;5pf-ikY_4&K{#f(c%*uQ+aLa6ex%(LnD4_V?P3> zo9oeHM-%(4){#_6Gh#14=Uwys%R^^3RRQ@W#`+Qck{mj*cme&fc zVD-Thu)OFw=S9%VsEI*!qcJ`t#UZ+np;{Pdqv_JlNXQ68m0x~xyk<%GOw)SSvC$?X zUJ@m#TRm0W{P0^r;tl}2S*SWpp*S*$n{r*BZ3D>2a?8qHU_^GpH}`;8@ck_9&?#g4 z-t;Ek^cLRr!@pL4r8k06WWsuf#Ci^~Ne3=l*_+X4hRX9<&}}-NB*nfaU>+^Js*cPt zQcE(C6Dv1g{s@R})X6#Vef88#%{VQ8+6oY*O~#ii8GNRVW=wRK0G(IN((i5BHUEez zG4IOA+M`Sp-=n0`6)8UC>?)I8=5QYZRf@+D(`*R2kM0J$y021TZTgt{rd5(l1M1Kt z_Ht@eAlDBs0&ulX#!28{F<8ve4{h5;rEfbxl%TFJ?*jNFE1`*g${a2%c>@nxwbKw+ zjx(Fw!UHhcoHt8VG%A9LH?hgdk;yNpVFJF5CY$vn?X7rK>b(HgH}I{x>u9E5M*va* ziKSy>Rf%l`TwL^=>ysR`n)Lf>BRg(JF};azw3)4y(}b51A1UYRj+~p-qaP=e0k5QN zJ+H9+(2!GC0c3q=5;f^UT-iGYkm@hVRRny(RtW}QFH(QGxOl;Si68G(FUVBhR+VlD zCY$q-S#fOt(NG+ z9QQDuWx`4^aw65T)1X*OD#lKRJY#Kc;4a(oNRqzeGsvhi?lL|FQhqOra+M|5@bjOE zlHxQ>E^@z;m?rHUkI;B`=lH$v%PCCI*T^^2(%czMJ(Qb4j(4M0j>_;f$Z? zbZqr|?SQpffLi`;fd|2S3&7f=*E(`-VB)1wl4Zx$(d6XGwAQx?KmcqGJZE2>+?9(< zM`jR;Vk>8gS~*587F7fweN-o3-S^Dv*m2%hT1d+Mr{hmo0Yq6NUErgMD|PCQieep= z#gSxqRg~H!QTiKgGjdl@o(&-~5}YBB^4l5%x@kFMLx32~Msf6s($>v~{|G^sg4rao z`J^rg^xYSTKJ-wQwnXW_6>Yi>AWF%>q2~?|H1lc@-Wx;dr8NB9Rh?RP?E;S4?9;&r zvDsv4(*z)!7+kri6QE*}H`+05TxmLYX!v+3oJ#?Y9?fT1Gcc~Kw(YwTAfrm8{qR!+ zTw$wJ4SmO!T~TGWO{){NpCsC4uH!vXmX|W1Jg-GWo*S5XaVeL&J!1QoHtTADD9x+q z`N}2XRnaZMs|B2|tntVucUSc8rg+O^mhc{Xz8L31@_7Is9aUW>d^?n4ah%MDQTsM+ z*YyBVillvhHG!`N_;gdn>eJEP47t4IrJ@`u$Lo3uv_2ufZU14h`?oU z7IThKy~{ZL#BJLX0I6AW*(QUiYaa#$1i3u$QYHoGiam!2O zj6Kc}EY7eEOK99b{}%~dSzMS}nS_k(HU8P2bZ7sRhmVe;X;sla>92!{_7Bn~Cep^|VI5giIC!z+fqET)T*# ziqEgRI80f9bOI=KhnDd;1gTV-3Or9$zy#hR;B1lVzr*3JLwmT?3T% zf59#4ae4q_+5w~wl-PLr4Fk7K)umJ;>r9&&WTFA)=C>a%F>opqpGKe)Vt+nUlfj<= z+#w)VzvKX{?$x`DI72gS0a9zUjL)x=Bu^t&7ml2cW6&wkR%MD=&BUu`JnyW&_fmRx z3g{GBg+4$gm~L>0-ynoMZRB>IEzLz-3i{_mseT>2P5hLgW!h9(D05P}KB+7K2(;zvQz()Y2e3{hW9x+%Z)0FW9h#q6& z4Uqg}A)NdBGek7g_5l*jZVg+duj5zHaQO&=I9v)GPE3b``3MjqW%_6$-tz!90K9=g zj|qqklCa^q-LT=|^GUtyKM7c%50C_mXu{&`TiN;Zlb9vt3$rkD_dPkpEO2?2BWV^= z&YsM278tXLFasgBN#d;_Y$f4r#c+8W5pNaFz}D>p*t+9SPi=d6$$@51L&Ho2; W6j29R`utu10000