AgentEmp.php 45 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994
  1. <?php
  2. namespace app\api\controller;
  3. use app\client\controller\Agent;
  4. use app\logics\AgentsLogic;
  5. use app\model\Customer;
  6. use app\model\CustomerVisitLog;
  7. use app\model\CustomerClue;
  8. use app\model\Employee;
  9. use app\model\Miniprogram;
  10. use app\model\User as ModelUser;
  11. use app\model\UserSignLog;
  12. use Firebase\JWT\JWT;
  13. use openssl\Aes;
  14. use think\facade\Console;
  15. use app\model\AgentUser;
  16. use app\model\AgentIntegralLog;
  17. use app\model\AgentCustomerLog;
  18. use wx\miniprogram\Qrcode;
  19. use app\model\AgentIntegral;
  20. use app\model\CreditsSetting;
  21. use app\model\CustomerTop;
  22. use app\model\AgentArticle;
  23. use app\model\AgentShareLog;
  24. use app\model\ShareLog;
  25. use app\model\AgentShareContent;
  26. use app\model\MaterialCase;
  27. use app\model\Article;
  28. use app\model\Video;
  29. use app\model\MaterialEvidence;
  30. use app\model\CompanyStrength;
  31. use app\model\Building;
  32. use app\model\AgentApplyIntegral;
  33. use app\model\AgentType;
  34. use app\model\AgentEmpInvitationQrcode;
  35. use app\model\AgentPrize;
  36. class AgentEmp extends Base
  37. {
  38. //员工审核经纪人
  39. public function emp_review_agt()
  40. {
  41. $token = $this->request->token;
  42. $data = $this->request->only(['agentid', 'status', 'type']);
  43. $where[] = ['agent_employee_id', '=', $token['employee_id']];
  44. $where[] = ['root_id', '=', $token['root_org']];
  45. $where[] = ['id', '=', $data['agentid']];
  46. $where[] = ['is_review', '=', 1];
  47. //$ms=AgentUser::where($where)->update(['is_review'=>$data['status'],'type'=>$data['type'],'review_time'=>time()]);
  48. $ms = AgentUser::where($where)->update(['is_review' => $data['status'], 'review_time' => time()]);
  49. if ($ms) {
  50. return json(['code' => 0, 'msg' => '审核成功.']);
  51. } else {
  52. return json(['code' => 1, 'msg' => '审核失败.']);
  53. }
  54. }
  55. //待审核经纪人列表
  56. public function review_agt_list()
  57. {
  58. $token = $this->request->token;
  59. $list = AgentUser::where([['is_review', '=', 1], ['agent_employee_id', '=', $token['employee_id']], ['root_id', '=', $token['root_org']]])->select();
  60. return json(['code' => 0, 'msg' => '获取成功', 'data' => $list]);
  61. }
  62. /**
  63. * 业务员下的经纪人列表
  64. */
  65. public function agent_list()
  66. {
  67. $token = $this->request->token;
  68. $data = $this->request->only(['agentid', 'page', 'limit', 'type', 'keyword', 'order', 'join_date', 'is_review']);
  69. if (!empty($data['type'])) {
  70. $where[] = ['type', '=', $data['type']];
  71. }
  72. //关键字
  73. if (!empty($data['keyword'])) {
  74. $where[] = ['agent_name|agent_phone', 'like', '%' . $data['keyword'] . '%'];
  75. }
  76. //加入时间
  77. if (!empty($data['join_date'])) {
  78. $where[] = ['addtime', 'like', $data['join_date'] . '%'];
  79. }
  80. //审核状态
  81. if (!empty($data['is_review'])) {
  82. $where[] = ['is_review', '=', $data['is_review']];
  83. }
  84. $where[] = ['agent_employee_id', '=', $token['employee_id']];
  85. $where[] = ['status', '=', 1];
  86. $list = AgentUser::with(['user' => function ($query) {
  87. $query->field('id,nickname,headimgurl');
  88. }, 'customer' => function ($query) {
  89. $query->field('id,agents_id');
  90. }, 'agenttype'])
  91. ->where($where)
  92. ->field('id,agent_name,type,is_review,addtime,uid,agent_phone,cards_num,wechat')
  93. //->page($data['page'], $data['limit'])
  94. ->order('is_review asc,id desc')
  95. ->select()->toArray();
  96. //排行筛选
  97. if (!empty($data['order']) && !empty($list)) {
  98. foreach ($list as $key => $val) {
  99. $ph = AgentCustomerLog::where([['status', '=', 1], ['type', '=', $data['order']], ['agent_id', '=', $val['id']]])->count();
  100. $list[$key]['ph'] = $ph;
  101. $parr[] = $ph;
  102. }
  103. array_multisort($parr, SORT_DESC, $list);
  104. }
  105. $review_num = 0;
  106. foreach ($list as $key => $val) {
  107. //客户数量
  108. $list[$key]['customer_num'] = count($val['customer']);
  109. //当前积分
  110. $integral = AgentIntegralLog::where([['agt_id', '=', $val['id']]])->order('id desc')->value('now_integral');
  111. //$integral=AgentIntegralLog::where([['agt_id','=',$val['id']],['type','=',1]])->sum('integral');
  112. $wait_integral = AgentIntegral::where([['agent_id', '=', $val['id']], ['status', '=', 1]])->sum('integral');
  113. $now_integral = $integral + $wait_integral;
  114. $list[$key]['now_integral'] = $now_integral ? $now_integral : 0;
  115. //已兑换
  116. $list[$key]['reduce_integral'] = AgentIntegralLog::where([['agt_id', '=', $val['id']], ['type', '=', 2]])->sum('integral');
  117. //分享数量
  118. $list[$key]['share_num'] = ShareLog::where('agent_id', $val['id'])->count();
  119. //线索数量
  120. $list[$key]['clue_num'] = CustomerClue::where(['agent_id' => $val['id']])->count();
  121. //建档数量
  122. $list[$key]['clue_crm_num'] = CustomerClue::where(['agent_id' => $val['id'], 'state' => 1])->count();
  123. if ($val['is_review'] == 1) $review_num++;
  124. $list[$key]['type_name'] = !empty($val['agenttype']['type_name']) ? $val['agenttype']['type_name'] : '';
  125. }
  126. return json(['code' => 0, 'msg' => '获取成功', 'data' => $list, 'review_num' => $review_num]);
  127. }
  128. //统计员工下属经济人总数
  129. public function agent_count()
  130. {
  131. $token = $this->request->token;
  132. $data = $this->request->only(['agentid', 'status', 'page', 'limit']);
  133. $where[] = ['agent_employee_id', '=', $token['employee_id']];
  134. $where[] = ['is_review', '=', 2];
  135. $where[] = ['status', '=', 1];
  136. $list = AgentUser::where($where)->column('id');
  137. $where1[] = ['agent_id', 'in', (implode(',', $list))];
  138. $list = AgentCustomerLog::where($where1)->fieldRaw('count(id) as alls')->group('type')->order('alls desc')->select()->toArray();
  139. //客户数量
  140. $customer = Customer::where(['agents_id', 'in', (implode(',', $list))])->count();
  141. }
  142. /**
  143. * 业务员端经纪人客户头部统计
  144. */
  145. public function ctm_count()
  146. {
  147. $token = $this->request->token;
  148. $data = $this->request->only(['agent_id']);
  149. if (empty($data['agent_id'])) {
  150. $where[] = ['agent_employee_id', '=', $token['employee_id']];
  151. } else {
  152. $where[] = ['id', '=', $data['agent_id']];
  153. }
  154. $where[] = ['is_review', '=', 2];
  155. $where[] = ['status', '=', 1];
  156. $list = AgentUser::where($where)->column('id');
  157. //查询出属于我的客户
  158. $customer_id = Customer::where([['employee_id', '=', $this->request->token['employee_id']], ['agents_id', 'in', $list]])->column('id');
  159. // 确认到店数量统计
  160. $visit = CustomerVisitLog::where(array_merge([CustomerVisitLog::changeState(['state', '=', '确认到店'])], [['customer_id', 'in', $customer_id]]))->count();
  161. // 交定数量统计
  162. $ding = CustomerVisitLog::where(array_merge([CustomerVisitLog::changeState(['state', '=', '交定'])], [['customer_id', 'in', $customer_id]]))->count();
  163. // 签单数量统计
  164. $sign = CustomerVisitLog::where(array_merge([CustomerVisitLog::changeState(['state', '=', '签单'])], [['customer_id', 'in', $customer_id]]))->count();
  165. return json(['code' => 0, 'data' => ['visit' => $visit, 'ding' => $ding, 'sign' => $sign, 'count' => $customer_id ? count($customer_id) : 0], 'msg' => '获取成功']);
  166. }
  167. //获取经纪人的类别
  168. public function agent_typelist()
  169. {
  170. $token = $this->request->token;
  171. $list = AgentType::where([['root_id', '=', $token['root_org']], ['status', '=', 1]])->field('id,type_name')->select()->toArray();
  172. return json(['code' => 0, 'data' => $list, 'msg' => '获取成功']);
  173. }
  174. //员工生成邀请经纪人二维码
  175. public function invitation_qrcode()
  176. {
  177. $token = $this->request->token;
  178. $param = $this->request->only(['type']);
  179. if (empty($param['type'])) return json(['code' => 1, 'msg' => '参数错误']);
  180. $class = Employee::where([['id', '=', $token['employee_id']], ['root_id', '=', $token['root_org']]])->field('id,name,invitation_qrcode')->find();
  181. if (empty($class)) return json(['code' => 1, 'msg' => '员工信息不存在']);
  182. $qrcodedata = AgentEmpInvitationQrcode::where([['root_id', '=', $token['root_org']], ['employee_id', '=', $token['employee_id']], ['type', '=', $param['type']]])->find();
  183. if (empty($qrcodedata['invitation_qrcode'])) {
  184. // 生成二维码
  185. $mini = Miniprogram::where([['root_id', '=', $token['root_org']]])->find();
  186. $qrObj = new Qrcode;
  187. $params = [
  188. 'scene' => 'cli=' . $mini['notify'] . '&id=' . $class['id'] . '&type=' . $param['type'], //该参数最长32位,如果无法生成二维码请排查是否超出长度
  189. 'page' => 'customer/pages/brokerindex/brokerindex',
  190. 'width' => '280px',
  191. ];
  192. $qr = $qrObj->getUnlimited($mini->accesstoken, $params);
  193. $rs = json_decode($qr, true);
  194. if (!is_null($rs)) {
  195. return json(['code' => 1, 'msg' => '二维码生成失败']);
  196. }
  197. $path = 'agentinvitationQrcode/' . uniqid() . '.jpeg';
  198. ossContentUpload($path, $qr);
  199. //$class->invitation_qrcode = $path;
  200. //$class->save();
  201. $add = [
  202. 'employee_id' => $token['employee_id'],
  203. 'root_id' => $token['root_org'],
  204. 'type' => $param['type'],
  205. 'invitation_qrcode' => $path
  206. ];
  207. AgentEmpInvitationQrcode::insertGetId($add);
  208. $qrcode = 'https://' . config('app.ali_oss_bindurl') . '/' . $path;
  209. } else {
  210. $qrcode = 'https://' . config('app.ali_oss_bindurl') . '/' . $qrcodedata['invitation_qrcode'];
  211. }
  212. return json(['code' => 0, 'msg' => '获取成功', 'data' => $qrcode]);
  213. }
  214. //员工下属经纪人客户列表
  215. public function agent_customer_list_two()
  216. {
  217. $token = $this->request->token;
  218. $data = $this->request->only(['page', 'limit', 'state', 'addtime', 'agent_source_type', 'agent_id', 'keyword']);
  219. if (!empty($data['state'])) {
  220. $where[] = ['state', 'in', Customer::changeState($data['state'], 'chaos')];
  221. }
  222. if (!empty($data['addtime'])) {
  223. $where[] = ['addtime', '>=', $data['addtime'] . ' 00:00:00'];
  224. $where[] = ['addtime', '<=', $data['addtime'] . ' 23:59:59'];
  225. }
  226. if (!empty($data['agent_source_type'])) {
  227. $where[] = ['agent_source_type', '=', $data['agent_source_type']];
  228. }
  229. if (!empty($data['keyword'])) {
  230. $where[] = ['agent_name|agent_phone', 'like', '%' . $data['keyword'] . '%'];
  231. }
  232. $all_agt = AgentUser::where([['agent_employee_id', '=', $token['employee_id']], ['is_review', '=', 2]])->column('id');
  233. if (!empty($data['agent_id'])) {
  234. if (in_array($data['agent_id'], $all_agt)) {
  235. $agt_id = array($data['agent_id']);
  236. } else {
  237. return json(['code' => 1, 'data' => null, 'msg' => '经纪人参数错误']);
  238. }
  239. } else {
  240. $agt_id = $all_agt;
  241. }
  242. $where[] = ['agents_id', 'in', (implode(',', $agt_id))];
  243. $list = Customer::with(['visitLog' => function ($query) {
  244. $query->field('customer_id,state')->group('state');
  245. }])
  246. ->where($where)
  247. ->field('id,name,state,square,phone,level,updatetime,community_name,addtime,sex,agent_source_type,agents_id')
  248. ->page($data['page'], $data['limit'])
  249. ->order('addtime desc')
  250. ->select()
  251. ->toArray();
  252. //var_dump($list);
  253. //exit;
  254. return json(['code' => 0, 'data' => $list, 'msg' => '请求成功.']);
  255. }
  256. //员工单独查看下属经纪人积分详情
  257. public function agent_integral_list()
  258. {
  259. $token = $this->request->token;
  260. $data = $this->request->only(['page', 'limit', 'agent_id']);
  261. $daoday = 0;
  262. (new AgentsLogic())->call_agt_integral($daoday, $data['agent_id'], $token['root_org']);
  263. $list = AgentIntegral::with(['customer' => function ($query) {
  264. $query->field('id,name,sex');
  265. }])
  266. ->where([['agent_id', '=', $data['agent_id']]])
  267. ->page($data['page'], $data['limit'])
  268. ->order('addtime desc')->select()->toArray();
  269. foreach ($list as $key => $val) {
  270. $list[$key]['addtime'] = date('Y-m-d H:i:s', $val['addtime']);
  271. $list[$key]['status'] = $val['status'] == 1 ? '待确认' : '到账';
  272. }
  273. return json(['code' => 0, 'data' => $list, 'msg' => '请求成功.']);
  274. }
  275. //员工单独查看下属经纪人积分核销详情
  276. public function agent_already_list()
  277. {
  278. $token = $this->request->token;
  279. $data = $this->request->only(['page', 'limit', 'agent_id']);
  280. $list = AgentIntegralLog::where([['agt_id', '=', $data['agent_id']], ['type', '=', 2]])
  281. ->field('integral,addtime')
  282. ->page($data['page'], $data['limit'])
  283. ->select()->toArray();
  284. foreach ($list as $key => $val) {
  285. $list[$key]['addtime'] = date('Y-m-d H:i:s', $val['addtime']);
  286. $list[$key]['status'] = '兑换成功';
  287. }
  288. return json(['code' => 0, 'data' => $list, 'msg' => '请求成功.']);
  289. }
  290. /**
  291. * 修改经纪人名称
  292. */
  293. public function upagent_name()
  294. {
  295. $token = $this->request->token;
  296. $param = $this->request->only(['name', 'id']);
  297. $agent = AgentUser::where([['root_id', '=', $token['root_org']], ['id', '=', $param['id']]])->find();
  298. $agent->agent_name = $param['name'];
  299. $ms = $agent->save();
  300. if ($ms) {
  301. return json(['code' => 0, 'msg' => '修改成功']);
  302. } else {
  303. return json(['code' => 1, 'msg' => '修改失败']);
  304. }
  305. }
  306. //经纪人核销申请列表
  307. public function agent_wipen_list()
  308. {
  309. $token = $this->request->token;
  310. $data = $this->request->only(['page' => 1, 'limit' => 10, 'id', 'status']);
  311. $where[] = ['empid', '=', $token['employee_id']];
  312. if (!empty($data['status'])) $where[] = ['status', '=', $data['status']];
  313. $list = AgentApplyIntegral::with(['agent' => function ($query) {
  314. $query->field('id,agent_name');
  315. }])->where($where)->page($data['page'], $data['limit'])->order('id desc')->select()->toArray();
  316. $rule_type = 'reduce_integral';
  317. $already_rule = CreditsSetting::where([['code', '=', $rule_type], ['root_id', '=', $token['root_org']]])->value('value');
  318. $already_rule = $already_rule ? json_decode($already_rule, true) : ['jifen' => 1, 'money' => 1];
  319. foreach ($list as $key => $val) {
  320. $list[$key]['money'] = bcdiv($val['integral'], $already_rule['jifen'], 1) * $already_rule['money'];
  321. $list[$key]['review_time'] = !empty($val['review_time']) ? date('Y-m-d H:i:s', $val['review_time']) : '';
  322. $list[$key]['good_name'] = !empty($val['good_id']) ? AgentPrize::where([['root_id', '=', $token['root_org']], ['id', '=', $val['good_id']]])->value('good_name') : '';
  323. }
  324. return json(['code' => 0, 'data' => $list, 'msg' => '请求成功.']);
  325. }
  326. //员工提报经纪人的核销申请
  327. public function present_agent_wipen()
  328. {
  329. $token = $this->request->token;
  330. $data = $this->request->only(['id']);
  331. $ms = AgentApplyIntegral::where('id', $data['id'])->update(['status' => 2]);
  332. return json(['code' => 0, 'msg' => '提报成功']);
  333. }
  334. //员工单独查看下属经纪人积分头部统计
  335. public function agent_intregral_total()
  336. {
  337. $token = $this->request->token;
  338. $data = $this->request->only(['agent_id']);
  339. $agtdata = AgentUser::where('id', $data['agent_id'])->find();
  340. if (empty($agtdata)) return json(['code' => 1, 'msg' => '经纪人信息错误']);
  341. //$rule_type=$agtdata['type']==1?'reduce_integral':'wang_reduce_integral';
  342. $rule_type = 'reduce_integral';
  343. $already_rule = CreditsSetting::where([['code', '=', $rule_type], ['root_id', '=', $agtdata['root_id']]])->value('value');
  344. $already_rule = $already_rule ? json_decode($already_rule, true) : ['jifen' => 1, 'money' => 1];
  345. $integral = AgentIntegralLog::where([['agt_id', '=', $agtdata['id']]])->fieldRaw('sum(integral) as at,type')->group('type')->select()->toArray();
  346. $all_integral = $all_already = 0;
  347. if (!empty($integral)) {
  348. foreach ($integral as $key => $val) {
  349. if ($val['type'] == 1) {
  350. $all_integral = $val['at'] ? $val['at'] : 0;
  351. }
  352. if ($val['type'] == 2) {
  353. $all_already = $val['at'] ? $val['at'] : 0;
  354. }
  355. }
  356. }
  357. $wait_integral = AgentIntegral::where([['agent_id', '=', $agtdata['id']], ['status', '=', 1]])->sum('integral');
  358. $all_integral = $all_integral + $wait_integral;
  359. $no_already = AgentIntegralLog::where('agt_id', '=', $agtdata['id'])->order('id desc')->value('now_integral');
  360. $no_already = $no_already ? $no_already : 0;
  361. $no_already_money = bcdiv($no_already, $already_rule['jifen'], 1) * $already_rule['money'];
  362. $data = array('all_intregral' => $all_integral, 'all_already' => $all_already, 'no_already' => $no_already, 'no_already_money' => $no_already_money);
  363. return json(['code' => 0, 'data' => $data, 'msg' => '请求成功.']);
  364. }
  365. /**
  366. * 客户列表
  367. * @param state integer 1全部, 2待确认, 3未到访 4已到访,5定金,6签单,7无效
  368. */
  369. public function agent_customer_list()
  370. {
  371. $token = $this->request->token;
  372. $param = $this->request->only([
  373. 'state' => '',
  374. 'page' => 1,
  375. 'limit' => 20,
  376. 'keyword' => '',
  377. 'date' => '',
  378. 'visit' => '',
  379. 'addtime' => '',
  380. 'following' => '',
  381. 'protected' => '',
  382. 'agent_id' => '',
  383. 'agent_source_type' => ''
  384. ]);
  385. $all_agt = AgentUser::where([['root_id', '=', $token['root_org']], ['agent_employee_id', '=', $token['employee_id']], ['is_review', '=', 2]])->column('id');
  386. if (!empty($param['agent_id'])) {
  387. if (in_array($param['agent_id'], $all_agt)) {
  388. $agt_id = array($param['agent_id']);
  389. } else {
  390. return json(['code' => 1, 'data' => null, 'msg' => '经纪人参数错误']);
  391. }
  392. } else {
  393. $agt_id = $all_agt;
  394. }
  395. // 1)查询条件
  396. $condition = [
  397. ['agents_id', 'in', $agt_id],
  398. //['employee_id', '=', $token['employee_id']],
  399. ['org_id', 'in', orgSubIds($token['root_org'])],
  400. //['state', 'not in', Customer::changeState('无效', 'chaos')],
  401. //['died', '<>', 2]
  402. ];
  403. empty($param['agent_source_type']) ?: $condition[] = ['agent_source_type', '=', $param['agent_source_type']];
  404. // 可回收列表
  405. if (!empty($param['protected'])) {
  406. $orgids = orgSubIds($this->request->token['org_id']);
  407. $condition[] = ['org_id', 'in', $orgids];
  408. }
  409. // 2)状态筛选
  410. // empty($param['state']) ? $logCondition[] = ['state', 'not in', CustomerVisitLog::changeState('无效', 'chaos')] : $condition[] = ['state', 'in', CustomerVisitLog::changeState($param['state'], 'chaos')];
  411. // 5)待回访
  412. empty($param['visit']) ?: $condition[] = empty($param['date']) ? ['revisit_time', '=', date('Y-m-d') . ' 00:00:00'] : ['revisit_time', '=', $param['date'] . ' 00:00:00'];
  413. // 6)录入时间筛选
  414. empty($param['addtime']) ?: $condition[] = ['addtime', 'like', date('Y-m-d', strtotime($param['addtime'])) . '%'];
  415. //增加按跟进时间排序
  416. $order = 'addtime desc';
  417. empty($param['following']) ?: $order = 'last_contact_date ' . $param['following'] . ',' . $order;
  418. //关键词搜索
  419. if (!empty($param['keyword'])) {
  420. $list = Customer::where($condition)->order($order)->field('id,name,community_name,phone')->select()->toArray();
  421. $customersIdList = [];
  422. foreach ($list as $k => $v) {
  423. $str = $v['name'] . $v['community_name'] . $v['phone'];
  424. if (strpos($str, trim($param['keyword'])) !== false) $customersIdList[] = $v['id'];
  425. }
  426. } else {
  427. $customersIdList = Customer::where($condition)->order($order)->column('id');
  428. }
  429. // 剔除掉未经历该状态的客户id
  430. if (!empty($param['state'])) {
  431. if (CustomerVisitLog::changeState($param['state']) == '回访' || $param['state'] == '有效') {
  432. // 查询经历过回访以外所有状态的客户id(有效)
  433. $expectCustomersIdList = CustomerVisitLog::where([['customer_id', 'in', $customersIdList], ['state', 'not in', CustomerVisitLog::changeState('回访', 'chaos')], ['employee_id', '=', $token['employee_id']]])->group('customer_id')->column('customer_id');
  434. if ($param['state'] == '有效') {
  435. $customersIdList = $expectCustomersIdList;
  436. } else {
  437. $customersIdList = array_diff($customersIdList, $expectCustomersIdList);
  438. }
  439. } else {
  440. $customersIdList = CustomerVisitLog::where([['customer_id', 'in', $customersIdList], ['state', 'in', CustomerVisitLog::changeState($param['state'], 'chaos')]])->group('customer_id')->column('customer_id');
  441. }
  442. }
  443. // 置顶数据获取
  444. $top = CustomerTop::where([['root_id', '=', $token['root_org']], ['employee_id', '=', $token['employee_id']]])->where([['customer_id', 'in', $customersIdList]])->order('addtoptime asc')->column('customer_id');
  445. // 新数据获取
  446. $new = Customer::where([['id', 'in', $customersIdList], ['fresh', '=', 1]])->order($order)->column('id');
  447. // 剔除不应该出现的客户
  448. $top = array_diff($top, array_diff($top, $customersIdList));
  449. // 剔除不应该出现的新客户
  450. $new = array_diff($new, array_diff($new, $customersIdList));
  451. // 剔除置顶的客户
  452. $notTop = array_diff($customersIdList, $top);
  453. // 剔除新客户
  454. $notNew = array_diff($notTop, $new);
  455. // 将置顶客户放置到前面
  456. $customersIdList = array_unique(array_merge($top, $new, $notNew));
  457. // 总数获取
  458. $count = Customer::where($condition)->count();
  459. //返回到特定位置
  460. $id = input('id', 0);
  461. if ($id) {
  462. $ids = array_chunk($customersIdList, $param['limit']);
  463. foreach ($ids as $k => $v) {
  464. $a = false;
  465. foreach ($v as $k2 => $v2) {
  466. if ($id == $v2) {
  467. $a = true;
  468. $param['page'] = $k + 1;
  469. break;
  470. }
  471. }
  472. if ($a) break;
  473. }
  474. }
  475. // 分页
  476. $pageIdList = array_slice($customersIdList, ($param['page'] - 1) * $param['limit'], $param['limit']);
  477. $condition[] = ['id', 'in', $pageIdList];
  478. $customers = Customer::with(['designer', 'designerOrg', 'agent' => function ($query) {
  479. $query->field('id,agent_name');
  480. }])->where($condition)->select();
  481. // 总数获取
  482. $count = $customers->count();
  483. $customers = $customers->visible(['id', 'employee_id', 'name', 'sex', 'level', 'community_name', 'state', 'addtime', 'revisit_time', 'designer.name', 'designerOrg.name', 'fresh', 'square', 'last_contact_date', 'updatetime'])->toArray();
  484. if (!empty($setting)) {
  485. $setting_content = json_decode($setting['content'], true);
  486. } else {
  487. $setting_content = [];
  488. }
  489. foreach ($customers as $k => $v) {
  490. $customers[$k]['un_protected'] = 0;
  491. $customers[$k]['protected_tips'] = '';
  492. if (!empty($v['protected_to']) && time() > strtotime($v['protected_to'])) {
  493. $state_n = Customer::changeState($v['state'], 'n');
  494. if (!empty($setting_content[$state_n]['state']) && $setting_content[$state_n]['state'] == 1) {
  495. $customers[$k]['un_protected'] = 1;
  496. $customers[$k]['protected_tips'] = '已过期';
  497. }
  498. }
  499. if (!empty($v['protected_to']) && time() < strtotime($v['protected_to'])) {
  500. $day = floor((strtotime($v['protected_to']) - time()) / (24 * 3600));
  501. $customers[$k]['protected_tips'] = $day ? '保护期' . $day . '天' : '即将过期';
  502. }
  503. }
  504. $customers = array_combine(array_column($customers, 'id'), $customers);
  505. // 状态统计获取
  506. $customersStateList = CustomerVisitLog::where([['customer_id', 'in', $pageIdList]])->group('state,customer_id')->field('count(state) as num, state, customer_id')->select()->toArray();
  507. $customersState = [];
  508. foreach ($customersStateList as $s) {
  509. if (!isset($customersState[$s['customer_id']]))
  510. $customersState[$s['customer_id']] = ['count' => 0, 'shop' => 0, 'measure' => 0, 'activity' => 0, 'deposit' => 0, 'signed' => 0];
  511. $customersState[$s['customer_id']]['count'] += $s['num'];
  512. // 到店,量房,活动,定金,签单
  513. if ($s['state'] == '已到店') $customersState[$s['customer_id']]['shop'] += $s['num'];
  514. elseif ($s['state'] == '已量房') $customersState[$s['customer_id']]['measure'] += $s['num'];
  515. elseif ($s['state'] == '已到场') $customersState[$s['customer_id']]['activity'] += $s['num'];
  516. elseif ($s['state'] == '已交定') $customersState[$s['customer_id']]['deposit'] += $s['num'];
  517. elseif ($s['state'] == '已签单') $customersState[$s['customer_id']]['signed'] += $s['num'];
  518. }
  519. // 排序(按每页id顺序取值)
  520. $listData = [];
  521. foreach ($pageIdList as $customerId) {
  522. $customers[$customerId]['top'] = 0;
  523. $customers[$customerId]['is_new'] = $customers[$customerId]['fresh'] == 1 ? 1 : 0;
  524. $customers[$customerId]['addtoptime'] = null;
  525. if (in_array($customerId, $top)) $customers[$customerId]['addtoptime'] = 1;
  526. $customers[$customerId]['stateNum'] = $customersState[$customerId] ?? ['count' => 0, 'shop' => 0, 'measure' => 0, 'activity' => 0, 'deposit' => 0, 'signed' => 0];
  527. $listData[] = $customers[$customerId];
  528. }
  529. $data = [
  530. 'list' => $listData,
  531. 'count' => $count
  532. ];
  533. return json(['code' => 0, 'data' => $data, 'page' => $param['page'], 'employee_id' => $token['employee_id']]);
  534. }
  535. /**
  536. * 业务员上传分享文章
  537. * type上传类型:1视频,2图片
  538. */
  539. public function upload_article()
  540. {
  541. $param = $this->request->only(['title', 'file_media_id', 'content', 'talkskill', 'type']);
  542. $token = $this->request->token;
  543. $param['root_id'] = $token['root_org'];
  544. $param['employee_id'] = $token['employee_id'];
  545. $param['addtime'] = time();
  546. //上传文件
  547. if (!empty($param['file_media_id'])) {
  548. $file_media_id = [];
  549. foreach ($param['file_media_id'] as $k => $v) {
  550. $file_media_id[$k] = [
  551. 'serverId' => !empty($v['serverId']) ? $v['serverId'] : '',
  552. 'img' => !empty($v['img']) ? str_replace('https://' . config('app.ali_oss_bindurl') . '/', '', $v['img']) : '',
  553. 'video' => !empty($v['video']) ? str_replace('https://' . config('app.ali_oss_bindurl') . '/', '', $v['video']) : ''
  554. ];
  555. }
  556. $param['down_status'] = 1;
  557. $param['file_media_id'] = json_encode($file_media_id);
  558. }
  559. $add = AgentArticle::create($param);
  560. AgentShareContent::create(['root_id' => $token['root_org'], 'employee_id' => $token['employee_id'], 'data_id' => $add->id, 'type' => 'AgentArticle']);
  561. Console::call('download', ['agent_article_file']);
  562. if ($add) {
  563. return json(['code' => 0, 'msg' => '保存成功']);
  564. } else {
  565. return json(['code' => 1, 'msg' => '保存失败']);
  566. }
  567. }
  568. /**
  569. * 分享内容展示列表
  570. */
  571. public function article_list()
  572. {
  573. $param = $this->request->only(['page' => 1, 'limit' => 10, 'date' => '', 'share_order' => '', 'clue_order' => '', 'keyword' => '']);
  574. $token = $this->request->token;
  575. $where = [
  576. ['root_id', '=', $token['root_org']],
  577. ['employee_id', '=', $token['employee_id']]
  578. ];
  579. if (!empty($param['date'])) {
  580. list($start, $end) = explode(' - ', $param['date']);
  581. $startdate = strtotime($start);
  582. $enddate = strtotime($end);
  583. $start_time = date('Y-m-d H:i:s', $startdate);
  584. $end_time = date('Y-m-d H:i:s', $enddate + 86400);
  585. $where[] = ['addtime', '>=', $start_time];
  586. $where[] = ['addtime', '<', $end_time];
  587. }
  588. $field = 'addtime';
  589. $order = 'desc';
  590. if (!empty($param['share_order'])) {
  591. $field = 'share_num';
  592. $order = $param['share_order'];
  593. }
  594. if (!empty($param['clue_order'])) {
  595. $field = 'clue_num';
  596. $order = $param['clue_order'];
  597. }
  598. $data = AgentShareContent::where($where)->order('addtime desc')->select()->toArray();
  599. foreach ($data as &$item) {
  600. //分享量
  601. $item['share_num'] = ShareLog::where([['type', '=', $item['type']], ['data_id', '=', $item['data_id']], ['agent_id', '<>', 'NULL']])->count();
  602. //线索
  603. $item['clue_num'] = CustomerClue::where([['pipe_type', '=', $item['type']], ['pipe_id', '=', $item['data_id']], ['agent_id', '<>', 0]])->count();
  604. switch ($item['type']) {
  605. case 'Article':
  606. $find = Article::where([
  607. ['root_id', '=', $token['root_org']],
  608. ['delete_time', '=', 0],
  609. ['publish', '=', 1],
  610. ['id', '=', $item['data_id']]
  611. ])->field('id,title,cover_img')->find();
  612. if (empty($find)) {
  613. $item['content_id'] = $item['data_id'];
  614. $item['title'] = '';
  615. $item['cover'] = '';
  616. break;
  617. }
  618. $item['content_id'] = $find['id'];
  619. $item['title'] = $find['title'];
  620. $item['cover'] = $find['cover_img'];
  621. break;
  622. case 'MaterialCase':
  623. $find = MaterialCase::where([
  624. ['root_id', '=', $token['root_org']],
  625. ['del', '=', 0],
  626. ['publish', '=', 1],
  627. ['id', '=', $item['data_id']]
  628. ])->field('id,title,cover_img')->find();
  629. if (empty($find)) {
  630. $item['content_id'] = $item['data_id'];
  631. $item['title'] = '';
  632. $item['cover'] = '';
  633. break;
  634. }
  635. $item['content_id'] = $find['id'];
  636. $item['title'] = $find['title'];
  637. $item['cover'] = $find['cover_img'];
  638. break;
  639. case 'Video':
  640. $find = Video::where([
  641. ['root_id', '=', $token['root_org']],
  642. ['delete_time', '=', 0],
  643. ['publish', '=', 1],
  644. ['id', '=', $item['data_id']]
  645. ])->field('id,title,video_url')->find();
  646. if (empty($find)) {
  647. $item['content_id'] = $item['data_id'];
  648. $item['title'] = '';
  649. $item['cover'] = '';
  650. break;
  651. }
  652. $item['content_id'] = $find['id'];
  653. $item['title'] = $find['title'];
  654. $item['cover'] = $find['video_url'];
  655. break;
  656. case 'CompanyStrength':
  657. $find = CompanyStrength::where([
  658. ['root_id', '=', $token['root_org']],
  659. ['del', '=', 0],
  660. ['publish', '=', 1],
  661. ['id', '=', $item['data_id']]
  662. ])->field('id,title,cover,difference')->find();
  663. if (empty($find)) {
  664. $item['content_id'] = $item['data_id'];
  665. $item['title'] = '';
  666. $item['cover'] = '';
  667. $item['difference'] = 2;
  668. break;
  669. }
  670. $item['content_id'] = $find['id'];
  671. $item['title'] = $find['title'];
  672. $item['cover'] = $find['cover'];
  673. $item['difference'] = $find['difference'];
  674. break;
  675. case 'MaterialEvidence':
  676. $find = MaterialEvidence::where([
  677. ['root_id', '=', $token['root_org']],
  678. ['del', '=', 0],
  679. ['publish', '=', 1],
  680. ['id', '=', $item['data_id']]
  681. ])->field('id,title,pics,difference')->find();
  682. if (empty($find)) {
  683. $item['content_id'] = $item['data_id'];
  684. $item['title'] = '';
  685. $item['cover'] = '';
  686. $item['difference'] = 2;
  687. break;
  688. }
  689. $item['content_id'] = $find['id'];
  690. $item['title'] = $find['title'];
  691. $item['cover'] = $find['pics'];
  692. $item['difference'] = $find['difference'];
  693. break;
  694. case 'Building':
  695. $find = Building::where([
  696. ['root_id', '=', $token['root_org']],
  697. ['del', '=', 0],
  698. ['id', '=', $item['data_id']]
  699. ])->field('id,community_id,name,cover')->find();
  700. if (empty($find)) {
  701. $item['content_id'] = $item['data_id'];
  702. $item['title'] = '';
  703. $item['cover'] = '';
  704. break;
  705. }
  706. $item['content_id'] = $find['id'];
  707. $item['title'] = $find['name'];
  708. $item['cover'] = $find['cover'];
  709. break;
  710. case 'AgentArticle':
  711. $find = AgentArticle::where([
  712. ['root_id', '=', $token['root_org']],
  713. ['id', '=', $item['data_id']]
  714. ])->field('id,title,file,type')->find();
  715. if (empty($find)) {
  716. $item['content_id'] = $item['data_id'];
  717. $item['title'] = '';
  718. $item['cover'] = '';
  719. $item['file_type'] = '';
  720. break;
  721. }
  722. $item['content_id'] = $find['id'];
  723. $item['title'] = $find['title'];
  724. $item['cover'] = $find['file'];
  725. $item['file_type'] = $find['type'];
  726. break;
  727. default:
  728. break;
  729. }
  730. }
  731. if (!empty($param['keyword'])) {
  732. foreach ($data as $key => $item) {
  733. if (stripos($item['title'], $param['keyword']) == false) {
  734. unset($data[$key]);
  735. }
  736. }
  737. }
  738. $sort = array_column($data, $field);
  739. $order == 'desc' ? array_multisort($sort, SORT_DESC, $data) : array_multisort($sort, SORT_ASC, $data);
  740. $data = array_slice($data, ($param['page'] - 1) * $param['limit'], $param['limit']);
  741. return json(['code' => 0, 'data' => $data]);
  742. }
  743. /**
  744. * 分享任务内容展示详情
  745. */
  746. public function article_details()
  747. {
  748. $id = $this->request->param('id');
  749. $token = $this->request->token;
  750. $where = [
  751. ['root_id', '=', $token['root_org']],
  752. ['employee_id', '=', $token['employee_id']],
  753. ['id', '=', $id]
  754. ];
  755. $data = AgentArticle::where($where)->field('id,title,file,content,talkskill,type')->find();
  756. return json(['code' => 0, 'data' => $data]);
  757. }
  758. /**
  759. * 审核分享记录列表
  760. * type:Article文章、Video视频、MaterialCase案例、CompanyStrength实力、MaterialEvidence客户好评、Building楼盘、AgentArticle业务员上传
  761. */
  762. public function share_list()
  763. {
  764. //内容id
  765. $article_id = $this->request->param('id');
  766. //类型来源
  767. $type = $this->request->param('type');
  768. $token = $this->request->token;
  769. $where = [
  770. ['root_id', '=', $token['root_org']],
  771. ['employee_id', '=', $token['employee_id']],
  772. ['article_id', '=', $article_id],
  773. ['status', '=', 0],
  774. ['type', '=', $type]
  775. ];
  776. $data = AgentShareLog::with(['user', 'agentUser'])->where($where)->field('id,employee_id,uid,img,addtime,remarks')->order('addtime desc')->select()->toArray();
  777. return json(['code' => 0, 'data' => $data]);
  778. }
  779. /**
  780. * 员工下面所有经纪人分享记录列表
  781. */
  782. public function allshare_list()
  783. {
  784. $param = $this->request->only(['page' => 1, 'limit' => 10]);
  785. $token = $this->request->token;
  786. $where = [
  787. ['root_id', '=', $token['root_org']],
  788. ['employee_id', '=', $token['employee_id']],
  789. ['status', '=', 0]
  790. ];
  791. $data = AgentShareLog::with(['user', 'agentUser'])->where($where)->field('id,employee_id,uid,img,addtime,remarks')->page($param['page'], $param['limit'])->order('addtime desc')->select()->toArray();
  792. foreach ($data as $key => $val) {
  793. $data[$key]['type_name'] = AgentType::where([['root_id', '=', $token['root_org']], ['id', '=', $val['type']]])->value('type_name');
  794. }
  795. return json(['code' => 0, 'data' => $data]);
  796. }
  797. /**
  798. * 审核分享记录
  799. */
  800. public function validate_share()
  801. {
  802. $share_id = $this->request->param('share_id');
  803. $status = $this->request->param('status');
  804. $token = $this->request->token;
  805. // $token['employee_id'] = 4165;
  806. // $token['root_org'] = 994;
  807. $where = [
  808. ['root_id', '=', $token['root_org']],
  809. ['employee_id', '=', $token['employee_id']],
  810. ['id', '=', $share_id],
  811. ['status', '=', 0]
  812. ];
  813. $log = AgentShareLog::where($where)->find();
  814. if (empty($log)) {
  815. return json(['code' => 1, 'msg' => '分享记录已被审核']);
  816. } else {
  817. //审核通过增加积分
  818. if ($status == 1) {
  819. $agent = AgentUser::where(['uid' => $log['uid'], 'root_id' => $token['root_org']])->field('id,type')->find();
  820. //$type = $agent['type'] == 1 ? 'ptagentshare_integral' : 'whagentshare_integral';
  821. $type = 'ptagentshare_integral';
  822. $rule = AgentType::where([['root_id', '=', $token['root_org']], ['id', '=', $agent['type']]])->find();
  823. $rule_list = !empty($rule['count']) ? json_decode($rule['count'], true) : '';
  824. $jifen = !empty($rule_list) ? $rule_list[$type] : 0;
  825. //$jifen = CreditsSetting::where(['code' => $type, 'root_id' => $token['root_org']])->value('value');
  826. if (!empty($jifen)) {
  827. // switch($log['type']){
  828. // case 'Article':
  829. // $new = new Article();
  830. // $field = 'title';
  831. // break;
  832. // case 'Video':
  833. // $new = new Video();
  834. // $field = 'title';
  835. // break;
  836. // case 'MaterialCase':
  837. // $new = new MaterialCase();
  838. // $field = 'title';
  839. // break;
  840. // case 'CompanyStrength':
  841. // $new = new CompanyStrength();
  842. // $field = 'title';
  843. // break;
  844. // case 'MaterialEvidence':
  845. // $new = new MaterialEvidence();
  846. // $field = 'title';
  847. // break;
  848. // case 'Building':
  849. // $new = new Building();
  850. // $field = 'name';
  851. // break;
  852. // case 'AgentArticle':
  853. // $new = new AgentArticle();
  854. // $field = 'title';
  855. // break;
  856. // default:
  857. // break;
  858. // }
  859. // $model = $new;
  860. // $title = $model->where('id', $log['article_id'])->find();
  861. $add = [
  862. 'agent_id' => $agent['id'],
  863. 'type' => 5,
  864. 'integral' => $jifen,
  865. 'addtime' => time(),
  866. //'state' => '审核《'.$title[$field].'》上传记录',
  867. 'state' => '审核上传记录',
  868. 'customer_id' => NULL
  869. ];
  870. AgentIntegral::insert($add);
  871. $log->score = $jifen;
  872. }
  873. }
  874. $log->status = $status == 1 ? 1 : 2;
  875. $log->verify_time = time();
  876. $log->save();
  877. return json(['code' => 0, 'msg' => '审核成功']);
  878. }
  879. }
  880. /**
  881. * 分享内容开关键
  882. */
  883. public function disable($id)
  884. {
  885. $token = $this->request->token;
  886. $where = [
  887. ['root_id', '=', $token['root_org']],
  888. ['employee_id', '=', $token['employee_id']],
  889. ['id', '=', $id]
  890. ];
  891. $data = AgentShareContent::where($where)->field('disable')->find();
  892. $data->disable = $data['disable'] == 1 ? 0 : 1;
  893. $data->save();
  894. return json(['code' => 0, 'msg' => '操作成功']);
  895. }
  896. /**
  897. * 业务员端获取线索列表来自经纪人分享
  898. * state:0、1、2
  899. * phone:has、hasno
  900. * getDate:Y-m-d
  901. */
  902. public function clue_list($page, $limit, $getDate = '', $state = '', $phone = '')
  903. {
  904. $token = $this->request->token;
  905. $count = [
  906. 'count_clue' => 0,
  907. 'creat_clue' => 0,
  908. 'day_clue' => 0
  909. ];
  910. //总线索
  911. $count['count_clue'] = CustomerClue::where([['employee_id', '=', $token['employee_id']], ['agent_id', '>', 0]])->count();
  912. //已建档
  913. $count['creat_clue'] = CustomerClue::where([['employee_id', '=', $token['employee_id']], ['agent_id', '>', 0], ['state', '=', 1]])->count();
  914. //今日线索
  915. $count['day_clue'] = CustomerClue::where([['employee_id', '=', $token['employee_id']], ['agent_id', '>', 0], ['addtime', 'between', [date('Y-m-d 00:00:00'), date('Y-m-d 23:59:59')]]])->count();
  916. $condition = [
  917. ['employee_id', '=', $token['employee_id']],
  918. ['agent_id', '>', 0],
  919. //['pipe_type', '=', 'agentArticle']
  920. ];
  921. if (isset($state)) $condition[] = ['state', '=', $state];
  922. if (!empty($getDate)) $condition[] = ['addtime', 'like', $getDate . '%'];
  923. if ($phone == 'has') $condition[] = ['phone', 'not null', ''];
  924. elseif ($phone == 'hasno') $condition[] = ['phone', 'null', ''];
  925. $data = CustomerClue::field('id,uid,phone,addtime,updatetime,state')->with(['user'])->withCount(['subscribe' => function ($query) use ($token) {
  926. $query->where('root_id', $token['root_org']);
  927. }, 'footprints'])->where($condition)->order('updatetime desc')->page($page, $limit)->select();
  928. foreach ($data as $k => $v) {
  929. $data[$k]['updatetime'] = $v['updatetime'] ? explode(' ', $v['updatetime']) : explode(' ', $v['addtime']);
  930. }
  931. return json(['code' => 0, 'msg' => '获取成功', 'data' => ['count' => $count, 'data' => $data]]);
  932. }
  933. /**
  934. * 员工设置内容为分享任务
  935. * type:Article文章、Video视频、MaterialCase案例、CompanyStrength实力、MaterialEvidence客户好评、Building楼盘
  936. */
  937. public function set_share_content($content_id, $type)
  938. {
  939. $token = $this->request->token;
  940. $data = AgentShareContent::where(['root_id' => $token['root_org'], 'employee_id' => $token['employee_id'], 'data_id' => $content_id, 'type' => $type])->find();
  941. if (!empty($data)) {
  942. $data->delete();
  943. return json(['code' => 0, 'msg' => '已取消任务']);
  944. } else {
  945. AgentShareContent::create(['root_id' => $token['root_org'], 'employee_id' => $token['employee_id'], 'data_id' => $content_id, 'type' => $type]);
  946. return json(['code' => 0, 'msg' => '设置成功']);
  947. }
  948. }
  949. }