unknown 5 месяцев назад
Родитель
Сommit
ce1146e9c9
1 измененных файлов с 920 добавлено и 2 удалено
  1. 920 2
      application/api/controller/OrderSuperLoss.php

+ 920 - 2
application/api/controller/OrderSuperLoss.php

@@ -4,6 +4,8 @@ namespace app\api\controller;
 
 use app\common\controller\Api;
 use think\Cache;
+use think\Exception;
+use think\Log;
 use \think\Request;
 use \think\Db;
 /**
@@ -1367,7 +1369,7 @@ class OrderSuperLoss extends Api
         $data['intangible_loss'] = (int)($data['实际投料'] * 10000 - $total_number[0] - $waste_total);
         //查询核检单废品上报数据
         $out_sql = "SELECT qczl_num,fp_sl1,fp_sl2,fp_sl3,fp_sl4,fp_sl5,fp_sl6,fp_sl7,fp_sl8,fp_sl9,fp_sl10,fp_sl11,fp_sl12,fp_sl13,
-                        fp_lb1,fp_lb2,fp_lb3,fp_lb4,fp_lb5,fp_lb6,fp_lb7,fp_lb8,fp_lb9,fp_lb10,fp_lb11,fp_lb12,fp_lb13, 
+                        fp_lb1,fp_lb2,fp_lb3,fp_lb4,fp_lb5,fp_lb6,fp_lb7,fp_lb8,fp_lb9,fp_lb10,fp_lb11,fp_lb12,fp_lb13,
                         fp_bh1,fp_bh2,fp_bh3,fp_bh4,fp_bh5,fp_bh6,fp_bh7,fp_bh8,fp_bh9,fp_bh10,fp_bh11,fp_bh12,fp_bh13,
                         fp_bz1,fp_bz2,fp_bz3,fp_bz4,fp_bz5,fp_bz6,fp_bz7,fp_bz8,fp_bz9,fp_bz10,fp_bz11,fp_bz12,fp_bz13,
                         fp_gxmc1,fp_gxmc2,fp_gxmc3,fp_gxmc4,fp_gxmc5,fp_gxmc6,fp_gxmc7,fp_gxmc8,fp_gxmc9,fp_gxmc10,fp_gxmc11,fp_gxmc12,fp_gxmc13,UniqId
@@ -2153,7 +2155,16 @@ class OrderSuperLoss extends Api
     }
 
 
-    //循环插入超节损数据
+    /**
+     * 循环插入超节损数据
+     * @return void
+     * @throws \think\Exception
+     * @throws \think\db\exception\BindParamException
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     * @throws \think\exception\PDOException
+     */
     public function orderLossData()
     {
         $param = $this->request->param();
@@ -2199,5 +2210,912 @@ class OrderSuperLoss extends Api
             $this->error('失败');
         }
     }
