unknown 1 месяц назад
Родитель
Сommit
49cf6c2e2f

+ 60 - 166
application/api/controller/StaffSalary.php

@@ -643,200 +643,94 @@ namespace app\api\controller;
 
 
 namespace app\api\controller;
 namespace app\api\controller;
 
 
-use app\common\controller\Api;
-use think\Request;
 use think\Db;
 use think\Db;
-use think\Queue;
 use think\Log;
 use think\Log;
+use think\Queue;
+use think\Request;
+use think\cache\driver\Redis;
+use app\common\controller\Api;
 
 
+/**
+ * 员工计件工资核算
+ */
 class StaffSalary extends Api
 class StaffSalary extends Api
 {
 {
     protected $noNeedLogin = ['*'];
     protected $noNeedLogin = ['*'];
     protected $noNeedRight = ['*'];
     protected $noNeedRight = ['*'];
 
 
     /**
     /**
-     * 计算员工计件工资(队列版本)
+     * 计算员工计件工资(投递队列)
+     * @ApiMethod POST
      */
      */
     public function staffSalaryCount()
     public function staffSalaryCount()
     {
     {
-        if (Request::instance()->isPost() == false) {
-            $this->error('非法请求');
+        $request = Request::instance();
+        if (!$request->isPost()) {
+            $this->error('非法请求方式');
         }
         }
 
 
-        $params = Request::instance()->param();
-
-        $params = $this->cleanParams($params);
-        // 基础参数验证
-        $requiredParams = ['date', 'start_date', 'end_date'];
-        foreach ($requiredParams as $param) {
-            if (empty($params[$param])) {
-                $this->error("{$param}参数不能为空");
+        $params = $request->param();
+        // 1. 参数校验
+        $required = ['start_date', 'end_date', 'date'];
+        foreach ($required as $field) {
+            if (empty($params[$field])) {
+                $this->error("参数错误:{$field}不能为空");
             }
             }
         }
         }
 
 
-        $month = trim($params['date']);
-
-        // 检查是否有正在执行的任务
-        $runningTask = Db::name('queue_tasks')
-            ->where('task_type', 'salary_calculation')
-            ->where('task_data', 'like', '%"date":"' . $month . '"%')
-            ->where('status', 'in', ['pending', 'processing'])
-            ->find();
-
-        if ($runningTask) {
-            $this->success('该月份的工资计算任务已在执行中,请稍后查看结果');
+        // 2. 日期范围校验
+        $attendanceMonth = $params['date'];
+        $startDateInRange = date('Ym', strtotime($params['start_date'])) === $attendanceMonth;
+        $endDateInRange = date('Ym', strtotime($params['end_date'])) === $attendanceMonth;
+        if (!$startDateInRange || !$endDateInRange) {
+            $this->error('开始/结束日期必须在考勤年月范围内');
         }
         }
 
 
-        // 准备队列任务数据(确保是简单数组)
-        $taskData = [
-            'date' => $month,
-            'start_date' => trim($params['start_date']),
-            'end_date' => trim($params['end_date']),
-            'sys_id' => $params['sys_id'] ?? '',
-            'vacation_one_start' => $params['vacation_one_start'] ?? '',
-            'vacation_one_end' => $params['vacation_one_end'] ?? '',
-            'vacation_two_start' => $params['vacation_two_start'] ?? '',
-            'vacation_two_end' => $params['vacation_two_end'] ?? '',
-            'user_id' => session('user_id') ?? 0,
-            'user_name' => session('user_name') ?? '系统',
-            'request_time' => date('Y-m-d H:i:s')
+        // 3. Redis防重复提交锁
+        $redisConfig = [
+            'host'       => '127.0.0.1',
+            'port'       => 6379,
+            'password'   => '123456',
+            'select'     => 15,
+            'timeout'    => 0,
+            'persistent' => false,
+            'prefix'     => '',
         ];
         ];
-
-
-        try {
-            // 先创建任务记录
-            $taskId = Db::name('queue_tasks')->insertGetId([
-                'task_type' => 'salary_calculation',
-                'task_data' => json_encode($taskData, JSON_UNESCAPED_UNICODE),
-                'status' => 'pending',
-                'queue_name' => 'salary_calculation',
-                'create_time' => date('Y-m-d H:i:s')
-            ]);
-
-            // 添加到任务数据中
-            $taskData['task_id'] = $taskId;
-
-            // 提交到工资计算队列 - 使用正确的队列调用方式
-            $jobHandlerClassName = 'app\job\InsertDataJob';
-            $queueName = 'salary_calculation';
-
-
-            $jobId = Queue::push($jobHandlerClassName, $taskData, $queueName);
-
-
-            if ($jobId !== false) {
-                // 更新任务记录
-                Db::name('queue_tasks')
-                    ->where('id', $taskId)
-                    ->update([
-                        'job_id' => $jobId,
-                        'update_time' => date('Y-m-d H:i:s')
-                    ]);
-
-                $this->success('工资计算任务已提交,正在后台处理...', null, [
-                    'task_id' => $taskId,
-                    'job_id' => $jobId,
-                    'month' => $month,
-                    'queue_name' => $queueName,
-                    'submit_time' => date('Y-m-d H:i:s')
-                ]);
-            } else {
-                throw new \Exception('队列提交返回false');
-            }
-
-        } catch (\Exception $e) {
-
-            // 如果创建了任务记录但提交失败,更新状态
-            if (isset($taskId)) {
-                Db::name('queue_tasks')
-                    ->where('id', $taskId)
-                    ->update([
-                        'status' => 'failed',
-                        'error' => '任务提交失败: ' . $e->getMessage(),
-                        'update_time' => date('Y-m-d H:i:s')
-                    ]);
-            }
-
-            $this->error('工资计算任务提交失败: ' . $e->getMessage());
+        $redis = new Redis($redisConfig);
+        $taskIdentifier = md5('salary_calculation_' . json_encode($params));
+        if ($redis->has($taskIdentifier)) {
+            $this->success('数据正在处理中,请稍后查询');
         }
         }
-    }
-
-    protected function cleanParams(array $params): array
-    {
-        $cleanParams = [];
-
-        foreach ($params as $key => $value) {
-            if (is_string($value)) {
-                // 去除首尾空格
-                $value = trim($value);
-
-                // 处理 sys_id 中的特殊字符
-                if ($key === 'sys_id') {
-                    // 替换斜杠为下划线
-                    $value = str_replace('/', '_', $value);
-                    // 替换其他可能的问题字符
-                    $value = preg_replace('/[^\w\-\.]/u', '_', $value);
-                }
 
 
-                $cleanParams[$key] = $value;
-            } else {
-                $cleanParams[$key] = $value;
-            }
+        // 4. 创建数据库任务记录
+        $taskId = Db::name('queue_tasks')->insertGetId([
+            'task_name' => 'salary_calculation',
+            'status' => 'pending',
+            'params' => 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('创建任务记录失败');
         }
         }
 
 
-        return $cleanParams;
-    }
+        // 5. 设置Redis锁(2小时过期,防止死锁)
+        $redis->set($taskIdentifier, $taskId, 7200);
 
 
-    /**
-     * 查询工资计算状态
-     */
-    public function salaryStatus()
-    {
-        $date = Request::instance()->param('date');
+        // 6. 投递队列任务
+        $queueData = array_merge($params, ['task_id' => $taskId]);
+        $queueResult = Queue::push('app\job\InsertDataJob@fire', $queueData, 'salary_calculation');
 
 
-        if (empty($date)) {
-            $this->error('月份参数错误');
+        if (!$queueResult) {
+            // 投递失败,回滚任务记录和Redis锁
+            Db::name('queue_tasks')->where('id', $taskId)->delete();
+            $redis->rm($taskIdentifier);
+            $this->error('队列任务投递失败');
         }
         }
 
 
-        try {
-            $task = Db::name('queue_tasks')
-                ->where('task_type', 'salary_calculation')
-                ->where('task_data', 'like', '%"date":"' . $date . '"%')
-                ->order('id', 'desc')
-                ->find();
-
-            if ($task) {
-                $taskData = json_decode($task['task_data'] ?? '{}', true) ?: [];
-                $result = json_decode($task['result'] ?? '{}', true) ?: [];
-
-                $response = [
-                    'exists' => true,
-                    'task_id' => (int)$task['id'],
-                    'date' => $date,
-                    'status' => $task['status'] ?? 'unknown',
-                    'queue_name' => $task['queue_name'] ?? '',
-                    'job_id' => $task['job_id'] ?? '',
-                    'start_time' => $task['start_time'] ?? '',
-                    'end_time' => $task['end_time'] ?? '',
-                    'retry_count' => (int)($task['retry_count'] ?? 0),
-                    'result' => $result,
-                    'error' => $task['error'] ?? '',
-                    'create_time' => $task['create_time'] ?? '',
-                    'user_info' => [
-                        'user_id' => $taskData['user_id'] ?? 0,
-                        'user_name' => $taskData['user_name'] ?? ''
-                    ]
-                ];
-            } else {
-                $response = ['exists' => false, 'date' => $date];
-            }
-
-            $this->success('查询成功', null, $response);
-
-        } catch (\Exception $e) {
-            $this->error('查询任务状态失败: ' . $e->getMessage());
-        }
+        Log::info('工资计算队列任务投递成功', ['task_id' => $taskId, 'queue_id' => $queueResult]);
+        $this->success('任务已提交,正在计算中', ['task_id' => $taskId]);
     }
     }
+}
 
 
 
 
-}

+ 57 - 75
application/job/InsertDataJob.php

@@ -164,6 +164,7 @@ namespace app\job;
 
 
 use think\Db;
 use think\Db;
 use think\Log;
 use think\Log;
+use think\queue\Job;
 use app\service\SalaryCalculationService;
 use app\service\SalaryCalculationService;
 
 
 /**
 /**
@@ -172,105 +173,86 @@ use app\service\SalaryCalculationService;
 class InsertDataJob
 class InsertDataJob
 {
 {
     /**
     /**
-     * 任务处理方法
-     * @param \think\queue\Job $job 任务对象
-     * @param mixed $data 任务数据
+     * 队列任务执行入口
+     * @param Job $job 队列任务对象
+     * @param array $data 任务参数
      */
      */
-    public function fire($job, $data)
+    public function fire(Job $job, $data)
     {
     {
-        // 确保数据是数组
-        if (!is_array($data)) {
-            $job->delete();
+        // 1. 基础参数校验
+        if (!is_array($data) || empty($data['task_id']) || empty($data['date'])) {
+            Log::error('队列任务参数错误', ['data' => $data]);
+            $job->delete(); // 参数错误直接删除任务
             return;
             return;
         }
         }
 
 
-        try {
-            $taskId = isset($data['task_id']) ? (int)$data['task_id'] : 0;
+        $taskId = (int)$data['task_id'];
+        $maxAttempts = 3; // 最大重试次数
 
 
-            // 更新任务状态为执行中
-            if ($taskId > 0) {
-                $this->updateTaskStatus($taskId, 'processing', [
-                    'start_time' => date('Y-m-d H:i:s'),
-                    'retry_count' => $job->attempts()
-                ]);
-            }
+        try {
+            // 2. 更新任务状态为执行中
+            $this->updateTaskStatus($taskId, 'processing', [
+                'start_time' => date('Y-m-d H:i:s'),
+                'retry_count' => $job->attempts()
+            ]);
 
 
-            // 调用工资计算服务
+            // 3. 调用工资计算服务
             $service = new SalaryCalculationService();
             $service = new SalaryCalculationService();
             $result = $service->calculateSalary($data);
             $result = $service->calculateSalary($data);
 
 
+            // 4. 任务成功处理
             if ($result['success']) {
             if ($result['success']) {
-                // 任务成功
-                $job->delete();
-                if ($taskId > 0) {
-                    $this->updateTaskStatus($taskId, 'success', [
-                        'end_time' => date('Y-m-d H:i:s'),
-                        'result' => json_encode($result, JSON_UNESCAPED_UNICODE)
-                    ]);
-                }
-
-            } else {
-                // 任务失败
-                if ($job->attempts() >= 3) {
-                    $job->delete();
-                    if ($taskId > 0) {
-                        $this->updateTaskStatus($taskId, 'failed', [
-                            'end_time' => date('Y-m-d H:i:s'),
-                            'error' => $result['message'],
-                            'retry_count' => $job->attempts()
-                        ]);
-                    }
-
-                } else {
-                    $delay = $this->getRetryDelay($job->attempts());
-                    $job->release($delay);
-
-                }
+                $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' => $taskId, 'date' => $data['date']]);
+                return;
             }
             }
 
 
-        } catch (\Exception $e) {
-
+            // 5. 任务失败处理(未达到最大重试次数则重试)
+            throw new \Exception($result['message'] ?? '工资计算服务执行失败');
 
 
-            $taskId = isset($data['task_id']) ? (int)$data['task_id'] : 0;
+        } catch (\Exception $e) {
+            Log::error('工资计算队列任务执行失败', [
+                'task_id' => $taskId,
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString(),
+                'attempts' => $job->attempts()
+            ]);
 
 
-            if ($job->attempts() >= 3) {
-                $job->delete();
-                if ($taskId > 0) {
-                    $this->updateTaskStatus($taskId, 'error', [
-                        'end_time' => date('Y-m-d H:i:s'),
-                        'error' => $e->getMessage(),
-                        'retry_count' => $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 {
             } else {
-                $job->release(60); // 延迟60秒重试
+                $job->release(5); // 5秒后重试
             }
             }
         }
         }
     }
     }
 
 
     /**
     /**
      * 更新任务状态
      * 更新任务状态
+     * @param int $taskId 任务ID
+     * @param string $status 状态:processing/success/failed
+     * @param array $data 附加更新字段
      */
      */
-    protected function updateTaskStatus(int $taskId, string $status, array $data = []): void
+    private function updateTaskStatus(int $taskId, string $status, array $data = [])
     {
     {
-        try {
-            $updateData = array_merge(['status' => $status, 'update_time' => date('Y-m-d H:i:s')], $data);
+        if ($taskId <= 0) return;
 
 
-            Db::name('queue_tasks')
-                ->where('id', $taskId)
-                ->update($updateData);
-
-        } catch (\Exception $e) {
-            Log::error('更新任务状态失败: ' . $e->getMessage());
-        }
-    }
+        $updateData = array_merge([
+            'status' => $status,
+            'update_time' => date('Y-m-d H:i:s')
+        ], $data);
 
 
-    /**
-     * 获取重试延迟时间
-     */
-    protected function getRetryDelay(int $attempts): int
-    {
-        $delays = [10, 30, 60]; // 10秒, 30秒, 1分钟
-        return $delays[min($attempts - 1, count($delays) - 1)] ?? 60;
+        Db::name('queue_tasks')->where('id', $taskId)->update($updateData);
     }
     }
-}
+}

+ 392 - 495
application/service/SalaryCalculationService.php

@@ -2,8 +2,8 @@
 namespace app\service;
 namespace app\service;
 
 
 use think\Db;
 use think\Db;
-use think\Exception;
 use think\Log;
 use think\Log;
+use think\Exception;
 
 
 /**
 /**
  * 工资计算服务类
  * 工资计算服务类
@@ -17,47 +17,161 @@ class SalaryCalculationService
      */
      */
     public function calculateSalary(array $params): array
     public function calculateSalary(array $params): array
     {
     {
-        $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('日期参数错误');
-        }
-        $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));
+        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' => '日期参数错误:开始/结束日期超出考勤年月范围'
+                ];
             }
             }
