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