request->isGet()){ $this->error('请求方式错误'); } $res=db('糊盒工资汇总') ->field('DATE_FORMAT(`sczl_rq`, "%Y%m") as sys_ny,bh') ->group('DATE_FORMAT(`sczl_rq`, "%Y%m"),bh') ->whereTime('sczl_rq', '>=', strtotime('-14 months')) ->where('bh','<>','000000') ->order('sczl_rq desc') ->select(); foreach($res as $v){ $arr[$v['sys_ny'].'('][]=$v['bh']; } $rs = db('人事_基本资料')->column('员工编号,所在部门'); foreach($arr as $k=>$v){ foreach($v as $value){ if(array_key_exists($value,$rs)){ $data[$k.count($v).'人)'][rtrim($rs[$value])][]=rtrim($rs[$value]); } } $j=0; foreach($data[$k.count($v).'人)'] as $keys=>$values){ $data[$k.count($v).'人)']['bm'][$j]=$keys; $data[$k.count($v).'人)'][$keys]=count($values); $j++; } usort($data[$k.count($v).'人)']['bm'], function($a, $b) { $order = array( '胶印车间', '凹印车间', '丝印车间', '模切车间', '检验车间', '精品试验车间', '品保部', '人力资源部', '生产部', '营销部', '数字化车间', '精品车间' ); $a_index = array_search($a, $order); $b_index = array_search($b, $order); return $a_index - $b_index; }); foreach($data[$k.count($v).'人)']['bm'] as &$va){ $va=$va.'('.$data[$k.count($v).'人)'][$va].'人)'; } $data[$k.count($v).'人)']=$data[$k.count($v).'人)']['bm']; } $i=0; foreach($data as $k=>$v){ $datas[$i]['label']=$k; $gdbh=substr($k,0,strpos($k,'(')); foreach($v as $key=>$value){ $datas[$i]['children'][$key]['label']=$value; $datas[$i]['children'][$key]['gdbh']=$gdbh; } $i++; } $this->success('成功',$datas); } /** * 上方列表 * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getList() { if(!$this->request->isGet()){ $this->error('请求方式错误'); } $req = $this->request->param(); if (isset($req['search'])){ $where = [ 'sczl_rq' => ['like',$req['date'].'%'], 'bh|name' => ['like',$req['search'].'%'], ]; $res = db('糊盒工资汇总') ->where($where) ->group('bh, sczl_rq') ->field('bh as 员工编号, DATE_FORMAT(sczl_rq, "%Y.%m.%d") as 日期, name as 姓名, sum(salary) as 计件工资') ->select(); }else{ $where = [ 'a.sczl_rq' => ['like',$req['date'].'%'], 'b.所在部门' => ['like', $req['department'] . '%'] ]; $res = db('糊盒工资汇总') ->alias('a') ->join('人事_基本资料 b', 'b.员工编号 = a.bh') ->where($where) ->group('a.bh, a.sczl_rq') ->field('a.bh as 员工编号, DATE_FORMAT(a.sczl_rq, "%Y.%m.%d") as 日期, a.name as 姓名, sum(a.salary) as 计件工资') ->select(); } $processedData = []; foreach ($res as $item) { // 用「员工编号」作为唯一分组键(编号唯一,比编号+姓名更简洁) $empNo = $item['员工编号']; // 转换工资为浮点型(避免字符串拼接导致计算错误) $salary = (float)$item['计件工资']; if (!isset($processedData[$empNo])) { // 初始化该员工的分组数据 $processedData[$empNo] = [ '员工编号' => $empNo, '姓名' => $item['姓名'], '月工资总和' => 0.00, // 初始化为浮点型,保证精度 '每日明细' => [] // 存储按时间排序的每日工资 ]; } // 累加月工资总和 $processedData[$empNo]['月工资总和'] += $salary; $processedData[$empNo]['月工资总和'] = number_format($processedData[$empNo]['月工资总和'],2); // 将当前日期的工资存入明细(保留原始字段) $processedData[$empNo]['每日明细'][] = [ '日期' => $item['日期'], '计件工资' => $item['计件工资'] // 保留原始字符串格式,避免精度丢失 ]; } // 对每个员工的「每日明细」按日期升序排序 foreach ($processedData as &$empData) { usort($empData['每日明细'], function($a, $b) { // 将日期字符串转换为时间戳进行比较 $timeA = strtotime(str_replace('.', '-', $a['日期'])); $timeB = strtotime(str_replace('.', '-', $b['日期'])); return $timeA - $timeB; // 升序排序(从小到大) }); } unset($empData); // 释放引用,避免后续误操作 // 转换为索引数组(可选,便于前端遍历) $finalData = array_values($processedData); $this->success('成功',$finalData); } /** *下方详情 * @return void * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException */ public function getDetail() { if($this->request->isGet() === false){ $this->error('请求错误'); } $req = $this->request->param(); if (!isset($req['date'])){ $this->error('参数错误'); } $list = \db('糊盒工资汇总') ->field('sczl_gdbh,sczl_gxmc,DATE_FORMAT(sczl_rq, "%Y.%m.%d") as 日期,sczl_jtbh,cpdh,cpmc,保养工时,装版工时, 异常工时,设备运行工时,rate as 分配比例,sczl_cl,price') ->where([ 'sczl_rq' => ['like',$req['date'].'%'], 'bh' => $req['code'] ]) ->order('sczl_rq') ->select(); if(empty($list)){ $this->error('失败'); }else{ $this->success('成功',$list); } } }