SCTMES_V5/mes_in_sct/app/event/CreateBkvEvent.php

142 lines
5.1 KiB
PHP
Raw Normal View History

2025-06-14 18:55:09 +08:00
<?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;
}
}