success('请求成功'); } /** * 计算员工计件工资 * @ApiMethod POST * @param string date 考勤年月 * @param string start_date 开始日期 * @param string end_date 结束日期 * @param string vacation_one_start 法定假日1 开始时间 * @param string vacation_one_end 法定假日1 结束时间 * @param string vacation_two_start 法定假日2 开始时间 * @param string vacation_two_end 法定假日2 结束时间 */ public function staffSalaryCount(){ if (Request::instance()->isPost() == false){ $this->error('非法请求'); } $params = Request::instance()->param(); if (!isset($params['start_date']) || !isset($params['end_date']) || empty($params['start_date']) || empty($params['end_date']) || !isset($params['date']) || empty($params['date'])) { $this->error('参数错误'); } $vacationOneArr = []; if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])){ $vacationOneStart = strtotime($params['vacation_one_start']); $vacationOneEnd = strtotime($params['vacation_one_end']); for ($i=$vacationOneStart; $i<=$vacationOneEnd; $i+=86400) { array_push($vacationOneArr,date("Y-m-d", $i)); } } $vacationTwoArr = []; if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])){ $vacationTwoStart = strtotime($params['vacation_two_start']); $vacationTwoEnd = strtotime($params['vacation_two_end']); for ($i=$vacationTwoStart; $i<=$vacationTwoEnd; $i+=86400) { array_push($vacationTwoArr,date("Y-m-d", $i)); } } $startDate = $params['start_date']; $endDate = $params['end_date']; $where = []; $where['a.sczl_rq'] = ['between',[$startDate,$endDate]]; $fields = "a.sczl_gdbh,a.sczl_yjno,a.sczl_gxh,a.sczl_gxmc as sczl_type,a.sczl_rq,a.sczl_jtbh,a.sczl_ms,a.sczl_cl as 班组车头产量,a.sczl_zcfp, a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常停机工时 as 异常停机工时,a.sczl_设备运行工时 as 车头产量占用机时, 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_rate1,a.sczl_rate2,a.sczl_rate3,a.sczl_rate4,a.sczl_rate5,a.sczl_rate6,a.sczl_rate7,a.sczl_rate8,a.sczl_rate9,a.sczl_rate10, b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数 ,d1.员工姓名 as name1,d2.员工姓名 as name2,d3.员工姓名 as name3,d4.员工姓名 as name4,d5.员工姓名 as name5,d6.员工姓名 as name6,d7.员工姓名 as name7,d8.员工姓名 as name8 ,d9.员工姓名 as name9,d10.员工姓名 as name10"; // $query = \db('设备_产量计酬')->alias('a')->field($fields); // // 连接 dic_lzde 表 // $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT'); // // 连接 工单_工艺资料 表 // $query->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh', 'LEFT'); // // 循环连接 人事_基本资料 表(仅当 sczl_bh 不为空时才连接) // for ($i = 1; $i <= 10; $i++) { // $field = 'a.sczl_bh' . $i; // $alias = 'd' . $i; // $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT'); // } // $query->where($where); // $list = $query->select(); $UniqId = \db('绩效工资汇总_temp')->field('UniqID')->order('UniqID desc')->find(); if (empty($UniqId)){ $UniqId = 1; }else{ $UniqId = $UniqId['UniqID']; } $data = []; //设备_产量计酬数据 // foreach ($list as $value){ // $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp']; // //计件产量 // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){ // $value['工序难度系数'] = '1.0000'; // $byThePieceYield = $value['班组车头产量']; // }else{ // $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']); // } // //补产产量/班组换算产量 // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准']; // //核算产量 // $accountingYield = $byThePieceYield + $afterProductionYield; // //工时占比 // $manHourRate = number_format($accountingYield / $value['日定额'],4); // for ($i=1; $i<11; $i++){ // $bhKey = 'sczl_bh'.$i; // $xmKey = 'name'.$i; // $rateKey = 'sczl_rate'.$i; // if (!empty($value[$bhKey]) && $value[$bhKey] != '000000'){ // $item = []; // $item['sczl_gdbh'] = $value['sczl_gdbh']; // $item['sczl_yjno'] = $value['sczl_yjno']; // $item['sczl_gxh'] = $value['sczl_gxh']; // $item['sczl_type'] = substr($value['sczl_type'],0,30); // $item['sczl_rq'] = $value['sczl_rq']; // $item['sczl_jtbh'] = $value['sczl_jtbh']; // $item['班组车头产量'] = $value['班组车头产量']; // $item['工价系数'] = '0.0000'; // $item['工序难度系数'] = $value['工序难度系数']; // $item['装版工时'] = $value['装版工时']; // $item['保养工时'] = $value['保养工时']; // $item['打样工时'] = $value['打样工时']; // $item['异常停机工时'] = $value['异常停机工时']; // $item['车头产量占用机时'] = $value['车头产量占用机时']; // $item['日定额'] = (int)$value['日定额']; // $item['千件工价'] = $value['千件工价']; // $item['补产标准'] = $value['补产标准']; // $item['班组换算产量'] = $afterProductionYield; // $item['计时补差额工资'] = '0.00'; // $item['bh'] = $value[$bhKey]; // $item['xm'] = $value[$xmKey]; // $item['Rate'] = $value[$rateKey]; // $item['sczl_ms'] = $value['sczl_ms']; // $item['核算产量'] = $accountingYield; // $item['工时占比'] = floatval($manHourRate); // array_push($data,$item); // } // } // } //拆片工序数据 $query = Db::table('db_sczl')->alias('a') ->field('a.sczl_gdbh, a.sczl_yjno, a.sczl_gxh, sczl_type, a.sczl_rq, a.sczl_jtbh, a.sczl_ms, a.sczl_cl as 班组车头产量, a.sczl_fp as sczl_zcfp, a.sczl_装版工时 as 装版工时, a.sczl_保养工时 as 保养工时, a.sczl_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1, a.sczl_rate1, b.千件工价, b.日定额, b.补产标准, c.工价系数 as 工序难度系数, d.员工姓名') ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh','left') ->join('工单_工艺资料 c', 'a.sczl_gdbh = c.Gy0_gdbh AND a.sczl_yjno = c.Gy0_yjno AND a.sczl_gxh = c.Gy0_gxh','left') ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号','left') ->where($where) // ->fetchSql(true) ->select(); // halt($query); foreach ($query as $value){ $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp']; //计件产量 if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){ $value['工序难度系数'] = '1.0000'; $byThePieceYield = $value['班组车头产量']; }else{ $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']); } //补产产量/班组换算产量 $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准']; //核算产量 $accountingYield = $byThePieceYield + $afterProductionYield; //工时占比 $manHourRate = number_format($accountingYield / $value['日定额'],4); $item = []; $item['sczl_gdbh'] = $value['sczl_gdbh']; $item['sczl_yjno'] = $value['sczl_yjno']; $item['sczl_gxh'] = $value['sczl_gxh']; $item['sczl_type'] = substr($value['sczl_type'],0,30); $item['sczl_rq'] = $value['sczl_rq']; $item['sczl_jtbh'] = $value['sczl_jtbh']; $item['班组车头产量'] = $value['班组车头产量']; $item['工价系数'] = '0.0000'; $item['工序难度系数'] = $value['工序难度系数']; $item['装版工时'] = $value['装版工时']; $item['保养工时'] = $value['保养工时']; $item['打样工时'] = $value['打样工时']; $item['异常停机工时'] = $value['异常停机工时']; $item['车头产量占用机时'] = $value['车头产量占用机时']; $item['日定额'] = (int)$value['日定额']; $item['千件工价'] = $value['千件工价']; $item['补产标准'] = $value['补产标准']; $item['班组换算产量'] = $afterProductionYield; $item['计时补差额工资'] = '0.00'; $item['bh'] = $value['sczl_bh1']; $item['xm'] = $value['员工姓名']; $item['Rate'] = $value['sczl_rate1']; $item['sczl_ms'] = $value['sczl_ms']; $item['核算产量'] = $accountingYield; $item['工时占比'] = floatval($manHourRate); array_push($data,$item); } //手工检验工序数据 // halt($data); // 用于存储bh对应的工时占比总和 $bhTotals = []; // 遍历原始数据 foreach ($data as $row) { $bh = substr($row['sczl_rq'],0,10) . '-' .$row['bh']; // 初始化bh对应的工时占比总和为0 if (!isset($bhTotals[$bh])) { $bhTotals[$bh] = 0; } // 将工时占比相加 $bhTotals[$bh] += floatval($row['工时占比']); } // halt($bhTotals); foreach ($data as $key=>$item){ $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh']; //达标定额 $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']); $data[$key]['达标定额'] = number_format($standardQuota,2,'.', ''); $date = substr($item['sczl_rq'],0,10); if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){ //计件工资 $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate']*3; //加班工资 $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5*3; }else{ $pieceWorkWage = $standardQuota/1000*$item['千件工价']*$item['Rate']; $overTimePay = ($item['核算产量'] - $standardQuota) / 1000 *$item['千件工价'] * $item['Rate'] *1.5; } $data[$key]['个人计件工资'] = number_format($pieceWorkWage,2,'.', ''); $data[$key]['个人加班工资'] = number_format($overTimePay,2,'.', ''); $data[$key]['UniqID'] = $UniqId++; $data[$key]['sys_ny'] = $params['date']; unset($data[$key]['核算产量']); } halt($data); $res = \db('绩效工资汇总_temp')->insertAll($data); } }