123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 日志
  4. // +----------------------------------------------------------------------
  5. // | Author: Michael_xu | gengxiaoxu@5kcrm.com
  6. // +----------------------------------------------------------------------
  7. namespace app\oa\model;
  8. use think\Db;
  9. use app\admin\model\Common;
  10. use app\admin\model\Message;
  11. use app\admin\model\User;
  12. use think\Request;
  13. use think\Validate;
  14. class Log extends Common
  15. {
  16. /**
  17. * 为了数据库的整洁,同时又不影响Model和Controller的名称
  18. * 我们约定每个模块的数据表都加上相同的前缀,比如CRM模块用crm作为数据表前缀
  19. */
  20. protected $name = 'oa_log';
  21. protected $createTime = 'create_time';
  22. protected $updateTime = 'update_time';
  23. protected $autoWriteTimestamp = true;
  24. /**
  25. * [getDataList 日志list]
  26. * @param [string] $map [查询条件]
  27. * @param [number] $page [当前页数]
  28. * @param [number] $limit [每页数量]
  29. * @return [array] [description]
  30. * @author Michael_xu
  31. */
  32. public function getDataList($request)
  33. {
  34. $userModel = new \app\admin\model\User();
  35. $structureModel = new \app\admin\model\Structure();
  36. $fileModel = new \app\admin\model\File();
  37. $commonModel = new \app\admin\model\Comment();
  38. $recordModel = new \app\admin\model\Record();
  39. $user_id = $request['read_user_id'];
  40. $by = $request['by'] ?: '';
  41. $map = [];
  42. $search = $request['search'];
  43. if (isset($request['search']) && $request['search']) {
  44. //普通筛选
  45. $searchMap = function ($query) use ($search) {
  46. $query->where('log.content', array('like', '%' . $search . '%'))
  47. ->whereOr('log.tomorrow', array('like', '%' . $search . '%'))
  48. ->whereOr('log.question', array('like', '%' . $search . '%'));
  49. };
  50. }
  51. if ($request['category_id']) {
  52. $map['log.category_id'] = $request['category_id'];
  53. }
  54. if ($request['type']) {
  55. $timeAry = ByDateTime($request['type']);
  56. $between_time = [$timeAry[0], $timeAry[1]];
  57. $map['log.create_time'] = ['between', $between_time];
  58. } else {
  59. //自定义时间
  60. $start_time = $request['start_time'] ? strtotime($request['start_time'].' 00:00:00') : strtotime(date('Y-m-01', time()));
  61. $end_time = $request['end_time'] ? strtotime($request['end_time'].' 23:59:59') : strtotime(date('Y-m-01', time()) . ' +1 month -1 day');
  62. $map['log.create_time'] = ['between', [$start_time, $end_time]];
  63. }
  64. $requestData = $this->requestData();
  65. //获取权限范围内的员工
  66. $auth_user_ids = getSubUserId();
  67. $dataWhere['user_id'] = $user_id;
  68. $dataWhere['structure_id'] = $request['structure_id'];
  69. $dataWhere['auth_user_ids'] = $auth_user_ids;
  70. $logMap = '';
  71. if ($request['send_user_id'] != '') {
  72. $map['log.create_user_id'] = ['in', trim(arrayToString($request['send_user_id']), ',')];
  73. }
  74. switch ($by) {
  75. case 'me' :
  76. $map['log.create_user_id'] = $user_id;
  77. break;
  78. case 'other':
  79. $logMap = function ($query) use ($dataWhere) {
  80. $query->where('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%'))
  81. ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%'));
  82. };
  83. break;
  84. default :
  85. $logMap = function ($query) use ($dataWhere) {
  86. $query->where('log.create_user_id', array('in', implode(',', $dataWhere['auth_user_ids'])))
  87. ->whereOr('log.send_user_ids', array('like', '%,' . $dataWhere['user_id'] . ',%'))
  88. ->whereOr('log.send_structure_ids', array('like', '%,' . $dataWhere['structure_id'] . ',%'));
  89. };
  90. break;
  91. }
  92. $list = Db::name('OaLog')
  93. ->where($map)
  94. ->where($logMap)
  95. ->where($searchMap)
  96. ->alias('log')
  97. ->join('__ADMIN_USER__ user', 'user.id = log.create_user_id', 'LEFT')
  98. ->page($request['page'], $request['limit'])
  99. ->field('log.*,user.realname,user.thumb_img')
  100. ->order('log.update_time desc')
  101. ->select();
  102. $dataCount = $this->alias('log')->where($map)->where($logMap)->where($searchMap)->count();
  103. foreach ($list as $k => $v) {
  104. $list[$k]['create_user_info']['realname'] = $v['realname'] ?: '';
  105. $list[$k]['create_user_info']['id'] = $v['create_user_id'] ?: '';
  106. $list[$k]['create_user_info']['thumb_img'] = $v['thumb_img'] ? getFullPath($v['thumb_img']) : '';
  107. //附件、图片
  108. $fileList = [];
  109. $imgList = [];
  110. $where = [];
  111. $where['module'] = 'oa_log';
  112. $where['module_id'] = $v['log_id'];
  113. $newFileList = [];
  114. $newFileList = $fileModel->getDataList($where);
  115. foreach ($newFileList['list'] as $val) {
  116. if ($val['types'] == 'file') {
  117. $fileList[] = $val;
  118. } else {
  119. $imgList[] = $val;
  120. }
  121. }
  122. $list[$k]['create_time'] = date('Y-m-d H:i:s', $v['create_time']);
  123. $list[$k]['fileList'] = $fileList ?: [];
  124. $list[$k]['imgList'] = $imgList ?: [];
  125. $list[$k]['sendUserList'] = $userModel->getDataByStr($v['send_user_ids']) ?: [];
  126. $list[$k]['sendStructList'] = $structureModel->getDataByStr($v['send_structure_ids']) ?: [];
  127. $param['type_id'] = $v['log_id'];
  128. $param['type'] = 'oa_log';
  129. $list[$k]['replyList'] = $commonModel->read($param);
  130. //相关业务
  131. $relationArr = $recordModel->getListByRelationId('log', $v['log_id']);
  132. $list[$k]['businessList'] = $relationArr['businessList'];
  133. $list[$k]['contactsList'] = $relationArr['contactsList'];
  134. $list[$k]['contractList'] = $relationArr['contractList'];
  135. $list[$k]['customerList'] = $relationArr['customerList'];
  136. if ($v['is_relation'] == 1) {
  137. $list[$k]['bulletin']['customerNum'] = $v['save_customer'];
  138. $list[$k]['bulletin']['businessNum'] = $v['save_business'];
  139. $list[$k]['bulletin']['contractNum'] = $v['save_contract'];
  140. $list[$k]['bulletin']['receivablesMoneyNum'] = $v['save_receivables'];
  141. $list[$k]['bulletin']['recordNum'] = $v['save_activity'];
  142. } else {
  143. $list[$k]['bulletin'] = 0;
  144. }
  145. $is_update = 0;
  146. $is_delete = 0;
  147. //3天内的日志可删,可修改
  148. if (($v['create_user_id'] == $user_id) && date('Ymd', $v['create_time']) > date('Ymd', (strtotime(date('Ymd', time())) - 86400 * 3))) {
  149. $is_update = 1;
  150. $is_delete = 1;
  151. }
  152. if (in_array($v['create_user_id'], $auth_user_ids)) {
  153. $is_delete = 1;
  154. }
  155. $permission['is_update'] = $is_update;
  156. $permission['is_delete'] = $is_delete;
  157. $list[$k]['permission'] = $permission;
  158. //已读
  159. $read_user_ids = stringToArray($v['read_user_ids']);
  160. $is_read = 0;
  161. if (in_array($user_id, $read_user_ids)) {
  162. $is_read = 1;
  163. }
  164. $list[$k]['is_read'] = $is_read;
  165. }
  166. $data = [];
  167. $data['page']['list'] = $list;
  168. $data['page']['dataCount'] = $dataCount ?: 0;
  169. if ($request['page'] != 1 && (int)($request['page'] * $request['limit']) >= (int)$dataCount) {
  170. $data['page']['firstPage'] = false;
  171. $data['page']['lastPage'] = true;
  172. } else if ($request['page'] != 1 && (int)($request['page'] * $request['limit']) < (int)$dataCount) {
  173. $data['page']['firstPage'] = false;
  174. $data['page']['lastPage'] = false;
  175. } else if ($request['page'] == 1) {
  176. $data['page']['firstPage'] = true;
  177. $data['page']['lastPage'] = false;
  178. }
  179. return $data;
  180. }
  181. // 创建日志信息
  182. public function createData($param)
  183. {
  184. $userModel = new \app\admin\model\User();
  185. $recordModel = new \app\admin\model\Record();
  186. $fileArr = $param['file']; //接收表单附件
  187. unset($param['file']);
  188. $senduserArray = $param['send_user_ids'] ?: [];
  189. $param['send_user_ids'] = $param['send_user_ids'] ? arrayToString($param['send_user_ids']) : '';
  190. $param['send_structure_ids'] = $param['send_structure_ids'] ? arrayToString($param['send_structure_ids']) : '';
  191. $param['is_relation'] = $param['is_relation'] ?: 0;
  192. $rdata = [];
  193. //关联业务
  194. $rdata['customer_ids'] = $param['customer_ids'] ? arrayToString($param['customer_ids']) : '';
  195. $rdata['contacts_ids'] = $param['contacts_ids'] ? arrayToString($param['contacts_ids']) : '';
  196. $rdata['business_ids'] = $param['business_ids'] ? arrayToString($param['business_ids']) : '';
  197. $rdata['contract_ids'] = $param['contract_ids'] ? arrayToString($param['contract_ids']) : '';
  198. $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids'];
  199. foreach ($arr as $value) {
  200. unset($param[$value]);
  201. }
  202. if ($param['category_id'] == 1) {
  203. $param['title'] = date('Y-m-d') . '-日报';
  204. } else if ($param['category_id'] == 2) {
  205. $param['title'] = date('Y-m-d') . '-周报';
  206. } else if ($param['category_id'] == 3) {
  207. $param['title'] = date('Y-m-d') . '-月报';
  208. }
  209. if ($this->data($param)->allowField(true)->save()) {
  210. $log_id = $this->log_id;
  211. //操作记录
  212. actionLog($log_id, $param['send_user_ids'], $param['send_structure_ids'], '创建了日志');
  213. //处理附件关系
  214. if ($fileArr) {
  215. $fileModel = new \app\admin\model\File();
  216. $resData = $fileModel->createDataById($fileArr, 'oa_log', $log_id);
  217. if ($resData == false) {
  218. $this->error = '附件上传失败';
  219. return false;
  220. }
  221. }
  222. $temp = User::where(['structure_id' => ['in', $param['send_structure_ids']]])->column('id');
  223. (new Message())->send(
  224. Message::LOG_SEND,
  225. [
  226. 'title' => $param['title'],
  227. 'action_id' => $log_id
  228. ],
  229. array_merge($temp, $senduserArray)
  230. );
  231. //返回数据,前端动态追加使用
  232. $data = [];
  233. $data['log_id'] = $log_id;
  234. $data = $param;
  235. if (count($fileArr)) {
  236. $fileList = Db::name('AdminFile')->where('file_id in (' . implode(',', $fileArr) . ')')->select();
  237. foreach ($fileList as $k => $v) {
  238. $fileList[$k]['file_path'] = $v['file_path'] ? getFullPath($v['file_path']) : '';
  239. }
  240. }
  241. $data['fileList'] = $fileList ?: array();
  242. //发送人
  243. $data['sendUserList'] = $param['send_user_ids'] ? $userModel->getListByStr($param['send_user_ids']) : [];
  244. //发送部门
  245. $data['sendStructureList'] = $param['send_structure_ids'] ? $userModel->getListByStr($param['send_structure_ids']) : [];
  246. $data['log_id'] = $log_id;
  247. $rdata['log_id'] = $log_id;
  248. $rdata['status'] = 1;
  249. $rdata['create_time'] = time();
  250. //关联业务
  251. Db::name('OaLogRelation')->insert($rdata);
  252. //相关业务
  253. $relationArr = $recordModel->getListByRelationId('log', $log_id);
  254. $data['businessList'] = $relationArr['businessList'];
  255. $data['contactsList'] = $relationArr['contactsList'];
  256. $data['contractList'] = $relationArr['contractList'];
  257. $data['customerList'] = $relationArr['customerList'];
  258. # 添加活动记录
  259. if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) {
  260. Db::name('crm_activity')->insert([
  261. 'type' => 2,
  262. 'activity_type' => 8,
  263. 'activity_type_id' => $log_id,
  264. 'content' => !empty($param['title']) ? $param['title'] : '日志',
  265. 'create_user_id' => $param['create_user_id'],
  266. 'update_time' => time(),
  267. 'create_time' => time(),
  268. 'customer_ids' => !empty($rdata['customer_ids']) ? trim($rdata['customer_ids'], ',') : '',
  269. 'contacts_ids' => !empty($rdata['contacts_ids']) ? trim($rdata['contacts_ids'], ',') : '',
  270. 'business_ids' => !empty($rdata['business_ids']) ? trim($rdata['business_ids'], ',') : '',
  271. 'contract_ids' => !empty($rdata['contract_ids']) ? trim($rdata['contract_ids'], ',') : '',
  272. ]);
  273. }
  274. return $data;
  275. } else {
  276. $this->error = '添加失败';
  277. return false;
  278. }
  279. }
  280. /**
  281. * 编辑日志信息
  282. * @param
  283. * @return
  284. * @author Michael_xu
  285. */
  286. public function updateDataById($param, $log_id = '')
  287. {
  288. $dataInfo = $this->getDataById($log_id);
  289. if (!$dataInfo) {
  290. $this->error = '数据不存在或已删除';
  291. return false;
  292. }
  293. if ($dataInfo['create_time'] < time() - 3600 * 24 * 3) {
  294. $this->error = '超过时效,不可修改';
  295. return false;
  296. }
  297. //关联业务
  298. $rdata['customer_ids'] = $param['customer_ids'] ? arrayToString($param['customer_ids']) : '';
  299. $rdata['contacts_ids'] = $param['contacts_ids'] ? arrayToString($param['contacts_ids']) : '';
  300. $rdata['business_ids'] = $param['business_ids'] ? arrayToString($param['business_ids']) : '';
  301. $rdata['contract_ids'] = $param['contract_ids'] ? arrayToString($param['contract_ids']) : '';
  302. $arr = ['customer_ids', 'contacts_ids', 'business_ids', 'contract_ids'];
  303. foreach ($arr as $value) {
  304. unset($param[$value]);
  305. }
  306. //过滤不能修改的字段
  307. $unUpdateField = ['create_user_id', 'is_deleted', 'delete_time'];
  308. foreach ($unUpdateField as $v) {
  309. unset($param[$v]);
  310. }
  311. $fileArr = $param['file']; //接收表单附件
  312. unset($param['file']);
  313. $param['send_user_ids'] = $param['send_user_ids'] ? arrayToString($param['send_user_ids']) : '';
  314. $param['send_structure_ids'] = $param['send_structure_ids'] ? arrayToString($param['send_structure_ids']) : '';
  315. if ($this->allowField(true)->save($param, ['log_id' => $log_id])) {
  316. //操作日志
  317. Db::name('AdminActionLog')->where(['action_id' => $log_id])->update(['join_user_ids' => $this->send_user_ids, 'structure_ids' => $this->send_structure_ids]);
  318. actionLog($log_id, $this->send_user_ids, $this->send_structure_ids, '修改了日志');
  319. //处理附件关系
  320. if ($fileArr) {
  321. $fileModel = new \app\admin\model\File();
  322. $resData = $fileModel->createDataById($fileArr, 'oa_log', $log_id);
  323. if ($resData == false) {
  324. $this->error = '附件上传失败';
  325. return false;
  326. }
  327. }
  328. $data = [];
  329. $data['log_id'] = $log_id;
  330. Db::name('OaLogRelation')->where('log_id = ' . $log_id)->update($rdata);
  331. # 删除活动记录
  332. Db::name('crm_activity')->where(['activity_type' => 8, 'activity_type_id' => $log_id])->delete();
  333. # 添加活动记录
  334. if (!empty($rdata['customer_ids']) || !empty($rdata['contacts_ids']) || !empty($rdata['business_ids']) || !empty($rdata['contract_ids'])) {
  335. Db::name('crm_activity')->insert([
  336. 'type' => 2,
  337. 'activity_type' => 8,
  338. 'activity_type_id' => $log_id,
  339. 'content' => !empty($param['title']) ? $param['title'] : '日志',
  340. 'create_user_id' => $param['user_id'],
  341. 'update_time' => time(),
  342. 'create_time' => time(),
  343. 'customer_ids' => !empty($rdata['customer_ids']) ? trim($rdata['customer_ids'], ',') : '',
  344. 'contacts_ids' => !empty($rdata['contacts_ids']) ? trim($rdata['contacts_ids'], ',') : '',
  345. 'business_ids' => !empty($rdata['business_ids']) ? trim($rdata['business_ids'], ',') : '',
  346. 'contract_ids' => !empty($rdata['contract_ids']) ? trim($rdata['contract_ids'], ',') : ''
  347. ]);
  348. }
  349. return $data;
  350. } else {
  351. $this->error = '编辑失败';
  352. return false;
  353. }
  354. }
  355. /**
  356. * 日志数据
  357. * @param $id 日志ID
  358. * @return
  359. */
  360. public function getDataById($id = '')
  361. {
  362. $fileModel = new \app\admin\model\File();
  363. $userModel = new \app\admin\model\User();
  364. $structureModel = new \app\admin\model\Structure();
  365. $commonModel = new \app\admin\model\Comment();
  366. $map['log.log_id'] = $id;
  367. $data_view = db('oa_log')
  368. ->where($map)
  369. ->alias('log')
  370. ->join('__ADMIN_USER__ user', 'user.id = log.create_user_id', 'LEFT');
  371. $dataInfo = $data_view->field('log.*,user.realname,user.thumb_img')->find();
  372. if (!$dataInfo) {
  373. $this->error = '暂无此数据';
  374. return false;
  375. }
  376. $relation = Db::name('OaLogRelation')->where('log_id =' . $id)->find();
  377. $BusinessModel = new \app\crm\model\Business(); //商机
  378. $dataInfo['businessList'] = $relation['business_ids'] ? $BusinessModel->getDataByStr($relation['business_ids']) : [];
  379. $ContactsModel = new \app\crm\model\Contacts();//联系人
  380. $dataInfo['contactsList'] = $relation['contacts_ids'] ? $ContactsModel->getDataByStr($relation['contacts_ids']) : [];
  381. $ContractModel = new \app\crm\model\Contract();//合同
  382. $dataInfo['contractList'] = $relation['contract_ids'] ? $ContractModel->getDataByStr($relation['contract_ids']) : [];
  383. $CustomerModel = new \app\crm\model\Customer();//客户
  384. $dataInfo['customerList'] = $relation['customer_ids'] ? $CustomerModel->getDataByStr($relation['customer_ids']) : [];
  385. $dataInfo['create_user_info']['realname'] = $dataInfo['realname'] ?: '';
  386. $dataInfo['create_user_info']['id'] = $dataInfo['create_user_id'] ?: '';
  387. $dataInfo['create_user_info']['thumb_img'] = $dataInfo['thumb_img'] ? getFullPath($dataInfo['thumb_img']) : '';
  388. //附件、图片
  389. $where['module'] = 'oa_log';
  390. $where['module_id'] = $id;
  391. $newFileList = $fileModel->getDataList($where);
  392. foreach ($newFileList['list'] as $val) {
  393. if ($val['types'] == 'file') {
  394. $fileList[] = $val;
  395. } else {
  396. $imgList[] = $val;
  397. }
  398. }
  399. $dataInfo['fileList'] = $fileList ?: [];
  400. $dataInfo['imgList'] = $imgList ?: [];
  401. $dataInfo['sendUserList'] = $userModel->getDataByStr($dataInfo['send_user_ids']) ?: [];
  402. $dataInfo['sendStructList'] = $structureModel->getDataByStr($dataInfo['send_structure_ids']) ?: [];
  403. $param['type_id'] = $id;
  404. $param['type'] = 'oa_log';
  405. $dataInfo['replyList'] = $commonModel->read($param);
  406. return $dataInfo;
  407. }
  408. /**
  409. * 日志删除
  410. *
  411. * @param string $param
  412. * @return bool
  413. * @throws \think\Exception
  414. * @throws \think\exception\DbException
  415. * @throws \think\exception\PDOException
  416. */
  417. public function delDataById($param)
  418. {
  419. $map['log_id'] = $param['log_id'];
  420. $dataInfo = $this->get($map['log_id']);
  421. if (!$dataInfo) {
  422. $this->error = '数据不存在或已删除';
  423. return false;
  424. }
  425. $flag = Db::name('OaLog')->where($map)->delete();
  426. if ($flag) {
  427. $fileModel = new \app\admin\model\File();
  428. $commentModel = new \app\admin\model\Comment();
  429. //删除关联附件
  430. $fileModel->delRFileByModule('oa_log', $param['log_id']);
  431. //删除相关评论
  432. $commentModel->delDataById(['type' => 'oa_log', 'type_id' => $param['log_id']]);
  433. actionLog($param['log_id'], $dataInfo['send_user_ids'], $dataInfo['send_structure_ids'], '删除了日志');
  434. # 删除活动记录
  435. Db::name('crm_activity')->where(['activity_type' => 8, 'activity_type_id' => $param['log_id']])->delete();
  436. return true;
  437. } else {
  438. $this->error = '操作失败';
  439. return false;
  440. }
  441. }
  442. }