SCTMES_V5/mes_in_sct/app/event/CreateBkvEvent.php
2025-06-14 18:55:09 +08:00

142 lines
5.1 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?php
namespace app\event;
use Exception;
use libs\db\Db;
use libs\listener\Event;
class CreateBkvEvent extends Event
{
public function handle($data)
{
if (count($data) <= 0) {
throw new Exception('写入数据为空,请检查!');
}
$subbatch = $data['subbatch'];
// 获取子批次的数量判断是否超出200万如果超出新增一张新表
$sql = sprintf(
"SELECT COUNT(id) AS count FROM \"%s\"",
config('app.bkv_prefix') . $subbatch,
);
$ret = Db::fetch($sql);
if (!empty($ret) && $ret['count'] > 2000000) {
// 获取全部的工序
$sql = sprintf(
"SELECT id,code FROM \"%s\" WHERE flow_id=%s ORDER BY id ASC;",
'hf_mes_technology_process',
$data['flow_id']
);
$process_data = Db::query($sql);
if (empty($process_data)) {
throw new Exception('不存在工序数据');
}
$date = date('Y-m-d H:i:s');
$new_subbatch = date('YmdHis', strtotime($date)) . '_' . $data['batch'];
$bkv_table = config('app.bkv_prefix') . $new_subbatch;
// 写入子批的数据
$row = Db::insert('hf_mes_production_planning_management_subbatch', [
'batch_id' => $data['batch_id'],
'flow_id' => $data['flow_id'],
'subbatch' => $new_subbatch,
'create_time' => $date
]);
if ($row === NULL) {
throw new Exception("写入子批次数据失败");
}
// 组装结果参数
$s = '';
foreach ($process_data as $vp) {
// 获取工序对应的工序编码
$sql = sprintf(
"SELECT code,field_type FROM \"%s\" WHERE process_id=%s ORDER BY id ASC;",
'hf_mes_technology_process_result_param',
$vp['id']
);
$result_param = Db::query($sql);
if (empty($result_param)) {
continue;
}
// 组装BKV表每个工序的结果参数
foreach ($result_param as $vp_params) {
$p_code = $vp['code'] . '.' . $vp_params['code'];
if ($vp_params['field_type'] == 'VARCHAR') {
$s = $s . '"' . $p_code . '" varchar(50) COLLATE "pg_catalog"."default",';
} elseif ($vp_params['field_type'] == 'FLOAT') {
$s = $s . '"' . $p_code . '" float8 DEFAULT 0,';
} elseif ($vp_params['field_type'] == 'INT') {
$s = $s . '"' . $p_code . '" int4 DEFAULT 0,';
} elseif ($vp_params['field_type'] == 'TIMESTAMP') {
$s = $s . '"' . $p_code . '" timestamp(6),';
} else {
$s = $s . '"' . $p_code . '" text COLLATE "pg_catalog"."default",';
}
}
}
$s = rtrim($s, ',');
$sql = <<<SQL
CREATE TABLE "{$bkv_table}" (
"id" serial PRIMARY KEY,
"battery_id" varchar(100) COLLATE "pg_catalog"."default",
"tray" varchar(45) COLLATE "pg_catalog"."default",
"lot" varchar(45) COLLATE "pg_catalog"."default",
"active" int4 DEFAULT 0,
"class" varchar(30) COLLATE "pg_catalog"."default",
"classname" varchar(45) COLLATE "pg_catalog"."default",
"process_code" varchar(45) COLLATE "pg_catalog"."default",
"process_idx" int4 DEFAULT 1,
"next_process_code" varchar(45) COLLATE "pg_catalog"."default",
"item_name" varchar(100) COLLATE "pg_catalog"."default",
"item_code" varchar(45) COLLATE "pg_catalog"."default",
"item_batch" varchar(100) COLLATE "pg_catalog"."default",
"item_device_code" varchar(45) COLLATE "pg_catalog"."default",
"item_quantity" float8 DEFAULT 0,
"item_batch_start_time" TIMESTAMP(6),
"item_batch_finish_time" TIMESTAMP(6),
"pid" jsonb,
"uuid" jsonb,
"bom_source_id" int4 DEFAULT 0,
"bom_id" int4 DEFAULT 0,
{$s})
SQL;
// 执行创建表语句
Db::query($sql);
// 创建索引
$comment = <<<SQL
CREATE INDEX idx_{$bkv_table}_tray_lot_battery_id ON "{$bkv_table}" (tray,lot,battery_id);
CREATE INDEX idx_{$bkv_table}_tray_lot ON "{$bkv_table}" (tray,lot);
CREATE INDEX idx_{$bkv_table}_battery_id ON "{$bkv_table}" (battery_id);
CREATE INDEX idx_{$bkv_table}_uuid ON "{$bkv_table}" (uuid);
SQL;
$comment_arr = explode(';', $comment);
foreach ($comment_arr as $item) {
if (!empty($item)) {
if (strpos($item, 'idx') !== false) {
$idx = Db::query("SELECT tablename FROM pg_indexes WHERE indexname='{$item}';");
if (!empty($idx)) {
Db::query("DROP INDEX {$item};");
}
}
Db::query($item);
}
}
}
return $data;
}
}