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('参数错误'); // } // $startDate = $params['start_date']; // $endDate = $params['end_date']; // $attendanceMonth = $params['date']; // // 确保开始日期和结束日期在考勤年月的范围内 // $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth; // $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth; // if (!$startDateInRange || !$endDateInRange) { // $this->error('日期参数错误'); // } // $options = [ // 'host' => '127.0.0.1', // 'port' => 6379, // 'password' => '123456', // 'select' => 15, // 'timeout' => 0, // 'expire' => 0, // 'persistent' => false, // 'prefix' => '', // ]; // $redis = new Redis($options); //// $taskIdentifier = md5(json_encode('date')); //// $queueKey = $redis->get($taskIdentifier); //// if ($queueKey){ //// $this->success('数据正在处理中,请等待...'); //// } // $taskIdentifier = md5('salary_calculation_' . json_encode($params)); // // if ($redis->has($taskIdentifier)) { // $this->success('数据正在处理中,请等待...'); // } // $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)); // } // } // //法定天数 // $clocking_in_day = \db('人事_考勤资料')->where('kqzl_ny',$params['date'])->field('法定天数')->order('UniqId desc')->find(); // if (!empty($clocking_in_day)){ // $params['days'] = (int)$clocking_in_day['法定天数']; // }else{ // $this->error('法定天数未设置'); // } // //将起止日期内数据删除 // $delRes = \db('绩效工资汇总')->where('sczl_rq','between',[$startDate,$endDate])->delete(); // //设备产量计酬报工数据查询 // $where = []; // $where['a.sczl_rq'] = ['between',[$startDate,$endDate]]; // //查询印刷印后车间的机台,添加搜索条件 // $sist = ['胶印车间','凹丝印车间','印后车间','检验车间']; // $jtbhs = db('设备_基本资料') // ->where('sys_sbID','<>','') // ->where('使用部门','in',$sist) // ->column('设备编号'); // $fields = "a.sczl_gdbh,a.sczl_yjno,a.sczl_gxh,a.sczl_type as sczl_type,a.sczl_rq,a.sczl_jtbh,a.sczl_工价系数,a.sczl_ms,a.sczl_cl as 班组车头产量,a.sczl_Pgcl,a.sczl_zcfp, // a.sczl_装版工时 as 装版工时,a.sczl_保养工时 as 保养工时,a.sczl_打样工时 as 打样工时,a.sczl_异常工时1 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, // a.sczl_废品率系数,a.UniqId, // b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数,c.版距,c.印刷方式 // ,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::name('设备_产量计酬')->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)->where('a.sczl_jtbh','in',$jtbhs); // $list = $query->order('a.sczl_rq')->group('UniqId')->select(); // $UniqId = \db('绩效工资汇总')->field('UniqID')->order('UniqID desc')->find(); // if (empty($UniqId)){ // $UniqId = 1; // }else{ // $UniqId = $UniqId['UniqID'] + 1; // } // $data = []; // /** // * 设备_产量计酬数据 // */ // foreach ($list as $value){ // $num = 1; // $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp']; // //计件产量 // if (substr($value['sczl_jtbh'],0,2) == 'JP'){//检品机 // if ($value['sczl_废品率系数'] == 0){ // $gx_rate = 1; // }else{ // $gx_rate = $value['sczl_废品率系数']; // } // $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl']; // $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']);//班组计件核算产量 // }elseif (substr($value['sczl_jtbh'],0,2) == 'WY' || substr($value['sczl_jtbh'],0,2) == 'DW' || substr($value['sczl_jtbh'],0,3) == 'YWY' || substr($value['sczl_jtbh'],0,3) == 'YDW'){//凹印机 // if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0){ // //工序难度系数 // $gx_rate = $value['工序难度系数']; // if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])){ // $gx_rate = '1.0000'; // } // }else{ // if (floatval($value['工序难度系数']) > 0 ){ // $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'],3); // }else{ // $gx_rate = $value['sczl_工价系数']; // } // } // if (str_contains($value['印刷方式'],'张') && $value['版距'] > 0){ // $value['版距'] = $value['版距'] / 1000; // $value['班组车头产量'] = $value['班组车头产量'] * $value['版距']; // } //// $byThePieceYield = round($value['班组车头产量'] * $gx_rate); // $byThePieceYield =str_replace(',','',round($value['班组车头产量'] * floatval($gx_rate))) ; // }else{ // if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#'){ // $num = 1.1; // } // if ($value['sczl_工价系数'] == '0.000' || floatval($value['sczl_工价系数']) <= 0){ // //工序难度系数 // $gx_rate = $value['工序难度系数']; // if (floatval($value['工序难度系数']) <= 0 || empty($value['工序难度系数'])){ // $gx_rate = '1.0000'; // } // }else{ // if (floatval($value['工序难度系数']) > 0 ){ // $gx_rate = number_format($value['sczl_工价系数'] * $value['工序难度系数'],3); // }else{ // $gx_rate = $value['sczl_工价系数']; // } // } // $byThePieceYield =round($value['班组车头产量'] * floatval($gx_rate) * $num); // // } //// //计件产量 //// if (substr($value['sczl_jtbh'],0,2) == 'JP'){ //// $value['工序难度系数'] = $value['sczl_废品率系数']; //// $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl']; //// $byThePieceYield = round($value['班组车头产量'] * $value['sczl_废品率系数']); //// }else{ //// if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){ //// $value['工序难度系数'] = '1.0000'; //// $byThePieceYield = $value['班组车头产量']; //// }else{ //// $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数']); //// } //// } // //补产产量/班组换算产量 // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准']; // //核算产量 // $accountingYield = $byThePieceYield + $afterProductionYield; // //工时占比 // if ($value['日定额'] > 0){ // $manHourRate = number_format($accountingYield / $value['日定额'],4); // }else{ // $manHourRate = '0.0000'; // } // for ($i=1; $i<11; $i++){ // $bhKey = 'sczl_bh'.$i; // $xmKey = 'name'.$i; // $rateKey = 'sczl_rate'.$i; // if (!empty($value[$bhKey]) && $value[$bhKey] != '0000'){ // $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_type'] = $value['sczl_type']; // $item['sczl_rq'] = $value['sczl_rq']; // $item['sczl_jtbh'] = $value['sczl_jtbh']; // $item['班组车头产量'] = $value['班组车头产量']; // $item['工价系数'] = '0.0000'; // $item['工序难度系数'] = $gx_rate * $num; // $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['工时占比'] = $manHourRate; // array_push($data,$item); // } // } // } //// halt($data); // /** // * 拆片工序数据 // */ // $query = Db::name('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.补产标准,a.sczl_工价系数 as 工序难度系数,a.拆片联拼系数,a.拆片条小盒系数, 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) // ->select(); // foreach ($query as $value){ // $num = 1; // $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数']; // //计件产量 // if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#'){ // $num = 1.1; // } // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){ // $value['工序难度系数'] = '1.0000'; // $byThePieceYield = $value['班组车头产量']; // }else{ // $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数'] * $num); // } // //补产产量/班组换算产量 // $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准']; // //核算产量 // $accountingYield = $byThePieceYield + $afterProductionYield; // //工时占比 // if ($value['日定额'] > 0){ // $manHourRate = number_format($accountingYield / $value['日定额'],4); // }else{ // $manHourRate = '0.0000'; // } // $item = []; // $item['sczl_gdbh'] = $value['sczl_gdbh']; // $item['sczl_yjno'] = $value['sczl_yjno']; // $item['sczl_gxh'] = $value['sczl_gxh']; //// $item['sczl_type'] = substr(trim($value['sczl_type']),0,30); // $item['sczl_type'] = $value['sczl_type']; // $item['sczl_rq'] = $value['sczl_rq']; // $item['sczl_jtbh'] = $value['sczl_jtbh']; // $item['班组车头产量'] = $value['班组车头产量']; // $item['工价系数'] = '0.0000'; // $item['工序难度系数'] = $value['工序难度系数'] * $num; // $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); // /** // * 手工检验工序数据 // */ // $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量, // sczl_废品率系数 AS 工序难度系数,a.sczl_bh0,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_bh11,b.千件工价,b.日定额,b.补产标准,d0.员工姓名 AS name0, // 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, // d10.员工姓名 AS name11,d10.员工姓名 AS name12,a.sczl_cl0,a.sczl_cl1,a.sczl_cl2,a.sczl_cl3,a.sczl_cl4,a.sczl_cl5,a.sczl_cl6, // a.sczl_cl7,a.sczl_cl8,a.sczl_cl9,a.sczl_cl10,a.sczl_cl11,a.sczl_cl12,a.sczl_fp0,a.sczl_fp1,a.sczl_fp2,a.sczl_fp3, // a.sczl_fp4,a.sczl_fp5,a.sczl_fp6,a.sczl_fp7,a.sczl_fp8,a.sczl_fp9,a.sczl_fp10,a.sczl_fp11,a.sczl_fp12"; // $query = Db::name('db_手工检验')->alias('a')->field($shoujianfields); // //链接dic_lzde表 // $query->join('dic_lzde b','a.sczl_dedh = b.sys_bh','LEFT'); // //链接人事基本资料表 // for ($i=0;$i<=12;$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(); // foreach ($list as $key=>$value){ // for ($i=0;$i<=12;$i++){ // if (!empty($value['sczl_bh'.$i])){ // $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'],0,2); // $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'],3,2); // //车头产量 // $value['班组车头产量'] = $value['sczl_cl'.$i]*$value['sczl_fp'.$i]; // //计件产量 // if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])){ // $value['工序难度系数'] = '1.0000'; // $value['计件产量'] = $value['班组车头产量']; // }else{ // $value['计件产量'] = round($value['班组车头产量'] * $value['工序难度系数']); // } // //核算产量 // $value['核算产量'] = $value['计件产量']; // //工时占比 // if ($value['日定额'] > 0){ // $value['工时占比'] = round($value['计件产量']/$value['日定额'],4); // }else{ // $value['工时占比'] = '0.0000'; // } // $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_type'] = $value['sczl_type']; // $item['sczl_rq'] = $value['sczl_rq']; // $item['sczl_jtbh'] = ''; // $item['班组车头产量'] = $value['班组车头产量']; // $item['工价系数'] = '0.0000'; // $item['工序难度系数'] = $value['工序难度系数']; // $item['装版工时'] = '0.00'; // $item['保养工时'] = '0.00'; // $item['打样工时'] = '0.00'; // $item['异常停机工时'] = '0.00'; // $item['车头产量占用机时'] = '0.00'; // $item['日定额'] = (int)$value['日定额']; // $item['千件工价'] = $value['千件工价']; // $item['补产标准'] = $value['补产标准']; // $item['班组换算产量'] = '0'; // $item['计时补差额工资'] = '0.00'; // $item['bh'] = $value['sczl_bh'.$i]; // $item['xm'] = $value['name'.$i]; // $item['Rate'] = '1.0000'; // $item['sczl_ms'] = '0.00'; // $item['核算产量'] = $value['核算产量']; // $item['工时占比'] = floatval($value['工时占比']); // array_push($data,$item); // } // } // } //// halt($data); // /** // * 包装计件工序数据 // */ // $result = Db::name('db_包装计件')->alias('a') // ->field('a.sczl_gdbh1, a.sczl_gdbh2, a.sczl_gdbh3, a.sczl_gdbh4, a.sczl_gdbh5, a.sczl_gdbh6, // a.sczl_yjGx1, a.sczl_yjGx2, a.sczl_yjGx3, a.sczl_yjGx4, a.sczl_yjGx5, a.sczl_yjGx6, // rtrim(a.sczl_gxmc1) as gxmc1,rtrim(a.sczl_gxmc2) as gxmc2,rtrim(a.sczl_gxmc3) as gxmc3,rtrim(a.sczl_gxmc4) as gxmc4,rtrim(a.sczl_gxmc5) as gxmc5,rtrim(a.sczl_gxmc6) as gxmc6, // a.sczl_cl1, a.sczl_cl2, a.sczl_cl3, a.sczl_cl4, a.sczl_cl5, a.sczl_cl6, // a.sczl_返工产量1, a.sczl_返工产量2, a.sczl_返工产量3, a.sczl_返工产量4, a.sczl_返工产量5, a.sczl_返工产量6, // a.sczl_Jtbh1,a.sczl_Jtbh2,a.sczl_Jtbh3,a.sczl_Jtbh4,a.sczl_Jtbh5,a.sczl_Jtbh6, // a.sczl_dedh1,a.sczl_dedh2,a.sczl_dedh3,a.sczl_dedh4,a.sczl_dedh5,a.sczl_dedh6, // a.sczl_PgCl1,a.sczl_PgCl2,a.sczl_PgCl3,a.sczl_PgCl4,a.sczl_PgCl5,a.sczl_PgCl6, // a.sczl_type1,a.sczl_type2,sczl_type3,a.sczl_type4,a.sczl_type5,sczl_type6, // a.sczl_计产系数1,a.sczl_计产系数2,a.sczl_计产系数3,a.sczl_计产系数4,a.sczl_计产系数5,a.sczl_计产系数6, // c1.工价系数 as 工序难度系数1,c2.工价系数 as 工序难度系数2,c3.工价系数 as 工序难度系数3,c4.工价系数 as 工序难度系数4,c5.工价系数 as 工序难度系数5,c6.工价系数 as 工序难度系数6, // b1.千件工价 as 千件工价1, b2.千件工价 as 千件工价2, b3.千件工价 as 千件工价3, b4.千件工价 as 千件工价4, b5.千件工价 as 千件工价5, b6.千件工价 as 千件工价6, // b1.日定额 as 日定额1, b2.日定额 as 日定额2, b3.日定额 as 日定额3, b4.日定额 as 日定额4, b5.日定额 as 日定额5, b6.日定额 as 日定额6, // b1.补产标准 as 补产标准1, b2.补产标准 as 补产标准2, b3.补产标准 as 补产标准3, b4.补产标准 as 补产标准4, b5.补产标准 as 补产标准5, b6.补产标准 as 补产标准6, // a.sczl_rq,a.sczl_bh,rtrim(d.员工姓名) as xm, // e1.成品名称 as cpmc1,e2.成品名称 as cpmc2,e3.成品名称 as cpmc3,e4.成品名称 as cpmc4,e5.成品名称 as cpmc5,e6.成品名称 as cpmc6') // ->join('工单_工艺资料 c1', 'a.sczl_gdbh1 = c1.Gy0_gdbh AND a.sczl_yjGx1 = CONCAT("0",c1.Gy0_yjno, "-", c1.Gy0_gxh) AND a.sczl_gdbh1 IS NOT NULL', 'LEFT') // ->join('工单_工艺资料 c2', 'a.sczl_gdbh2 = c2.Gy0_gdbh AND a.sczl_yjGx2 = CONCAT("0",c2.Gy0_yjno, "-", c2.Gy0_gxh) AND a.sczl_gdbh2 IS NOT NULL', 'LEFT') // ->join('工单_工艺资料 c3', 'a.sczl_gdbh3 = c3.Gy0_gdbh AND a.sczl_yjGx3 = CONCAT("0",c3.Gy0_yjno, "-", c3.Gy0_gxh) AND a.sczl_gdbh3 IS NOT NULL', 'LEFT') // ->join('工单_工艺资料 c4', 'a.sczl_gdbh4 = c4.Gy0_gdbh AND a.sczl_yjGx4 = CONCAT("0",c4.Gy0_yjno, "-", c4.Gy0_gxh) AND a.sczl_gdbh4 IS NOT NULL', 'LEFT') // ->join('工单_工艺资料 c5', 'a.sczl_gdbh5 = c5.Gy0_gdbh AND a.sczl_yjGx5 = CONCAT("0",c5.Gy0_yjno, "-", c5.Gy0_gxh) AND a.sczl_gdbh5 IS NOT NULL', 'LEFT') // ->join('工单_工艺资料 c6', 'a.sczl_gdbh6 = c6.Gy0_gdbh AND a.sczl_yjGx6 = CONCAT("0",c6.Gy0_yjno, "-", c6.Gy0_gxh) AND a.sczl_gdbh6 IS NOT NULL', 'LEFT') // ->join('dic_lzde b1', 'a.sczl_dedh1 = b1.sys_bh', 'LEFT') // ->join('dic_lzde b2', 'a.sczl_dedh2 = b2.sys_bh', 'LEFT') // ->join('dic_lzde b3', 'a.sczl_dedh3 = b3.sys_bh', 'LEFT') // ->join('dic_lzde b4', 'a.sczl_dedh4 = b4.sys_bh', 'LEFT') // ->join('dic_lzde b5', 'a.sczl_dedh5 = b5.sys_bh', 'LEFT') // ->join('dic_lzde b6', 'a.sczl_dedh6 = b6.sys_bh', 'LEFT') // ->join('人事_基本资料 d', 'a.sczl_bh = d.员工编号', 'LEFT') // ->join('工单_基本资料 e1','a.sczl_gdbh1 = e1.Gd_gdbh AND a.sczl_gdbh1 IS NOT NULL','LEFT') // ->join('工单_基本资料 e2','a.sczl_gdbh2 = e2.Gd_gdbh AND a.sczl_gdbh2 IS NOT NULL','LEFT') // ->join('工单_基本资料 e3','a.sczl_gdbh3 = e3.Gd_gdbh AND a.sczl_gdbh3 IS NOT NULL','LEFT') // ->join('工单_基本资料 e4','a.sczl_gdbh4 = e4.Gd_gdbh AND a.sczl_gdbh4 IS NOT NULL','LEFT') // ->join('工单_基本资料 e5','a.sczl_gdbh5 = e5.Gd_gdbh AND a.sczl_gdbh5 IS NOT NULL','LEFT') // ->join('工单_基本资料 e6','a.sczl_gdbh6 = e6.Gd_gdbh AND a.sczl_gdbh6 IS NOT NULL','LEFT') // ->where($where) // ->group('a.UniqId') // ->select(); // // foreach ($result as $value){ // for ($i=1;$i<7;$i++){ // $item = []; // $gdbhKey = 'sczl_gdbh'.$i; // $yjgxKey = 'sczl_yjGx'.$i; // $jtbhKey = 'sczl_Jtbh'.$i; // $gxmcKey = 'gxmc'.$i; // $clKey = 'sczl_cl'.$i; // $reworkKey = 'sczl_返工产量'.$i; // $gxKey = '工序难度系数'.$i; // $dedh = 'sczl_dedh'.$i; // $thousandKey = '千件工价'.$i; // $dailyKey = '日定额'.$i; // $afterKey = '补产标准'.$i; // $pgclKey = 'sczl_PgCl'.$i; // $jcxsKey = 'sczl_计产系数'.$i; // $cpmcKey = 'cpmc'.$i; // $typekey = 'sczl_type'.$i; // if (!empty($value[$gdbhKey])){ // $item['sczl_gdbh'] = $value[$gdbhKey]; // $item['sczl_yjno'] = ltrim(substr($value[$yjgxKey],0,2), '0'); // $item['sczl_gxh'] = abs((int)substr($value[$yjgxKey],-2)); //// $item['sczl_type'] = substr($value[$gxmcKey],0,30); // $item['sczl_type'] = $value[$gxmcKey]; // $item['sczl_rq'] = $value['sczl_rq']; // $item['sczl_jtbh'] = $value[$jtbhKey]; // $item['工价系数'] = '0.0000'; // $item['工序难度系数'] = $value[$jcxsKey]; // if ($value[$jcxsKey] <= 0){ // $item['工序难度系数'] = '1.0000'; // } // $item['装版工时'] = '0.00'; // $item['保养工时'] = '0.00'; // $item['打样工时'] = '0.00'; // $item['异常停机工时'] = '0.00'; // $item['车头产量占用机时'] = '0.00'; // $item['日定额'] = $value[$dailyKey]; // $item['千件工价'] = $value[$thousandKey]; // $item['补产标准'] = $value[$afterKey]; // $item['班组换算产量'] = '0.00'; // $item['计时补差额工资'] = '0.00'; // $item['bh'] = $value['sczl_bh']; // $item['xm'] = $value['xm']; // $item['Rate'] = 1.000; // $item['sczl_ms'] = '0.00'; // $cl = $value[$clKey]; // if ($cl > 0){ // if (str_contains($item['sczl_type'],'包装')){ // $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey]; // }else{ // $item['班组车头产量'] = $cl; // } // $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数']; // //工时占比 // if ($item['日定额'] > 0){ // $manHourRate = number_format($item['核算产量'] / $item['日定额'],4); // }else{ // $manHourRate = '0.0000'; // } // $item['工时占比'] = floatval($manHourRate); // array_push($data,$item); // } // //返工 // if (!empty($value[$reworkKey]) && $value[$reworkKey] > 0){ // $item['sczl_type'] = '返工('.$item['sczl_type'].')'; // $cl = $value[$reworkKey]; // if (str_contains($item['sczl_type'],'包装')){ // $item['班组车头产量'] = $cl * $value[$pgclKey] / (int)$value[$typekey]; // }else{ // $item['班组车头产量'] = $cl; // } // $item['核算产量'] = $item['班组车头产量'] * $item['工序难度系数']; // if ($item['日定额'] > 0){ // $manHourRate = number_format($item['核算产量'] / $item['日定额'],4); // }else{ // $manHourRate = '0.0000'; // } // $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['工时占比']); // } // //用usort函数对$data数组按照sczl_rq的日期部分进行升序排序 // usort($data, function ($a, $b) { // return strtotime(substr($a['sczl_rq'], 0, 10)) - strtotime(substr($b['sczl_rq'], 0, 10)); // }); // $days = []; // foreach ($data as $key=>$item){ // //统计每月出勤天数 // $day_bh = $item['bh']; // if (!isset($days[$day_bh])){ // $days[$day_bh] = []; // array_push($days[$day_bh],$item['sczl_rq']); // }else{ // if (in_array($item['sczl_rq'],$days[$day_bh]) == false){ // array_push($days[$day_bh],$item['sczl_rq']); // } // } // $bh = substr($item['sczl_rq'],0,10) . '-' .$item['bh']; // //达标定额 // if ($item['工时占比'] > 0){ // $standardQuota = floatval($item['工时占比'] / $bhTotals[$bh] * $item['日定额']); // $data[$key]['达标定额'] = number_format($standardQuota,2,'.', ''); // }else{ // $data[$key]['达标定额'] = number_format($item['班组车头产量'],2,'.', ''); // } // $date = substr($item['sczl_rq'],0,10); // if (in_array($date,$vacationOneArr) || in_array($date,$vacationTwoArr)){ // //计件工资 //// $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate']*3; // $pieceWorkWage = 0; // //加班工资 // $overTimePay = $item['核算产量'] / 1000 *$item['千件工价'] * $item['Rate'] *3; // //法定节假日,去除这天的考勤天数 // $days[$day_bh] = array_filter($days[$day_bh], function($value) use ($item) { // return $value !== $item['sczl_rq']; // }); // }else{ //// //如果出勤天数小于法定天数,按正常计算 //// if (count($days[$day_bh]) <= $params['days'] && strpos($item['sczl_type'],'成品防护') === false){ //// $pieceWorkWage = $data[$key]['达标定额']/1000*$item['千件工价']*$item['Rate']; //// }else{ //如果出勤天数大于法定天数,达标定额为 0,计件工资为0,超出的部分按加班工资算 //// $data[$key]['达标定额'] = '0.00'; //// $pieceWorkWage = '0.00'; //// } //// $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 *$item['千件工价'] * $item['Rate'] *1.5; // // // 基础计件工资计算公式 // $baseWage = ($data[$key]['达标定额'] / 1000) * $item['千件工价'] * $item['Rate']; // // // 当有成品防护类型时(直接通过) // if (strpos($item['sczl_type'], '成品防护') !== false) { // $pieceWorkWage = $baseWage; // } // // 没有特殊类型时 // else { // // 转换为数值类型避免计算错误 // $standardQuota = (float)$data[$key]['达标定额']; // // 判断出勤天数是否超限 // if (count($days[$day_bh]) > $params['days']) { // // 超限时重置定额 // $data[$key]['达标定额'] = '0.00'; // $pieceWorkWage = '0.00'; // $standardQuota = 0; // 同步数值类型 // } else { // $pieceWorkWage = $baseWage; // } // } // // 统一计算加班工资(所有情况都会计算) //// $actualOutput = (float)$item['核算产量']; //// $overtimeOutput = max($actualOutput - (float)$data[$key]['达标定额'], 0); //// $overTimePay = ($overtimeOutput / 1000) * $item['千件工价'] * $item['Rate'] * 1.5; // $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 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']; // $data[$key]['sys_rq'] = date('Y-m-d H:i:s'); // $data[$key]['sys_id'] = $params['sys_id']; // $data[$key]['法定天数'] = $params['days']; // $data[$key]['sczl_type'] = trim($item['sczl_type']); // } // // // 检查任务是否已经存在于队列中,如果不存在则推送任务到队列 // if (!$redis->has($taskIdentifier)) { // $job = new InsertDataJob($data); // 创建任务实例 // // 推送任务到队列 // Queue::push($job,'','default'); // 推送任务到队列 // // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍 // $redis->set($taskIdentifier, true); // $this->success('数据正在处理中,请等待...'); // } // } // // //} namespace app\api\controller; use app\common\controller\Api; use think\Request; use think\Db; use think\Queue; use think\Log; class StaffSalary extends Api { protected $noNeedLogin = ['*']; protected $noNeedRight = ['*']; /** * 计算员工计件工资(队列版本) */ public function staffSalaryCount() { if (Request::instance()->isPost() == false) { $this->error('非法请求'); } $params = Request::instance()->param(); $params = $this->cleanParams($params); // 基础参数验证 $requiredParams = ['date', 'start_date', 'end_date']; foreach ($requiredParams as $param) { if (empty($params[$param])) { $this->error("{$param}参数不能为空"); } } $month = trim($params['date']); // 检查是否有正在执行的任务 $runningTask = Db::name('queue_tasks') ->where('task_type', 'salary_calculation') ->where('task_data', 'like', '%"date":"' . $month . '"%') ->where('status', 'in', ['pending', 'processing']) ->find(); if ($runningTask) { $this->success('该月份的工资计算任务已在执行中,请稍后查看结果'); } // 准备队列任务数据(确保是简单数组) $taskData = [ 'date' => $month, 'start_date' => trim($params['start_date']), 'end_date' => trim($params['end_date']), 'sys_id' => $params['sys_id'] ?? '', 'vacation_one_start' => $params['vacation_one_start'] ?? '', 'vacation_one_end' => $params['vacation_one_end'] ?? '', 'vacation_two_start' => $params['vacation_two_start'] ?? '', 'vacation_two_end' => $params['vacation_two_end'] ?? '', 'user_id' => session('user_id') ?? 0, 'user_name' => session('user_name') ?? '系统', 'request_time' => date('Y-m-d H:i:s') ]; try { // 先创建任务记录 $taskId = Db::name('queue_tasks')->insertGetId([ 'task_type' => 'salary_calculation', 'task_data' => json_encode($taskData, JSON_UNESCAPED_UNICODE), 'status' => 'pending', 'queue_name' => 'salary_calculation', 'create_time' => date('Y-m-d H:i:s') ]); // 添加到任务数据中 $taskData['task_id'] = $taskId; // 提交到工资计算队列 - 使用正确的队列调用方式 $jobHandlerClassName = 'app\job\InsertDataJob'; $queueName = 'salary_calculation'; $jobId = Queue::push($jobHandlerClassName, $taskData, $queueName); if ($jobId !== false) { // 更新任务记录 Db::name('queue_tasks') ->where('id', $taskId) ->update([ 'job_id' => $jobId, 'update_time' => date('Y-m-d H:i:s') ]); $this->success('工资计算任务已提交,正在后台处理...', null, [ 'task_id' => $taskId, 'job_id' => $jobId, 'month' => $month, 'queue_name' => $queueName, 'submit_time' => date('Y-m-d H:i:s') ]); } else { throw new \Exception('队列提交返回false'); } } catch (\Exception $e) { // 如果创建了任务记录但提交失败,更新状态 if (isset($taskId)) { Db::name('queue_tasks') ->where('id', $taskId) ->update([ 'status' => 'failed', 'error' => '任务提交失败: ' . $e->getMessage(), 'update_time' => date('Y-m-d H:i:s') ]); } $this->error('工资计算任务提交失败: ' . $e->getMessage()); } } protected function cleanParams(array $params): array { $cleanParams = []; foreach ($params as $key => $value) { if (is_string($value)) { // 去除首尾空格 $value = trim($value); // 处理 sys_id 中的特殊字符 if ($key === 'sys_id') { // 替换斜杠为下划线 $value = str_replace('/', '_', $value); // 替换其他可能的问题字符 $value = preg_replace('/[^\w\-\.]/u', '_', $value); } $cleanParams[$key] = $value; } else { $cleanParams[$key] = $value; } } return $cleanParams; } /** * 查询工资计算状态 */ public function salaryStatus() { $date = Request::instance()->param('date'); if (empty($date)) { $this->error('月份参数错误'); } try { $task = Db::name('queue_tasks') ->where('task_type', 'salary_calculation') ->where('task_data', 'like', '%"date":"' . $date . '"%') ->order('id', 'desc') ->find(); if ($task) { $taskData = json_decode($task['task_data'] ?? '{}', true) ?: []; $result = json_decode($task['result'] ?? '{}', true) ?: []; $response = [ 'exists' => true, 'task_id' => (int)$task['id'], 'date' => $date, 'status' => $task['status'] ?? 'unknown', 'queue_name' => $task['queue_name'] ?? '', 'job_id' => $task['job_id'] ?? '', 'start_time' => $task['start_time'] ?? '', 'end_time' => $task['end_time'] ?? '', 'retry_count' => (int)($task['retry_count'] ?? 0), 'result' => $result, 'error' => $task['error'] ?? '', 'create_time' => $task['create_time'] ?? '', 'user_info' => [ 'user_id' => $taskData['user_id'] ?? 0, 'user_name' => $taskData['user_name'] ?? '' ] ]; } else { $response = ['exists' => false, 'date' => $date]; } $this->success('查询成功', null, $response); } catch (\Exception $e) { $this->error('查询任务状态失败: ' . $e->getMessage()); } } }