123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | Description: 商业智能-业绩目标
  4. // +----------------------------------------------------------------------
  5. // | Author: Michael_xu | gengxiaoxu@5kcrm.com
  6. // +----------------------------------------------------------------------
  7. namespace app\bi\controller;
  8. use app\admin\controller\ApiCommon;
  9. use think\Db;
  10. use think\Hook;
  11. use think\Request;
  12. use app\bi\logic\ExcelLogic;
  13. class Achievement extends ApiCommon
  14. {
  15. /**
  16. * 用于判断权限
  17. * @permission 无限制
  18. * @allow 登录用户可访问
  19. * @other 其他根据系统设置
  20. **/
  21. public function _initialize()
  22. {
  23. $action = [
  24. 'permission' => [''],
  25. 'allow' => ['statistics', 'excelexport']
  26. ];
  27. Hook::listen('check_auth', $action);
  28. $request = Request::instance();
  29. $a = strtolower($request->action());
  30. if (!in_array($a, $action['permission'])) {
  31. parent::_initialize();
  32. }
  33. if (!checkPerByAction('bi', 'achievement', 'read')) {
  34. header('Content-Type:application/json; charset=utf-8');
  35. exit(json_encode(['code' => 102, 'error' => '无权操作']));
  36. }
  37. }
  38. /**
  39. * 业绩目标完成情况
  40. *
  41. * @return \think\response\Json
  42. * @throws \think\db\exception\DataNotFoundException
  43. * @throws \think\db\exception\ModelNotFoundException
  44. * @throws \think\exception\DbException
  45. */
  46. public function statistics($param = '')
  47. {
  48. if($param['excel_type']!=1){
  49. $param = $this->param;
  50. }
  51. // $achievementModel = new \app\crm\model\Achievement();
  52. // $list = $achievementModel->getList($param) ? : [];
  53. $list = $this->getAchievementStatistics($param) ?: [];
  54. //导出使用
  55. if (!empty($param['excel_type'])) {
  56. $list = $this->excelStatistics($param) ?: [];
  57. return $list;
  58. }
  59. return resultArray(['data' => $list]);
  60. }
  61. /**
  62. * 业绩目标完成情况列表
  63. *
  64. * @param $param
  65. * @return array
  66. * @throws \think\db\exception\DataNotFoundException
  67. * @throws \think\db\exception\ModelNotFoundException
  68. * @throws \think\exception\DbException
  69. */
  70. private function getAchievementStatistics($param)
  71. {
  72. # 结果数据
  73. $result = [];
  74. # 参数
  75. $status = !empty($param['status']) ? $param['status'] : 1; # 类型:1合同目标;2回款目标;
  76. $year = !empty($param['year']) ? $param['year'] : 0; # 年份
  77. $structureId = !empty($param['structure_id']) ? $param['structure_id'] : 0; # 部门
  78. $userId = !empty($param['user_id']) ? $param['user_id'] : 0; # 员工
  79. $type = !empty($param['type']) ? $param['type'] : 1; # 类型:1部门;2员工
  80. # 设置业绩目标条件
  81. $achievementWhere['year'] = $year;
  82. $achievementWhere['status'] = $status;
  83. $achievementWhere['type'] = !empty($type) && $type == 1 ? 2 : 3;
  84. if (!empty($userId)) $achievementWhere['obj_id'] = $userId;
  85. if (!empty($structureId)) $achievementWhere['obj_id'] = $structureId;
  86. # 查询业绩目标数据
  87. $achievementList = Db::name('crm_achievement')->where($achievementWhere)->select();
  88. if (empty($achievementList)) return [];
  89. # 部门
  90. if ($type == 1) {
  91. foreach ($achievementList as $key => $value) {
  92. # 组装结果数据
  93. $result[$value['obj_id']] = [
  94. 'name' => $value['name'],
  95. 'list' => [
  96. '01' => ['achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  97. '02' => ['achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  98. '03' => ['achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  99. '04' => ['achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  100. '05' => ['achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  101. '06' => ['achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  102. '07' => ['achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  103. '08' => ['achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  104. '09' => ['achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  105. '10' => ['achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  106. '11' => ['achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  107. '12' => ['achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月']
  108. ]
  109. ];
  110. # 获取部门下的员工ID
  111. $userIds = Db::name('admin_user')->where('structure_id', $value['obj_id'])->column('id');
  112. # 业绩完成字段
  113. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  114. # 业绩完成条件
  115. $finishWhere['check_status'] = 2;
  116. $finishWhere['owner_user_id'] = ['in', $userIds];
  117. # 合同
  118. if ($status == 1) {
  119. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  120. }
  121. # 回款
  122. if ($status == 2) {
  123. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  124. }
  125. # 计算完成情况
  126. foreach ($finishArray as $k => $v) {
  127. if (!empty($result[$value['obj_id']]['list'][$v['time']])) {
  128. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  129. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  130. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  131. }
  132. }
  133. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  134. }
  135. }
  136. # 员工
  137. if ($type == 2) {
  138. $userData = [];
  139. $userList = db('admin_user')->field(['id', 'realname'])->select();
  140. foreach ($userList AS $key => $value) {
  141. $userData[$value['id']] = $value['realname'];
  142. }
  143. foreach ($achievementList as $key => $value) {
  144. # 组装结果数据
  145. $result[$value['obj_id']] = [
  146. 'name' => !empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],
  147. 'list' => [
  148. '01' => ['achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  149. '02' => ['achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  150. '03' => ['achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  151. '04' => ['achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  152. '05' => ['achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  153. '06' => ['achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  154. '07' => ['achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  155. '08' => ['achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  156. '09' => ['achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  157. '10' => ['achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  158. '11' => ['achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  159. '12' => ['achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月']
  160. ]
  161. ];
  162. # 业绩完成字段
  163. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  164. # 业绩完成条件
  165. $finishWhere = ['check_status' => 2, 'owner_user_id' => $value['obj_id']];
  166. # 合同
  167. if ($status == 1) {
  168. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  169. }
  170. # 回款
  171. if ($status == 2) {
  172. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  173. }
  174. # 计算完成情况
  175. foreach ($finishArray as $k => $v) {
  176. if (!empty($result[$value['obj_id']]['list'][$v['time']])) {
  177. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  178. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  179. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  180. }
  181. }
  182. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  183. }
  184. }
  185. return array_values($result);
  186. }
  187. public function excelStatistics($param)
  188. {
  189. # 结果数据
  190. $result = [];
  191. # 参数
  192. $status = !empty($param['status']) ? $param['status'] : 1; # 类型:1合同目标;2回款目标;
  193. $year = !empty($param['year']) ? $param['year'] : 0; # 年份
  194. $structureId = !empty($param['structure_id']) ? $param['structure_id'] : 0; # 部门
  195. $userId = !empty($param['user_id']) ? $param['user_id'] : 0; # 员工
  196. $type = !empty($param['type']) ? $param['type'] : 1; # 类型:1部门;2员工
  197. # 设置业绩目标条件
  198. $achievementWhere['year'] = $year;
  199. $achievementWhere['status'] = $status;
  200. $achievementWhere['type'] = !empty($type) && $type == 1 ? 2 : 3;
  201. if (!empty($userId)) $achievementWhere['obj_id'] = $userId;
  202. if (!empty($structureId)) $achievementWhere['obj_id'] = $structureId;
  203. # 查询业绩目标数据
  204. $achievementList = Db::name('crm_achievement')->where($achievementWhere)->select();
  205. if (empty($achievementList)) return [];
  206. # 部门
  207. if ($type == 1) {
  208. foreach ($achievementList as $key => $value) {
  209. # 组装结果数据
  210. $result[] = [
  211. ['name' => $value['name'], 'achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  212. ['name' => $value['name'], 'achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  213. ['name' => $value['name'], 'achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  214. ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第一季度'],
  215. ['name' => $value['name'], 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  216. ['name' => $value['name'], 'achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  217. ['name' => $value['name'], 'achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  218. ['name' => $value['name'], 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '第二季度'],
  219. ['name' => $value['name'], 'achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  220. ['name' => $value['name'], 'achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  221. ['name' => $value['name'], 'achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  222. ['name' => $value['name'], 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第三季度'],
  223. ['name' => $value['name'], 'achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  224. ['name' => $value['name'], 'achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  225. ['name' => $value['name'], 'achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月'],
  226. ['name' => $value['name'], 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第四季度'],
  227. ['name' => $value['name'], 'achievement' => (int)$value['yeartarget'], 'money' => 0, 'rate' => 0, 'month' => '全年'],
  228. ];
  229. # 获取部门下的员工ID
  230. $userIds = Db::name('admin_user')->where('structure_id', $value['obj_id'])->column('id');
  231. # 业绩完成字段
  232. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  233. # 业绩完成条件
  234. $finishWhere['check_status'] = 2;
  235. $finishWhere['owner_user_id'] = ['in', $userIds];
  236. # 合同
  237. if ($status == 1) {
  238. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  239. }
  240. # 回款
  241. if ($status == 2) {
  242. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  243. }
  244. # 计算完成情况
  245. foreach ($finishArray as $k => $v) {
  246. if (!empty($result[$v['time']])) {
  247. $achievement = $result[$v['time']]['achievement'];
  248. $result[$v['time']]['money'] = (int)$v['money'];
  249. $result[$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  250. }
  251. }
  252. foreach ($result as &$val){
  253. $val[3]['money']=$val[0]['money']+$val[1]['money']+$val[2]['money'];
  254. $val[3]['rate']=$val[0]['rate']+$val[1]['rate']+$val[2]['rate'];
  255. $val[7]['money']=$val[4]['money']+$val[5]['money']+$val[6]['money'];
  256. $val[7]['rate']=$val[4]['rate']+$val[5]['rate']+$val[6]['rate'];
  257. $val[11]['money']=$val[7]['money']+$val[9]['money']+$val[10]['money'];
  258. $val[11]['rate']=$val[8]['rate']+$val[9]['rate']+$val[10]['rate'];
  259. $val[15]['money']=$val[12]['money']+$val[13]['money']+$val[14]['money'];
  260. $val[15]['rate']=$val[12]['rate']+$val[13]['rate']+$val[14]['rate'];
  261. $val[15]['money']=$val[12]['money']+$val[13]['money']+$val[14]['money'];
  262. $val[15]['rate']=$val[12]['rate']+$val[13]['rate']+$val[14]['rate'];
  263. $val[16]['money']=$val[3]['money']+$val[7]['money']+$val[11]['money']+$val[15]['money'];
  264. $val[16]['rate']=$val[3]['rate']+$val[7]['rate']+$val[11]['rate']+$val[15]['rate'];
  265. }
  266. $result = array_values($result);
  267. }
  268. }
  269. # 员工
  270. if ($type == 2) {
  271. foreach ($achievementList AS $key => $value) {
  272. # 组装结果数据
  273. $result[] = [
  274. ['name' => $value['name'], 'achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  275. ['name' => $value['name'], 'achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  276. ['name' => $value['name'], 'achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  277. ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第一季度'],
  278. ['name' => $value['name'], 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  279. ['name' => $value['name'], 'achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  280. ['name' => $value['name'], 'achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  281. ['name' => $value['name'], 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '第二季度'],
  282. ['name' => $value['name'], 'achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  283. ['name' => $value['name'], 'achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  284. ['name' => $value['name'], 'achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  285. ['name' => $value['name'], 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第三季度'],
  286. ['name' => $value['name'], 'achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  287. ['name' => $value['name'], 'achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  288. ['name' => $value['name'], 'achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月'],
  289. ['name' => $value['name'], 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第四季度'],
  290. ['name' => $value['name'], 'achievement' => (int)$value['yeartarget'], 'money' => 0, 'rate' => 0, 'month' => '全年'],
  291. ];
  292. # 业绩完成字段
  293. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  294. # 业绩完成条件
  295. $finishWhere = ['check_status' => 2, 'owner_user_id' => $value['obj_id']];
  296. # 合同
  297. if ($status == 1) {
  298. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  299. }
  300. # 回款
  301. if ($status == 2) {
  302. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  303. }
  304. # 计算完成情况
  305. foreach ($finishArray AS $k => $v) {
  306. if (!empty($result[$v['time']])) {
  307. $achievement = $result[$v['time']]['achievement'];
  308. $result[$v['time']]['money'] = (int)$v['money'];
  309. $result[$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  310. }
  311. }
  312. foreach ($result as &$val){
  313. $val[3]['money']=$val[0]['money']+$val[1]['money']+$val[2]['money'];
  314. $val[3]['rate']=$val[0]['rate']+$val[1]['rate']+$val[2]['rate'];
  315. $val[7]['money']=$val[4]['money']+$val[5]['money']+$val[6]['money'];
  316. $val[7]['rate']=$val[4]['rate']+$val[5]['rate']+$val[6]['rate'];
  317. $val[11]['money']=$val[7]['money']+$val[9]['money']+$val[10]['money'];
  318. $val[11]['rate']=$val[8]['rate']+$val[9]['rate']+$val[10]['rate'];
  319. $val[15]['money']=$val[12]['money']+$val[13]['money']+$val[14]['money'];
  320. $val[15]['rate']=$val[12]['rate']+$val[13]['rate']+$val[14]['rate'];
  321. $val[15]['money']=$val[12]['money']+$val[13]['money']+$val[14]['money'];
  322. $val[15]['rate']=$val[12]['rate']+$val[13]['rate']+$val[14]['rate'];
  323. $val[16]['money']=$val[3]['money']+$val[7]['money']+$val[11]['money']+$val[15]['money'];
  324. $val[16]['rate']=$val[3]['rate']+$val[7]['rate']+$val[11]['rate']+$val[15]['rate'];
  325. }
  326. $result = array_values($result);
  327. }
  328. }
  329. return array_values($result);
  330. }
  331. /**
  332. * 导出
  333. * @param $type
  334. * @param $types
  335. */
  336. public function excelExport()
  337. {
  338. $param = $this->param;
  339. $list = $this->statistics($param);
  340. if(empty($list)){
  341. return resultArray(['data'=>'数据不存在']);
  342. }
  343. $excelLogic = new ExcelLogic();
  344. $data = $excelLogic->achienementExcel($param, $list);
  345. return $data;
  346. }
  347. }