-        }
-        $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));
+
+            // 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' => $startDate,
+                'end_date' => $endDate,
+                'total_rows' => count($finalData),
+                'insert_rows' => $insertResult
+            ]);
+
+            return [
+                'success' => true,
+                'message' => '工资计算完成',
+                'data' => [
+                    'total_rows' => count($finalData),
+                    'insert_rows' => $insertResult
+                ]
+            ];
+
+        } catch (Exception $e) {
+            Log::error('工资计算服务执行失败', [
+                'error' => $e->getMessage(),
+                'trace' => $e->getTraceAsString(),
+                'params' => $params
+            ]);
+            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';
         }
         }
-        //法定天数
-        $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['法定天数'];
+        // 千件工价 * 核算产量 / 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;
         }
         }
-        //将起止日期内数据删除
-        $delRes = \db('绩效工资汇总')->where('sczl_rq', 'between', [$startDate, $endDate])->delete();
-        //设备产量计酬报工数据查询
-        $where = [];
-        $where['a.sczl_rq'] = ['between', [$startDate, $endDate]];
-        //查询印刷印后车间的机台,添加搜索条件
+        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 = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
         $sist = ['胶印车间', '凹丝印车间', '印后车间', '检验车间'];
-        $jtbhs = db('设备_基本资料')
+        $jtbhs = Db::name('设备_基本资料')
             ->where('sys_sbID', '<>', '')
             ->where('sys_sbID', '<>', '')
             ->where('使用部门', 'in', $sist)
             ->where('使用部门', 'in', $sist)
             ->column('设备编号');
             ->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,
         $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_装版工时 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,
