WasteStatistics.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use DateTime;
  5. use \think\db;
  6. /**
  7. * 决策支持->大废品统计
  8. */
  9. class WasteStatistics extends Api
  10. {
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**
  14. * 左侧菜单栏
  15. * @return void
  16. * @throws \think\exception\DbException
  17. * @throws db\exception\DataNotFoundException
  18. * @throws db\exception\ModelNotFoundException
  19. */
  20. public function Getlist()
  21. {
  22. if ($this->request->isGet() === false){
  23. $this->error('请求错误');
  24. }
  25. $list = \db('db_大废品')
  26. ->field('DATE_FORMAT(sys_rq, "%Y-%m") AS month')
  27. ->group('month')
  28. ->order('month desc')
  29. ->select();
  30. $data = [];
  31. foreach ($list as $key => $value){
  32. $week = \db('db_大废品')
  33. ->field('WEEK(sys_rq,1) as week')
  34. ->where('sys_rq','like',$value['month'].'%')
  35. ->group('week')
  36. ->order('week desc')
  37. ->select();
  38. foreach ($week as $k=>$v){
  39. $week[$k]['周数'] = '第'.$v['week'].'周';
  40. }
  41. $data[str_replace('-', '', $value['month'])] = $week;
  42. }
  43. $this->success('成功',$data);
  44. }
  45. /**
  46. * 右侧数据
  47. * @return void
  48. * @throws \think\exception\DbException
  49. * @throws db\exception\DataNotFoundException
  50. * @throws db\exception\ModelNotFoundException
  51. */
  52. public function ReghtList()
  53. {
  54. if ($this->request->isGet() === false) {
  55. $this->error('请求错误');
  56. }
  57. $param = $this->request->param();
  58. if (isset($param['mouth']) === false) {
  59. $this->error('参数错误');
  60. }
  61. // 判断查询时间范围
  62. $dateTime = new DateTime();
  63. $date = $dateTime->createFromFormat('Ym', $param['mouth']);
  64. $mouth = $date->format('Y-m');
  65. $year = $date->format('Y');
  66. $where = [
  67. 'a.sczl_rq' => ['like', $mouth . '%']
  68. ];
  69. if (isset($param['week']) && !empty($param['week'])) {
  70. $week = $dateTime->setISODate($year, $param['week']);
  71. $startTime = $week->format('Y-m-d 00:00:00');
  72. $weekLast = $week->modify('+7 days');
  73. $endTime = $weekLast->format('Y-m-d 00:00:00');
  74. $where['a.sczl_rq'] = ['between', [$startTime, $endTime]];
  75. }
  76. $query = \db('db_大废品')
  77. ->alias('a')
  78. ->field('a.sczl_cl,WEEK(a.sys_rq,1) as week,a.sczl_rq,
  79. a.JL_bh1,a.JL_bh2,a.JL_bh3,a.JL_bh4,a.JL_bh5,a.JL_bh6,a.JL_bh7,a.JL_bh8,a.JL_bh9,a.JL_bh10,
  80. a.JL_Je1,JL_Je2,JL_Je3,JL_Je4,JL_Je5,JL_Je6,JL_Je7,JL_Je8,JL_Je9,JL_Je10,
  81. a.sczl_bh1,a.sczl_bh2,a.sczl_bh3,a.sczl_bh4,a.sczl_bh5,a.sczl_bh6,a.sczl_bh7,a.sczl_bh8,a.sczl_bh9,a.sczl_bh10,
  82. a.sczl_je1,a.sczl_je2,a.sczl_je3,a.sczl_je4,a.sczl_je5,a.sczl_je6,a.sczl_je7,a.sczl_je8,a.sczl_je9,a.sczl_je10,
  83. b1.员工姓名 as 奖励人员1,b2.员工姓名 as 奖励人员2,b3.员工姓名 as 奖励人员3,b4.员工姓名 as 奖励人员4,b5.员工姓名 as 奖励人员5,
  84. b6.员工姓名 as 奖励人员6,b7.员工姓名 as 奖励人员7,b8.员工姓名 as 奖励人员8,b9.员工姓名 as 奖励人员9,b10.员工姓名 as 奖励人员10,
  85. b1.所在部门 as 奖励部门1,b2.所在部门 as 奖励部门2,b3.所在部门 as 奖励部门3,b4.所在部门 as 奖励部门4,b5.所在部门 as 奖励部门5,
  86. b6.所在部门 as 奖励部门6,b7.所在部门 as 奖励部门7,b8.所在部门 as 奖励部门8,b9.所在部门 as 奖励部门9,b10.所在部门 as 奖励部门10,
  87. c1.员工姓名 as 惩罚人员1,c2.员工姓名 as 惩罚人员2,c3.员工姓名 as 惩罚人员3,c4.员工姓名 as 惩罚人员4,c5.员工姓名 as 惩罚人员5,
  88. c6.员工姓名 as 惩罚人员6,c7.员工姓名 as 惩罚人员7,c8.员工姓名 as 惩罚人员8,c9.员工姓名 as 惩罚人员9,c10.员工姓名 as 惩罚人员10,
  89. c1.所在部门 as 惩罚部门1,c2.所在部门 as 惩罚部门2,c3.所在部门 as 惩罚部门3,c4.所在部门 as 惩罚部门4,c5.所在部门 as 惩罚部门5,
  90. c6.所在部门 as 惩罚部门6,c7.所在部门 as 惩罚部门7,c8.所在部门 as 惩罚部门8,c9.所在部门 as 惩罚部门9,c10.所在部门 as 惩罚部门10
  91. ');
  92. for ($i = 1; $i <= 10; $i++) {
  93. $jl_bh = 'a.JL_bh' . $i;
  94. $jl_alias = 'b' . $i;
  95. $query->join("人事_基本资料 $jl_alias", "$jl_bh = {$jl_alias}.员工编号 AND {$jl_bh} IS NOT NULL", 'LEFT');
  96. $sczl_bh = 'a.sczl_bh' . $i;
  97. $sczl_alias = 'c' . $i;
  98. $query->join("人事_基本资料 $sczl_alias", "$sczl_bh = {$sczl_alias}.员工编号 AND {$sczl_bh} IS NOT NULL", 'LEFT');
  99. }
  100. $list = $query->where($where)->select();
  101. // 初始化惩罚数据存储结构
  102. $penaltyData = [];
  103. $penaltyMonthlyTotal = [];
  104. foreach ($list as $record) {
  105. $date = $record['sczl_rq'];
  106. $week = $record['week'];
  107. $monthKey = date('Y-m', strtotime($date));
  108. /*
  109. * 惩罚人员数据
  110. */
  111. for ($i = 1; $i <= 10; $i++) {
  112. $employeeId = $record["sczl_bh{$i}"];
  113. if (empty($employeeId)) continue;
  114. $employeeName = $record["惩罚人员{$i}"];
  115. $department = $record["惩罚部门{$i}"];
  116. $penaltyAmount = $record["sczl_je{$i}"] * $record['sczl_cl'];
  117. // 判断是否是机长(sczl_bh1)
  118. $isCaptain = ($i == 1);
  119. // 初始化每日数据(不立即应用封顶)
  120. if (!isset($penaltyData[$date][$employeeId])) {
  121. $penaltyData[$date][$employeeId] = [
  122. '所在部门' => $department,
  123. '员工编号' => $employeeId,
  124. '员工姓名' => $employeeName,
  125. '发现次数' => 0,
  126. '发现张数' => 0,
  127. '奖励金额' => 0,
  128. '遗漏次数' => 0,
  129. '遗漏张数' => 0,
  130. '处罚金额' => 0,
  131. '年月' => date('Y-m', strtotime($date)),
  132. '周数' => $week,
  133. 'isCaptain' => $isCaptain // 标记是否是机长
  134. ];
  135. }
  136. // 累加数据(先不封顶)
  137. $penaltyData[$date][$employeeId]['发现次数'] += 1;
  138. $penaltyData[$date][$employeeId]['发现张数'] += $record['sczl_cl'];
  139. $penaltyData[$date][$employeeId]['处罚金额'] += $penaltyAmount;
  140. }
  141. }
  142. // 按天进行封顶处理
  143. foreach ($penaltyData as $date => &$employees) {
  144. foreach ($employees as &$employee) {
  145. // 应用封顶
  146. if ($employee['isCaptain']) {
  147. $employee['处罚金额'] = min($employee['处罚金额'], 1000); // 机长封顶1000
  148. } else {
  149. $employee['处罚金额'] = min($employee['处罚金额'], 500); // 其他人封顶500
  150. }
  151. // 初始化月度数据
  152. $monthEmployeeKey = $employee['年月'] . "_" . $employee['员工编号'];
  153. if (!isset($penaltyMonthlyTotal[$monthEmployeeKey])) {
  154. $penaltyMonthlyTotal[$monthEmployeeKey] = [
  155. '所在部门' => $employee['所在部门'],
  156. '员工编号' => $employee['员工编号'],
  157. '员工姓名' => $employee['员工姓名'],
  158. '发现次数' => 0,
  159. '发现张数' => 0,
  160. '奖励金额' => 0,
  161. '遗漏次数' => 0,
  162. '遗漏张数' => 0,
  163. '处罚金额' => 0,
  164. '年月' => $employee['年月'],
  165. '周数' => $employee['周数']
  166. ];
  167. }
  168. // 累加月度数据
  169. $penaltyMonthlyTotal[$monthEmployeeKey]['发现次数'] += $employee['发现次数'];
  170. $penaltyMonthlyTotal[$monthEmployeeKey]['发现张数'] += $employee['发现张数'];
  171. $penaltyMonthlyTotal[$monthEmployeeKey]['处罚金额'] += $employee['处罚金额'];
  172. }
  173. }
  174. // 处理惩罚数据的最终格式
  175. $finalPenaltyData = [];
  176. foreach ($penaltyMonthlyTotal as $monthKey => $details) {
  177. $finalPenaltyData[] = $details;
  178. }
  179. /*
  180. * 处理奖励数据
  181. */
  182. $rewardData = [];
  183. $rewardMonthlyTotal = [];
  184. foreach ($list as $key => $value) {
  185. for ($i = 1; $i <= 10; $i++) {
  186. if (empty($value["JL_bh{$i}"])) {
  187. continue;
  188. }
  189. $employeeId = $value["JL_bh{$i}"];
  190. $employeeName = $value["奖励人员{$i}"];
  191. $department = $value["奖励部门{$i}"];
  192. $totalJLAmt = 0;
  193. for ($j = 1; $j <= 10; $j++) {
  194. $jlKey = "JL_Je{$j}";
  195. if (!empty($value[$jlKey]) && $value[$jlKey] > 0) {
  196. $totalJLAmt += $value[$jlKey] * $value['sczl_cl'];
  197. }
  198. }
  199. $totalJLAmt = min($totalJLAmt, 100);
  200. $date = $value['sczl_rq'];
  201. $week = $value['week'];
  202. $foundSheets = $value['sczl_cl'];
  203. $monthKey = date('Y-m', strtotime($date)) . "_{$employeeId}";
  204. if (!isset($rewardData[$date][$employeeId])) {
  205. $rewardData[$date][$employeeId] = [
  206. '所在部门' => $department,
  207. '员工编号' => $employeeId,
  208. '员工姓名' => $employeeName,
  209. '发现次数' => 0,
  210. '发现张数' => 0,
  211. '奖励金额' => 0,
  212. '遗漏次数' => 0,
  213. '遗漏张数' => 0,
  214. '处罚金额' => 0,
  215. '年月' => date('Y-m', strtotime($date)),
  216. '周数' => $week
  217. ];
  218. }
  219. $rewardData[$date][$employeeId]['发现次数'] += 1;
  220. $rewardData[$date][$employeeId]['发现张数'] += $foundSheets;
  221. $rewardData[$date][$employeeId]['奖励金额'] += $totalJLAmt;
  222. if (!isset($rewardMonthlyTotal[$monthKey])) {
  223. $rewardMonthlyTotal[$monthKey] = [
  224. '所在部门' => $department,
  225. '员工编号' => $employeeId,
  226. '员工姓名' => $employeeName,
  227. '发现次数' => 0,
  228. '发现张数' => 0,
  229. '奖励金额' => 0,
  230. '遗漏次数' => 0,
  231. '遗漏张数' => 0,
  232. '处罚金额' => 0,
  233. '年月' => date('Y-m', strtotime($date)),
  234. '周数' => $week
  235. ];
  236. }
  237. }
  238. }
  239. // 按天封顶,每日不超过200
  240. $rewardDailyCapped = [];
  241. foreach ($rewardData as $date => $employees) {
  242. foreach ($employees as $employeeId => $details) {
  243. $cappedAmount = min($details['奖励金额'], 200);
  244. $details['奖励金额'] = $cappedAmount;
  245. $rewardDailyCapped[$date][$employeeId] = $details;
  246. $monthKey = date('Y-m', strtotime($date)) . "_{$employeeId}";
  247. $rewardMonthlyTotal[$monthKey]['发现次数'] += $details['发现次数'];
  248. $rewardMonthlyTotal[$monthKey]['发现张数'] += $details['发现张数'];
  249. $rewardMonthlyTotal[$monthKey]['奖励金额'] += $cappedAmount;
  250. }
  251. }
  252. // 按月封顶,每月不超过1500
  253. $finalRewardData = [];
  254. foreach ($rewardMonthlyTotal as $monthKey => $details) {
  255. $details['奖励金额'] = min($details['奖励金额'], 1500);
  256. $finalRewardData[] = $details;
  257. }
  258. // 处理惩罚数据的最终格式
  259. $finalPenaltyData = [];
  260. foreach ($penaltyMonthlyTotal as $monthKey => $details) {
  261. $finalPenaltyData[] = $details;
  262. }
  263. /*
  264. * 合并奖励和惩罚数据
  265. */
  266. $combinedData = [];
  267. // 将奖励数据加入合并数组
  268. foreach ($finalRewardData as $reward) {
  269. $key = $reward['员工编号'];
  270. if (!isset($combinedData[$key])) {
  271. $combinedData[$key] = $reward;
  272. $combinedData[$key]['遗漏次数'] = 0;
  273. $combinedData[$key]['遗漏张数'] = 0;
  274. $combinedData[$key]['处罚金额'] = 0;
  275. } else {
  276. $combinedData[$key]['发现次数'] += $reward['发现次数'];
  277. $combinedData[$key]['发现张数'] += $reward['发现张数'];
  278. $combinedData[$key]['奖励金额'] += $reward['奖励金额'];
  279. }
  280. }
  281. // 将惩罚数据加入合并数组
  282. foreach ($finalPenaltyData as $penalty) {
  283. $key = $penalty['员工编号'];
  284. if (!isset($combinedData[$key])) {
  285. $combinedData[$key] = $penalty;
  286. $combinedData[$key]['发现次数'] = 0;
  287. $combinedData[$key]['发现张数'] = 0;
  288. $combinedData[$key]['奖励金额'] = 0;
  289. } else {
  290. $combinedData[$key]['遗漏次数'] += $penalty['遗漏次数'];
  291. $combinedData[$key]['遗漏张数'] += $penalty['遗漏张数'];
  292. $combinedData[$key]['处罚金额'] += $penalty['处罚金额'];
  293. }
  294. }
  295. // 重新索引合并后的数组
  296. $result = array_values($combinedData);
  297. $this->success('成功', $result);
  298. }
  299. }