Ver código fonte

优化工资核算

unknown 1 mês atrás
pai
commit
8aa6c802fa

+ 588 - 701
application/api/controller/StaffSalary.php

@@ -1,654 +1,14 @@
 <?php
 namespace app\api\controller;
 
-//use app\common\controller\Api;
-//use \think\Request;
-//use think\Db;
-//use app\service\InsertDataJob;
-//use think\Queue;
-//use think\Cache;
-//use think\cache\driver\Redis;
-//use function fast\e;
-
-//use app\common\controller\Api;
-//use \think\Request;
-//use think\Db;
-//use app\job\InsertDataJob;
-//use think\Queue;
-//use think\Cache;
-//use think\cache\driver\Redis;
-///**
-// * 员工计件工资核算
-// */
-//class StaffSalary extends Api
-//{
-//    protected $noNeedLogin = ['*'];
-//    protected $noNeedRight = ['*'];
-//
-//    /**
-//     * 首页
-//     *
-//     */
-//    public function index()
-//    {
-//        $this->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\Log;
+use app\job\InsertDataJob;
 use think\Queue;
-use think\Request;
+use think\Cache;
 use think\cache\driver\Redis;
-use app\common\controller\Api;
+use function fast\e;
 
 /**
  * 员工计件工资核算
@@ -659,81 +19,608 @@ class StaffSalary extends Api
     protected $noNeedRight = ['*'];
 
     /**
-     * 计算员工计件工资(投递队列)
-     * @ApiMethod POST
+     * 首页
+     *
      */
-    public function staffSalaryCount()
+    public function index()
     {
-        $request = Request::instance();
-        if (!$request->isPost()) {
-            $this->error('非法请求方式');
+        $this->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->param();
-        // 1. 参数校验
-        $required = ['start_date', 'end_date', 'date'];
-        foreach ($required as $field) {
-            if (empty($params[$field])) {
-                $this->error("参数错误:{$field}不能为空");
-            }
+        $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('参数错误');
         }
-
-        // 2. 日期范围校验
+        $startDate = $params['start_date'];
+        $endDate = $params['end_date'];
         $attendanceMonth = $params['date'];
-        $startDateInRange = date('Ym', strtotime($params['start_date'])) === $attendanceMonth;
-        $endDateInRange = date('Ym', strtotime($params['end_date'])) === $attendanceMonth;
+        // 确保开始日期和结束日期在考勤年月的范围内
+        $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
+        $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
         if (!$startDateInRange || !$endDateInRange) {
-            $this->error('开始/结束日期必须在考勤年月范围内');
+            $this->error('日期参数错误');
         }
-
-        // 3. Redis防重复提交锁
-        $redisConfig = [
+        $options = [
             'host'       => '127.0.0.1',
             'port'       => 6379,
-            'password'   => '',
+            'password'   => '123456',
             'select'     => 15,
             'timeout'    => 0,
+            'expire'     => 0,
             'persistent' => false,
             'prefix'     => '',
         ];
-        $redis = new Redis($redisConfig);
-        $taskIdentifier = md5('salary_calculation_' . json_encode($params));
-        if ($redis->has($taskIdentifier)) {
-            $this->success('数据正在处理中,请稍后查询');
+        $redis = new Redis($options);
+        $taskIdentifier = md5(json_encode('date'));
+        $queueKey =  $redis->get($taskIdentifier);
+        if ($queueKey){
+            $this->success('数据正在处理中,请等待...');
         }
-
-        // 4. 创建数据库任务记录
-        $taskId = Db::name('queue_tasks')->insertGetId([
-            'task_type' => 'salary_calculation',
-            'status' => 'pending',
-            'task_data' => json_encode($params, JSON_UNESCAPED_UNICODE),
-            'create_time' => date('Y-m-d H:i:s'),
-            'update_time' => date('Y-m-d H:i:s')
-        ]);
-        if (!$taskId) {
-            $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));
+            }
+        }
+        //法定天数
+        $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);
 
-        // 5. 设置Redis锁(2小时过期,防止死锁)
-        $redis->set($taskIdentifier, $taskId, 7200);
+            }
+//            //计件产量
+//            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();
 
-        // 6. 投递队列任务
-        $queueData = array_merge($params, ['task_id' => $taskId]);
-        $queueResult = Queue::push('app\job\InsertDataJob@fire', $queueData, 'salary_calculation');
+        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);
+                    }
 
-        if (!$queueResult) {
-            // 投递失败,回滚任务记录和Redis锁
-            Db::name('queue_tasks')->where('id', $taskId)->delete();
-            $redis->rm($taskIdentifier);
-            $this->error('队列任务投递失败');
+                }
+            }
         }
+//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;
 
