123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967
  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. }
  338. $data['list'] = $list;
  339. return $data;
  340. }
  341. /**
  342. * 修改展示类型
  343. * @param $param
  344. * @return array
  345. * @throws \think\db\exception\DataNotFoundException
  346. * @throws \think\db\exception\ModelNotFoundException
  347. * @throws \think\exception\DbException
  348. */
  349. public function saveSchedule($param)
  350. {
  351. $item = db('admin_oa_schedule_relation')->where('user_id', $param['user_id'])->select();
  352. $items = db('admin_oa_schedule')->select();
  353. $item_schedule_id = array_column($items, 'schedule_id');
  354. $schedule_id = array_diff($item_schedule_id, $param['schedule_id']);
  355. foreach ($param['schedule_id'] as $v) {
  356. if ($item) {
  357. $res = db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id'], 'schedule_id' => $v])->find();
  358. if ($res) {
  359. if ($res['type'] == 1) {
  360. db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id']])
  361. ->whereIn('schedule_id', implode(',', $schedule_id))
  362. ->update(['type' => 0]);
  363. } else {
  364. db('admin_oa_schedule_relation')->where(['user_id' => $param['user_id']])
  365. ->whereIn('schedule_id', arrayToString($param['schedule_id']))
  366. ->update(['type' => 1]);
  367. }
  368. } else {
  369. 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()]);
  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. }
  375. $data = [];
  376. return $data;
  377. }
  378. /**
  379. * 创建日程信息
  380. *
  381. * @param array $param
  382. * @return bool
  383. * @throws \think\db\exception\DataNotFoundException
  384. * @throws \think\db\exception\ModelNotFoundException
  385. * @throws \think\exception\DbException
  386. */
  387. public function createData($param)
  388. {
  389. $todayTime = Time::today();
  390. # 设置日程参数
  391. $param['create_user_id'] = $param['user_id'];
  392. $param['owner_user_ids'] = arrayToString($param['owner_user_ids']);
  393. $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : $todayTime[0];
  394. $param['end_time'] = !empty($param['end_time']) ? strtotime($param['end_time']) : $todayTime[1];
  395. $param['create_time'] = time();
  396. $param['update_time'] = time();
  397. unset($param['user_id']);
  398. # 关联数据
  399. $relation = [];
  400. if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']);
  401. if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']);
  402. if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']);
  403. if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']);
  404. # 提醒数据
  405. $notice = $param['notice'];
  406. # 删除多余字段
  407. unset($param['customer_ids']);
  408. unset($param['contacts_ids']);
  409. unset($param['business_ids']);
  410. unset($param['contract_ids']);
  411. unset($param['notice']);
  412. if ($this->allowField(true)->save($param)) {
  413. $eventId = $this->event_id;
  414. # 提醒
  415. if (!empty($notice)) {
  416. $noticeData = [];
  417. foreach ($notice as $key => $value) {
  418. $startTime = $param['start_time'];
  419. if ($value['type'] == 1) $startTime = $param['start_time'] - ($value['value'] * 60);
  420. if ($value['type'] == 2) $startTime = $param['start_time'] - ($value['value'] * 60 * 60);
  421. if ($value['type'] == 3) $startTime = $param['start_time'] - ($value['value'] * 60 * 60 * 24);
  422. $noticeData[] = [
  423. 'event_id' => $eventId,
  424. 'noticetype' => $value['type'],
  425. 'number' => $value['value'],
  426. 'start_time' => $startTime,
  427. 'stop_time' => $param['end_time']
  428. ];
  429. }
  430. if (!empty($noticeData)) Db::name('oa_event_notice')->insertAll($noticeData);
  431. }
  432. # 关联数据
  433. if (!empty($relation)) {
  434. $relation['event_id'] = $eventId;
  435. $relation['status'] = 1;
  436. $relation['create_time'] = time();
  437. Db::name('oa_event_relation')->insert($relation);
  438. }
  439. // actionLog($eventId, $param['owner_user_ids'], '', '创建了日程');
  440. $data['event_id'] = $eventId;
  441. // 站内信
  442. $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  443. $messageModel = new Message();
  444. foreach ($item as $value) {
  445. if ($value['noticetype'] == '1') { //分
  446. $dd = $param['start_time'] - ($value['number'] * 60);
  447. } else if ($value['noticetype'] == '2') { //时
  448. $dd = $param['start_time'] - ($value['number'] * 60 * 60);
  449. } else if ($value['noticetype'] == '3') {//天
  450. $dd = $param['start_time'] - ($value['number'] * 60 * 60 * 24);
  451. }
  452. $messageModel->send(
  453. Message::EVENT_MESSAGE,
  454. [
  455. 'title' => $param['title'],
  456. 'action_id' => $value['id'],
  457. 'advance_time' => $dd ?: 0
  458. ],
  459. stringToArray($param['owner_user_ids'])
  460. );
  461. }
  462. RecordActionLog($param['create_user_id'], 'oa_event', 'save',$param['title'], '','','添加了日程:'.$param['title']);
  463. return $data;
  464. } else {
  465. $this->error = '添加失败';
  466. return false;
  467. }
  468. }
  469. /**
  470. * 即将到期合同列表
  471. * @param $param
  472. * @throws \think\db\exception\DataNotFoundException
  473. * @throws \think\db\exception\ModelNotFoundException
  474. * @throws \think\exception\DbException
  475. */
  476. public function eventContract($param)
  477. {
  478. $user_id = $param['user_id'];
  479. $time = $this->eventDataTime($param);
  480. $return_time = `'` . date('Y-m-d', $time[0]) . `'`;
  481. if ($param['type'] == 1) {
  482. $between_time['contract.end_time'] = $return_time;
  483. $between_time['contract.create_user_id|contract.owner_user_id'] = ['eq', $user_id];
  484. $event_date = db('crm_contract')->alias('contract')
  485. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = contract.customer_id', 'LEFT')
  486. ->join('__ADMIN_USER__ u', 'u.id = contract.owner_user_id', 'LEFT')
  487. ->where('contract.end_time', '>', 0)->where($between_time)
  488. ->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')
  489. ->select();
  490. $count = db('crm_contract')->alias('contract')
  491. ->join('__ADMIN_USER__ user', 'user.id = contract.create_user_id', 'LEFT')
  492. ->join('__ADMIN_USER__ u', 'u.id = contract.owner_user_id', 'LEFT')
  493. ->where('contract.end_time', '>', 0)->where($between_time)->count();
  494. foreach ($event_date as $k => $v) {
  495. $event_date[$k]['start_time'] = $v['start_time'] ? $v['start_time'] : null;
  496. $event_date[$k]['end_time'] = $v['end_time'] ? $v['end_time'] : null;
  497. }
  498. } elseif ($param['type'] == 2) {
  499. $between_time['r.return_date'] = ['=', $return_time];
  500. $between_time['r.create_user_id|r.owner_user_id'] = ['eq', $user_id];
  501. $event_date = db('crm_receivables_plan')
  502. ->alias('r')
  503. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = r.customer_id', 'LEFT')
  504. ->join('__CRM_CONTRACT__ contract', 'contract.contract_id = r.contract_id', 'LEFT')
  505. ->where(['r.status' => 0, 'r.return_date' => ['>', 0]])
  506. ->where($between_time)
  507. ->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')
  508. ->select();
  509. $count = db('crm_receivables_plan')
  510. ->alias('r')
  511. ->join('__CRM_CUSTOMER__ customer', 'customer.customer_id = r.customer_id', 'LEFT')
  512. ->join('__CRM_CONTRACT__ contract', 'contract.contract_id = r.contract_id', 'LEFT')
  513. ->where($between_time)
  514. ->where(['r.status' => 0, 'r.return_date' => ['>', 0]])->count();
  515. foreach ($event_date as $k => $v) {
  516. $event_date[$k]['return_date'] = $v['return_date'] ? $v['return_date'] : null;
  517. }
  518. }
  519. $data = [];
  520. $data['list'] = $event_date;
  521. $data['countData'] = $count;
  522. return $data;
  523. }
  524. /**
  525. * 续联系客户
  526. * @param $param
  527. * @throws \think\db\exception\DataNotFoundException
  528. * @throws \think\db\exception\ModelNotFoundException
  529. * @throws \think\exception\DbException
  530. */
  531. public function eventCustomer($param)
  532. {
  533. $user_id = $param['user_id'];
  534. $time = $this->eventDataTime($param);
  535. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  536. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  537. //需要联系的客户 next_time crm_customer
  538. $between_time['customer.next_time'] = ['between', [$return_time, $return_end]];
  539. $between_time['customer.create_user_id|customer.owner_user_id'] = ['eq', $user_id];
  540. $event_date = db('crm_customer')
  541. ->alias('customer')
  542. ->join('__ADMIN_USER__ user', 'user.id = customer.owner_user_id', 'LEFT')
  543. ->where('customer.next_time', '>', 0)->where($between_time)
  544. ->field('customer.customer_id,customer.next_time,customer.name,user.realname as owner_user_name,customer.create_time,customer.last_time')
  545. ->select();
  546. $count = db('crm_customer')
  547. ->alias('customer')
  548. ->join('__ADMIN_USER__ user', 'user.id = customer.owner_user_id', 'LEFT')
  549. ->where('customer.next_time', '>', 0)->where($between_time)->where($wherePool)->count();
  550. foreach ($event_date as $k => $v) {
  551. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  552. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  553. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  554. }
  555. $data = [];
  556. $data['list'] = $event_date;
  557. $data['countData'] = $count;
  558. return $data;
  559. }
  560. /**
  561. * 续联系客户
  562. * @param $param
  563. * @throws \think\db\exception\DataNotFoundException
  564. * @throws \think\db\exception\ModelNotFoundException
  565. * @throws \think\exception\DbException
  566. */
  567. public function eventLeads($param)
  568. {
  569. $user_id = $param['user_id'];
  570. $time = $this->eventDataTime($param);
  571. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  572. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  573. $between_time['leads.next_time'] = ['between', [$return_time, $return_end]];
  574. $between_time['leads.create_user_id|leads.owner_user_id'] = ['eq', $user_id];
  575. $event_date = db('crm_leads')
  576. ->alias('leads')
  577. ->join('__ADMIN_USER__ user', 'user.id = leads.owner_user_id', 'LEFT')
  578. ->where($between_time)
  579. ->where(['leads.next_time' => ['>', 0], 'leads.is_transform' => 0])
  580. ->field('leads.leads_id,leads.next_time,leads.leads_id,leads.name,user.realname as owner_user_name,leads.create_time,leads.last_time')
  581. ->select();
  582. $count = db('crm_leads')
  583. ->alias('leads')
  584. ->join('__ADMIN_USER__ user', 'user.id = leads.owner_user_id', 'LEFT')
  585. ->where($between_time)
  586. ->where(['leads.next_time' => ['>', 0], 'leads.is_transform' => 0])->count();
  587. foreach ($event_date as $k => $v) {
  588. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  589. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  590. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  591. }
  592. $data = [];
  593. $data['list'] = $event_date;
  594. $data['countData'] = $count;
  595. return $data;
  596. }
  597. /**
  598. * 计划回款
  599. * @param $param
  600. * @throws \think\db\exception\DataNotFoundException
  601. * @throws \think\db\exception\ModelNotFoundException
  602. * @throws \think\exception\DbException
  603. */
  604. public function eventBusiness($param)
  605. {
  606. $user_id = $param['user_id'];
  607. $time = $this->eventDataTime($param);
  608. $return_time = `'` . strtotime(date('Y-m-d', $time[0])) . `'`;
  609. $return_end = `'` . strtotime(date('Y-m-d 23:59:59', $time[1])) . `'`;
  610. //需要联系的客户 next_time crm_customer
  611. $between_time['business.next_time'] = ['between', [$return_time, $return_end]];
  612. $between_time['business.create_user_id|business.owner_user_id'] = ['eq', $user_id];
  613. $event_date = db('crm_business')
  614. ->alias('business')
  615. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  616. ->where($between_time)
  617. ->where('business.next_time', '>', 0)
  618. ->field('business.business_id,business.next_time,business.business_id,business.name,business.last_time,business.create_time,user.realname as owner_user_name')
  619. ->select();
  620. $count = db('crm_business')
  621. ->alias('business')
  622. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  623. ->where($between_time)
  624. ->where('business.next_time', '>', 0)->count();
  625. foreach ($event_date as $k => $v) {
  626. $event_date[$k]['next_time'] = $v['next_time'] ? date('Y-m-d H:i:s', $v['next_time']) : null;
  627. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  628. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  629. }
  630. $data = [];
  631. $data['list'] = $event_date;
  632. $data['countData'] = $count;
  633. return $data;
  634. }
  635. /**
  636. * 预计成交商机
  637. * @param $param
  638. * @throws \think\db\exception\DataNotFoundException
  639. * @throws \think\db\exception\ModelNotFoundException
  640. * @throws \think\exception\DbException
  641. */
  642. public function eventDealBusiness($param)
  643. {
  644. $user_id = $param['user_id'];
  645. $time = $this->eventDataTime($param);
  646. $return_time = `'` . date('Y-m-d', $time[0]) . `'`;
  647. $return_end = `'` . date('Y-m-d', $time[1]) . `'`;
  648. $between_time['business.deal_date'] = ['between', [$return_time, $return_end]];
  649. $between_time['business.create_user_id|business.owner_user_id'] = ['eq', $user_id];
  650. $event_date = db('crm_business')
  651. ->alias('business')
  652. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  653. ->where('business.deal_date', '>', 0)
  654. ->where($between_time)
  655. ->field('business.business_id,business.deal_date,business.business_id,business.name,business.last_time,business.create_time,user.realname as owner_user_name')
  656. ->select();
  657. $count = db('crm_business')
  658. ->alias('business')
  659. ->join('__ADMIN_USER__ user', 'user.id = business.owner_user_id', 'LEFT')
  660. ->where('business.deal_date', '>', 0)->where($between_time)->count();
  661. foreach ($event_date as $k => $v) {
  662. $event_date[$k]['deal_date'] = $v['deal_date'] ?: null;
  663. $event_date[$k]['create_time'] = $v['create_time'] ? date('Y-m-d H:i:s', $v['create_time']) : null;
  664. $event_date[$k]['last_time'] = $v['last_time'] ? date('Y-m-d H:i:s', $v['last_time']) : null;
  665. }
  666. $data = [];
  667. $data['list'] = $event_date;
  668. $data['countData'] = $count;
  669. return $data;
  670. }
  671. /**
  672. * 公共时间处理
  673. * @param $param
  674. */
  675. public function eventDataTime($param)
  676. {
  677. $userModel = new \app\admin\model\User();
  678. $recordModel = new \app\admin\model\Record();
  679. //默认本账户or 自定义用户id
  680. if ($param['start_time'] && $param['end_time']) {
  681. $start_time = $param['start_time'];
  682. $end_time = $param['end_time'];
  683. if (strlen($start_time) == 13) $start_time = $start_time / 1000;
  684. if (strlen($end_time) == 13) $end_time = $end_time / 1000;
  685. } else {
  686. $start_time = mktime(0, 0, 0, date('m'), 1, date('Y'));
  687. $end_time = mktime(23, 59, 59, date('m'), date('t'), date('Y'));
  688. }
  689. $data = [];
  690. $data = [$start_time, $end_time];
  691. return $data;
  692. }
  693. /**
  694. * 编辑日程信息
  695. *
  696. * @param $param
  697. * @param string $event_id
  698. * @return bool
  699. * @throws \think\Exception
  700. * @throws \think\db\exception\DataNotFoundException
  701. * @throws \think\db\exception\ModelNotFoundException
  702. * @throws \think\exception\DbException
  703. * @throws \think\exception\PDOException
  704. */
  705. public function updateDataById($param, $event_id = '')
  706. {
  707. $dataInfo = $this->getDataById($event_id, $param);
  708. $user_id=$param['user_id'];
  709. if (!$dataInfo) {
  710. $this->error = '数据不存在或已删除';
  711. return false;
  712. }
  713. if ($dataInfo['create_user_id'] != $param['user_id']) {
  714. $this->error = '没有编辑权限';
  715. return false;
  716. }
  717. $todayTime = Time::today();
  718. # 设置日程参数
  719. $param['create_user_id'] = $param['user_id'];
  720. $param['owner_user_ids'] = arrayToString($param['owner_user_ids']);
  721. $param['start_time'] = !empty($param['start_time']) ? strtotime($param['start_time']) : $todayTime[0];
  722. $param['end_time'] = !empty($param['end_time']) ? strtotime($param['end_time']) : $todayTime[1];
  723. $param['update_time'] = time();
  724. unset($param['user_id']);
  725. # 关联数据
  726. $relation = [];
  727. if (!empty($param['customer_ids'])) $relation['customer_ids'] = arrayToString($param['customer_ids']);
  728. if (!empty($param['contacts_ids'])) $relation['contacts_ids'] = arrayToString($param['contacts_ids']);
  729. if (!empty($param['business_ids'])) $relation['business_ids'] = arrayToString($param['business_ids']);
  730. if (!empty($param['contract_ids'])) $relation['contract_ids'] = arrayToString($param['contract_ids']);
  731. # 提醒数据
  732. $notice = $param['notice'];
  733. # 删除多余字段
  734. unset($param['customer_ids']);
  735. unset($param['contacts_ids']);
  736. unset($param['business_ids']);
  737. unset($param['contract_ids']);
  738. unset($param['notice']);
  739. if ($this->allowField(true)->save($param, ['event_id' => $event_id])) {
  740. $eventId = $this->event_id;
  741. // actionLog($event_id, $param['owner_user_ids'], '', '修改了日程');
  742. $list = db('oa_event_notice')->where('event_id', $eventId)->select();
  743. if ($list) {
  744. foreach ($list as $k => $v) {
  745. Db::name('admin_message')->where(['type' => 9, 'action_id' => $v['id']])->delete();
  746. }
  747. }
  748. $item = Db::name('OaEventNotice')->where(['event_id' => $eventId])->delete();
  749. # 提醒
  750. if (!empty($notice)) {
  751. $noticeData = [];
  752. $startTime = $param['start_time'];
  753. foreach ($notice as $key => $value) {
  754. if ($value['type'] == 1) $startTime = $param['start_time'] - ($value['number'] * 60);
  755. if ($value['type'] == 2) $startTime = $param['start_time'] - ($value['number'] * 60 * 60);
  756. if ($value['type'] == 3) $startTime = $param['start_time'] - ($value['number'] * 60 * 60 * 24);
  757. $noticeData[] = [
  758. 'event_id' => $eventId,
  759. 'noticetype' => $value['type'],
  760. 'number' => $value['value'],
  761. 'start_time' => $startTime,
  762. 'stop_time' => $param['end_time']
  763. ];
  764. }
  765. if (!empty($noticeData)) {
  766. $item = Db::name('oa_event_notice')->insertAll($noticeData);
  767. if ($item) {
  768. $item = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  769. foreach ($item as $val) {
  770. if ($value['noticetype'] == '1') { //分
  771. $dd = strtotime($param['start_time']) - ($val['number'] * 60);
  772. } else if ($val['noticetype'] == '2') { //时
  773. $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60);
  774. } else if ($val['noticetype'] == '3') {//天
  775. $dd = strtotime($param['start_time']) - ($val['number'] * 60 * 60 * 24);
  776. }
  777. // 站内信
  778. (new Message())->send(
  779. Message::EVENT_MESSAGE,
  780. [
  781. 'title' => $param['title'],
  782. 'action_id' => $val['id'],
  783. 'advance_time' => $dd ?: 0
  784. ],
  785. stringToArray($param['owner_user_ids'])
  786. );
  787. }
  788. }
  789. }
  790. }
  791. $data['event_id'] = $event_id;
  792. if (Db::name('OaEventRelation')->where(['event_id' => $event_id])->find()) {
  793. Db::name('OaEventRelation')->where(['event_id' => $event_id])->update($relation);
  794. } else {
  795. if (!empty($relation)) {
  796. $relation['event_id'] = $eventId;
  797. $relation['status'] = 1;
  798. $relation['create_time'] = time();
  799. Db::name('OaEventRelation')->where(['event_id' => $event_id])->insert($relation);
  800. }
  801. }
  802. RecordActionLog($user_id, 'oa_event','update', $param['title'], '','','修改了日程:'.$param['title']);
  803. return $data;
  804. } else {
  805. $this->error = '编辑失败';
  806. return false;
  807. }
  808. }
  809. /**
  810. * 日程数据
  811. *
  812. * @param string $eventId
  813. * @return Common|array|bool|\PDOStatement|string|\think\Model|null
  814. * @throws \think\db\exception\DataNotFoundException
  815. * @throws \think\db\exception\ModelNotFoundException
  816. * @throws \think\exception\DbException
  817. */
  818. public function getDataById($eventId)
  819. {
  820. # 日程数据
  821. $eventData = Db::name('oa_event')->where('event_id', $eventId)->find();
  822. # 颜色类型
  823. $eventData['color'] = Db::name('admin_oa_schedule')->where('schedule_id', $eventData['schedule_id'])->value('color');
  824. # 创建人信息
  825. $eventData['create_user_name'] = Db::name('admin_user')->where('id', $eventData['create_user_id'])->value('realname');
  826. # 参与人信息
  827. $eventData['owner_user_info'] = Db::name('admin_user')->field(['id', 'realname'])->whereIn('id', trim($eventData['owner_user_ids'], ','))->select();
  828. # 处理日程的日期数据
  829. $eventData['start_time'] = !empty($eventData['start_time']) ? date('Y-m-d H:i:s', $eventData['start_time']) : '';
  830. $eventData['end_time'] = !empty($eventData['end_time']) ? date('Y-m-d H:i:s', $eventData['end_time']) : '';
  831. $eventData['create_time'] = !empty($eventData['create_time']) ? date('Y-m-d H:i:s', $eventData['create_time']) : '';
  832. $eventData['update_time'] = !empty($eventData['update_time']) ? date('Y-m-d H:i:s', $eventData['update_time']) : '';
  833. # 日程提醒数据
  834. $noticeData = Db::name('oa_event_notice')->where('event_id', $eventId)->select();
  835. # 整理日程提醒数据
  836. $eventData['notice'] = [];
  837. foreach ($noticeData as $key => $value) {
  838. $eventData['notice'][] = [
  839. 'type' => $value['noticetype'],
  840. 'value' => $value['number']
  841. ];
  842. }
  843. # 关联客户数据
  844. $relationData = Db::name('oa_event_relation')->where('event_id', $eventId)->find();
  845. # 关联的客户数据
  846. $eventData['customer'] = [];
  847. if (!empty($relationData['customer_ids'])) {
  848. $eventData['customer'] = Db::name('crm_customer')->field(['customer_id', 'name'])->whereIn('customer_id', trim($relationData['customer_ids'], ','))->select();
  849. }
  850. # 关联的联系人数据
  851. $eventData['contacts'] = [];
  852. if (!empty($relationData['contacts_ids'])) {
  853. $eventData['contacts'] = Db::name('crm_contacts')->field(['contacts_id', 'name'])->whereIn('contacts_id', trim($relationData['contacts_ids'], ','))->select();
  854. }
  855. # 关联的商机数据
  856. $eventData['business'] = [];
  857. if (!empty($relationData['business_ids'])) {
  858. $eventData['business'] = Db::name('crm_business')->field(['business_id', 'name'])->whereIn('business_id', trim($relationData['business_ids'], ','))->select();
  859. }
  860. # 关联的合同数据
  861. $eventData['contract'] = [];
  862. if (!empty($relationData['contract_ids'])) {
  863. $eventData['contract'] = Db::name('crm_contract')->field(['contract_id', 'name'])->whereIn('contract_id', trim($relationData['contract_ids'], ','))->select();
  864. }
  865. return $eventData;
  866. }
  867. //根据ID 删除日程
  868. public function delDataById($param)
  869. {
  870. $dataInfo = $this->get($param['event_id']);
  871. if (!$dataInfo) {
  872. $this->error = '数据不存在或已删除';
  873. return false;
  874. }
  875. if ($dataInfo['create_user_id'] != $param['user_id']) {
  876. $this->error = '没有编辑权限';
  877. return false;
  878. }
  879. $map['event_id'] = $param['event_id'];
  880. $map['create_user_id'] = $param['user_id'];
  881. $flag = $this->where($map)->delete();
  882. if ($flag) {
  883. Db::name('OaEventNotice')->where(['event_id' => $param['event_id']])->delete();
  884. Db::name('OaEventRelation')->where(['event_id' => $param['event_id']])->delete();
  885. return true;
  886. } else {
  887. $this->error = '删除失败';
  888. return false;
  889. }
  890. }
  891. }