大废品统计 */ class WasteStatistics extends Api { protected $noNeedLogin = ['*']; protected $noNeedRight = ['*']; /** * 左侧菜单栏 * @return void * @throws \think\exception\DbException * @throws db\exception\DataNotFoundException * @throws db\exception\ModelNotFoundException */ public function Getlist() { if ($this->request->isGet() === false){ $this->error('请求错误'); } $list = \db('db_大废品') ->field('DATE_FORMAT(sys_rq, "%Y-%m") AS month') ->group('month') ->order('month desc') ->select(); $data = []; foreach ($list as $key => $value){ $week = \db('db_大废品') ->field('WEEK(sys_rq,1) as week') ->where('sys_rq','like',$value['month'].'%') ->group('week') ->order('week desc') ->select(); foreach ($week as $k=>$v){ $week[$k]['周数'] = '第'.$v['week'].'周'; } $data[str_replace('-', '', $value['month'])] = $week; } $this->success('成功',$data); } /** * 右侧数据 * @return void * @throws \think\exception\DbException * @throws db\exception\DataNotFoundException * @throws db\exception\ModelNotFoundException */ public function ReghtList() { if ($this->request->isGet() === false) { $this->error('请求错误'); } $param = $this->request->param(); if (isset($param['mouth']) === false) { $this->error('参数错误'); } // 判断查询时间范围 $dateTime = new DateTime(); $date = $dateTime->createFromFormat('Ym', $param['mouth']); $mouth = $date->format('Y-m'); $year = $date->format('Y'); $where = [ 'a.sczl_rq' => ['like', $mouth . '%'] ]; if (isset($param['week']) && !empty($param['week'])) { $week = $dateTime->setISODate($year, $param['week']); $startTime = $week->format('Y-m-d 00:00:00'); $weekLast = $week->modify('+7 days'); $endTime = $weekLast->format('Y-m-d 00:00:00'); $where['a.sczl_rq'] = ['between', [$startTime, $endTime]]; } $query = \db('db_大废品') ->alias('a') ->field('a.sczl_cl,WEEK(a.sys_rq,1) as week,a.sczl_rq, 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, a.JL_Je1,JL_Je2,JL_Je3,JL_Je4,JL_Je5,JL_Je6,JL_Je7,JL_Je8,JL_Je9,JL_Je10, 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, 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, b1.员工姓名 as 奖励人员1,b2.员工姓名 as 奖励人员2,b3.员工姓名 as 奖励人员3,b4.员工姓名 as 奖励人员4,b5.员工姓名 as 奖励人员5, b6.员工姓名 as 奖励人员6,b7.员工姓名 as 奖励人员7,b8.员工姓名 as 奖励人员8,b9.员工姓名 as 奖励人员9,b10.员工姓名 as 奖励人员10, b1.所在部门 as 奖励部门1,b2.所在部门 as 奖励部门2,b3.所在部门 as 奖励部门3,b4.所在部门 as 奖励部门4,b5.所在部门 as 奖励部门5, b6.所在部门 as 奖励部门6,b7.所在部门 as 奖励部门7,b8.所在部门 as 奖励部门8,b9.所在部门 as 奖励部门9,b10.所在部门 as 奖励部门10, c1.员工姓名 as 惩罚人员1,c2.员工姓名 as 惩罚人员2,c3.员工姓名 as 惩罚人员3,c4.员工姓名 as 惩罚人员4,c5.员工姓名 as 惩罚人员5, c6.员工姓名 as 惩罚人员6,c7.员工姓名 as 惩罚人员7,c8.员工姓名 as 惩罚人员8,c9.员工姓名 as 惩罚人员9,c10.员工姓名 as 惩罚人员10, c1.所在部门 as 惩罚部门1,c2.所在部门 as 惩罚部门2,c3.所在部门 as 惩罚部门3,c4.所在部门 as 惩罚部门4,c5.所在部门 as 惩罚部门5, c6.所在部门 as 惩罚部门6,c7.所在部门 as 惩罚部门7,c8.所在部门 as 惩罚部门8,c9.所在部门 as 惩罚部门9,c10.所在部门 as 惩罚部门10 '); for ($i = 1; $i <= 10; $i++) { $jl_bh = 'a.JL_bh' . $i; $jl_alias = 'b' . $i; $query->join("人事_基本资料 $jl_alias", "$jl_bh = {$jl_alias}.员工编号 AND {$jl_bh} IS NOT NULL", 'LEFT'); $sczl_bh = 'a.sczl_bh' . $i; $sczl_alias = 'c' . $i; $query->join("人事_基本资料 $sczl_alias", "$sczl_bh = {$sczl_alias}.员工编号 AND {$sczl_bh} IS NOT NULL", 'LEFT'); } $list = $query->where($where)->select(); // 初始化惩罚数据存储结构 $penaltyData = []; $penaltyMonthlyTotal = []; foreach ($list as $record) { $date = $record['sczl_rq']; $week = $record['week']; $monthKey = date('Y-m', strtotime($date)); /* * 惩罚人员数据 */ for ($i = 1; $i <= 10; $i++) { $employeeId = $record["sczl_bh{$i}"]; if (empty($employeeId)) continue; $employeeName = $record["惩罚人员{$i}"]; $department = $record["惩罚部门{$i}"]; $penaltyAmount = $record["sczl_je{$i}"] * $record['sczl_cl']; // 判断是否是机长(sczl_bh1) $isCaptain = ($i == 1); // 初始化每日数据(不立即应用封顶) if (!isset($penaltyData[$date][$employeeId])) { $penaltyData[$date][$employeeId] = [ '所在部门' => $department, '员工编号' => $employeeId, '员工姓名' => $employeeName, '发现次数' => 0, '发现张数' => 0, '奖励金额' => 0, '遗漏次数' => 0, '遗漏张数' => 0, '处罚金额' => 0, '年月' => date('Y-m', strtotime($date)), '周数' => $week, 'isCaptain' => $isCaptain // 标记是否是机长 ]; } // 累加数据(先不封顶) $penaltyData[$date][$employeeId]['发现次数'] += 1; $penaltyData[$date][$employeeId]['发现张数'] += $record['sczl_cl']; $penaltyData[$date][$employeeId]['处罚金额'] += $penaltyAmount; } } // 按天进行封顶处理 foreach ($penaltyData as $date => &$employees) { foreach ($employees as &$employee) { // 应用封顶 if ($employee['isCaptain']) { $employee['处罚金额'] = min($employee['处罚金额'], 1000); // 机长封顶1000 } else { $employee['处罚金额'] = min($employee['处罚金额'], 500); // 其他人封顶500 } // 初始化月度数据 $monthEmployeeKey = $employee['年月'] . "_" . $employee['员工编号']; if (!isset($penaltyMonthlyTotal[$monthEmployeeKey])) { $penaltyMonthlyTotal[$monthEmployeeKey] = [ '所在部门' => $employee['所在部门'], '员工编号' => $employee['员工编号'], '员工姓名' => $employee['员工姓名'], '发现次数' => 0, '发现张数' => 0, '奖励金额' => 0, '遗漏次数' => 0, '遗漏张数' => 0, '处罚金额' => 0, '年月' => $employee['年月'], '周数' => $employee['周数'] ]; } // 累加月度数据 $penaltyMonthlyTotal[$monthEmployeeKey]['发现次数'] += $employee['发现次数']; $penaltyMonthlyTotal[$monthEmployeeKey]['发现张数'] += $employee['发现张数']; $penaltyMonthlyTotal[$monthEmployeeKey]['处罚金额'] += $employee['处罚金额']; } } // 处理惩罚数据的最终格式 $finalPenaltyData = []; foreach ($penaltyMonthlyTotal as $monthKey => $details) { $finalPenaltyData[] = $details; } /* * 处理奖励数据 */ $rewardData = []; $rewardMonthlyTotal = []; foreach ($list as $key => $value) { // 1. 先收集当天所有有奖励的员工及其原始应得金额 $dailyEmployees = []; $dailyTotal = 0; for ($i = 1; $i <= 10; $i++) { if (empty($value["JL_bh{$i}"])) { continue; } // 计算该员工原始应得金额 $amount = 0; if (!empty($value["JL_Je{$i}"]) && $value["JL_Je{$i}"] > 0) { $amount = $value["JL_Je{$i}"] * $value['sczl_cl']; } $dailyEmployees[] = [ 'id' => $value["JL_bh{$i}"], 'name' => $value["奖励人员{$i}"], 'dept' => $value["奖励部门{$i}"], 'original_amount' => $amount ]; $dailyTotal += $amount; } // 2. 判断是否需要重新分配(总额超过200) $needsRedistribution = ($dailyTotal > 200); $dailyCap = 200; // 3. 处理每个员工的实际奖励金额 foreach ($dailyEmployees as $emp) { $finalAmount = $needsRedistribution ? ($dailyCap / count($dailyEmployees)) : $emp['original_amount']; $date = $value['sczl_rq']; $monthKey = date('Y-m', strtotime($date)) . "_" . $emp['id']; $foundSheets = $value['sczl_cl']; if (!isset($rewardData[$date][$emp['id']])) { $rewardData[$date][$emp['id']] = [ '所在部门' => $emp['dept'], '员工编号' => $emp['id'], '员工姓名' => $emp['name'], '发现次数' => 0, '发现张数' => 0, '奖励金额' => 0, '遗漏次数' => 0, '遗漏张数' => 0, '处罚金额' => 0, '年月' => date('Y-m', strtotime($date)), '周数' => $value['week'] ]; } $rewardData[$date][$emp['id']]['发现次数'] += 1; $rewardData[$date][$emp['id']]['发现张数'] += $foundSheets; $rewardData[$date][$emp['id']]['奖励金额'] += $finalAmount; // 初始化月汇总数据 if (!isset($rewardMonthlyTotal[$monthKey])) { $rewardMonthlyTotal[$monthKey] = [ '所在部门' => $emp['dept'], '员工编号' => $emp['id'], '员工姓名' => $emp['name'], '发现次数' => 0, '发现张数' => 0, '奖励金额' => 0, '遗漏次数' => 0, '遗漏张数' => 0, '处罚金额' => 0, '年月' => date('Y-m', strtotime($date)), '周数' => $value['week'] ]; } } } // 按天封顶,每日不超过200 $rewardDailyCapped = []; foreach ($rewardData as $date => $employees) { foreach ($employees as $employeeId => $details) { $cappedAmount = min($details['奖励金额'], 200); $details['奖励金额'] = $cappedAmount; $rewardDailyCapped[$date][$employeeId] = $details; $monthKey = date('Y-m', strtotime($date)) . "_{$employeeId}"; $rewardMonthlyTotal[$monthKey]['发现次数'] += $details['发现次数']; $rewardMonthlyTotal[$monthKey]['发现张数'] += $details['发现张数']; $rewardMonthlyTotal[$monthKey]['奖励金额'] += $cappedAmount; } } // 按月封顶,每月不超过1500 $finalRewardData = []; foreach ($rewardMonthlyTotal as $monthKey => $details) { $details['奖励金额'] = min($details['奖励金额'], 1500); $finalRewardData[] = $details; } // 处理惩罚数据的最终格式 $finalPenaltyData = []; foreach ($penaltyMonthlyTotal as $monthKey => $details) { $finalPenaltyData[] = $details; } /* * 合并奖励和惩罚数据 */ $combinedData = []; // 将奖励数据加入合并数组 foreach ($finalRewardData as $reward) { $key = $reward['员工编号']; if (!isset($combinedData[$key])) { $combinedData[$key] = $reward; $combinedData[$key]['遗漏次数'] = 0; $combinedData[$key]['遗漏张数'] = 0; $combinedData[$key]['处罚金额'] = 0; } else { $combinedData[$key]['发现次数'] += $reward['发现次数']; $combinedData[$key]['发现张数'] += $reward['发现张数']; $combinedData[$key]['奖励金额'] += $reward['奖励金额']; } } // 将惩罚数据加入合并数组 foreach ($finalPenaltyData as $penalty) { $key = $penalty['员工编号']; if (!isset($combinedData[$key])) { $combinedData[$key] = $penalty; $combinedData[$key]['发现次数'] = 0; $combinedData[$key]['发现张数'] = 0; $combinedData[$key]['奖励金额'] = 0; } else { $combinedData[$key]['遗漏次数'] += $penalty['遗漏次数']; $combinedData[$key]['遗漏张数'] += $penalty['遗漏张数']; $combinedData[$key]['处罚金额'] += $penalty['处罚金额']; } } // 重新索引合并后的数组 $result = array_values($combinedData); foreach ($result as &$item) { $item['奖励金额'] = round($item['奖励金额'], 2); $item['处罚金额'] = round($item['处罚金额'], 2); } $this->success('成功', $result); } }