company_group = ModelCompany::where([['root_id', '=', $this->request->employee->root_id]])->value('id'); } /** * 品牌列表 */ public function brand() { $companies = ModelCompany::where([['company_group', '=', $this->company_group]])->column('root_id,company_brand'); $rootIdList = array_column($companies, 'root_id'); $companiesEmployeeCount = Org::field('id')->withCount(['employees' => function ($query) { $query->where([['state', '=', '在职'], ['uid', '<>', 0]]); }])->where([['pid', '=', 0], ['status', '=', '1'], ['id', 'in', $rootIdList]])->select()->toArray(); $companiesEmployeeCount = array_combine(array_column($companiesEmployeeCount, 'id'), array_column($companiesEmployeeCount, 'employees_count')); $brandEmployeeNum = []; foreach ($companies as $company) { isset($brandEmployeeNum[$company['company_brand']]) ?: $brandEmployeeNum[$company['company_brand']] = 0; $brandEmployeeNum[$company['company_brand']] += $companiesEmployeeCount[$company['root_id']] ?? 0; } $brands = CompanyBrand::field('id,logo,brand_name')->withCount(['shop']) ->where([ ['company_group', '=', $this->company_group] ])->select(); foreach ($brands as &$item) { isset($brandEmployeeNum[$item['id']]) ? $item['employee_count'] = $brandEmployeeNum[$item['id']] : $item['employee_count'] = 0; } View::assign('brands', $brands); return View::fetch(); } /** * 添加品牌 */ public function addbrand() { if (!request()->isAjax()) { return View::fetch(); } $data = $this->request->only(['brand_name', 'logo']); if (empty(trim($data['brand_name']))) return json(['code' => 1, 'msg' => '请输入品牌名称']); if (empty($data['logo'])) return json(['code' => 1, 'msg' => '请选择logo']); $data['company_group'] = $this->company_group; CompanyBrand::create($data); return json(['code' => 0, 'msg' => '添加成功']); } /** * 编辑品牌 */ public function editbrand($id) { if (!request()->isAjax()) { $data = CompanyBrand::where(['company_group'=>$this->company_group, 'id'=>$id])->find(); View::assign('data', $data); return View::fetch(); } $data = $this->request->only(['brand_name', 'logo', 'id']); if (empty(trim($data['brand_name']))) return json(['code' => 1, 'msg' => '请输入品牌名称']); $brand = CompanyBrand::where([ ['company_group', '=', $this->company_group], ['id', '=', $id] ])->find(); if (empty($brand)) { return json(['code' => 1, 'msg' => '修改失败']); } else { $brand->save($data); return json(['code' => 0, 'msg' => '修改成功']); } } /** * 店面列表 */ public function shop($id) { $shops = ModelCompany::field('id,company_name,company_brand,start_date,end_date,city,tel,company_group,addtime,root_id') ->where([ ['company_group', '=', $this->company_group], ['company_brand', '=', $id] ])->select()->toArray(); $rootIdList = array_column($shops, 'root_id'); $leader = Employee::where([['root_id', 'in', $rootIdList], ['top_one', '=', 1]])->column('name,phone,opt_name', 'root_id'); $EmployeeCount = Employee::where([['root_id', 'in', $rootIdList], ['state', '=', '在职'], ['uid', '<>', 0]])->group('root_id')->column('count(id) as num', 'root_id'); $aec = new Aec(config('app.aec_key'), config('app.aec_iv')); foreach ($shops as $key => &$s) { $s['leader'] = $leader[$s['root_id']]['opt_name']; $s['leader_phone'] = preg_match('/^1[\d]{10}$/', $leader[$s['root_id']]['phone']) ? $leader[$s['root_id']]['phone'] : $aec->decrypt($leader[$s['root_id']]['phone']); $s['employee_count'] = $EmployeeCount[$s['root_id']] ?? 0; $s['key'] = $key + 1; } View::assign('shops', $shops); return View::fetch(); } /** * 添加店面视图 */ public function addshop() { $id = request()->param('id'); View::assign('company_brand', $id); return View::fetch(); } /** * 添加店面 */ public function addshopsave() { $param = $this->request->param(); $shop_number = ModelCompany::where([['root_id', '=', $this->request->employee->root_id]])->value('shop_number'); $count = ModelCompany::where([['company_group', '=', $this->company_group]])->count(); if ($count >= $shop_number) return json(['code' => 1, 'msg' => '超出开通店面数量']); Db::startTrans(); try { $org_id = Org::insertGetId([ 'name' => $param['company_name'], 'pid' => 0, 'level' => 0, 'info' => $param['company_name'], 'status' => 1 ]); Org::where('id', $org_id)->save(['path' => $org_id . '-']); //查询集团信息 $company = ModelCompany::where([['root_id', '=', $this->request->employee->root_id]])->field('end_date')->find(); ModelCompany::create([ 'company_name' => $param['company_name'], 'start_date' => date('Y-m-d'), 'end_date' => $company['end_date'], 'logo' => $param['logo'] ?? '', 'root_id' => $org_id, 'tel' => $param['tel'], 'company_group' => $this->company_group, 'city' => $param['city'], 'company_brand' => $param['company_brand'], 'province_city' => !empty($param['province_city']) ? $param['province_city'] : '', 'province_city_code' => !empty($param['province_city_code']) ? $param['province_city_code'] : '' ]); $msg = $this->miniInit($org_id, str_rand(6)); if ($msg) return json(['code' => 1, 'msg' => $msg]); Employee::create([ 'phone' => $param['phone'], 'opt_name' => $param['leader_name'], 'root_id' => $org_id, 'grant_id' => 1, 'top_one' => 1 ]); ConstructionStep::insertAll([ ['name' => '开工大吉', 'order' => 1, 'root_id' => $org_id], ['name' => '前期施工', 'order' => 2, 'root_id' => $org_id], ['name' => '中期施工', 'order' => 3, 'root_id' => $org_id], ['name' => '后期施工', 'order' => 4, 'root_id' => $org_id], ['name' => '竣工', 'order' => 5, 'root_id' => $org_id] ]); //课程培训默认分类 TrainClassCate::insertAll([ ['name' => '销冠分享', 'root_id' => $org_id], ['name' => '总裁讲堂', 'root_id' => $org_id], ['name' => '营销工具', 'root_id' => $org_id], ['name' => '工艺标准', 'root_id' => $org_id], ['name' => '营销管理', 'root_id' => $org_id], ['name' => '业务技能', 'root_id' => $org_id], ['name' => '设计常识', 'root_id' => $org_id], ['name' => '产品知识', 'root_id' => $org_id], ['name' => '企业文化', 'root_id' => $org_id], ['name' => '通用知识', 'root_id' => $org_id], ['name' => '其他', 'root_id' => $org_id] ]); //话术默认使用部门 TalkskillUsersCate::insertAll([ ['name' => '业务部', 'root_id' => $org_id, 'show' => 0], ['name' => '网销部', 'root_id' => $org_id, 'show' => 0], ['name' => '设计师', 'root_id' => $org_id, 'show' => 0], ['name' => '客户经理', 'root_id' => $org_id, 'show' => 0], ['name' => '市场部', 'root_id' => $org_id, 'show' => 0], ['name' => '第三方端', 'root_id' => $org_id, 'show' => 0], ['name' => '社群部', 'root_id' => $org_id, 'show' => 0], ['name' => '其它', 'root_id' => $org_id, 'show' => 1] ]); //公司实力默认数据 发展历程 产品介绍 材料实验室 老板访谈 工艺标准 团队承诺 荣誉奖项 CompanyStrengthCate::insertAll([ ['name' => '发展历程', 'root_id' => $org_id], ['name' => '产品介绍', 'root_id' => $org_id], ['name' => '材料实验室', 'root_id' => $org_id], ['name' => '老板访谈', 'root_id' => $org_id], ['name' => '工艺标准', 'root_id' => $org_id], ['name' => '团队承诺', 'root_id' => $org_id], ['name' => '荣誉奖项', 'root_id' => $org_id] ]); //话术默认一级和二级分类 $cates = [ '开场邀约' => ['直播活动', '样板征集', '团购活动', '量房设计'], '添加微信' => ['加微验证', '加微短信', '电话加微'], '引导挖需' => ['基础信息', '谁来做主', '过往经验', '竞品情况', '装修需求'], '建立信任' => ['企业文化', '产品模式', '客户见证', '设计实力', '材料实力', '施工实力', '性价比优', '售后承诺'], '产品介绍' => ['产品内容', '产品优势', '装修流程'], '异议处理' => ['价格问题', '考虑问题', '对比问题', '不急问题'], '其他' => [] ]; $saves = []; foreach ([$org_id] as $v) { foreach ($cates as $k2 => $v2) { $psave = [ 'pid' => 0, 'type' => 'cate', 'root_id' => $v, 'name' => $k2 ]; $pid = TalkskillCates::insertGetId($psave); $save = []; foreach ($v2 as $k3 => $v3) { $save[] = [ 'pid' => $pid, 'type' => 'cate', 'root_id' => $v, 'name' => $v3 ]; } if ($save) (new TalkskillCates())->saveAll($save); unset($save); unset($psave); } } //公司实力默认数据 发展历程 产品介绍 材料实验室 老板访谈 工艺标准 团队承诺 荣誉奖项 TalkskillCates::insertAll([ ['name' => '毛坯期房', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '毛坯现房', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '毛坯准现房', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '老房翻新', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '精装房期房', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '精装房准现房', 'type' => 'house_type', 'root_id' => $org_id], ['name' => '精装房现房', 'type' => 'house_type', 'root_id' => $org_id] ]); } catch (Exception $e) { // 回滚事务 Db::rollback(); return json(['code' => 1, 'msg' => $e->getMessage()]); } Db::commit(); return json(['code' => 0, 'msg' => '添加成功']); } /** * 编辑店面视图 */ public function editshop($root_id) { $company = ModelCompany::where('root_id', $root_id)->find(); $employee = Employee::where([['top_one', '=', 1], ['root_id', '=', $company->root_id]])->field('phone,opt_name')->find(); $company['phone'] = $employee['phone']; $company['leader_name'] = $employee['opt_name']; View::assign('data', $company); return View::fetch(); } /** * 编辑店面保存 */ public function editshopsave() { $param = $this->request->only(['id', 'company_name', 'tel', 'city', 'leader_name', 'province_city'=>'','province_city_code'=>'','phone']); $data = ModelCompany::where('id', $param['id'])->find(); if (empty($data)) return json(['code' => 1, 'msg' => '保存失败,数据不存在']); $data->save($param); //Employee::where([['top_one', '=', 1], ['root_id', '=', $data->root_id]])->update(['opt_name' => $param['leader_name']]); $empdata = Employee::where([['top_one', '=', 1], ['root_id', '=', $data->root_id]])->find(); $empdata->opt_name = $param['leader_name']; if(!empty($param['phone']) && $param['phone'] != $empdata['phone']){ $check = Employee::where([['root_id', '=', $data->root_id],['phone','=',cypherphone(trim($param['phone']))]])->find(); if(!empty($check)){ $check->grant_id = 1; $check->top_one = 1; $check->save(); $empdata->top_one = 0; $empdata->grant_id = 0; $empdata->save(); return json(['code' => 0, 'msg' => '保存成功']); } $empdata->phone = $param['phone']; } $empdata->save(); return json(['code' => 0, 'msg' => '保存成功']); } /** * 数据统计 */ public function statistics($root_id) { $type = TalkskillLabel::where('root_id', $root_id)->field('id,label_name')->select(); //话术总数 $where = [ ['del', '=', 0], ['approve', '=', 1], ['root_id', '=', $root_id] ]; $c = TalkskillModel::where($where)->field('id,root_id,type,employee_id')->select()->toArray(); //count话术总数,gf_upload官方上传,yewu_upload业务员上传,yewu_tiwen业务员提问 $data = ['count'=>0,'gf_upload'=>0,'yewu_upload'=>0,'yewu_tiwen'=>0]; $data['count'] = count($c); foreach ($c as $v) { if ($v['employee_id'] == 0 && $v['type'] == 'admin') { $data['gf_upload'] += 1; } elseif ($v['type'] == 'share' && $v['employee_id'] > 0) { $data['yewu_upload'] += 1; } elseif ($v['type'] == 'submit' && $v['employee_id'] > 0) { $data['yewu_tiwen'] += 1; } } //label_count应用场景数量,gf_huida官方回答,gf_huashu_grwth官方话术占比, yewu_huida业务员回答, yewu_huashu_grawth业务话术占比 $data['label_count'] = count($type); $where[] = ['type', '=', 'submit']; $where[] = ['content', 'not null', '']; $where[] = ['content', '<>', '']; $data['gf_huida'] = TalkskillModel::where($where)->count(); $data['gf_huashu_grwth'] = $data['count'] == 0 ? '0%' : round($data['gf_upload'] / $data['count'] * 100, 2) . '%'; $w2 = [ ['talkskill.root_id', '=', $root_id], ['talkskill_comment.root_id', '=', $root_id], ['talkskill.del', '=', 0], ['talkskill.approve', '=', 1] ]; $data['yewu_huida'] = TalkskillComment::withJoin(['talkskill'], 'inner')->where($w2)->count(); $data['yewu_huashu_grawth'] = $data['count'] == 0 ? '0%' : round($data['yewu_upload'] / $data['count'] * 100, 2) . '%'; $data['yewu_tiwen_grawth'] = $data['count'] == 0 ? '0%' : round($data['yewu_tiwen'] / $data['count'] * 100, 2) . '%'; $data['root_id'] = $root_id; View::assign('data', $data); return View::fetch(); } /** * 初始化小程序配置 */ private function miniInit($rootId, $notify = null) { $program = Miniprogram::where([['root_id', '=', $rootId]])->findOrEmpty(); if ($program->isEmpty()) { if (empty($notify)) return '缺少参数notify'; $data = [ 'appid' => '', 'secret' => '', 'account' => '', 'encodingAesKey' => '', 'token' => '', 'manager_qr' => '', 'employee_qr' => '', 'accesstoken' => '', 'expire' => 0, 'root_id' => $rootId, 'company' => '', 'notify' => $notify ]; $program->save($data); } $notify = $program->notify; // 二维码生成到企业小程序设置中 $defaultAccesstoken = $program->accesstoken; if (empty($defaultAccesstoken)) return '默认accesstoken获取失败'; $miniQr = new Qrcode(); // 1)管理员二维码 $qr = $miniQr->getUnlimited($defaultAccesstoken, [ 'scene' => 'cgi=' . $notify . '&manager=' . $rootId, 'page' => 'mycustomer/pages/invite/invite', 'width' => '280px', 'check_path' => false ]); $rs = json_decode($qr, true); if (!is_null($rs)) { trace($rs, 'error'); return '管理员二维码生成失败'; } $managerQr = 'invite' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg'; ossContentUpload($managerQr, $qr); // 2)员工二维码 $qr = $miniQr->getUnlimited($defaultAccesstoken, [ 'scene' => 'cgi=' . $notify . '&employee=' . $rootId, 'page' => 'mycustomer/pages/invite/invite', 'width' => '280px', 'check_path' => false ]); $rs = json_decode($qr, true); if (!is_null($rs)) return '员工二维码生成失败'; $employeeQr = 'invite' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg'; ossContentUpload($employeeQr, $qr); $company_name = ModelCompany::where('root_id', $rootId)->value('company_name'); $data = [ 'manager_qr' => $managerQr, 'employee_qr' => $employeeQr, 'company' => $company_name ]; $program->save($data); } }