1
0

Activity.php 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673
  1. <?php
  2. namespace app\client\controller;
  3. use app\event\FootPrints;
  4. use app\model\Activity as ActivityModel;
  5. use app\model\ActivityOrder;
  6. use app\model\Footprints as FootprintsModel;
  7. use app\model\Employee;
  8. use app\model\Customer;
  9. use app\model\CustomerClue;
  10. use app\model\Org;
  11. use app\model\Setting;
  12. use app\model\User;
  13. use app\model\CustomerVisitLog;
  14. use app\event\Msg;
  15. use app\model\CustomersSubscribe;
  16. use toolkits\Aec;
  17. use app\model\EmployeeMsg;
  18. use app\model\ActivitySign;
  19. class Activity extends Base
  20. {
  21. /*
  22. * 活动列表
  23. * type : 报名->1,收定->2
  24. */
  25. public function list()
  26. {
  27. $param = $this->request->only(['page', 'type']);
  28. $data = ActivityModel::withAttr('timestate')->where(['type' => $param['type'], 'del' => 0, 'show' => 1, 'root_id' => request()->token['root_org']])
  29. ->field('id,cover,title,start_date,end_date,end_date as timestate')
  30. ->order(['id' => 'desc'])
  31. ->page($param['page'], 6)
  32. ->select();
  33. return json(['code' => 0, 'data' => $data, 'msg' => '获取成功']);
  34. }
  35. public function details($id)
  36. {
  37. $token = request()->token;
  38. $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,address,poster,cate,show')->find();
  39. // 添加足迹
  40. if (!empty($token['uid']) && !$token['isEmployee']) {
  41. event(new FootPrints($token['uid'], $token['share_employee'] ?? 0, $token['share_org'] ?? 0, $data));
  42. }
  43. // 判断是否交定
  44. $hadPay = ActivityOrder::where(['user_id' => $token['uid'], 'activity_id' => $data['id'], 'state' => 1])->count();
  45. if ($hadPay) $data['had_pay'] = 1;
  46. else $data['had_pay'] = 0;
  47. //是否报名
  48. $data['is_activity'] = 0;
  49. // $aw[] = ['uid','=',$token['uid']];
  50. // $org = Org::where([['path', 'like', $token['root_org'] . '-%']])->column('id');
  51. // $aw[] = ['org_id','in',$org];
  52. // $is = Customer::where($aw)->value('id');
  53. $cw[] = ['type', 'in', ['activity_sign_up', 'activitySignUp']];
  54. $is = EmployeeMsg::where($cw)->whereRaw('data->"$.aid"=' . $id . ' and data->"$.uid"=' . $token['uid'])->order('id desc')->find();
  55. if ($is) {
  56. $data['is_activity'] = 1;
  57. }
  58. $qrcode = ActivitySign::where([['aid', '=', $id], ['uid', '=', $token['uid']]])->value('qrcode');
  59. $ali_oss_bindurl = config('app.ali_oss_bindurl');
  60. $url = 'https://' . $ali_oss_bindurl . '/';
  61. $data['qrcode'] = $qrcode ? $url . $qrcode : '';
  62. ActivityModel::where('id', $id)->inc('view')->update();
  63. return json(['code' => 0, 'data' => $data, 'msg' => '获取成功']);
  64. }
  65. /*
  66. * 活动报名客户列表
  67. * auth kjl
  68. * date 2022/01/10
  69. * type已交定,已到访,未到访已签单
  70. * 查询自己跟踪的所有客户
  71. */
  72. public function activity_users()
  73. {
  74. $param = $this->request->only(['id', 'type', 'p', 'pagesize']);
  75. $token = request()->token;
  76. $param['type'] = $param['type'] ?: '全部';
  77. // $where[] = ['reg_info','like','%aid'.'":'.$param['id'].',%'];
  78. $where[] = ['pipe_type', 'in', ['activity_sign_up', 'activitySignUp']];
  79. $where[] = ['employee_id', '=', $token['employee_id']]; //自己邀请的人员
  80. $field = 'customer.id,customer.uid,customer.state,customer.verify,customer.verify_employee_id,customer.verify_addtime,employee.root_id';
  81. if ($param['type'] && $param['type'] != '全部') {
  82. $c_where[] = ['customer.state', 'like', '%' . $param['type'] . '%'];
  83. $c_where[] = ['employee.root_id', '=', $token['root_org']];
  84. $c_where[] = ['customer.uid', '>', 0];
  85. $uids = Customer::where($c_where)->withJoin(['employee' => []], 'inner')
  86. ->field($field)->select()->toArray();
  87. if (!$uids) return json(['code' => 0, 'data' => [], 'msg' => '获取成功']);
  88. $where[] = ['uid', 'in', array_column($uids, 'uid')];
  89. }
  90. $footprints = FootprintsModel::with(['customer', 'employee', 'user'])->where($where)->where(function ($query) use ($param) {
  91. $query->where("reg_info->'$.aid'=" . $param['id']);
  92. })->field('id,uid,employee_id,reg_info reg_infos,addtime')->order('id', 'desc')->page($param['p'], $param['pagesize'])->select()->toArray();
  93. $verify = [0 => '未核实', 1 => '核实有效', 2 => '核实无效'];
  94. $employees = Employee::where([['root_id', '=', $token['root_org']]])->column('name', 'id');
  95. foreach ($footprints as $k => $v) {
  96. $json = json_decode($v['reg_infos'], true);
  97. unset($footprints[$k]['reg_infos']);
  98. $footprints[$k]['name'] = $json['name'];
  99. $footprints[$k]['phone'] = $json['phone'];
  100. $footprints[$k]['addtime'] = date('Y-m-d', strtotime($v['addtime']));
  101. $footprints[$k]['state'] = $v['customer'] ? $v['customer']['state'] : '';
  102. $footprints[$k]['verify'] = $v['customer'] ? $v['customer']['verify'] : 0;
  103. $footprints[$k]['verify_name'] = $v['customer'] ? $verify[$v['customer']['verify']] : '未核实';
  104. $footprints[$k]['verify_employee_id'] = $eid = $v['customer'] ? $v['customer']['verify_employee_id'] : 0;
  105. $footprints[$k]['verify_employee_name'] = !$eid ? '' : $employees[$eid];
  106. unset($footprints[$k]['customer']);
  107. }
  108. return json(['code' => 0, 'data' => $footprints, 'msg' => '获取成功']);
  109. }
  110. /*
  111. * 确认到访客户列表
  112. * auth kjl
  113. * date 2022/01/10
  114. * is_manager是否是管理者,org_id组织结构id
  115. * 管理者查询本部门所有人员的客户列表
  116. * 非管理者查询自己的客户列表
  117. */
  118. public function confirm()
  119. {
  120. $param = $this->request->only(['id', 'p', 'pagesize']);
  121. $token = request()->token;
  122. // $token['employee_id'] = 1;
  123. // $token['root_org'] = 1;
  124. // $token['is_manager'] = 1;
  125. if ($token['is_manager']) {
  126. $u_where[] = ['org_id', '=', $token['root_org']];
  127. } else {
  128. $u_where[] = ['id', '=', $token['employee_id']];
  129. }
  130. $eids = Employee::where($u_where)->field('id,name')->select()->toArray();
  131. $where[] = ['employee_id', 'in', array_column($eids, 'id')];
  132. $where[] = ['pipe_type', 'in', ['activity_sign_up', 'activitySignUp']];
  133. // $where[] = ['reg_info','like','%aid'.'":"'.$param['id'].'"%'];
  134. $p = (int)$param['p'] ?: 1;
  135. $pagesize = (int)$param['pagesize'] ?: 10;
  136. $footprints = FootprintsModel::with(['customer', 'employee', 'user'])->where($where)->where(function ($query) use ($param) {
  137. $query->where("reg_info->'$.aid'=" . $param['id']);
  138. })->field('id,uid,employee_id,reg_info reg_infos,addtime')->order('id', 'desc')->page($p, $pagesize)->select()->toArray();
  139. $verify = [0 => '未核实', 1 => '核实有效', 2 => '核实无效'];
  140. $employees = Employee::where([['root_id', '=', $token['root_org']]])->column('name', 'id');
  141. foreach ($footprints as $k => $v) {
  142. $json = json_decode($v['reg_infos'], true);
  143. unset($footprints[$k]['reg_infos']);
  144. $footprints[$k]['name'] = $json['name'];
  145. $footprints[$k]['phone'] = $json['phone'];
  146. $footprints[$k]['addtime'] = date('Y-m-d', strtotime($v['addtime']));
  147. $footprints[$k]['state'] = $v['customer'] ? $v['customer']['state'] : '';
  148. $footprints[$k]['verify'] = $v['customer'] ? $v['customer']['verify'] : 0;
  149. $footprints[$k]['verify_name'] = $v['customer'] ? $verify[$v['customer']['verify']] : '未核实';
  150. $footprints[$k]['verify_employee_id'] = $eid = $v['customer'] ? $v['customer']['verify_employee_id'] : 0;
  151. $footprints[$k]['verify_employee_name'] = !$eid ? '' : $employees[$eid];
  152. unset($footprints[$k]['customer']);
  153. }
  154. return json(['code' => 0, 'data' => $footprints, 'msg' => '获取成功']);
  155. }
  156. /*
  157. * 核实是否到访
  158. * auth kjl
  159. * date 2022/01/11
  160. */
  161. public function verify()
  162. {
  163. $param = $this->request->only(['uid', 'verify']);
  164. $token = request()->token;
  165. Customer::update(['verify' => $param['verify'], 'verify_employee_id' => $token['employee_id']], ['uid' => $param['uid']]);
  166. return json(['code' => 0, 'msg' => '操作成功']);
  167. }
  168. /*
  169. * 活动排行榜
  170. * auth kjl
  171. * date 2022/01/11
  172. * type 邀约,到访,收订,签单
  173. */
  174. public function ranking_list()
  175. {
  176. $param = $this->request->only(['id', 'type', 'is_org', 'p', 'pagesize']);
  177. $token = request()->token;
  178. // $token['employee_id'] = 1;
  179. // $token['root_org'] = 1;
  180. if ($param['type'] && $param['type'] != '邀约') {
  181. $cc_where[] = ['state', 'like', '%' . $param['type'] . '%'];
  182. $uids = Customer::where($cc_where)->column('uid');
  183. $where[] = ['uid', 'in', $uids];
  184. }
  185. //团队排行
  186. if (isset($param['is_org']) && $param['is_org']) {
  187. $ee_where[] = ['org_id', '=', $token['root_org']];
  188. $eids = Employee::where($ee_where)->column('id');
  189. $where[] = ['employee_id', 'in', $eids];
  190. }
  191. //排行榜
  192. $where[] = ['pipe_type', 'in', ['activity_sign_up', 'activitySignUp']];
  193. $res = FootprintsModel::with(['employee'])->where($where)->where(function ($query) use ($param) {
  194. $query->where("reg_info->'$.aid'=" . $param['id']);
  195. })->field("employee_id,count('id') as count")->group('employee_id')->order("count desc")->select()->toArray();
  196. foreach ($res as $k => $v) {
  197. $res[$k]['ranking'] = $k + 1;
  198. $res[$k]['headimgurl'] = $v['img'];
  199. }
  200. $result['my_ranking'] = ['count' => 0, 'employee_name' => '', 'headimgurl' => '', 'ranking' => '无排名', 'employee_id' => $token['employee_id']];
  201. foreach ($res as $k => $v) {
  202. if ($v['employee_id'] == $token['employee_id']) {
  203. $result['my_ranking']['count'] = $v['count'];
  204. $result['my_ranking']['ranking'] = $v['ranking'];
  205. $result['my_ranking']['headimgurl'] = $v['headimgurl'];
  206. $result['my_ranking']['employee_name'] = $v['employee_name'];
  207. break;
  208. }
  209. }
  210. $res = $res ? array_slice($res, ($param['p'] - 1) * $param['pagesize'], $param['pagesize']) : [];
  211. // if ($res) {
  212. // $c_where[] = ['id','in',array_column($res,'employee_id')];
  213. // $user = Employee::with('user')->where($c_where)->select()->toArray();
  214. // $users = array_column($user,'user','id');
  215. // $names = array_column($user,'name','id');
  216. // foreach ($res as $k => $v) {
  217. // $res[$k]['headimgurl'] = isset($users[$v['employee_id']]) ? $users[$v['employee_id']]['headimgurl'] : '';
  218. // $res[$k]['employee_name'] = isset($names[$v['employee_id']]) ? $names[$v['employee_id']] : '';
  219. // }
  220. // }
  221. $result['ranking'] = $res;
  222. // $result['my_ranking']['headimgurl'] = isset($users[$param['eid']]) ? $users[$param['eid']]['headimgurl'] : '';
  223. // $result['my_ranking']['employee_name'] = isset($names[$param['eid']]) ? $names[$param['eid']] : '';
  224. return json(['code' => 0, 'data' => $result, 'msg' => '获取成功']);
  225. }
  226. /*
  227. * 团队邀约排行榜
  228. * auth kjl
  229. * date 2022/01/11
  230. * id活动id,type邀约,到访,收订,签单,eid,p,pagesize,org_id
  231. */
  232. public function team_ranking_list()
  233. {
  234. $param = $this->request->only(['id', 'type', 'p', 'pagesize']);
  235. $token = request()->token;
  236. $token['root_org'] = 1;
  237. if ($param['type'] && $param['type'] != '邀约') {
  238. $cc_where[] = ['state', 'like', '%' . $param['type'] . '%'];
  239. $uids = Customer::where($cc_where)->column('uid');
  240. $where[] = ['footprints.uid', 'in', $uids];
  241. }
  242. $org_info = Org::find($token['root_org'])->toArray();
  243. $leave = explode('-', $org_info['path'])[0];
  244. // $where[] = ['f.reg_info','like','%aid'.'":"'.$param['id'].'"%'];//活动id
  245. $where[] = ['org.path', 'like', $leave . '-%']; //全公司
  246. $field = 'org.id org_id,org.name,footprints.id,count(footprints.id) count';
  247. $row = Employee::withJoin(['org' => [], 'footprints' => []], 'inner')
  248. // ->where($where)
  249. // ->where(function ($query) use ($param) {
  250. // $query->where("footprints.reg_info->'$.aid'=".$param['id']);
  251. // })
  252. ->field('count(footprints.id) count')
  253. // ->group('employee.org_id')
  254. // ->order('count desc')
  255. ->fetchsql()
  256. ->select();
  257. // $row = Db::table('ays_employee e')
  258. // ->join('ays_org o','o.id=e.org_id')
  259. // ->join('ays_footprints f','f.employee_id=e.id')
  260. // ->where($where)
  261. // ->field($field)
  262. // ->group('e.org_id')
  263. // ->order('count desc')
  264. // ->select()->toArray();
  265. $res['my_team'] = ['ranking' => '无排名', 'org_id' => $param['org_id'], 'name' => '', 'count' => 0];
  266. foreach ($row as $k => $v) {
  267. $row[$k]['ranking'] = $k + 1;
  268. if ($v['org_id'] == $token['root_org']) {
  269. $res['my_team']['ranking'] = $row[$k]['ranking'];
  270. $res['my_team']['name'] = $v['name'];
  271. $res['my_team']['count'] = $v['count'];
  272. }
  273. }
  274. $res['team'] = $row;
  275. return json(['code' => 0, 'data' => $res, 'msg' => '获取成功']);
  276. }
  277. /*
  278. * 小程序活动列表页面
  279. */
  280. public function activity_list()
  281. {
  282. $page = input('page', 1);
  283. $limit = input('limit', 10);
  284. $token = request()->token;
  285. // $token['root_org'] = 23;
  286. $w[] = ['root_id', '=', $token['root_org']];
  287. $w[] = ['del', '=', 0];
  288. $w[] = ['show', '=', 1];
  289. $data = ActivityModel::where($w)
  290. ->field('id,cover,title,start_date,end_date,cate')
  291. ->order(['end_date' => 'desc'])
  292. ->page($page, $limit)
  293. ->select()->toArray();
  294. $count = ActivityModel::where($w)->count();
  295. return json(['code' => 0, 'data' => $data, 'count' => $count, 'msg' => '获取成功']);
  296. }
  297. /*
  298. * 活动报名
  299. * date 2022-03-31
  300. * // $token['uid'] = 1;
  301. // $token['root_org'] = 1;
  302. // $token['isEmployee'] = 0;
  303. 如果客户已经是别人的客户,仍然可以报名,需要给分享人发送消息提醒
  304. */
  305. public function activity_sign()
  306. {
  307. $token = request()->token;
  308. if($token['isEmployee']) return json(['code' => 1, 'msg' => '业务员无法参加活动', 'data' => '业务员无法参加活动']);
  309. $param = $this->request->only(['phone', 'aid', 'uid']);
  310. //查询是否已经报名
  311. $sign_where[] = ['aid', '=', $param['aid']];
  312. $sign_where[] = ['uid', '=', $token['uid']];
  313. $sign = ActivitySign::where($sign_where)->findOrEmpty();
  314. if (!$sign->isEmpty()) return json(['code' => 1, 'msg' => '已报名该活动', 'data' => '已报名该活动']);
  315. $aec = new Aec(config('app.aec_key'), config('app.aec_iv'));
  316. $phone = $aec->encrypt($param['phone']);
  317. //活动已经结束无法报名
  318. $info = ActivityModel::where('id', $param['aid'])->find();
  319. if ($info['del'] == 1 || $info['show'] == 0 || date('Y-m-d') > $info['end_date']) {
  320. return json(['code' => 1, 'msg' => '活动结束或已下架,无法报名']);
  321. }
  322. $emp = Employee::where([['root_id', '=', $token['root_org']], ['uid', '=', $param['uid']], ['state', '=', '在职']])->find();
  323. $share_employee_id = $emp->id;
  324. // 设计师能否报备、获取客户
  325. $de_where[] = ['root_id', '=', $token['root_org']];
  326. $de_where[] = ['name', '=', 'designer_get_customer'];
  327. $info_de_where = Setting::where($de_where)->findOrEmpty();
  328. $org_type = Org::where('id', '=', $emp['org_id'])->value('org_type');
  329. if (!$info_de_where->isEmpty() && $org_type == 2) {
  330. if ((int)$info_de_where['content'] != 1) {
  331. return json(['code' => 1, 'msg' => '请联系业务员进行报名']);
  332. }
  333. }
  334. //查询是否已经建档
  335. $orgs = Org::where([['path', 'like', $token['root_org'] . '-%']])->column('id');
  336. $aw[] = ['phone|phone1|phone2', '=', $phone];
  337. $aw[] = ['org_id', 'in', $orgs];
  338. $aw[] = ['is_resource','=',0];
  339. $customer_list = Customer::where($aw)->select()->toArray();
  340. $aw[] = ['employee_id','=',$share_employee_id];
  341. $customer = Customer::where($aw)->findOrEmpty();
  342. $have_customer = [];
  343. foreach($customer_list as $k => $v) {
  344. if ($v['employee_id'] > 0 && $v['employee_id'] != $share_employee_id) {
  345. $have_customer[] = $v;
  346. }
  347. }
  348. $root_id = request()->token['root_org'];
  349. $empcrm_repeat[] = ['root_id', '=', $root_id];
  350. $empcrm_repeat[] = ['name', '=', 'empcrm_customer_repeat'];
  351. $repeat_setting = Setting::where($empcrm_repeat)->findOrEmpty();
  352. //判断同部门
  353. if (!$repeat_setting->isEmpty()) {
  354. $repeat_org = explode(',', $repeat_setting['content']);
  355. if (in_array($emp['org_id'], $repeat_org)) {
  356. // 需要验证
  357. if (!empty($have_customer)) {
  358. foreach ($have_customer as $ex) {
  359. if (in_array($ex['org_id'], $repeat_org)) {
  360. $have_emp = Employee::where('id', '=', $ex['employee_id'])->value('name');
  361. return json(['code' => 1, 'msg' => '您已是' . $have_emp . '的客户,请联系他预约']);
  362. }
  363. }
  364. }
  365. }
  366. }
  367. // 客户跟进保护规则
  368. /* $c_where[] = ['phone|phone1|phone2', '=', $phone];
  369. $c_where[] = ['org_id', 'in', $orgs];
  370. $c_where[] = ['is_resource','=',0];
  371. $c_where[] = ['employee_id', 'not null', null];
  372. $c_where[] = ['employee_id', '<>', $share_employee_id];
  373. $have_customer = Customer::where($c_where)->select()->toArray(); */
  374. $customer_ids = array_column($have_customer, 'id');
  375. if (!empty($customer_ids)) {
  376. $yylf_state = CustomerVisitLog::changeState('预约量房', 'chaos');
  377. $lf_state = CustomerVisitLog::changeState('已量房', 'chaos');
  378. $yydc_state = CustomerVisitLog::changeState('预约活动', 'chaos');
  379. $dc_state = CustomerVisitLog::changeState('已到场', 'chaos');
  380. $yydd_state = CustomerVisitLog::changeState('预约到店', 'chaos');
  381. $dd_state = CustomerVisitLog::changeState('已到店', 'chaos');
  382. $sub_setting = Setting::where([['root_id', '=', $token['root_org']], ['name', '=', 'subscribe_protected']])->findOrEmpty();
  383. if (!$sub_setting->isEmpty()){
  384. $setting_content = json_decode($sub_setting['content'], true);
  385. foreach ($setting_content as $k_s => $v_s){
  386. if (!empty($v_s['state']) && !empty($v_s['day']) && $v_s['state'] == 1){
  387. $continue = false;
  388. $sub_state = 0;
  389. $errmsg = '您已有预约,无需重复预约';
  390. $check_log = false;
  391. $check_where = [];
  392. switch ($k_s){
  393. case 'liangfang':
  394. $sub_state = 3;
  395. $visit_state = 1;
  396. $check_log = true;
  397. $check_where[] = ['customer_id', 'in', $customer_ids];
  398. $check_where[] = ['addtime', '>', date('Y-m-d H:i:s',time() - 24*3600*$v_s['day'])];
  399. $check_where[] = ['employee_id', 'in', array_column($have_customer, 'employee_id')];
  400. $check_where[] = ['state', 'in', $lf_state];
  401. break;
  402. case 'yliangfang': //预约量房
  403. $sub_state = 3;
  404. $visit_state = 0;
  405. break;
  406. case 'daodian':
  407. $sub_state = 1;
  408. $visit_state = 1;
  409. $check_log = true;
  410. $check_where[] = ['customer_id', 'in', $customer_ids];
  411. $check_where[] = ['addtime', '>', date('Y-m-d H:i:s',time() - 24*3600*$v_s['day'])];
  412. $check_where[] = ['employee_id', 'in', array_column($have_customer, 'employee_id')];
  413. $check_where[] = ['state', 'in', $dd_state];
  414. break;
  415. case 'ydaodian':
  416. $sub_state = 1;
  417. $visit_state = 0;
  418. break;
  419. case 'daochang':
  420. $sub_state = 2;
  421. $visit_state = 1;
  422. $check_log = true;
  423. $check_where[] = ['customer_id', 'in', $customer_ids];
  424. $check_where[] = ['addtime', '>', date('Y-m-d H:i:s',time() - 24*3600*$v_s['day'])];
  425. $check_where[] = ['employee_id', 'in', array_column($have_customer, 'employee_id')];
  426. $check_where[] = ['state', 'in', $dc_state];
  427. break;
  428. case 'ydaochang':
  429. $sub_state = 2;
  430. $visit_state = 0;
  431. break;
  432. default:
  433. $continue = true;
  434. break;
  435. }
  436. if ($continue) continue;
  437. // 查询保护时间段内添加的预约量房记录
  438. unset($v_where);
  439. $v_where[] = ['customer_id', 'in', $customer_ids];
  440. $v_where[] = ['addtime', '>', date('Y-m-d H:i:s',time() - 24*3600*$v_s['day'])];
  441. $v_where[] = ['employee_id', 'in', array_column($have_customer, 'employee_id')];
  442. $v_where[] = ['type', '=', $sub_state];
  443. $v_where[] = ['state', '=', $visit_state];
  444. $sub_list = CustomersSubscribe::where($v_where)->select()->toArray();
  445. if (!empty($sub_list)){
  446. return json(['code' => 1, 'msg' => $errmsg]);
  447. }
  448. if ($check_log) {
  449. $log_list = CustomerVisitLog::where($check_where)->select()->toArray();
  450. if (!empty($log_list)){
  451. return json(['code' => 1, 'msg' => $errmsg]);
  452. }
  453. }
  454. }
  455. }
  456. }
  457. }
  458. //如果手机号客户没建档,则建档分配给分享人
  459. //如果手机号客户已建档没有分配业务员,则直接分配给分享人
  460. //如果手机号客户已建档已分配,则不变,给分享人发消息通知即可
  461. $uid = $param['uid']; //分享人的uid ,
  462. $need_new = false; // 是否需要创建新客户
  463. $param['employee_id'] = $share_employee_id;
  464. if ($customer->isEmpty()) {
  465. //分享人没有该客户 查询公海
  466. $waters = Customer::where([['phone|phone1|phone2', '=', $phone],['org_id', 'in', $orgs],['is_resource','=',0],['employee_id','null',null]])->findOrEmpty();
  467. if ($waters->isEmpty()) {
  468. $need_new = true; // 公海没有
  469. }else{
  470. Customer::where([['id', 'in', $waters->id]])->update(['employee_id' => $share_employee_id, 'org_id' => $emp->org_id, 'state' => '待确认', 'remark' => '公海获取', 'fresh' => 1, 'ext->ext6' => '', 'designer_id' => null]);
  471. }
  472. }else{
  473. //已经有该客户
  474. }
  475. //邀约日期默认活动开始日期
  476. $adate = ActivityModel::where('id', $param['aid'])->value('start_date');
  477. $param['date'] = $adate <= date('Y-m-d') ? date('Y-m-d') : $adate;
  478. if ($need_new) {
  479. //建档
  480. $save = [];
  481. $save['uid'] = $param['uid'];
  482. $save['employee_id'] = $param['employee_id'];
  483. $save['clue_id'] = CustomerClue::where([['uid', '=', $token['uid']], ['org_id', 'in', $orgs], ['employee_id', '=', $param['employee_id']]])->value('id') ?: 0;
  484. $save['phone'] = $phone;
  485. $save['name'] = User::where('id', $token['uid'])->value('nickname') ?: '';
  486. $save['state'] = 0;
  487. $save['org_id'] = Employee::where('id', $param['employee_id'])->value('org_id');
  488. $save['remark'] = '活动报名建档';
  489. $save['sex'] = 1;
  490. $save['aid'] = $param['aid'];
  491. $cid = Customer::insertGetId($save);
  492. $this->addFirstCustoemrVisitLog($cid);
  493. if ($save['clue_id']) {
  494. CustomerClue::where('id', $save['clue_id'])->update(['state' => 1]);
  495. }
  496. } else {
  497. $cid = $customer->id;
  498. }
  499. //查询是否可以报名
  500. $sw[] = ['type', '=', 2];
  501. $sw[] = ['state', '=', 0];
  502. $sw[] = ['customer_id', '=', $cid];
  503. $sw[] = ['aid', '>', 0];
  504. $check = CustomersSubscribe::where($sw)->findOrEmpty();
  505. //if(!$check->isEmpty()) return json(['code' => 1, 'msg' => '您有已报名的活动未参加,请联系业务员!']);
  506. //建档成功后直接邀约
  507. //已经邀约过无法重复邀约
  508. $visitlog = CustomerVisitLog::where([['aid', '=', $param['aid']], ['customer_id', '=', $cid]])->find();
  509. if ($cid && $param['date'] && !$visitlog) {
  510. $save = [];
  511. $save['customer_id'] = $cid;
  512. $save['type'] = 3;
  513. $save['next_contact_date'] = $param['date'];
  514. $save['remark'] = '活动邀约';
  515. $save['employee_id'] = $param['employee_id'];
  516. $save['user_id'] = $param['uid'];
  517. $save['state'] = 6;
  518. $save['aid'] = $param['aid'];
  519. CustomerVisitLog::insertGetId($save);
  520. // $update['state'] = 0;//已经报备后的客户状态不变
  521. $update['aid'] = $param['aid'];
  522. $update['revisit_time'] = $param['date'];
  523. $update['last_contact_date'] = date('Y-m-d');
  524. $update['updatetime'] = date('Y-m-d H:i:s');
  525. $update['fresh'] = 0;
  526. Customer::where('id', $cid)->update($update);
  527. }
  528. $info = User::where('id', $token['uid'])->find()->toArray();
  529. $str = json_encode(['uid' => (int)$token['uid'], 'aid' => (int)$param['aid']]);
  530. if ($uid != $param['uid']) {
  531. //如果报名客户是其他业务员的客户,需要给分享人发送消息提醒
  532. $fenxiangren = Employee::where([['uid', '=', $uid], ['root_id', '=', $token['root_org']], ['state', '=', '在职']])->find()->toArray();
  533. $yewuyan = Employee::where([['uid', '=', $param['uid']], ['root_id', '=', $token['root_org']], ['state', '=', '在职']])->find()->toArray();
  534. $con = $yewuyan['name'] . '的客户在您分享的活动中报名';
  535. event(new Msg($fenxiangren['id'], $con, 'activitySignUp', $str));
  536. $con = '您的客户‘' . $info['nickname'] . '’通过‘' . $fenxiangren['name'] . '’分享的活动报名';
  537. event(new Msg($yewuyan['id'], $con, 'activitySignUp', $str));
  538. } else {
  539. $a = ActivityModel::where('id', $param['aid'])->find()->toArray();
  540. $con = '您的客户' . $info['nickname'] . '已报名您分享的《' . $a['title'] . '》活动';
  541. event(new Msg($param['employee_id'], $con, 'activitySignUp', $str));
  542. }
  543. //预约表添加数据
  544. $subscribe = [
  545. 'customer_id' => $cid,
  546. 'subscribe_date' => $param['date'],
  547. 'employee_id' => $param['employee_id'],
  548. 'type' => 2,
  549. 'aid' => (int)$param['aid'],
  550. 'org_id' => Employee::where('id', $param['employee_id'])->value('org_id')
  551. ];
  552. CustomersSubscribe::insertGetId($subscribe);
  553. //生成报名二维码
  554. //二维码内容,活动id,报名人uid
  555. $qrcode_con = $param['aid'] .'&'.$cid.'&'.$token['uid'];
  556. $cate = ActivityModel::where('id',$param['aid'])->value('cate');
  557. $qrcode_con = $qrcode_con.'&'.$cate;
  558. //生成二维码
  559. $name = uniqid() . '.jpg';
  560. $path = 'activityqrcode/' . $name;
  561. $img = qrcode($qrcode_con, 'upload/'.$name);
  562. $res = ossUpload($path, 'upload/'.$name);
  563. @unlink('upload/'.$name); //删除本地文件
  564. ActivitySign::insertGetId([
  565. 'aid' => $param['aid'],
  566. 'root_id' => $token['root_org'],
  567. 'uid' => $token['uid'],
  568. 'share_uid' => $param['uid'],
  569. 'share_employee_id' => $param['employee_id'],
  570. 'qrcode' => $path,
  571. 'qrcode_con' => $qrcode_con,
  572. 'addtime' => date('Y-m-d H:i:s')
  573. ]);
  574. $ali_oss_bindurl = config('app.ali_oss_bindurl');
  575. $url = 'https://' . $ali_oss_bindurl . '/'.$path;
  576. return json(['code' => 0, 'msg' => '报名成功','url'=>$url]);
  577. }
  578. /**
  579. * 新建客户时添加一条跟进记录
  580. * $id 客户id
  581. */
  582. public function addFirstCustoemrVisitLog($id)
  583. {
  584. $token = $this->request->token;
  585. $info = Customer::where('id', $id)->find();
  586. $name = Employee::where('id', $info->employee_id)->value('name');
  587. $remark = '业务员' . $name . '对客户' . $info->name . '进行报备';
  588. $save = [
  589. 'customer_id' => $id,
  590. 'type' => '',
  591. 'next_contact_date' => date('Y-m-d'),
  592. 'remark' => $remark,
  593. 'addtime' => date('Y-m-d H:i:s'),
  594. 'employee_id' => $info->employee_id,
  595. 'user_id' => $info->uid,
  596. 'state' => 1,
  597. 'org_id' => $info->org_id,
  598. 'customer_employee_id' => $info->employee_id,
  599. 'customer_org_id' => $info->org_id
  600. ];
  601. CustomerVisitLog::insertGetId($save);
  602. return true;
  603. }
  604. }