| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351 |
- <?php
- namespace app\api\controller;
- use app\common\controller\Api;
- use DateTime;
- use \think\db;
- /**
- * 决策支持->大废品统计
- */
- 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);
- }
- }
|