142 lines
5.1 KiB
PHP
142 lines
5.1 KiB
PHP
|
<?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;
|
|||
|
}
|
|||
|
}
|