@@ -66,130 +180,97 @@ class SalaryCalculationService
                 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);
-        // 连接 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 = [];
-        /**
-         * 设备_产量计酬数据
-         */
+
+        $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) {
         foreach ($list as $value) {
             $num = 1;
             $num = 1;
             $value['班组车头产量'] = $value['班组车头产量'] - $value['sczl_zcfp'];
             $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_废品率系数'];
-                }
+            $gxRate = 1.0000;
+
+            // 计件产量计算逻辑
+            if (substr($value['sczl_jtbh'], 0, 2) == 'JP') {// 检品机
+                $gxRate = $value['sczl_废品率系数'] ?: 1;
                 $value['班组车头产量'] = $value['班组车头产量'] * $value['sczl_Pgcl'];
                 $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_工价系数'];
-                    }
-                }
+                $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) {
                 if (str_contains($value['印刷方式'], '张') && $value['版距'] > 0) {
                     $value['版距'] = $value['版距'] / 1000;
                     $value['版距'] = $value['版距'] / 1000;
                     $value['班组车头产量'] = $value['班组车头产量'] * $value['版距'];
                     $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#') {
+                $byThePieceYield = str_replace(',', '', round($value['班组车头产量'] * floatval($gxRate)));
+            } else {// 其他设备
+                if (in_array($value['sczl_jtbh'], ['YSY02#', 'YSY08#', 'YSY10#', 'SY03#'])) {
                     $num = 1.1;
                     $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);
-
+                $gxRate = $this->calculateGxRate($value);
+                $byThePieceYield = round($value['班组车头产量'] * floatval($gxRate) * $num);
             }
             }
 
 
