123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. namespace app\crm\logic;
  3. use app\admin\controller\ApiCommon;
  4. use app\admin\model\Common;
  5. use app\crm\model\Visit;
  6. use think\Db;
  7. use think\Validate;
  8. class VisitLogic extends Common
  9. {
  10. /**
  11. * 获取回访列表
  12. * @param $param
  13. */
  14. public function getDataList($request)
  15. {
  16. $userModel = new \app\admin\model\User();
  17. $structureModel = new \app\admin\model\Structure();
  18. $fieldModel = new \app\admin\model\Field();
  19. $user_id = $request['user_id'];
  20. //场景id
  21. $scene_id = (int)$request['scene_id'];
  22. $order_field = $request['order_field'];
  23. $order_type = $request['order_type'];
  24. unset($request['search']);
  25. unset($request['scene_id']);
  26. unset($request['user_id']);
  27. unset($request['order_field']);
  28. unset($request['order_type']);
  29. $request = $this->fmtRequest($request);
  30. $requestMap = $request['map'] ?: [];
  31. $sceneModel = new \app\admin\model\Scene();
  32. if ($scene_id) {
  33. //自定义场景
  34. $sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'crm_visit') ?: [];
  35. } else {
  36. //默认场景
  37. $sceneMap = $sceneModel->getDefaultData('crm_visit', $user_id) ?: [];
  38. }
  39. $partMap = [];
  40. //优先级:普通筛选>高级筛选>场景添加
  41. if ($sceneMap['visit.ro_user_id'] && $sceneMap['visit.rw_user_id']) {
  42. //相关团队查询
  43. $map = $requestMap;
  44. $partMap = function ($query) use ($sceneMap) {
  45. $query->where('visit.ro_user_id', array('like', '%,' . $sceneMap['ro_user_id'] . ',%'))
  46. ->whereOr('visit.rw_user_id', array('like', '%,' . $sceneMap['rw_user_id'] . ',%'));
  47. };
  48. } else {
  49. $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;
  50. }
  51. //高级筛选
  52. $map = where_arr($map, 'crm', 'visit', 'index');
  53. $authMap = [];
  54. if (!$partMap) {
  55. $a = 'index';
  56. $auth_user_ids = $userModel->getUserByPer('crm', 'visit', $a);
  57. if (isset($map['visit.owner_user_id']) && $map['visit.owner_user_id'][0] != 'like') {
  58. if (!is_array($map['visit.owner_user_id'][1])) {
  59. $map['visit.owner_user_id'][1] = [$map['visit.owner_user_id'][1]];
  60. }
  61. if (in_array($map['visit.owner_user_id'][0], ['neq', 'notin'])) {
  62. $auth_user_ids = array_diff($auth_user_ids, $map['visit.owner_user_id'][1]) ?: []; //取差集
  63. } else {
  64. $auth_user_ids = array_intersect($map['visit.owner_user_id'][1], $auth_user_ids) ?: []; //取交集
  65. }
  66. $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ?: ['-1'];
  67. $authMap['visit.owner_user_id'] = array('in', $auth_user_ids);
  68. unset($map['visit.owner_user_id']);
  69. } else {
  70. $authMapData = [];
  71. $authMapData['auth_user_ids'] = $auth_user_ids;
  72. $authMapData['user_id'] = $user_id;
  73. $authMap = function ($query) use ($authMapData) {
  74. $query->where('visit.owner_user_id', ['in', $authMapData['auth_user_ids']])
  75. ->whereOr('visit.ro_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'))
  76. ->whereOr('visit.rw_user_id', array('like', '%,' . $authMapData['user_id'] . ',%'));
  77. };
  78. }
  79. }
  80. //列表展示字段
  81. $indexField = $fieldModel->getIndexField('crm_visit', $user_id, 1) ?: array('name');
  82. foreach ($indexField as $key => $value) {
  83. if ($value == 'visit.customer_name') unset($indexField[(int)$key]);
  84. }
  85. //人员类型
  86. $userField = $fieldModel->getFieldByFormType('crm_visit', 'user'); //人员类型
  87. $structureField = $fieldModel->getFieldByFormType('crm_visit', 'structure'); //部门类型
  88. $datetimeField = $fieldModel->getFieldByFormType('crm_visit', 'datetime'); //日期时间类型
  89. # 处理人员和部门类型的排序报错问题(前端传来的是包含_name的别名字段)
  90. $temporaryField = str_replace('_name', '', $order_field);
  91. if (in_array($temporaryField, $userField) || in_array($temporaryField, $structureField)) {
  92. $order_field = $temporaryField;
  93. }
  94. //排序
  95. if ($order_type && $order_field) {
  96. $order = $fieldModel->getOrderByFormtype('crm_visit', 'visit', $order_field, $order_type);
  97. } else {
  98. $order = 'visit.update_time desc';
  99. }
  100. foreach ($indexField AS $kk => $vv) {
  101. if ($vv == 'visit.contract_number') unset($indexField[(int)$kk]);
  102. }
  103. $readAuthIds = $userModel->getUserByPer('crm', 'visit', 'read');
  104. $updateAuthIds = $userModel->getUserByPer('crm', 'visit', 'update');
  105. $deleteAuthIds = $userModel->getUserByPer('crm', 'visit', 'delete');
  106. $list = db('crm_visit')
  107. ->alias('visit')
  108. ->join('__CRM_CUSTOMER__ customer', 'visit.customer_id=customer.customer_id', 'LEFT')
  109. ->join('__CRM_CONTRACT__ contract', 'visit.contract_id=contract.contract_id', 'LEFT')
  110. ->join('__CRM_CONTACTS__ contacts', 'visit.contacts_id=contacts.contacts_id', 'LEFT')
  111. ->where($map)
  112. ->where($partMap)
  113. ->where($authMap)
  114. ->limit($request['offset'], $request['length'])
  115. ->field('visit.*,
  116. contract.num as contract_number,
  117. customer.name as customer_name,
  118. contacts.name as contacts_name'
  119. )
  120. ->orderRaw($order)
  121. ->group('visit.visit_id')
  122. ->select();
  123. $dataCount = db('crm_visit')
  124. ->alias('visit')
  125. ->join('__CRM_CUSTOMER__ customer', 'visit.create_user_id=customer.customer_id', 'LEFT')
  126. ->join('__CRM_CONTRACT__ contract', 'visit.contract_id=contract.contract_id', 'LEFT')
  127. ->join('__CRM_CONTACTS__ contacts', 'visit.contacts_id=contacts.contacts_id', 'LEFT')
  128. ->where($map)->where($partMap)->where($authMap)->group('visit.visit_id')->count('visit.visit_id');
  129. foreach ($list as $k => $v) {
  130. $list[$k]['contract_num'] = $v['contract_number'];
  131. $list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : [];
  132. $list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : [];
  133. $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : '';
  134. $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : '';
  135. foreach ($userField as $key => $val) {
  136. $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : [];
  137. $list[$k][$val.'_name'] = implode($usernameField, ',');
  138. }
  139. foreach ($structureField as $key => $val) {
  140. $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : [];
  141. $list[$k][$val.'_name'] = implode($structureNameField, ',');
  142. }
  143. foreach ($datetimeField as $key => $val) {
  144. $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null;
  145. }
  146. $list[$k]['contract_id_info']['contract_id'] = $v['contract_id'];
  147. $list[$k]['contract_id_info']['name'] = $v['contract_name'];
  148. $list[$k]['customer_id_info']['customer_id'] = $v['create_user_id'];
  149. $list[$k]['customer_id_info']['name'] = $v['customer_name'];
  150. $list[$k]['customer_name'] = !empty($list[$k]['customer_id_info']['name']) ? $list[$k]['customer_id_info']['name'] : '';
  151. $list[$k]['contacts_id_info']['contacts_id'] = $v['contacts_id'];
  152. $list[$k]['contacts_id_info']['name'] = $v['contacts_name'];
  153. $list[$k]['contacts_name'] = !empty($list[$k]['contacts_id_info']['name']) ? $list[$k]['contacts_id_info']['name'] : '';
  154. //权限
  155. $roPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'read');
  156. $rwPre = $userModel->rwPre($user_id, $v['ro_user_id'], $v['rw_user_id'], 'update');
  157. $permission = [];
  158. $is_read = 0;
  159. $is_update = 0;
  160. $is_delete = 0;
  161. if (in_array($v['owner_user_id'], $readAuthIds) || $roPre || $rwPre) $is_read = 1;
  162. if (in_array($v['owner_user_id'], $updateAuthIds) || $rwPre) $is_update = 1;
  163. if (in_array($v['owner_user_id'], $deleteAuthIds)) $is_delete = 1;
  164. $permission['is_read'] = $is_read;
  165. $permission['is_update'] = $is_update;
  166. $permission['is_delete'] = $is_delete;
  167. $list[$k]['permission'] = $permission;
  168. # 日期
  169. $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null;
  170. $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null;
  171. }
  172. $data = [];
  173. $data['list'] = $list ?: [];
  174. $data['dataCount'] = $dataCount ?: 0;
  175. return $data;
  176. }
  177. /**
  178. * 回访详情
  179. */
  180. public function getDataById($id = '', $userId = 0)
  181. {
  182. $dataInfo = db('crm_visit')->where('visit_id', $id)->find();
  183. if (!$dataInfo) {
  184. $this->error = '暂无此数据';
  185. return false;
  186. }
  187. $userModel = new \app\admin\model\User();
  188. $dataInfo['create_user_id_info'] = isset($dataInfo['create_user_id']) ? $userModel->getUserById($dataInfo['create_user_id']) : [];
  189. $dataInfo['owner_user_id_info'] = isset($dataInfo['owner_user_id']) ? $userModel->getUserById($dataInfo['owner_user_id']) : [];
  190. $dataInfo['create_user_name'] = !empty($dataInfo['create_user_id_info']['realname']) ? $dataInfo['create_user_id_info']['realname'] : '';
  191. $dataInfo['owner_user_name'] = !empty($dataInfo['owner_user_id_info']['realname']) ? $dataInfo['owner_user_id_info']['realname'] : '';
  192. $dataInfo['customer_id_info'] = db('crm_customer')->where(['customer_id' => $dataInfo['customer_id']])->field('customer_id,name')->find();
  193. $dataInfo['customer_name'] = !empty($dataInfo['customer_id_info']['name']) ? $dataInfo['customer_id_info']['name'] : '';
  194. $dataInfo['contract_id_info'] = db('crm_contract')->where(['contract_id' => $dataInfo['contract_id']])->field('contract_id,name')->find();
  195. $dataInfo['contacts_id_info'] = db('crm_contacts')->where(['contacts_id' => $dataInfo['contacts_id']])->field('contacts_id,name')->find();
  196. $dataInfo['contacts_name'] = !empty($dataInfo['contacts_id_info']['name']) ? $dataInfo['contacts_id_info']['name'] : '';
  197. # 处理日期格式
  198. $fieldModel = new \app\admin\model\Field();
  199. $datetimeField = $fieldModel->getFieldByFormType('crm_visit', 'datetime'); //日期时间类型
  200. foreach ($datetimeField as $key => $val) {
  201. $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null;
  202. }
  203. $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null;
  204. $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null;
  205. // 字段授权
  206. if (!empty($userId)) {
  207. $grantData = getFieldGrantData($userId);
  208. $userLevel = isSuperAdministrators($userId);
  209. foreach ($dataInfo AS $key => $value) {
  210. if (!$userLevel && !empty($grantData['crm_visit'])) {
  211. $status = getFieldGrantStatus($key, $grantData['crm_visit']);
  212. # 查看权限
  213. if ($status['read'] == 0) unset($dataInfo[$key]);
  214. }
  215. }
  216. }
  217. return $dataInfo;
  218. }
  219. /**
  220. * 创建回访信息
  221. */
  222. public function createData($param)
  223. {
  224. $fieldModel = new \app\admin\model\Field();
  225. // 自动验证
  226. $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则
  227. $validate = new Validate($validateArr['rule'], $validateArr['message']);
  228. $result = $validate->check($param);
  229. if (!$result) {
  230. $this->error = $validate->getError();
  231. return false;
  232. }
  233. if (!$param['customer_id']) {
  234. $this->error = '请选择相关客户';
  235. return false;
  236. }
  237. # 处理合同的回访
  238. if ($param['contract_id']) {
  239. Db::name('crm_contract')->where('contract_id', $param['contract_id'])->update(['is_visit' => 1]);
  240. }
  241. // 处理部门、员工、附件、多选类型字段
  242. $arrFieldAtt = $fieldModel->getArrayField('crm_visit');
  243. foreach ($arrFieldAtt as $k => $v) {
  244. if ($v == 'visit_user_id') continue;
  245. $param[$v] = arrayToString($param[$v]);
  246. }
  247. // 处理日期(date)类型
  248. $dateField = $fieldModel->getFieldByFormType('crm_visit', 'date');
  249. if (!empty($dateField)) {
  250. foreach ($param AS $key => $value) {
  251. if (in_array($key, $dateField) && empty($value)) $param[$key] = null;
  252. }
  253. }
  254. $visitModel = new Visit();
  255. if ($visitModel->data($param)->allowField(true)->save()) {
  256. $visit_id = $visitModel->visit_id;
  257. updateActionLog($param['create_user_id'], 'crm_visit', $visitModel->visit_id, '', '', '创建了客户回访');
  258. RecordActionLog($param['create_user_id'],'crm_visit','save',$param['number'],'','','新增了客户回访'.$param['number']);
  259. $data = [];
  260. $data['visit_id'] = $visit_id;
  261. return $data;
  262. } else {
  263. $this->error = '添加失败';
  264. return false;
  265. }
  266. }
  267. /**
  268. * 编辑回访信息
  269. */
  270. public function updateDataById($param, $visit_id = '')
  271. {
  272. $Visit = model('Visit');
  273. $productModel = new \app\crm\model\Product();
  274. $dataInfo = $this->getDataById($visit_id);
  275. if (!$dataInfo) {
  276. $this->error = '数据不存在或已删除';
  277. return false;
  278. }
  279. $param['visit_id'] = $visit_id;
  280. //过滤不能修改的字段
  281. $unUpdateField = ['create_user_id', 'visit_time'];
  282. foreach ($unUpdateField as $v) {
  283. unset($param[$v]);
  284. }
  285. $fieldModel = new \app\admin\model\Field();
  286. // 自动验证
  287. // $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则
  288. $validateArr = $fieldModel->validateField($this->name, 0, 'update'); //获取自定义字段验证规则
  289. $validate = new Validate($validateArr['rule'], $validateArr['message']);
  290. $result = $validate->check($param);
  291. if (!$result) {
  292. $this->error = $validate->getError();
  293. return false;
  294. }
  295. // 处理部门、员工、附件、多选类型字段
  296. $arrFieldAtt = $fieldModel->getArrayField('crm_visit');
  297. foreach ($arrFieldAtt as $k => $v) {
  298. if ($v == 'visit_user_id') continue;
  299. if (isset($param[$v])) $param[$v] = arrayToString($param[$v]);
  300. }
  301. // 处理日期(date)类型
  302. $dateField = $fieldModel->getFieldByFormType('crm_visit', 'date');
  303. if (!empty($dateField)) {
  304. foreach ($param AS $key => $value) {
  305. if (in_array($key, $dateField) && empty($value)) $param[$key] = null;
  306. }
  307. }
  308. if ($Visit->update($param, ['visit_id' => $visit_id], true)) {
  309. //修改记录
  310. updateActionLog($param['user_id'], 'crm_visit', $visit_id, $dataInfo, $param);
  311. RecordActionLog($param['user_id'], 'crm_visit', 'update',$dataInfo['number'], $dataInfo, $param);
  312. $data = [];
  313. $data['visit_id'] = $visit_id;
  314. return $data;
  315. } else {
  316. $this->rollback();
  317. $this->error = '编辑失败';
  318. return false;
  319. }
  320. }
  321. /**
  322. * @param 删除
  323. * @return
  324. */
  325. public function del($visit_id)
  326. {
  327. $Visit = model('Visit');
  328. $fileModel = new \app\admin\model\File();
  329. $actionRecordModel = new \app\admin\model\ActionRecord();
  330. $userModel = new \app\admin\model\User();
  331. $delIds = [];
  332. $errorMessage = [];
  333. //数据权限判断
  334. $auth_user_ids = $userModel->getUserByPer('crm', 'visit', 'delete');
  335. foreach ($visit_id as $k => $v) {
  336. $isDel = true;
  337. //数据详情
  338. $data = $this->getDataById($v);
  339. if (!$data) {
  340. $isDel = false;
  341. $errorMessage[] = 'id为' . $v . '的客户回访删除失败,错误原因:' . $this->getError();
  342. }
  343. if (!in_array($data['owner_user_id'], $auth_user_ids)) {
  344. $isDel = false;
  345. $errorMessage[] = '名称为' . $data['name'] . '的客户回访删除失败,错误原因:无权操作';
  346. }
  347. if ($isDel) {
  348. $delIds[] = $v;
  349. }
  350. }
  351. $dataInfo = $Visit->where('visit_id',['in',$delIds])->select();
  352. if ($delIds) {
  353. $data = $Visit->delDatas($delIds);
  354. if (!$data) {
  355. return resultArray(['error' => $this->getError()]);
  356. }
  357. //删除关联附件
  358. $fileModel->delRFileByModule('crm_visit', $delIds);
  359. //删除关联操作记录
  360. $actionRecordModel->delDataById(['types' => 'crm_visit', 'visit_id' => $delIds]);
  361. $user=new ApiCommon();
  362. $userInfo = $user->userInfo;
  363. foreach ($dataInfo as $k => $v) {
  364. RecordActionLog($userInfo['id'], 'crm_contacts', 'delete', $v['name'], '', '', '删除了客户回访:' . $v['name']);
  365. }
  366. }
  367. return $errorMessage;
  368. }
  369. /**
  370. * 获取系统信息
  371. *
  372. * @param $id
  373. * @return array
  374. * @throws \think\db\exception\DataNotFoundException
  375. * @throws \think\db\exception\ModelNotFoundException
  376. * @throws \think\exception\DbException
  377. */
  378. public function getSystemInfo($id)
  379. {
  380. # 回访
  381. $visit = Db::name('crm_visit')->field(['create_user_id', 'create_time', 'update_time'])->where('visit_id', $id)->find();
  382. # 创建人
  383. $realname = Db::name('admin_user')->where('id', $visit['create_user_id'])->value('realname');
  384. return [
  385. 'create_user_id' => $realname,
  386. 'create_time' => date('Y-m-d H:i:s', $visit['create_time']),
  387. 'update_time' => date('Y-m-d H:i:s', $visit['update_time'])
  388. ];
  389. }
  390. }