소스 검색

工资计算优化

unknown 1 개월 전
부모
커밋
3823ae2e1c
2개의 변경된 파일481개의 추가작업 그리고 515개의 파일을 삭제
  1. 17 102
      application/api/controller/StaffSalary.php
  2. 464 413
      application/service/SalaryCalculationService.php

+ 17 - 102
application/api/controller/StaffSalary.php

@@ -1,15 +1,15 @@
 <?php
 <?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;
-//
+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 app\common\controller\Api;
 //use \think\Request;
 //use \think\Request;
 //use think\Db;
 //use think\Db;
@@ -628,101 +628,16 @@
 //
 //
 //        // 检查任务是否已经存在于队列中,如果不存在则推送任务到队列
 //        // 检查任务是否已经存在于队列中,如果不存在则推送任务到队列
 //        if (!$redis->has($taskIdentifier)) {
 //        if (!$redis->has($taskIdentifier)) {
-//
-//            // 在提交队列任务前,先记录到任务表
-//            $taskData = [
-//                'date' => $params['date'],
-//                'start_date' => $startDate,
-//                'end_date' => $endDate,
-//                'sys_id' => $params['sys_id'] ?? '',
-//                'user_id' => session('user_id') ?? 0,
-//                'user_name' => session('user_name') ?? '系统',
-//                'request_time' => date('Y-m-d H:i:s')
-//            ];
-//
-//            $taskId = Db::name('queue_tasks')->insertGetId([
-//                'task_type' => 'salary_calculation',
-//                'task_data' => json_encode($taskData, JSON_UNESCAPED_UNICODE),
-//                'status' => 'pending',
-//                'queue_name' => 'salary_calculation',
-//                'create_time' => date('Y-m-d H:i:s')
-//            ]);
-//
-//            // 将任务ID添加到任务数据中
-//            $taskData['task_id'] = $taskId;
-//
-//            // 提交任务到工资计算队列
-//            $job = new InsertDataJob($data);
-//
-//            // 修改:使用工资计算队列名称
-//            $queueResult = Queue::push($job, $taskData, 'salary_calculation');
-//
-//            if ($queueResult !== false) {
-//                // 更新任务记录
-//                Db::name('queue_tasks')
-//                    ->where('id', $taskId)
-//                    ->update([
-//                        'job_id' => $queueResult,
-//                        'update_time' => date('Y-m-d H:i:s')
-//                    ]);
-//
-//                $redis->set($taskIdentifier, true);
-//                $this->success('数据正在处理中,请等待...');
-//            }
-////            $job = new InsertDataJob($data); // 创建任务实例
-////            // 推送任务到队列
-////            Queue::push($job,'','default'); // 推送任务到队列
-////            // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍
-////            $redis->set($taskIdentifier, true);
-////            $this->success('数据正在处理中,请等待...');
+//            $job = new InsertDataJob($data); // 创建任务实例
+//            // 推送任务到队列
+//            Queue::push($job,'','default'); // 推送任务到队列
+//            // 设置任务的标识符到缓存中,并设置有效期,有效期为队列执行时间的两倍
+//            $redis->set($taskIdentifier, true);
+//            $this->success('数据正在处理中,请等待...');
 //        }
 //        }
 //    }
 //    }
 //
 //
 //
 //