-        Log::info('工资计算队列任务投递成功', [
-            'task_id' => (int)$taskId,
-            'queue_id' => (string)$queueResult // 确保queue_id为字符串
-        ]);
-        $this->success('任务已提交,正在计算中', ['task_id' => $taskId]);
-    }
-}
-
+                // 基础计件工资计算公式
+                $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,'','salary_calculation'); // 推送任务到队列
+            // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍
+            $redis->set($taskIdentifier, true);
+            $this->success('数据正在处理中,请等待...');
+        }
+    }
+}

+ 2 - 1
application/extra/queue.php

@@ -20,7 +20,6 @@ return [
     'host'       => '127.0.0.1',      // redis 主机ip
     'port'       => 6379,            // redis 端口
     'password'   => '123456',               // redis 密码
-    'select'     => 15,              // 使用哪一个 db
     'timeout'    => 0,               // redis连接的超时时间
     'persistent' => false,
 
@@ -28,12 +27,14 @@ return [
     'queues' => [
         // 工资计算队列(默认队列,保持原有逻辑)
         'salary_calculation' => [
+            'select'     => 15,
             'expire' => 600,         // 10分钟超时
             'delay'  => 0,
             'retry'  => 2,
         ],
         // 成本计算队列(新增队列)
         'cost_calculation' => [
+            'select'     => 14,
             'expire' => 1800,        // 半小时超时
             'delay'  => 0,           // 立即执行
             'retry'  => 3,           // 重试次数

+ 63 - 249
application/job/InsertDataJob.php

@@ -1,263 +1,77 @@
 <?php
-//
-//namespace app\job;
-//
-////use think\Db;
-////use think\Cache;
-////use think\cache\driver\Redis;
-//
-//use think\Db;
-//use think\Cache;
-//use think\Log;
-//use think\cache\driver\Redis;
-//
-//class InsertDataJob
-//{
-////    protected $data;
-////
-////    public function __construct($data)
-////    {
-////        $this->data = $data;
-////    }
-//
-//    protected $data;
-//    protected $taskData;
-//
-//    public function __construct($data)
-//    {
-//        $this->data = $data;
-//    }
-//    public function handle()
-//    {
-////        $options = [
-////            'host'       => '127.0.0.1',
-////            'port'       => 6379,
-////            'password'   => '',
-////            'select'     => 15,
-////            'timeout'    => 0,
-////            'expire'     => 0,
-////            'persistent' => false,
-////            'prefix'     => '',
-////        ];
-////        $redis = new Redis($options);
-////        $taskIdentifier = md5(json_encode('date'));
-////        $handData = [];
-//        $options = [
-//            'host'       => '127.0.0.1',
-//            'port'       => 6379,
-//            'password'   => '123456',
-//            'select'     => 15,
-//            'timeout'    => 0,
-//            'expire'     => 0,
-//            'persistent' => false,
-//            'prefix'     => '',
-//        ];
-//        $redis = new Redis($options);
-//
-//        // 从任务数据中获取月份
-//        $date = $this->taskData['date'] ?? '';
-//        $taskId = $this->taskData['task_id'] ?? 0;
-//        $taskIdentifier = md5('salary_calculation_' . $date);
-//
-//        try {
-//            // 更新任务状态为执行中
-//            if ($taskId) {
-//                Db::name('queue_tasks')
-//                    ->where('id', $taskId)
-//                    ->update([
-//                        'status' => 'processing',
-//                        'start_time' => date('Y-m-d H:i:s'),
-//                        'update_time' => date('Y-m-d H:i:s')
-//                    ]);
-//            }
-//
-//            // 原有的数据处理逻辑
-//            $handData = [];
-//            foreach ($this->data as $key=>$value){
-//                $handData[$key]['sczl_gdbh'] = $value['sczl_gdbh'];
-//                $handData[$key]['sczl_yjno'] = $value['sczl_yjno'];
-//                $handData[$key]['sczl_gxh'] = $value['sczl_gxh'];
-//                $handData[$key]['sczl_type'] = $value['sczl_type'];
-//                $handData[$key]['sczl_rq'] = $value['sczl_rq'];
-//                $handData[$key]['sczl_jtbh'] = $value['sczl_jtbh'];
-//                $handData[$key]['班组车头产量'] = $value['班组车头产量'];
-//                $handData[$key]['工价系数'] = $value['工价系数'];
-//                $handData[$key]['工序难度系数'] = $value['工序难度系数'];
-//                $handData[$key]['装版工时'] = $value['装版工时'];
-//                $handData[$key]['保养工时'] = $value['保养工时'];
-//                $handData[$key]['打样工时'] = $value['打样工时'];
-//                $handData[$key]['异常停机工时'] = $value['异常停机工时'];
-//                $handData[$key]['车头产量占用机时'] = $value['车头产量占用机时'];
-//                $handData[$key]['日定额'] = $value['日定额'];
-//                $handData[$key]['千件工价'] = $value['千件工价'];
-//                $handData[$key]['补产标准'] = $value['补产标准'];
-//                $handData[$key]['班组换算产量'] = $value['班组换算产量'];
-//                $handData[$key]['计时补差额工资'] = $value['计时补差额工资'];
-//                $handData[$key]['bh'] = $value['bh'];
-//                $handData[$key]['xm'] = $value['xm'];
-//                $handData[$key]['Rate'] = $value['Rate'];
-//                $handData[$key]['sczl_ms'] = $value['sczl_ms'];
-//                $handData[$key]['工时占比'] = $value['工时占比'];
-//                $handData[$key]['达标定额'] = $value['达标定额'];
-//                $handData[$key]['个人计件工资'] = $value['个人计件工资'];
-//                $handData[$key]['个人加班工资'] = $value['个人加班工资'];
-//                $handData[$key]['UniqID'] = $value['UniqID'];
-//                $handData[$key]['sys_ny'] = $value['sys_ny'];
-//                $handData[$key]['sys_rq'] = $value['sys_rq'];
-//                $handData[$key]['sys_id'] = $value['sys_id'];
-//                $handData[$key]['法定天数'] = $value['法定天数'];
-//            }
-//            $sql =Db::name('绩效工资汇总')->fetchSql(true)->insertAll($handData);
-//            $res = Db::query($sql);
-////        if ($res !== false){
-////            // 获取队列的键名
-////            $queueKey = 'default';
-////            // 删除队列
-////            Cache::store('redis')->handler()->del($queueKey);
-////            $redis->rm($taskIdentifier);
-////        }
-//            if ($res !== false){
-//                // 更新任务状态为成功
-//                if ($taskId) {
-//                    Db::name('queue_tasks')
-//                        ->where('id', $taskId)
-//                        ->update([
-//                            'status' => 'success',
-//                            'end_time' => date('Y-m-d H:i:s'),
-//                            'result' => json_encode(['success' => true, 'message' => '工资计算完成']),
-//                            'update_time' => date('Y-m-d H:i:s')
-//                        ]);
-//                }
-//
-//                // 清理缓存
-//                $queueKey = 'salary_calculation';
-//                Cache::store('redis')->handler()->del($queueKey);
-//                $redis->rm($taskIdentifier);
-//
-//                Log::info('工资计算任务执行成功', ['date' => $date]);
-//            } else {
-//                throw new \Exception('数据插入失败');
-//            }
-//
-//        } catch (\Exception $e) {
-//            Log::error('工资计算任务执行失败: ' . $e->getMessage());
-//
-//            // 更新任务状态为失败
-//            if ($taskId) {
-//                Db::name('queue_tasks')
-//                    ->where('id', $taskId)
-//                    ->update([
-//                        'status' => 'failed',
-//                        'end_time' => date('Y-m-d H:i:s'),
-//                        'error' => $e->getMessage(),
-//                        'update_time' => date('Y-m-d H:i:s')
-//                    ]);
-//            }
-//
-//            $redis->rm($taskIdentifier);
-//        }
-//    }
-//}
-
 
 namespace app\job;
 
 use think\Db;
-use think\Log;
-use think\queue\Job;
-use app\service\SalaryCalculationService;
+use think\Cache;
+use think\cache\driver\Redis;
 
-/**
- * 工资计算队列任务
- */
 class InsertDataJob
 {
-    /**
-     * 队列任务执行入口
-     * @param Job $job 队列任务对象
-     * @param array $data 任务参数
-     */
-    public function fire(Job $job, $data)
-    {
-        // 1. 基础参数校验
-        if (!is_array($data) || empty($data['task_id']) || empty($data['date'])) {
-            Log::error('队列任务参数错误', [
-                'data' => json_encode($data, JSON_UNESCAPED_UNICODE) // 序列化复杂数组
-            ]);
-            $job->delete(); // 参数错误直接删除任务
-            return;
-        }
-
-        $taskId = (int)$data['task_id'];
-        $maxAttempts = 3; // 最大重试次数
-
-        try {
-            // 2. 更新任务状态为执行中
-            $this->updateTaskStatus($taskId, 'processing', [
-                'start_time' => date('Y-m-d H:i:s'),
-                'retry_count' => $job->attempts()
-            ]);
-
-            // 3. 调用工资计算服务
-            $service = new SalaryCalculationService();
-            $result = $service->calculateSalary($data);
-
-            // 4. 任务成功处理
-            if ($result['success']) {
-                $job->delete(); // 删除队列任务
-                $this->updateTaskStatus($taskId, 'success', [
-                    'end_time' => date('Y-m-d H:i:s'),
-                    'result' => json_encode($result, JSON_UNESCAPED_UNICODE),
-                    'update_time' => date('Y-m-d H:i:s')
-                ]);
-                Log::info('工资计算队列任务执行成功', [
-                    'task_id' => (int)$taskId,
-                    'date' => (string)($data['date'] ?? '')
-                ]);
-                return;
-            }
-
-            // 5. 任务失败处理(未达到最大重试次数则重试)
-            throw new \Exception($result['message'] ?? '工资计算服务执行失败');
+    protected $data;
 
-        } catch (\Exception $e) {
-            Log::error('工资计算队列任务执行失败', [
-                'task_id' => (int)$taskId,
-                'error' => (string)$e->getMessage(),
-                'trace' => substr((string)$e->getTraceAsString(), 0, 2000), // 截断超长trace
-                'attempts' => (int)$job->attempts()
-            ]);
-
-            // 6. 达到最大重试次数则标记失败,否则重试
-            if ($job->attempts() >= $maxAttempts) {
-                $job->delete(); // 删除任务,停止重试
-                $this->updateTaskStatus($taskId, 'failed', [
-                    'end_time' => date('Y-m-d H:i:s'),
-                    'error' => $e->getMessage(),
-                    'retry_count' => $job->attempts(),
-                    'update_time' => date('Y-m-d H:i:s')
-                ]);
-            } else {
-                $job->release(5); // 5秒后重试
-            }
-        }
+    public function __construct($data)
+    {
+        $this->data = $data;
     }
 
-    /**
-     * 更新任务状态
-     * @param int $taskId 任务ID
-     * @param string $status 状态:processing/success/failed
-     * @param array $data 附加更新字段
-     */
-    private function updateTaskStatus(int $taskId, string $status, array $data = [])
+    public function handle()
     {
-        if ($taskId <= 0) return;
-
-        $updateData = array_merge([
-            'status' => $status,
-            'update_time' => date('Y-m-d H:i:s')
-        ], $data);
-
-        Db::name('queue_tasks')->where('id', $taskId)->update($updateData);
+        $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'));
+        $handData = [];
+        foreach ($this->data as $key=>$value){
+            $handData[$key]['sczl_gdbh'] = $value['sczl_gdbh'];
+            $handData[$key]['sczl_yjno'] = $value['sczl_yjno'];
+            $handData[$key]['sczl_gxh'] = $value['sczl_gxh'];
+            $handData[$key]['sczl_type'] = $value['sczl_type'];
+            $handData[$key]['sczl_rq'] = $value['sczl_rq'];
+            $handData[$key]['sczl_jtbh'] = $value['sczl_jtbh'];
+            $handData[$key]['班组车头产量'] = $value['班组车头产量'];
+            $handData[$key]['工价系数'] = $value['工价系数'];
+            $handData[$key]['工序难度系数'] = $value['工序难度系数'];
+            $handData[$key]['装版工时'] = $value['装版工时'];
+            $handData[$key]['保养工时'] = $value['保养工时'];
+            $handData[$key]['打样工时'] = $value['打样工时'];
+            $handData[$key]['异常停机工时'] = $value['异常停机工时'];
+            $handData[$key]['车头产量占用机时'] = $value['车头产量占用机时'];
+            $handData[$key]['日定额'] = $value['日定额'];
+            $handData[$key]['千件工价'] = $value['千件工价'];
+            $handData[$key]['补产标准'] = $value['补产标准'];
+            $handData[$key]['班组换算产量'] = $value['班组换算产量'];
+            $handData[$key]['计时补差额工资'] = $value['计时补差额工资'];
+            $handData[$key]['bh'] = $value['bh'];
+            $handData[$key]['xm'] = $value['xm'];
+            $handData[$key]['Rate'] = $value['Rate'];
+            $handData[$key]['sczl_ms'] = $value['sczl_ms'];
+            $handData[$key]['工时占比'] = $value['工时占比'];
+            $handData[$key]['达标定额'] = $value['达标定额'];
+            $handData[$key]['个人计件工资'] = $value['个人计件工资'];
+            $handData[$key]['个人加班工资'] = $value['个人加班工资'];
+            $handData[$key]['UniqID'] = $value['UniqID'];
+            $handData[$key]['sys_ny'] = $value['sys_ny'];
+            $handData[$key]['sys_rq'] = $value['sys_rq'];
+            $handData[$key]['sys_id'] = $value['sys_id'];
+            $handData[$key]['法定天数'] = $value['法定天数'];
+        }
+        $sql =Db::name('绩效工资汇总')->fetchSql(true)->insertAll($handData);
+        $res = Db::query($sql);
+        if ($res !== false){
+            // 获取队列的键名
+            $queueKey = 'salary_calculation';
+            // 删除队列
+            Cache::store('redis')->handler()->del($queueKey);
+            $redis->rm($taskIdentifier);
+        }
     }
 }

+ 0 - 509
application/service/SalaryCalculationService.php

@@ -1,509 +0,0 @@
-<?php
-namespace app\service;
-
-use think\Db;
-use think\Log;
-use think\Exception;
-
-/**
- * 工资计算服务类
- */
-class SalaryCalculationService
-{
-    /**
-     * 执行工资计算主方法
-     * @param array $params 计算参数
-     * @return array 计算结果
-     */
-    public function calculateSalary(array $params): array
-    {
-        try {
-            $startDate = $params['start_date'];
-            $endDate = $params['end_date'];
-            $attendanceMonth = $params['date'];
-
-            // 1. 基础日期校验
-            $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
-            $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
-            if (!$startDateInRange || !$endDateInRange) {
-                return [
-                    'success' => false,
-                    'message' => '日期参数错误:开始/结束日期超出考勤年月范围'
-                ];
-            }
-
-            // 2. 法定天数校验
-            $clockingInDay = Db::name('人事_考勤资料')
-                ->where('kqzl_ny', $params['date'])
-                ->field('法定天数')
-                ->order('UniqId desc')
-                ->find();
-            if (empty($clockingInDay)) {
-                return ['success' => false, 'message' => '未查询到法定天数配置'];
-            }
-            $params['days'] = (int)$clockingInDay['法定天数'];
-
-            // 3. 删除历史数据
-            Db::name('绩效工资汇总')->where('sczl_rq', 'between', [$startDate, $endDate])->delete();
-
-            // 4. 初始化最终数据容器
-            $finalData = [];
-
-            // ====================== 设备产量计酬数据处理 ======================
-            $this->handleEquipmentProductionData($params, $finalData);
-
-            // ====================== 拆片工序数据处理 ======================
-            $this->handleChipProcessData($params, $finalData);
-
-            // ====================== 手工检验工序数据处理 ======================
-            $this->handleManualInspectionData($params, $finalData);
-
-            // ====================== 包装计件工序数据处理 ======================
-            $this->handlePackagingPieceworkData($params, $finalData);
-
-            // 5. 批量插入数据(核心:补充原代码缺失的插入逻辑)
-            if (empty($finalData)) {
-                return ['success' => false, 'message' => '未计算出有效工资数据'];
-            }
-
-            // 补充通用字段
-            foreach ($finalData as &$item) {
-                $item['sys_ny'] = $attendanceMonth;
-                $item['sys_rq'] = date('Y-m-d');
-                $item['sys_id'] = uniqid();
-                $item['法定天数'] = $params['days'];
-                // 补充缺失的工资计算字段
-                $item['个人计件工资'] = $this->calculatePieceworkWage($item);
-                $item['个人加班工资'] = $this->calculateOvertimeWage($item, $params);
-                $item['达标定额'] = $item['日定额'] * $params['days'];
-                $item['UniqID'] = $this->getNextUniqId();
-            }
-
-            // 6. 批量插入数据库
-            $insertResult = Db::name('绩效工资汇总')->insertAll($finalData);
-            if (!$insertResult) {
-                throw new Exception('批量插入绩效工资数据失败');
-            }
-
-            Log::info('工资计算完成', [
-                'start_date' => (string)$startDate,
-                'end_date' => (string)$endDate,
-                'total_rows' => (int)count($finalData),
-                'insert_rows' => (int)$insertResult
-            ]);
-
-            return [
-                'success' => true,
-                'message' => '工资计算完成',
-                'data' => [
-                    'total_rows' => count($finalData),
-                    'insert_rows' => $insertResult
-                ]
-            ];
-
-        } catch (Exception $e) {
-            Log::error('工资计算服务执行失败', [
-                'error' => (string)$e->getMessage(),
-                'trace' => (string)$e->getTraceAsString(),
-                'params' => json_encode($params, JSON_UNESCAPED_UNICODE) // 序列化复杂参数
-            ]);
-            return [
-                'success' => false,
-                'message' => '计算失败:' . $e->getMessage()
-            ];
-        }
-    }
-
-    /**
-     * 获取绩效工资汇总下一个UniqID
-     * @return int
-     */
-    private function getNextUniqId(): int
-    {
-        $lastUniqId = Db::name('绩效工资汇总')->field('UniqID')->order('UniqID desc')->find();
-        return empty($lastUniqId) ? 1 : (int)$lastUniqId['UniqID'] + 1;
-    }
-
-    /**
-     * 计算个人计件工资
-     * @param array $item 单条数据
-     * @return string
-     */
-    private function calculatePieceworkWage(array $item): string
-    {
-        if (empty($item['千件工价']) || empty($item['核算产量'])) {
-            return '0.00';
-        }
-        // 千件工价 * 核算产量 / 1000
-        $wage = (float)$item['千件工价'] * (float)$item['核算产量'] / 1000;
-        return number_format($wage, 2);
-    }
-
-    /**
-     * 计算个人加班工资
-     * @param array $item 单条数据
-     * @param array $params 全局参数
-     * @return string
-     */
-    private function calculateOvertimeWage(array $item, array $params): string
-    {
-        // 示例逻辑:可根据实际业务调整
-        $overtimeWage = 0.00;
-        if ($item['工时占比'] > 1) {
-            // 超出定额部分按1.5倍计算加班
-            $overtimeRatio = $item['工时占比'] - 1;
-            $overtimeWage = (float)$item['个人计件工资'] * $overtimeRatio * 1.5;
-        }
-        return number_format($overtimeWage, 2);
-    }
-
-    /**
-     * 处理设备产量计酬数据
-     * @param array $params 全局参数
-     * @param array &$finalData 最终数据容器(引用传递)
-     */
-    private function handleEquipmentProductionData(array $params, array &$finalData)
-    {
-        $where = ['a.sczl_rq' => ['between', [$params['start_date'], $params['end_date']]]];
-        // 查询印刷印后车间的机台
-        $sist = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
-        $jtbhs = Db::name('设备_基本资料')
-            ->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";
-
-        $list = Db::name('设备_产量计酬')->alias('a')
-            ->field($fields)
-            ->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')
-            ->where($where)
-            ->where('a.sczl_jtbh', 'in', $jtbhs)
-            ->order('a.sczl_rq')
-            ->group('UniqId')
-            ->select();
-
-        foreach ($list as $value) {
-            $num = 1;
-            $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
-            $gxRate = 1.0000;
-
-            // 计件产量计算逻辑
-            if (substr($value['sczl_jtbh'], 0, 2) == 'JP') {// 检品机
-                $gxRate = $value['sczl_废品率系数'] ?: 1;
-                $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
-                $byThePieceYield = round($value['班组车头产量'] * $gxRate);
-            } elseif (in_array(substr($value['sczl_jtbh'], 0, 2), ['WY', 'DW']) || in_array(substr($value['sczl_jtbh'], 0, 3), ['YWY', 'YDW'])) {// 凹印机
-                $gxRate = $this->calculateGxRate($value);
-                if (str_contains($value['印刷方式'], '张') && $value['版距'] > 0) {
-                    $value['版距'] = $value['版距'] / 1000;
-                    $value['班组车头产量'] = $value['班组车头产量'] * $value['版距'];
-                }
-                $byThePieceYield = str_replace(',', '', round($value['班组车头产量'] * floatval($gxRate)));
-            } else {// 其他设备
-                if (in_array($value['sczl_jtbh'], ['YSY02#', 'YSY08#', 'YSY10#', 'SY03#'])) {
-                    $num = 1.1;
-                }
-                $gxRate = $this->calculateGxRate($value);
-                $byThePieceYield = round($value['班组车头产量'] * floatval($gxRate) * $num);
-            }
-
-            // 补产产量/班组换算产量
-            $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
-            // 核算产量
-            $accountingYield = $byThePieceYield + $afterProductionYield;
-            // 工时占比
-            $manHourRate = $value['日定额'] > 0 ? number_format($accountingYield / $value['日定额'], 4) : '0.0000';
-
-            // 循环处理10个员工维度
-            for ($i = 1; $i < 11; $i++) {
-                $bhKey = 'sczl_bh' . $i;
-                $xmKey = 'name' . $i;
-                $rateKey = 'sczl_rate' . $i;
-                if (!empty($value[$bhKey]) && $value[$bhKey] != '0000') {
-                    $finalData[] = [
-                        'sczl_gdbh' => $value['sczl_gdbh'],
-                        'sczl_yjno' => $value['sczl_yjno'],
-                        'sczl_gxh' => $value['sczl_gxh'],
-                        'sczl_type' => $value['sczl_type'],
-                        'sczl_rq' => $value['sczl_rq'],
-                        'sczl_jtbh' => $value['sczl_jtbh'],
-                        '班组车头产量' => $value['班组车头产量'],
-                        '工价系数' => '0.0000',
-                        '工序难度系数' => $gxRate * $num,
-                        '装版工时' => $value['装版工时'],
-                        '保养工时' => $value['保养工时'],
-                        '打样工时' => $value['打样工时'],
-                        '异常停机工时' => $value['异常停机工时'],
-                        '车头产量占用机时' => $value['车头产量占用机时'],
-                        '日定额' => (int)$value['日定额'],
-                        '千件工价' => $value['千件工价'],
-                        '补产标准' => $value['补产标准'],
-                        '班组换算产量' => $afterProductionYield,
-                        '计时补差额工资' => '0.00',
-                        'bh' => $value[$bhKey],
-                        'xm' => $value[$xmKey],
-                        'Rate' => $value[$rateKey],
-                        'sczl_ms' => $value['sczl_ms'],
-                        '核算产量' => $accountingYield,
-                        '工时占比' => $manHourRate,
-                    ];
-                }
-            }
-        }
-    }
-
-    /**
-     * 处理拆片工序数据
-     * @param array $params 全局参数
-     * @param array &$finalData 最终数据容器(引用传递)
-     */
-    private function handleChipProcessData(array $params, array &$finalData)
-    {
-        $where = ['a.sczl_rq' => ['between', [$params['start_date'], $params['end_date']]]];
-
-        $list = 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 ($list as $value) {
-            $num = 1;
-            $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
-
-            if (in_array($value['sczl_jtbh'], ['YSY02#', 'YSY08#', 'YSY10#', 'SY03#'])) {
-                $num = 1.1;
-            }
-
-            $gxRate = $value['工序难度系数'] ?: 1.0000;
-            $byThePieceYield = round($value['班组车头产量'] * $gxRate * $num);
-            $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
-            $accountingYield = $byThePieceYield + $afterProductionYield;
-            $manHourRate = $value['日定额'] > 0 ? number_format($accountingYield / $value['日定额'], 4) : '0.0000';
-
-            $finalData[] = [
-                'sczl_gdbh' => $value['sczl_gdbh'],
-                'sczl_yjno' => $value['sczl_yjno'],
-                'sczl_gxh' => $value['sczl_gxh'],
-                'sczl_type' => $value['sczl_type'],
-                'sczl_rq' => $value['sczl_rq'],
-                'sczl_jtbh' => $value['sczl_jtbh'],
-                '班组车头产量' => $value['班组车头产量'],
-                '工价系数' => '0.0000',
-                '工序难度系数' => $gxRate * $num,
-                '装版工时' => $value['装版工时'],
-                '保养工时' => $value['保养工时'],
-                '打样工时' => $value['打样工时'],
-                '异常停机工时' => $value['异常停机工时'],
-                '车头产量占用机时' => $value['车头产量占用机时'],
-                '日定额' => (int)$value['日定额'],
-                '千件工价' => $value['千件工价'],
-                '补产标准' => $value['补产标准'],
-                '班组换算产量' => $afterProductionYield,
-                '计时补差额工资' => '0.00',
-                'bh' => $value['sczl_bh1'],
-                'xm' => $value['员工姓名'],
-                'Rate' => $value['sczl_rate1'],
-                'sczl_ms' => $value['sczl_ms'],
-                '核算产量' => $accountingYield,
-                '工时占比' => $manHourRate,
-            ];
-        }
-    }
-
-    /**
-     * 处理手工检验工序数据
-     * @param array $params 全局参数
-     * @param array &$finalData 最终数据容器(引用传递)
-     */
-    private function handleManualInspectionData(array $params, array &$finalData)
-    {
-        $where = ['a.sczl_rq' => ['between', [$params['start_date'], $params['end_date']]]];
-
-        $fields = "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";
-
-        $list = Db::name('db_手工检验')->alias('a')
-            ->field($fields)
-            ->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT')
-            ->where($where)
-            ->select();
-
-        // 循环连接人事表(原代码的循环join移到这里,避免SQL语法错误)
-        for ($i = 0; $i <= 12; $i++) {
-            $list = $this->joinStaffTable($list, $i);
-        }
-
-        foreach ($list as $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];
-
-                    $gxRate = $value['工序难度系数'] ?: 1.0000;
-                    $byThePieceYield = round($value['班组车头产量'] * $gxRate);
-                    $accountingYield = $byThePieceYield;
-                    $manHourRate = $value['日定额'] > 0 ? round($accountingYield / $value['日定额'], 4) : '0.0000';
-
-                    $finalData[] = [
-                        'sczl_gdbh' => $value['sczl_gdbh'],
-                        'sczl_yjno' => $value['sczl_yjno'],
-                        'sczl_gxh' => $value['sczl_gxh'],
-                        'sczl_type' => $value['sczl_type'],
-                        'sczl_rq' => $value['sczl_rq'],
-                        'sczl_jtbh' => '',
-                        '班组车头产量' => $value['班组车头产量'],
-                        '工价系数' => '0.0000',
-                        '工序难度系数' => $gxRate,
-                        '装版工时' => '0.00',
-                        '保养工时' => '0.00',
-                        '打样工时' => '0.00',
-                        '异常停机工时' => '0.00',
-                        '车头产量占用机时' => '0.00',
-                        '日定额' => (int)$value['日定额'],
-                        '千件工价' => $value['千件工价'],
-                        '补产标准' => $value['补产标准'],
-                        '班组换算产量' => '0',
-                        '计时补差额工资' => '0.00',
-                        'bh' => $value['sczl_bh' . $i],
-                        'xm' => $value['name' . $i],
-                        'Rate' => '1.0000',
-                        'sczl_ms' => '0.00',
-                        '核算产量' => $accountingYield,
-                        '工时占比' => $manHourRate,
-                    ];
-                }
-            }
-        }
-    }
-
-    /**
-     * 处理包装计件工序数据(补充原代码截断部分)
-     * @param array $params 全局参数
-     * @param array &$finalData 最终数据容器(引用传递)
-     */
-    private function handlePackagingPieceworkData(array $params, array &$finalData)
-    {
-        $where = ['a.sczl_rq' => ['between', [$params['start_date'], $params['end_date']]]];
-
-        $list = 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')
-            ->where($where)
-            ->select();
-
-        // 循环处理6个维度的包装数据
-        for ($i = 1; $i <= 6; $i++) {
-            foreach ($list as $value) {
-                $gdbhKey = 'sczl_gdbh' . $i;
-                $yjGxKey = 'sczl_yjGx' . $i;
-                $gxmcKey = 'gxmc' . $i;
-                $clKey = 'sczl_cl' . $i;
-                $reworkKey = 'sczl_返工产量' . $i;
-                $jtbhKey = 'sczl_Jtbh' . $i;
-                $dedhKey = 'sczl_dedh' . $i;
-
-                if (empty($value[$gdbhKey])) continue;
-
-                // 查询千件工价等配置
-                $lzdeData = Db::name('dic_lzde')->where('sys_bh', $value[$dedhKey])->find();
-                $dailyQuota = $lzdeData['日定额'] ?? 0;
-                $piecePrice = $lzdeData['千件工价'] ?? 0;
-                $supplementStandard = $lzdeData['补产标准'] ?? 0;
-
-                // 产量计算(含返工产量)
-                $totalYield = $value[$clKey] + $value[$reworkKey];
-                $accountingYield = $totalYield;
-                $manHourRate = $dailyQuota > 0 ? number_format($accountingYield / $dailyQuota, 4) : '0.0000';
-
-                $finalData[] = [
-                    'sczl_gdbh' => $value[$gdbhKey],
-                    'sczl_yjno' => (int)substr($value[$yjGxKey], 0, 2) ?: 0,
-                    'sczl_gxh' => (int)substr($value[$yjGxKey], 3, 2) ?: 0,
-                    'sczl_type' => $value[$gxmcKey],
-                    'sczl_rq' => $params['start_date'], // 可根据实际业务调整
-                    'sczl_jtbh' => $value[$jtbhKey] ?? '',
-                    '班组车头产量' => $totalYield,
-                    '工价系数' => '0.0000',
-                    '工序难度系数' => 1.0000,
-                    '装版工时' => '0.00',
-                    '保养工时' => '0.00',
-                    '打样工时' => '0.00',
-                    '异常停机工时' => '0.00',
-                    '车头产量占用机时' => '0.00',
-                    '日定额' => (int)$dailyQuota,
-                    '千件工价' => $piecePrice,
-                    '补产标准' => $supplementStandard,
-                    '班组换算产量' => '0',
-                    '计时补差额工资' => '0.00',
-                    'bh' => '', // 包装工序员工编号需根据实际业务补充
-                    'xm' => '', // 包装工序员工姓名需根据实际业务补充
-                    'Rate' => '1.0000',
-                    'sczl_ms' => '包装计件',
-                    '核算产量' => $accountingYield,
-                    '工时占比' => $manHourRate,
-                ];
-            }
-        }
-    }
-
-    /**
-     * 计算工序难度系数
-     * @param array $value 单条数据
-     * @return float
-     */
-    private function calculateGxRate(array $value): float
-    {
-        $sczlRate = $value['sczl_工价系数'] ?: 0;
-        $processRate = $value['工序难度系数'] ?: 0;
-
-        if ($sczlRate <= 0) {
-            return $processRate > 0 ? $processRate : 1.0000;
-        }
-
-        return $processRate > 0 ? number_format($sczlRate * $processRate, 3) : $sczlRate;
-    }
-
-    /**
-     * 手动连接人事表数据(替代原SQL循环join,避免语法错误)
-     * @param array $list 原查询结果
-     * @param int $i 员工索引
-     * @return array
-     */
-    private function joinStaffTable(array $list, int $i): array
-    {
-        $staffData = Db::name('人事_基本资料')->column('员工姓名', '员工编号');
-        foreach ($list as &$item) {
-            $bhKey = 'sczl_bh' . $i;
-            $xmKey = 'name' . $i;
-            $item[$xmKey] = $staffData[$item[$bhKey]] ?? '';
-        }
-        return $list;
-    }
-}