|
|
@@ -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);
|
|
|
+ }
|
|
|
}
|
|
|
|