-//    /**
-//     * 新增:查询工资计算任务状态
-//     * @ApiMethod GET
-//     */
-//    public function salaryStatus()
-//    {
-//        $date = Request::instance()->param('date');
-//
-//        if (empty($date)) {
-//            $this->error('月份参数错误');
-//        }
-//
-//        $task = Db::name('queue_tasks')
-//            ->where('task_type', 'salary_calculation')
-//            ->where('task_data', 'like', '%"date":"' . $date . '"%')
-//            ->order('id', 'desc')
-//            ->find();
-//
-//        if ($task) {
-//            $taskData = json_decode($task['task_data'] ?? '{}', true);
-//            $result = json_decode($task['result'] ?? '{}', true);
-//
-//            $this->success('查询成功', null, [
-//                'exists' => true,
-//                'task_id' => $task['id'],
-//                'date' => $date,
-//                'status' => $task['status'],
-//                'queue_name' => $task['queue_name'],
-//                'job_id' => $task['job_id'],
-//                'start_time' => $task['start_time'],
-//                'end_time' => $task['end_time'],
-//                'retry_count' => $task['retry_count'],
-//                'result' => $result,
-//                'error' => $task['error'] ?? '',
-//                'create_time' => $task['create_time'],
-//                'user_info' => [
-//                    'user_id' => $taskData['user_id'] ?? 0,
-//                    'user_name' => $taskData['user_name'] ?? ''
-//                ]
-//            ]);
-//        } else {
-//            $this->success('查询成功', null, ['exists' => false, 'date' => $date]);
-//        }
-//    }
 //}
 //}
 
 
 
 

+ 464 - 413
application/service/SalaryCalculationService.php

@@ -17,483 +17,533 @@ class SalaryCalculationService
      */
      */
     public function calculateSalary(array $params): array
     public function calculateSalary(array $params): array
     {
     {
-        try {
-            Log::info('开始执行工资计算', $params);
-
-            // 参数验证
-            $this->validateParams($params);
-
-            $startDate = $params['start_date'];
-            $endDate = $params['end_date'];
-            $attendanceMonth = $params['date'];
-            $sysId = $params['sys_id'] ?? '';
-
-            // 1. 获取法定天数
-            $legalDays = $this->getLegalDays($attendanceMonth);
-            $params['days'] = $legalDays;
-
-            // 2. 获取节假日数据
-            $holidayData = $this->getHolidayData($params);
-
-            // 3. 删除原有数据
-            $this->clearOldData($startDate, $endDate);
-
-            // 4. 查询并处理各个数据源
-            $allData = [];
-
-            // 4.1 处理设备_产量计酬数据
-            $machineData = $this->processMachineData($params, $startDate, $endDate, $holidayData);
-            $allData = array_merge($allData, $machineData);
-
-            // 4.2 处理拆片工序数据
-            $splitData = $this->processSplitData($params, $startDate, $endDate, $holidayData);
-            $allData = array_merge($allData, $splitData);
-
-            // 4.3 处理手工检验数据
-            $manualData = $this->processManualData($params, $startDate, $endDate);
-            $allData = array_merge($allData, $manualData);
-
-            // 4.4 处理包装计件数据
-            $packagingData = $this->processPackagingData($params, $startDate, $endDate);
-            $allData = array_merge($allData, $packagingData);
-
-            // 5. 计算工时占比和工资
-            $calculatedData = $this->calculateWorkHoursAndWages($allData, $legalDays, $holidayData);
-
-            // 6. 保存数据到数据库
-            $insertCount = $this->saveSalaryData($calculatedData);
-
-            Log::info('工资计算完成', [
-                'month' => $attendanceMonth,
-                'total_records' => count($calculatedData),
-                'insert_count' => $insertCount
-            ]);
-
-            return [
-                'success' => true,
-                'message' => '工资计算完成',
-                'data' => [
-                    'month' => $attendanceMonth,
-                    'total_records' => count($calculatedData),
-                    'insert_count' => $insertCount,
-                    'start_date' => $startDate,
-                    'end_date' => $endDate
-                ]
-            ];
-
-        } catch (Exception $e) {
-            Log::error('工资计算失败: ' . $e->getMessage());
-            return [
-                'success' => false,
-                'message' => '工资计算失败: ' . $e->getMessage()
-            ];
-        }
-    }
-
-    /**
-     * 参数验证
-     */
-    protected function validateParams(array $params): void
-    {
-        if (empty($params['date']) || empty($params['start_date']) || empty($params['end_date'])) {
-            throw new Exception('参数错误:日期参数不能为空');
-        }
-
+        $startDate = $params['start_date'];
+        $endDate = $params['end_date'];
+        $attendanceMonth = $params['date'];
         // 确保开始日期和结束日期在考勤年月的范围内
         // 确保开始日期和结束日期在考勤年月的范围内
-        $startDateInRange = date('Ym', strtotime($params['start_date'])) === $params['date'];
-        $endDateInRange = date('Ym', strtotime($params['end_date'])) === $params['date'];
-
+        $startDateInRange = date('Ym', strtotime($startDate)) === $attendanceMonth;
+        $endDateInRange = date('Ym', strtotime($endDate)) === $attendanceMonth;
         if (!$startDateInRange || !$endDateInRange) {
         if (!$startDateInRange || !$endDateInRange) {
-            throw new Exception('日期参数错误:开始日期或结束日期不在考勤月份内');
-        }
-    }
-
-    /**
-     * 获取法定天数
-     */
-    protected function getLegalDays(string $month): int
-    {
-        $clockingInDay = Db::name('人事_考勤资料')
-            ->where('kqzl_ny', $month)
-            ->field('法定天数')
-            ->order('UniqId desc')
-            ->find();
-
-        if (empty($clockingInDay)) {
-            throw new Exception('未找到该月的法定天数设置');
+            $this->error('日期参数错误');
         }
         }
-
-        return (int)$clockingInDay['法定天数'];
-    }
-
-    /**
-     * 获取节假日数据
-     */
-    protected function getHolidayData(array $params): array
-    {
-        $holidayData = [
-            'vacation_one' => [],
-            'vacation_two' => []
-        ];
-
-        // 处理法定假日1
+        $vacationOneArr = [];
         if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])) {
         if (!empty($params['vacation_one_start']) && !empty($params['vacation_one_end'])) {
             $vacationOneStart = strtotime($params['vacation_one_start']);
             $vacationOneStart = strtotime($params['vacation_one_start']);
             $vacationOneEnd = strtotime($params['vacation_one_end']);
             $vacationOneEnd = strtotime($params['vacation_one_end']);
-
             for ($i = $vacationOneStart; $i <= $vacationOneEnd; $i += 86400) {
             for ($i = $vacationOneStart; $i <= $vacationOneEnd; $i += 86400) {
-                $holidayData['vacation_one'][] = date("Y-m-d", $i);
+                array_push($vacationOneArr, date("Y-m-d", $i));
             }
             }
         }
         }
