Files
OMS/app/erpapi/lib/store/response/appropriation.php
2026-01-04 19:08:31 +08:00

492 lines
17 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 erpapi_store_response_appropriation extends erpapi_store_response_abstract
{
/**
* @param 调拨单创建 method=store.appropriation.add
* return
*/
public function add($params){
$this->__apilog['title'] = $this->__channelObj->store['name'].'调拨单创建';
$this->__apilog['original_bn'] = $params['appropriation_no'];
if (!$params['from_store']) {
$this->__apilog['result']['msg'] = '缺少出货门店';
return false;
}
if (!$params['to_store']) {
$this->__apilog['result']['msg'] = '缺少到货门店';
return false;
}
if (!$params['from_branch']) {
$this->__apilog['result']['msg'] = '缺少出货仓库';
return false;
}
if (!$params['to_branch']) {
$this->__apilog['result']['msg'] = '缺少到货仓库';
return false;
}
$approMdl = app::get('taoguanallocate')->model('appropriation');
$appro = $approMdl->db_dump(array('appropriation_no' => $params['appropriation_no']),'appropriation_id');
if ($appro) {
$this->__apilog['result']['msg'] = sprintf('[%s]调拨单已存在', $params['appropriation_no']);
return false;
}
if ($params['from_branch'] == $params['to_branch']){
$this->__apilog['result']['msg'] = '出货仓库和到货仓库不可相同';
return false;
}
//
/* if($params['bill_type'] == 'returnnormal'){//门店补货根据路由选择补货仓
$flow = app::get('o2o')->model('branch_flow')->dump([
'to_store_bn' => $params['from_store'],
]);
if(!$flow){
$this->__apilog['result']['msg'] = '门店对应退货仓未维护';
return false;
}
$channel = app::get('o2o')->model('channel')->dump([
'id' => $flow['channel_id'],
],'reship_branch_bn');
if(!$channel){
$this->__apilog['result']['msg'] = '门店对应退货仓未设置';
return false;
}
$params['to_branch'] = $channel['reship_branch_bn'];
}*/
$branchMdl = app::get('ome')->model('branch');
// 出货仓处理
$from_store = $branchMdl->db_dump(array('branch_bn'=>$params['from_branch'], 'check_permission'=> 'false'), 'branch_id,name,branch_bn,b_type,type');
if (!$from_store) {
$this->__apilog['result']['msg'] = sprintf('出货仓[%s]:未维护', $params['from_branch']);
return false;
}
// 进货仓处理
$to_store = $branchMdl->db_dump(array('branch_bn' =>$params['to_branch'], 'check_permission' => 'false'), 'branch_id,name,branch_bn,b_type,type');
if (!$to_store) {
$this->__apilog['result']['msg'] = sprintf('到货仓[%s]:未维护', $params['to_branch']);
return false;
}
//判断单据转换类型操作
$bill_type = $params['bill_type'];
$storeMdl = app::get('o2o')->model('store');
$from_physics = $storeMdl->db_dump(array('store_bn'=> $params['from_store']),'store_id');
$to_physics = $storeMdl->db_dump(array('store_bn' => $params['to_store']),'store_id');
$materialMdl = app::get('material')->model('basic_material');
// 明细处理
$items = @json_decode($params['items'], true);
if (!$items) {
$this->__apilog['result']['msg'] = '缺少调拨明细';
return false;
}
$bn_list = array();
foreach ((array)$items as $key => $value) {
if (!is_numeric($value['nums']) || $value['nums'] <= 0) {
$this->__apilog['result']['msg'] = sprintf('行明细[%s]:数量异常', $key);
return false;
}
if($value['barcode'] && empty($value['bn'])){
$bn = kernel::single('material_codebase')->getBnBybarcode($value['barcode']);
$items[$key]['bn'] = $bn;
$value['bn'] = $bn;
if(empty($bn)){
$this->__apilog['result']['msg'] = sprintf('行明细[%s]:条码不存在', $key);
return false;
}
}
if (!$value['bn']) {
$this->__apilog['result']['msg'] = sprintf('行明细[%s]:物料编码或条码必须有一个不为空', $key);
return false;
}
$bn_list[] = $value['bn'];
}
$bm_list = app::get('material')->model('basic_material')->getList('bm_id,material_bn,material_name', array('material_bn' => $bn_list));
$bm_list = array_column($bm_list, null, 'material_bn');
$bm_id_list = array_column($bm_list, 'bm_id');
// 查询出库仓库存
// 需要区分门店和电商仓
$bpModel = app::get('ome')->model('branch_product');
$product_store = array();
foreach($bpModel->getList('product_id,branch_id,store,store_freeze', array('product_id' => $bm_id_list, 'branch_id' => $from_store['branch_id'])) as $value){
$product_store[$value['branch_id']][$value['product_id']] = $value['store'] - $value['store_freeze'];
}
foreach($bpModel->getList('product_id,branch_id,store,store_freeze', array('product_id' => $bm_id_list, 'branch_id' => $to_store['branch_id'])) as $value){
$product_store[$value['branch_id']][$value['product_id']] = $value['store'] - $value['store_freeze'];
}
// 判断出货仓是否有库存
foreach ((array)$items as $key => $value) {
$bm_id = $bm_list[$value['bn']]['bm_id'];
$material_name = $bm_list[$value['bn']]['material_name'];
if (!$bm_id) {
$this->__apilog['result']['msg'] = sprintf('行明细物料[%s]:未维护', $key);
return false;
}
if ($value['nums'] > $product_store[$from_store['branch_id']][$bm_id]) {
$this->__apilog['result']['msg'] = sprintf('[%s]:库存不足', $value['bn']);
return false;
}
$items[$key]['product_id'] = $bm_id;
$items[$key]['material_name'] = $material_name;
$items[$key]['material_bn'] = $value['bn'];
$items[$key]['from_branch_id'] = $from_store['branch_id'];
$items[$key]['to_branch_id'] = $to_store['branch_id'];
$items[$key]['num'] = $value['nums'];
$items[$key]['to_branch_num'] = $product_store[$to_store['branch_id']][$bm_id];
$items[$key]['from_branch_num'] = $product_store[$from_store['branch_id']][$bm_id];
$items[$key]['package_code'] = $value['batch_code'];
unset($items[$key]['nums']);
}
$oper = kernel::single('ome_func')->getDesktopUser();
if($params['receiver_province'] && $params['receiver_city'] && $params['receiver_district']){
$area = $params['receiver_province'] .'/'. $params['receiver_city'] .'/'. $params['receiver_district'];
kernel::single('ome_func')->region_validate($area);
}
$data = array(
'from_branch_id' => $from_store['branch_id'],
'to_branch_id' => $to_store['branch_id'],
'from_physics_id' => $from_physics['store_id'],
'to_physics_id' => $to_physics['store_id'],
'bill_type' => $params['bill_type'],
'items' => $items,
'memo' => $params['memo'],
'op_name' => $params['application_name'] ? $params['application_name'] : $oper['op_name'],
'appropriation_no' => $params['appropriation_no'],
'process_status' => '1',
//'movement_code' => $params['movement_code'],
'source_from' => 'pos',
'logi_code' => $params['logi_code'],
'logi_no' => $params['logi_no'],
'receiver_province'=> $params['receiver_province'],
'receiver_city' => $params['receiver_city'],
'receiver_district' => $params['receiver_district'],
'extra_ship_area' => $area,
'extra_ship_addr' => $params['receiver_address'],
'extra_ship_mobile' => $params['receiver_mobile'],
'extra_ship_name' => $params['receiver_name'],
);
return $data;
}
/**
* 调拔申请单审核 method=store.appropriation.check
* @param
* @return
*/
public function check($params){
$this->__apilog['title'] = '调拔申请单审核';
$this->__apilog['original_bn'] = $params['appropriation_no'];
if (!$params['appropriation_no']) {
$this->__apilog['result']['msg'] = '缺少调拨单号';
return false;
}
if (!$params['store_bn']){
$this->__apilog['result']['msg'] = '缺少门店编码';
return false;
}
$branch = $this->getBranchIdByBn($params['store_bn']);
if (!$branch){
$this->__apilog['result']['msg'] = sprintf('[%s]门店不存在', $params['store_bn']);
return false;
}
$approMdl = app::get('taoguanallocate')->model('appropriation');
$appro = $approMdl->db_dump(array('appropriation_no' => $params['appropriation_no']),'appropriation_id,process_status,bill_type');
if (!$appro) {
$this->__apilog['result']['msg'] = sprintf('[%s]调拨单不存在', $params['appropriation_no']);
return false;
}
if (!in_array($appro['process_status'],array('1'))){
$this->__apilog['result']['msg'] = sprintf('[%s]当前调拨单状态不可操作', $params['appropriation_no']);
return false;
}
$filter = array(
'appropriation_id' => $appro['appropriation_id'],
'bill_type' => $appro['bill_type'],
'appropriation_no' => $params['appropriation_no'],
);
return $filter;
}
/**
* 调拔申请单取消 method=store.appropriation.cancel
* @param
* @return
*/
public function cancel($params){
$this->__apilog['title'] = '调拔申请单拒绝';
$this->__apilog['original_bn'] = $params['appropriation_no'];
if (!$params['appropriation_no']) {
$this->__apilog['result']['msg'] = '缺少调拨单号';
return false;
}
if (!$params['store_bn']){
//$this->__apilog['result']['msg'] = '缺少门店编码';
// return false;
}
$branchMdl = app::get('ome')->model('branch');
$branch = $branchMdl->db_dump(array('branch_bn' => $params['store_bn'], 'check_permission' => 'false'), 'branch_id');
if (!$branch){
//$this->__apilog['result']['msg'] = sprintf('[%s]门店不存在', $params['store_bn']);
// return false;
}
$branch_id = $branch['branch_id'];
$approMdl = app::get('taoguanallocate')->model('appropriation');
$appro = $approMdl->db_dump(array('appropriation_no' => $params['appropriation_no']),'appropriation_id,process_status,bill_type,process_status');
if (!$appro) {
$this->__apilog['result']['msg'] = sprintf('[%s]调拨单不存在', $params['appropriation_no']);
return false;
}
if(in_array($appro['process_status'],array('6','7'))){
$this->__apilog['result']['msg'] = '已取消';
return true;
}
if (!in_array($appro['process_status'],array('0','1','2'))){
$this->__apilog['result']['msg'] = sprintf('[%s]当前调拨单状态不可取消', $params['appropriation_no']);
return false;
}
$filter = array(
'appropriation_id' => $appro['appropriation_id'],
'appropriation_no' => $params['appropriation_no'],
'bill_type' => $appro['bill_type'],
'is_quickly' => $appro['is_quickly'],
'process_status' => $appro['process_status'],
);
return $filter;
}
/**
*退仓单列表查询
*
* @return void
* @author
**/
public function listing($params)
{
self::trim($params);
$this->__apilog['title'] = '退仓单列表查询';
$this->__apilog['original_bn'] = '';
if (!$params['store_bn'] && !$params['bill_type']){
$this->__apilog['result']['msg'] = '门店编码或bill_type必须有一个不为空!';
return false;
}
if ($params['start_time'] && !strtotime($params['start_time'])) {
$this->__apilog['result']['msg'] = '开始时间格式不正确';
return false;
}
if ($params['end_time'] && !strtotime($params['end_time'])) {
$this->__apilog['result']['msg'] = '结束时间格式不正确';
return false;
}
if($params['start_time'] && $params['end_time']){
$filter = [
'create_time|between' => [
strtotime($params['start_time']),
strtotime($params['end_time']),
],
];
}else{
if($params['end_time'] && empty($params['start_time'])){
$filter = [
'create_time|lthan' => strtotime($params['end_time'])];
}
if($params['start_time'] && empty($params['end_time'])){
$filter = [
'create_time|than' => strtotime($params['start_time'])];
}
}
$branchMdl = app::get('ome')->model('branch');
if($params['store_bn']){
$branch = $branchMdl->db_dump(array('branch_bn' => $params['store_bn'], 'check_permission' => 'false'), 'branch_id');
if (!$branch){
$this->__apilog['result']['msg'] = sprintf('[%s]门店不存在', $params['store_bn']);
return false;
}
$branch_id = $branch['branch_id'];
$filter['from_branch_id'] = $branch_id;
}
if($params['branch_bn']){
$branch = $branchMdl->db_dump(array('branch_bn' => $params['branch_bn'], 'check_permission' => 'false'), 'branch_id');
if (!$branch){
$this->__apilog['result']['msg'] = sprintf('[%s]仓库不存在', $params['branch_bn']);
return false;
}
$branch_id = $branch['branch_id'];
if($filter['from_branch_id']){
$filter['from_branch_id'] = array_merge(array($filter['from_branch_id']),array($branch_id) );
}else{
$filter['from_branch_id'] = $branch_id;
}
}
$approLib = kernel::single('erpapi_store_response_process_appropriation');
$bill_types = $approLib->o2obill_type;
$bill_types = array_keys($bill_types);
if($params['bill_type']){
if(!in_array($params['bill_type'],$bill_types)){
$this->__apilog['result']['msg'] = '业务类型必须包含在已定义类型中:'.implode(',',$bill_types);
return false;
}
}
$filter['bill_type'] = $params['bill_type'];
$approMdl = app::get('taoguanallocate')->model('appropriation');
if ($params['appropriation_no']) {
$appro = $approMdl->db_dump(array('appropriation_no' => $params['appropriation_no']));
if (!$appro) {
$this->__apilog['result']['msg'] = sprintf('[%s]调拨单不存在', $params['appropriation_no']);
return false;
}
$filter['appropriation_id'] = $appro['appropriation_id'];
}
if (isset($params['page_no']) && !is_numeric($params['page_no'])) {
$this->__apilog['result']['msg'] = sprintf('[%s]参数错误', $params['page_no']);
return false;
}
$page_no = $params['page_no'] && $params['page_no'] > 0 ? $params['page_no'] : 1;
if (isset($params['page_size']) && $params['page_size'] > self::MAX_LIMIT) {
$this->__apilog['result']['msg'] = sprintf('[%s]参数错误,最大允许[%s]', $params['page_size'], self::MAX_LIMIT);
return false;
}
$page_size = $params['page_size'] ? $params['page_size'] : self::MAX_LIMIT;
$offset = ($page_no - 1) * $page_size;
return ['filter' => $filter, 'limit' => $page_size, 'offset' => $offset];
}
}
?>