Wework.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <?php
  2. namespace app\sys\controller;
  3. use app\model\Customer;
  4. use app\model\WeworksingleCompanySetting;
  5. use app\model\WeworksingleCustomer;
  6. use app\model\WeworksingleExternalMessage;
  7. use app\model\WeworksingleExternalMessageRecord;
  8. use think\facade\View;
  9. use app\model\Company;
  10. use app\model\Employee;
  11. use think\facade\Request;
  12. use weworkapi\api\apiSingle;
  13. class Wework extends Base
  14. {
  15. /**
  16. * 列表页面
  17. */
  18. public function external_message()
  19. {
  20. if(!request()->isAjax()) return View::fetch();
  21. $page = input('page', 1, 'intval');
  22. $limit = input('limit', 10, 'intval');
  23. $root_id = request()->employee->root_id;
  24. $where[] = ['root_org', '=', $root_id];
  25. $date = input('date', '', 'trim');
  26. if (!empty($date)) {
  27. $date_arr = explode(' - ', $date);
  28. $start_time = strtotime($date_arr[0]);
  29. $end_time = strtotime($date_arr[1]);
  30. $where[] = ['sendtime', 'between', [$start_time, $end_time]];
  31. }
  32. $list = WeworksingleExternalMessage::where($where)->page($page, $limit)->select()->each(function ($item){
  33. if ($item['send_type'] == 1) {
  34. $item->send_type_name = '单聊';
  35. } elseif ($item['send_type'] == 2) {
  36. $item->send_type_name = '群聊';
  37. }
  38. $customer_group_arr = array_filter(explode(',', $item['customer_group']));
  39. $group_arr[1] = '确认量房';
  40. $group_arr[2] = '交定';
  41. $group_arr[3] = '签单';
  42. $customer_group_str = '';
  43. foreach ($customer_group_arr as $v) {
  44. $customer_group_str .= $group_arr[$v] . ',';
  45. }
  46. $item->customer_group_name = trim($customer_group_str, ',');
  47. if (!empty($item['employee_id'])) {
  48. $employee_list = Employee::where([['id', 'in', $item['employee_id']]])->column('name');
  49. $item->employee_name = implode(',', $employee_list);
  50. } else {
  51. $item->employee_name = '';
  52. }
  53. $item->sendtime = date('Y-m-d H:i', $item['sendtime']);
  54. $item->endtime = date('Y-m-d H:i', $item['endtime']);
  55. $item->edit_per = strtotime($item['sendtime']) < time() ? false : true;
  56. });
  57. $count = WeworksingleExternalMessage::where($where)->count();
  58. return json(['code'=> 0, 'msg'=> '查询成功', 'data'=> $list, 'count'=> $count]);
  59. }
  60. /**
  61. * 企业微信上传素材
  62. */
  63. public function weworkUpload(){
  64. if (!request()->isPost()) {
  65. return View::fetch();
  66. } else {
  67. $path = request()->param('path', '', 'trim');
  68. $root_org = request()->employee->root_id;
  69. $company_id = Company::where('root_id', '=', $root_org)->value('id');
  70. $company_setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
  71. if (empty($company_setting)) {
  72. return json(['code'=> 1, 'msg'=> '上传失败']);
  73. } else {
  74. $config['corp_id'] = $company_setting['corp_id'];
  75. $config['agent_id'] = $company_setting['agent_id'];
  76. $config['secret'] = $company_setting['agent_secret'];
  77. $app = (new apiSingle($config));
  78. $result = $app->uploadImage($path);
  79. if ($result['errcode'] == 0) {
  80. return json(['code'=> 0, 'msg'=> '上传成功', 'data'=> $result['media_id']]);
  81. } else {
  82. return json(['code'=> 1, 'msg'=> '文件上传失败']);
  83. }
  84. }
  85. }
  86. }
  87. /**
  88. * 获取外部联系群
  89. */
  90. /*public function getGroupChats(){
  91. $page = input('page', '', 'trim');
  92. $root_org = request()->employee->root_id;
  93. $company_id = Company::where('root_id', '=', $root_org)->value('id');
  94. $company_setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
  95. if (empty($company_setting)) {
  96. return json(['code'=> 1, 'msg'=> '获取失败']);
  97. } else {
  98. $config['corp_id'] = $company_setting['corp_id'];
  99. $config['agent_id'] = $company_setting['agent_id'];
  100. $config['secret'] = $company_setting['customer_secret'];
  101. $app = (new apiSingle($config));
  102. $result = $app->getGroupChats($page, 10, 0, []);
  103. if ($result['errcode'] == 0) {
  104. $group_chat_list = $result['group_chat_list'];
  105. foreach ($group_chat_list as $k => $v) {
  106. $chat = $app->getGroupChat($v['chat_id']);
  107. if ($chat['errcode'] == 0) {
  108. $group_chat_list[$k]['info'] = $chat['group_chat'];
  109. } else {
  110. $group_chat_list[$k]['info'] = [];
  111. }
  112. }
  113. $next_page = empty($result['next_cursor']) ? '' : $result['next_cursor'];
  114. return json(['code'=> 0, 'msg'=> '获取成功', 'data'=> $group_chat_list, 'page'=> $next_page]);
  115. } else {
  116. return json(['code'=> 1, 'msg'=> '获取失败']);
  117. }
  118. }
  119. }*/
  120. /**
  121. * 获取绑定了企业微信的成员列表
  122. */
  123. public function getUserList(){
  124. $page = input('page', 1, 'intval');
  125. $root_org = request()->employee->root_id;
  126. $where[] = ['weworksingle_uid', '>', 0];
  127. $where[] = ['root_id', '=', $root_org];
  128. $list = Employee::where($where)->page($page, 10)->select();
  129. $count = Employee::where($where)->count();
  130. $data['list'] = $list;
  131. $data['count'] = $count;
  132. return json(['code'=> 0, 'msg'=> '获取成功', 'data'=> $data]);
  133. }
  134. /**
  135. * 添加群发内容
  136. */
  137. public function add_external_message()
  138. {
  139. if(!request()->isPost()){
  140. return View::fetch();
  141. } else {
  142. $param = request()->param();
  143. $data['root_org'] = request()->employee->root_id;
  144. $data['sendtime'] = strtotime($param['sendtime']);
  145. $data['endtime'] = strtotime($param['endtime']);
  146. $data['send_org_id'] = '';
  147. $data['status'] = 0;
  148. $data['executetime'] = '';
  149. $data['receive_userid'] = ''; //实际执行时候的接收人(单聊)
  150. $data['external_user'] = ''; // 生成此条数据时候的接收人(单聊),此字段实际无用
  151. // 群发至客户
  152. $select = input('select', '', 'trim');
  153. $data['customer_group'] = $select;
  154. if (!empty($select)) {
  155. $data['send_type'] = 1;
  156. $select_arr = explode(',', $select);
  157. $state = [];
  158. foreach ($select_arr as $v) {
  159. switch (intval($v)) {
  160. case 1:
  161. $state[] = '确认量房';
  162. break;
  163. case 2:
  164. $state[] = '交定';
  165. break;
  166. case 3:
  167. $state[] = '签单';
  168. break;
  169. default:
  170. break;
  171. }
  172. }
  173. $orgids = orgSubIds(request()->employee->root_id);
  174. $c_where[] = ['org_id', 'in', $orgids];
  175. $c_where[] = ['employee_id', '>', 0];
  176. $c_where[] = ['state', 'in', $state];
  177. $customer_ids = Customer::where($c_where)->column('id');
  178. $external_user = WeworksingleCustomer::where('customer_id', 'in', $customer_ids)->column('external_userid');
  179. $data['external_user'] = empty($external_user) ? '' : json_encode($external_user);
  180. }
  181. // 群发至客户群
  182. $data['employee_id'] = input('employee_id', '', 'trim');
  183. if (!empty($data['employee_id'])) {
  184. $data['send_type'] = 2;
  185. }
  186. $data['content'] = $param['content'];
  187. $attachments = explode(',', $param['media_id_arr']);
  188. $att = [];
  189. if (!empty($attachments)) {
  190. foreach ($attachments as $v) {
  191. $att[] = [
  192. 'image' => [
  193. 'media_id'=> $v
  194. ]
  195. ];
  196. }
  197. }
  198. $data['attachments'] = !empty($att) ? json_encode($att) : '';
  199. $result = WeworksingleExternalMessage::create($data);
  200. if ($result) {
  201. return json(['code'=> 0, 'msg'=> '添加成功']);
  202. } else {
  203. return json(['code'=> 1, 'msg'=> '添加失败']);
  204. }
  205. }
  206. }
  207. /**
  208. * 编辑群发内容
  209. */
  210. public function edit_external_message()
  211. {
  212. if(!request()->isPost()) {
  213. $id = input('id', '', 'intval');
  214. $info = WeworksingleExternalMessage::find($id);
  215. $employee_list = [];
  216. if (!empty($info['employee_id'])) {
  217. $employee_list = Employee::where([['id', 'in', $info['employee_id']]])->field('id,name')->select()->toArray();
  218. }
  219. $info['employee_list'] = $employee_list;
  220. View::assign('info', $info);
  221. return View::fetch();
  222. } else {
  223. $param = request()->param();
  224. $id = $param['id'];
  225. $info = WeworksingleExternalMessage::find($id);
  226. if (empty($info)) {
  227. return json(['code'=> 1, 'msg'=> '编辑失败']);
  228. }
  229. if ($info['sendtime'] < time()) {
  230. return json(['code'=> 1, 'msg'=> '该任务已执行,无法编辑']);
  231. }
  232. $data['sendtime'] = strtotime($param['sendtime']);
  233. $data['endtime'] = strtotime($param['endtime']);
  234. $data['send_org_id'] = '';
  235. $data['status'] = 0;
  236. $data['executetime'] = '';
  237. $data['receive_userid'] = $info['receive_userid'];
  238. $data['external_user'] = '';
  239. // 群发至客户
  240. $select = input('select', '', 'trim');
  241. $data['customer_group'] = $select;
  242. if (!empty($select)) {
  243. $data['send_type'] = 1;
  244. $select_arr = explode(',', $select);
  245. $state = [];
  246. foreach ($select_arr as $v) {
  247. switch (intval($v)) {
  248. case 1:
  249. $state[] = '确认量房';
  250. break;
  251. case 2:
  252. $state[] = '交定';
  253. break;
  254. case 3:
  255. $state[] = '签单';
  256. break;
  257. default:
  258. break;
  259. }
  260. }
  261. $c_where[] = ['state', 'in', $state];
  262. $c_where[] = ['org_id', '=', request()->employee->root_id];
  263. $customer_ids = Customer::where($c_where)->column('id');
  264. $external_user = WeworksingleCustomer::where('customer_id', 'in', $customer_ids)->column('external_userid');
  265. $data['external_user'] = empty($external_user) ? '' : json_encode($external_user);
  266. }
  267. // 群发至客户群
  268. $data['employee_id'] = input('employee_id', '', 'trim');
  269. if (!empty($data['employee_id'])) {
  270. $data['send_type'] = 2;
  271. }
  272. $data['content'] = $param['content'];
  273. $attachments = explode(',', $param['media_id_arr']);
  274. $att = [];
  275. if (!empty($attachments)) {
  276. foreach ($attachments as $v) {
  277. $att[] = [
  278. 'image' => [
  279. 'media_id'=> $v
  280. ]
  281. ];
  282. }
  283. }
  284. $data['attachments'] = !empty($att) ? json_encode($att) : '';
  285. $result = WeworksingleExternalMessage::where('id', '=', $id)->save($data);
  286. if ($result !== false) {
  287. return json(['code'=> 0, 'msg'=> '编辑成功']);
  288. } else {
  289. return json(['code'=> 1, 'msg'=> '编辑失败']);
  290. }
  291. }
  292. }
  293. /**
  294. * 删除群发
  295. */
  296. public function delete_external_message(){
  297. $id = input('id', '', 'intval');
  298. $root_org = request()->employee->root_id;
  299. $find = WeworksingleExternalMessage::find($id);
  300. if (empty($find)) {
  301. return json(['code'=> 0, 'msg'=> '删除成功']);
  302. }
  303. if ($find['root_org'] !== $root_org) {
  304. return json(['code'=> 1, 'msg'=> '删除失败']);
  305. }
  306. if ($find['sendtime'] < time()) {
  307. return json(['code'=> 1, 'msg'=> '已发送,无法删除']);
  308. }
  309. $result = $find->delete();
  310. if ($result !== false) {
  311. return json(['code'=> 0, 'msg'=> '删除成功']);
  312. } else {
  313. return json(['code'=> 1, 'msg'=> '删除失败']);
  314. }
  315. }
  316. /**
  317. * 群发统计
  318. */
  319. public function statistics_external_message()
  320. {
  321. $id = input('id', '', 'intval');
  322. if(!request()->isAjax()){
  323. $info = WeworksingleExternalMessage::find($id);
  324. $company_id = Company::where('root_id', '=', request()->employee->root_id)->value('id');
  325. $setting = WeworksingleCompanySetting::where('company_id', '=', $company_id)->find();
  326. $config['corp_id'] = $setting['corp_id'];
  327. $config['agent_id'] = $setting['agentid'];
  328. $config['secret'] = $setting['customer_secret'];
  329. $send_list = WeworksingleExternalMessageRecord::where('message_id', '=', $info['id'])->select();
  330. $app = (new apiSingle($config));
  331. foreach ($send_list as $k => $v) {
  332. $result = $app->getExternalMessage($v['msgid']);
  333. if ($result['errcode'] == 0) {
  334. if (!empty($result['detail_list'])) {
  335. $v->status = $result['detail_list'][0]['status'];
  336. $v->send_time = !empty($result['detail_list'][0]['send_time']) ? $result['detail_list'][0]['send_time'] : 0;
  337. $v->save();
  338. }
  339. }
  340. }
  341. $data['send_number'] = WeworksingleExternalMessageRecord::where('message_id', '=', $info['id'])->count();
  342. $data['send_type'] = $info['send_type'] == 1 ? '单聊' : '群聊';
  343. $data['receive_count'] = count(explode(',', $info['receive_userid']));
  344. $data['send_count'] = WeworksingleExternalMessageRecord::where([['message_id', '=', $info['id']], ['status', '<>', 0]])->count();
  345. $data['unsend_count'] = WeworksingleExternalMessageRecord::where([['message_id', '=', $info['id']], ['status', '=', 0]])->count();
  346. View::assign('info', $data);
  347. View::assign('id', $id);
  348. return View::fetch();
  349. }
  350. $status = input('status', '', 'intval');
  351. $page = input('page', 1, 'intval');
  352. $where[] = ['message_id', '=', $id];
  353. if ($status) {
  354. switch ($status) {
  355. case 1:
  356. $where[] = ['status', '=', 1];
  357. break;
  358. case 2:
  359. $where[] = ['status', '=', 0];
  360. break;
  361. case 3:
  362. $where[] = ['status', 'in', [2,3]];
  363. break;
  364. default:
  365. break;
  366. }
  367. }
  368. $list = WeworksingleExternalMessageRecord::where($where)->page($page, 10)->select()->each(function ($item){
  369. $employee = Employee::find($item['employee_id']);
  370. $item->employee_name = $employee['name'];
  371. switch ($item['status']) {
  372. case 0:
  373. $item->status_name = '未执行';
  374. break;
  375. case 1:
  376. $item->status_name = '已执行';
  377. break;
  378. case 2:
  379. case 3:
  380. $item->status_name = '执行失败';
  381. break;
  382. default:
  383. $item->status_name = '';
  384. break;
  385. }
  386. if ($item['send_time']) {
  387. $item->send_time = date('Y-m-d H:i:s');
  388. } else {
  389. $item->send_time = '';
  390. }
  391. });
  392. return json(['code'=> 0, 'msg'=> '查询成功', 'data'=> $list]);
  393. }
  394. }