CustomerReach.php 34 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845
  1. <?php
  2. namespace app\api\controller;
  3. use app\model\CustomerClue;
  4. use app\model\DailyWechatArticleCopy;
  5. use app\model\Employee;
  6. use app\model\Footprints;
  7. use app\model\Org;
  8. use app\model\ShareLog;
  9. class CustomerReach extends Base
  10. {
  11. public function index(){
  12. $token = $this->request->token;
  13. $type = input('type', '', 'trim');
  14. $accrued = input('accrued');
  15. if (!in_array($type, ['All', 'MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card'])){
  16. return json(['code'=> self::success, 'data'=> [], 'msg'=> '获取成功']);
  17. }
  18. $start_time_get = input('start_time', time(), 'strtotime');
  19. $end_time_get = input('end_time', time(), 'strtotime');
  20. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  21. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  22. // 所选部门
  23. $org_id = input('org_id', $token['org_id'], 'intval');
  24. // 数据总览
  25. // 部门信息
  26. $data['org_name'] = Org::where('id', '=', $org_id)->value('name');
  27. //员工数量
  28. $sub_org = orgSubIds($org_id);
  29. $sub_employee_ids = Employee::where([['org_id', 'in', $sub_org], ['state', '=', '在职'], ['uid', '>', 0]])->column('id');
  30. $data['employee_count'] = count($sub_employee_ids);
  31. switch ($type){
  32. case 'All':
  33. $clue_type = ['materialCase', 'video', 'article', 'CompanyStrength', 'companyStrength', 'materialEvidence', 'building', 'buildingVr', 'toolAll', 'companyVr', 'lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents', 'weiwang', 'card'];
  34. $share_type = ['MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card', 'MaterialCase_vr', 'Building_vr', 'EmployeeCard_vr', 'Company_vr'];
  35. break;
  36. case 'MaterialCase':
  37. $clue_type = ['materialCase'];
  38. $share_type = ['MaterialCase', 'MaterialCase_vr'];
  39. break;
  40. case 'Video':
  41. $clue_type = ['video'];
  42. $share_type = ['Video'];
  43. break;
  44. case 'Article':
  45. $clue_type = ['article'];
  46. $share_type = ['Article'];
  47. break;
  48. case 'CompanyStrength':
  49. $clue_type = ['CompanyStrength', 'companyStrength'];
  50. $share_type = ['CompanyStrength'];
  51. break;
  52. case 'MaterialEvidence':
  53. $clue_type = ['materialEvidence'];
  54. $share_type = ['MaterialEvidence'];
  55. break;
  56. case 'Building':
  57. $clue_type = ['building', 'buildingVr'];
  58. $share_type = ['Building', 'Building_vr'];
  59. break;
  60. case 'ToolAll':
  61. $clue_type = ['toolAll', 'companyVr'];
  62. $share_type = ['ToolAll', 'Company_vr'];
  63. break;
  64. case 'CustomerJsAll':
  65. $clue_type = ['lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents'];
  66. $share_type = ['CustomerJsAll'];
  67. break;
  68. case 'weiwang':
  69. $clue_type = ['weiwang'];
  70. $share_type = ['weiwang'];
  71. break;
  72. case 'card':
  73. $clue_type = ['card'];
  74. $share_type = ['card', 'EmployeeCard_vr'];
  75. break;
  76. default:
  77. $clue_type = [];
  78. $share_type = [];
  79. break;
  80. }
  81. //转发人数(筛选为全部时需统计每日发圈转发次数和人数)
  82. if(!$accrued){
  83. $t_where[] = ['share_time', 'between', [$start_time, $end_time]];
  84. }
  85. $t_where[] = ['type', 'in', $share_type];
  86. $t_where[] = ['employee_id', 'in', $sub_employee_ids];
  87. $shared_employee = ShareLog::where($t_where)->group('employee_id')->column('employee_id');
  88. if($type == 'All'){
  89. //查询每日发圈转发人数
  90. $wechat_where = [
  91. ['employee_id', 'in', $sub_employee_ids]
  92. ];
  93. if(!$accrued){
  94. $wechat_where[] = ['addtime', 'between', [$start_time, $end_time]];
  95. }
  96. $whchat_data = DailyWechatArticleCopy::where($wechat_where)->group('employee_id')->column('employee_id');
  97. $new_data = array_merge($shared_employee, $whchat_data);
  98. $shared_employee = array_unique($new_data);
  99. }
  100. $data['share_employee_count'] = count($shared_employee);
  101. // 转发次数
  102. $share_all = ShareLog::where($t_where)->select();
  103. $data['share_count'] = $share_all->count();
  104. if($type == 'All'){
  105. //查询每日发圈转发次数
  106. $data['share_count'] += DailyWechatArticleCopy::where($wechat_where)->count();
  107. }
  108. // 获得线索
  109. $clue_where[] = ['employee_id', 'in', $sub_employee_ids];
  110. if($type != 'All') {
  111. $clue_where[] = ['pipe_type', 'in', $clue_type];
  112. }
  113. if(!$accrued){
  114. $clue_where[] = ['addtime', 'between', [$start_time, $end_time]];
  115. }
  116. $clue_count = CustomerClue::where($clue_where)->count();
  117. $data['clue_count'] = $clue_count;
  118. // 浏览次数
  119. $foot_where[] = ['employee_id', 'in', $sub_employee_ids];
  120. if($type != 'All') {
  121. $foot_where[] = ['pipe_type', 'in', $clue_type];
  122. }
  123. if(!$accrued){
  124. $foot_where[] = ['addtime', 'between', [$start_time, $end_time]];
  125. }
  126. $foot_count = Footprints::where($foot_where)->count();
  127. $data['footprints_count'] = $foot_count;
  128. // 浏览时长
  129. $visit_long = Footprints::where($foot_where)->sum('visit_due_time');
  130. $data['visit_long'] = round($visit_long/60, 1);
  131. // 未转发人数
  132. $un_share_employee = array_diff($sub_employee_ids, $shared_employee);
  133. $data['un_share_employee_count'] = count($un_share_employee);
  134. // 是否有子部门
  135. $have_sub_org = Org::where('pid', '=', $org_id)->count();
  136. if ($have_sub_org > 0){
  137. $data['have_sub_org'] = true;
  138. } else {
  139. $data['have_sub_org'] = false;
  140. }
  141. /** -----乐尚企业演示,数量进行调整,正式使用系统时删除此代码 ------*/
  142. if(request()->token['root_org'] == 1793) {
  143. $data['employee_count'] = 512;
  144. $data['share_employee_count'] = 358;
  145. $data['share_count'] = 5179;
  146. $data['clue_count'] = 2681;
  147. $data['footprints_count'] = 12850;
  148. $data['visit_long'] = 2478.6;
  149. $data['un_share_employee_count'] = 154;
  150. }
  151. /*------------------------------------------------------------------------*/
  152. return json(['code'=> self::success, 'data'=> $data, 'msg'=> '请求成功']);
  153. }
  154. /**
  155. * 部门数据
  156. */
  157. public function org(){
  158. $token = $this->request->token;
  159. $type = input('type', '', 'trim');
  160. $accrued = input('accrued');
  161. if (!in_array($type, ['All', 'MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card'])){
  162. return json(['code'=> self::success, 'data'=> [], 'msg'=> '获取成功']);
  163. }
  164. $start_time_get = input('start_time', time(), 'strtotime');
  165. $end_time_get = input('end_time', time(), 'strtotime');
  166. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  167. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  168. // 所选部门
  169. $org_id = input('org_id', $token['org_id'], 'intval');
  170. $sub_org = Org::where([['pid', '=', $org_id], ['status', '=', 1]])->field('id,name,pid')->select()->toArray();
  171. switch ($type){
  172. case 'All':
  173. $clue_type = ['materialCase', 'video', 'article', 'CompanyStrength', 'companyStrength', 'materialEvidence', 'building', 'buildingVr', 'toolAll', 'companyVr', 'lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents', 'weiwang', 'card'];
  174. $share_type = ['MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card', 'MaterialCase_vr', 'Building_vr', 'EmployeeCard_vr', 'Company_vr'];
  175. break;
  176. case 'MaterialCase':
  177. $clue_type = ['materialCase'];
  178. $share_type = ['MaterialCase', 'MaterialCase_vr'];
  179. break;
  180. case 'Video':
  181. $clue_type = ['video'];
  182. $share_type = ['Video'];
  183. break;
  184. case 'Article':
  185. $clue_type = ['article'];
  186. $share_type = ['Article'];
  187. break;
  188. case 'CompanyStrength':
  189. $clue_type = ['CompanyStrength', 'companyStrength'];
  190. $share_type = ['CompanyStrength'];
  191. break;
  192. case 'MaterialEvidence':
  193. $clue_type = ['materialEvidence'];
  194. $share_type = ['MaterialEvidence'];
  195. break;
  196. case 'Building':
  197. $clue_type = ['building', 'buildingVr'];
  198. $share_type = ['Building', 'Building_vr'];
  199. break;
  200. case 'ToolAll':
  201. $clue_type = ['toolAll', 'companyVr'];
  202. $share_type = ['ToolAll', 'Company_vr'];
  203. break;
  204. case 'CustomerJsAll':
  205. $clue_type = ['lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents'];
  206. $share_type = ['CustomerJsAll'];
  207. break;
  208. case 'weiwang':
  209. $clue_type = ['weiwang'];
  210. $share_type = ['weiwang'];
  211. break;
  212. case 'card':
  213. $clue_type = ['card'];
  214. $share_type = ['card', 'EmployeeCard_vr'];
  215. break;
  216. default:
  217. $clue_type = [];
  218. $share_type = [];
  219. break;
  220. }
  221. foreach ($sub_org as $k => $v){
  222. // 是否有子部门
  223. $have_sub_org = Org::where('pid', '=', $v['id'])->count();
  224. if ($have_sub_org > 0){
  225. $sub_org[$k]['have_sub_org'] = true;
  226. } else {
  227. $sub_org[$k]['have_sub_org'] = false;
  228. }
  229. $v_sub_org = orgSubIds($v['id']);
  230. $org_employee_ids = Employee::where([['org_id', 'in', $v_sub_org], ['state', '=', '在职'], ['uid', '<>', 0]])->column('id');
  231. $sub_org[$k]['employee_count'] = count($org_employee_ids);
  232. unset($share_where);
  233. if(!$accrued){
  234. $share_where[] = ['share_time', 'between', [$start_time, $end_time]];
  235. }
  236. $share_where[] = ['type', 'in', $share_type];
  237. $share_where[] = ['employee_id', 'in', $org_employee_ids];
  238. // 已转发员工(筛选为全部时需统计每日发圈转发次数和人数)
  239. $shared_employee = ShareLog::where($share_where)->group('employee_id')->column('employee_id');
  240. if($type == 'All'){
  241. //查询每日发圈转发人数
  242. $wechat_where = [
  243. ['employee_id', 'in', $org_employee_ids]
  244. ];
  245. if(!$accrued){
  246. $wechat_where[] = ['addtime', 'between', [$start_time, $end_time]];
  247. }
  248. $whchat_data = DailyWechatArticleCopy::where($wechat_where)->group('employee_id')->column('employee_id');
  249. $new_data = array_merge($shared_employee, $whchat_data);
  250. $shared_employee = array_unique($new_data);
  251. }
  252. $sub_org[$k]['share_employee_count'] = count($shared_employee);
  253. // 未转发员工
  254. $un_share_employee = array_diff($org_employee_ids, $shared_employee);
  255. $sub_org[$k]['un_share_employee_count'] = count($un_share_employee);
  256. // 转发次数
  257. $share_count = ShareLog::where($share_where)->count();
  258. if($type == 'All'){
  259. //查询每日发圈转发次数
  260. $share_count += DailyWechatArticleCopy::where($wechat_where)->count();
  261. }
  262. $sub_org[$k]['share_count'] = $share_count;
  263. // 线索
  264. unset($clue_where);
  265. $clue_where[] = ['employee_id', 'in', $org_employee_ids];
  266. if($type != 'All'){
  267. $clue_where[] = ['pipe_type', 'in', $clue_type];
  268. }
  269. if(!$accrued){
  270. $clue_where[] = ['addtime', 'between', [$start_time, $end_time]];
  271. }
  272. $clue_count = CustomerClue::where($clue_where)->count();
  273. $sub_org[$k]['clue_count'] = $clue_count;
  274. // 浏览次数
  275. unset($foot_where);
  276. $foot_where[] = ['employee_id', 'in', $org_employee_ids];
  277. if($type != 'All'){
  278. $foot_where[] = ['pipe_type', 'in', $clue_type];
  279. }
  280. if(!$accrued){
  281. $foot_where[] = ['addtime', 'between', [$start_time, $end_time]];
  282. }
  283. $foot_count = Footprints::where($foot_where)->count();
  284. $sub_org[$k]['footprints_count'] = $foot_count;
  285. $visit_long = Footprints::where($foot_where)->sum('visit_due_time');
  286. $sub_org[$k]['visit_long'] = round($visit_long/60, 1);
  287. /** -----乐尚企业演示,数量进行调整,正式使用系统时删除此代码 ------*/
  288. if($token['root_org'] == 1793) {
  289. $sub_org[$k]['employee_count'] = 188;
  290. $sub_org[$k]['share_employee_count'] = 120;
  291. $sub_org[$k]['un_share_employee_count'] = 68;
  292. $sub_org[$k]['share_count'] = $v['id'];
  293. $sub_org[$k]['clue_count'] = floor($v['id']/2);
  294. $sub_org[$k]['footprints_count'] = $v['id']*2;
  295. $sub_org[$k]['visit_long'] = floor($v['id']/3);
  296. }
  297. /*------------------------------------------------------------------------*/
  298. }
  299. $order = input('order', '', 'trim');
  300. if ($order) {
  301. $order_arr = explode(' ', $order);
  302. $sort_field = $order_arr[0] ?? 'share';
  303. $sort_order = $order_arr[1] ?? 'desc';
  304. switch ($sort_field){
  305. case 'share':
  306. $field = 'share_count';
  307. break;
  308. case 'clue':
  309. $field = 'clue_count';
  310. break;
  311. case 'visit':
  312. $field = 'footprints_count';
  313. break;
  314. case 'long':
  315. $field = 'visit_long';
  316. break;
  317. default:
  318. $field = 'notFound';
  319. break;
  320. }
  321. if ($sort_order == 'asc'){
  322. $sort = SORT_ASC;
  323. } else {
  324. $sort = SORT_DESC;
  325. }
  326. $arr = [];
  327. foreach ($sub_org as $v){
  328. if (!isset($v[$field])){
  329. break;
  330. }
  331. $arr[] = $v[$field];
  332. }
  333. if (!empty($arr)){
  334. array_multisort($arr, $sort, $sub_org);
  335. }
  336. }
  337. return json(['code'=> self::success, 'data'=> $sub_org, 'msg'=> '请求成功']);
  338. }
  339. /**
  340. * 员工数据
  341. */
  342. public function employee(){
  343. $token = $this->request->token;
  344. $type = input('type', '', 'trim');
  345. $accrued = input('accrued');
  346. if (!in_array($type, ['All', 'MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card'])){
  347. return json(['code'=> self::success, 'data'=> [], 'msg'=> '获取成功']);
  348. }
  349. $start_time_get = input('start_time', time(), 'strtotime');
  350. $end_time_get = input('end_time', time(), 'strtotime');
  351. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  352. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  353. // 所选部门
  354. $org_id = input('org_id', $token['org_id'], 'intval');
  355. // 所选部门员工统计数据
  356. $e_where[] = ['org_id', '=', $org_id];
  357. $e_where[] = ['state', '=', '在职'];
  358. $e_where[] = ['uid', '<>', 0];
  359. $employee_list = Employee::with(['user'=> function($query){
  360. $query->field('id,headimgurl');
  361. }])->where($e_where)->field('id,name,org_id,root_id,uid')->select()->toArray();
  362. switch ($type){
  363. case 'All':
  364. $clue_type = ['materialCase', 'video', 'article', 'CompanyStrength', 'companyStrength', 'materialEvidence', 'building', 'buildingVr', 'toolAll', 'companyVr', 'lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents', 'weiwang', 'card'];
  365. $share_type = ['MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card', 'MaterialCase_vr', 'Building_vr', 'EmployeeCard_vr', 'Company_vr'];
  366. break;
  367. case 'MaterialCase':
  368. $clue_type = ['materialCase'];
  369. $share_type = ['MaterialCase', 'MaterialCase_vr'];
  370. break;
  371. case 'Video':
  372. $clue_type = ['video'];
  373. $share_type = ['Video'];
  374. break;
  375. case 'Article':
  376. $clue_type = ['article'];
  377. $share_type = ['Article'];
  378. break;
  379. case 'CompanyStrength':
  380. $clue_type = ['CompanyStrength', 'companyStrength'];
  381. $share_type = ['CompanyStrength'];
  382. break;
  383. case 'MaterialEvidence':
  384. $clue_type = ['materialEvidence'];
  385. $share_type = ['MaterialEvidence'];
  386. break;
  387. case 'Building':
  388. $clue_type = ['building'];
  389. $share_type = ['Building', 'Building_vr'];
  390. break;
  391. case 'ToolAll':
  392. $clue_type = ['toolAll', 'companyVr'];
  393. $share_type = ['ToolAll', 'Company_vr'];
  394. break;
  395. case 'CustomerJsAll':
  396. $clue_type = ['lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents'];
  397. $share_type = ['CustomerJsAll'];
  398. break;
  399. case 'weiwang':
  400. $clue_type = ['weiwang'];
  401. $share_type = ['weiwang'];
  402. break;
  403. case 'card':
  404. $clue_type = ['card'];
  405. $share_type = ['card', 'EmployeeCard_vr'];
  406. break;
  407. default:
  408. $clue_type = [];
  409. $share_type = [];
  410. break;
  411. }
  412. foreach ($employee_list as $k => $v){
  413. unset($share_where);
  414. if(!$accrued){
  415. $share_where[] = ['share_time', 'between', [$start_time, $end_time]];
  416. }
  417. $share_where[] = ['type', 'in', $share_type];
  418. $share_where[] = ['employee_id', '=', $v['id']];
  419. // 转发次数(筛选为全部时需统计每日发圈转发次数和人数)
  420. $share_count = ShareLog::where($share_where)->count();
  421. if($type == 'All'){
  422. //查询每日发圈转发次数
  423. $wechat_where = [
  424. ['employee_id', '=', $v['id']]
  425. ];
  426. if(!$accrued){
  427. $wechat_where[] = ['addtime', 'between', [$start_time, $end_time]];
  428. }
  429. $share_count += DailyWechatArticleCopy::where($wechat_where)->count();
  430. }
  431. $employee_list[$k]['share_count'] = $share_count;
  432. // 线索
  433. unset($clue_where);
  434. $clue_where[] = ['employee_id', '=', $v['id']];
  435. if ($type != 'All'){
  436. $clue_where[] = ['pipe_type', 'in', $clue_type];
  437. }
  438. if(!$accrued){
  439. $clue_where[] = ['addtime', 'between', [$start_time, $end_time]];
  440. }
  441. $clue_count = CustomerClue::where($clue_where)->count();
  442. $employee_list[$k]['clue_count'] = $clue_count;
  443. // 浏览次数
  444. unset($foot_where);
  445. $foot_where[] = ['employee_id', '=', $v['id']];
  446. if ($type != 'All') {
  447. $foot_where[] = ['pipe_type', 'in', $clue_type];
  448. }
  449. if(!$accrued){
  450. $foot_where[] = ['addtime', 'between', [$start_time, $end_time]];
  451. }
  452. $foot_count = Footprints::where($foot_where)->count();
  453. $employee_list[$k]['footprints_count'] = $foot_count;
  454. $visit_long = Footprints::where($foot_where)->sum('visit_due_time');
  455. $employee_list[$k]['visit_long'] = round($visit_long/60, 1);
  456. /** -----乐尚企业演示,数量进行调整,正式使用系统时删除此代码 ------*/
  457. if(request()->token['root_org'] == 1793) {
  458. $employee_list[$k]['share_count'] = floor($v['id']/12);
  459. $employee_list[$k]['clue_count'] = floor($v['id']/20);
  460. $employee_list[$k]['footprints_count'] = floor($v['id']/10);
  461. $employee_list[$k]['visit_long'] = floor($v['id']/50);
  462. }
  463. /*------------------------------------------------------------------------*/
  464. }
  465. $order = input('order', '', 'trim');
  466. if ($order) {
  467. $order_arr = explode(' ', $order);
  468. $sort_field = $order_arr[0] ?? 'share';
  469. $sort_order = $order_arr[1] ?? 'desc';
  470. switch ($sort_field){
  471. case 'share':
  472. $field = 'share_count';
  473. break;
  474. case 'clue':
  475. $field = 'clue_count';
  476. break;
  477. case 'visit':
  478. $field = 'footprints_count';
  479. break;
  480. case 'long':
  481. $field = 'visit_long';
  482. break;
  483. default:
  484. $field = 'notFound';
  485. break;
  486. }
  487. if ($sort_order == 'asc'){
  488. $sort = SORT_ASC;
  489. } else {
  490. $sort = SORT_DESC;
  491. }
  492. $arr = [];
  493. foreach ($employee_list as $v){
  494. if (!isset($v[$field])){
  495. break;
  496. }
  497. $arr[] = $v[$field];
  498. }
  499. if (!empty($arr)){
  500. array_multisort($arr, $sort, $employee_list);
  501. }
  502. }
  503. $page = input('page', 1, 'intval');
  504. $limit = input('limit', 10, 'intval');
  505. $list = array_slice($employee_list, ($page-1)*$limit, $page*$limit-1);
  506. return json(['code'=> self::success, 'data'=> $list, 'msg'=> '请求成功']);
  507. }
  508. /**
  509. * 未分享人
  510. */
  511. public function un_share(){
  512. $token = $this->request->token;
  513. $type = input('type', '', 'trim');
  514. $accrued = input('accrued');
  515. if (!in_array($type, ['All', 'MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'ToolAll', 'CustomerJsAll', 'weiwang', 'card'])){
  516. return json(['code'=> self::success, 'data'=> [], 'msg'=> '获取成功']);
  517. }
  518. $start_time_get = input('start_time', time(), 'strtotime');
  519. $end_time_get = input('end_time', time(), 'strtotime');
  520. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  521. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  522. // 所选部门
  523. $org_id = input('org_id', $token['org_id'], 'intval');
  524. // 数据总览
  525. //员工数量
  526. $sub_org = orgSubIds($org_id);
  527. $sub_employee_ids = Employee::where([['org_id', 'in', $sub_org], ['state', '=', '在职'], ['uid', '<>', 0]])->column('id');
  528. switch ($type){
  529. case 'All':
  530. $share_type = ['MaterialCase', 'Video', 'Article', 'CompanyStrength', 'MaterialEvidence', 'Building', 'toolAll', 'companyVr', 'lottery', 'styleTest', 'likeTest', 'priceCalculation', 'spellgroup', 'agents', 'weiwang', 'card', 'MaterialCase_vr', 'Building_vr', 'EmployeeCard_vr', 'Company_vr'];
  531. break;
  532. case 'MaterialCase':
  533. $share_type = ['MaterialCase', 'MaterialCase_vr'];
  534. break;
  535. case 'Video':
  536. $share_type = ['Video'];
  537. break;
  538. case 'Article':
  539. $share_type = ['Article'];
  540. break;
  541. case 'CompanyStrength':
  542. $share_type = ['CompanyStrength'];
  543. break;
  544. case 'MaterialEvidence':
  545. $share_type = ['MaterialEvidence'];
  546. break;
  547. case 'Building':
  548. $share_type = ['Building', 'Building_vr'];
  549. break;
  550. case 'ToolAll':
  551. $share_type = ['ToolAll', 'Company_vr'];
  552. break;
  553. case 'CustomerJsAll':
  554. $share_type = ['CustomerJsAll'];
  555. break;
  556. case 'weiwang':
  557. $share_type = ['weiwang'];
  558. break;
  559. case 'card':
  560. $share_type = ['card', 'EmployeeCard_vr'];
  561. break;
  562. default:
  563. $share_type = [];
  564. break;
  565. }
  566. //转发人数
  567. if(!$accrued){
  568. $t_where[] = ['share_time', 'between', [$start_time, $end_time]];
  569. }
  570. $t_where[] = ['type', 'in', $share_type];
  571. $t_where[] = ['employee_id', 'in', $sub_employee_ids];
  572. $shared_employee = ShareLog::where($t_where)->group('employee_id')->column('employee_id');
  573. // 未转发人数
  574. $un_share_employee = array_diff($sub_employee_ids, $shared_employee);
  575. $page = input('page', 1, 'intval');
  576. $limit = input('limit', 10, 'intval');
  577. $list = Employee::with(['org'=> function($query){
  578. $query->field('id,name');
  579. }, 'user'=> function($query){
  580. $query->field('id,headimgurl');
  581. }])->where('id', 'in', $un_share_employee)->field('id,name,org_id,uid')->order('org_id asc')->page($page, $limit)->select()->toArray();
  582. return json(['code'=> self::success, 'msg'=> '获取成功', 'data'=> $list]);
  583. }
  584. /**
  585. * 每日发圈数据
  586. */
  587. public function daily_index(){
  588. $token = $this->request->token;
  589. $accrued = input('accrued');
  590. $start_time_get = input('start_time', time(), 'strtotime');
  591. $end_time_get = input('end_time', time(), 'strtotime');
  592. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  593. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  594. if(!$accrued){
  595. $where[] = ['addtime', 'between', [$start_time, $end_time]];
  596. }
  597. // 所选部门
  598. $org_id = input('org_id', $token['org_id'], 'intval');
  599. // 部门信息
  600. $data['org_name'] = Org::where('id', '=', $org_id)->value('name');
  601. //员工数量
  602. $sub_org = orgSubIds($org_id);
  603. $sub_employee_ids = Employee::where([['org_id', 'in', $sub_org], ['state', '=', '在职'], ['uid', '<>', 0]])->column('id');
  604. $data['employee_count'] = count($sub_employee_ids);
  605. //转发人数
  606. $where[] = ['employee_id', 'in', $sub_employee_ids];
  607. $shared_employee = DailyWechatArticleCopy::where($where)->group('employee_id')->column('employee_id');
  608. $data['share_employee_count'] = count($shared_employee);
  609. // 转发次数
  610. $share_count = DailyWechatArticleCopy::where($where)->count();
  611. $data['share_count'] = $share_count;
  612. // 未转发人数
  613. $un_share_employee = array_diff($sub_employee_ids, $shared_employee);
  614. $data['un_share_employee_count'] = count($un_share_employee);
  615. // 是否有子部门
  616. $have_sub_org = Org::where('pid', '=', $org_id)->count();
  617. if ($have_sub_org > 0){
  618. $data['have_sub_org'] = true;
  619. } else {
  620. $data['have_sub_org'] = false;
  621. }
  622. return json(['code'=> self::success, 'data'=> $data, 'msg'=> '请求成功']);
  623. }
  624. /**
  625. * 每日发圈部门数据
  626. */
  627. public function daily_org(){
  628. $token = $this->request->token;
  629. $accrued = input('accrued');
  630. $start_time_get = input('start_time', time(), 'strtotime');
  631. $end_time_get = input('end_time', time(), 'strtotime');
  632. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  633. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  634. // 所选部门
  635. $org_id = input('org_id', $token['org_id'], 'intval');
  636. $sub_org = Org::where([['pid', '=', $org_id], ['status', '=', 1]])->field('id,name,pid')->select()->toArray();
  637. foreach ($sub_org as $k => $v){
  638. // 是否有子部门
  639. $have_sub_org = Org::where('pid', '=', $v['id'])->count();
  640. if ($have_sub_org > 0){
  641. $sub_org[$k]['have_sub_org'] = true;
  642. } else {
  643. $sub_org[$k]['have_sub_org'] = false;
  644. }
  645. $v_sub_org = orgSubIds($v['id']);
  646. $org_employee_ids = Employee::where([['org_id', 'in', $v_sub_org], ['state', '=', '在职'], ['uid', '<>', 0]])->column('id');
  647. $sub_org[$k]['employee_count'] = count($org_employee_ids);
  648. unset($share_where);
  649. if(!$accrued){
  650. $share_where[] = ['addtime', 'between', [$start_time, $end_time]];
  651. }
  652. $share_where[] = ['employee_id', 'in', $org_employee_ids];
  653. // 已转发员工
  654. $shared_employee = DailyWechatArticleCopy::where($share_where)->group('employee_id')->column('employee_id');
  655. $sub_org[$k]['share_employee_count'] = count($shared_employee);
  656. // 未转发员工
  657. $un_share_employee = array_diff($org_employee_ids, $shared_employee);
  658. $sub_org[$k]['un_share_employee_count'] = count($un_share_employee);
  659. // 转发次数
  660. $share_count = DailyWechatArticleCopy::where($share_where)->count();
  661. $sub_org[$k]['share_count'] = $share_count;
  662. }
  663. $order = input('order', 'desc', 'trim');
  664. if ($order == 'asc'){
  665. $sort = SORT_ASC;
  666. } else {
  667. $sort = SORT_DESC;
  668. }
  669. $arr = [];
  670. foreach ($sub_org as $v){
  671. $arr[] = $v['share_count'];
  672. }
  673. array_multisort($arr, $sort, $sub_org);
  674. return json(['code'=> self::success, 'data'=> $sub_org, 'msg'=> '请求成功']);
  675. }
  676. /**
  677. * 每日发圈员工数据
  678. */
  679. public function daily_employee(){
  680. $token = $this->request->token;
  681. $accrued = input('accrued');
  682. $start_time_get = input('start_time', time(), 'strtotime');
  683. $end_time_get = input('end_time', time(), 'strtotime');
  684. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  685. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  686. // 所选部门
  687. $org_id = input('org_id', $token['org_id'], 'intval');
  688. // 所选部门员工统计数据
  689. $e_where[] = ['org_id', '=', $org_id];
  690. $e_where[] = ['state', '=', '在职'];
  691. $e_where[] = ['uid', '<>', '0'];
  692. $employee_list = Employee::with(['user'=> function($query){
  693. $query->field('id,headimgurl');
  694. }])->where($e_where)->field('id,name,org_id,root_id,uid')->select()->toArray();
  695. foreach ($employee_list as $k => $v){
  696. unset($share_where);
  697. if(!$accrued){
  698. $share_where[] = ['addtime', 'between', [$start_time, $end_time]];
  699. }
  700. $share_where[] = ['employee_id', '=', $v['id']];
  701. // 转发次数
  702. $share_count = DailyWechatArticleCopy::where($share_where)->count();
  703. $employee_list[$k]['share_count'] = $share_count;
  704. }
  705. $order = input('order', 'desc', 'trim');
  706. if ($order == 'asc'){
  707. $sort = SORT_ASC;
  708. } else {
  709. $sort = SORT_DESC;
  710. }
  711. $arr = [];
  712. foreach ($employee_list as $v){
  713. $arr[] = $v['share_count'];
  714. }
  715. array_multisort($arr, $sort, $employee_list);
  716. $page = input('page', 1, 'intval');
  717. $limit = input('limit', 10, 'intval');
  718. $list = array_slice($employee_list, ($page-1)*$limit, $page*$limit-1);
  719. return json(['code'=> self::success, 'data'=> $list, 'msg'=> '请求成功']);
  720. }
  721. /**
  722. * 每日发圈未分享
  723. */
  724. public function daily_un_share() {
  725. $token = $this->request->token;
  726. $accrued = input('accrued');
  727. $start_time_get = input('start_time', time(), 'strtotime');
  728. $end_time_get = input('end_time', time(), 'strtotime');
  729. $start_time = date('Y-m-d 00:00:00', $start_time_get);
  730. $end_time = date('Y-m-d 23:59:59', $end_time_get);
  731. if(!$accrued){
  732. $where[] = ['addtime', 'between', [$start_time, $end_time]];
  733. }
  734. // 所选部门
  735. $org_id = input('org_id', $token['org_id'], 'intval');
  736. //员工数量
  737. $sub_org = orgSubIds($org_id);
  738. $sub_employee_ids = Employee::where([['org_id', 'in', $sub_org], ['state', '=', '在职'], ['uid', '<>', 0]])->column('id');
  739. //转发人数
  740. $where[] = ['employee_id', 'in', $sub_employee_ids];
  741. $shared_employee = DailyWechatArticleCopy::where($where)->group('employee_id')->column('employee_id');
  742. $page = input('page', 1, 'intval');
  743. $limit = input('limit', 10, 'intval');
  744. // 未转发人数
  745. $un_share_employee = array_diff($sub_employee_ids, $shared_employee);
  746. $list = Employee::with(['org'=> function($query){
  747. $query->field('id,name');
  748. }, 'user'=> function($query){
  749. $query->field('id,headimgurl');
  750. }])->where('id', 'in', $un_share_employee)->order('org_id asc')->page($page, $limit)->field('id,name,org_id,uid')->select()->toArray();
  751. return json(['code'=> self::success, 'msg'=> '获取成功', 'data'=> $list]);
  752. }
  753. }