123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 回款
  4. // +----------------------------------------------------------------------
  5. // | Author: Michael_xu | gengxiaoxu@5kcrm.com
  6. // +----------------------------------------------------------------------
  7. namespace app\crm\model;
  8. use think\Db;
  9. use app\crm\model\Contract as ContractModel;
  10. use app\admin\model\Common;
  11. use app\admin\model\Message;
  12. use think\Request;
  13. use think\Validate;
  14. class Receivables extends Common
  15. {
  16. /**
  17. * 为了数据库的整洁,同时又不影响Model和Controller的名称
  18. * 我们约定每个模块的数据表都加上相同的前缀,比如CRM模块用crm作为数据表前缀
  19. */
  20. protected $name = 'crm_receivables';
  21. protected $createTime = 'create_time';
  22. protected $updateTime = 'update_time';
  23. protected $autoWriteTimestamp = true;
  24. private $statusArr = ['0'=>'待审核','1'=>'审核中','2'=>'审核通过','3'=>'已拒绝','4'=>'已撤回'];
  25. /**
  26. * [getDataList 回款list]
  27. *
  28. * @param $request
  29. * @return array
  30. * @throws \think\db\exception\DataNotFoundException
  31. * @throws \think\db\exception\ModelNotFoundException
  32. * @throws \think\exception\DbException
  33. */
  34. public function getDataList($request)
  35. {
  36. $userModel = new \app\admin\model\User();
  37. $structureModel = new \app\admin\model\Structure();
  38. $fieldModel = new \app\admin\model\Field();
  39. $search = $request['search'];
  40. $user_id = $request['user_id'];
  41. $scene_id = (int)$request['scene_id'];
  42. $order_field = $request['order_field'];
  43. $order_type = $request['order_type'];
  44. $getCount = $request['getCount'];
  45. unset($request['scene_id']);
  46. unset($request['search']);
  47. unset($request['user_id']);
  48. unset($request['order_field']);
  49. unset($request['order_type']);
  50. unset($request['getCount']);
  51. $request = $this->fmtRequest( $request );
  52. $requestMap = $request['map'] ? : [];
  53. $sceneModel = new \app\admin\model\Scene();
  54. # getCount是代办事项传来的参数,代办事项不需要使用场景
  55. $sceneMap = [];
  56. if (empty($getCount)) {
  57. if ($scene_id) {
  58. //自定义场景
  59. $sceneMap = $sceneModel->getDataById($scene_id, $user_id, 'receivables') ? : [];
  60. } else {
  61. //默认场景
  62. $sceneMap = $sceneModel->getDefaultData('crm_receivables', $user_id) ? : [];
  63. }
  64. }
  65. if ($search) {
  66. //普通筛选
  67. $sceneMap['number'] = ['condition' => 'contains','value' => $search,'form_type' => 'text','name' => '回款编号'];
  68. }
  69. //优先级:普通筛选>高级筛选>场景
  70. $map = $requestMap ? array_merge($sceneMap, $requestMap) : $sceneMap;
  71. //高级筛选
  72. $map = where_arr($map, 'crm', 'receivables', 'index');
  73. //权限
  74. $authMap = [];
  75. $auth_user_ids = $userModel->getUserByPer('crm', 'receivables', 'index');
  76. if (isset($map['receivables.owner_user_id']) && $map['receivables.owner_user_id'][0] != 'like') {
  77. if (!is_array($map['receivables.owner_user_id'][1])) {
  78. $map['receivables.owner_user_id'][1] = [$map['receivables.owner_user_id'][1]];
  79. }
  80. if (in_array($map['receivables.owner_user_id'][0], ['neq', 'notin'])) {
  81. $auth_user_ids = array_diff($auth_user_ids, $map['receivables.owner_user_id'][1]) ? : []; //取差集
  82. } else {
  83. $auth_user_ids = array_intersect($map['receivables.owner_user_id'][1], $auth_user_ids) ? : []; //取交集
  84. }
  85. unset($map['receivables.owner_user_id']);
  86. }
  87. $auth_user_ids = array_merge(array_unique(array_filter($auth_user_ids))) ? : ['-1'];
  88. //负责人、相关团队
  89. $authMap['receivables.owner_user_id'] = ['in',$auth_user_ids];
  90. //列表展示字段
  91. $indexField = $fieldModel->getIndexField('crm_receivables', $user_id, 1) ? : array('number');
  92. //人员类型
  93. $userField = $fieldModel->getFieldByFormType('crm_receivables', 'user');
  94. $structureField = $fieldModel->getFieldByFormType('crm_receivables', 'structure'); //部门类型
  95. $datetimeField = $fieldModel->getFieldByFormType('crm_receivables', 'datetime'); //日期时间类型
  96. if ($request['order_type'] && $request['order_field']) {
  97. $order = $fieldModel->getOrderByFormtype('crm_receivables','receivables',$order_field,$order_type);
  98. } else {
  99. $order = 'receivables.update_time desc';
  100. }
  101. //排序
  102. if ($order_type && $order_field) {
  103. $order = $fieldModel->getOrderByFormtype('crm_receivables','receivables',$order_field, $order_type);
  104. } else {
  105. $order = 'receivables.update_time desc';
  106. }
  107. $readAuthIds = $userModel->getUserByPer('crm', 'receivables', 'read');
  108. $updateAuthIds = $userModel->getUserByPer('crm', 'receivables', 'update');
  109. $deleteAuthIds = $userModel->getUserByPer('crm', 'receivables', 'delete');
  110. $dataCount = db('crm_receivables')
  111. ->alias('receivables')
  112. ->join('__CRM_CUSTOMER__ customer','receivables.customer_id = customer.customer_id','LEFT')
  113. ->join('__CRM_CONTRACT__ contract','receivables.contract_id = contract.contract_id','LEFT')
  114. ->where($map)->where($authMap)->count('receivables_id');
  115. if (!empty($getCount) && $getCount == 1) {
  116. $data['dataCount'] = !empty($dataCount) ? $dataCount : 0;
  117. $data['extraData']['money'] = ['receivablesMoney' => $this->getReceivablesMoney($map, $authMap)];
  118. return $data;
  119. }
  120. foreach ($indexField AS $kk => $vv) {
  121. if ($vv == 'receivables.contract_num') unset($indexField[(int)$kk]);
  122. }
  123. $list = db('crm_receivables')
  124. ->alias('receivables')
  125. ->join('__CRM_CUSTOMER__ customer','receivables.customer_id = customer.customer_id','LEFT')
  126. ->join('__CRM_CONTRACT__ contract','receivables.contract_id = contract.contract_id','LEFT')
  127. ->where($map)
  128. ->where($authMap)
  129. ->limit($request['offset'], $request['length'])
  130. ->field('receivables.*,customer.name as customer_name,contract.name as contract_name,contract.num as contract_num,contract.money as contract_money')
  131. ->orderRaw($order)
  132. ->select();
  133. foreach ($list as $k=>$v) {
  134. $list[$k]['create_user_id_info'] = $v['create_user_id'] ? $userModel->getUserById($v['create_user_id']) : [];
  135. $list[$k]['owner_user_id_info'] = $v['owner_user_id'] ? $userModel->getUserById($v['owner_user_id']) : [];
  136. $list[$k]['create_user_name'] = !empty($list[$k]['create_user_id_info']['realname']) ? $list[$k]['create_user_id_info']['realname'] : '';
  137. $list[$k]['owner_user_name'] = !empty($list[$k]['owner_user_id_info']['realname']) ? $list[$k]['owner_user_id_info']['realname'] : '';
  138. $list[$k]['customer_id_info']['customer_id'] = $v['customer_id'] ? : '';
  139. $list[$k]['customer_id_info']['name'] = $v['customer_name'] ? : '';
  140. $list[$k]['contract_id_info']['contract_id'] = $v['contract_id'] ? : '';
  141. $list[$k]['contract_id_info']['name'] = $v['contract_num'] ? : '';
  142. $list[$k]['contract_id_info']['money'] = $v['contract_money'] ? : '0.00';
  143. $list[$k]['contract_money'] = $v['contract_money'] ? : '0.00';
  144. foreach ($userField as $key => $val) {
  145. $usernameField = !empty($v[$val]) ? db('admin_user')->whereIn('id', stringToArray($v[$val]))->column('realname') : [];
  146. $list[$k][$val] = implode($usernameField, ',');
  147. }
  148. foreach ($structureField as $key => $val) {
  149. $structureNameField = !empty($v[$val]) ? db('admin_structure')->whereIn('id', stringToArray($v[$val]))->column('name') : [];
  150. $list[$k][$val] = implode($structureNameField, ',');
  151. }
  152. foreach ($datetimeField as $key => $val) {
  153. $list[$k][$val] = !empty($v[$val]) ? date('Y-m-d H:i:s', $v[$val]) : null;
  154. }
  155. $list[$k]['check_status_info'] = $this->statusArr[$v['check_status']];
  156. //期数
  157. $plan_num = db('crm_receivables_plan')->where(['plan_id' => $v['plan_id']])->value('num');
  158. $list[$k]['plan_id_info'] = $plan_num ? : '';
  159. //权限
  160. $permission = [];
  161. $is_read = 0;
  162. $is_update = 0;
  163. $is_delete = 0;
  164. if (in_array($v['owner_user_id'],$readAuthIds)) $is_read = 1;
  165. if (in_array($v['owner_user_id'],$updateAuthIds)) $is_update = 1;
  166. if (in_array($v['owner_user_id'],$deleteAuthIds)) $is_delete = 1;
  167. $permission['is_read'] = $is_read;
  168. $permission['is_update'] = $is_update;
  169. $permission['is_delete'] = $is_delete;
  170. $list[$k]['permission'] = $permission;
  171. # 日期
  172. $list[$k]['create_time'] = !empty($v['create_time']) ? date('Y-m-d H:i:s', $v['create_time']) : null;
  173. $list[$k]['update_time'] = !empty($v['update_time']) ? date('Y-m-d H:i:s', $v['update_time']) : null;
  174. }
  175. $data = [];
  176. $data['list'] = $list;
  177. $data['dataCount'] = $dataCount ? : 0;
  178. $data['extraData']['money'] = ['receivablesMoney' => $this->getReceivablesMoney($map, $authMap)];
  179. return $data;
  180. }
  181. /**
  182. * 获取回款总金额
  183. *
  184. * @param $map
  185. * @param $authMap
  186. * @return float|string
  187. */
  188. private function getReceivablesMoney($map, $authMap)
  189. {
  190. $money = db('crm_receivables')->alias('receivables')
  191. ->join('__CRM_CUSTOMER__ customer','receivables.customer_id = customer.customer_id','LEFT')
  192. ->join('__CRM_CONTRACT__ contract','receivables.contract_id = contract.contract_id','LEFT')
  193. ->where($map)->where($authMap)->where('receivables.check_status', 2)->sum('receivables.money');
  194. return !empty($money) ? sprintf("%.2f", $money) : 0.00;
  195. }
  196. /**
  197. * 创建回款信息
  198. * @author Michael_xu
  199. * @param
  200. * @return
  201. */
  202. public function createData($param)
  203. {
  204. if (!$param['customer_id']) {
  205. $this->error = '请先选择客户';
  206. return false;
  207. }
  208. // 仅允许审批通过,且未作废的合同添加回款
  209. if ($param['contract_id']) {
  210. $check_status = ContractModel::where(['contract_id' => $param['contract_id']])->value('check_status');
  211. if ($check_status == 6) {
  212. $this->error = '合同已作废';
  213. return false;
  214. } elseif ($check_status != 2) {
  215. $this->error = '合同未审核通过';
  216. return false;
  217. }
  218. } else {
  219. $this->error = '请先选择合同';
  220. return false;
  221. }
  222. $fieldModel = new \app\admin\model\Field();
  223. // 自动验证
  224. $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则
  225. $validate = new Validate($validateArr['rule'], $validateArr['message']);
  226. $result = $validate->check($param);
  227. if (!$result) {
  228. $this->error = $validate->getError();
  229. return false;
  230. }
  231. # 验证回款计划是否已经被关联
  232. if (!empty($param['plan_id']) && db('crm_receivables_plan')->where('plan_id', $param['plan_id'])->value('receivables_id')) {
  233. $this->error = '回款已经已经关联了其他回款,不能重复关联!';
  234. return false;
  235. }
  236. //处理部门、员工、附件、多选类型字段
  237. $arrFieldAtt = $fieldModel->getArrayField('crm_receivables');
  238. foreach ($arrFieldAtt as $k=>$v) {
  239. $param[$v] = arrayToString($param[$v]);
  240. }
  241. if ($this->data($param)->allowField(true)->save()) {
  242. //站内信
  243. $send_user_id = stringToArray($param['check_user_id']);
  244. if ($send_user_id && empty($param['check_status'])) {
  245. (new Message())->send(
  246. Message::RECEIVABLES_TO_DO,
  247. [
  248. 'title' => $param['number'],
  249. 'action_id' => $this->receivables_id
  250. ],
  251. $send_user_id
  252. );
  253. }
  254. $data = [];
  255. $data['receivables_id'] = $this->receivables_id;
  256. //修改记录
  257. updateActionLog($param['create_user_id'], 'crm_receivables', $this->receivables_id, '', '', '创建了回款');
  258. # 添加活动记录
  259. Db::name('crm_activity')->insert([
  260. 'type' => 2,
  261. 'activity_type' => 7,
  262. 'activity_type_id' => $data['receivables_id'],
  263. 'content' => $param['number'],
  264. 'create_user_id' => $param['create_user_id'],
  265. 'update_time' => time(),
  266. 'create_time' => time(),
  267. 'customer_ids' => $param['customer_id'],
  268. 'contract_ids' => $param['contract_id']
  269. ]);
  270. return $data;
  271. } else {
  272. $this->error = '添加失败';
  273. return false;
  274. }
  275. }
  276. /**
  277. * 根据对象ID 获取该年各个月回款情况
  278. * @param [year] [哪一年]
  279. * @param [owner_user_id] [哪个员工]
  280. * @param [start_time] [开始时间]
  281. * @param [end_time] [结束时间]
  282. */
  283. public function getDataByUserId($param)
  284. {
  285. if ($param['obj_type']) {
  286. if ($param['obj_type'] == 1) { //部门
  287. $userModel = new \app\admin\model\User();
  288. $str = $userModel->getSubUserByStr($param['obj_id'], 1) ? : ['-1'];
  289. $map['owner_user_id'] = array('in',$str);
  290. } else { //员工
  291. $map['owner_user_id'] = $param['obj_id'];
  292. }
  293. }
  294. //审核状态
  295. $start = date('Y-m-d',$param['start_time']);
  296. $stop = date('Y-m-d',$param['end_time']);
  297. $map['check_status'] = 2;
  298. $data = $this->where($map)->where(['return_time' => ['between',[$start,$stop]]])->sum('money');
  299. return $data;
  300. }
  301. /**
  302. * 编辑回款主表信息
  303. * @author Michael_xu
  304. * @param
  305. * @return
  306. */
  307. public function updateDataById($param, $receivables_id = '')
  308. {
  309. $userModel = new \app\admin\model\User();
  310. $dataInfo = db('crm_receivables')->where(['receivables_id' => $receivables_id])->find();
  311. if (!$dataInfo) {
  312. $this->error = '数据不存在或已删除';
  313. return false;
  314. }
  315. $param['receivables_id'] = $receivables_id;
  316. //过滤不能修改的字段
  317. $unUpdateField = ['create_user_id','is_deleted','delete_time','delete_user_id'];
  318. foreach ($unUpdateField as $v) {
  319. unset($param[$v]);
  320. }
  321. $fieldModel = new \app\admin\model\Field();
  322. // 自动验证
  323. $validateArr = $fieldModel->validateField($this->name); //获取自定义字段验证规则
  324. $validate = new Validate($validateArr['rule'], $validateArr['message']);
  325. $result = $validate->check($param);
  326. if (!$result) {
  327. $this->error = $validate->getError();
  328. return false;
  329. }
  330. //处理部门、员工、附件、多选类型字段
  331. $arrFieldAtt = $fieldModel->getArrayField('crm_receivables');
  332. foreach ($arrFieldAtt as $k=>$v) {
  333. $param[$v] = arrayToString($param[$v]);
  334. }
  335. if ($this->update($param, ['receivables_id' => $receivables_id], true)) {
  336. //修改记录
  337. updateActionLog($param['user_id'], 'crm_receivables', $receivables_id, $dataInfo, $param);
  338. //站内信
  339. $send_user_id = stringToArray($param['check_user_id']);
  340. if ($send_user_id && empty($param['check_status'])) {
  341. (new Message())->send(
  342. Message::RECEIVABLES_TO_DO,
  343. [
  344. 'title' => $param['number'],
  345. 'action_id' => $receivables_id
  346. ],
  347. $send_user_id
  348. );
  349. }
  350. $data = [];
  351. $data['receivables_id'] = $receivables_id;
  352. return $data;
  353. } else {
  354. $this->error = '编辑失败';
  355. return false;
  356. }
  357. }
  358. /**
  359. * 回款数据
  360. *
  361. * @param string $id
  362. * @return Common|array|bool|\PDOStatement|string|\think\Model|null
  363. * @throws \think\db\exception\DataNotFoundException
  364. * @throws \think\db\exception\ModelNotFoundException
  365. * @throws \think\exception\DbException
  366. */
  367. public function getDataById($id = '')
  368. {
  369. $map['receivables_id'] = $id;
  370. $dataInfo = db('crm_receivables')->where($map)->find();
  371. if (!$dataInfo) {
  372. $this->error = '暂无此数据';
  373. return false;
  374. }
  375. $userModel = new \app\admin\model\User();
  376. $dataInfo['create_user_id_info'] = isset($dataInfo['create_user_id']) ? $userModel->getUserById($dataInfo['create_user_id']) : [];
  377. $dataInfo['owner_user_id_info'] = isset($dataInfo['owner_user_id']) ? $userModel->getUserById($dataInfo['owner_user_id']) : [];
  378. $dataInfo['create_user_name'] = !empty($dataInfo['create_user_id_info']['realname']) ? $dataInfo['create_user_id_info']['realname'] : '';
  379. $dataInfo['owner_user_name'] = !empty($dataInfo['owner_user_id_info']['realname']) ? $dataInfo['owner_user_id_info']['realname'] : '';
  380. $dataInfo['customer_id_info'] = $dataInfo['customer_id'] ? db('crm_customer')->where(['customer_id' => $dataInfo['customer_id']])->field('customer_id,name')->find() : [];
  381. $dataInfo['contract_id_info'] = $dataInfo['contract_id'] ? db('crm_contract')->where(['contract_id' => $dataInfo['contract_id']])->field('contract_id,name,money')->find() : [];
  382. $dataInfo['receivables_id'] = $id;
  383. # 处理时间格式
  384. $fieldModel = new \app\admin\model\Field();
  385. $datetimeField = $fieldModel->getFieldByFormType('crm_receivables', 'datetime'); //日期时间类型
  386. foreach ($datetimeField as $key => $val) {
  387. $dataInfo[$val] = !empty($dataInfo[$val]) ? date('Y-m-d H:i:s', $dataInfo[$val]) : null;
  388. }
  389. $dataInfo['create_time'] = !empty($dataInfo['create_time']) ? date('Y-m-d H:i:s', $dataInfo['create_time']) : null;
  390. $dataInfo['update_time'] = !empty($dataInfo['update_time']) ? date('Y-m-d H:i:s', $dataInfo['update_time']) : null;
  391. return $dataInfo;
  392. }
  393. /**
  394. * 回款&&合同统计(列表)
  395. * @param
  396. * @return
  397. */
  398. public function getstatisticsData($request)
  399. {
  400. $userModel = new \app\admin\model\User();
  401. $structureModel = new \app\admin\model\Structure();
  402. $fieldModel = new \app\admin\model\Field();
  403. $contractModel = new \app\crm\model\Contract();
  404. $adminModel = new \app\admin\model\Admin();
  405. $perUserIds = $userModel->getUserByPer('bi', 'receivables', 'read'); //权限范围内userIds
  406. $whereData = $adminModel->getWhere($param, '', $perUserIds); //统计条件
  407. $userIds = $whereData['userIds'];
  408. if (!$request['year']) {
  409. $request['year'] = date('Y');
  410. }
  411. if ($request['month']) {
  412. $start = strtotime($request['year'].'-'.$request['month'].'-01');
  413. if ($request['month'] == '12') {
  414. $next_year = $request['year']+1;
  415. $end = strtotime($next_year.'-01-01');
  416. } else {
  417. $next_month = $request['month']+1;
  418. $end = strtotime($request['year'].'-'.$next_month.'-01');
  419. }
  420. } else {
  421. $next_year = $request['year']+1;
  422. $start = strtotime($request['year'].'-01-01');
  423. $end = strtotime($next_year.'-01-01');
  424. }
  425. $map['owner_user_id'] = ['in',$userIds];
  426. //$map['rec.check_status'] = 3;
  427. $map['create_time'] = array('between',array($start,$end));
  428. //合同有多个回款
  429. //根据时间查合同
  430. if( $request['type'] == '1'){
  431. $map_type['contract.owner_user_id'] = ['in',$userIds];
  432. $map_type['contract.create_time'] = array('between',array($start,$end));
  433. $userField = $fieldModel->getFieldByFormType('crm_contract', 'user');
  434. $structureField = $fieldModel->getFieldByFormType('crm_contract', 'structure'); //部门类型
  435. $list = Db::name('CrmContract')->alias('contract')
  436. ->join('__CRM_CUSTOMER__ customer','contract.customer_id = customer.customer_id','LEFT')
  437. ->join('__CRM_BUSINESS__ business','contract.contract_id = business.business_id','LEFT')
  438. ->join('__CRM_CONTACTS__ contacts','contract.contract_id = contacts.contacts_id','LEFT')
  439. ->field('contract.*,customer.name as customer_name,business.name as business_name,contacts.name as contacts_name')
  440. ->where($map_type)->select();
  441. if($list){
  442. foreach ($list as $k=>$v) {
  443. $list[$k]['create_user_id_info'] = isset($v['create_user_id']) ? $userModel->getUserById($v['create_user_id']) : [];
  444. $list[$k]['owner_user_id_info'] = isset($v['owner_user_id']) ? $userModel->getUserById($v['owner_user_id']) : [];
  445. foreach ($userField as $key => $val) {
  446. $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : [];
  447. }
  448. foreach ($structureField as $key => $val) {
  449. $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : [];
  450. }
  451. $list[$k]['business_id_info']['business_id'] = $v['business_id'];
  452. $list[$k]['business_id_info']['name'] = $v['business_name'];
  453. $list[$k]['customer_id_info']['customer_id'] = $v['customer_id'];
  454. $list[$k]['customer_id_info']['name'] = $v['customer_name'];
  455. $list[$k]['contacts_id_info']['customer_id'] = $v['contacts_id'];
  456. $list[$k]['contacts_id_info']['name'] = $v['contacts_name'];
  457. $list[$k]['check_status_info'] = $this->statusArr[$v['check_status']];
  458. }
  459. return $list;
  460. } else {
  461. return array();
  462. }
  463. } else { //回款
  464. $map_rec['receivables.owner_user_id'] = ['in',$userIds];
  465. //$map['rec.check_status'] = 3;
  466. $map_rec['receivables.create_time'] = array('between',array($start,$end));
  467. $map_rec['receivables.check_status'] = 2;
  468. $userField = $fieldModel->getFieldByFormType('crm_receivables', 'user');
  469. $structureField = $fieldModel->getFieldByFormType('crm_receivables', 'structure'); //部门类型
  470. $list = db('crm_receivables')
  471. ->alias('receivables')
  472. ->join('__CRM_CUSTOMER__ customer','receivables.customer_id = customer.customer_id','LEFT')
  473. ->join('__CRM_CONTRACT__ contract','receivables.contract_id = contract.contract_id','LEFT')
  474. ->where($map_rec)
  475. ->field('receivables.*,customer.name as customer_name,contract.name as contract_name,contract.num as contract_num,contract.money as contract_money')
  476. ->select();
  477. foreach ($list as $k=>$v) {
  478. $list[$k]['create_user_id_info'] = $v['create_user_id'] ? $userModel->getUserById($v['create_user_id']) : [];
  479. $list[$k]['owner_user_id_info'] = $v['owner_user_id'] ? $userModel->getUserById($v['owner_user_id']) : [];
  480. $list[$k]['customer_id_info']['customer_id'] = $v['customer_id'] ? : '';
  481. $list[$k]['customer_id_info']['name'] = $v['customer_name'] ? : '';
  482. $list[$k]['contract_id_info']['contract_id'] = $v['contract_id'] ? : '';
  483. $list[$k]['contract_id_info']['name'] = $v['contract_name'] ? : '';
  484. $list[$k]['contract_id_info']['money'] = $v['contract_money'] ? : '0.00';
  485. $list[$k]['contract_money'] = $v['contract_money'] ? : '0.00';
  486. foreach ($userField as $key => $val) {
  487. $list[$k][$val.'_info'] = isset($v[$val]) ? $userModel->getListByStr($v[$val]) : [];
  488. }
  489. foreach ($structureField as $key => $val) {
  490. $list[$k][$val.'_info'] = isset($v[$val]) ? $structureModel->getDataByStr($v[$val]) : [];
  491. }
  492. $list[$k]['check_status_info'] = $this->statusArr[$v['check_status']];
  493. }
  494. return $list;
  495. }
  496. }
  497. /**
  498. * [回款统计] 柱状图
  499. * @author Michael_xu
  500. * @param request [查询条件]
  501. * @param
  502. * @return [array]
  503. */
  504. public function getStatistics($request)
  505. {
  506. $userModel = new \app\admin\model\User();
  507. $userIds = $request['userIds'];
  508. $charMonthArr = []; //按照月份
  509. $charQuarterArr = []; //按照季度
  510. $quarter = 0;
  511. $contractMoneyTotal = '';
  512. $receivablesMoneyTotal = '';
  513. //按照月份
  514. for ($i = 1; $i < 13; $i++) {
  515. $contractMoney = '0.00';
  516. $receivablesMoney = '0.00';
  517. $conQuarterMoney = '0.00';
  518. $reQuarterMoney = '0.00';
  519. $start_time = strtotime($request['year'].'-'.$i.'-01');
  520. $next_i = $i+1;
  521. $end_time = strtotime($request['year'].'-'.$next_i.'-01')-1;
  522. if ($i == 12) {
  523. $next_year = $request['year']+1;
  524. $end_time = strtotime($next_year.'-01-01')-1;
  525. }
  526. $where_receivables = [];
  527. $where_contract = [];
  528. $where_contract['owner_user_id'] = ['in',$userIds];
  529. $where_receivables['owner_user_id'] = ['in',$userIds];
  530. $where_contract['create_time'] = array('between',array($start_time,$end_time));
  531. $where_receivables['return_time'] = array('between',array( date('Y-m-d',$start_time),date('Y-m-d',$end_time)));
  532. $where_receivables['owner_user_id'] = ['in',$userIds];
  533. $where_receivables['check_status'] = $where_contract['check_status'] = 2; //审核通过
  534. $contractMoney = db('crm_contract')->where($where_contract)->sum('money');
  535. $receivablesMoney = db('crm_receivables')->where($where_receivables)->sum('money');
  536. $conQuarterMoney += $charMonthArr[$i]['contractMoney'] = $contractMoney;
  537. $reQuarterMoney += $charMonthArr[$i]['receivablesMoney'] = $receivablesMoney;
  538. if (in_array($i, array('3','4','6','9','12'))) {
  539. //季度
  540. $quarter++;
  541. $charQuarterArr[$quarter]['conQuarterMoney'] = $conQuarterMoney;
  542. $charQuarterArr[$quarter]['reQuarterMoney'] = $reQuarterMoney;
  543. $conQuarterMoney = '0.00';
  544. $reQuarterMoney = '0.00';
  545. }
  546. $contractMoneyTotal += $contractMoney;
  547. $receivablesMoneyTotal += $receivablesMoney;
  548. }
  549. $data['charMonthArr'] = $charMonthArr; //月度统计
  550. $data['charQuarterArr'] = $charQuarterArr; //季度统计
  551. $data['contractMoneyTotal'] = $contractMoneyTotal ? : 0.00;
  552. $data['receivablesMoneyTotal'] = $receivablesMoneyTotal ? : 0.00;
  553. return $data;
  554. }
  555. /**
  556. * [合同回款金额]
  557. * @author Michael_xu
  558. * @param contract_id 合同ID
  559. * @param
  560. * @return
  561. */
  562. public function getMoneyByContractId($contract_id)
  563. {
  564. $doneMoney = $this->where(['contract_id' => $contract_id,'check_status' => 2])->sum('money');
  565. $contractMoney = db('crm_contract')->where(['contract_id' => $contract_id])->value('money');
  566. $unMoney = $contractMoney-$doneMoney;
  567. $data['doneMoney'] = $doneMoney ? : '0.00';
  568. $data['unMoney'] = $unMoney ? : '0.00';
  569. $data['contractMoney'] = $contractMoney ? : '0.00';
  570. return $data;
  571. }
  572. /**
  573. * 获取系统信息
  574. *
  575. * @param $id
  576. * @return array
  577. * @throws \think\db\exception\DataNotFoundException
  578. * @throws \think\db\exception\ModelNotFoundException
  579. * @throws \think\exception\DbException
  580. */
  581. public function getSystemInfo($id)
  582. {
  583. # 回款
  584. $receivables = Db::name('crm_receivables')->field(['create_user_id', 'create_time', 'update_time'])->where('receivables_id', $id)->find();
  585. # 创建人
  586. $realname = Db::name('admin_user')->where('id', $receivables['create_user_id'])->value('realname');
  587. return [
  588. 'create_user_name' => $realname,
  589. 'create_time' => date('Y-m-d H:i:s', $receivables['create_time']),
  590. 'update_time' => date('Y-m-d H:i:s', $receivables['update_time'])
  591. ];
  592. }
  593. }