GluingSalary.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. <?php
  2. namespace app\api\controller;
  3. use app\common\controller\Api;
  4. use think\Db;
  5. use think\Request;
  6. /**
  7. * 糊盒工资查询
  8. */
  9. class GluingSalary extends Api
  10. {
  11. protected $noNeedLogin = ['*'];
  12. protected $noNeedRight = ['*'];
  13. /**
  14. * 左侧菜单
  15. * @return void
  16. * @throws \think\db\exception\DataNotFoundException
  17. * @throws \think\db\exception\ModelNotFoundException
  18. * @throws \think\exception\DbException
  19. */
  20. public function getTab()
  21. {
  22. if(!$this->request->isGet()){
  23. $this->error('请求方式错误');
  24. }
  25. $res=db('糊盒工资汇总')
  26. ->field('DATE_FORMAT(`sczl_rq`, "%Y%m") as sys_ny,bh')
  27. ->group('DATE_FORMAT(`sczl_rq`, "%Y%m"),bh')
  28. ->whereTime('sczl_rq', '>=', strtotime('-14 months'))
  29. ->where('bh','<>','000000')
  30. ->order('sczl_rq desc')
  31. ->select();
  32. foreach($res as $v){
  33. $arr[$v['sys_ny'].'('][]=$v['bh'];
  34. }
  35. $rs = db('人事_基本资料')->column('员工编号,所在部门');
  36. foreach($arr as $k=>$v){
  37. foreach($v as $value){
  38. if(array_key_exists($value,$rs)){
  39. $data[$k.count($v).'人)'][rtrim($rs[$value])][]=rtrim($rs[$value]);
  40. } }
  41. $j=0;
  42. foreach($data[$k.count($v).'人)'] as $keys=>$values){
  43. $data[$k.count($v).'人)']['bm'][$j]=$keys;
  44. $data[$k.count($v).'人)'][$keys]=count($values);
  45. $j++;
  46. }
  47. usort($data[$k.count($v).'人)']['bm'], function($a, $b) {
  48. $order = array(
  49. '胶印车间',
  50. '凹印车间',
  51. '丝印车间',
  52. '模切车间',
  53. '检验车间',
  54. '精品试验车间',
  55. '品保部',
  56. '人力资源部',
  57. '生产部',
  58. '营销部',
  59. '数字化车间',
  60. '精品车间'
  61. );
  62. $a_index = array_search($a, $order);
  63. $b_index = array_search($b, $order);
  64. return $a_index - $b_index;
  65. });
  66. foreach($data[$k.count($v).'人)']['bm'] as &$va){
  67. $va=$va.'('.$data[$k.count($v).'人)'][$va].'人)';
  68. }
  69. $data[$k.count($v).'人)']=$data[$k.count($v).'人)']['bm'];
  70. }
  71. $i=0;
  72. foreach($data as $k=>$v){
  73. $datas[$i]['label']=$k;
  74. $gdbh=substr($k,0,strpos($k,'('));
  75. foreach($v as $key=>$value){
  76. $datas[$i]['children'][$key]['label']=$value;
  77. $datas[$i]['children'][$key]['gdbh']=$gdbh;
  78. }
  79. $i++;
  80. }
  81. $this->success('成功',$datas);
  82. }
  83. /**
  84. * 上方列表
  85. * @return void
  86. * @throws \think\db\exception\DataNotFoundException
  87. * @throws \think\db\exception\ModelNotFoundException
  88. * @throws \think\exception\DbException
  89. */
  90. public function getList()
  91. {
  92. if(!$this->request->isGet()){
  93. $this->error('请求方式错误');
  94. }
  95. $req = $this->request->param();
  96. if (isset($req['search'])){
  97. $where = [
  98. 'sczl_rq' => ['like',$req['date'].'%'],
  99. 'bh|name' => ['like',$req['search'].'%'],
  100. ];
  101. $res = db('糊盒工资汇总')
  102. ->where($where)
  103. ->group('bh, sczl_rq')
  104. ->field('bh as 员工编号, DATE_FORMAT(sczl_rq, "%Y.%m.%d") as 日期, name as 姓名, sum(salary) as 计件工资')
  105. ->select();
  106. }else{
  107. $where = [
  108. 'a.sczl_rq' => ['like',$req['date'].'%'],
  109. 'b.所在部门' => ['like', $req['department'] . '%']
  110. ];
  111. $res = db('糊盒工资汇总')
  112. ->alias('a')
  113. ->join('人事_基本资料 b', 'b.员工编号 = a.bh')
  114. ->where($where)
  115. ->group('a.bh, a.sczl_rq')
  116. ->field('a.bh as 员工编号, DATE_FORMAT(a.sczl_rq, "%Y.%m.%d") as 日期, a.name as 姓名, sum(a.salary) as 计件工资')
  117. ->select();
  118. }
  119. $processedData = [];
  120. foreach ($res as $item) {
  121. // 用「员工编号」作为唯一分组键(编号唯一,比编号+姓名更简洁)
  122. $empNo = $item['员工编号'];
  123. // 转换工资为浮点型(避免字符串拼接导致计算错误)
  124. $salary = (float)$item['计件工资'];
  125. if (!isset($processedData[$empNo])) {
  126. // 初始化该员工的分组数据
  127. $processedData[$empNo] = [
  128. '员工编号' => $empNo,
  129. '姓名' => $item['姓名'],
  130. '月工资总和' => 0.00, // 初始化为浮点型,保证精度
  131. '每日明细' => [] // 存储按时间排序的每日工资
  132. ];
  133. }
  134. // 累加月工资总和
  135. $processedData[$empNo]['月工资总和'] += $salary;
  136. $processedData[$empNo]['月工资总和'] = number_format($processedData[$empNo]['月工资总和'],2);
  137. // 将当前日期的工资存入明细(保留原始字段)
  138. $processedData[$empNo]['每日明细'][] = [
  139. '日期' => $item['日期'],
  140. '计件工资' => $item['计件工资'] // 保留原始字符串格式,避免精度丢失
  141. ];
  142. }
  143. // 对每个员工的「每日明细」按日期升序排序
  144. foreach ($processedData as &$empData) {
  145. usort($empData['每日明细'], function($a, $b) {
  146. // 将日期字符串转换为时间戳进行比较
  147. $timeA = strtotime(str_replace('.', '-', $a['日期']));
  148. $timeB = strtotime(str_replace('.', '-', $b['日期']));
  149. return $timeA - $timeB; // 升序排序(从小到大)
  150. });
  151. }
  152. unset($empData); // 释放引用,避免后续误操作
  153. // 转换为索引数组(可选,便于前端遍历)
  154. $finalData = array_values($processedData);
  155. $this->success('成功',$finalData);
  156. }
  157. /**
  158. *下方详情
  159. * @return void
  160. * @throws \think\db\exception\DataNotFoundException
  161. * @throws \think\db\exception\ModelNotFoundException
  162. * @throws \think\exception\DbException
  163. */
  164. public function getDetail()
  165. {
  166. if($this->request->isGet() === false){
  167. $this->error('请求错误');
  168. }
  169. $req = $this->request->param();
  170. if (!isset($req['date'])){
  171. $this->error('参数错误');
  172. }
  173. $list = \db('糊盒工资汇总')
  174. ->field('sczl_gdbh,sczl_gxmc,DATE_FORMAT(sczl_rq, "%Y.%m.%d") as 日期,sczl_jtbh,cpdh,cpmc,保养工时,装版工时,
  175. 异常工时,设备运行工时,rate as 分配比例,sczl_cl,price')
  176. ->where([
  177. 'sczl_rq' => ['like',$req['date'].'%'],
  178. 'bh' => $req['code']
  179. ])
  180. ->order('sczl_rq')
  181. ->select();
  182. if(empty($list)){
  183. $this->error('失败');
  184. }else{
  185. $this->success('成功',$list);
  186. }
  187. }
  188. }