-
-        // 处理法定假日2
+        $vacationTwoArr = [];
         if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])) {
         if (!empty($params['vacation_two_start']) && !empty($params['vacation_two_end'])) {
             $vacationTwoStart = strtotime($params['vacation_two_start']);
             $vacationTwoStart = strtotime($params['vacation_two_start']);
             $vacationTwoEnd = strtotime($params['vacation_two_end']);
             $vacationTwoEnd = strtotime($params['vacation_two_end']);
-
             for ($i = $vacationTwoStart; $i <= $vacationTwoEnd; $i += 86400) {
             for ($i = $vacationTwoStart; $i <= $vacationTwoEnd; $i += 86400) {
-                $holidayData['vacation_two'][] = date("Y-m-d", $i);
+                array_push($vacationTwoArr, date("Y-m-d", $i));
             }
             }
         }
         }
-
-        return $holidayData;
-    }
-
-    /**
-     * 清除旧数据
-     */
-    protected function clearOldData(string $startDate, string $endDate): int
-    {
-        return Db::name('绩效工资汇总')
-            ->where('sczl_rq', 'between', [$startDate, $endDate])
-            ->delete();
-    }
-
-    /**
-     * 处理设备产量计酬数据
-     */
-    protected function processMachineData(array $params, string $startDate, string $endDate, array $holidayData): array
-    {
-        $where = ['a.sczl_rq' => ['between', [$startDate, $endDate]]];
-
-        // 查询印刷印后车间的机台
+        //法定天数
+        $clocking_in_day = \db('人事_考勤资料')->where('kqzl_ny', $params['date'])->field('法定天数')->order('UniqId desc')->find();
+        //将起止日期内数据删除
+        $delRes = \db('绩效工资汇总')->where('sczl_rq', 'between', [$startDate, $endDate])->delete();
+        //设备产量计酬报工数据查询
+        $where = [];
+        $where['a.sczl_rq'] = ['between', [$startDate, $endDate]];
+        //查询印刷印后车间的机台,添加搜索条件
         $sist = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
         $sist = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
-        $jtbhs = Db::name('设备_基本资料')
+        $jtbhs = db('设备_基本资料')
             ->where('sys_sbID', '<>', '')
             ->where('sys_sbID', '<>', '')
             ->where('使用部门', 'in', $sist)
             ->where('使用部门', 'in', $sist)
             ->column('设备编号');
             ->column('设备编号');
-
-        if (empty($jtbhs)) {
-            return [];
-        }
-
-        $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 车头产量占用机时,
+        $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_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_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,
                 a.sczl_废品率系数,a.UniqId,
                 b.千件工价,b.日定额,b.补产标准,c.工价系数 as 工序难度系数,c.版距,c.印刷方式
                 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
                 ,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";
                 ,d9.员工姓名 as name9,d10.员工姓名 as name10";
-
         $query = Db::name('设备_产量计酬')->alias('a')->field($fields);
         $query = Db::name('设备_产量计酬')->alias('a')->field($fields);
+        // 连接 dic_lzde 表
         $query->join('dic_lzde b', 'a.sczl_dedh = b.sys_bh', 'LEFT');
         $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');
         $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++) {
         for ($i = 1; $i <= 10; $i++) {
             $field = 'a.sczl_bh' . $i;
             $field = 'a.sczl_bh' . $i;
             $alias = 'd' . $i;
             $alias = 'd' . $i;
             $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
             $query->join("人事_基本资料 $alias", "$field = {$alias}.员工编号 AND {$field} IS NOT NULL", 'LEFT');
         }
         }
