Files
OMS/app/ome/lib/autotask/timer/kplstore.php
2026-01-04 19:08:31 +08:00

283 lines
10 KiB
PHP

<?php
/**
* Copyright 2012-2026 ShopeX (https://www.shopex.cn)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
class ome_autotask_timer_kplstore
{
public function process($params, &$error_msg='')
{
set_time_limit(0);
ignore_user_abort(1);
//库存置0
$result = $this->_processStore($error_msg);
if(!$result){
return false;
}
//撤销发货单
$result = $this->_rebackDelivery($error_msg);
if(!$result){
return false;
}
return true;
}
/**
* 检查开普勒商品库存
*
* @return boolean
*/
private function _processStore(&$error_msg='')
{
// 查询一件代发区域仓
$sql = 'SELECT a.*, b.branch_id, b.wms_id, b.branch_bn, w.warn_num, c.node_id
FROM sdb_logisticsmanager_warehouse_address a
LEFT JOIN sdb_logisticsmanager_warehouse w ON(w.id=a.warehouse_id)
LEFT JOIN sdb_ome_branch b ON(w.branch_id = b.branch_id)
LEFT JOIN sdb_channel_channel c ON(c.channel_id = b.wms_id)
WHERE c.node_type = "yjdf" AND c.node_id IS NOT NULL AND c.node_id != ""';
$list = kernel::database()->select($sql);
if (!$list) {
$error_msg = '没有一件代发区域仓';
return false;
}
// 区域仓地址
$areaWarehouses = [];
foreach($list as $l)
{
$object = kernel::single('erpapi_router_request')->set('wms', $l['wms_id']);
$platform_area = $object->branch_getAreaId([
'ship_province' => $l['province'],
'ship_city' => $l['city'],
'ship_district' => $l['street'],
'ship_town' => $l['town'],
'ship_addr' => $l['address'],
]);
$l['provinceId'] = $platform_area['data']['provinceid'];
$l['cityId'] = $platform_area['data']['cityid'];
$l['townId'] = $platform_area['data']['streetid'];
$l['countyId'] = $platform_area['data']['townid'];
$areaWarehouses[$l['branch_id']][] = $l;
}
// 查询渠道所有在架及有库存商品
$wms_ids = array_column($list, 'wms_id');
$branch_ids = array_column($list, 'branch_id');
$sql = 'SELECT fs.wms_id,fs.outer_sku,fs.inner_sku,bp.branch_id,bp.store,bp.product_id AS bm_id
FROM sdb_console_foreign_sku fs
LEFT JOIN sdb_ome_branch_product bp
ON(fs.inner_product_id = bp.product_id)
WHERE fs.wms_id IN(' . implode(',', $wms_ids) . ') AND bp.branch_id IN(' . implode(',', $branch_ids) . ')';
$sql .= ' AND bp.store > 0';
$deliveryList = app::get('ome')->model('delivery')->getList('delivery_id,branch_id,delivery_bn', [
'status' => ['ready', 'progress'],
'parent_id' => '0',
'branch_id' => $branch_ids,
'sync_status' => '2',
'original_delivery_bn' => '0',
'filter_sql' => 'sync_msg regexp "商品无货"',
]);
if (!$deliveryList) {
$error_msg = '没有可操作的发货单';
return false;
}
$delivery_ids = array_column($deliveryList, 'delivery_id');
//发货单明细
$itemList = app::get('ome')->model('delivery_items')->getList('product_id', ['delivery_id'=>$delivery_ids]);
$sql .= ' AND bp.product_id IN(' . implode(',', array_column($itemList, 'product_id')) . ')';
//list
$list = kernel::database()->select($sql);
if(!$list) {
$error_msg = '没有基础物料分配商品';
return false;
}
//京东云交易渠道只能绑定一个
$kplChannel = app::get('wmsmgr')->model('channel')->getList('*', [
'node_type' => 'yjdf',
]);
if (count($kplChannel) != 1) {
$error_msg = '京东云交易渠道只能绑定一个,现在是'. count($kplChannel) .'个';
return false;
}
// 按渠道分类
$skus_list = [];
foreach ($list as $l)
{
$l['material_bn'] = $l['outer_sku'] ?: $l['inner_sku'];
$skus_list[$l['branch_id']][$l['material_bn']] = $l;
}
$rt = false;
$channel_id = $kplChannel[0]['channel_id'];
foreach ($skus_list as $branch_id => $skus)
{
// 区域仓列表
$addrs = $areaWarehouses[$branch_id];
$invItems = [];
foreach (array_chunk($skus, 10) as $v)
{
$params = [
'channel_id' => $channel_id,
'skus' => $v,
'addrs' => $addrs,
];
//查询京东云交易商品的库存(指定SKU)
$result = kernel::single('erpapi_router_request')->set('wms', $v[0]['wms_id'])->goods_selectStore($params);
if ($result['data']) {
if ($result['data'][0]) {
// 库存追零
foreach ($result['data'][0] as $outer_sku)
{
if (in_array($outer_sku, $result['data'][1])) {
continue;
}
$invItems[] = [
'product_bn' => $skus[$outer_sku]['inner_sku'],
'item_id' => $outer_sku,
'mode' => '1',
'normal_num' => -$skus[$outer_sku]['store'],
];
}
}
}
}
//同步OMS库存
if($invItems){
$inventory = array(
'inventory_bn' => uniqid('KEPLER'),
'warehouse' => $addrs[0]['branch_bn'],
'memo' => '同步开普勒库存',
'autoconfirm' => 'Y',
'item' => json_encode($invItems),
);
kernel::single('erpapi_router_response')->set_node_id($addrs[0]['node_id'])->set_api_name('wms.inventory.add')->dispatch($inventory);
//标识
$rt = true;
}
}
return $rt;
}
/**
* 撤销发货单,重新路由审核订单
*
* @param string $error_msg
* @return bool
*/
private function _rebackDelivery(&$error_msg='')
{
// 开普勒仓储
$channel = app::get('channel')->model('channel')->dump([
'node_type' => 'yjdf',
'filter_sql' => 'node_id IS NOT NULL AND node_id != ""',
], 'channel_id');
//check
if (!$channel) {
$error_msg = '没有京东云交易渠道';
return false;
}
$branchList = app::get('ome')->model('branch')->getList('branch_id', [
'wms_id' => $channel['channel_id'],
'b_type' => '1',
]);
if (!$branchList) {
$error_msg = '没有京东云交易关联仓库';
return false;
}
$deliveryList = app::get('ome')->model('delivery')->getList('delivery_id,branch_id,delivery_bn', [
'status' => ['ready', 'progress'],
'parent_id' => '0',
'branch_id' => array_column($branchList, 'branch_id'),
'sync_status' => '2',
'original_delivery_bn' => '0',
'filter_sql' => 'sync_msg regexp "商品无货"',
]);
if (!$deliveryList) {
$error_msg = '没有无货的发货单';
return false;
}
//list
foreach ($deliveryList as $delivery)
{
//请求京东云交易取消发货单
$res = ome_delivery_notice::cancel($delivery, true);
if ($res['rsp'] == 'succ') {
//OMS取消发货单
$msg = '京东云交易商品无货,系统自动取消发货单';
$data = [
'status' => 'cancel',
'memo' => $msg,
'delivery_bn' => $delivery['delivery_bn'],
];
$res = kernel::single('ome_event_receive_delivery')->update($data);
if ($res['rsp'] == 'succ') {
$deliveryOrderList = app::get('ome')->model('delivery_order')->getList('order_id', [
'delivery_id' => $delivery['delivery_id'],
]);
// 重新路由 TODO
$orderIds = array_column($deliveryOrderList, 'order_id');
if ($orderIds) {
// 订单恢复
foreach ($orderIds as $order_id)
{
app::get('ome')->model('orders')->renewOrder($order_id);
}
//是否要把sdb_ome_objects表中,指定仓库编码store_code字段更新为空
//放入队列,重新审核订单
kernel::single('ome_batch_log')->split($orderIds);
}
}
}
}
return true;
}
}