+
+
+//    public function OneOrderSuperLoss($gdbh, $yjno)
+//    {
+//        $param = ['gdbh' => $gdbh, 'yjno' => $yjno];
+//
+//        try {
+//            // 获取基础数据
+//            $baseData = $this->getBaseData($param);
+//            if (!$baseData) return false;
+//
+//            // 处理基础数据
+//            $processedData = $this->processBaseData($baseData);
+//            if (!$processedData) return false;
+//
+//            // 处理废品数据
+//            $wasteData = $this->processWasteData($baseData['workOrderData'], $processedData['ls'], $processedData['ks']);
+//
+//            // 计算无形损
+//            $processedData['intangible_loss'] = (int)($processedData['实际投料'] * 10000 - $baseData['total_number'] - $wasteData['waste_total']);
+//
+//            // 获取工序数据
+//            $processData = $this->calculateProcessData($baseData, $processedData, $wasteData);
+//
+//            // 格式化最终结果
+//            return $this->formatFinalResult($processedData, $processData, $wasteData, $baseData);
+//
+//        } catch (\Exception $e) {
+//            Log::error("工单损耗计算失败: {$gdbh}-{$yjno} - " . $e->getMessage());
+//            return false;
+//        }
+//    }
+//
+//    /**
+//     * 获取基础数据 - 减少数据库查询次数
+//     */
+//    private function getBaseData($param)
+//    {
+//        return Db::transaction(function() use ($param) {
+//            // 查询工单入仓数据
+//            $workOrderData = Db::name('成品入仓')
+//                ->where('jjcp_gdbh', $param['gdbh'])
+//                ->where('jjcp_yjno', $param['yjno'])
+//                ->where('jjcp_smb', '末 板')
+//                ->find();
+//
+//            if (!$workOrderData) return false;
+//
+//            // 入仓数量
+//            $total_number = Db::name('成品入仓')
+//                ->where('jjcp_gdbh', $param['gdbh'])
+//                ->where('jjcp_yjno', $param['yjno'])
+//                ->sum('jjcp_sl');
+//
+//            // 查询工单资料、投料数据
+//            $field = 'a.Gd_gdbh, rtrim(a.成品代号) as 成品代号, rtrim(a.成品名称) as 成品名称,
+//                  rtrim(a.销售订单号) as 销售订单号, a.订单数量, c.yj_ls as ls, c.yj_ks as ks,
+//                  SUM(b.st_sl) as 投料, b.st_dw, c.yj_zzmc, c.yj_tlgg, SUM(b.mod_number) as mod_num';
+//
+//            $material_data = Db::name('工单_基本资料')
+//                ->alias('a')
+//                ->join('物料_收发记录 b', 'a.Gd_gdbh = b.st_gdbh AND a.Gd_cpdh = b.cpdh')
+//                ->join('工单_印件资料 c', 'c.Yj_Gdbh = a.Gd_gdbh AND c.yj_Yjdh = a.Gd_cpdh')
+//                ->where('a.Gd_Gdbh', $param['gdbh'])
+//                ->where('c.yj_Yjno', $param['yjno'])
+//                ->whereIn('b.仓库编号', ['101', 'Y101'])
+//                ->field($field)
+//                ->find();
+//
+//            if (empty($material_data['投料'])) {
+//                return false;
+//            }
+//
+//            // 获取工序数据
+//            $gxh_data = $this->getProcessData($workOrderData);
+//
+//            return [
+//                'workOrderData' => $workOrderData,
+//                'total_number' => $total_number,
+//                'material_data' => $material_data,
+//                'gxh_data' => $gxh_data,
+//                'param' => $param
+//            ];
+//        });
+//    }
+//
+//    /**
+//     * 获取工序数据 - 使用IN查询优化
+//     */
+//    private function getProcessData($workOrderData)
+//    {
+//        $gxh_sql = "SELECT DISTINCT sczl_gxh FROM (
+//        SELECT sczl_gxh FROM 设备_产量计酬
+//        WHERE sczl_gdbh = ? AND sczl_yjno = ?
+//        UNION
+//        SELECT sczl_gxh FROM db_sczl
+//        WHERE sczl_gdbh = ? AND sczl_yjno = ?
+//    ) AS combined_result";
+//
+//        $gxh_arr = Db::query($gxh_sql, [
+//            $workOrderData['jjcp_gdbh'], $workOrderData['jjcp_yjno'],
+//            $workOrderData['jjcp_gdbh'], $workOrderData['jjcp_yjno']
+//        ]);
+//
+//        return array_map(function($v) {
+//            $v = (int)$v['sczl_gxh'];
+//            return $v < 10 ? '0' . $v : $v;
+//        }, $gxh_arr);
+//    }
+//
+//    /**
+//     * 处理基础数据 - 批量处理减少循环
+//     */
+//    private function processBaseData($baseData)
+//    {
+//        $data = $baseData['material_data'];
+//
+//        // 处理单位转换
+//        if (!empty($data['yj_tlgg'])) {
+//            $number1 = (int)substr($data['yj_tlgg'], 0, 3);
+//            $number2 = (int)substr($data['yj_tlgg'], 4, 3);
+//            preg_match('/(\d+)g/', $data['yj_zzmc'], $matches);
+//
+//            if ($data['st_dw'] === '吨' && !empty($matches[1])) {
+//                $data['投料'] = round(($data['投料'] * 1000 * 1000) / $matches[1] / ($number1 * $number2) * 1000000);
+//                $data['st_dw'] = '张';
+//            }
+//        }
+//
+//        // 设置默认值
+//        $data['ls'] = $data['ls'] == 0 ? 1 : $data['ls'];
+//        $data['ks'] = $data['ks'] == 0 ? 1 : $data['ks'];
+//
+//        // 计算实际投料
+//        $data['实际投料'] = str_replace(',', '', number_format(
+//            $data['投料'] * $data['ls'] * $data['ks'] / 10000, 4
+//        ));
+//
+//        // 调用计划处理
+//        (new WorkOrder())->PlannedProcessYield(
+//            $baseData['param']['gdbh'],
+//            $baseData['param']['yjno'],
+//            0,
+//            $data['实际投料'] * 10000 / $data['ls']
+//        );
+//
+//        return array_merge($data, [
+//            'warehousing_num' => $baseData['total_number'],
+//            'warehousing_date' => substr($baseData['workOrderData']['jjcp_sj'], 0, 10),
+//            'gxh_values' => $baseData['gxh_data']
+//        ]);
+//    }
+//
+//    /**
+//     * 处理废品数据 - 优化循环和查询
+//     */
+//    private function processWasteData($workOrderData, $ls, $ks)
+//    {
+//        $result = [
+//            'material' => [], 'change' => [], 'list' => [],
+//            'quality' => [], 'machine' => [], 'zcfp' => 0
+//        ];
+//
+//        // 获取制程废品
+//        $zzfp_data = Db::name('设备_产量计酬')
+//            ->where('sczl_gdbh', $workOrderData['jjcp_gdbh'])
+//            ->where('sczl_yjno', $workOrderData['jjcp_yjno'])
+//            ->sum('sczl_zcfp');
+//
+//        $result['zcfp'] = $zzfp_data * $ls * $ks;
+//
+//        // 获取废品数据
+//        $waste_out = $this->getWasteOutData($workOrderData);
+//
+//        // 批量处理废品分类
+//        foreach ($waste_out as $entry) {
+//            for ($i = 1; $i <= 13; $i++) {
+//                $this->classifyWaste($entry, $i, $result);
+//            }
+//        }
+//
+//        // 计算废品合计
+//        $wasteTotal = Db::name('db_qczl')
+//            ->where('qczl_gdbh', $workOrderData['jjcp_gdbh'])
+//            ->where('qczl_yjno', $workOrderData['jjcp_yjno'])
+//            ->sum('qczl_fp') ?: 0;
+//
+//        $result['waste_total'] = $result['zcfp'] + $wasteTotal;
+//
+//        // 计算汇总数据
+//        $result['材料废'] = array_sum($result['material']);
+//        $result['零头处理'] = array_sum($result['change']);
+//        $result['外发废'] = array_sum($result['list']);
+//        $result['工单质检废'] = array_sum($result['quality']);
+//        $result['机检废'] = array_sum($result['machine']);
+//
+//        return $result;
+//    }
+//
+//    /**
+//     * 获取废品输出数据
+//     */
+//    private function getWasteOutData($workOrderData)
+//    {
+//        $fields = [];
+//        for ($i = 1; $i <= 13; $i++) {
+//            $fields = array_merge($fields, [
+//                "fp_sl{$i}", "fp_lb{$i}", "fp_bh{$i}",
+//                "fp_gxmc{$i}", "fp_bz{$i}"
+//            ]);
+//        }
+//
+//        return Db::name('db_qczl')
+//            ->where('qczl_gdbh', $workOrderData['jjcp_gdbh'])
+//            ->where('qczl_yjno', $workOrderData['jjcp_yjno'])
+//            ->field(array_merge($fields, ['UniqId', 'qczl_num']))
+//            ->select();
+//    }
+//
+//    /**
+//     * 分类废品数据
+//     */
+//    private function classifyWaste($entry, $i, &$result)
+//    {
+//        $labelKey = "fp_lb{$i}";
+//        $slKey = "fp_sl{$i}";
+//        $gxmcKey = "fp_gxmc{$i}";
+//
+//        if (!empty($entry[$labelKey])) {
+//            $label = $entry[$labelKey];
+//            $value = $entry[$slKey];
+//
+//            if (strpos($label, 'M04') === 0) {
+//                $result['list'][] = $value;
+//            } elseif (strpos($label, 'L') === 0) {
+//                $result['material'][] = $value;
+//            } elseif (strpos($label, 'M01') === 0) {
+//                $result['change'][] = $value;
+//            } elseif (strpos($entry[$gxmcKey] ?? '', '01') === 0) {
+//                $result['machine'][] = $value;
+//            }
+//        }
+//
+//        if (!empty($entry[$slKey])) {
+//            $result['quality'][] = $entry[$slKey];
+//        }
+//    }
+//
+//    /**
+//     * 计算工序数据
+//     */
+//    private function calculateProcessData($baseData, $processedData, $wasteData)
+//    {
+//        // 修复:不能直接在sum中使用表达式,改为先查询再计算
+//        $plan_list = Db::name('工单_工艺资料')
+//            ->where([
+//                'Gy0_gdbh' => $baseData['workOrderData']['jjcp_gdbh'],
+//                'Gy0_yjno' => $baseData['workOrderData']['jjcp_yjno'],
+//                'Gy0_gxh' => ['in', $processedData['gxh_values']]
+//            ])
+//            ->field('Gy0_计划损耗, Gy0_ls, Gy0_ks')
+//            ->select();
+//
+//        $plan_total = 0;
+//        foreach ($plan_list as $item) {
+//            $plan_total += $item['Gy0_计划损耗'] * $item['Gy0_ls'] * $item['Gy0_ks'];
+//        }
+//
+//        // 工单产量数据详情查询
+//        $total_cl_data = Db::name('工单_工艺资料')->alias('a')
+//            ->field([
+//                'a.Gy0_yjno', 'a.Gy0_gxh', 'rtrim(a.Gy0_gxmc) as gxmc', 'a.Gy0_ls',
+//                'SUM(b.sczl_cl) as total_cl', 'SUM(c.sczl_cl) as cl', 'rtrim(a.印刷方式) as 印刷方式',
+//                'rtrim(a.版距) as 版距'
+//            ])
+//            ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh', 'left')
+//            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
+//            ->where([
+//                'a.Gy0_gdbh' => $baseData['workOrderData']['jjcp_gdbh'],
+//                'a.Gy0_yjno' => $baseData['workOrderData']['jjcp_yjno'],
+//                'a.Gy0_gxh' => ['IN', $processedData['gxh_values']],
+//                'b.sczl_cl|c.sczl_cl' => ['>', 0],
+//            ])
+//            ->group('a.Gy0_gxh')
+//            ->order('a.Gy0_gxh')
+//            ->select();
+//
+//        // 按班组分的产量数据 - 修复字段表达式问题
+//        $gy_data = Db::name('工单_工艺资料')
+//            ->alias('a')
+//            ->field([
+//                'a.Gy0_gdbh', 'a.Gy0_yjno', 'a.Gy0_gxh', 'a.Gy0_ls', 'a.Gy0_ks', 'a.Gy0_计划损耗', 'a.超节损承担比例',
+//                'CONCAT(`a`.`Gy0_gxmc`, "【", a.Add_gxmc,"】") AS sczl_gxmc', 'SUM(b.sczl_zcfp) as sczl_zcfp', 'SUM(b.sczl_cl) as total_cl',
+//                'b.sczl_bh1', 'b.sczl_bh2', 'b.sczl_bh3', 'b.sczl_bh4', 'b.sczl_bh5', 'b.sczl_bh6',
+//                'b.sczl_bh7', 'b.sczl_bh8', 'b.sczl_bh9', 'b.sczl_bh10', 'GROUP_CONCAT(DISTINCT b.sczl_num SEPARATOR ",") AS 流程单',
+//                'b.sczl_bzdh', 'b.sczl_rate1', 'b.sczl_rate2', 'b.sczl_rate3', 'b.sczl_rate4', 'b.sczl_rate5',
+//                'b.sczl_rate6', 'b.sczl_rate7', 'b.sczl_rate8', 'b.sczl_rate9', 'b.sczl_rate10',
+//                'rtrim(c.sczl_gxmc) as gxmc', 'SUM(c.sczl_cl) as cl', 'SUM(c.sczl_fp) as fp', 'c.sczl_bh1 as sczl_bh',
+//                'd.使用部门 as 使用部门', 'c.sczl_bzdh as bzdh', 'b.sczl_jtbh', 'a.损耗系数', 'a.Gy0_ms', 'a.Gy0_Rate0',
+//                'a.Gy0_Rate1', 'a.无形损承担比例', 'a.Gy0_计划接货数', 'e.Gd_客户代号', 'e.Gd_客户名称', // 移除了字段表达式
+//                'e.Gd_cpdh', 'e.Gd_cpmc', 'e.销售订单号', 'e.投料大箱', 'e.订单数量', 'e.计量单位', 'rtrim(a.Gy0_SITE) as Gy0_SITE',
+//                'rtrim(a.印刷方式) as 印刷方式','rtrim(a.版距) as 版距'
+//            ])
+//            ->join('设备_产量计酬 b', 'a.Gy0_gdbh = b.sczl_gdbh AND a.Gy0_yjno = b.sczl_yjno AND a.Gy0_gxh = b.sczl_gxh', 'left')
+//            ->join('db_sczl c', 'a.Gy0_gdbh = c.sczl_gdbh AND a.Gy0_yjno = c.sczl_yjno AND a.Gy0_gxh = c.sczl_gxh', 'left')
+//            ->join('设备_基本资料 d', 'd.设备编号 = b.sczl_jtbh', 'left')
+//            ->join('工单_基本资料 e', 'a.Gy0_gdbh = e.Gd_gdbh AND a.Gy0_yjno = e.行号')
+//            ->where([
+//                'a.Gy0_gdbh' => $baseData['workOrderData']['jjcp_gdbh'],
+//                'a.Gy0_yjno' => $baseData['workOrderData']['jjcp_yjno'],
+//                'a.Gy0_gxh' => ['in', $processedData['gxh_values']],
+//                'b.sczl_cl|c.sczl_cl' => ['>', 0],
+//            ])
+//            ->group('a.Gy0_gxh,b.sczl_jtbh,b.sczl_bh1, CASE WHEN b.sczl_bh2 = "000000" THEN "" ELSE b.sczl_bh2 END, b.sczl_bh3,
+//                 b.sczl_bh4, b.sczl_bh5, b.sczl_bh6, b.sczl_bh7, b.sczl_bh8, b.sczl_bh9, c.sczl_bh1')
+//            ->order('a.Gy0_gxh asc, b.开工时间 asc, c.sczl_rq desc')
+//            ->select();
+//
+//        // 预计算班组产量总和
+//        $sumBz = [];
+//        foreach ($gy_data as $kk => $vv) {
+//            $banju = $vv['版距'] / 1000;
+//            if ($vv['印刷方式'] === '卷对卷') {
+//                $vv['total_cl'] = $vv['total_cl'] / $banju;
+//            }
+//
+//            $vv['total_cl'] = (int)$vv['total_cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//            if (empty($vv['total_cl'])) {
+//                $vv['total_cl'] = (int)$vv['cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//            }
+//
+//            $key = $vv['sczl_bh1'] . '-' . $vv['Gy0_gxh'];
+//            $sumBz[$key] = isset($sumBz[$key]) ? $sumBz[$key] + $vv['total_cl'] : $vv['total_cl'];
+//
+//            // 修复:在PHP中计算计划产量,而不是在SQL中使用表达式
+//            $gy_data[$kk]['计划产量'] = $vv['Gy0_计划接货数'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//        }
+//
+//        // 处理工序数据
+//        $total = [
+//            'plan_loss' => 0, 'total_fp' => 0, 'waste_quality' => 0,
+//            'waste_intangible' => 0, 'reward' => 0
+//        ];
+//
+//        foreach ($gy_data as $kk => $vv) {
+//            $banju = $vv['版距'] / 1000;
+//            if ($vv['印刷方式'] === '卷对卷') {
+//                $vv['total_cl'] = $vv['total_cl'] / $banju;
+//            }
+//
+//            // 每道工序的产量(按班组分)
+//            $gy_data[$kk]['total_cl'] = (int)$vv['total_cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//            if (empty($vv['total_cl'])) {
+//                $gy_data[$kk]['total_cl'] = (int)$vv['cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//            }
+//
+//            $gy_data[$kk]['Gy0_计划损耗'] = $vv['Gy0_计划损耗'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//
+//            // 计算每道工序的计划损耗
+//            foreach ($total_cl_data as $k => $v) {
+//                $banju1 = $v['版距'] / 1000;
+//                if ($v['印刷方式'] === '卷对卷') {
+//                    $v['total_cl'] = $v['total_cl'] * $banju1;
+//                }
+//
+//                if ($vv['Gy0_yjno'] == $v['Gy0_yjno'] && $vv['Gy0_gxh'] == $v['Gy0_gxh']) {
+//                    $cl = $v['total_cl'] * $v['Gy0_ls'];
+//                    if (empty($cl)) {
+//                        $cl = $v['cl'] * $v['Gy0_ls'];
+//                    }
+//
+//                    if ($cl > 0) {
+//                        $gy_data[$kk]['计划损耗'] = round($gy_data[$kk]['total_cl'] / $cl * $vv['Gy0_计划损耗']);
+//                    }
+//                }
+//            }
+//
+//            // 每道工序的制程废品(按班组分)
+//            $gy_data[$kk]['sczl_zcfp'] = $vv['sczl_zcfp'] * $vv['Gy0_ls'];
+//            if (empty($vv['sczl_zcfp'])) {
+//                $gy_data[$kk]['sczl_zcfp'] = $vv['fp'] * $vv['Gy0_ls'];
+//            }
+//
+//            // 计算每道工序的质检废(按班组)
+//            $gy_data[$kk]['sczl_gxmc'] = $vv['sczl_gxmc'];
+//            if (empty($vv['sczl_gxmc'])) {
+//                $gy_data[$kk]['sczl_gxmc'] = $vv['gxmc'];
+//            }
+//
+//            if (empty($vv['sczl_bh1']) || is_null($vv['sczl_bh1'])) {
+//                $vv['sczl_bh1'] = $vv['sczl_bh'];
+//            }
+//
+//            $gy_data[$kk]['sczl_bh1'] = $vv['sczl_bh1'];
+//            $gy_data[$kk]['质检废'] = 0;
+//            $gy_data[$kk]['zjfp'] = 0;
+//
+//            $key = $vv['sczl_bh1'] . '-' . $vv['Gy0_gxh'];
+//            $total_cl_ratio = isset($sumBz[$key]) && $sumBz[$key] > 0 ?
+//                $gy_data[$kk]['total_cl'] / $sumBz[$key] : 0;
+//
+//            // 计算质检废
+//            $waste_out = $this->getWasteOutData($baseData['workOrderData']);
+//            foreach ($waste_out as $entry) {
+//                for ($i = 1; $i <= 13; $i++) {
+//                    $gxmcKey = "fp_gxmc" . $i;
+//                    $bhKey = "fp_bh" . $i;
+//                    $slKey = "fp_sl" . $i;
+//
+//                    if ((int)substr($entry[$gxmcKey], 0, 2) == $vv['Gy0_gxh'] &&
+//                        $entry[$bhKey] == $vv['sczl_bh1']) {
+//                        $gy_data[$kk]['zjfp'] += $entry[$slKey];
+//                    }
+//                }
+//            }
+//
+//            $gy_data[$kk]['质检废'] = round($gy_data[$kk]['zjfp'] * $total_cl_ratio);
+//
+//            // 无形损分摊
+//            if ($plan_total > 0) {
+//                $gy_data[$kk]['无形损分摊'] = round($gy_data[$kk]['计划损耗'] / $plan_total * $processedData['intangible_loss']);
+//            } else {
+//                $gy_data[$kk]['无形损分摊'] = 0;
+//            }
+//
+//            // 班组成员
+//            for ($j = 1; $j <= 10; $j++) {
+//                $bhKey = "sczl_bh" . $j;
+//                if (!empty($vv[$bhKey])) {
+//                    $name = Db::name('人事_基本资料')
+//                        ->where('员工编号', $vv[$bhKey])
+//                        ->value('rtrim(员工姓名)');
+//                    $gy_data[$kk]['sczl_name' . $j] = $name;
+//                } else {
+//                    $gy_data[$kk]['sczl_name' . $j] = '';
+//                }
+//            }
+//
+//            // 工序产量
+//            foreach ($total_cl_data as $k => $v) {
+//                $banju1 = $v['版距'] / 1000;
+//                if ($v['印刷方式'] === '卷对卷') {
+//                    $v['total_cl'] = $v['total_cl'] * $banju1;
+//                }
+//
+//                if ($v['Gy0_yjno'] === $vv['Gy0_yjno'] && $v['Gy0_gxh'] === $vv['Gy0_gxh']) {
+//                    if (strpos($v['gxmc'], '拆片') !== false) {
+//                        $gy_data[$kk]['工序产量'] = $v['cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//                    } else {
+//                        $gy_data[$kk]['工序产量'] = $v['total_cl'] * $vv['Gy0_ls'] * $vv['Gy0_ks'];
+//                    }
+//                }
+//            }
+//
+//            unset($gy_data[$kk]['gxmc'], $gy_data[$kk]['cl'], $gy_data[$kk]['fp'],
+//                $gy_data[$kk]['sczl_bh'], $gy_data[$kk]['bzdh']);
+//
+//            // 计算超节损金额
+//            if ($gy_data[$kk]['无形损分摊'] > 0) {
+//                $total_waste = $gy_data[$kk]['质检废'] + $gy_data[$kk]['sczl_zcfp'] + $gy_data[$kk]['无形损分摊'];
+//            } else {
+//                $total_waste = $gy_data[$kk]['质检废'] + $gy_data[$kk]['sczl_zcfp'];
+//            }
+//
+//            $gy_data[$kk]['节损数量'] = $gy_data[$kk]['计划损耗'] - $total_waste;
+//
+//            // 获取规格
+//            $guige = Db::name('物料_存货编码')
+//                ->where('物料代码', $processedData['成品代号'])
+//                ->value('rtrim(规格)');
+//
+//            // 工序超节损金额
+//            $moneyRate = strpos($guige, '小盒') !== false ? 0.02 : 0.09;
+//
+//            if (strpos($gy_data[$kk]['sczl_gxmc'], '机检') !== false) {
+//                $gy_data[$kk]['节损奖'] = 0;
+//            } else {
+//                $gy_data[$kk]['节损奖'] = number_format(
+//                    $gy_data[$kk]['节损数量'] * $gy_data[$kk]['超节损承担比例'] * $moneyRate, 4
+//                );
+//            }
+//
+//            $gy_data[$kk]['sys_ny'] = date('Ym', strtotime($baseData['workOrderData']['jjcp_sj']));
+//            $gy_data[$kk]['超节损核算单价'] = $moneyRate;
+//
+//            // 汇总数据
+//            $total['plan_loss'] += $gy_data[$kk]['计划损耗'];
+//            $total['total_fp'] += $gy_data[$kk]['sczl_zcfp'];
+//            $total['waste_quality'] += $gy_data[$kk]['质检废'];
+//            $total['waste_intangible'] += $gy_data[$kk]['无形损分摊'];
+//            $total['reward'] += floatval(str_replace(',', '', $gy_data[$kk]['节损奖']));
+//        }
+//
+//        return [
+//            'gy_data' => $gy_data,
+//            'total' => $total,
+//            'plan_total' => $plan_total
+//        ];
+//    }
+//
+//    /**
+//     * 格式化最终结果
+//     */
+//    private function formatFinalResult($processedData, $processData, $wasteData, $baseData)
+//    {
+//        $result = [];
+//        $gy_data = $processData['gy_data'];
+//
+//        foreach ($gy_data as $key => $value) {
+//            $result[$key] = [
+//                'sys_ny' => $value['sys_ny'],
+//                'Gy0_gdbh' => $value['Gy0_gdbh'],
+//                '印件及工序' => $value['Gy0_yjno'],
+//                '工序' => $value['Gy0_gxh'],
+//                '工序名称' => $value['sczl_gxmc'],
+//                '联数' => $value['Gy0_ls'],
+//                '基础损耗' => $value['Gy0_Rate0'],
+//                '损耗率' => $value['Gy0_Rate1'],
+//                '损耗系数' => $value['损耗系数'],
+//                '计损色数' => $value['Gy0_ms'],
+//                '计划产量' => $value['计划产量'],
+//                '计划损耗' => $value['Gy0_计划损耗'],
+//                '班组分摊计划损耗' => $value['计划损耗'],
+//                '印件工序产量' => $value['工序产量'],
+//                '班组产量' => $value['total_cl'],
+//                '班组制程废品' => $value['sczl_zcfp'],
+//                '工单质检废' => $wasteData['工单质检废'],
+//                '班组质检废品' => $value['zjfp'],
+//                '班组分摊质检废品' => $value['质检废'],
+//                '无班组废品' => 0,
+//                '外发废' => $wasteData['外发废'],
+//                '材料废' => $wasteData['材料废'],
+//                '零头处理' => $wasteData['零头处理'],
+//                '分摊废' => 0,
+//                '分摊废明细' => 0,
+//                '印件无形损' => $processedData['intangible_loss'],
+//                '班组分摊无形损' => $value['无形损分摊'],
+//                'CjsSl' => $value['节损数量'],
+//                'CjsJe' => str_replace(",", "", $value['节损奖']),
+//                '无形损承担比例' => $value['无形损承担比例'],
+//                '超节损承担比例' => $value['超节损承担比例'],
+//                '超节损核算单价' => $value['超节损核算单价'],
+//                'sczl_jtbh' => $value['sczl_jtbh'],
+//                'sczl_bzdh' => $value['sczl_bzdh'],
+//                'sczl_bh1' => $value['sczl_bh1'],
+//                'sczl_bh2' => $value['sczl_bh2'],
+//                'sczl_bh3' => $value['sczl_bh3'],
+//                'sczl_bh4' => $value['sczl_bh4'],
+//                'sczl_bh5' => $value['sczl_bh5'],
+//                'sczl_bh6' => $value['sczl_bh6'],
+//                'sczl_bh7' => $value['sczl_bh7'],
+//                'sczl_bh8' => $value['sczl_bh8'],
+//                'Xm1' => $value['sczl_name1'],
+//                'Xm2' => $value['sczl_name2'],
+//                'Xm3' => $value['sczl_name3'],
+//                'Xm4' => $value['sczl_name4'],
+//                'Xm5' => $value['sczl_name5'],
+//                'Xm6' => $value['sczl_name6'],
+//                'Xm7' => $value['sczl_name7'],
+//                'Xm8' => $value['sczl_name8'],
+//                'sczl_rate1' => $value['sczl_rate1'],
+//                'sczl_rate2' => $value['sczl_rate2'],
+//                'sczl_rate3' => $value['sczl_rate3'],
+//                'sczl_rate4' => $value['sczl_rate4'],
+//                'sczl_rate5' => $value['sczl_rate5'],
+//                'sczl_rate6' => $value['sczl_rate6'],
+//                'sczl_rate7' => $value['sczl_rate7'],
+//                'sczl_rate8' => $value['sczl_rate8'],
+//                '类型' => '',
+//                '客户代号' => $value['Gd_客户代号'],
+//                '客户名称' => $value['Gd_客户名称'],
+//                '产品代号' => $value['Gd_cpdh'],
+//                '产品名称' => $value['Gd_cpmc'],
+//                '销售订单号' => $value['销售订单号'],
+//                '订单数量' => $value['订单数量'],
+//                '计量单位' => $value['计量单位'],
+//                '实际投料' => $processedData['实际投料'],
+//                '入仓数量' => $baseData['total_number'],
+//                '入仓日期' => $baseData['workOrderData']['jjcp_sj'],
+//                '大箱数' => $value['投料大箱'],
+//                '废品合计' => $wasteData['工单质检废'] + $wasteData['zcfp'],
+//                'sys_id' => '',
+//                'sys_rq' => date('Y-m-d H:i:s', time()),
+//                '车间名称' => $value['Gy0_SITE']
+//            ];
+//        }
+//
+//        return $result;
+//    }
+//
+//    /**
+//     * 优化的orderLossData方法
+//     */
+//    public function orderLossData()
+//    {
+//        $param = $this->request->param();
+//        $where = $this->buildWhereCondition($param);
+//
+//        $list = Db::name('成品入仓')
+//            ->alias('a')
+//            ->join('设备_产量计酬 b', 'a.jjcp_gdbh = b.sczl_gdbh AND a.jjcp_yjno = b.sczl_yjno')
+//            ->join('物料_收发记录 c', 'a.jjcp_gdbh = c.st_gdbh AND a.jjcp_cpdh = c.cpdh')
+//            ->where($where)
+//            ->whereIn('c.仓库编号', ['101', 'Y101'])
+//            ->field('a.jjcp_gdbh, a.jjcp_yjno')
+//            ->group('a.jjcp_gdbh, a.jjcp_yjno')
+//            ->select();
+//
+//        $successCount = 0;
+//        $failCount = 0;
+//        $errors = [];
+//
+//        // 使用批量处理减少数据库操作
+//        foreach ($list as $item) {
+//            if ($this->processSingleOrder($item)) {
+//                $successCount++;
+//            } else {
+//                $failCount++;
+//                $errors[] = "{$item['jjcp_gdbh']}-{$item['jjcp_yjno']}";
+//            }
+//        }
+//
+//        if ($failCount === 0) {
+//            $this->success("成功处理 {$successCount} 个工单");
+//        } else {
+//            $errorMsg = "失败 {$failCount} 个工单,成功 {$successCount} 个";
+//            if (!empty($errors)) {
+//                $errorMsg .= ",失败的工单: " . implode(', ', array_slice($errors, 0, 10));
+//                if (count($errors) > 10) {
+//                    $errorMsg .= '...';
+//                }
+//            }
+//            $this->error($errorMsg);
+//        }
+//    }
+//
+//    /**
+//     * 构建查询条件
+//     */
+//    private function buildWhereCondition($param)
+//    {
+//        $where = [];
+//
+//        if (isset($param['gdbh']) && isset($param['yjno']) && !empty($param['gdbh']) && !empty($param['yjno'])) {
+//            $where['a.jjcp_gdbh'] = $param['gdbh'];
+//            $where['a.jjcp_yjno'] = $param['yjno'];
+//        }
+//
+//        $month = substr($param['mouth'], 0, 4) . '-' . substr($param['mouth'], 4, 2);
+//
+//        if (isset($param['mouth'])) {
+//            $where['a.jjcp_sj'] = ['like', $month . '%'];
+//        }
+//
+//        $where['a.jjcp_smb'] = ['like', '末%'];
+//
+//        return $where;
+//    }
+//
+//    /**
+//     * 处理单个工单
+//     */
+//    private function processSingleOrder($item)
+//    {
+//        try {
+//            $result = $this->OneOrderSuperLoss($item['jjcp_gdbh'], $item['jjcp_yjno']);
+//
+//            if (!$result) return false;
+//
+//            // 使用事务确保数据一致性
+//            Db::transaction(function() use ($item, $result) {
+//                // 先删除旧数据
+//                Db::name('工单_质量考核汇总')
+//                    ->where('Gy0_gdbh', $item['jjcp_gdbh'])
+//                    ->where('印件及工序', $item['jjcp_yjno'])
+//                    ->delete();
+//
+//                // 批量插入新数据
+//                if (!empty($result)) {
+//                    Db::name('工单_质量考核汇总')->insertAll($result);
+//                }
+//            });
+//
+//            return true;
+//
+//        } catch (\Exception $e) {
+//            Log::error("处理工单失败: {$item['jjcp_gdbh']}-{$item['jjcp_yjno']} - " . $e->getMessage());
+//            return false;
+//        }
+//    }
+//    public function ()
+//    {
+//
+//    }
+
+
+    /**
+     * 创建投料数
+     * @return void
+     */
+    public function feedAdd()
+    {
+        // 1. 请求验证
+        if (!$this->request->isPost()) {
+            $this->error('请求错误');
+        }
+
+        $param = Request::instance()->post();
+        if (empty($param)) {
+            $this->error('参数错误');
+        }
+
+        // 2. 数据验证
+        $requiredFields = ['st_gdbh', 'st_wlbh', 'st_sl', 'st_dw', 'sys_id', 'cpdh'];
+        foreach ($requiredFields as $field) {
+            if (!isset($param[$field]) || $param[$field] === '') {
+                $this->error("参数{$field}不能为空");
+            }
+        }
+
+        try {
+            // 3. 数据准备
+            $currentTime = date('Y-m-d H:i:s');
+            $currentDate = date('Y-m-d');
+
+            // 仓库编号逻辑
+            $cangku = preg_match('/[a-zA-Z]/', $param['st_gdbh']) ? 'Y101' : '101';
+
+            // 4. 主数据
+            $data = [
+                'st_rq' => $currentDate,
+                'st_jylb' => '生产领料',
+                'st_gdbh' => $param['st_gdbh'],
+                'st_wlbh' => $param['st_wlbh'],
+                'st_sl' => $param['st_sl'],
+                'st_dw' => $param['st_dw'],
+                'sys_id' => $param['sys_id'],
+                'sys_rq' => $currentTime,
+                'cpdh' => $param['cpdh'],
+            ];
+
+            // 添加仓库编号(特殊处理)
+            $data['`仓库编号`'] = $cangku;
+
+            // 5. 日志数据
+            $logData = [
+                'Gd_gdbh' => $param['st_gdbh'],
+                'ModifyUser' => $param['sys_id'],
+                'ModifyTime' => $currentTime,
+                'FieldName' => 'st_sl',
+                'NewValue' => $param['st_sl'],
+                'ModifySource' => '新增物料投料数'
+            ];
+
+            // 6. 开启事务
+            Db::startTrans();
+
+            // 7. 插入日志
+            Db::name('系统操作日志表')->insert($logData);
+
+            // 8. 插入主记录 - 手动构建安全的SQL语句
+            $fields = array_keys($data);
+            $values = array_values($data);
+
+            // 构建字段名部分
+            $fieldList = implode(', ', array_map(function($field) {
+                return strpos($field, '`') === 0 ? $field : "`{$field}`";
+            }, $fields));
+
+            // 构建占位符
+            $placeholders = implode(', ', array_fill(0, count($values), '?'));
+
+            // 执行安全的参数化查询
+            $sql = "INSERT INTO `物料_收发记录` ({$fieldList}) VALUES ({$placeholders})";
+            $feedResult = Db::execute($sql, $values);
+
+            if ($feedResult === false) {
+                throw new Exception('新增物料记录失败');
+            }
+
+            // 9. 获取工单信息
+            $totalNum = Db::name('工单_印件资料')
+                ->field('yj_ls, yj_ks, yj_tlgg, yj_zzmc, yj_Yjno')
+                ->where('Yj_Gdbh', $param['st_gdbh'])
+                ->where('yj_Yjdh', $param['cpdh'])
+                ->find();
+
+            if (!$totalNum) {
+                throw new Exception('未找到对应的工单印件资料');
+            }
+
+            // 10. 计算投料数量
+            $num = $param['st_sl'];
+            if (!empty($totalNum['yj_tlgg'])) {
+                $dimensions = explode('*', $totalNum['yj_tlgg']);
+                $number1 = (int)($dimensions[0] ?? 0);
+                $number2 = (int)($dimensions[1] ?? 0);
+
+                preg_match('/(\d+)g/', $totalNum['yj_zzmc'], $matches);
+                $paperWeight = $matches[1] ?? 0;
+
+                if ($param['st_dw'] === '吨' && $paperWeight > 0 && $number1 > 0 && $number2 > 0) {
+                    $num = round(($param['st_sl'] * 1000000) / $paperWeight / ($number1 * $number2) * 1000000);
+                }
+            }
+
+            // 11. 计算实际投料
+            $actualFeed = $num / 10000 * $totalNum['yj_ls'] * $totalNum['yj_ks'];
+
+            // 12. 更新工单基本资料 - 使用原生SQL处理中文字段
+            $updateBasicSql = "UPDATE `工单_基本资料` SET `实际投料` = ? WHERE `Gd_gdbh` = ? AND `Gd_cpdh` = ?";
+            $basicResult = Db::execute($updateBasicSql, [$actualFeed, $param['st_gdbh'], $param['cpdh']]);
+
+            if ($basicResult === false) {
+                throw new Exception('更新工单基本资料失败');
+            }
+
+            // 13. 更新工单印件资料 - 使用原生SQL
+            $updateYjSql = "UPDATE `工单_印件资料` SET `yj_实际投料` = ? WHERE `Yj_Gdbh` = ? AND `yj_cpdh` = ?";
+            $yjResult = Db::execute($updateYjSql, [$actualFeed, $param['st_gdbh'], $param['cpdh']]);
+
+            if ($yjResult === false) {
+                throw new Exception('更新工单印件资料失败');
+            }
+
+            $yjNo = $totalNum['yj_Yjno'];
+
+            // 14. 重新计算工单超节损数据
+            $resultAdd = $this->OneOrderSuperLoss($param['st_gdbh'], $yjNo);
+
+            // 15. 更新质量考核汇总 - 先删除
+            $deleteSql = "DELETE FROM `工单_质量考核汇总` WHERE `Gy0_gdbh` = ? AND `印件及工序` = ?";
+            Db::execute($deleteSql, [$param['st_gdbh'], $yjNo]);
+
+            // 16. 插入新的质量考核数据
+            if (!empty($resultAdd)) {
+                foreach ($resultAdd as $item) {
+                    $fields = array_keys($item);
+                    $values = array_values($item);
+
+                    $fieldList = implode(', ', array_map(function($field) {
+                        return strpos($field, '`') === 0 ? $field : "`{$field}`";
+                    }, $fields));
+
+                    $placeholders = implode(', ', array_fill(0, count($values), '?'));
+
+                    $insertSql = "INSERT INTO `工单_质量考核汇总` ({$fieldList}) VALUES ({$placeholders})";
+                    Db::execute($insertSql, $values);
+                }
+            }
+
+            // 17. 提交事务
+            Db::commit();
+
+            $this->success('新增成功');
+
+        } catch (Exception $e) {
+            // 18. 回滚事务
+            Db::rollback();
+            $this->error('操作失败: ' . $e->getMessage());
+        }
+    }
+    /**
+     * 获取物料信息
+     * @return void
+     * @throws \think\db\exception\DataNotFoundException
+     * @throws \think\db\exception\ModelNotFoundException
+     * @throws \think\exception\DbException
+     */
+    public function getFeedList()
+    {
+        if (Request::instance()->isGet() == false) {
+            $this->error('非法请求');
+        }
+        $params = Request::instance()->request();
+        if (empty($params['workorder']) || empty($params['yjno'])) {
+            $this->error('参数错误');
+        }
+        $field = "a.Gd_gdbh,rtrim(c.yj_Yjdh) as yj_yjdh,c.yj_Yjno, c.yj_ks,c.yj_ls,rtrim(c.yj_zzdh) as yj_zzdh,
+                  rtrim(b.BOM_物料名称) as BOM_物料名称,rtrim(c.yj_tlgg) as yj_tlgg,
+                  a.订单数量,c.yj_平张投料, b.BOM_实际用量,a.投料确认";
+        $data =db('工单_基本资料')->alias('a')
+            ->join('工单_印件资料 c','a.Gd_gdbh = c.Yj_Gdbh ','left')
+            ->join('工单_bom资料 b','c.Yj_Gdbh = b.BOM_工单编号 AND c.yj_zzdh = b.BOM_物料编码','left')
+            ->where('a.Gd_gdbh',$params['workorder'])
+            ->where('c.yj_Yjno',$params['yjno'])
+            ->field($field)
+            ->group('a.Gd_gdbh')
+            ->order('b.BOM_投料单位,a.UniqId asc')
+            ->select();
+        if (empty($data)){
+            $this->success('请求成功');
+        }
+        foreach ($data as $key=>$value){
+            $len = stripos($value['yj_tlgg'],'/');
+            if ($len){
+                $name = substr($value['yj_tlgg'],0,$len);
+                $len_two = stripos($value['yj_tlgg'],'(');
+                if ($len_two){
+                    $name = substr($name,0,$len_two);
+                }
+                $data[$key]['yj_tlgg'] = $name;
+            }
+            $data[$key]['rate'] = '';
+        }
+        $this->success('请求成功',$data);
+    }
 }