-
-        $list = $query->where($where)
-            ->where('a.sczl_jtbh', 'in', $jtbhs)
-            ->order('a.sczl_rq')
-            ->group('UniqId')
-            ->select();
-
-        $data = [];
-        foreach ($list as $value) {
-            $data = array_merge($data, $this->processMachineItem($value, $holidayData));
+        $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;
         }
         }
-
-        return $data;
-    }
-
-    /**
-     * 处理单个设备产量计酬项
-     */
-    protected function processMachineItem(array $item, array $holidayData): array
-    {
-        $item['班组车头产量'] = $item['班组车头产量'] - $item['sczl_zcfp'];
-
-        // 计算工序难度系数
-        $gxRate = $this->calculateProcessDifficulty($item);
-
-        // 调整产量(根据机台类型)
-        $adjustedOutput = $this->adjustOutputByMachine($item, $gxRate);
-
-        // 计算计件产量
-        $byThePieceYield = $this->calculatePieceYield($item, $adjustedOutput, $gxRate);
-
-        // 补产产量
-        $afterProductionYield = $this->calculateSupplementYield($item);
-
         $data = [];
         $data = [];
-        for ($i = 1; $i < 11; $i++) {
-            $bhKey = 'sczl_bh' . $i;
-            $xmKey = 'name' . $i;
-            $rateKey = 'sczl_rate' . $i;
-
-            if (!empty($item[$bhKey]) && $item[$bhKey] != '0000') {
-                $dataItem = $this->buildDataItem($item, [
-                    'bh' => $item[$bhKey],
-                    'xm' => $item[$xmKey],
-                    'Rate' => $item[$rateKey],
-                    '工序难度系数' => $gxRate,
-                    '班组车头产量' => $adjustedOutput,
-                    '班组换算产量' => $afterProductionYield,
-                    '计件产量' => $byThePieceYield
-                ]);
+        /**
+         * 设备_产量计酬数据
+         */
+        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 = 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);
 
 
-                $data[] = $dataItem;
             }
             }
