239 lines
12 KiB
PHP
239 lines
12 KiB
PHP
|
<?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 '';
|
|||
|
}
|
|||
|
}
|