Event.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795
  1. <?php
  2. namespace addons\qingdongams\controller;
  3. use addons\qingdongams\model\Event as EventModel;
  4. use addons\qingdongams\model\EventNeeds;
  5. use addons\qingdongams\model\Flow;
  6. use addons\qingdongams\model\Form;
  7. use addons\qingdongams\model\File;
  8. use addons\qingdongams\model\FormField;
  9. use addons\qingdongams\model\Staff;
  10. use addons\qingdongams\model\StaffSignIn;
  11. use addons\qingdongams\model\Message;
  12. use addons\qingdongams\model\Customer;
  13. use addons\qingdongams\model\Consume;
  14. use think\Db;
  15. use think\Exception;
  16. use think\Log;
  17. /**
  18. * 日程接口
  19. */
  20. class Event extends StaffApi
  21. {
  22. protected $noNeedLogin = [];
  23. protected $noNeedRight = [];
  24. //获取日程
  25. public function getEvent()
  26. {
  27. //开始时间
  28. $start_day = input('start_day');
  29. //结束时间
  30. $end_day = input('end_day');
  31. if (empty($start_day) || empty($end_day)) {
  32. $this->error('开始时间或结束时间不能为空');
  33. }
  34. if ($end_day < $start_day) {
  35. $this->error('开始时间不能小于结束时间');
  36. }
  37. $this->success('请求成功', EventModel::getTimeList($start_day, $end_day));
  38. }
  39. /**
  40. * 首页获取日程列表
  41. *
  42. * @ApiTitle (首页获取日程列表)
  43. * @ApiSummary (日 周 月)
  44. * @ApiMethod (POST)
  45. * @ApiRoute (/api/event/getIndexList)
  46. * @ApiParams (name="type", type="integer", required=true, description="1 今日计划 2 本周计划 3 本月计划")
  47. * @ApiReturnParams (name="code", type="integer", required=true, sample="0")
  48. * @ApiReturnParams (name="msg", type="string", required=true, sample="返回成功")
  49. */
  50. public function getIndexList()
  51. {
  52. $where = [];
  53. $where['staff_id'] = $this->auth->id;
  54. $times = input('times', date('Y-m-d'));
  55. $where['start_time'] = ['between', [$times, date('Y-m-d', strtotime($times . '+1day'))]];
  56. $records = EventModel::where($where)->with([
  57. 'staff',
  58. 'customer'
  59. ])->field('id,staff_id,type,process,visits_number,customer_id,title,start_time,end_time,status,level,relation_id,use_time,createtime')->order('id desc')->select();
  60. foreach ($records as $key => $event) {
  61. $event->level = EventModel::getLevel($event->level);
  62. $event->status = EventModel::getStatus($event->status);
  63. $records[$key] = $event;
  64. }
  65. $this->success('请求成功', $records);
  66. }
  67. //获取列表
  68. public function getList()
  69. {
  70. $params = $this->request->post();
  71. $relation_id = input('relation_id', '', 'intval');
  72. $relation_type = input('relation_type', 'customer');
  73. $customer_id = input('customer_id');
  74. // 0未开始 1执行中2 已结束 3 已取消'
  75. $status = input('status', '');
  76. $type_tab = input('type_tab', '', 'intval');
  77. $event_type = input('event_type', '');
  78. $times = input('times', '');
  79. $actual_end_time = input('actual_end_time', '');
  80. $name = input('name', '');
  81. $limit = input("limit/d", 10);
  82. $where = [];
  83. if ($times) {
  84. $times = setTimes($times, 'time');
  85. $where['createtime'] = ['between', $times];
  86. }
  87. if ($actual_end_time) {
  88. $actual_end_time = setTimes($actual_end_time, 'time');
  89. $where['createtime'] = ['between', $actual_end_time];
  90. }
  91. $whereStaff = [];
  92. if ($relation_id) {
  93. $where['relation_type'] = $relation_type;
  94. $where['relation_id'] = $relation_id;
  95. } else {
  96. $whereStaff['staff_id'] = ['in', Staff::getMyStaffIds()];
  97. if (isset($params['type']) && $params['type']) {//客户分类
  98. if ($params['type'] == 1) {//我的创建
  99. $whereStaff['staff_id'] = $this->auth->id;
  100. } elseif ($params['type'] == 2) {//下属创建
  101. $whereStaff['staff_id'] = ['in', Staff::getLowerStaffId()];
  102. }
  103. }
  104. }
  105. if ($customer_id) {
  106. $where['customer_id'] = $customer_id;
  107. }
  108. if ($event_type) {
  109. $where['event_type'] = ['like', "%{$event_type}%"];
  110. }
  111. if ($status) {
  112. $where['status'] = ['in', explode(',', $status)];
  113. }
  114. $where['type'] = ['neq', 4];
  115. if ($type_tab) {
  116. $where['type'] = $type_tab;
  117. }
  118. if ($name) {
  119. $where['title'] = ['like', '%' . $name . '%'];
  120. }
  121. if (isset($params['id_list'])) {//日志 查询id列表
  122. $where = [];
  123. $whereStaff = [];
  124. $where['id'] = ['in', explode(',', $params['id_list'])];
  125. }
  126. $records = EventModel::where($where)->where($whereStaff)->with([
  127. 'staff',
  128. 'customer',
  129. ])->order('id desc')->paginate($limit)->toArray();
  130. $data = $records['data'];
  131. foreach ($data as $k => $v) {
  132. $v['level'] = EventModel::getLevel($v['level']);
  133. $v['status'] = EventModel::getStatus($v['status']);
  134. if ($v['use_time'] >= 60) {
  135. //按小时算
  136. $v['use_time'] = sprintf("%.2f", $v['use_time'] / 60) . '小时';
  137. } else {
  138. $v['use_time'] = $v['use_time'] ? $v['use_time'] . '分钟' : 0;
  139. }
  140. $data[$k] = $v;
  141. }
  142. $this->success('请求成功', [
  143. 'total' => $records['total'],
  144. 'per_page' => $records['per_page'],
  145. 'current_page' => $records['current_page'],
  146. 'last_page' => $records['last_page'],
  147. 'data' => $data
  148. ]);
  149. }
  150. //获取列表
  151. public function getListNumber()
  152. {
  153. // 0未开始 1执行中2 已结束 3 已取消'
  154. $where['type'] = ['neq', 4];
  155. $whereStaff = function ($query) {
  156. $query->where('create_staff_id|staff_id', 'in', Staff::getMyStaffIds());
  157. };
  158. $where['status'] = 0;
  159. $event0 = EventModel::where($where)->where($whereStaff)->order('id desc')->count();
  160. $where['status'] = 1;
  161. $event1 = EventModel::where($where)->where($whereStaff)->order('id desc')->count();
  162. $where['status'] = 2;
  163. $event2 = EventModel::where($where)->where($whereStaff)->order('id desc')->count();
  164. $where['status'] = 3;
  165. $event3 = EventModel::where($where)->where($whereStaff)->order('id desc')->count();
  166. $this->success('请求成功', [
  167. 'event0' => $event0,
  168. 'event1' => $event1,
  169. 'event2' => $event2,
  170. 'event3' => $event3,
  171. ]);
  172. }
  173. //添加日程
  174. public function addEvent()
  175. {
  176. $params = $this->request->post();
  177. // 表单验证
  178. if (($result = $this->qingdongamsValidate($params, get_class(), 'create')) !== true) {
  179. $this->error($result);
  180. }
  181. try {
  182. $result = EventModel::createEvent($params);
  183. } catch (Exception $e) {
  184. $this->error($e->getMessage());
  185. }
  186. if ($result) {
  187. $this->success('添加成功');
  188. }
  189. }
  190. //编辑日程
  191. public function editEvent()
  192. {
  193. $params = $this->request->post();
  194. // 表单验证
  195. if (($result = $this->qingdongamsValidate($params, get_class(), 'edit')) !== true) {
  196. $this->error($result);
  197. }
  198. $event = EventModel::get($params['id']);
  199. if (empty($event)) {
  200. $this->error('日程不存在');
  201. }
  202. try {
  203. $result = EventModel::editEvent($params);
  204. $data = [
  205. 'staff_id' => $this->auth->id,
  206. 'customer_id' => $event['relation_id'],//客户id
  207. 'relation_process' => '修改日程信息',//日程类型
  208. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  209. 'relation_id' => $event['id'],//签到关联id
  210. 'content' => '修改日程信息',
  211. ];
  212. //创建签到记录
  213. StaffSignIn::createSignIn($data);
  214. } catch (Exception $e) {
  215. $this->error($e->getMessage());
  216. }
  217. if ($result) {
  218. $this->success('修改日程成功');
  219. }
  220. }
  221. //获取详情
  222. public function getDetail()
  223. {
  224. $id = input('id');
  225. if (empty($id)) {
  226. $this->error('参数错误');
  227. }
  228. $event = EventModel::where(['id' => $id])->with(['staff', 'customer', 'contacts'])->find();
  229. if (empty($event)) {
  230. $this->error('日程不存在');
  231. }
  232. $event['status_text'] = EventModel::getStatus($event['status']);
  233. $event['is_revoke'] = 0;
  234. $event['is_operation'] = 0;
  235. if ($event['create_staff_id'] == $this->auth->id) {
  236. //是否可以撤销
  237. $event['is_revoke'] = 1;
  238. }
  239. if ($event['staff_id'] == $this->auth->id) {
  240. //是否可以操作
  241. $event['is_operation'] = 1;
  242. }
  243. Message::setRead(Message::EVENT_TYPE, $id, $this->auth->id);
  244. $this->success('请求成功', $event);
  245. }
  246. //客户需求
  247. public function addNeeds()
  248. {
  249. $event_id = input('event_id');
  250. $needs = input('needs');
  251. if (empty($event_id) || empty($needs)) {
  252. $this->error('参数不能为空');
  253. }
  254. $data = [
  255. 'event_id' => $event_id,
  256. 'staff_id' => $this->auth->id,
  257. 'needs' => $needs
  258. ];
  259. $needs = new EventNeeds();
  260. $needs->save($data);
  261. $this->success('新增成功');
  262. }
  263. //客户需求列表
  264. public function getNeedsList()
  265. {
  266. $event_id = input('event_id');
  267. $where = ['event_id' => $event_id];
  268. $needs = new EventNeeds();
  269. $list = $needs->where($where)->order('id desc')->select();
  270. $this->success('请求成功', $list);
  271. }
  272. //添加日程进度
  273. public function addSign()
  274. {
  275. $location = input('location');
  276. $lng = input('lng');
  277. $lat = input('lat');
  278. $file_ids = input('file_ids');
  279. // 1 开始 2 到访 3 结束 4 回公司
  280. $event_process = input('event_process');
  281. $event_id = input('event_id');
  282. $content = input('content', '');
  283. $call_content = input('call_content', '');//通话内容
  284. $is_successful = input('is_successful', 0);//是否达成预期目的 1是 2否(完成时提交)
  285. $achieve_purpose = input('achieve_purpose', '');//达成目的
  286. $consume = input('consume/a');
  287. $car_type = input('car_type');//出行工具
  288. $car_number = input('car_number');//出行工具
  289. $start_mileage = input('start_mileage',0,'intval');//起始公里数
  290. $end_mileage = input('end_mileage',0,'intval');//起始公里数
  291. $back_mileage = input('back_mileage',0,'intval');//返程公里数
  292. $needs = input('needs');//客户需求
  293. $last_event = input('last_event');//下一行程
  294. $where = ['id' => $event_id];
  295. $event = EventModel::where($where)->find();
  296. if (empty($event)) {
  297. $this->error('日程不存在');
  298. }
  299. if ($event['process'] >= $event_process) {
  300. $this->error('日程状态修改错误');
  301. }
  302. $customer = Customer::where(['id' => $event['relation_id']])->find();
  303. if (empty($lng) && empty($lat)) {
  304. $distance = '';
  305. } elseif (empty($customer['lng']) && empty($customer['lat'])) {
  306. $distance = '';
  307. } else {
  308. $distance = getdistance($customer['lng'], $customer['lat'], $lng, $lat);
  309. }
  310. if (in_array($event['event_type'], ['客户服务_电话', '客户服务_微信', '售后服务_电话'])) {
  311. if ($event_process == 1) {
  312. $event_process_text = '开始任务';
  313. } else if ($event_process == 3) {
  314. $event_process_text = '完成任务';
  315. } else {
  316. $event_process_text = $event_process;
  317. }
  318. } else {
  319. $event_process_text = $event_process;
  320. }
  321. $data = [
  322. 'staff_id' => $this->auth->id,
  323. 'location' => $location,
  324. 'lng' => $lng,
  325. 'lat' => $lat,
  326. 'file_ids' => $file_ids,
  327. 'customer_id' => $event['relation_id'],//客户id
  328. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  329. 'relation_id' => $event['id'],//签到关联id
  330. 'relation_process' => $event_process_text,//进度
  331. 'customer_status' => $customer['contract_status'],//成交状态
  332. 'content' => $content ?? '',//处理结果
  333. 'distance' => $distance,
  334. ];
  335. //存在通话内容
  336. if ($call_content) {
  337. $data['content'] = '处理结果:' . $data['content'] . '<br>电话内容:' . $call_content;
  338. }
  339. if ($car_type) {
  340. $data['content'] = '备注:' . $data['content'] . '<br>出行方式:' . $car_type;
  341. if ($start_mileage) {
  342. $data['content'] .= "($start_mileage)";
  343. }
  344. }
  345. if ($needs) {
  346. $data['content'] = '备注:' . $data['content'] . '<br>客户需求:' . $needs;
  347. }
  348. if ($end_mileage) {
  349. if ($end_mileage <= $event['start_mileage']) {
  350. $this->error('结束公里数不能小于起始公里数');
  351. }
  352. $data['content'] = '备注:' . $data['content'] . '<br>出行方式:' . $event['car_type'];
  353. if ($end_mileage) {
  354. $data['content'] .= "($end_mileage)";
  355. }
  356. }
  357. if ($back_mileage) {
  358. if ($back_mileage <= $event['end_mileage']) {
  359. $this->error('结束公里数不能小于起始公里数');
  360. }
  361. $data['content'] = '备注:' . $data['content'] . '<br>出行方式:' . $event['car_type'];
  362. if ($end_mileage) {
  363. $data['content'] .= "($back_mileage)";
  364. }
  365. }
  366. Db::startTrans();
  367. try {
  368. //创建签到记录
  369. StaffSignIn::createSignIn($data);
  370. //修改日程状态
  371. EventModel::updateProcess($event['id'], $event_process, $last_event);
  372. $update = [];
  373. if ($event_process == 3) {//
  374. $update = ['is_successful' => $is_successful, 'achieve_purpose' => $achieve_purpose];
  375. }
  376. //通话内容
  377. if ($call_content) {
  378. $update['call_content'] = $call_content;
  379. }
  380. if ($needs) {
  381. $update['needs'] = $needs;
  382. }
  383. if ($car_type) {//出行方式
  384. $update['car_type'] = $car_type;
  385. $update['car_number'] = $car_number;
  386. }
  387. if ($start_mileage) {//起始公里数
  388. $update['start_mileage'] = $start_mileage;
  389. }
  390. if ($end_mileage) {//结束公里数
  391. //根据 起始公里数 ,录入行程费用
  392. $mileage = $end_mileage - $event['start_mileage'];
  393. $mileage_consume = [
  394. 'title' => $event['title'] . '-路程费用',
  395. 'number' => Consume::getNumber(),
  396. 'customer_id' => $event['customer_id'],
  397. 'relation_id' => $event_id,
  398. 'relation_type' => Consume::EVENT_TYPE,
  399. 'submit_date' => date('Y-m-d'),
  400. 'remark' => '',
  401. 'money' => Consume::getMileageMoney($mileage)
  402. ];
  403. $files = StaffSignIn::where(['relation_type' => StaffSignIn::EVENT_TYPE, 'relation_id' => $event_id])->column('file_ids');
  404. $mileage_consume['detail'][] = [
  405. 'consume_date' => date('Y-m-d'),
  406. 'consume_type' => '交通费',
  407. 'consume_money' => Consume::getMileageMoney($mileage),
  408. 'mileage' => $mileage,
  409. 'car_number' => $event['car_number'],
  410. 'car_type' => $event['car_type'],
  411. 'start_mileage' => $event['start_mileage'],
  412. 'end_mileage' => $end_mileage,
  413. 'file_ids' => implode(',', $files)
  414. ];
  415. Consume::createConsume($mileage_consume);
  416. $update['end_mileage'] = $end_mileage;
  417. }
  418. if ($back_mileage) {//结束公里数
  419. //根据 起始公里数 ,录入行程费用
  420. $mileage = $back_mileage - $event['end_mileage'];
  421. $mileage_consume = [
  422. 'title' => $event['title'] . '-路程费用',
  423. 'number' => Consume::getNumber(),
  424. 'customer_id' => $event['customer_id'],
  425. 'relation_id' => $event_id,
  426. 'relation_type' => Consume::EVENT_TYPE,
  427. 'submit_date' => date('Y-m-d'),
  428. 'remark' => '',
  429. 'money' => Consume::getMileageMoney($mileage)
  430. ];
  431. $files = StaffSignIn::where(['relation_type' => StaffSignIn::EVENT_TYPE, 'relation_id' => $event_id])->column('file_ids');
  432. $mileage_consume['detail'][] = [
  433. 'consume_date' => date('Y-m-d'),
  434. 'consume_type' => '交通费',
  435. 'consume_money' => Consume::getMileageMoney($mileage),
  436. 'mileage' => $mileage,
  437. 'car_number' => $event['car_number'],
  438. 'car_type' => $event['car_type'],
  439. 'start_mileage' => $event['end_mileage'],
  440. 'end_mileage' => $back_mileage,
  441. 'file_ids' => implode(',', $files)
  442. ];
  443. Consume::createConsume($mileage_consume);
  444. $update['back_mileage'] = $back_mileage;
  445. }
  446. if ($update) {
  447. $model = new EventModel;
  448. $model->save($update, ['id' => $event['id']]);
  449. }
  450. if ($consume) {
  451. $consume['title'] = $event['title'] . '-出发费用';
  452. $consume['customer_id'] = $event['customer_id'];
  453. $consume['relation_type'] = Consume::EVENT_TYPE;
  454. $consume['relation_id'] = $event_id;
  455. Consume::createConsume($consume);
  456. }
  457. Db::commit();
  458. } catch (Exception $e) {
  459. Db::rollback();
  460. Log::error('错误:' . $e->getMessage());
  461. $this->error($e->getMessage());
  462. }
  463. $status_text = [1 => '开始任务', 2 => '签到成功', 3 => '完成任务', 4 => '返程签到成功'];
  464. $this->success($status_text[$event_process_text] ?? $event_process_text);
  465. }
  466. //修改日程状态
  467. public function updateStatus()
  468. {
  469. //日程状态 0未开始 1开始任务 2 已结束 3 已取消
  470. $status = input('status');
  471. $file_ids = input('file_ids');
  472. $event_id = input('event_id');
  473. $content = input('content');
  474. $where = ['id' => $event_id];
  475. $event = EventModel::where($where)->find();
  476. if (empty($event)) {
  477. $this->error('日程不存在');
  478. }
  479. $status_text = [1 => '开始任务', 2 => '完成任务', 3 => '任务终止'];
  480. $data = [
  481. 'staff_id' => $this->auth->id,
  482. 'file_ids' => $file_ids,
  483. 'customer_id' => $event['relation_id'],//客户id
  484. 'relation_process' => $status_text[$status] ?? '进行中',//日程类型
  485. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  486. 'relation_id' => $event['id'],//签到关联id
  487. 'content' => $content,
  488. ];
  489. Db::startTrans();
  490. try {
  491. //创建签到记录
  492. StaffSignIn::createSignIn($data);
  493. //修改日程状态
  494. EventModel::changeStatus($event['id'], $status);
  495. if ($status == 2) {
  496. Message::addMessage(StaffSignIn::EVENT_TYPE, $event['id'], $event['owner_staff_id'], $this->auth->id, "任务《{$event['title']}》已完成,请及时审阅!");
  497. } elseif ($status == 3) {
  498. Message::addMessage(StaffSignIn::EVENT_TYPE, $event['id'], $event['create_staff_id'], $this->auth->id, "任务《{$event['title']}》被终止,请及时审阅!");
  499. }
  500. Db::commit();
  501. } catch (Exception $e) {
  502. Db::rollback();
  503. Log::error('错误:' . $e->getMessage());
  504. $this->error($e->getMessage());
  505. }
  506. $this->success('操作成功');
  507. }
  508. //获取签到信息
  509. public function getSign()
  510. {
  511. $customer_id = input('customer_id', 0, 'intval');
  512. $event_id = input('event_id', 0, 'intval');
  513. $limit = input('limit', 0);
  514. $where = [
  515. // 'staff_id' => ['in', \addons\qingdongams\model\Staff::getMyStaffIds()],
  516. 'relation_type' => StaffSignIn::EVENT_TYPE,
  517. ];
  518. if ($event_id) {
  519. $where['relation_id'] = $event_id;
  520. }
  521. if ($customer_id) {
  522. $where['customer_id'] = $customer_id;
  523. }
  524. $staffSign = StaffSignIn::where($where)->with(['staff', 'customer'])->order('id desc')->paginate($limit);
  525. //标记 日程已读
  526. Message::where([
  527. 'relation_type' => Message::RECORD_TYPE,
  528. 'to_staff_id' => $this->auth->id,
  529. 'status' => 0
  530. ])->update(['read_time' => time(), 'status' => 1]);
  531. $this->success('请求成功', $staffSign);
  532. }
  533. //指派负责人
  534. public function assign_event()
  535. {
  536. $id = input('id');
  537. $staff_id = input('staff_id');
  538. $desc = input('desc');
  539. $row = EventModel::where(['id' => $id])->find();
  540. if (empty($row)) {
  541. $this->error('日程信息不存在');
  542. }
  543. $staff = \addons\qingdongams\model\Staff::info();
  544. $data = [
  545. 'staff_id' => $this->auth->id,
  546. 'customer_id' => $row['relation_id'],//客户id
  547. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  548. 'relation_id' => $row['id'],//签到关联id
  549. 'relation_process' => '指派负责人',//进度
  550. 'content' => $staff->name . '指派负责人',
  551. ];
  552. Db::startTrans();
  553. try {
  554. //创建签到记录
  555. StaffSignIn::createSignIn($data);
  556. EventModel::where(['id' => $id])->update([
  557. 'staff_id' => $staff_id,
  558. ]);
  559. //发送通知
  560. Message::addMessage(Message::EVENT_TYPE, $id, $staff_id, $staff->id,
  561. $staff->name . '指派给您一项任务,请您及时接受!');
  562. Db::commit();
  563. } catch (Exception $e) {
  564. Db::rollback();
  565. $this->error($e->getMessage());
  566. }
  567. $this->success('指派成功');
  568. }
  569. //完成日程
  570. public function complete_event()
  571. {
  572. $id = input('id');
  573. $is_successful = input('is_successful');
  574. $achieve_purpose = input('achieve_purpose', '');
  575. $row = EventModel::where(['id' => $id])->find();
  576. if (empty($row)) {
  577. $this->error('日程信息不存在');
  578. }
  579. $staff = \addons\qingdongams\model\Staff::info();
  580. $data = [
  581. 'staff_id' => $this->auth->id,
  582. 'customer_id' => $row['relation_id'],//客户id
  583. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  584. 'relation_id' => $row['id'],//签到关联id
  585. 'relation_process' => '完成日程',//进度
  586. 'content' => $staff->name . '完成日程',
  587. ];
  588. Db::startTrans();
  589. try {
  590. //创建签到记录
  591. StaffSignIn::createSignIn($data);
  592. EventModel::where(['id' => $id])->update(['is_successful' => $is_successful, 'achieve_purpose' => $achieve_purpose, 'status' => 2]);
  593. Db::commit();
  594. } catch (Exception $e) {
  595. Db::rollback();
  596. $this->error($e->getMessage());
  597. }
  598. $this->success('指派成功');
  599. }
  600. //撤销任务
  601. public function revokeEvent()
  602. {
  603. //日程状态 0未开始 1开始任务 2 已结束 3 已取消
  604. $event_id = input('event_id');
  605. $content = input('content', '');
  606. $where = ['id' => $event_id];
  607. $event = EventModel::where($where)->find();
  608. if (empty($event)) {
  609. $this->error('日程不存在');
  610. }
  611. if ($event['staff_id'] != $this->auth->id) {
  612. $this->error('只有任务负责人才能撤销任务');
  613. }
  614. $data = [
  615. 'staff_id' => $this->auth->id,
  616. 'customer_id' => $event['relation_id'],//客户id
  617. 'relation_process' => '撤销任务',//日程类型
  618. 'relation_type' => StaffSignIn::EVENT_TYPE,//日程类型
  619. 'relation_id' => $event['id'],//签到关联id
  620. 'content' => $content,
  621. ];
  622. Db::startTrans();
  623. try {
  624. //创建签到记录
  625. StaffSignIn::createSignIn($data);
  626. //修改日程状态
  627. EventModel::where(['id' => $event_id])->update(['process' => 0, 'staff_id' => $event['create_staff_id']]);
  628. Message::addMessage(StaffSignIn::EVENT_TYPE, $event['id'],$event['create_staff_id'], $this->auth->id, "任务《{$event['title']}》已撤销,请及时审阅!");
  629. Db::commit();
  630. } catch (Exception $e) {
  631. Db::rollback();
  632. Log::error('错误:' . $e->getMessage());
  633. $this->error($e->getMessage());
  634. }
  635. $this->success('操作成功');
  636. }
  637. /**
  638. * 添加外勤签到
  639. */
  640. public function addOutSign()
  641. {
  642. $params = $this->request->post();
  643. $lng = input('lng');
  644. $lat = input('lat');
  645. if (empty($lng) || empty($lat)) {
  646. $this->error('地理位置不能为空');
  647. }
  648. $result = FormField::checkFields(FormField::SIGNIN_TYPE, $params);
  649. if ($result !== true) {
  650. $this->error($result);
  651. }
  652. $other = [];
  653. foreach ($params as $name => $val) {
  654. if (strstr($name, 'other_') !== false) {
  655. if (is_array($val)) {
  656. $other[$name] = implode(',', $val);
  657. } else {
  658. $other[$name] = $val;
  659. }
  660. unset($params[$name]);
  661. } else {
  662. if ($params[$name] === '') {
  663. $params[$name] = NULL;
  664. }
  665. }
  666. }
  667. $params['relation_process'] = '出差签到';
  668. $params['staff_id'] = $this->auth->id;
  669. $params['other'] = json_encode($other, JSON_UNESCAPED_UNICODE);
  670. $model = new StaffSignIn();
  671. if ($model->allowField(true)->save($params)) {
  672. $lastId = $model->getLastInsID();
  673. //通知上级
  674. Message::addMessage(Message::SIGN_TYPE, $lastId, $this->auth->parent_id, $this->auth->id);
  675. $this->success('签到成功');
  676. }
  677. $this->error('签到失败');
  678. }
  679. /**
  680. * 获取外勤签到列表
  681. */
  682. public function getOutSign()
  683. {
  684. $customer_id = input('customer_id', 0, 'intval');
  685. $limit = input("limit/d", 10);
  686. $params = $this->request->post();
  687. $where = FormField::updateWhereField(FormField::SIGNIN_TYPE, $params);
  688. $type = input('type', 0);// 0 全部 1 我创建 2 下属创建
  689. if ($type == 1) {//我的客户
  690. $where['staff_id'] = $this->auth->id;
  691. } elseif ($type == 2) {//下属负责的客户
  692. $where['staff_id'] = ['in', Staff::getLowerStaffId()];
  693. } else {
  694. $where['staff_id'] = ['in', Staff::getMyStaffIds()];
  695. }
  696. if ($customer_id) {
  697. $where['customer_id'] = $customer_id;
  698. }
  699. $where['relation_process'] = '出差签到';
  700. $staffSign = StaffSignIn::where($where)->with(['staff', 'customer'])
  701. ->order('id desc')->paginate($limit);
  702. //标记通知已读
  703. Message::setRead(Message::SIGN_TYPE, 0, $this->auth->id);
  704. $this->success('请求成功', $staffSign);
  705. }
  706. /**
  707. * 获取签到详情
  708. */
  709. public function getOutSignDetail()
  710. {
  711. $id = input('id', 0, 'intval');
  712. $staffSign = StaffSignIn::where(['id' => $id])->with(['staff', 'customer'])->find();
  713. if (empty($staffSign)) {
  714. $this->error('数据不存在');
  715. }
  716. $staffSign = $staffSign->toArray();
  717. $other = json_decode($staffSign['other'], true);
  718. $staffSign = array_merge($staffSign, $other);
  719. $staffSign = Form::getDataDetail(Form::SIGNIN_TYPE, $staffSign);
  720. $this->success('请求成功', $staffSign);
  721. }
  722. }