-        }
-
-        return $data;
-    }
-
-    /**
-     * 计算工序难度系数
-     */
-    protected function calculateProcessDifficulty(array $item): float
-    {
-        $machineType = substr($item['sczl_jtbh'], 0, 2);
 
 
-        if ($machineType == 'JP') { // 检品机
-            return $item['sczl_废品率系数'] == 0 ? 1.0 : (float)$item['sczl_废品率系数'];
-        } elseif ($machineType == 'WY' || $machineType == 'DW' ||
-            substr($item['sczl_jtbh'], 0, 3) == 'YWY' ||
-            substr($item['sczl_jtbh'], 0, 3) == 'YDW') { // 凹印机
-            if ($item['sczl_工价系数'] == '0.000' || floatval($item['sczl_工价系数']) <= 0) {
-                $gxRate = $item['工序难度系数'];
-                return (floatval($item['工序难度系数']) <= 0 || empty($item['工序难度系数'])) ? 1.0 : (float)$item['工序难度系数'];
+            //补产产量/班组换算产量
+            $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
+            //核算产量
+            $accountingYield = $byThePieceYield + $afterProductionYield;
+            //工时占比
+            if ($value['日定额'] > 0) {
+                $manHourRate = number_format($accountingYield / $value['日定额'], 4);
             } else {
             } else {
-                if (floatval($item['工序难度系数']) > 0) {
-                    return (float)number_format($item['sczl_工价系数'] * $item['工序难度系数'], 3);
-                } else {
-                    return (float)$item['sczl_工价系数'];
+                $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'] = $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);
                 }
                 }
             }
             }
-        } else { // 其他机台
+        }
+        /**
+         * 拆片工序数据
+         */
+        $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;
             $num = 1;
-            if ($item['sczl_jtbh'] === 'YSY02#' || $item['sczl_jtbh'] === 'YSY08#' ||
-                $item['sczl_jtbh'] === 'YSY10#' || $item['sczl_jtbh'] === 'SY03#') {
+            $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;
                 $num = 1.1;
             }
             }
-
-            if ($item['sczl_工价系数'] == '0.000' || floatval($item['sczl_工价系数']) <= 0) {
-                $gxRate = $item['工序难度系数'];
-                $baseRate = (floatval($item['工序难度系数']) <= 0 || empty($item['工序难度系数'])) ? 1.0 : (float)$item['工序难度系数'];
-                return $baseRate * $num;
+            if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])) {
+                $value['工序难度系数'] = '1.0000';
+                $byThePieceYield = $value['班组车头产量'];
             } else {
             } else {
-                if (floatval($item['工序难度系数']) > 0) {
-                    return (float)number_format($item['sczl_工价系数'] * $item['工序难度系数'] * $num, 3);
-                } else {
-                    return (float)$item['sczl_工价系数'] * $num;
-                }
+                $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'] = $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);
         }
         }
-    }
-
-    /**
-     * 根据机台类型调整产量
-     */
-    protected function adjustOutputByMachine(array $item, float $gxRate): float
-    {
-        $output = $item['班组车头产量'];
-        $machineType = substr($item['sczl_jtbh'], 0, 2);
-
-        if ($machineType == 'JP') { // 检品机
-            $output = $output * $item['sczl_Pgcl'];
-        } elseif (($machineType == 'WY' || $machineType == 'DW' ||
-                substr($item['sczl_jtbh'], 0, 3) == 'YWY' ||
-                substr($item['sczl_jtbh'], 0, 3) == 'YDW') &&
-            str_contains($item['印刷方式'], '张') &&
-            $item['版距'] > 0) { // 凹印机且是张式印刷
-            $output = $output * ($item['版距'] / 1000);
+        /**
+         * 手工检验工序数据
+         */
+        $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');
         }
         }
