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

239 lines
12 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\action;
use Exception;
use libs\db\Db;
/**
* ERP采购PO同步接口
* Class SetPurchaseOrder
* @package app\action
*/
class SetPurchaseOrder
{
public function execute($post)
{
// 验证数据
$param = check_valid($post['action'], [
['orderMaterialData', 'array', '采购订单数据集'],
], $post['param']);
try {
$orderMaterialData = $param['orderMaterialData'];
// 检索是否存在必要字段
foreach ($orderMaterialData as $index => $item) {
$idx = $index + 1;
$check_feilds = [
['name' => 'supplier_code', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'supplier_name', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'purchase_order_code', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'po_category', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'po_header_id', 'feild_type' => 'int', 'required' => true, 'len' => 100],
['name' => 'po_number', 'feild_type' => 'int', 'required' => true, 'len' => 100],
['name' => 'po_line_number', 'feild_type' => 'int', 'required' => true, 'len' => 100],
['name' => 'po_release_number', 'feild_type' => 'int', 'required' => true, 'len' => 100],
['name' => 'shipment_num', 'feild_type' => 'int', 'required' => true, 'len' => 100],
['name' => 'code', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'name', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'purchase_qty', 'feild_type' => 'int', 'required' => true, 'len' => 20],
['name' => 'acceptable_qty', 'feild_type' => 'int', 'required' => true, 'len' => 20],
['name' => 'estimated_delivery_time', 'feild_type' => 'timestamp', 'required' => false, 'len' => 6],
['name' => 'unit_code', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'unit_name', 'feild_type' => 'string', 'required' => true, 'len' => 100],
['name' => 'create_time', 'feild_type' => 'timestamp', 'required' => true, 'len' => 6],
['name' => 'update_time', 'feild_type' => 'timestamp', 'required' => true, 'len' => 6],
['name' => 'active', 'feild_type' => 'int', 'required' => true, 'len' => 32],
];
foreach ($check_feilds as $val) {
if (!isset($item[$val['name']])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象不存在字段[{$val['name']}]", 4001);
}
if ($val['required']) {
if ($val['feild_type'] == 'string') {
// 判断是否是一个字符串
if (!is_string($item[$val['name']])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象[{$val['name']}]的值不是字符串类型,请检查!", 4001);
}
if (empty($item[$val['name']])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象字段[{$val['name']}]的值不能为空", 4001);
}
// 判断长度
if (strlen($item[$val['name']]) > $val['len']) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象[{$val['name']}]的值不符合规定的长度[{$val['len']}],请检查!", 4001);
}
} elseif ($val['feild_type'] == 'int') {
if (!is_int($item[$val['name']])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象对应的字段[{$val['name']}]值不是整数数字类型", 4001);
}
if ($val == 'active') {
if (!in_array($item[$val['name']], [0, 1])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象对应的字段[{$val['name']}]值只能是0或者1", 4001);
}
}
}
// 判断采购类型
if ($val['name'] == 'po_category' && !in_array($item['po_category'], ['STANDARD', 'BLANKET'])) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象字段[{$val['name']}]的值只能是STANDARD或者BLANKET", 4001);
}
// 判断创建修改时间格式是否正确
if ($val['name'] == 'create_time' || $val['name'] == 'update_time') {
if (date('Y-m-d H:i:s', strtotime($item[$val['name']])) != $item[$val['name']]) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象字段[{$val['name']}]的时间格式不正确正确例子如2023-01-01 09:09:09", 4001);
}
}
} else {
if ($val['name'] == 'estimated_delivery_time') {
if (!empty($item[$val['name']])) {
$is_true = false;
if (date('Y-m-d H:i:s', strtotime($item[$val['name']])) == $item[$val['name']]) {
$is_true = true;
}
if (date('Y-m-d', strtotime($item[$val['name']])) == $item[$val['name']]) {
$is_true = true;
}
if (!$is_true) {
throw new Exception("采购订单数据集第[{$idx}]位置数据对象字段[{$val['name']}]的时间格式不正确正确例子如2023-01-01 09:09:09或者2023-01-01", 4001);
}
}
}
}
}
$orderMaterialData[$index]['status'] = $orderMaterialData[$index]['active'];
}
foreach ($orderMaterialData as $value) {
list($ret_exists, $where) = [
array(),
''
];
// 判断采购单类型STANDARD(标准)/BLANKET(一揽子发放)
if ($value['po_category'] == 'STANDARD') {
$where = "po_number='{$value['po_number']}' AND po_release_number='{$value['po_release_number']}' AND shipment_num='{$value['shipment_num']}'";
// 如果是STANDARD那么以po_header_id采购订单ID、po_number采购订单行号、shipment_num采购订单发运行号作为唯一键修改数据
// 检测编码是否存在
$sql = sprintf(
"SELECT id
FROM hf_mes_wms_erp_purchase_order
WHERE %s LIMIT 1;",
$where
);
$ret_exists = Db::fetch($sql);
} else {
$where = "po_number='{$value['po_number']}' AND po_line_number='{$value['po_line_number']}' AND po_release_number='{$value['po_release_number']}' AND shipment_num='{$value['shipment_num']}'";
// 如果是BLANKET那么以po_header_id采购订单ID、po_number采购订单行号、shipment_num采购订单发运行号、po_line_number采购订单发放号作为唯一键修改数据
// 检测编码是否存在
$sql = sprintf(
"SELECT id
FROM hf_mes_wms_erp_purchase_order
WHERE %s LIMIT 1;",
$where
);
$ret_exists = Db::fetch($sql);
}
if (!empty($ret_exists)) {
// 修改数据
$update_keys = [
'supplier_code',
'supplier_name',
'purchase_order_code',
'po_category',
'po_header_id',
'po_number',
'po_line_number',
'po_release_number',
'shipment_num',
'code',
'name',
'status',
'purchase_qty',
'acceptable_qty',
'estimated_delivery_time',
'unit_code',
'unit_name',
'create_time',
'update_time'
];
$update_str = '';
foreach ($update_keys as $key) {
if (isset($value[$key])) {
if (in_array($key, ['status'])) {
$update_str .= "\"{$key}\"={$value[$key]},";
} else {
$update_str .= "\"{$key}\"='{$value[$key]}',";
}
}
}
$sql = sprintf(
"UPDATE \"%s\" SET %s WHERE %s;",
'hf_mes_wms_erp_purchase_order',
rtrim($update_str, ','),
$where
);
Db::query($sql);
} else {
// 新增数据
$insert_keys = [
'supplier_code',
'supplier_name',
'purchase_order_code',
'po_category',
'po_header_id',
'po_number',
'po_line_number',
'po_release_number',
'shipment_num',
'code',
'name',
'status',
'purchase_qty',
'acceptable_qty',
'estimated_delivery_time',
'unit_code',
'unit_name',
'create_time',
'update_time'
];
$insert_key_str = '';
$insert_val_str = '';
foreach ($insert_keys as $key) {
if (isset($value[$key])) {
if (!empty($value[$key])) {
$insert_key_str .= "\"{$key}\",";
if (in_array($key, ['status'])) {
$insert_val_str .= "{$value[$key]},";
} else {
$insert_val_str .= "'{$value[$key]}',";
}
}
}
}
$sql = sprintf(
"INSERT INTO %s(%s) VALUES (%s)",
'hf_mes_wms_erp_purchase_order',
rtrim($insert_key_str, ','),
rtrim($insert_val_str, ',')
);
Db::query($sql);
}
}
} catch (Exception $e) {
throw new Exception($e->getMessage(), $e->getCode() ? $e->getCode() : 4001);
}
return '';
}
}