Event.php 45KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 日程
  4. // +----------------------------------------------------------------------
  5. // | Author: Michael_xu | gengxiaoxu@5kcrm.com
  6. // +----------------------------------------------------------------------
  7. namespace app\oa\model;
  8. use app\admin\controller\ApiCommon;
  9. use think\Db;
  10. use app\admin\model\Common;
  11. use app\admin\model\Message;
  12. use think\Request;
  13. use think\Validate;
  14. use think\helper\Time;
  15. class Event extends Common
  16. {
  17. /**
  18. * 为了数据库的整洁,同时又不影响Model和Controller的名称
  19. * 我们约定每个模块的数据表都加上相同的前缀,比如CRM模块用crm作为数据表前缀
  20. */
  21. protected $name = 'oa_event';
  22. protected $createTime = 'create_time';
  23. protected $updateTime = 'update_time';
  24. protected $autoWriteTimestamp = true;
  25. //类型转换
  26. protected $dateFormat = 'Y-m-d H:i:s';
  27. protected $type = [
  28. 'start_time' => 'timestamp',
  29. 'end_time' => 'timestamp',
  30. ];
  31. /**
  32. * [getDataList 日程list]
  33. * @param [by] $by [查询时间段类型]
  34. * @return [array] [description]
  35. * @author Michael_xu
  36. */
  37. public function getDataList($param)
  38. {
  39. $userModel = new \app\admin\model\User();
  40. $recordModel = new \app\admin\model\Record();
  41. $user_id = $param['user_id'];
  42. //默认本账户or 自定义用户id
  43. if ($param['star_time'] && $param['end_time']) {
  44. $start_time = $param['star_time'];
  45. $end_time = $param['end_time'];
  46. } else {
  47. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  48. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  49. }
  50. $where = '( ( start_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) )
  51. OR ( ( end_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) )
  52. OR ( start_time < ' . $start_time . ' AND end_time > ' . $end_time . ' AND ( create_user_id = ' . $user_id . ' or owner_user_ids like "%,' . $user_id . ',%" ) )';
  53. $event_date = Db::name('OaEvent')->where($where)->select();
  54. foreach ($event_date as $k=>$v) {
  55. $event_date[$k]['create_user_info'] = $userModel->getUserById($v['create_user_id']);
  56. $event_date[$k]['ownerList'] = $userModel->getDataByStr($v['owner_user_ids']) ? : [];
  57. $list = db('admin_oa_schedule')->where('schedule_id',$v['schedule_id'])->find();
  58. $event_date[$k]['color']= $list['color'] ;
  59. $relationArr= [];
  60. $relationArr = $recordModel->getListByRelationId('event', $v['event_id']);
  61. $event_date[$k]['businessList'] = $relationArr['businessList'];
  62. $event_date[$k]['contactsList'] = $relationArr['contactsList'];
  63. $event_date[$k]['contractList'] = $relationArr['contractList'];
  64. $event_date[$k]['customerList'] = $relationArr['customerList'];
  65. $event_date[$k]['remindtype'] = (int)$v['remindtype'];
  66. $noticeInfo = Db::name('OaEventNotice')->where(['event_id' => $v['event_id']])->find();
  67. $is_repeat = 0;
  68. if ($noticeInfo) {
  69. $is_repeat = 1;
  70. }
  71. $event_date[$k]['is_repeat'] = $is_repeat;
  72. $event_date[$k]['stop_time'] = $noticeInfo ? $noticeInfo['stop_time'] : '';
  73. $event_date[$k]['noticetype'] = $noticeInfo ? $noticeInfo['noticetype'] : '';
  74. if ($noticeInfo['noticetype'] == '2') {
  75. $event_date[$k]['repeat'] = $noticeInfo['repeated'] ? explode('|||',$noticeInfo['repeated']) : [];
  76. } else {
  77. $event_date[$k]['repeat'] = '';
  78. }
  79. //权限
  80. $is_update = 0;
  81. $is_delete = 0;
  82. if ($user_id == $v['create_user_id']) {
  83. $is_update = 1;
  84. $is_delete = 1;
  85. }
  86. $permission['is_update'] = $is_update;
  87. $permission['is_delete'] = $is_delete;
  88. $event_date[$k]['permission'] = $permission;
  89. $event_date[$k]['start_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  90. $event_date[$k]['end_time'] = !empty($v['end_time']) ? $v['end_time'] * 1000 : null;
  91. $event_date[$k]['type_id'] = $v['schedule_id'];
  92. }
  93. return $event_date ? : [];
  94. }
  95. /**
  96. * 系统自定义类型数据(任务)
  97. *
  98. * @param $param
  99. * @return bool|\PDOStatement|string|\think\Collection
  100. * @throws \think\db\exception\DataNotFoundException
  101. * @throws \think\db\exception\ModelNotFoundException
  102. * @throws \think\exception\DbException
  103. */
  104. public function eventTask($param)
  105. {
  106. $user_id = $param['user_id'];
  107. // 默认本账户or 自定义用户id
  108. if ($param['start_time'] && $param['end_time']) {
  109. $start_time = $param['start_time'];
  110. $end_time = $param['end_time'];
  111. } else {
  112. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  113. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  114. }
  115. $between_time =
  116. '((stop_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%"))
  117. OR ((stop_time > ' . $start_time . ' AND stop_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%"))
  118. OR ((stop_time > ' . $start_time . ' AND stop_time >' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id like "%,' . $user_id . ',%"))';
  119. //分配的任务 负责人或参与人是当前用户
  120. $event_date = db('task')->where(['stop_time' => ['>', 0], 'ishidden' => ['=', 0]])->where($between_time)
  121. ->field('task_id,name,start_time,stop_time')->select();
  122. foreach ($event_date as $k1 => $v) {
  123. $event_date[$k1]['color'] = 1;
  124. $event_date[$k1]['type_id'] = 1;
  125. $event_date[$k1]['type'] = 2;
  126. $event_date[$k1]['start_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  127. $event_date[$k1]['stop_time'] = !empty($v['stop_time']) ? $v['stop_time'] * 1000 : null;
  128. }
  129. return $event_date;
  130. }
  131. /**
  132. * 系统自定义类型数据(客户)
  133. *
  134. * @param $param
  135. * @return array|mixed
  136. * @throws \think\db\exception\DataNotFoundException
  137. * @throws \think\db\exception\ModelNotFoundException
  138. * @throws \think\exception\DbException
  139. */
  140. public function eventCrm($param)
  141. {
  142. $userModel = new \app\admin\model\User();
  143. $recordModel = new \app\admin\model\Record();
  144. $user_id = $param['user_id'];
  145. //默认本账户or 自定义用户id
  146. if ($param['start_time'] && $param['end_time']) {
  147. $start_time = $param['start_time'];
  148. $end_time = $param['end_time'];
  149. if (strlen($start_time) == 13) $start_time = $start_time / 1000;
  150. if (strlen($end_time) == 13) $end_time = $end_time / 1000;
  151. } else {
  152. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  153. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  154. }
  155. $between_time = '';
  156. //需要联系的客户 next_time crm_customer
  157. $between_time = '((next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . '))
  158. OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id =' . $user_id . '))
  159. OR ((next_time > ' . $start_time . ' AND next_time > ' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . '))';
  160. $event_date = db('crm_customer')->where(['next_time' => ['>', 0], 'owner_user_id' => ['<>', 0]])->where($between_time)->where('')
  161. ->field('next_time as start_time,customer_id,name ')->group('start_time')->select();
  162. $item = [];
  163. foreach ($event_date as $k2 => $v) {
  164. $event_date[$k2]['color'] = 2;
  165. $event_date[$k2]['type_id'] = 2;
  166. $event_date[$k2]['type'] = 'customer';
  167. $event_date[$k2]['start_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  168. $event_date[$k2]['stop_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  169. $event_date[$k2]['stop_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  170. $item[] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : '';
  171. }
  172. $list_data['customer'] = $item ? array_values(array_unique($item)) : [];
  173. //即将到期的合同 end_time
  174. $starts_time = date('Y-m-d', $start_time);
  175. $ends_time = date('Y-m-d', $end_time);
  176. $searchMap = function ($query) use ($starts_time, $ends_time) {
  177. $query->where('end_time', array('between', [$starts_time, $ends_time]))
  178. ->whereOr('end_time', array('gt', $ends_time));
  179. };
  180. //需要联系的客户 next_time crm_customer
  181. $between['create_user_id|owner_user_id'] = ['eq', $user_id];
  182. $event_date = db('crm_contract')->where('end_time', '>', 0)->where($searchMap)->where($between)
  183. ->field('end_time as start_time,contract_id,name ')
  184. ->group('start_time')
  185. ->select();
  186. unset($item);
  187. foreach ($event_date as $k3 => $v) {
  188. $event_date[$k3]['color'] = 3;
  189. $event_date[$k3]['type_id'] = 3;
  190. $event_date[$k3]['type'] = 'contract';
  191. $event_date[$k3]['start_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  192. $event_date[$k3]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  193. $item[] = $v['start_time'] ? $v['start_time'] : '';
  194. }
  195. $list_data['contract'] = $item ? array_values(array_unique($item)) : [];
  196. //计划回款 return_date
  197. $between_receivables = function ($query) use ($starts_time, $ends_time) {
  198. $query->where('r.return_date', array('between', [$starts_time, $ends_time]))
  199. ->whereOr('r.return_date', array('gt', $ends_time));
  200. };
  201. $receivables['r.create_user_id|r.owner_user_id'] = ['eq', $user_id];
  202. $event_date = db('crm_receivables_plan')
  203. ->alias('r')
  204. ->where(['r.status' => 0, 'r.return_date' => ['>', 0]])
  205. ->where($between_receivables)
  206. ->where($receivables)
  207. ->field('r.return_date as start_time')
  208. ->group('start_time')
  209. ->select();
  210. unset($item);
  211. foreach ($event_date as $k4 => $v) {
  212. $event_date[$k4]['color'] = 4;
  213. $event_date[$k4]['type_id'] = 4;
  214. $event_date[$k4]['type'] = 'receivables_plan';
  215. $event_date[$k4]['start_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  216. $event_date[$k4]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  217. $item[] = $v['start_time'] ? $v['start_time'] : '';
  218. }
  219. $list_data['receivables'] = $item ? array_values(array_unique($item)) : [];
  220. //需联系的线索 next_time
  221. $between_time = '(( next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ')AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))
  222. OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))
  223. OR ((next_time > ' . $start_time . ' AND next_time > ' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))';
  224. $event_date = db('crm_leads')
  225. ->where($between_time)
  226. ->where(['next_time' => ['>', 0], 'is_transform' => 0])
  227. ->field('next_time as start_time,leads_id,name')
  228. ->group('next_time')
  229. ->select();
  230. unset($item);
  231. foreach ($event_date as $k5 => $v) {
  232. $event_date[$k5]['color'] = 5;
  233. $event_date[$k5]['type_id'] = 5;
  234. $event_date[$k5]['type'] = 'leads';
  235. $event_date[$k5]['start_time'] = $v['start_time'] * 1000;
  236. $event_date[$k5]['stop_time'] = !empty($v['start_time']) ? $v['start_time'] * 1000 : null;
  237. $item[] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : '';
  238. }
  239. $list_data['leads'] = $item ? array_values(array_unique($item)) : [];
  240. //需联系的商机 next_time
  241. $between_time =
  242. '((next_time BETWEEN ' . $start_time . ' AND ' . $end_time . ' ) AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))
  243. OR ((next_time > ' . $start_time . ' AND next_time <' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))
  244. OR ((next_time > ' . $start_time . ' AND next_time >' . $end_time . ') AND ( create_user_id = ' . $user_id . ' or owner_user_id = ' . $user_id . ' ))';
  245. $event_date = db('crm_business')->where($between_time)->where('next_time', '>', 0)->field('next_time as start_time,business_id,name ')->select();
  246. unset($item);
  247. foreach ($event_date as $k6 => $v) {
  248. $event_date[$k6]['color'] = 6;
  249. $event_date[$k6]['type_id'] = 6;
  250. $event_date[$k6]['type'] = 'business';
  251. $event_date[$k6]['start_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  252. $event_date[$k6]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  253. $item[] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : '';
  254. }
  255. $list_data['businessNext'] = $item ? array_values(array_unique($item)) : [];
  256. //需要联系的客户 next_time crm_customer
  257. $return_time = date('Y-m-d', $start_time);
  258. $return_end = date('Y-m-d', $end_time);
  259. $searchMap = function ($query) use ($return_time, $return_end) {
  260. $query->where('deal_date', array('between', [$return_time, $return_end]))
  261. ->whereOr('deal_date', array('gt', $return_end));
  262. };
  263. $between['create_user_id|owner_user_id'] = ['eq', $user_id];
  264. $event_date = db('crm_business')
  265. ->where('deal_date', '>', 0)
  266. ->where($between)
  267. ->where($searchMap)
  268. ->field('deal_date as start_time,business_id,name')
  269. ->group('start_time')
  270. ->select();
  271. unset($item);
  272. foreach ($event_date as $k7 => $v) {
  273. $event_date[$k7]['color'] = 7;
  274. $event_date[$k7]['type_id'] = 7;
  275. $event_date[$k7]['type'] = 'business';
  276. $event_date[$k7]['start_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  277. $event_date[$k7]['stop_time'] = !empty($v['start_time']) ? strtotime($v['start_time']) * 1000 : null;
  278. $item[] = $v['start_time'] ? $v['start_time'] : '';
  279. }
  280. $list_data['business'] = $item ? array_values(array_unique($item)) : [];
  281. return $list_data ?: [];
  282. }
  283. /**
  284. * 日历上显示
  285. * @return array
  286. * @throws \think\db\exception\DataNotFoundException
  287. * @throws \think\db\exception\ModelNotFoundException
  288. * @throws \think\exception\DbException
  289. */
  290. public function listStatus($param)
  291. {
  292. $userId = $param['user_id'];
  293. if ($param['start_time'] && $param['end_time']) {
  294. $start_time = $param['start_time'];
  295. $end_time = $param['end_time'];
  296. } else {
  297. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  298. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  299. }
  300. $list = Db::name('oa_event')->where(['end_time' => ['>', 0], 'start_time' => ['>', 0]])
  301. ->where(function ($query) use ($userId) {
  302. $query->whereOr('create_user_id', $userId);
  303. $query->whereOr(['owner_user_ids' => ['in', $userId]]);
  304. })->select();
  305. foreach ($list as $k => $v) {
  306. $list[$k]['start_time'] = $v['start_time'] ? date('Y-m-d', $v['start_time']) : null;
  307. $list[$k]['end_time'] = $v['end_time'] ? date('Y-m-d', $v['end_time']) : null;
  308. }
  309. return $list;
  310. }
  311. /**
  312. * 类型列表
  313. * @return array|void
  314. * @throws \think\db\exception\DataNotFoundException
  315. * @throws \think\db\exception\ModelNotFoundException
  316. * @throws \think\exception\DbException
  317. */
  318. public function schedule($param)
  319. {
  320. $item = db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->select();
  321. if ($item) {
  322. $list = db('admin_oa_schedule')->select();
  323. foreach ($list as $k => $v) {
  324. foreach ($item as $val) {
  325. if ($val['schedule_id'] == $v['schedule_id'] && $val['type'] == 0) {
  326. $list[$k]['is_select'] = 0;
  327. }
  328. if ($val['schedule_id'] == $v['schedule_id'] && $val['type'] == 1) {
  329. $list[$k]['is_select'] = 1;
  330. }
  331. }
  332. $list[$k]['type_id'] = $v['schedule_id'];
  333. $list[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  334. }
  335. } else {
  336. $list = db('admin_oa_schedule')->select();
  337. foreach ($list as $k=> $v){
  338. $list[$k]['is_select'] = 1;
  339. }
  340. }
  341. $data['list'] = $list;
  342. return $data;
  343. }
  344. /**
  345. * 修改展示类型
  346. * @param $param
  347. * @return array
  348. * @throws \think\db\exception\DataNotFoundException
  349. * @throws \think\db\exception\ModelNotFoundException
  350. * @throws \think\exception\DbException
  351. */
  352. public function saveSchedule($param)
  353. {
  354. $item = db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->select();
  355. $items = db('admin_oa_schedule')->select();
  356. $item_schedule_id = array_column($items, 'schedule_id');
  357. $schedule_id = array_diff($item_schedule_id, $param['schedule_id']);
  358. foreach ($param['schedule_id'] as $v) {
  359. if ($item) {
  360. $res = db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id'], 'schedule_id' => $v])->find();
  361. if ($res) {
  362. if ($res['type'] == 1) {
  363. db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id']])
  364. ->whereIn('schedule_id', implode(',', $schedule_id))
  365. ->update(['type' => 0]);
  366. } else {
  367. db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id']])
  368. ->whereIn('schedule_id', arrayToString($param['schedule_id']))
  369. ->update(['type' => 1]);
  370. }
  371. } else {
  372. db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->insert(['schedule_id' => $v, 'user_id' => $param['user_id'], 'type' => 1, 'create_time' => time()]);
  373. }
  374. } else {
  375. db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->insert(['schedule_id' => $v, 'user_id' => $param['user_id'], 'type' => 1, 'create_time' => time()]);
  376. }
  377. }
  378. $data = [];
  379. return $data;
  380. }
  381. /**
  382. * 创建日程信息
  383. *
  384. * @param array $param
  385. * @return bool
  386. * @throws \think\db\exception\DataNotFoundException
  387. * @throws \think\db\exception\ModelNotFoundException
  388. * @throws \think\exception\DbException
  389. */
  390. public function createData($param)
  391. {
  392. $todayTime = Time::today();
  393. # 设置日程参数
  394. $param['create_user_id'] = $param['user_id'];
  395. $param['owner_user_ids'] = arrayToString($param['owner_user_ids']);
  396. $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : $todayTime[0];
  397. $param['end_time'] = !empty($param['end_time']) ? strtotime($param['end_time']) : $todayTime[1];
  398. $param['create_time'] = time();
  399. $param['update_time'] = time();
  400. unset($param['user_id']);
  401. # 关联数据
  402. $relation = [];
  403. if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']);
  404. if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']);
  405. if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']);
  406. if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']);
  407. # 提醒数据
  408. $notice = $param['notice'];
  409. # 删除多余字段
  410. unset($param['customer_ids']);
  411. unset($param['contacts_ids']);
  412. unset($param['business_ids']);
  413. unset($param['contract_ids']);
  414. unset($param['notice']);
  415. if ($this->allowField(true)->save($param)) {
  416. $eventId = $this->event_id;
  417. # 提醒
  418. if (!empty($notice)) {
  419. $noticeData = [];
  420. foreach ($notice as $key => $value) {
  421. $startTime = $param['start_time'];
  422. if ($value['type'] == 1) $startTime = $param['start_time'] - ($value['value'] * 60);
  423. if ($value['type'] == 2) $startTime = $param['start_time'] - ($value['value'] * 60 * 60);
  424. if ($value['type'] == 3) $startTime = $param['start_time'] - ($value['value'] * 60 * 60 * 24);
  425. $noticeData[] = [
  426. 'event_id' => $eventId,
  427. 'noticetype' => $value['type'],
  428. 'number' => $value['value'],
  429. 'start_time' => $startTime,
  430. 'stop_time' => $param['end_time']
  431. ];
  432. }
  433. if (!empty($noticeData)) Db::name('oa_event_notice')->insertAll($noticeData);
  434. }
  435. # 关联数据
  436. if (!empty($relation)) {
  437. $relation['event_id'] = $eventId;
  438. $relation['status'] = 1;
  439. $relation['create_time'] = time();
  440. Db::name('oa_event_relation')->insert($relation);
  441. }
  442. // actionLog($eventId, $param['owner_user_ids'], '', '创建了日程');
  443. $data['event_id'] = $eventId;
  444. // 站内信
  445. $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  446. $messageModel = new Message();
  447. foreach ($item as $value) {
  448. if ($value['noticetype'] == '1') { //分
  449. $dd = $param['start_time'] - ($value['number'] * 60);
  450. } else if ($value['noticetype'] == '2') { //时
  451. $dd = $param['start_time'] - ($value['number'] * 60 * 60);
  452. } else if ($value['noticetype'] == '3') {//天
  453. $dd = $param['start_time'] - ($value['number'] * 60 * 60 * 24);
  454. }
  455. $messageModel->send(
  456. Message::EVENT_MESSAGE,
  457. [
  458. 'title' => $param['title'],
  459. 'action_id' => $value['id'],
  460. 'advance_time' => $dd ?: 0
  461. ],
  462. stringToArray($param['owner_user_ids'])
  463. );
  464. }
  465. RecordActionLog($param['create_user_id'], 'oa_event', 'save',$param['title'], '','','添加了日程:'.$param['title']);
  466. return $data;
  467. } else {
  468. $this->error = '添加失败';
  469. return false;
  470. }
  471. }
  472. /**
  473. * 即将到期合同列表
  474. * @param $param
  475. * @throws \think\db\exception\DataNotFoundException
  476. * @throws \think\db\exception\ModelNotFoundException
  477. * @throws \think\exception\DbException
  478. */
  479. public function eventContract($param)
  480. {
  481. $user_id = $param['user_id'];
  482. $time = $this->eventDataTime($param);
  483. $return_time = `'` . date('Y-m-d', $time[0]) . `'`;
  484. if ($param['type'] == 1) {
  485. $between_time['contract.end_time'] = $return_time;
  486. $between_time['contract.create_user_id|contract.owner_user_id'] = ['eq', $user_id];
  487. $event_date = db('crm_contract')->alias('contract')
  488. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = contract.customer_id', 'LEFT')
  489. ->join('__ADMIN_USER__ u', 'u.id = contract.owner_user_id', 'LEFT')
  490. ->where('contract.end_time', '>', 0)->where($between_time)
  491. ->field('contract.name as contract_name,contract.customer_id,contract.num,contract.contract_id,customer.name,contract.money,contract.start_time,contract.end_time,u.realname as owner_user_name')
  492. ->select();
  493. $count = db('crm_contract')->alias('contract')
  494. ->join('__ADMIN_USER__ user', 'user.id = contract.create_user_id', 'LEFT')
  495. ->join('__ADMIN_USER__ u', 'u.id = contract.owner_user_id', 'LEFT')
  496. ->where('contract.end_time', '>', 0)->where($between_time)->count();
  497. foreach ($event_date as $k => $v) {
  498. $event_date[$k]['start_time'] = $v['start_time'] ? $v['start_time'] : null;
  499. $event_date[$k]['end_time'] = $v['end_time'] ? $v['end_time'] : null;
  500. }
  501. } elseif ($param['type'] == 2) {
  502. $between_time['r.return_date'] = ['=', $return_time];
  503. $between_time['r.create_user_id|r.owner_user_id'] = ['eq', $user_id];
  504. $event_date = db('crm_receivables_plan')
  505. ->alias('r')
  506. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = r.customer_id', 'LEFT')
  507. ->join('__CRM_CONTRACT__ contract', 'contract.contract_id = r.contract_id', 'LEFT')
  508. ->where(['r.status' => 0, 'r.return_date' => ['>', 0]])
  509. ->where($between_time)
  510. ->field('r.contract_id,r.customer_id,r.return_date,r.num as plan_num,r.return_type,customer.name as name,contract.num as contract_num')
  511. ->select();
  512. $count = db('crm_receivables_plan')
  513. ->alias('r')
  514. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = r.customer_id', 'LEFT')
  515. ->join('__CRM_CONTRACT__ contract', 'contract.contract_id = r.contract_id', 'LEFT')
  516. ->where($between_time)
  517. ->where(['r.status' => 0, 'r.return_date' => ['>', 0]])->count();
  518. foreach ($event_date as $k => $v) {
  519. $event_date[$k]['return_date'] = $v['return_date'] ? $v['return_date'] : null;
  520. }
  521. }
  522. $data = [];
  523. $data['list'] = $event_date;
  524. $data['countData'] = $count;
  525. return $data;
  526. }
  527. /**
  528. * 续联系客户
  529. * @param $param
  530. * @throws \think\db\exception\DataNotFoundException
  531. * @throws \think\db\exception\ModelNotFoundException
  532. * @throws \think\exception\DbException
  533. */
  534. public function eventCustomer($param)
  535. {
  536. $user_id = $param['user_id'];
  537. $time = $this->eventDataTime($param);
  538. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  539. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  540. //需要联系的客户 next_time crm_customer
  541. $between_time['customer.next_time'] = ['between', [$return_time, $return_end]];
  542. $between_time['customer.create_user_id|customer.owner_user_id'] = ['eq', $user_id];
  543. $event_date = db('crm_customer')
  544. ->alias('customer')
  545. ->join('__ADMIN_USER__ user', 'user.id = customer.owner_user_id', 'LEFT')
  546. ->where('customer.next_time', '>', 0)->where($between_time)
  547. ->field('customer.customer_id,customer.next_time,customer.name,user.realname as owner_user_name,customer.create_time,customer.last_time')
  548. ->select();
  549. $count = db('crm_customer')
  550. ->alias('customer')
  551. ->join('__ADMIN_USER__ user', 'user.id = customer.owner_user_id', 'LEFT')
  552. ->where('customer.next_time', '>', 0)->where($between_time)->where($wherePool)->count();
  553. foreach ($event_date as $k => $v) {
  554. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  555. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  556. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  557. }
  558. $data = [];
  559. $data['list'] = $event_date;
  560. $data['countData'] = $count;
  561. return $data;
  562. }
  563. /**
  564. * 续联系客户
  565. * @param $param
  566. * @throws \think\db\exception\DataNotFoundException
  567. * @throws \think\db\exception\ModelNotFoundException
  568. * @throws \think\exception\DbException
  569. */
  570. public function eventLeads($param)
  571. {
  572. $user_id = $param['user_id'];
  573. $time = $this->eventDataTime($param);
  574. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  575. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  576. $between_time['leads.next_time'] = ['between', [$return_time, $return_end]];
  577. $between_time['leads.create_user_id|leads.owner_user_id'] = ['eq', $user_id];
  578. $event_date = db('crm_leads')
  579. ->alias('leads')
  580. ->join('__ADMIN_USER__ user', 'user.id = leads.owner_user_id', 'LEFT')
  581. ->where($between_time)
  582. ->where(['leads.next_time' => ['>', 0], 'leads.is_transform' => 0])
  583. ->field('leads.leads_id,leads.next_time,leads.leads_id,leads.name,user.realname as owner_user_name,leads.create_time,leads.last_time')
  584. ->select();
  585. $count = db('crm_leads')
  586. ->alias('leads')
  587. ->join('__ADMIN_USER__ user', 'user.id = leads.owner_user_id', 'LEFT')
  588. ->where($between_time)
  589. ->where(['leads.next_time' => ['>', 0], 'leads.is_transform' => 0])->count();
  590. foreach ($event_date as $k => $v) {
  591. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  592. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  593. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  594. }
  595. $data = [];
  596. $data['list'] = $event_date;
  597. $data['countData'] = $count;
  598. return $data;
  599. }
  600. /**
  601. * 计划回款
  602. * @param $param
  603. * @throws \think\db\exception\DataNotFoundException
  604. * @throws \think\db\exception\ModelNotFoundException
  605. * @throws \think\exception\DbException
  606. */
  607. public function eventBusiness($param)
  608. {
  609. $user_id = $param['user_id'];
  610. $time = $this->eventDataTime($param);
  611. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  612. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  613. //需要联系的客户 next_time crm_customer
  614. $between_time['business.next_time'] = ['between', [$return_time, $return_end]];
  615. $between_time['business.create_user_id|business.owner_user_id'] = ['eq', $user_id];
  616. $event_date = db('crm_business')
  617. ->alias('business')
  618. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  619. ->where($between_time)
  620. ->where('business.next_time', '>', 0)
  621. ->field('business.business_id,business.next_time,business.business_id,business.name,business.last_time,business.create_time,user.realname as owner_user_name')
  622. ->select();
  623. $count = db('crm_business')
  624. ->alias('business')
  625. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  626. ->where($between_time)
  627. ->where('business.next_time', '>', 0)->count();
  628. foreach ($event_date as $k => $v) {
  629. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  630. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  631. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  632. }
  633. $data = [];
  634. $data['list'] = $event_date;
  635. $data['countData'] = $count;
  636. return $data;
  637. }
  638. /**
  639. * 预计成交商机
  640. * @param $param
  641. * @throws \think\db\exception\DataNotFoundException
  642. * @throws \think\db\exception\ModelNotFoundException
  643. * @throws \think\exception\DbException
  644. */
  645. public function eventDealBusiness($param)
  646. {
  647. $user_id = $param['user_id'];
  648. $time = $this->eventDataTime($param);
  649. $return_time = `'` . date('Y-m-d', $time[0]) . `'`;
  650. $return_end = `'` . date('Y-m-d', $time[1]) . `'`;
  651. $between_time['business.deal_date'] = ['between', [$return_time, $return_end]];
  652. $between_time['business.create_user_id|business.owner_user_id'] = ['eq', $user_id];
  653. $event_date = db('crm_business')
  654. ->alias('business')
  655. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  656. ->where('business.deal_date', '>', 0)
  657. ->where($between_time)
  658. ->field('business.business_id,business.deal_date,business.business_id,business.name,business.last_time,business.create_time,user.realname as owner_user_name')
  659. ->select();
  660. $count = db('crm_business')
  661. ->alias('business')
  662. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  663. ->where('business.deal_date', '>', 0)->where($between_time)->count();
  664. foreach ($event_date as $k => $v) {
  665. $event_date[$k]['deal_date'] = $v['deal_date'] ?: null;
  666. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  667. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  668. }
  669. $data = [];
  670. $data['list'] = $event_date;
  671. $data['countData'] = $count;
  672. return $data;
  673. }
  674. /**
  675. * 公共时间处理
  676. * @param $param
  677. */
  678. public function eventDataTime($param)
  679. {
  680. $userModel = new \app\admin\model\User();
  681. $recordModel = new \app\admin\model\Record();
  682. //默认本账户or 自定义用户id
  683. if ($param['start_time'] && $param['end_time']) {
  684. $start_time = $param['start_time'];
  685. $end_time = $param['end_time'];
  686. if (strlen($start_time) == 13) $start_time = $start_time / 1000;
  687. if (strlen($end_time) == 13) $end_time = $end_time / 1000;
  688. } else {
  689. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  690. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  691. }
  692. $data = [];
  693. $data = [$start_time, $end_time];
  694. return $data;
  695. }
  696. /**
  697. * 编辑日程信息
  698. *
  699. * @param $param
  700. * @param string $event_id
  701. * @return bool
  702. * @throws \think\Exception
  703. * @throws \think\db\exception\DataNotFoundException
  704. * @throws \think\db\exception\ModelNotFoundException
  705. * @throws \think\exception\DbException
  706. * @throws \think\exception\PDOException
  707. */
  708. public function updateDataById($param, $event_id = '')
  709. {
  710. $dataInfo = $this->getDataById($event_id, $param);
  711. $user_id=$param['user_id'];
  712. if (!$dataInfo) {
  713. $this->error = '数据不存在或已删除';
  714. return false;
  715. }
  716. if ($dataInfo['create_user_id'] != $param['user_id']) {
  717. $this->error = '没有编辑权限';
  718. return false;
  719. }
  720. $todayTime = Time::today();
  721. # 设置日程参数
  722. $param['create_user_id'] = $param['user_id'];
  723. $param['owner_user_ids'] = arrayToString($param['owner_user_ids']);
  724. $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : $todayTime[0];
  725. $param['end_time'] = !empty($param['end_time']) ? strtotime($param['end_time']) : $todayTime[1];
  726. $param['update_time'] = time();
  727. unset($param['user_id']);
  728. # 关联数据
  729. $relation = [];
  730. if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']);
  731. if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']);
  732. if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']);
  733. if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']);
  734. # 提醒数据
  735. $notice = $param['notice'];
  736. # 删除多余字段
  737. unset($param['customer_ids']);
  738. unset($param['contacts_ids']);
  739. unset($param['business_ids']);
  740. unset($param['contract_ids']);
  741. unset($param['notice']);
  742. if ($this->allowField(true)->save($param, ['event_id' => $event_id])) {
  743. $eventId = $this->event_id;
  744. // actionLog($event_id, $param['owner_user_ids'], '', '修改了日程');
  745. $list = db('oa_event_notice')->where('event_id', $eventId)->select();
  746. if ($list) {
  747. foreach ($list as $k => $v) {
  748. Db::name('admin_message')->where(['type' => 9, 'action_id' => $v['id']])->delete();
  749. }
  750. }
  751. $item = Db::name('OaEventNotice')->where(['event_id' => $eventId])->delete();
  752. # 提醒
  753. if (!empty($notice)) {
  754. $noticeData = [];
  755. $startTime = $param['start_time'];
  756. foreach ($notice as $key => $value) {
  757. if ($value['type'] == 1) $startTime = $param['start_time'] - ($value['number'] * 60);
  758. if ($value['type'] == 2) $startTime = $param['start_time'] - ($value['number'] * 60 * 60);
  759. if ($value['type'] == 3) $startTime = $param['start_time'] - ($value['number'] * 60 * 60 * 24);
  760. $noticeData[] = [
  761. 'event_id' => $eventId,
  762. 'noticetype' => $value['type'],
  763. 'number' => $value['value'],
  764. 'start_time' => $startTime,
  765. 'stop_time' => $param['end_time']
  766. ];
  767. }
  768. if (!empty($noticeData)) {
  769. $item = Db::name('oa_event_notice')->insertAll($noticeData);
  770. if ($item) {
  771. $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  772. foreach ($item as $val) {
  773. if ($value['noticetype'] == '1') { //分
  774. $dd = strtotime($param['start_time']) - ($val['number'] * 60);
  775. } else if ($val['noticetype'] == '2') { //时
  776. $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60);
  777. } else if ($val['noticetype'] == '3') {//天
  778. $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60 * 24);
  779. }
  780. // 站内信
  781. (new Message())->send(
  782. Message::EVENT_MESSAGE,
  783. [
  784. 'title' => $param['title'],
  785. 'action_id' => $val['id'],
  786. 'advance_time' => $dd ?: 0
  787. ],
  788. stringToArray($param['owner_user_ids'])
  789. );
  790. }
  791. }
  792. }
  793. }
  794. $data['event_id'] = $event_id;
  795. if (Db::name('OaEventRelation')->where(['event_id' => $event_id])->find()) {
  796. Db::name('OaEventRelation')->where(['event_id' => $event_id])->update($relation);
  797. } else {
  798. if (!empty($relation)) {
  799. $relation['event_id'] = $eventId;
  800. $relation['status'] = 1;
  801. $relation['create_time'] = time();
  802. Db::name('OaEventRelation')->where(['event_id' => $event_id])->insert($relation);
  803. }
  804. }
  805. RecordActionLog($user_id, 'oa_event','update', $param['title'], '','','修改了日程:'.$param['title']);
  806. return $data;
  807. } else {
  808. $this->error = '编辑失败';
  809. return false;
  810. }
  811. }
  812. /**
  813. * 日程数据
  814. *
  815. * @param string $eventId
  816. * @return Common|array|bool|\PDOStatement|string|\think\Model|null
  817. * @throws \think\db\exception\DataNotFoundException
  818. * @throws \think\db\exception\ModelNotFoundException
  819. * @throws \think\exception\DbException
  820. */
  821. public function getDataById($eventId)
  822. {
  823. # 日程数据
  824. $eventData = Db::name('oa_event')->where('event_id', $eventId)->find();
  825. # 颜色类型
  826. $eventData['color'] = Db::name('admin_oa_schedule')->where('schedule_id', $eventData['schedule_id'])->value('color');
  827. # 创建人信息
  828. $eventData['create_user_name'] = Db::name('admin_user')->where('id', $eventData['create_user_id'])->value('realname');
  829. # 参与人信息
  830. $eventData['owner_user_info'] = Db::name('admin_user')->field(['id', 'realname'])->whereIn('id', trim($eventData['owner_user_ids'], ','))->select();
  831. # 处理日程的日期数据
  832. $eventData['start_time'] = !empty($eventData['start_time']) ? date('Y-m-d H:i:s', $eventData['start_time']) : '';
  833. $eventData['end_time'] = !empty($eventData['end_time']) ? date('Y-m-d H:i:s', $eventData['end_time']) : '';
  834. $eventData['create_time'] = !empty($eventData['create_time']) ? date('Y-m-d H:i:s', $eventData['create_time']) : '';
  835. $eventData['update_time'] = !empty($eventData['update_time']) ? date('Y-m-d H:i:s', $eventData['update_time']) : '';
  836. # 日程提醒数据
  837. $noticeData = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  838. # 整理日程提醒数据
  839. $eventData['notice'] = [];
  840. foreach ($noticeData as $key => $value) {
  841. $eventData['notice'][] = [
  842. 'type' => $value['noticetype'],
  843. 'value' => $value['number']
  844. ];
  845. }
  846. # 关联客户数据
  847. $relationData = Db::name('oa_event_relation')->where('event_id', $eventId)->find();
  848. # 关联的客户数据
  849. $eventData['customer'] = [];
  850. if (!empty($relationData['customer_ids'])) {
  851. $eventData['customer'] = Db::name('crm_customer')->field(['customer_id', 'name'])->whereIn('customer_id', trim($relationData['customer_ids'], ','))->select();
  852. }
  853. # 关联的联系人数据
  854. $eventData['contacts'] = [];
  855. if (!empty($relationData['contacts_ids'])) {
  856. $eventData['contacts'] = Db::name('crm_contacts')->field(['contacts_id', 'name'])->whereIn('contacts_id', trim($relationData['contacts_ids'], ','))->select();
  857. }
  858. # 关联的商机数据
  859. $eventData['business'] = [];
  860. if (!empty($relationData['business_ids'])) {
  861. $eventData['business'] = Db::name('crm_business')->field(['business_id', 'name'])->whereIn('business_id', trim($relationData['business_ids'], ','))->select();
  862. }
  863. # 关联的合同数据
  864. $eventData['contract'] = [];
  865. if (!empty($relationData['contract_ids'])) {
  866. $eventData['contract'] = Db::name('crm_contract')->field(['contract_id', 'name'])->whereIn('contract_id', trim($relationData['contract_ids'], ','))->select();
  867. }
  868. return $eventData;
  869. }
  870. //根据ID 删除日程
  871. public function delDataById($param)
  872. {
  873. $dataInfo = $this->get($param['event_id']);
  874. if (!$dataInfo) {
  875. $this->error = '数据不存在或已删除';
  876. return false;
  877. }
  878. if ($dataInfo['create_user_id'] != $param['user_id']) {
  879. $this->error = '没有编辑权限';
  880. return false;
  881. }
  882. $map['event_id'] = $param['event_id'];
  883. $map['create_user_id'] = $param['user_id'];
  884. $flag = $this->where($map)->delete();
  885. if ($flag) {
  886. Db::name('OaEventNotice')->where(['event_id' => $param['event_id']])->delete();
  887. Db::name('OaEventRelation')->where(['event_id' => $param['event_id']])->delete();
  888. return true;
  889. } else {
  890. $this->error = '删除失败';
  891. return false;
  892. }
  893. }
  894. }