-
-        return (float)$output;
-    }
-
-    /**
-     * 计算计件产量
-     */
-    protected function calculatePieceYield(array $item, float $output, float $gxRate): float
-    {
-        $machineType = substr($item['sczl_jtbh'], 0, 2);
-
-        if ($machineType == 'JP') {
-            return round($output * $item['sczl_废品率系数']);
-        } elseif ($machineType == 'WY' || $machineType == 'DW' ||
-            substr($item['sczl_jtbh'], 0, 3) == 'YWY' ||
-            substr($item['sczl_jtbh'], 0, 3) == 'YDW') {
-            return str_replace(',', '', round($output * $gxRate));
-        } else {
-            return round($output * $gxRate);
+        $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'] = $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);
+                }
+            }
         }
         }
-    }
-
-    /**
-     * 计算补产产量
-     */
-    protected function calculateSupplementYield(array $item): float
-    {
-        $totalHours = (float)($item['装版工时'] + $item['保养工时'] + $item['打样工时']);
-        $supplementStandard = (float)$item['补产标准'];
-
-        return $totalHours * $supplementStandard;
-    }
-
-    /**
-     * 构建数据项
-     */
-    protected function buildDataItem(array $baseData, array $additionalData): array
-    {
-        $now = date('Y-m-d H:i:s');
-
-        return array_merge([
-            'sczl_gdbh' => $baseData['sczl_gdbh'],
-            'sczl_yjno' => $baseData['sczl_yjno'],
-            'sczl_gxh' => $baseData['sczl_gxh'],
-            'sczl_type' => $baseData['sczl_type'],
-            'sczl_rq' => $baseData['sczl_rq'],
-            'sczl_jtbh' => $baseData['sczl_jtbh'],
-            '班组车头产量' => 0,
-            '工价系数' => '0.0000',
-            '工序难度系数' => 1.0,
-            '装版工时' => $baseData['装版工时'],
-            '保养工时' => $baseData['保养工时'],
-            '打样工时' => $baseData['打样工时'],
-            '异常停机工时' => $baseData['异常停机工时'],
-            '车头产量占用机时' => $baseData['车头产量占用机时'],
-            '日定额' => (int)$baseData['日定额'],
-            '千件工价' => $baseData['千件工价'],
-            '补产标准' => $baseData['补产标准'],
-            '班组换算产量' => 0,
-            '计时补差额工资' => '0.00',
-            'bh' => '',
-            'xm' => '',
-            'Rate' => '1.0000',
-            'sczl_ms' => $baseData['sczl_ms'],
-            '工时占比' => 0,
-            '达标定额' => 0,
-            '个人计件工资' => 0,
-            '个人加班工资' => 0,
-            'UniqID' => 0,
-            'sys_ny' => '',
-            'sys_rq' => $now,
-            'sys_id' => '',
-            '法定天数' => 0,
-            '核算产量' => 0,
-        ], $additionalData);
-    }
-
-    /**
-     * 处理拆片工序数据(简略实现)
-     */
-    protected function processSplitData(array $params, string $startDate, string $endDate, array $holidayData): array
-    {
-        // 简略实现,您可以根据原有逻辑完善
-        return [];
-    }
-
-    /**
-     * 处理手工检验数据(简略实现)
-     */
-    protected function processManualData(array $params, string $startDate, string $endDate): array
-    {
-        // 简略实现,您可以根据原有逻辑完善
-        return [];
-    }
+        /**
+         * 包装计件工序数据
+         */
+        $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();
 
 
-    /**
-     * 处理包装计件数据(简略实现)
-     */
-    protected function processPackagingData(array $params, string $startDate, string $endDate): array
-    {
-        // 简略实现,您可以根据原有逻辑完善
-        return [];
-    }
+        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'] = $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);
+                    }
 
 
-    /**
-     * 计算工时占比和工资
-     */
-    protected function calculateWorkHoursAndWages(array $data, int $legalDays, array $holidayData): array
-    {
-        // 1. 按人员和日期分组计算工时占比总和
+                }
+            }
+        }
+        //用于存储bh对应的工时占比总和
         $bhTotals = [];
         $bhTotals = [];
