Employee.php 54 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244
  1. <?php
  2. namespace app\sys\controller;
  3. use app\event\Msg;
  4. use app\logics\EmployeeLogic;
  5. use app\logics\GrantLogic;
  6. use app\logics\OrgLogic;
  7. use app\model\AgentUser;
  8. use app\model\Company;
  9. use app\model\Customer;
  10. use app\model\CustomerClue;
  11. use app\model\CustomerVisitLog;
  12. use app\model\DesignerReserve;
  13. use app\model\EmployeeCard;
  14. use app\model\MaterialCase;
  15. use app\model\User;
  16. use think\facade\View;
  17. use app\model\Employee as EmployeeModel;
  18. use app\model\EmployeeWorkWx;
  19. use app\model\Miniprogram;
  20. use wx\Oplatform;
  21. use wx\work\Work;
  22. use app\model\Org;
  23. use app\model\UserSignLog;
  24. use think\exception\HttpException;
  25. use app\model\EmployeeMsg;
  26. use app\model\UserCollect;
  27. use app\model\Credits;
  28. use app\model\CreditsLog;
  29. use app\model\Designer;
  30. use think\facade\Db;
  31. use think\facade\Request;
  32. use app\model\Talkskill;
  33. use app\model\TalkskillComment;
  34. use app\model\Building;
  35. use app\model\ShortUrl;
  36. use app\model\Setting;
  37. use app\model\OperateLog;
  38. use app\model\Wechat;
  39. use wx\miniprogram\Qrcode;
  40. use app\model\CustomerInvalidLog;
  41. use toolkits\Aec;
  42. use app\model\FishData;
  43. class Employee
  44. {
  45. /**
  46. * 面板
  47. */
  48. public function index()
  49. {
  50. return View::fetch();
  51. }
  52. /**
  53. * 员工邀请
  54. */
  55. public function invite()
  56. {
  57. $id = request()->employee['root_id'];
  58. //不同开放平台小程序判断
  59. $mini = appletConfiguration();
  60. //薛鹊开放平台web应用 先不推,所以先使用旧的 这1行以后要注释
  61. // if ($mini['name']=='装修宝mini') {
  62. if (false) {
  63. $employee_qr = Setting::where([['root_id','=',$id],['state','=',1],['name','=','employeeQrcode']])->findOrEmpty();
  64. $manager_qr = Setting::where([['root_id','=',$id],['state','=',1],['name','=','managerQrcode']])->findOrEmpty();
  65. $employee_qr = $employee_qr->isEmpty() ? $this->createQrcode('employee') : $employee_qr->content;
  66. $manager_qr = $manager_qr->isEmpty() ? $this->createQrcode('manager') : $manager_qr->content;
  67. if($employee_qr===false || $manager_qr===false) return View::display('<script>alert("暂未配置小程序");</script>');
  68. $employee_qr = 'https://' . config('app.ali_oss_bindurl') . '/' . $employee_qr;
  69. $manager_qr = 'https://' . config('app.ali_oss_bindurl') . '/' . $manager_qr;
  70. }else{
  71. $miniprogram = Miniprogram::where('root_id', $id)->findOrEmpty();
  72. if ($miniprogram->isEmpty()) {
  73. return View::display('<script>alert("暂未配置小程序");</script>');
  74. }
  75. $employee_qr = $miniprogram->employee_qr;
  76. $manager_qr = $miniprogram->manager_qr;
  77. }
  78. View::assign('managerQr', $manager_qr);
  79. View::assign('employeeQr', $employee_qr);
  80. return View::fetch();
  81. }
  82. /**
  83. * 生成员工店面邀请码
  84. */
  85. private function createQrcode($type)
  86. {
  87. $id = request()->employee['root_id'];
  88. $mini = appletConfiguration();
  89. $info = Wechat::where('appid',$mini['mini']['appid'])->find();
  90. // 邀请二维码生成
  91. $miniQr = new Qrcode();
  92. // 1)管理员二维码
  93. $qr = $miniQr->getUnlimited($info->accesstoken, [
  94. 'scene' => $type.'=' . $id,
  95. 'page' => 'mycustomer/pages/invite/invite',
  96. 'width' => '280px',
  97. 'check_path' => false
  98. ]);
  99. $rs = json_decode($qr, true);
  100. if (!is_null($rs)) {
  101. trace($rs, 'error');
  102. return false;
  103. }
  104. $managerQr = 'invite' . DIRECTORY_SEPARATOR . uniqid() . '.jpeg';
  105. ossContentUpload($managerQr, $qr);
  106. Setting::insertGetId([
  107. 'root_id'=>$id,
  108. 'state'=>1,
  109. 'name'=>$type.'Qrcode',
  110. 'content'=>$managerQr
  111. ]);
  112. return $managerQr;
  113. }
  114. public function list()
  115. {
  116. $request = request();
  117. $param = $request->param();
  118. $orgid = $request->get('orgid', $request->employee['root_id']);
  119. $condition = [];
  120. if (isset($param['verified']) && $param['verified'] == 0) {
  121. $condition[] = ['state', '=', '待审核'];
  122. $state = '待审核';
  123. } else {
  124. $state = '在职';
  125. $condition[] = ['state', '=', '在职'];
  126. }
  127. $keyword = null;
  128. if (!empty($param['keyword'])) {
  129. $keyword = trim($param['keyword'], ' ');
  130. $condition[] = ['name', 'like', '%' . $keyword . '%'];
  131. }
  132. if (isset($param['disable']) && $param['disable'] !== '') {
  133. $condition[] = ['disable', '=', $param['disable']];
  134. }
  135. // $list = EmployeeLogic::employeelist($orgid, $condition, $param['page'], $param['limit']);
  136. $org = Org::find($orgid);
  137. $orgIds = Org::where([['path', 'like', $org->path . '%']])->column('id');
  138. $condition[] = ['org_id', 'in', $orgIds];
  139. $condition[] = ['uid', '<>', 0];
  140. $empObjList = EmployeeModel::where($condition)->with(['org', 'grant', 'user'])->order('org_id asc, is_manager desc')->page($param['page'], $param['limit'])->select();
  141. $list = $empObjList->visible([
  142. 'id','user.headimgurl', 'name','org.info','disable', 'is_manager', 'last_login_time', 'state', 'empcrm_disable', 'community_disable', 'clue_disable'
  143. // ,'empcrm_disable', 'community_disable', 'clue_disable', 'weworksingle_uid', 'grant.name'
  144. ])->toArray();
  145. foreach ($list as $k => $v) {
  146. $list[$k]['user']['headimgurl'] = $v['user'] ?$v['user']['headimgurl']: 'https://thirdwx.qlogo.cn/mmopen/vi_32/4cjgCtJ67wtIU56FIgcwQkcYIjvwBEEichSbRVIMqo9FEuHXwTibYkGnJ0VqQW2esdLJwXo4Bad4Gp2czGPVZWCw/132';
  147. }
  148. $count = EmployeeModel::where($condition)->count();
  149. return json(['code' => 0, 'data' => $list, 'count' => $count]);
  150. }
  151. public function grant()
  152. {
  153. $employeeid = input('employeeid');
  154. View::assign('employeeid', $employeeid);
  155. $grantlist = GrantLogic::grantselectorlist();
  156. View::assign('grantlist', $grantlist);
  157. return View::fetch();
  158. }
  159. public function grantlink()
  160. {
  161. $param = input();
  162. $employeeid = $param['employeeid'];
  163. $grantid = $param['grantid'];
  164. if (EmployeeLogic::linkgrant($employeeid, $grantid)) {
  165. return ['code' => 0, 'msg' => '权限关联成功'];
  166. } else {
  167. return ['code' => 1, 'msg' => '权限关联失败'];
  168. }
  169. }
  170. public function delete()
  171. {
  172. $employee_id = input('empid');
  173. if (EmployeeLogic::delete($employee_id)) {
  174. return json(['code' => 0, 'msg' => '删除成功']);
  175. } else {
  176. return json(['code' => 1, 'msg' => '删除失败']);
  177. }
  178. }
  179. public function details()
  180. {
  181. $employeeid = input('employeeid');
  182. View::assign('employeeid', $employeeid);
  183. $data = EmployeeModel::where('id', $employeeid)->with(['org', 'grant', 'user'])->find();
  184. $data['phone'] = substr_replace($data['phone'], '******', 3, 6);
  185. View::assign('data', $data);
  186. $employee_card = EmployeeCard::where('employee_id', '=', $employeeid)->find();
  187. View::assign('employee_card', $employee_card);
  188. return View::fetch();
  189. }
  190. /**
  191. * 更新员工手机号
  192. */
  193. public function set_phone()
  194. {
  195. $param = Request::only(['employee_id', 'phone']);
  196. if (!preg_match("/^1[3456789]\d{9}$/", $param['phone'])) {
  197. return ['code' => 1, 'msg' => '手机号码格式不正确'];
  198. }
  199. $find = EmployeeModel::where(['id' => $param['employee_id'], 'root_id' => request()->employee->root_id])->find();
  200. if (empty($find)) {
  201. return ['code' => 1, 'msg' => '未查询到员工信息'];
  202. }
  203. $aec = new Aec(config('app.aec_key'), config('app.aec_iv'));
  204. $phone = $aec->encrypt($param['phone']);
  205. $empCount = EmployeeModel::whereOr([
  206. [['phone', '=', $phone], ['root_id', '=', request()->employee->root_id], ['uid', '<>', 0], ['state', 'in', ['在职']]],
  207. [['phone', '=', $phone], ['root_id', '=', request()->employee->root_id], ['grant_id', '>', 0]]
  208. ])->count();
  209. if ($empCount > 0) {
  210. return json(['code' => 1, 'msg' => '手机号已存在']);
  211. }
  212. $result = $find->save(['phone' => $param['phone']]);
  213. if ($result) {
  214. return ['code' => 0, 'msg' => '操作成功', 'data' => substr_replace($param['phone'], '******', 3, 6)];
  215. } else {
  216. return ['code' => 1, 'msg' => '操作失败'];
  217. }
  218. }
  219. /**
  220. * 保存形象照和微信
  221. */
  222. public function save_card()
  223. {
  224. $employee_id = input('employee_id', '', 'intval');
  225. $param = Request::only(['wx', 'image_photo', 'position']);
  226. $find = EmployeeModel::where('id', '=', $employee_id)->find();
  227. $result = $find->save($param);
  228. if (!empty($param['image_photo'])) {
  229. Designer::where('employee_id', '=', $employee_id)->save(['headimgurl' => $param['image_photo']]);
  230. }
  231. if ($result) {
  232. return ['code' => 0, 'msg' => '操作成功'];
  233. } else {
  234. return ['code' => 1, 'msg' => '操作失败'];
  235. }
  236. }
  237. public function hr()
  238. {
  239. /** 部门跳转 */
  240. $employeeid = input('employeeid');
  241. View::assign('employeeid', $employeeid);
  242. $data = EmployeeModel::where(['id' => $employeeid, 'root_id' => request()->employee->root_id])->with(['org'])->find();
  243. if (empty($data)) throw new HttpException(404, '数据不存在');
  244. View::assign('data', $data);
  245. View::assign('currentEmpOrg', $data->org);
  246. $org = Org::where([['path', 'like', request()->employee->root_id . '-%']])->field('id,name,level,org_type')->order('path')->select();
  247. View::assign('depart', $org);
  248. /** 离职交接 */
  249. // 同部门人员查找
  250. $orgEmployee = EmployeeModel::field('id,name')->where([['org_id', '=', $data->org_id], ['state', '=', '在职'], ['id', '<>', $employeeid], ['root_id', '=', request()->employee->root_id], ['uid', '<>', 0]])->select();
  251. View::assign('employeelist', $orgEmployee);
  252. // 该部门以上部门获取
  253. $orgPath = Org::where('id', $data->org_id)->value('path');
  254. $prevOrg = Org::field('id,name')->where([['id', 'in', explode('-', $orgPath)]])->select();
  255. View::assign('prevOrg', $prevOrg);
  256. return View::fetch();
  257. }
  258. /**
  259. * 2022-10-28 判断是否存在重复客户
  260. * $id 要转移/离职 的业务员
  261. * $eid 接受的业务员
  262. * 该员工名下客户“客户名称”为重复客户,是否继续交接不重复客户(3个)
  263. */
  264. private function checkRepeat($id,$eid){
  265. //判断客户重复
  266. $phone = Customer::where('employee_id',$eid)->column('phone,phone1,phone2');
  267. $phones = [];
  268. foreach ($phone as $v) {
  269. $phones = array_merge($phones,$v);
  270. }
  271. $phones = array_filter($phones);
  272. $cid = Customer::where('employee_id',$id)->column('id,name,phone,phone1,phone2');
  273. $repeat = $no_repeat = [];
  274. foreach ($cid as $v2) {
  275. $l_phone = array_filter([$v2['phone'],$v2['phone1'],$v2['phone2']]);
  276. array_intersect($phones,$l_phone) ? $repeat[] = $v2['name'] : $no_repeat[] = $v2['id'];
  277. }
  278. $data['repeat_count'] = count($repeat);
  279. $data['repeat'] = $repeat ? implode(',',$repeat) : '';
  280. $data['no_repeat'] = count($no_repeat);
  281. return json(['code' => 0, 'data'=>$data]);
  282. }
  283. public function apiChangeDepartment()
  284. {
  285. $request = request();
  286. $params = $request->param();
  287. if (!isset($params['empid']) || !isset($params['orgid'])) return json(['code' => 1, 'msg' => '异常请求']);
  288. if ($params['way'] == 2) {
  289. if (empty($params['recipient'])) {
  290. return json(['code' => 1, 'msg' => '请选择部门接收人']);
  291. }
  292. if (empty($params['assign_emp'])) {
  293. return json(['code' => 1, 'msg' => '请选择指派客户接收人']);
  294. }
  295. }
  296. //检测是否重复
  297. if(!empty($params['repeat']) && !empty($params['recipient'])) return $this->checkRepeat($params['empid'],$params['recipient']);
  298. $newdata = [];
  299. $newdata['org_id'] = $params['orgid'];
  300. if (isset($params['therole'])) {
  301. $newdata['role'] = $params['therole'];
  302. }
  303. $newdata['is_manager'] = isset($params['is_manager']) && $params['is_manager'] == 1 ? 1 : 0;
  304. $employee = EmployeeModel::where([['id', '=', $params['empid']], ['root_id', '=', $request->employee->root_id]])->find();
  305. if (empty($employee)) return json(['code' => 1, 'msg' => '数据不存在']);
  306. // 部门跨属性部门进行转移
  307. // $orgTypes = Org::where([['id', 'in', [$employee->org_id, $newdata['org_id']]]])->group('org_type')->column('org_type');
  308. // if (count($orgTypes) > 1 && in_array(2, $orgTypes)) return json(['code' => 1, 'msg' => '只能调整到相同属性的部门']);
  309. Db::startTrans();
  310. try {
  311. //更新是否管理层
  312. $employee->save(['is_manager'=>$newdata['is_manager']]);
  313. // 客户交接方式
  314. if ($params['way'] == 1 && $newdata['org_id'] != $employee->org_id) {
  315. // 更新业务员下级推广员关联的部门
  316. AgentUser::where(['root_id' => $request->employee->root_id, 'agent_employee_id' => $employee->id])->update(['org_id' => $newdata['org_id']]);
  317. // 更新客户所属部门
  318. Customer::where(['employee_id' => $employee->id])->update(['org_id' => $newdata['org_id']]);
  319. // 更新属于这个员工的跟踪记录
  320. CustomerVisitLog::where('employee_id', '=', $employee->id)->update(['org_id' => $newdata['org_id'],'customer_org_id'=>$newdata['org_id']]);
  321. //更新属于这个员工的线索量(带走)
  322. CustomerClue::where('employee_id', '=', $employee->id)->update(['org_id' => $newdata['org_id']]);
  323. $employee->save($newdata);
  324. //更新飞鱼线索
  325. FishData::where(['employee_id' => $employee->id])->update(['org_id' => $newdata['org_id']]);
  326. } elseif ($params['way'] == 2) {
  327. $cids = Customer::where(['employee_id' => $employee->id])->column('id,phone,phone1,phone2');
  328. $orgids = orgSubIds($request->employee->root_id);
  329. $assign_list = Customer::where([['assigned_personnel', 'find in set', $employee->id], ['org_id', 'in', $orgids]])->select()->toArray();
  330. $designer_have = Customer::where([['designer_id', '=', $employee->id], ['org_id', 'in', $orgids]])->count();
  331. // 留客户在原部门中
  332. if (empty($params['recipient']) && !empty($cids)) {
  333. return json(['code' => 1, 'msg' => '请选择部门接收人']);
  334. }
  335. if (!empty($params['recipient'])) {
  336. $recipient = EmployeeModel::where(['id' => $params['recipient'], 'org_id' => $employee->org_id])->find();
  337. if (empty($recipient) && !empty($cids)) return json(['code' => 1, 'msg' => '请选择部门接收人']);
  338. }
  339. if (empty($params['assign_emp']) && (!empty($assign_list) || !empty($designer_have))) {
  340. return json(['code' => 1, 'msg' => '请选择指派客户接收人']);
  341. }
  342. if (!empty($params['assign_emp'])) {
  343. $assign = EmployeeModel::where(['id' => $params['assign_emp'], 'org_id' => $employee->org_id])->find();
  344. if (empty($assign) && (!empty($assign_list) || !empty($designer_have))) return json(['code' => 1, 'msg' => '请选择指派客户接收人']);
  345. }
  346. // 更新业务员的经纪人为新交接员工
  347. AgentUser::where(['root_id' => $request->employee->root_id, 'agent_employee_id' => $employee->id])->update(['agent_employee_id' => $recipient->id]);
  348. //判断客户重复
  349. $phone = Customer::where('employee_id',$recipient->id)->column('phone,phone1,phone2');
  350. $phones = [];
  351. foreach ($phone as $v) {
  352. $phones = array_merge($phones,$v);
  353. }
  354. $phones = array_filter($phones);
  355. $repeat = $no_repeat = [];
  356. foreach ($cids as $v2) {
  357. $l_phone = array_filter([$v2['phone'],$v2['phone1'],$v2['phone2']]);
  358. array_intersect($phones,$l_phone) ? $repeat[] = $v2['id'] : $no_repeat[] = $v2['id'];
  359. }
  360. //不重复的可以迁移
  361. if ($no_repeat) {
  362. Customer::where([['id','in',$no_repeat]])->update(['employee_id' => $recipient->id,'employee_time' => date('Y-m-d H:i:s', time())]);
  363. //更新属于这个员工的线索量(带走)
  364. CustomerClue::where('employee_id', '=', $employee->id)->update(['org_id' => $employee->org_id]);
  365. //交接跟进记录中的customer_employee_id为新员工的id
  366. CustomerVisitLog::where([['customer_id','in',$no_repeat]])->update(['customer_employee_id'=>$recipient->id]);
  367. //处理无效的客户的员工id为新员工的id
  368. CustomerInvalidLog::where([['employee_id','=',$employee->id],['root_id','=',$employee->root_id]])->update(['employee_id'=>$recipient->id]);
  369. }
  370. // 指派的客户处理
  371. foreach ($assign_list as $k => $v) {
  372. $assign_personal = explode(',', $v['assigned_personnel']);
  373. $assign_personal = array_diff($assign_personal, [$employee->id]);
  374. $assign_personal[] = $params['assign_emp'];
  375. $assign_personal = array_unique($assign_personal);
  376. Customer::where('id', $v['id'])->save(['assigned_personnel'=> implode(',', $assign_personal)]);
  377. }
  378. // 设计师变更
  379. Customer::where([['designer_id', '=', $employee->id], ['org_id', 'in', $orgids]])->save(['designer_id'=> $params['assign_emp']]);
  380. //如果没有重复才能变更部门
  381. $res = true;
  382. if(empty($repeat)){
  383. $res = false;
  384. $employee->save($newdata);
  385. }
  386. // 更新交接客户
  387. // Customer::where(['employee_id' => $employee->id])->update(['org_id' => $recipient->org_id, 'employee_id' => $recipient->id, 'employee_time' => date('Y-m-d H:i:s', time())]);
  388. //更新飞鱼线索
  389. $targetName = EmployeeModel::where(['id' => $recipient->id])->value('name');
  390. FishData::where(['employee_id' => $employee->id])->update(['org_id' => $recipient->org_id,'employee_id' => $recipient->id, 'clue_owner_name' => $targetName]);
  391. }
  392. Db::commit();
  393. } catch (\Exception $e) {
  394. trace($e->getMessage(), 'error');
  395. // 回滚事务
  396. Db::rollback();
  397. return json(['code' => 1, 'msg' => $e->getMessage()]);
  398. }
  399. if($params['way'] == 2 && $res==true) {
  400. return json(['code' => 0, 'msg' => '已交接' . count($no_repeat) . '个客户,' . count($assign_list) . '个被指派客户,剩余' . count($repeat) . '个客户。请选择其他人员交接']);
  401. }
  402. if ($request->employee->id == $params['empid']) session('employee', $employee);
  403. event(new Msg($params['empid'], '您的部门岗位发生变动,请知晓!', 'apiChangeDepartment'));
  404. return json(['code' => 0, 'msg' => '部门调整成功']);
  405. }
  406. public function apiQuitHandling()
  407. {
  408. $request = request();
  409. $params = $request->param();
  410. if (!isset($params['empid'])) return false;
  411. if (!isset($params['target_employee_id']) || $params['target_employee_id'] == 0) return json(['code' => 1, 'msg' => '必须选择交接人']);
  412. //检测重复客户
  413. if(!empty($params['repeat']) && !empty($params['target_employee_id'])) return $this->checkRepeat($params['empid'],$params['target_employee_id']);
  414. // 检测接收人和离职人是否再同一企业
  415. $check = EmployeeModel::where([['id', 'in', [$params['target_employee_id'], $params['empid']]], ['root_id', '=', $request->employee->root_id], ['state', '=', '在职']])->count();
  416. if ($check != 2) return json(['code' => 1, 'msg' => '交接失败']);
  417. $info = EmployeeModel::where('id', $params['empid'])->value('state');
  418. if($info=='离职') return json(['code' => 1, 'msg' => '人员已离职']);
  419. Db::startTrans();
  420. try {
  421. //
  422. //$targetArr = EmployeeModel::find($params['target_employee_id'])->toArray();
  423. //handle customers
  424. //接收人 和 接受人的客户
  425. $targetOrg = EmployeeModel::where(['id' => $params['target_employee_id']])->value('org_id');
  426. $phone = Customer::where('employee_id',$params['target_employee_id'])->column('phone,phone1,phone2');
  427. $phones = [];
  428. foreach ($phone as $v) {
  429. $phones = array_merge($phones,$v);
  430. }
  431. $phones = array_filter($phones);
  432. //离职人员的客户
  433. $cids = Customer::where(['employee_id' => $params['empid']])->column('id,phone,phone1,phone2');
  434. $repeat = $no_repeat = [];
  435. foreach ($cids as $v2) {
  436. $l_phone = array_filter([$v2['phone'],$v2['phone1'],$v2['phone2']]);
  437. array_intersect($phones,$l_phone) ? $repeat[] = $v2['id'] : $no_repeat[] = $v2['id'];
  438. }
  439. //不重复的可以迁移
  440. if ($no_repeat) {
  441. $ori_info_arr = [
  442. //'uid' => $item->uid,
  443. 'employee_id' => $params['empid']
  444. ];
  445. Customer::where([['id','in',$no_repeat]])->update([
  446. 'employee_id' => $params['target_employee_id'],
  447. 'org_id' => $targetOrg,
  448. //'uid' => (isset($targetArr['uid'])) ? $targetArr['uid'] : NULL,
  449. 'changed_ori_info' => json($ori_info_arr),
  450. 'employee_time' => date('Y-m-d H:i:s', time())
  451. ]);
  452. //交接线索
  453. }
  454. //交接跟进记录中的customer_employee_id为新员工的id
  455. CustomerVisitLog::where([['customer_id', 'not in', $repeat], ['customer_employee_id', '=', $params['empid']]])->update(['customer_employee_id'=> $params['target_employee_id'], 'customer_org_id'=> $targetOrg]);
  456. //如果没有重复才能变更部门
  457. if(empty($repeat)){
  458. if (!EmployeeModel::where('id', $params['empid'])->update(['state' => '离职', 'left_to_empid' => $params['target_employee_id'], 'is_manager' => 0, 'verified' => 0])) {
  459. return json(['code' => 1, 'msg' => '人员不存在,或离职状态未更改']);
  460. }
  461. //交接人的客户
  462. $old_data = Customer::where(['employee_id' => $params['empid']])->select();
  463. foreach ($old_data as $item) {
  464. $ori_info_arr = [
  465. //'uid' => $item->uid,
  466. 'employee_id' => $item->employee_id
  467. ];
  468. Customer::where(['id' => $item->id])->update([
  469. 'employee_id' => $params['target_employee_id'],
  470. 'org_id' => $targetOrg,
  471. //'uid' => (isset($targetArr['uid'])) ? $targetArr['uid'] : NULL,
  472. 'changed_ori_info' => json($ori_info_arr),
  473. 'employee_time' => date('Y-m-d H:i:s', time())
  474. ]);
  475. }
  476. //handle customer clue
  477. // 指派给设计师的客户交接
  478. $designer_data = Customer::where(['designer_id' => $params['empid']])->select();
  479. foreach ($designer_data as $item) {
  480. Customer::where(['id' => $item->id])->update([
  481. 'designer_id' => $params['target_employee_id']
  482. ]);
  483. }
  484. // 共享指派客户交接
  485. $assigned_personnel_data = Customer::where([['assigned_personnel', 'find in set', $params['empid']]])->select();
  486. foreach ($assigned_personnel_data as $item) {
  487. $arr = explode(',',$item['assigned_personnel']);
  488. $arr = str_replace($params['empid'], $params['target_employee_id'], $arr);
  489. Customer::where(['id' => $item->id])->update([
  490. 'assigned_personnel' => implode(',',$arr)
  491. ]);
  492. }
  493. //删除签到记录
  494. $info = EmployeeModel::where('id', $params['empid'])->find()->toarray();
  495. $d_where[] = ['user_id', '=', $info['uid']];
  496. $d_where[] = ['root_id', '=', $info['root_id']];
  497. UserSignLog::where($d_where)->delete();
  498. // 1、我的话术清空(我提问的、我回答的、我共享的),不交接给交接人
  499. // 2、之前回答的问题,回答的记录不清除,回答人的名称改为“匿名用
  500. // 3、我的收藏清空
  501. $d_where2[] = ['user_id', '=', $info['uid']];
  502. UserCollect::where($d_where2)->delete();
  503. // 4、系统消息清空
  504. // $d_where1[] = ['type','=','system_msg_'.$info['root_id']];
  505. $d_where1[] = ['employee_id', '=', $params['empid']];
  506. EmployeeMsg::where($d_where1)->delete();
  507. //5贡献值积分清空
  508. $d_where3[] = ['root_id', '=', $info['root_id']];
  509. $d_where3[] = ['employee_id', '=', $params['empid']];
  510. Credits::where($d_where3)->delete();
  511. CreditsLog::where($d_where3)->delete();
  512. // 设计师离职,关联装修案例清空
  513. $employee = EmployeeModel::where('id', $params['empid'])->find();
  514. $org_type = Org::where('id', $employee['org_id'])->value('org_type');
  515. if ($org_type == 2) {
  516. MaterialCase::where([['root_id', '=', $employee['root_id']], ['designer_id', '=', $params['empid']]])->save(['designer_id' => 0]);
  517. }
  518. //楼盘离职交接
  519. $building = Building::where('employee_id', $params['empid'])->column('id');
  520. Building::where([['id', 'in', $building]])->update(['employee_id' => $params['target_employee_id'], 'handover_employee_id' => $params['empid']]);
  521. //交接拓客案例
  522. $matcase_list = MaterialCase::where(['employee_id' => $params['empid'], 'root_id' => $request->employee->root_id])->column('id');
  523. MaterialCase::where([['id', 'in', $matcase_list]])->update(array('employee_id' => $params['target_employee_id'], 'handover_empid' => $params['empid']));
  524. //交接话术(我共享的,我回答的,我提问的)
  525. $talk_list = Talkskill::where([['employee_id', '=', $params['empid']], ['root_id', '=', $request->employee->root_id], ['type', 'in', ['share', 'submit']]])->column('id');
  526. Talkskill::where([['id', 'in', $talk_list]])->update(array('employee_id' => $params['target_employee_id'], 'handover_empid' => $params['empid']));
  527. $lzemp = EmployeeModel::where([['id', 'in', [$params['empid'], $params['target_employee_id']]]])->column('uid', 'id');
  528. $answer_list = TalkskillComment::where([['uid', '=', $lzemp[$params['empid']]], ['root_id', '=', $request->employee->root_id]])->column('id');
  529. TalkskillComment::where([['id', 'in', $answer_list]])->update(array('uid' => $lzemp[$params['target_employee_id']]));
  530. dataStatistics($request->employee->root_id,'emp_count',1,'dec');//manage应用首页统计数据
  531. if(Org::where('id',$info['org_id'])->value('org_type') == 2) dataStatistics($request->employee->root_id,'designer_count',1,'dec');//manage应用首页统计数据
  532. //处理无效的客户的员工id为新员工的id
  533. CustomerInvalidLog::where([['employee_id','=',$params['empid']],['root_id','=',$request->employee->root_id]])->update(['employee_id'=>$params['target_employee_id']]);
  534. //更新飞鱼线索
  535. $targetName = EmployeeModel::where(['id' => $params['target_employee_id']])->value('name');
  536. FishData::where(['employee_id' => $params['empid']])->update(['org_id' => $targetOrg, 'employee_id' => $params['target_employee_id'],'clue_owner_name' => $targetName]);
  537. }
  538. Db::commit();
  539. } catch (\Exception $e) {
  540. trace($e->getMessage(), 'error');
  541. // 回滚事务
  542. Db::rollback();
  543. return json(['code' => 1, 'msg' => $e->getMessage()]);
  544. }
  545. if($repeat) return json(['code' => 1, 'msg' => '剩余重复客户请选择其他人员继续交接']);
  546. return json(['code' => 0, 'msg' => '处理离职完成']);
  547. }
  548. public function info()
  549. {
  550. $request = request();
  551. if (!$request->isAjax()) {
  552. $empid = $request->employee->id;
  553. $empobj = EmployeeModel::where('id', $empid)->with('user')->find();
  554. $workwx = EmployeeWorkWx::where('employee_id', $empid)->field('name')->find();
  555. $empobj['workwxname'] = !empty($workwx['name']) ? $workwx['name'] : '';
  556. View::assign('data', $empobj);
  557. // 微信登陆验证
  558. $state = rand(1000, 9999);
  559. session('login_state', $state);
  560. View::assign('state', $state);
  561. View::assign('domain', request()->domain());
  562. View::assign('appid', config('app.kfweb_appid'));
  563. //企业微信绑定参数
  564. View::assign('qywx_agentid', config('app.ays_agentid'));
  565. View::assign('qywx_state', $state);
  566. View::assign('qywx_appid', config('app.corpid'));
  567. return View::fetch();
  568. }
  569. }
  570. // /**
  571. // * 微信扫码换绑
  572. // */
  573. // public function wechat()
  574. // {
  575. // $request = request();
  576. // $code = $request->param('code');
  577. // View::assign('code', $code);
  578. // return View::display("<script>parent.bind('" . $code . "');</script>");
  579. // }
  580. // public function wxBind($code)
  581. // {
  582. // // 授权获取accesstoken
  583. // $tokendata = (new Oplatform())->getAccessToken(config('app.kfweb_appid'), config('app.kfweb_secret'), $code);
  584. // if (!$tokendata) {
  585. // trace('授权获取用户信息', 'error');
  586. // trace($tokendata, 'error');
  587. // return json(['code' => 1, 'msg' => '请求失败,请刷新页面后重试!']);
  588. // }
  589. // if (isset($tokendata['errcode'])) { // code已经被使用
  590. // if (in_array($tokendata['errcode'], [40029, 40163, 41008, 42003])) {
  591. // return json(['code' => 1, 'msg' => '请求失败,请刷新页面后重试!']);
  592. // } else {
  593. // trace('授权获取用户信息', 'error');
  594. // trace($tokendata, 'error');
  595. // return json(['code' => 1, 'msg' => $tokendata['errmsg']]);
  596. // }
  597. // }
  598. // // 拉取用户信息
  599. // $getUserInfoUrl = 'https://api.weixin.qq.com/sns/userinfo?access_token=' . $tokendata['access_token'] . '&openid=' . $tokendata['openid'] . '&lang=zh_CN';
  600. // $data = curl($getUserInfoUrl);
  601. // $data = json_decode($data, true);
  602. // if (isset($data['errcode']) || empty($data['openid'])) {
  603. // trace('拉取用户信息', 'error');
  604. // trace($data, 'error');
  605. // return json(['code' => 1, 'msg' => '请求失败']);
  606. // }
  607. // // 更新用户数据
  608. // $bindUser = User::where(['unionid' => $tokendata['unionid']])->findOrEmpty();
  609. // $updatedata = [
  610. // 'nickname' => $data['nickname'],
  611. // 'sex' => $data['sex'],
  612. // 'headimgurl' => $data['headimgurl'],
  613. // 'province' => $data['province'],
  614. // 'city' => $data['city'],
  615. // 'country' => $data['country'],
  616. // 'openid' => $data['openid'],
  617. // 'unionid' => $data['unionid'] ?? '',
  618. // ];
  619. // $bindUser->save($updatedata);
  620. // $empid = request()->employee->id;
  621. // $empobj = EmployeeModel::where('id', $empid)->find();
  622. // $user_id = $empobj->uid;
  623. // // 同一微信,换绑失败
  624. // if ($bindUser->id == $user_id) {
  625. // return json(['code' => 1, 'msg' => '换绑微信不能与已绑定微信相同!']);
  626. // }
  627. // // 换绑的微信已经绑定
  628. // $bind = EmployeeModel::where('uid', $bindUser->id)->count();
  629. // if ($bind) {
  630. // return json(['code' => 1, 'msg' => '该微信已绑定员工,换绑失败!']);
  631. // }
  632. // EmployeeModel::where('id', $empid)->save(['uid' => $bindUser->id]);
  633. // return json(['code' => 0, 'msg' => '绑定成功!']);
  634. // }
  635. public function changephone()
  636. {
  637. $request = request();
  638. $phone = $request->param('phone');
  639. $empid = $request->employee->id;
  640. if (EmployeeModel::where('id', $empid)->update(['phone' => $phone])) {
  641. return json(['code' => 0, 'msg' => '手机号更换成功']);
  642. } else {
  643. return json(['code' => 1, 'msg' => '换绑微信不能与已绑定微信相同']);
  644. }
  645. }
  646. /*
  647. * 企业微信扫码绑定
  648. */
  649. public function qywechat()
  650. {
  651. $request = request();
  652. $code = $request->param('code');
  653. $state = $request->param('state');
  654. if (session('login_state') == $state) {
  655. // 授权获取accesstoken
  656. $getUserId = (new Work(config('app.corpid'), config('app.ays_scorpsecret')))->getUserId($code);
  657. if (!$getUserId) {
  658. trace('扫码获取企业微信UserId失败', 'error');
  659. echo "<script>alert('请求失败,请刷新页面后重试!');parent.location.reload();</script>";
  660. exit;
  661. }
  662. $userInfo = (new Work(config('app.corpid'), config('app.ays_scorpsecret')))->getUserInfo($getUserId);
  663. if (!$userInfo) {
  664. trace('扫码获取企业微信信息失败', 'error');
  665. echo "<script>alert('请求失败,请刷新页面后重试!');parent.location.reload();</script>";
  666. exit;
  667. }
  668. $employee_id = $request->employee->id;
  669. $data = [
  670. 'employee_id' => $employee_id,
  671. 'userid' => $userInfo['userid'],
  672. 'name' => $userInfo['name'],
  673. 'mobile' => $userInfo['mobile'],
  674. 'department' => $userInfo['department'],
  675. 'order' => $userInfo['order'],
  676. 'position' => $userInfo['position'],
  677. 'gender' => $userInfo['gender'],
  678. 'email' => $userInfo['email'],
  679. 'is_leader_in_dept' => $userInfo['is_leader_in_dept'],
  680. 'direct_leader' => $userInfo['direct_leader'],
  681. 'avatar' => $userInfo['avatar'],
  682. 'thumb_avatar' => $userInfo['thumb_avatar'],
  683. 'telephone' => $userInfo['telephone'],
  684. 'alias' => $userInfo['alias'],
  685. 'extattr' => $userInfo['extattr'],
  686. 'status' => $userInfo['status'],
  687. 'qr_code' => $userInfo['qr_code'],
  688. 'external_profile' => isset($userInfo['external_profile']) ? $userInfo['external_profile'] : null,
  689. 'external_position' => isset($userInfo['external_position']) ? $userInfo['external_position'] : '',
  690. 'address' => isset($userInfo['address']) ? $userInfo['address'] : '',
  691. 'open_userid' => isset($userInfo['open_userid']) ? $userInfo['open_userid'] : '',
  692. 'main_department' => isset($userInfo['main_department']) ? $userInfo['main_department'] : 0,
  693. ];
  694. $workwx = EmployeeWorkWx::where('employee_id', $employee_id)->find();
  695. if (empty($workwx)) {
  696. $add = EmployeeWorkWx::create(['userid' => 'fengjixuchui']);
  697. } else {
  698. $workwx->save($data);
  699. }
  700. return redirect(url('index/index'));
  701. } else {
  702. return redirect(url('login/index'));
  703. }
  704. }
  705. public function setleader()
  706. {
  707. $request = request();
  708. $empid = $request->param('empid');
  709. $single_leader = 0;
  710. if ($single_leader) {
  711. //一个部门只能有一个领导
  712. $org_id = EmployeeModel::where('id', $empid)->value('org_id');
  713. $samelevelemps = EmployeeModel::where(['org_id' => $org_id, 'is_manager' => 1, 'role' => '领导'])->select();
  714. if (!empty($samelevelemps)) {
  715. foreach ($samelevelemps as $item) {
  716. EmployeeModel::where('id', $item['id'])->update(['is_manager' => 0]);
  717. }
  718. }
  719. }
  720. ///
  721. $leader = EmployeeModel::where(['id' => $empid, 'root_id' => $request->employee->root_id])->find();
  722. if (empty($leader)) return json(['code' => 1, 'msg' => '人员不存在']);
  723. if ($leader->save(['is_manager' => 1])) {
  724. if ($request->employee->id == $empid) {
  725. session('employee', $leader);
  726. }
  727. $orgName = Org::where(['id' => $leader->org_id])->value('name');
  728. event(new Msg($empid, '您被' . $request->employee->name . '添加为' . $orgName . '负责人身份,请知晓!', 'setleader'));
  729. return json(['code' => 0, 'msg' => '设置领导成功']);
  730. } else {
  731. return json(['code' => 1, 'msg' => '设置领导失败']);
  732. }
  733. }
  734. public function removeleader()
  735. {
  736. $request = request();
  737. $empid = $request->param('empid');
  738. ///
  739. if (EmployeeModel::where('id', $empid)->update(['is_manager' => 0, 'role' => '员工'])) {
  740. if ($request->employee->id == $empid) {
  741. $employee = EmployeeModel::where('id', $empid)->find();
  742. session('employee', $employee);
  743. }
  744. event(new Msg($empid, '您的负责人身份被' . $request->employee->name . '移除了,请知晓!', 'removeleader'));
  745. return json(['code' => 0, 'msg' => '取消领导成功']);
  746. } else {
  747. return json(['code' => 1, 'msg' => '取消领导失败']);
  748. }
  749. }
  750. public function verifypass()
  751. {
  752. $request = request();
  753. $empid = $request->param('empid');
  754. // 手机端操作,pc端未刷新的情况
  755. $thisApplyer = EmployeeModel::find($empid);
  756. if ($thisApplyer->verified == 1) {
  757. return json(['code' => 1, 'msg' => '已经处理,请刷新页面']);
  758. }
  759. //
  760. $where[] = ['root_id', '=', $request->employee->root_id];
  761. $where[] = ['id', '=', $empid];
  762. if (EmployeeModel::where($where)->update(['state' => '在职', 'left_to_empid' => NULL, 'verified' => 1])) {
  763. $companyName = Company::where(['root_id' => $request->employee->root_id])->value('company_name');
  764. event(new Msg($empid, '您的申请已经通过,欢迎来到' . $companyName . '大家庭', 'verifypass'));
  765. //审核通过短信通知
  766. $clientType = Miniprogram::where('root_id', $request->employee->root_id)->value('notify');
  767. $urldata = [
  768. 'content' => json_encode([
  769. 'client_type' => $clientType,
  770. 'path' => "/pages/index/index",
  771. 'query' => "ctp=" . $clientType,
  772. 'employee_id' => $empid
  773. ]),
  774. 'type' => 'join_company'
  775. ];
  776. $shortUrl = new ShortUrl();
  777. $shortUrl->save($urldata);
  778. // 将ID进行
  779. $query = dec52($shortUrl->id);
  780. $shortUrl->uri = $query;
  781. $shortUrl->save();
  782. sendSms($thisApplyer['phone'], $thisApplyer['name'] . "您已成功加入" . $companyName . ",请点击链接访问数字化系统https://wzh.nczyzs.com/open/" . $query);
  783. dataStatistics(request()->employee->root_id,'emp_count',1,'inc');//manage应用首页统计数据
  784. if(Org::where('id',$thisApplyer->org_id)->value('org_type') == 2) dataStatistics(request()->employee->root_id,'designer_count',1,'inc');//设计师数量
  785. return json(['code' => 0, 'msg' => '通过申请成功']);
  786. } else {
  787. return json(['code' => 1, 'msg' => '通过申请失败']);
  788. }
  789. }
  790. public function verifypass_all()
  791. {
  792. $request = request();
  793. $companyName = Company::where(['root_id' => $request->employee->root_id])->value('company_name');
  794. $where[] = ['root_id', '=', $request->employee->root_id];
  795. $where[] = ['state', '=', '待审核'];
  796. $where[] = ['verified', '=', 0];
  797. $where[] = ['uid', '>', 0];
  798. $all = EmployeeModel::where($where)->field('id,name,phone,org_id')->select();
  799. if (empty($all)) return json(['code' => 1, 'msg' => '没有待审核人员']);
  800. $i = 0;
  801. //企业notify
  802. $clientType = Miniprogram::where('root_id', $request->employee->root_id)->value('notify');
  803. $orgs = [];
  804. foreach ($all as $k => $v) {
  805. if (EmployeeModel::where([['id', '=', $v['id']]])->update(['state' => '在职', 'left_to_empid' => NULL, 'verified' => 1])) {
  806. event(new Msg($v['id'], '您的申请已经通过,欢迎来到' . $companyName . '大家庭', 'verifypass'));
  807. //审核通过短信通知
  808. $urldata = [
  809. 'content' => json_encode([
  810. 'client_type' => $clientType,
  811. 'path' => "/pages/index/index",
  812. 'query' => "ctp=" . $clientType,
  813. 'employee_id' => $v['id']
  814. ]),
  815. 'type' => 'join_company'
  816. ];
  817. $shortUrl = new ShortUrl();
  818. $shortUrl->save($urldata);
  819. // 将ID进行
  820. $query = dec52($shortUrl->id);
  821. $shortUrl->uri = $query;
  822. $shortUrl->save();
  823. sendSms($v['phone'], $v['name'] . "您已成功加入" . $companyName . ",请点击链接访问数字化系统https://wzh.nczyzs.com/open/" . $query);
  824. $i+=1;
  825. $orgs[] = $v['org_id'];
  826. }
  827. }
  828. if ($orgs) {
  829. dataStatistics(request()->employee->root_id,'emp_count',$i,'inc');//manage应用首页统计数据
  830. $org = Org::where([['id','in',$orgs],['org_type','=',1]])->column('id');
  831. $count = count(array_diff($orgs,$org));//去掉销售
  832. dataStatistics(request()->employee->root_id,'designer_count',$count,'inc');//manage 统计设计师数量
  833. }
  834. return json(['code' => 0, 'msg' => '一键审核完成']);
  835. }
  836. public function verifypass_count()
  837. {
  838. $request = request();
  839. $where[] = ['root_id', '=', $request->employee->root_id];
  840. $where[] = ['state', '=', '待审核'];
  841. $where[] = ['verified', '=', 0];
  842. $count = EmployeeModel::where($where)->count();
  843. return $count;
  844. }
  845. public function verifyreject()
  846. {
  847. $request = request();
  848. $empid = $request->param('empid');
  849. // 手机端操作,pc端未刷新的情况
  850. $thisApplyer = EmployeeModel::find($empid);
  851. //
  852. if ($thisApplyer->verified == 1) {
  853. return json(['code' => 1, 'msg' => '已经处理,请刷新页面']);
  854. }
  855. if ($thisApplyer->state == '驳回') {
  856. return json(['code' => 1, 'msg' => '已经处理,请刷新页面']);
  857. }
  858. //
  859. $where[] = ['root_id', '=', $request->employee->root_id];
  860. $where[] = ['id', '=', $empid];
  861. ///
  862. if (EmployeeModel::where($where)->update(['state' => '驳回', 'verified' => 0])) {
  863. return json(['code' => 0, 'msg' => '驳回申请成功']);
  864. } else {
  865. return json(['code' => 1, 'msg' => '驳回申请失败']);
  866. }
  867. }
  868. /**
  869. * 部门人员获取(仅包含该部门下人员)
  870. */
  871. public function orgEmployee($id)
  872. {
  873. // 检测该id是否是该组织结构下的
  874. $employee = EmployeeModel::field('id,name,is_manager')->where([['uid', '>', 0], ['org_id', '=', $id], ['root_id', '=', request()->employee->root_id], ['state', '=', '在职']])->select();
  875. return json(['code' => 0, 'data' => $employee]);
  876. }
  877. /**
  878. * 设计师列表
  879. */
  880. public function designer()
  881. {
  882. // Designer
  883. $token = request()->employee;
  884. $param = Request::only(['page' => 1, 'limit' => 10, 'keyword' => '', 'org'=>'', 'start_time'=> '']);
  885. // $param = $request->param();
  886. $w[] = ['path', 'like', $token['root_id'] . '-%'];
  887. $w[] = ['org_type', '=', 2];
  888. $orgs = Org::where($w)->column('id');
  889. if ($param['keyword']) {
  890. $w1[] = ['name', 'like', '%' . trim($param['keyword']) . '%'];
  891. $w1[] = ['root_id', '=', $token['root_id']];
  892. $ids1 = Designer::where($w1)->column('employee_id');
  893. $w2[] = ['root_id', '=', $token['root_id']];
  894. $ids2 = Designer::where($w2)->where("name is null AND name = ''")->column('employee_id');
  895. $w2[] = ['name', 'like', '%' . trim($param['keyword']) . '%'];
  896. $w2[] = ['id', 'not in', $ids2];
  897. $ids3 = EmployeeModel::where($w2)->column('id');
  898. $w3[] = ['id', 'in', array_merge($ids1, $ids3)];
  899. }
  900. if ($param['org']) {
  901. $w3[] = ['org_id', '=', $param['org']];
  902. }
  903. if ($param['start_time']) {
  904. $date = explode(' - ', $param['start_time']);
  905. if (isset($date[0])) {
  906. $date[0] = $date[0] . ' 00:00:00';
  907. }
  908. if (isset($date[1])) {
  909. $date[1] = $date[1] . ' 23:59:59';
  910. }
  911. $w_date[] = ['vcr_updatetime', 'between', $date];
  912. $w_date[] = ['root_id', '=', $token['root_id']];
  913. $ids_date = Designer::where($w_date)->column('employee_id');
  914. $w3[] = ['id', 'in', $ids_date];
  915. }
  916. $w3[] = ['org_id', 'in', $orgs];
  917. $w3[] = ['root_id', '=', $token['root_id']];
  918. $w3[] = ['state', '=', '在职'];
  919. $root_id = $token['root_id'];
  920. $list = EmployeeModel::with(['designer' => function ($query) use ($root_id) {
  921. $query->where('root_id', $root_id)->visible(['headimgurl', 'employee_id', 'desc', 'good_at', 'position', 'work_years', 'addtime', 'vcr_updatetime', 'good_house', 'design_concept', 'vcr'])->bind(['desc', 'good_at', 'position', 'work_years', 'addtime', 'vcr_updatetime', 'good_house', 'design_concept', 'vcr', 'name', 'headimgurl']);
  922. }, 'org'=>function($query){
  923. $query->bind(['org_name'=>'name']);
  924. }])->where($w3)->field('name title,id,show,org_id')->page($param['page'], $param['limit'])->select()->toArray();
  925. $count = EmployeeModel::where($w3)->count();
  926. foreach ($list as $k => $v) {
  927. $list[$k]['name'] = $v['title'];
  928. $list[$k]['show'] = $v['show'] ? '不展示' : '展示';
  929. unset($list[$k]['designer']);
  930. // 设计师预约次数统计
  931. $list[$k]['designer_reserve'] = DesignerReserve::where('designer_id', '=', $v['id'])->count();
  932. }
  933. return json(['code' => 0, 'data' => $list, 'count' => $count]);
  934. }
  935. /**
  936. * 设计师列表
  937. */
  938. public function edit_show()
  939. {
  940. $param = Request::only(['id' => 0]);
  941. $token = request()->employee;
  942. $w[] = ['root_id', '=', $token['root_id']];
  943. $w[] = ['id', '=', $param['id']];
  944. $row = EmployeeModel::where($w)->findOrEmpty();
  945. if ($row->isEmpty()) return json(['code' => 1, 'data' => '数据不存在', 'msg' => '数据不存在']);
  946. $show = $row->show ? 0 : 1;
  947. EmployeeModel::where($w)->update(['show' => $show]);
  948. return json(['code' => 0, 'data' => '操作成功', 'msg' => '操作成功']);
  949. }
  950. /**
  951. * 设计师编辑
  952. */
  953. public function edit_designer()
  954. {
  955. $param = Request::only(['id' => 0, 'position' => '', 'name' => '', 'good_at' => '', 'desc' => '', 'work_years' => 0, 'house_at' => '', 'design_concept' => '', 'vcr' => '', 'vcrurl' => '', 'headimgurl' => '', 'img' => '']);
  956. $param['headimgurl'] = $param['headimgurl'] ?: $param['img'];
  957. if (!$param['headimgurl']) return json(['code' => 1, 'data' => '请选择形象照', 'msg' => '请选择形象照']);
  958. $param['vcr'] = $param['vcr'] ?: $param['vcrurl'];
  959. //if(!$param['vcr']) return json(['code' => 1, 'data' =>'请选择vcr','msg'=>'请选择vcr']);
  960. if (!empty($param['vcr'])) {
  961. $arr = explode(',', $param['vcr']);
  962. $param['vcr'] = end($arr);
  963. }
  964. $token = request()->employee;
  965. $w[] = ['root_id', '=', $token['root_id']];
  966. $w[] = ['id', '=', $param['id']];
  967. $row = EmployeeModel::where($w)->findOrEmpty();
  968. if ($row->isEmpty()) return json(['code' => 1, 'data' => '数据不存在', 'msg' => '数据不存在']);
  969. $w1[] = ['root_id', '=', $token['root_id']];
  970. $w1[] = ['employee_id', '=', $param['id']];
  971. $row = Designer::where($w1)->findOrEmpty();
  972. $save['root_id'] = $token['root_id'];
  973. $save['name'] = $param['name'];
  974. $save['good_at'] = $param['good_at'];
  975. $save['desc'] = $param['desc'];
  976. $save['work_years'] = $param['work_years'];
  977. $save['good_house'] = $param['house_at'];
  978. $save['design_concept'] = $param['design_concept'];
  979. $save['vcr'] = $param['vcr'];
  980. $save['position'] = $param['position'];
  981. $save['headimgurl'] = $param['headimgurl'];
  982. if ($row->isEmpty()) {
  983. if (!empty($save['vcr'])) {
  984. $save['vcr_updatetime'] = date('Y-m-d H:i:s');
  985. }
  986. $save['employee_id'] = $param['id'];
  987. Designer::insertGetId($save);
  988. } else {
  989. $old_vcr = $row->getData('vcr');
  990. if ($save['vcr'] != $old_vcr) {
  991. $save['vcr_updatetime'] = date('Y-m-d H:i:s');
  992. }
  993. $row->save($save);
  994. }
  995. EmployeeModel::where('id', $param['id'])->update(['image_photo' => $param['headimgurl']]);
  996. return json(['code' => 0, 'data' => '操作成功', 'msg' => '操作成功']);
  997. }
  998. /**
  999. * 设计师预约列表
  1000. */
  1001. public function designer_reserve()
  1002. {
  1003. if (!request()->isAjax()) {
  1004. $id = input('id', '', 'intval');
  1005. View::assign('id', $id);
  1006. return View::fetch();
  1007. }
  1008. $param = request()->only(['page' => 1, 'limit' => 10, 'id']);
  1009. $list = DesignerReserve::with(['employee', 'user'])->where([['root_id', '=', request()->employee->root_id], ['designer_id', '=', $param['id']]])->page($param['page'], $param['limit'])->select()->each(function ($item) {
  1010. $org_ids = orgSubIds($item['root_id']);
  1011. $customer = Customer::where([['uid', '=', $item['uid']], ['org_id', 'in', $org_ids]])->find();
  1012. if ($customer) {
  1013. $item['customer_state'] = Customer::changeState($customer['state']);
  1014. } else {
  1015. $item['customer_state'] = '未建档';
  1016. }
  1017. switch ($item['pipe_type']) {
  1018. case 'materialCase':
  1019. $item['from'] = MaterialCase::where('id', '=', $item['data_id'])->value('title');
  1020. break;
  1021. case 'designer':
  1022. $item['from'] = '设计师预约';
  1023. break;
  1024. default:
  1025. break;
  1026. }
  1027. });
  1028. $count = DesignerReserve::where([['root_id', '=', request()->employee->root_id], ['designer_id', '=', $param['id']]])->count();
  1029. return json(['code' => 0, 'data' => $list, 'count' => $count]);
  1030. }
  1031. /**
  1032. * 小程序禁入开关
  1033. */
  1034. public function disable($id, $disable, $type)
  1035. {
  1036. $employee = EmployeeModel::where([
  1037. ['root_id', '=', request()->employee['root_id']],
  1038. ['id', '=', $id],
  1039. ['uid', '<>', 0]
  1040. ])->find();
  1041. if (empty($employee)) return json(['code' => 1, 'msg' => '员工不存在']);
  1042. switch ($type){
  1043. case 1:
  1044. if ($disable == 'true') {
  1045. $employee->disable = 0;
  1046. } else {
  1047. $employee->disable = 1;
  1048. }
  1049. $disable_day_setting = Setting::where([['name', '=', 'disable_day'], ['root_id', '=', request()->employee['root_id']]])->findOrEmpty();
  1050. if (!$disable_day_setting->isEmpty() && $disable_day_setting['content']) {
  1051. $employee->last_login_time = date('Y-m-d H:i:s');
  1052. }
  1053. $employee->save();
  1054. break;
  1055. case 2:
  1056. if ($disable == 'true') {
  1057. $employee->empcrm_disable = 0;
  1058. } else {
  1059. $employee->empcrm_disable = 1;
  1060. }
  1061. $employee->save();
  1062. break;
  1063. case 3:
  1064. if ($disable == 'true') {
  1065. $employee->community_disable = 0;
  1066. } else {
  1067. $employee->community_disable = 1;
  1068. }
  1069. $employee->save();
  1070. break;
  1071. case 4:
  1072. if ($disable == 'true') {
  1073. $employee->clue_disable = 0;
  1074. } else {
  1075. $employee->clue_disable = 1;
  1076. }
  1077. $employee->save();
  1078. break;
  1079. default:
  1080. break;
  1081. }
  1082. return json(['code' => 0, 'msg' => '操作成功']);
  1083. }
  1084. /**
  1085. * 获取登陆剩余时间
  1086. */
  1087. public function getTime()
  1088. {
  1089. $id = request()->employee->id;
  1090. $time = OperateLog::where([['employee_id','=', $id]])->order('id desc')->value('addtime');
  1091. $session = 18000;//session保持时间5小时
  1092. $res = strtotime($time)+$session;
  1093. return json(['code' => 0, 'data' => date('Y/m/d H:i:s',$res)]);
  1094. }
  1095. }