Achievement.php 23KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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. $list = $this->getAchievementStatistics($param) ?: [];
  52. //导出使用
  53. if (!empty($param['excel_type'])) {
  54. $list = $this->excelStatistics($param) ?: [];
  55. return $list;
  56. }
  57. return resultArray(['data' => $list]);
  58. }
  59. /**
  60. * 业绩目标完成情况列表
  61. *
  62. * @param $param
  63. * @return array
  64. * @throws \think\db\exception\DataNotFoundException
  65. * @throws \think\db\exception\ModelNotFoundException
  66. * @throws \think\exception\DbException
  67. */
  68. private function getAchievementStatistics($param)
  69. {
  70. # 结果数据
  71. $result = [];
  72. # 参数
  73. $status = !empty($param['status']) ? $param['status'] : 1; # 类型:1合同目标;2回款目标;
  74. $year = !empty($param['year']) ? $param['year'] : 0; # 年份
  75. $structureId = !empty($param['structure_id']) ? $param['structure_id'] : 0; # 部门
  76. $userId = !empty($param['user_id']) ? $param['user_id'] : 0; # 员工
  77. $type = !empty($param['type']) ? $param['type'] : 1; # 类型:1部门;2员工
  78. # 设置业绩目标条件
  79. $achievementWhere['year'] = $year;
  80. $achievementWhere['status'] = $status;
  81. $achievementWhere['type'] = !empty($type) && $type == 1 ? 2 : 3;
  82. if (!empty($userId)) $achievementWhere['obj_id'] = $userId;
  83. if (!empty($structureId)) $achievementWhere['obj_id'] = $structureId;
  84. # 查询业绩目标数据
  85. $achievementList = Db::name('crm_achievement')->where($achievementWhere)->select();
  86. if (empty($achievementList)) return [];
  87. # 部门
  88. if ($type == 1) {
  89. foreach ($achievementList as $key => $value) {
  90. # 组装结果数据
  91. $result[$value['obj_id']] = [
  92. 'name' => $value['name'],
  93. 'list' => [
  94. '01' => ['achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  95. '02' => ['achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  96. '03' => ['achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  97. '04' => ['achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  98. '05' => ['achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  99. '06' => ['achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  100. '07' => ['achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  101. '08' => ['achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  102. '09' => ['achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  103. '10' => ['achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  104. '11' => ['achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  105. '12' => ['achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月']
  106. ]
  107. ];
  108. # 获取部门下的员工ID
  109. $userIds = Db::name('admin_user')->where('structure_id', $value['obj_id'])->column('id');
  110. # 业绩完成字段
  111. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  112. # 业绩完成条件
  113. $finishWhere['check_status'] = 2;
  114. $finishWhere['owner_user_id'] = ['in', $userIds];
  115. # 合同
  116. if ($status == 1) {
  117. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  118. }
  119. # 回款
  120. if ($status == 2) {
  121. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  122. }
  123. # 计算完成情况
  124. foreach ($finishArray as $k => $v) {
  125. if (!empty($result[$value['obj_id']]['list'][$v['time']])) {
  126. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  127. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  128. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  129. }
  130. }
  131. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  132. }
  133. }
  134. # 员工
  135. if ($type == 2) {
  136. $userData = [];
  137. $userList = db('admin_user')->field(['id', 'realname'])->select();
  138. foreach ($userList as $key => $value) {
  139. $userData[$value['id']] = $value['realname'];
  140. }
  141. foreach ($achievementList as $key => $value) {
  142. # 组装结果数据
  143. $result[$value['obj_id']] = [
  144. 'name' => !empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],
  145. 'list' => [
  146. '01' => ['achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  147. '02' => ['achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  148. '03' => ['achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  149. '04' => ['achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  150. '05' => ['achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  151. '06' => ['achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  152. '07' => ['achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  153. '08' => ['achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  154. '09' => ['achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  155. '10' => ['achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  156. '11' => ['achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  157. '12' => ['achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月']
  158. ]
  159. ];
  160. # 业绩完成字段
  161. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  162. # 业绩完成条件
  163. $finishWhere = ['check_status' => 2, 'owner_user_id' => $value['obj_id']];
  164. # 合同
  165. if ($status == 1) {
  166. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  167. }
  168. # 回款
  169. if ($status == 2) {
  170. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  171. }
  172. # 计算完成情况
  173. foreach ($finishArray as $k => $v) {
  174. if (!empty($result[$value['obj_id']]['list'][$v['time']])) {
  175. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  176. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  177. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  178. }
  179. }
  180. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  181. }
  182. }
  183. return array_values($result);
  184. }
  185. public function excelStatistics($param)
  186. {
  187. # 结果数据
  188. $result = [];
  189. # 参数
  190. $status = !empty($param['status']) ? $param['status'] : 1; # 类型:1合同目标;2回款目标;
  191. $year = !empty($param['year']) ? $param['year'] : 0; # 年份
  192. $structureId = !empty($param['structure_id']) ? $param['structure_id'] : 0; # 部门
  193. $userId = !empty($param['user_id']) ? $param['user_id'] : 0; # 员工
  194. $type = !empty($param['type']) ? $param['type'] : 1; # 类型:1部门;2员工
  195. # 设置业绩目标条件
  196. $achievementWhere['year'] = $year;
  197. $achievementWhere['status'] = $status;
  198. $achievementWhere['type'] = !empty($type) && $type == 1 ? 2 : 3;
  199. if (!empty($userId)) $achievementWhere['obj_id'] = $userId;
  200. if (!empty($structureId)) $achievementWhere['obj_id'] = $structureId;
  201. # 查询业绩目标数据
  202. $achievementList = Db::name('crm_achievement')->where($achievementWhere)->select();
  203. if (empty($achievementList)) return [];
  204. # 部门
  205. if ($type == 1) {
  206. foreach ($achievementList as $key => $value) {
  207. # 组装结果数据
  208. $result[$value['obj_id']] = [
  209. 'list' => [
  210. '01' => ['name' => $value['name'] ,'achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  211. '02' => ['name' => $value['name'] ,'achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  212. '03' => ['name' => $value['name'] ,'achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  213. '04' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第一季度'],
  214. '05' => ['name' => $value['name'] ,'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  215. '06' => ['name' => $value['name'] ,'achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  216. '07' => ['name' => $value['name'] ,'achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  217. '08' => ['name' => '', 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '第二季度'],
  218. '09' => ['name' => $value['name'] ,'achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  219. '10' => ['name' => $value['name'] ,'achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  220. '11' => ['name' => $value['name'] ,'achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  221. '12' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第三季度'],
  222. '13' => ['name' => $value['name'] ,'achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  223. '14' => ['name' => $value['name'] ,'achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  224. '15' => ['name' => $value['name'] ,'achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月'],
  225. '16' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第四季度'],
  226. '17' => ['name' => '', 'achievement' => (int)$value['yeartarget'], 'money' => 0, 'rate' => 0, 'month' => '全年'],
  227. ]
  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[$value['obj_id']]['list'][$v['time']])) {
  247. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  248. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  249. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  250. }
  251. }
  252. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  253. $item[]=$result[$value['obj_id']]['list'];
  254. }
  255. }
  256. # 员工
  257. if ($type == 2) {
  258. $userData = [];
  259. $userList = db('admin_user')->field(['id', 'realname'])->select();
  260. foreach ($userList as $key => $value) {
  261. $userData[$value['id']] = $value['realname'];
  262. }
  263. foreach ($achievementList as $key => $value) {
  264. # 组装结果数据
  265. $result[$value['obj_id']] = [
  266. 'list' => [
  267. '01' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['january'], 'money' => 0, 'rate' => 0, 'month' => '一月'],
  268. '02' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['february'], 'money' => 0, 'rate' => 0, 'month' => '二月'],
  269. '03' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['march'], 'money' => 0, 'rate' => 0, 'month' => '三月'],
  270. '04' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第一季度'],
  271. '05' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '四月'],
  272. '06' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['may'], 'money' => 0, 'rate' => 0, 'month' => '五月'],
  273. '07' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['june'], 'money' => 0, 'rate' => 0, 'month' => '六月'],
  274. '08' => ['name' => '', 'achievement' => (int)$value['april'], 'money' => 0, 'rate' => 0, 'month' => '第二季度'],
  275. '09' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['july'], 'money' => 0, 'rate' => 0, 'month' => '七月'],
  276. '10' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['august'], 'money' => 0, 'rate' => 0, 'month' => '八月'],
  277. '11' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['september'], 'money' => 0, 'rate' => 0, 'month' => '九月'],
  278. '12' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第三季度'],
  279. '13' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['october'], 'money' => 0, 'rate' => 0, 'month' => '十月'],
  280. '14' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['november'], 'money' => 0, 'rate' => 0, 'month' => '十一月'],
  281. '15' => ['name' =>!empty($value['name']) ? $value['name'] : $userData[$value['obj_id']],'achievement' => (int)$value['december'], 'money' => 0, 'rate' => 0, 'month' => '十二月'],
  282. '16' => ['name' => '', 'achievement' => 0, 'money' => 0, 'rate' => 0, 'month' => '第四季度'],
  283. '17' => ['name' => '', 'achievement' => (int)$value['yeartarget'], 'money' => 0, 'rate' => 0, 'month' => '全年'],
  284. ]
  285. ];
  286. # 业绩完成字段
  287. $finishField = ["DATE_FORMAT(FROM_UNIXTIME(`create_time`,'%Y-%m-%d'),'%m') AS time", 'sum(money) AS money'];
  288. # 业绩完成条件
  289. $finishWhere = ['check_status' => 2, 'owner_user_id' => $value['obj_id']];
  290. # 合同
  291. if ($status == 1) {
  292. $finishArray = Db::name('crm_contract')->field($finishField)->where($finishWhere)->group('time')->select();
  293. }
  294. # 回款
  295. if ($status == 2) {
  296. $finishArray = Db::name('crm_receivables')->field($finishField)->where($finishWhere)->group('time')->select();
  297. }
  298. # 计算完成情况
  299. foreach ($finishArray as $k => $v) {
  300. if (!empty($result[$value['obj_id']]['list'][$v['time']])) {
  301. $achievement = $result[$value['obj_id']]['list'][$v['time']]['achievement'];
  302. $result[$value['obj_id']]['list'][$v['time']]['money'] = (int)$v['money'];
  303. $result[$value['obj_id']]['list'][$v['time']]['rate'] = (int)(($v['money'] / $achievement) * 100);
  304. }
  305. }
  306. $result[$value['obj_id']]['list'] = array_values($result[$value['obj_id']]['list']);
  307. $item[]=$result[$value['obj_id']]['list'];
  308. }
  309. }
  310. foreach ($item as &$val){
  311. $val[3]['money']=$val[0]['money']+$val[1]['money']+$val[2]['money'];
  312. $val[3]['rate']=$val[0]['rate']+$val[1]['rate']+$val[2]['rate'];
  313. $val[3]['achievement']=$val[0]['achievement']+$val[1]['achievement']+$val[2]['achievement'];
  314. $val[7]['money']=$val[4]['money']+$val[5]['money']+$val[6]['money'];
  315. $val[7]['rate']=$val[4]['rate']+$val[5]['rate']+$val[6]['rate'];
  316. $val[7]['achievement']=$val[4]['achievement']+$val[5]['achievement']+$val[6]['achievement'];
  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[11]['achievement']=$val[8]['achievement']+$val[9]['achievement']+$val[10]['achievement'];
  320. $val[15]['money']=$val[12]['money']+$val[13]['money']+$val[14]['money'];
  321. $val[15]['rate']=$val[12]['rate']+$val[13]['rate']+$val[14]['rate'];
  322. $val[15]['achievement']=$val[12]['achievement']+$val[13]['achievement']+$val[14]['achievement'];
  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. return $item;
  327. }
  328. /**
  329. * 导出
  330. * @param $type
  331. * @param $types
  332. */
  333. public function excelExport()
  334. {
  335. $param = $this->param;
  336. $list = $this->statistics($param);
  337. if (empty($list)) {
  338. return resultArray(['data' => '数据不存在']);
  339. }
  340. $excelLogic = new ExcelLogic();
  341. $data = $excelLogic->achienementExcel($list);
  342. return $data;
  343. }
  344. }