+        // 遍历原始数据
         foreach ($data as $row) {
         foreach ($data as $row) {
-            $dateKey = substr($row['sczl_rq'], 0, 10);
-            $bhKey = $dateKey . '-' . $row['bh'];
-
-            if (!isset($bhTotals[$bhKey])) {
-                $bhTotals[$bhKey] = 0;
-            }
-
-            // 计算核算产量
-            $accountingYield = $row['计件产量'] + $row['班组换算产量'];
-            $row['核算产量'] = $accountingYield;
-
-            // 计算工时占比
-            if ($row['日定额'] > 0) {
-                $row['工时占比'] = (float)number_format($accountingYield / $row['日定额'], 4);
-            } else {
-                $row['工时占比'] = 0;
+            $bh = substr($row['sczl_rq'], 0, 10) . '-' . $row['bh'];
+            // 初始化bh对应的工时占比总和为0
+            if (!isset($bhTotals[$bh])) {
+                $bhTotals[$bh] = 0;
             }
             }
-
-            $bhTotals[$bhKey] += $row['工时占比'];
-            $data[$row['_index']]['工时占比'] = $row['工时占比'];
-            $data[$row['_index']]['核算产量'] = $accountingYield;
+            // 将工时占比相加
+            $bhTotals[$bh] += floatval($row['工时占比']);
         }
         }
-
-        // 2. 计算工资
-        $result = [];
-        foreach ($data as $row) {
-            $dateKey = substr($row['sczl_rq'], 0, 10);
-            $bhKey = $dateKey . '-' . $row['bh'];
-
-            // 计算达标定额
-            if ($row['工时占比'] > 0 && isset($bhTotals[$bhKey]) && $bhTotals[$bhKey] > 0) {
-                $standardQuota = (float)number_format($row['工时占比'] / $bhTotals[$bhKey] * $row['日定额'], 2);
+        //用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 {
             } else {
-                $standardQuota = (float)$row['班组车头产量'];
+                if (in_array($item['sczl_rq'], $days[$day_bh]) == false) {
+                    array_push($days[$day_bh], $item['sczl_rq']);
+                }
             }
             }
-            $row['达标定额'] = $standardQuota;
-
-            // 判断是否是节假日
-            $isHoliday = in_array($dateKey, $holidayData['vacation_one']) ||
-                in_array($dateKey, $holidayData['vacation_two']);
-
-            // 计算工资
-            if ($isHoliday) {
-                $row['个人计件工资'] = 0;
-                $row['个人加班工资'] = $row['核算产量'] / 1000 * $row['千件工价'] * $row['Rate'] * 3;
+            $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 {
             } else {
-                // 这里需要根据原有的逻辑计算(您可以根据需要完善)
-                $row['个人计件工资'] = $standardQuota / 1000 * $row['千件工价'] * $row['Rate'];
-                $row['个人加班工资'] = ($row['核算产量'] - $standardQuota) / 1000 * $row['千件工价'] * $row['Rate'] * 1.5;
+                $data[$key]['达标定额'] = number_format($item['班组车头产量'], 2, '.', '');
             }
             }
+            $date = substr($item['sczl_rq'], 0, 10);
+            if (in_array($date, $vacationOneArr) || in_array($date, $vacationTwoArr)) {
+                //计件工资
+                $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 {
+                // 基础计件工资计算公式
+                $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;
+                    }
+                }
+                // 统一计算加班工资(所有情况都会计算)
 
 
-            $result[] = $row;
+                $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']);
         }
         }
 
 
-        return $result;
+        $result = $this->calculateSalary($data);
+        return [
+            'success' => true,
+            'message' => '工资计算完成',
+            'data' => [
+                'month' => $attendanceMonth,
+                'insert_count' => count($data),
+                'start_date' => $startDate,
+                'end_date' => $endDate
+            ]
+        ];
     }
     }
 
 
+
+
+
     /**
     /**
      * 保存工资数据
      * 保存工资数据
      */
      */
@@ -555,4 +605,5 @@ class SalaryCalculationService
 
 
         return $result ? count($insertData) : 0;
         return $result ? count($insertData) : 0;
     }
     }
+
 }
 }