-            //补产产量/班组换算产量
+            // 补产产量/班组换算产量
             $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
             $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
-            //核算产量
+            // 核算产量
             $accountingYield = $byThePieceYield + $afterProductionYield;
             $accountingYield = $byThePieceYield + $afterProductionYield;
-            //工时占比
-            if ($value['日定额'] > 0) {
-                $manHourRate = number_format($accountingYield / $value['日定额'], 4);
-            } else {
-                $manHourRate = '0.0000';
-            }
+            // 工时占比
+            $manHourRate = $value['日定额'] > 0 ? number_format($accountingYield / $value['日定额'], 4) : '0.0000';
+
+            // 循环处理10个员工维度
             for ($i = 1; $i < 11; $i++) {
             for ($i = 1; $i < 11; $i++) {
                 $bhKey = 'sczl_bh' . $i;
                 $bhKey = 'sczl_bh' . $i;
                 $xmKey = 'name' . $i;
                 $xmKey = 'name' . $i;
                 $rateKey = 'sczl_rate' . $i;
                 $rateKey = 'sczl_rate' . $i;
                 if (!empty($value[$bhKey]) && $value[$bhKey] != '0000') {
                 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);
+                    $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,
+                    ];
                 }
                 }
             }
             }
         }
         }
-        /**
-         * 拆片工序数据
-         */
-        $query = Db::name('db_sczl')->alias('a')
+    }
+
+    /**
+     * 处理拆片工序数据
+     * @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,
             ->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_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_打样工时 as 打样工时, a.sczl_异常停机工时 as 异常停机工时, a.sczl_设备运行工时 as 车头产量占用机时, a.sczl_bh1,
@@ -199,61 +280,61 @@ class SalaryCalculationService
             ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号', 'left')
             ->join('人事_基本资料 d', 'a.sczl_bh1 = d.员工编号', 'left')
             ->where($where)
             ->where($where)
             ->select();
             ->select();
-        foreach ($query as $value) {
+
+        foreach ($list as $value) {
             $num = 1;
             $num = 1;
             $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
             $value['班组车头产量'] = ($value['班组车头产量'] - $value['sczl_zcfp']) * $value['拆片联拼系数'] * $value['拆片条小盒系数'];
-            //计件产量
-            if ($value['sczl_jtbh'] === 'YSY02#' || $value['sczl_jtbh'] === 'YSY08#' || $value['sczl_jtbh'] === 'YSY10#' || $value['sczl_jtbh'] === 'SY03#') {
+
+            if (in_array($value['sczl_jtbh'], ['YSY02#', 'YSY08#', 'YSY10#', 'SY03#'])) {
                 $num = 1.1;
                 $num = 1.1;
             }
             }
-            if ($value['工序难度系数'] <= 0 || empty($value['工序难度系数'])) {
-                $value['工序难度系数'] = '1.0000';
-                $byThePieceYield = $value['班组车头产量'];
-            } else {
-                $byThePieceYield = round($value['班组车头产量'] * $value['工序难度系数'] * $num);
-            }
-            //补产产量/班组换算产量
+
+            $gxRate = $value['工序难度系数'] ?: 1.0000;
+            $byThePieceYield = round($value['班组车头产量'] * $gxRate * $num);
             $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
             $afterProductionYield = ($value['装版工时'] + $value['保养工时'] + $value['打样工时']) * $value['补产标准'];
-            //核算产量
             $accountingYield = $byThePieceYield + $afterProductionYield;
             $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);
+            $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,
+            ];
         }
         }
-        /**
-         * 手工检验工序数据
-         */
-        $shoujianfields = "a.sczl_gdbh,a.sczl_yjgx,sczl_gxmc AS sczl_type,a.sczl_rq,a.sczl_cl AS 班组车头产量,
+    }
+
+    /**
+     * 处理手工检验工序数据
+     * @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,
 	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,
 	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,
 	d1.员工姓名 AS name1,d2.员工姓名 AS name2,d3.员工姓名 AS name3,d4.员工姓名 AS name4,d5.员工姓名 AS name5,
@@ -261,352 +342,168 @@ class SalaryCalculationService
 	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,
 	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_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";
 	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');
-        //链接人事基本资料表
+
+        $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++) {
         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');
+            $list = $this->joinStaffTable($list, $i);
         }
         }
-        $query->where($where);
-        $list = $query->select();
-        foreach ($list as $key => $value) {
+
+        foreach ($list as $value) {
             for ($i = 0; $i <= 12; $i++) {
             for ($i = 0; $i <= 12; $i++) {
                 if (!empty($value['sczl_bh' . $i])) {
                 if (!empty($value['sczl_bh' . $i])) {
                     $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'], 0, 2);
                     $value['sczl_yjno'] = (int)substr($value['sczl_yjgx'], 0, 2);
                     $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'], 3, 2);
                     $value['sczl_gxh'] = (int)substr($value['sczl_yjgx'], 3, 2);
-                    //车头产量
                     $value['班组车头产量'] = $value['sczl_cl' . $i] * $value['sczl_fp' . $i];
                     $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);
+
+                    $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,
+                    ];
                 }
                 }
             }
             }
         }
         }
-        /**
-         * 包装计件工序数据
-         */
-        $result = Db::name('db_包装计件')->alias('a')
+    }
+
+    /**
+     * 处理包装计件工序数据(补充原代码截断部分)
+     * @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,
             ->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,
                      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,
                      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_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_返工产量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_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')
+                     a.sczl_dedh1,a.sczl_dedh2,a.sczl_dedh3,a.sczl_dedh4,a.sczl_dedh5,a.sczl_dedh6')
             ->where($where)
             ->where($where)
-            ->group('a.UniqId')
             ->select();
             ->select();
 
 
-        foreach ($result as $value) {
-            for ($i = 1; $i < 7; $i++) {
-                $item = [];
+        // 循环处理6个维度的包装数据
+        for ($i = 1; $i <= 6; $i++) {
+            foreach ($list as $value) {
                 $gdbhKey = 'sczl_gdbh' . $i;
                 $gdbhKey = 'sczl_gdbh' . $i;
-                $yjgxKey = 'sczl_yjGx' . $i;
-                $jtbhKey = 'sczl_Jtbh' . $i;
+                $yjGxKey = 'sczl_yjGx' . $i;
                 $gxmcKey = 'gxmc' . $i;
                 $gxmcKey = 'gxmc' . $i;
                 $clKey = 'sczl_cl' . $i;
                 $clKey = 'sczl_cl' . $i;
                 $reworkKey = 'sczl_返工产量' . $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);
-                    }
+                $jtbhKey = 'sczl_Jtbh' . $i;
+                $dedhKey = 'sczl_dedh' . $i;
 
 
-                }
-            }
-        }
-        //用于存储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 = 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;
-                    }
-                }
-                // 统一计算加班工资(所有情况都会计算)
+                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;
 
 
-                $overTimePay = ($item['核算产量'] - $data[$key]['达标定额']) / 1000 * $item['千件工价'] * $item['Rate'] * 1.5;
+                // 产量计算(含返工产量)
+                $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,
+                ];
             }
             }
-            $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']);
         }
         }
-
-        $result = $this->calculateSalary($data);
-        return [
-            'success' => true,
-            'message' => '工资计算完成',
-            'data' => [
-                'month' => $attendanceMonth,
-                'insert_count' => count($data),
-                'start_date' => $startDate,
-                'end_date' => $endDate
-            ]
-        ];
     }
     }
 
 
-
-
-
     /**
     /**
-     * 保存工资数据
+     * 计算工序难度系数
+     * @param array $value 单条数据
+     * @return float
      */
      */
