Activity.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730
  1. <?php
  2. namespace app\api\controller;
  3. use app\model\Setting;
  4. use think\facade\Request;
  5. use app\model\Activity as ActivityModel;
  6. use app\model\UserCollect;
  7. use app\model\Footprints;
  8. use app\model\Customer;
  9. use app\model\CustomersSubscribe;
  10. use app\model\CustomerVisitLog;
  11. use app\model\Org;
  12. use app\model\Employee;
  13. use app\model\User;
  14. use app\model\CustomerTop;
  15. use app\model\ActivitySign;
  16. use wx\offiaccount\client\TmpMsg;
  17. use app\model\WechatActivityIntegral;
  18. class Activity extends Base
  19. {
  20. /*
  21. * 活动列表
  22. */
  23. public function list()
  24. {
  25. $token = request()->token;
  26. $param = Request::only(['page', 'in' => false, 'cate' => '', 'name'=> '']); //cate ''全部,0内场,1外场
  27. $condition = [['del', '=', 0], ['show', '=', 1], ['root_id', '=', $token['root_org']]];
  28. if ($param['cate'] !== '') $condition[] = ['cate', '=', $param['cate']];
  29. if ($param['in']) $condition[] = ['end_date', '>=', date('Y-m-d')];
  30. if ($param['name']) $condition[] = ['title', 'like', '%'.$param['name'].'%'];
  31. $employee_id = $token['employee_id'];
  32. $model = ActivityModel::where($condition)->where(function ($query) use ($employee_id){
  33. $query->whereRaw("FIND_IN_SET(" . $employee_id . " , assign_employee)")
  34. ->whereOr('assign_employee', '=', NULL)
  35. ->whereOr('assign_employee', '=', '');
  36. });
  37. $data = $model->field('id , cover , title , start_date , end_date, cate, address,poster')->append(['timestate'])
  38. ->order(['id' => 'desc'])
  39. ->select()->toArray();
  40. $arr[0] = $arr[1] = $arr[2] = [];
  41. foreach ($data as $k => $v) {
  42. $arr[$v['timestate']][] = $v;
  43. }
  44. $data = array_merge($arr[1], $arr[0], $arr[2]);
  45. $data = array_slice($data, ($param['page'] - 1) * 6, 6);
  46. $collectedIds = UserCollect::where(['user_id' => $token['uid'], 'content_type' => 'activity'])->column('content_id');
  47. foreach ($data as &$item) {
  48. //是否收藏
  49. if (in_array($item['id'], $collectedIds)) {
  50. $item['collected'] = true;
  51. } else {
  52. $item['collected'] = false;
  53. }
  54. $ali_oss_bindurl = 'https://' . config('app.ali_oss_bindurl') . '/';
  55. $item['cover'] = str_replace($ali_oss_bindurl, '', $item['cover']);
  56. }
  57. return json(['code' => 0, 'data' => $data, 'msg' => '获取成功']);
  58. }
  59. public function details($id)
  60. {
  61. $token = request()->token;
  62. $data = ActivityModel::where(['id' => $id, 'del' => 0, 'root_id' => $token['root_org']])->field('id,cover,title,content,type,start_date,end_date,end_date as timestate,view,money,cate,address,poster')->find();
  63. if (!empty($data['assign_employee'])){
  64. $assign_employee = explode(',', $data['assign_employee']);
  65. if (!in_array($token['employee_id'], $assign_employee)){
  66. return json(['code' => 1, 'data' => [], 'msg' => '获取失败']);
  67. }
  68. }
  69. //是否收藏
  70. $collectedIds = UserCollect::where(['user_id' => $token['uid'], 'content_type' => 'activity', 'content_id' => $id])->count();
  71. $data['collected'] = $collectedIds > 0 ? true : false;
  72. ActivityModel::where('id', $id)->inc('view')->update();
  73. return json(['code' => 0, 'data' => $data, 'msg' => '获取成功']);
  74. }
  75. /*
  76. * 收藏
  77. */
  78. public function collection($id)
  79. {
  80. $rs = UserCollect::where(['content_id' => $id, 'user_id' => $this->request->token['uid'], 'content_type' => 'activity'])->count();
  81. if ($rs > 0) return json(['code' => 1, 'msg' => '您已收藏']);
  82. UserCollect::insert(['content_id' => $id, 'user_id' => $this->request->token['uid'], 'content_type' => 'activity']);
  83. return json(['code' => 0, 'msg' => '收藏成功']);
  84. }
  85. /**
  86. * 取消收藏
  87. */
  88. public function collectCancel($id)
  89. {
  90. $collect = UserCollect::where(['content_id' => $id, 'user_id' => $this->request->token['uid'], 'content_type' => 'activity'])->find();
  91. if (!$collect) return json(['code' => 1, 'msg' => '取消失败']);
  92. $collect->delete();
  93. return json(['code' => 0, 'msg' => '取消收藏']);
  94. }
  95. /**
  96. * 活动邀约邀约客户
  97. */
  98. public function invite()
  99. {
  100. $token = request()->token;
  101. $param = $this->request->only(['uid', 'aid', 'date']);
  102. //重复邀约
  103. $cw[] = ['pipe_type', '=', 'artivityInvite'];
  104. $cw[] = ['uid', '=', $param['uid']];
  105. $check = Footprints::where($cw)->whereRaw('reg_info->"$.aid" = ' . $param['aid'])->order('id desc')->find();
  106. if ($check) return json(['code' => 0, 'msg' => '重复邀约']);
  107. $save['uid'] = $param['uid'];
  108. $save['employee_id'] = $token['employee_id'];
  109. $save['pipe_type'] = 'artivityInvite';
  110. $json['aid'] = (int)$param['aid'];
  111. $json['state'] = '已邀约';
  112. $json['date'] = $param['date'];
  113. $save['reg_info'] = json_encode($json);
  114. Footprints::insert($save);
  115. return json(['code' => 0, 'msg' => '邀约成功']);
  116. }
  117. /*
  118. * crm客户跟进页面预约活动列表
  119. */
  120. public function activity_list()
  121. {
  122. $param = $this->request->only(['p', 'pagesize', 'cate' => '']);
  123. $token = request()->token;
  124. if ($param['cate'] !== '') $w[] = ['cate', '=', $param['cate']];
  125. $w[] = ['root_id', '=', $token['root_org']];
  126. $w[] = ['end_date', '>=', date('Y-m-d')];
  127. $w[] = ['show', '=', 1];
  128. $w[] = ['del', '=', 0];
  129. $employee_id = $token['employee_id'];
  130. $model = ActivityModel::where($w)->where(function ($query) use ($employee_id){
  131. $query->whereRaw("FIND_IN_SET(" . $employee_id . " , assign_employee)")
  132. ->whereOr('assign_employee', '=', NULL)
  133. ->whereOr('assign_employee', '=', '');
  134. });
  135. $res = $model->field('id,title,start_date,end_date')->select()->toArray();
  136. return json(['code' => 0, 'data' => $res, 'msg' => '获取成功']);
  137. }
  138. /**
  139. * 已预约活动客户列表
  140. */
  141. public function invite_list()
  142. {
  143. $param = $this->request->only(['type' => '预约活动', 'p' => 1, 'pagesize' => 10, 'aid']);
  144. $token = request()->token;
  145. // 检测活动是否是该公司的
  146. $is = ActivityModel::where(['root_id' => $token['root_org'], 'id' => $param['aid']])->count();
  147. if (!$is) return json(['code' => 0, 'data' => [], 'count' => 0, 'msg' => '获取成功']);
  148. //只查询我的客户,过滤曾经邀约过当前无效的客户
  149. $all_customer_id = CustomersSubscribe::where([['aid', '=', $param['aid']], ['employee_id|designer_id', '=', $token['employee_id']]])->column('customer_id');
  150. $customer_id = Customer::where([['employee_id|designer_id', '=', $token['employee_id']], ['id', 'in', $all_customer_id]])->column('id');
  151. $condition = [['aid', '=', $param['aid']], ['type', '=', 2], ['employee_id|designer_id', '=', $token['employee_id']]];
  152. $condition[] = ['customer_id', 'in', $customer_id];
  153. if ($param['type'] == '已到场') $condition[] = ['state', '=', 1];
  154. $depositStates = CustomerVisitLog::changeState('已交定', 'chaos');
  155. $signStates = CustomerVisitLog::changeState('已签单', 'chaos');
  156. if ($param['type'] == '已交定' || $param['type'] == '已签单') {
  157. $states = $param['type'] == '已交定' ? $depositStates : $signStates;
  158. $idlist = CustomersSubscribe::where($condition)->column('customer_id');
  159. $idlist = CustomerVisitLog::where([
  160. ['customer_id', 'in', $idlist],
  161. ['state', 'in', $states]
  162. ])->group('customer_id')->column("customer_id");
  163. $condition[] = ['customer_id', 'in', $idlist];
  164. }
  165. $count = CustomersSubscribe::where($condition)->group('customer_id')->count();
  166. //置顶数据
  167. $top_ids = CustomersSubscribe::where($condition)->column('customer_id');
  168. $top = CustomerTop::where([['customer_id', 'in', $top_ids]])->column('customer_id');
  169. $field = "*,IF(customer_id in ('" . implode('\',\'', $top) . "'),1,0) as orders";
  170. $res = CustomersSubscribe::where($condition)->field($field)->order('orders desc,id asc')->group('customer_id')->page($param['p'], $param['pagesize'])->select()->toArray();
  171. $customerIdList = array_column($res, 'customer_id');
  172. $customers = Customer::where([['id', 'in', $customerIdList], ['died', '<>', 2]])->column('uid,state,name,sex,community_name,level,last_contact_date', 'id');
  173. $users = User::where([['id', 'in', array_column($customers, 'uid')]])->column('headimgurl', 'id');
  174. $logs = CustomerVisitLog::where([
  175. ['customer_id', 'in', $customerIdList],
  176. ['state', 'in', array_merge($depositStates, $signStates)]
  177. ])->group('customer_id')->column("
  178. count(if(state in ('" . implode('\',\'', $signStates) . "'),'1',null)) as sign_num,
  179. count(if(state in ('" . implode('\',\'', $depositStates) . "'),'1',null)) as deposit_num
  180. ", "customer_id");
  181. //统计
  182. $customersStateList = CustomerVisitLog::where([['customer_id', 'in', $customerIdList]])->group('state,customer_id')->field('count(state) as num, state, customer_id')->select()->toArray();
  183. $customersState = [];
  184. foreach ($customersStateList as $s) {
  185. if (!isset($customersState[$s['customer_id']]))
  186. $customersState[$s['customer_id']] = ['count' => 0, 'shop' => 0, 'measure' => 0, 'activity' => 0, 'deposit' => 0, 'signed' => 0];
  187. $customersState[$s['customer_id']]['count'] += $s['num'];
  188. // 到店,量房,活动,定金,签单
  189. if ($s['state'] == '已到店') $customersState[$s['customer_id']]['shop'] += $s['num'];
  190. elseif ($s['state'] == '已量房') $customersState[$s['customer_id']]['measure'] += $s['num'];
  191. elseif ($s['state'] == '已到场') $customersState[$s['customer_id']]['activity'] += $s['num'];
  192. elseif ($s['state'] == '已交定') $customersState[$s['customer_id']]['deposit'] += $s['num'];
  193. elseif ($s['state'] == '已签单') $customersState[$s['customer_id']]['signed'] += $s['num'];
  194. }
  195. $data = [];
  196. foreach ($res as $item) {
  197. $data[] = [
  198. 'id' => $item['customer_id'],
  199. 'state' => Customer::changeState($customers[$item['customer_id']]['state']),
  200. 'revisit_time' => $item['subscribe_date'],
  201. 'name' => $customers[$item['customer_id']]['name'],
  202. 'User' => [
  203. 'headimgurl' => empty($users[$customers[$item['customer_id']]['uid']]) ? '' : $users[$customers[$item['customer_id']]['uid']]
  204. ],
  205. 'sex' => $customers[$item['customer_id']]['sex'],
  206. 'community_name' => $customers[$item['customer_id']]['community_name'],
  207. 'level' => $customers[$item['customer_id']]['level'],
  208. 'sign_num' => isset($logs[$item['customer_id']]['sign_num']) ? $logs[$item['customer_id']]['sign_num'] : 0,
  209. 'deposit_num' => isset($logs[$item['customer_id']]['sign_num']) ? $logs[$item['customer_id']]['sign_num'] : 0,
  210. 'stateNum' => isset($customersState[$item['customer_id']]) ? $customersState[$item['customer_id']] : ['count' => 0, 'shop' => 0, 'measure' => 0, 'activity' => 0, 'deposit' => 0, 'signed' => 0],
  211. 'last_contact_date' => $customers[$item['customer_id']]['last_contact_date'],
  212. 'addtoptime' => $item['orders']
  213. ];
  214. }
  215. return json(['code' => 0, 'data' => $data, 'count' => $count, 'msg' => '获取成功']);
  216. }
  217. /*
  218. * 公司/团队 排行榜
  219. * auth kjl
  220. * date 2022/01/11
  221. * type 从活动客户状态分为:邀约、到场、收定、签单
  222. */
  223. public function ranking_list()
  224. {
  225. $token = request()->token;
  226. $param = $this->request->only(['id' => 0, 'type' => '预约活动', 'is_org' => 0, 'page' => 1, 'limit' => 10]);
  227. // 检测活动是否是该公司的
  228. $is = ActivityModel::where(['root_id' => $token['root_org'], 'id' => $param['id']])->count();
  229. if (!$is) return json(['code' => 0, 'data' => [], 'count' => 0, 'msg' => '获取成功']);
  230. $param['type'] = $param['type'] == '预约' ? '预约活动' : $param['type'];
  231. $stateCondition = CustomerVisitLog::changeState($param['type'], 'chaos');
  232. if ($param['is_org']) {
  233. $orgIdList = orgSubIds($token['org_id']);
  234. } else {
  235. $orgIdList = orgSubIds($token['root_org']);
  236. }
  237. $my = [
  238. 'ranking' => 0,
  239. 'count' => 0
  240. ];
  241. $customerIdFromlog = CustomerVisitLog::where([['aid', '=', $param['id']], ['state', 'in', $stateCondition]])->column('customer_id');
  242. $customerIdFromlog = array_unique($customerIdFromlog);
  243. $res = Customer::field('count(id) as count, employee_id')->where([['employee_id', '>', 0], ['id', 'in', $customerIdFromlog], ['org_id', 'in', $orgIdList]])->order('count desc,employee_id asc')->group('employee_id')->page($param['page'], $param['limit'])->select()->toArray();
  244. $my['count'] = Customer::where([['id', 'in', $customerIdFromlog], ['org_id', 'in', $orgIdList], ['employee_id', '=', $token['employee_id']]])->count();
  245. // 重复手机号客户
  246. $customers = Customer::where('id', 'in', $customerIdFromlog)->select()->toArray();
  247. $phones = [];
  248. $employee_j = []; // 每个员工要减去的手机号重复客户数量
  249. foreach ($customers as $k => $v) {
  250. if (isset($phones[$v['phone']])) {
  251. if ($v['addtime'] > $phones[$v['phone']]['addtime']) {
  252. // 建客晚
  253. if (isset($employee_j[$v['employee_id']])) {
  254. $employee_j[$v['employee_id']]++;
  255. } else {
  256. $employee_j[$v['employee_id']] = 1;
  257. }
  258. } else {
  259. if (isset($employee_j[$phones[$v['phone']]['employee_id']])) {
  260. $employee_j[$phones[$v['phone']]['employee_id']]++;
  261. } else {
  262. $employee_j[$phones[$v['phone']]['employee_id']] = 1;
  263. }
  264. $phones[$v['phone']] = ['employee_id' => $v['employee_id'], 'addtime' => $v['addtime']];
  265. }
  266. } else {
  267. $phones[$v['phone']] = ['employee_id' => $v['employee_id'], 'addtime' => $v['addtime']];
  268. }
  269. }
  270. foreach ($res as $k => $v) {
  271. if (isset($employee_j[$v['employee_id']])) {
  272. $res[$k]['count'] = ($v['count'] - $employee_j[$v['employee_id']]) > 0 ? $v['count'] - $employee_j[$v['employee_id']] : 0;
  273. }
  274. }
  275. array_multisort(array_column($res, 'count'), SORT_DESC, $res);
  276. if (isset($employee_j[$token['employee_id']])) {
  277. $my['count'] = ($my['count'] - $employee_j[$token['employee_id']]) > 0 ? $my['count'] - $employee_j[$token['employee_id']] : 0;
  278. }
  279. if ($my['count'] > 0) {
  280. /*$my['ranking'] = Customer::where([['id', 'in', $customerIdFromlog], ['org_id', 'in', $orgIdList]])
  281. ->group('employee_id')
  282. ->having('count(id)>' . $my['count'] . ' or (count(id)=' . $my['count'] . ' and employee_id<=' . $token['employee_id'] . ')')
  283. ->count();*/
  284. foreach ($res as $k => $v) {
  285. if ($v['employee_id'] == $token['employee_id']) {
  286. $my['ranking'] = $k + 1;
  287. }
  288. }
  289. }
  290. $count = Customer::where([['id', 'in', $customerIdFromlog]])->group('employee_id')->count();
  291. $employee = Employee::with(['user'])->where([['id', 'in', array_column($res, 'employee_id')]])->select();
  292. $employee = $employee->visible(['id', 'name', 'phone', 'state', 'org_id', 'user.headimgurl'])->toArray();
  293. $employee = array_combine(array_column($employee, 'id'), $employee);
  294. foreach ($res as $k => &$v) {
  295. $v['ranking'] = $k + 1;
  296. $v['name'] = $employee[$v['employee_id']]['name'];
  297. $v['phone'] = $employee[$v['employee_id']]['phone'];
  298. $v['state'] = $employee[$v['employee_id']]['state'];
  299. $v['org_id'] = $employee[$v['employee_id']]['org_id'];
  300. $v['headimgurl'] = $employee[$v['employee_id']]['user']['headimgurl'];
  301. }
  302. $result['data'] = $res;
  303. $result['my'] = $my;
  304. return json(['code' => 0, 'data' => $result, 'count' => $count, 'msg' => '获取成功']);
  305. }
  306. /*
  307. * 团队排行榜
  308. * auth kjl
  309. * date 2022/01/11
  310. * id活动id,type邀约,到访,收订,签单,eid,p,pagesize,org_id
  311. */
  312. public function org_ranking_list()
  313. {
  314. $token = request()->token;
  315. $param = $this->request->only(['id', 'type' => '预约活动', 'page' => 1, 'limit' => 10]);
  316. // 检测活动是否是该公司的
  317. $is = ActivityModel::where(['root_id' => $token['root_org'], 'id' => $param['id']])->count();
  318. if (!$is) return json(['code' => 0, 'data' => [], 'count' => 0, 'msg' => '获取成功']);
  319. $param['type'] = $param['type'] == '预约' ? '预约活动' : $param['type'];
  320. $stateCondition = CustomerVisitLog::changeState($param['type'], 'chaos');
  321. $orgIdList = orgSubIds($token['root_org']);
  322. $customerIdFromlog = CustomerVisitLog::where([['aid', '=', $param['id']], ['state', 'in', $stateCondition]])->column('customer_id');
  323. $customerIdFromlog = array_unique($customerIdFromlog);
  324. $res = Customer::field('count(id) as count, org_id')->where([['id', 'in', $customerIdFromlog], ['org_id', 'in', $orgIdList]])->order('count desc,org_id asc')->group('org_id')->page($param['page'], $param['limit'])->select()->toArray();
  325. $my = [
  326. 'count' => 0,
  327. 'ranking' => 0
  328. ];
  329. $my['count'] = Customer::where([['id', 'in', $customerIdFromlog], ['org_id', '=', $token['org_id']]])->count();
  330. if ($my['count'] > 0) {
  331. $my['ranking'] = Customer::where([['id', 'in', $customerIdFromlog], ['org_id', 'in', $orgIdList]])
  332. ->group('org_id')
  333. ->having('count(id)>' . $my['count'] . ' or (count(id)=' . $my['count'] . ' and org_id<=' . $token['org_id'] . ')')
  334. ->count();
  335. }
  336. $count = Customer::where([['id', 'in', $customerIdFromlog]])->group('org_id')->count();
  337. $org = Org::where([['id', 'in', $orgIdList]])->column('name', 'id');
  338. $my['org_name'] = $org[$token['org_id']];
  339. foreach ($res as $k => &$v) {
  340. $v['ranking'] = $k + 1;
  341. $v['org_name'] = $org[$v['org_id']];
  342. }
  343. $result['data'] = $res;
  344. $result['my'] = $my;
  345. return json(['code' => 0, 'data' => $result, 'count' => $count, 'msg' => '获取成功']);
  346. }
  347. /*
  348. * 数据统计
  349. * auth kjl
  350. * date 2022/04/06
  351. */
  352. public function statistics()
  353. {
  354. $token = request()->token;
  355. $id = input('aid', 'a');
  356. // 检测活动是否是该公司的
  357. $is = ActivityModel::where(['root_id' => $token['root_org'], 'id' => $id])->count();
  358. if (!$is) return json(['code' => 0, 'data' => [], 'count' => 0, 'msg' => '获取成功']);
  359. $data['yy'] = $data['dc'] = $data['jd'] = $data['qd'] = [];
  360. //只查询我的客户,过滤曾经邀约过当前无效的客户
  361. $param['aid'] = $id;
  362. $all_customer_id = CustomersSubscribe::where([['aid', '=', $param['aid']], ['employee_id|designer_id', '=', $token['employee_id']]])->column('customer_id');
  363. $customer_id = Customer::where([['employee_id|designer_id', '=', $token['employee_id']], ['id', 'in', $all_customer_id]])->column('id');
  364. $customerIds = CustomersSubscribe::where([['aid', '=', $id], ['employee_id|designer_id', '=', $token['employee_id']], ['type', '=', 2], ['customer_id', 'in', $customer_id]])->group('customer_id')->column('customer_id');
  365. $dc = CustomersSubscribe::where([['aid', '=', $id], ['employee_id|designer_id', '=', $token['employee_id']], ['state', '=', 1], ['type', '=', 2], ['customer_id', 'in', $customer_id]])->field('customer_id')->group('customer_id')->count();
  366. $depositStates = CustomerVisitLog::changeState('已交定', 'chaos');
  367. $signStates = CustomerVisitLog::changeState('已签单', 'chaos');
  368. $jd = CustomerVisitLog::where([['customer_id', 'in', $customerIds], ['state', 'in', $depositStates]])->field('customer_id')->group('customer_id')->count();
  369. $qd = CustomerVisitLog::where([['customer_id', 'in', $customerIds], ['state', 'in', $signStates]])->field('customer_id')->group('customer_id')->count();
  370. $data['yy'] = count($customerIds);
  371. $data['dc'] = $dc;
  372. $data['jd'] = $jd;
  373. $data['qd'] = $qd;
  374. return json(['code' => 0, 'data' => $data, 'msg' => '获取成功']);
  375. }
  376. /*
  377. * 活动报名二维码列表
  378. * auth kjl
  379. * date 2022/10/03
  380. */
  381. public function getQrcodeList()
  382. {
  383. $token = request()->token;
  384. $param = Request()->only(['page' => 1, 'limit' => 10, 'date' => '', 'org_id' => 0, 'keyword' => '', 'aid' => 0, 'type' => '']);
  385. $where[] = ['root_id', '=', $token['root_org']];
  386. //查询扫码人员
  387. $w[] = ['show', '=', 1];
  388. $w[] = ['del', '=', 0];
  389. //$w[] = ['qrcode_employee_id', '=', $token['employee_id']];
  390. $w[] = ['qrcode_employee_id', 'find in set', $token['employee_id']];
  391. $aids = ActivityModel::where($w)->column('id');
  392. if (empty($aids)) return json(['code' => 0, 'data' => [], 'count' => 0, 'msg' => '获取成功']);
  393. $where[] = ['aid', 'in', $aids];
  394. if ($param['type'] !== '') $where[] = $query_org[] = ['qrcode_status', '=', $param['type']];
  395. if ($param['date']) {
  396. $date = explode(' - ', $param['date']);
  397. $where[] = $query_org[] = ['qrcode_time', 'between', [$date[0] . ' 00:00:00', $date[1] . ' 23:59:59']];
  398. }
  399. if ($param['aid']) $where[] = ['aid', '=', $param['aid']];
  400. if ($param['org_id']) {
  401. $uids = Employee::where('org_id', $param['org_id'])->group('uid')->column('uid');
  402. $where[] = $query_org[] = ['share_uid', 'in', $uids];
  403. }
  404. if ($param['keyword']) {
  405. $query[] = ['phone|nickname', 'like', '%' . $param['keyword'] . '%'];
  406. $query[] = ['root_id', '=', $token['root_org']];
  407. $uids = User::where($query)->column('id');
  408. $where[] = ['uid', 'in', $uids];
  409. }
  410. $list = ActivitySign::with(['user' => function ($query) {
  411. $query->field('id,nickname,phone,headimgurl')->bind(['nickname', 'phone', 'headimgurl']);
  412. }, 'activity' => function ($query) {
  413. $query->field('title,id,cate')->bind(['title', 'cate']);
  414. }, 'employee' => function ($query) {
  415. $query->field('id,name,org_id')->bind(['name', 'org_id']);
  416. }])->where($where)->field('uid,qrcode,qrcode_time,aid,addtime,share_employee_id,qrcode_status')->page($param['page'], $param['limit'])->select()->toArray();
  417. $org_name = Org::where([['id', 'in', array_column($list, 'org_id')]])->column('name', 'id');
  418. $name = Customer::where([['org_id', 'in', array_keys($org_name)], ['uid', 'in', array_column($list, 'uid')]])->column('name', 'uid');
  419. foreach ($list as $k => $v) {
  420. $list[$k]['org_name'] = isset($org_name[$v['org_id']]) ? $org_name[$v['org_id']] : '';
  421. $list[$k]['nickname'] = isset($name[$v['uid']]) ? $name[$v['uid']] : $v['nickname'];
  422. }
  423. $count = ActivitySign::where($where)->count();
  424. ////统计
  425. $query = [['root_id', '=', $token['root_org']], ['aid', 'in', $aids]];
  426. if ($param['aid']) $query[] = ['aid', '=', $param['aid']];
  427. if (isset($query_org)) $query = array_merge($query, $query_org);
  428. $top_data['count'] = ActivitySign::where($query)->count();
  429. $query1[] = ['qrcode_status', '=', 1];
  430. $top_data['scone_count'] = ActivitySign::where(array_merge($query, $query1))->count();
  431. $query2[] = ['qrcode_status', '=', 0];
  432. $top_data['no_scone_count'] = ActivitySign::where(array_merge($query, $query2))->count();
  433. return json(['code' => 0, 'data' => $list, 'count' => $count, 'top_data' => $top_data, 'msg' => '获取成功']);
  434. }
  435. /*
  436. * 获取有数据的部门列表
  437. * auth kjl
  438. * date 2022/10/03
  439. * 所有的部门属性结构
  440. */
  441. public function getOrgList()
  442. {
  443. $param = $this->request->only(['keyword' => '']);
  444. $token = request()->token;
  445. $where[] = ['path', 'like', $token['root_org'] . '-%'];
  446. if ($param['keyword']) {
  447. $where[] = ['name', 'like', '%' . $param['keyword'] . '%'];
  448. }
  449. $orgs = Org::where($where)->column('id,pid,name');
  450. if ($param['keyword']) {
  451. return json(['code' => 0, 'data' => $orgs, 'msg' => '获取成功']);
  452. }
  453. $orgs = tree($orgs, 0, []);
  454. return json(['code' => 0, 'data' => $orgs, 'msg' => '获取成功']);
  455. }
  456. /*
  457. * crm客户跟进页面预约活动列表
  458. */
  459. public function activitySignList()
  460. {
  461. $param = $this->request->only(['page' => 1, 'limit' => 10]);
  462. $token = request()->token;
  463. //$aids = ActivityModel::where('qrcode_employee_id', $token['employee_id'])->column('id');
  464. $aids = ActivityModel::where([['qrcode_employee_id', 'like', '%' . $token['employee_id'] . ',%']])->column('id');
  465. $w[] = ['id', 'in', $aids];
  466. $w[] = ['root_id', '=', $token['root_org']];
  467. $w[] = ['show', '=', 1];
  468. $w[] = ['del', '=', 0];
  469. $res = ActivityModel::where($w)->field('id,title')->select()->toArray();
  470. array_unshift($res, ['id' => 0, 'title' => '请选择活动']);
  471. return json(['code' => 0, 'data' => $res, 'msg' => '获取成功']);
  472. }
  473. /*
  474. * 扫码确认
  475. */
  476. public function scanQrcode()
  477. {
  478. $param = $this->request->only(['aid' => 0, 'uid' => 0, 'cid' => 0, 'number_of_visitors' => 0]);
  479. $token = request()->token;
  480. //是否是自己的客户
  481. $is_cid = Customer::where([['id', '=', $param['cid']], ['employee_id', '=', $token['employee_id']]])->findOrEmpty();
  482. // 内场检测客户跟进设置中到店确认方式中是否有扫码确认
  483. $activity = ActivityModel::where('id', $param['aid'])->findOrEmpty();
  484. if ($activity->isEmpty()) return json(['code' => 1, 'data' => '活动不存在', 'msg' => '活动不存在']);
  485. $cate = $activity->cate;
  486. if (in_array($cate,[0,1])) {
  487. if($cate==0) $name = 'visitShopConfirm';
  488. if($cate==1) $name = 'visitSiteConfirm';
  489. $content = Setting::where(['root_id' => $token['root_org'], 'name' => $name, 'state' => 1])->value('content');
  490. if ($content == null) {
  491. $content = [];
  492. } else {
  493. $content = json_decode($content, true);
  494. }
  495. if (!empty($content) && !in_array('scan_the_code', $content)) {
  496. return json(['code' => 1, 'data' => '无权扫码确认', 'msg' => '无权扫码确认']);
  497. }
  498. }
  499. //2023-03-14 修改为只判断是否是该活动的扫码人员,
  500. // if ($is_cid->isEmpty()) {
  501. //不是自己的客户增加判断是否可以确认扫码本次活动
  502. $query[] = ['qrcode_employee_id', 'find in set', $token['employee_id']];
  503. $query[] = ['root_id', '=', $token['root_org']];
  504. $query[] = ['id', '=', $param['aid']];
  505. $actdata = ActivityModel::where($query)->count();
  506. if (empty($actdata)) return json(['code' => 1, 'data' => '无权扫码确认', 'msg' => '无权扫码确认']);
  507. // }
  508. $where[] = ['aid', '=', $param['aid']];
  509. $where[] = ['uid', '=', $param['uid']];
  510. $where[] = ['root_id', '=', $token['root_org']];
  511. $find = ActivitySign::where($where)->findOrEmpty();
  512. if ($find->isEmpty()) return json(['code' => 1, 'data' => '暂未报名活动', 'msg' => '暂未报名活动']);
  513. if ($find->qrcode_status == 1) return json(['code' => 1, 'data' => '活动已确认到场', 'msg' => '活动已确认到场']);
  514. ActivitySign::where($where)->update(['qrcode_status' => 1]);
  515. // 客户跟进保护规则
  516. $orgs = orgSubIds($token['root_org']);
  517. $customer = Customer::where('id', '=', $param['cid'])->findOrEmpty();
  518. $phones = [$customer['phone']];
  519. if ($customer['phone1']) {
  520. $phones[] = $customer['phone1'];
  521. }
  522. if ($customer['phone2']) {
  523. $phones[] = $customer['phone2'];
  524. }
  525. $c_where[] = ['phone|phone1|phone2', 'in', $phones];
  526. $c_where[] = ['org_id', 'in', $orgs];
  527. $c_where[] = ['employee_id', 'not in', ['null', $token['employee_id']]];
  528. $have_customer = Customer::where($c_where)->select()->toArray();
  529. $customer_ids = array_column($have_customer, 'id');
  530. if (!empty($customer_ids)) {
  531. $lf_state = CustomerVisitLog::changeState('已量房', 'chaos');
  532. $dc_state = CustomerVisitLog::changeState('已到场', 'chaos');
  533. $dd_state = CustomerVisitLog::changeState('已到店', 'chaos');
  534. $sub_setting = Setting::where([['root_id', '=', $token['root_org']], ['name', '=', 'subscribe_protected']])->findOrEmpty();
  535. if (!$sub_setting->isEmpty()) {
  536. $setting_content = json_decode($sub_setting['content'], true);
  537. foreach ($setting_content as $k_s => $v_s) {
  538. if (!empty($v_s['state']) && !empty($v_s['day']) && $v_s['state'] == 1) {
  539. $continue = false;
  540. $errmsg = '该客户在保护期内,无法提交';
  541. $check_where = [];
  542. $check_where[] = ['customer_id', 'in', $customer_ids];
  543. $check_where[] = ['addtime', '>', date('Y-m-d H:i:s', time() - 24 * 3600 * $v_s['day'])];
  544. $check_where[] = ['employee_id', 'in', array_column($have_customer, 'employee_id')];
  545. switch ($k_s) {
  546. case 'liangfang':
  547. $check_where[] = ['state', 'in', $lf_state];
  548. break;
  549. case 'daodian':
  550. $check_where[] = ['state', 'in', $dd_state];
  551. break;
  552. case 'daochang':
  553. $check_where[] = ['state', 'in', $dc_state];
  554. break;
  555. default:
  556. $continue = true;
  557. break;
  558. }
  559. if ($continue) continue;
  560. $log_list = CustomerVisitLog::where($check_where)->select()->toArray();
  561. if (!empty($log_list)) {
  562. return json(['code' => 1, 'msg' => $errmsg]);
  563. }
  564. }
  565. }
  566. }
  567. }
  568. //生成跟进记录 ,, 业务员可以确认不是自己的客户
  569. //活动内场是到店,外场是到场
  570. // $cate = ActivityModel::where('id', $param['aid'])->value('cate');
  571. $type = $cate == 0 ? '到店' : '到场';
  572. $state = $cate == 0 ? 7 : 9;
  573. $c_state = $cate == 0 ? 2 : 3;
  574. $str = $cate == 0 ? $param['number_of_visitors'] . '人' : ''; //内场活动才有到店人数
  575. $name = Employee::where('id', $token['employee_id'])->value('name');
  576. if ($is_cid->isEmpty()) {
  577. $is_cid = Customer::where('id', '=', $param['cid'])->findOrEmpty();
  578. if ($is_cid->isEmpty()) {
  579. $c_name = '';
  580. } else {
  581. $c_name = $is_cid['name'];
  582. }
  583. } else {
  584. $c_name = $is_cid->name;
  585. }
  586. $time = date('Y-m-d H:i:s');
  587. $save = [
  588. 'customer_id' => $param['cid'],
  589. 'aid' => $activity->id,
  590. 'type' => '',
  591. 'next_contact_date' => date('Y-m-d'),
  592. 'remark' => '业务员“' . $name . '”通过《'.$activity->title.'》活动扫码确认客户“' . $c_name . '”' . $type . $str . ',时间:' . $time,
  593. 'addtime' => $time,
  594. 'employee_id' => $token['employee_id'],
  595. 'user_id' => $token['uid'],
  596. 'state' => $state,
  597. 'org_id' => $token['org_id'],
  598. 'customer_employee_id' => $is_cid->employee_id,
  599. 'customer_org_id' => $is_cid->org_id,
  600. 'number_of_visitors' => $param['number_of_visitors']
  601. ];
  602. CustomerVisitLog::insertGetId($save);
  603. // 微爆活动
  604. $activity_data['customer_id'] = $is_cid['id'];
  605. $activity_data['employee_id'] = $is_cid['employee_id'];
  606. $activity_data['org_id'] = $is_cid['org_id'];
  607. $activity_data['type'] = 0;
  608. if($state == 7) $activity_data['type'] = 2;
  609. if($state == 9) $activity_data['type'] = 7;
  610. WechatActivityIntegral::addIntegral($activity_data, $token['root_org']);
  611. //修改客户状态
  612. $is_cid->fresh = 0;
  613. $is_cid->state = $c_state;
  614. $is_cid->last_contact_date = date('Y-m-d');
  615. $is_cid->updatetime = date('Y-m-d H:i:s');
  616. $is_cid->save();
  617. //修改预约记录的确认到场记录为确认
  618. $condition = [['aid', '=', $activity->id], ['type', '=', 2]];
  619. $condition[] = ['customer_id', '=', $is_cid->id];
  620. CustomersSubscribe::where($condition)->update(['state'=>1]);
  621. if ($state == 7) {
  622. // 发送管理层模板消息
  623. $msg = ['first'=>'行为通知', 'keyword1'=>'客户确认到店', 'keyword2'=>"客户".$c_name."(".$is_cid['phone'].")确认到店", 'keyword3'=>date('Y/m/d'), 'remark'=>'请悉知'];
  624. TmpMsg::sendMsgToLeader($msg, $token['org_id']);
  625. }
  626. if ($state == 9) {
  627. // 发送管理层模板消息
  628. $msg = ['first'=>'行为通知', 'keyword1'=>'客户签单', 'keyword2'=>"客户".$c_name."(".$is_cid['phone'].")签单", 'keyword3'=>date('Y/m/d'), 'remark'=>'请悉知'];
  629. TmpMsg::sendMsgToLeader($msg, $token['org_id']);
  630. }
  631. return json(['code' => 0, 'data' => '确认成功', 'msg' => '确认成功']);
  632. }
  633. //判断是否显示活动扫码
  634. public function is_show_qrcode()
  635. {
  636. $token = request()->token;
  637. //有已经报名的自己的客户 或者 活动中设置了扫码人员
  638. $w[] = ['root_id', '=', $token['root_org']];
  639. $w[] = ['show', '=', 1];
  640. $w[] = ['del', '=', 0];
  641. $w[] = ['qrcode_employee_id', 'find in set', $token['employee_id']];
  642. $aids = ActivityModel::where($w)->count();
  643. // if (!$aids) {
  644. // $uids = Customer::where([['employee_id|designer_id','=',$token['employee_id']]])->column('uid');
  645. // $query[] = ['uid','in',$uids];
  646. // $query[] = ['qrcode_status','=',0];
  647. // $aids = ActivitySign::where($query)->count();
  648. // }
  649. $status = $aids ? 0 : 1;
  650. return json(['code' => 0, 'data' => $status, 'msg' => '获取成功']);
  651. }
  652. }