mirror of
https://gitee.com/ShopeX/OMS
synced 2026-03-30 13:05:34 +08:00
215 lines
6.9 KiB
PHP
215 lines
6.9 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 pos_autotask_timer_invsnapshot
|
|
{
|
|
|
|
/**
|
|
* 处理
|
|
* @param mixed $params 参数
|
|
* @param mixed $error_msg error_msg
|
|
* @return mixed 返回值
|
|
*/
|
|
|
|
public function process($params, &$error_msg = '')
|
|
{
|
|
set_time_limit(0);
|
|
ignore_user_abort(1);
|
|
@ini_set('memory_limit', '1024M');
|
|
|
|
$invMdl = app::get('pos')->model('inventory_snapshot');
|
|
|
|
if ($params['invs_id']) {
|
|
$inventory = $invMdl->dump($params['invs_id']);
|
|
|
|
if ($inventory) {
|
|
$this->_syncQty($inventory);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
$stock_date = date('Y-m-d', strtotime('yesterday'));
|
|
|
|
$server = app::get('o2o')->model('server')->dump(['node_type' => 'pekon']);
|
|
|
|
if (!$server) {
|
|
return true;
|
|
}
|
|
|
|
// 只查trade btq库存
|
|
$storeList = app::get('o2o')->model('store')->getList('store_id,store_bn', [
|
|
'server_id' => $server['server_id'],
|
|
'store_sort' => ['BTQ','Trade'],
|
|
]);
|
|
|
|
if (!$storeList) {
|
|
return true;
|
|
}
|
|
$storeList = array_column($storeList, null, 'store_id');
|
|
|
|
$branchList = app::get('ome')->model('branch')->getList('branch_id,branch_bn,store_id,storage_code', [
|
|
'store_id' => array_column($storeList, 'store_id'),
|
|
'check_permission' => 'false',
|
|
]);
|
|
|
|
if (!$branchList) {
|
|
return true;
|
|
}
|
|
|
|
|
|
foreach ($branchList as $key => $value) {
|
|
$store = $storeList[$value['store_id']];
|
|
|
|
$inventory = $invMdl->dump([
|
|
'stock_date' => $stock_date,
|
|
'store_id' => $store['store_id'],
|
|
'branch_id' => $value['branch_id'],
|
|
]);
|
|
|
|
if (!$inventory) {
|
|
$inventory = [
|
|
'stock_date' => $stock_date,
|
|
'status' => '1',
|
|
'store_bn' => $store['store_bn'],
|
|
'store_id' => $store['store_id'],
|
|
'branch_bn' => $value['branch_bn'],
|
|
'branch_id' => $value['branch_id'],
|
|
'storage_code' => $value['storage_code'],
|
|
];
|
|
|
|
$invMdl->insert($inventory);
|
|
}
|
|
|
|
// 加入队列
|
|
kernel::single('taskmgr_interface_connecter')->push([
|
|
'data' => [
|
|
'task_type' => 'pos_sync_inv',
|
|
'invs_id' => $inventory['id'],
|
|
],
|
|
'url' => kernel::openapi_url('openapi.autotask', 'service'),
|
|
]);
|
|
|
|
// $this->_syncQty($inventory);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 同步库存
|
|
*
|
|
* @return void
|
|
* @author
|
|
**/
|
|
private function _syncQty($inventory)
|
|
{
|
|
if ($inventory['status'] == '2') {
|
|
return;
|
|
}
|
|
|
|
$invMdl = app::get('pos')->model('inventory_snapshot');
|
|
$invItemMdl = app::get('pos')->model('inventory_snapshot_items');
|
|
|
|
$get_count = (int) $inventory['get_count'];
|
|
$pageNo = floor($get_count / 100) + 1;
|
|
|
|
$pos_stock = (int) $inventory['pos_stock'];
|
|
do {
|
|
$sdf['page_no'] = $pageNo;
|
|
$sdf['page_size'] = '100';
|
|
$sdf['branch_bn'] = $inventory['branch_bn'];
|
|
|
|
$result = kernel::single('erpapi_router_request')->set('store', $inventory['store_id'])->stock_get($sdf);
|
|
|
|
if ($result['rsp'] == 'fail') {
|
|
$invMdl->update(['status' => '3', 'errmsg' => $result['msg']], [
|
|
'id' => $inventory['id'],
|
|
]);
|
|
|
|
kernel::single('monitor_event_notify')->addNotify('pos_stock_sync', [
|
|
'store_bn' => $inventory['store_bn'],
|
|
'branch_bn' => $inventory['branch_bn'],
|
|
'page_no' => $pageNo,
|
|
'errmsg' => $result['msg'],
|
|
]);
|
|
|
|
return;
|
|
}
|
|
|
|
if (!$result['data']['inventoryItems'] || $result['data']['totalCount'] == '0') {
|
|
$invMdl->update(['status' => '2', 'errmsg' => ''], [
|
|
'id' => $inventory['id'],
|
|
]);
|
|
|
|
break;
|
|
}
|
|
|
|
if ($pageNo == 1) {
|
|
$invMdl->update(['total_count' => $result['data']['totalCount']], [
|
|
'id' => $inventory['id'],
|
|
]);
|
|
}
|
|
|
|
$invItems = [];
|
|
foreach ($result['data']['inventoryItems'] as $key => $value) {
|
|
$invItems[] = [
|
|
'invs_id' => $inventory['id'],
|
|
'stock_date' => $inventory['stock_date'],
|
|
'store_bn' => $inventory['store_bn'],
|
|
'store_id' => $inventory['store_id'],
|
|
'branch_bn' => $inventory['branch_bn'],
|
|
'branch_id' => $inventory['branch_id'],
|
|
'item_code' => $value['productSkuCode'],
|
|
'item_id' => $value['productSkuId'],
|
|
'quantity' => (int) $value['usableQuantity'] + (int) $value['lockedQuantity'],
|
|
'lock_quantity' => (int) $value['lockedQuantity'],
|
|
'expire_date' => $value['expirationDate'],
|
|
'inventory_type' => $value['skuAddType'],
|
|
];
|
|
}
|
|
|
|
$affectRs = kernel::database()->exec(ome_func::get_insert_sql($invItemMdl, $invItems));
|
|
|
|
if ($affectRs) {
|
|
$get_count += count($invItems);
|
|
$pos_stock += array_sum(array_column($invItems, 'quantity'));
|
|
$invMdl->update(['get_count' => $get_count, 'pos_stock' => $pos_stock, 'errmsg'=>''], [
|
|
'id' => $inventory['id'],
|
|
]);
|
|
}
|
|
|
|
$pageNo++;
|
|
} while (true);
|
|
|
|
// 生成日盘
|
|
kernel::single('taskmgr_interface_connecter')->push([
|
|
'data' => [
|
|
'task_type' => 'dailyinventory',
|
|
'channel_type' => 'store',
|
|
'invs_id' => $inventory['id'],
|
|
],
|
|
'url' => kernel::openapi_url('openapi.autotask', 'service'),
|
|
]);
|
|
|
|
return;
|
|
}
|
|
|
|
}
|