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;
|
||
}
|
||
}
|