-    protected function saveSalaryData(array $data): int
+    private function calculateGxRate(array $value): float
     {
     {
-        if (empty($data)) {
-            return 0;
-        }
+        $sczlRate = $value['sczl_工价系数'] ?: 0;
+        $processRate = $value['工序难度系数'] ?: 0;
 
 
-        // 获取最大UniqID
-        $maxUniqId = Db::name('绩效工资汇总')
-            ->max('UniqID') ?? 0;
-
-        // 准备插入数据
-        $insertData = [];
-        $currentUniqId = $maxUniqId + 1;
-
-        foreach ($data as $item) {
-            $insertData[] = [
-                'sczl_gdbh' => $item['sczl_gdbh'],
-                'sczl_yjno' => $item['sczl_yjno'],
-                'sczl_gxh' => $item['sczl_gxh'],
-                'sczl_type' => $item['sczl_type'],
-                'sczl_rq' => $item['sczl_rq'],
-                'sczl_jtbh' => $item['sczl_jtbh'],
-                '班组车头产量' => $item['班组车头产量'],
-                '工价系数' => $item['工价系数'],
-                '工序难度系数' => $item['工序难度系数'],
-                '装版工时' => $item['装版工时'],
-                '保养工时' => $item['保养工时'],
-                '打样工时' => $item['打样工时'],
-                '异常停机工时' => $item['异常停机工时'],
-                '车头产量占用机时' => $item['车头产量占用机时'],
-                '日定额' => $item['日定额'],
-                '千件工价' => $item['千件工价'],
-                '补产标准' => $item['补产标准'],
-                '班组换算产量' => $item['班组换算产量'],
-                '计时补差额工资' => $item['计时补差额工资'],
-                'bh' => $item['bh'],
-                'xm' => $item['xm'],
-                'Rate' => $item['Rate'],
-                'sczl_ms' => $item['sczl_ms'],
-                '工时占比' => $item['工时占比'],
-                '达标定额' => $item['达标定额'],
-                '个人计件工资' => $item['个人计件工资'],
-                '个人加班工资' => $item['个人加班工资'],
-                'UniqID' => $currentUniqId++,
-                'sys_ny' => $item['sys_ny'],
-                'sys_rq' => $item['sys_rq'],
-                'sys_id' => $item['sys_id'],
-                '法定天数' => $item['法定天数'],
-                '核算产量' => $item['核算产量'] ?? 0,
-            ];
+        if ($sczlRate <= 0) {
+            return $processRate > 0 ? $processRate : 1.0000;
         }
         }
 
 
-        // 批量插入
-        $sql = Db::name('绩效工资汇总')->fetchSql(true)->insertAll($insertData);
-        $result = Db::query($sql);
-
-        return $result ? count($insertData) : 0;
+        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;
+    }
 }
 }