347 lines
13 KiB
PHP
347 lines
13 KiB
PHP
<?php
|
|
/**
|
|
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
|
|
* =========================================================
|
|
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
|
|
* ----------------------------------------------
|
|
* 官方网址: https://www.gobuysaas.com
|
|
* =========================================================
|
|
*/
|
|
|
|
namespace addon\stock\model\stock;
|
|
|
|
|
|
use app\model\store\Store;
|
|
use app\model\BaseModel;
|
|
use app\model\system\User;
|
|
|
|
/**
|
|
* 调拨
|
|
*
|
|
* @author Administrator
|
|
*
|
|
*/
|
|
class Allot extends BaseModel
|
|
{
|
|
|
|
/**
|
|
* 新增库存调拨
|
|
* @param $params
|
|
*/
|
|
public function addAllot($params)
|
|
{
|
|
model('stock_allot')->startTrans();
|
|
try {
|
|
$output_store_id = $params[ 'output_store_id' ];//出库门店
|
|
$input_store_id = $params[ 'input_store_id' ];//入库门店
|
|
$site_id = $params[ 'site_id' ];
|
|
$allot_time = $params[ 'allot_time' ] ?? time();
|
|
$remark = $params[ 'remark' ] ?? '';
|
|
$goods_sku_list = $params[ 'goods_sku_list' ];
|
|
|
|
//查询门店名称信息
|
|
$store_model = new Store();
|
|
$output_store_condition = array (
|
|
[ 'store_id', '=', $output_store_id ]
|
|
);
|
|
$output_store_info = $store_model->getStoreInfo($output_store_condition)[ 'data' ] ?? [];
|
|
if (empty($output_store_info))
|
|
return $this->success([], '找不到所选的门店');
|
|
|
|
$output_store_name = $output_store_info[ 'store_name' ] ?? '';
|
|
$input_store_condition = array (
|
|
[ 'store_id', '=', $input_store_id ]
|
|
);
|
|
$input_store_info = $store_model->getStoreInfo($input_store_condition)[ 'data' ] ?? [];
|
|
if (empty($input_store_info))
|
|
return $this->success([], '找不到所选的门店');
|
|
|
|
$operater = $params[ 'operater' ];
|
|
|
|
$goods_sku_list_array_result = $this->getSkuArray($goods_sku_list);
|
|
|
|
if ($goods_sku_list_array_result[ 'code' ] < 0) {
|
|
model('stock_allot')->rollback();
|
|
return $goods_sku_list_array_result;
|
|
}
|
|
$goods_sku_list_array = $goods_sku_list_array_result[ 'data' ];
|
|
$input_store_name = $input_store_info[ 'store_name' ] ?? '';
|
|
$allot_no = 'ALLOT' . date('ymdhis', time()) . rand(1111, 9999);
|
|
|
|
$user_model = new User();
|
|
$user_info = $user_model->getUserInfo([ [ 'uid', '=', $operater ] ])[ 'data' ] ?? [];
|
|
|
|
$data = array (
|
|
'site_id' => $site_id,
|
|
'output_store_id' => $output_store_id,
|
|
'output_store_name' => $output_store_name,
|
|
'input_store_id' => $input_store_id,
|
|
'input_store_name' => $input_store_name,
|
|
'allot_time' => $allot_time,
|
|
'allot_no' => $allot_no,
|
|
'remark' => $remark,
|
|
'status' => 0,
|
|
'create_time' => time(),
|
|
'operater' => $operater,
|
|
'operater_name' => $user_info[ 'username' ] ?? ''
|
|
);
|
|
$allot_id = model('stock_allot')->add($data);
|
|
$common_data = array (
|
|
'site_id' => $site_id,
|
|
'allot_id' => $allot_id,
|
|
'create_time' => time()
|
|
);
|
|
foreach ($goods_sku_list_array as $k => $v) {
|
|
$item_data = array_merge($common_data, $v);
|
|
model('stock_allot_goods')->add($item_data);
|
|
}
|
|
|
|
$result = $this->audit([
|
|
'allot_id' => $allot_id,
|
|
'site_id' => $site_id
|
|
]);
|
|
if ($result[ 'code' ] < 0) {
|
|
model('stock_allot')->rollback();
|
|
return $result;
|
|
}
|
|
|
|
model('stock_allot')->commit();
|
|
return $this->success();
|
|
} catch (\Exception $e) {
|
|
model('stock_allot')->rollback();
|
|
return $this->error('', $e->getMessage() . $e->getFile() . $e->getLine());
|
|
}
|
|
}
|
|
|
|
public function getSkuArray($goods_sku_list)
|
|
{
|
|
$goods_sku_list_array = [];
|
|
foreach ($goods_sku_list as $k => $goods_sku) {
|
|
$goods_sku_id = $goods_sku[ 'goods_sku_id' ] ?? 0;
|
|
if ($goods_sku_id <= 0) {
|
|
return $this->error([]);
|
|
}
|
|
$goods_sku_info = model('goods_sku')->getInfo([
|
|
'sku_id' => $goods_sku_id
|
|
]);
|
|
$goods_num = $goods_sku[ 'goods_num' ] ?? 0;
|
|
if ($goods_num <= 0) {
|
|
return $this->error([], '商品:' . $goods_sku_info[ 'sku_name' ] . '调拨数量不能为空!');
|
|
}
|
|
|
|
$goods_sku_list_array[] = [
|
|
'goods_id' => $goods_sku_info[ 'goods_id' ],
|
|
'goods_sku_id' => $goods_sku_info[ 'sku_id' ],
|
|
'goods_sku_name' => $goods_sku_info[ 'sku_name' ],
|
|
'goods_sku_no' => $goods_sku_info[ 'sku_no' ],
|
|
'goods_sku_img' => $goods_sku_info[ 'sku_image' ],
|
|
'goods_sku_spec' => $goods_sku_info[ 'spec_name' ],
|
|
'goods_unit' => $goods_sku_info[ 'unit' ] ?? '件',
|
|
'goods_num' => $goods_num,
|
|
'goods_price' => $goods_sku_info[ 'cost_price' ],
|
|
'goods_remark' => '',
|
|
];
|
|
}
|
|
|
|
return $this->success($goods_sku_list_array);
|
|
}
|
|
|
|
/**
|
|
* 审核
|
|
* @param $params
|
|
*/
|
|
public function audit($params)
|
|
{
|
|
$site_id = $params[ 'site_id' ];
|
|
$allot_id = $params[ 'allot_id' ];
|
|
$condition = array (
|
|
[ 'site_id', '=', $site_id ],
|
|
[ 'allot_id', '=', $allot_id ]
|
|
);
|
|
$info = model('stock_allot')->getInfo($condition);
|
|
if (empty($info)) {
|
|
return $this->error([], '调拨单据不存在');
|
|
}
|
|
|
|
$allot_data = array (
|
|
'audit_time' => time(),
|
|
'status' => 2
|
|
);
|
|
|
|
model('stock_allot')->update($allot_data, $condition);
|
|
$result = $this->complete($params);
|
|
if ($result[ 'code' ] < 0)
|
|
return $result;
|
|
return $this->success();
|
|
}
|
|
|
|
public function complete($params)
|
|
{
|
|
$allot_id = $params[ 'allot_id' ];
|
|
$condition = array (
|
|
[ 'allot_id', '=', $allot_id ]
|
|
);
|
|
$info = model('stock_allot')->getInfo($condition);
|
|
if (empty($info)) {
|
|
return $this->error([], '调拨单据不存在');
|
|
}
|
|
$result = $this->setStock($info);
|
|
if ($result[ 'code' ] < 0)
|
|
return $result;
|
|
return $this->success();
|
|
}
|
|
|
|
/**
|
|
* 整理调拨单据
|
|
* @param $params
|
|
*/
|
|
public function setStock($params)
|
|
{
|
|
$site_id = $params[ 'site_id' ];
|
|
$allot_id = $params[ 'allot_id' ];
|
|
$allot_goods_condition = array (
|
|
[ 'allot_id', '=', $allot_id ]
|
|
);
|
|
$allot_goods_list = model('stock_allot_goods')->getList($allot_goods_condition);
|
|
$output_store_id = $params[ 'output_store_id' ];
|
|
$input_store_id = $params[ 'input_store_id' ];
|
|
$remark = $params[ 'remark' ];
|
|
$allot_time = $params[ 'allot_time' ];
|
|
$operater = $params[ 'operater' ];
|
|
$operater_name = $params[ 'operater_name' ];
|
|
foreach ($allot_goods_list as $k => $goods_sku_item) {
|
|
$allot_goods_id = $goods_sku_item[ 'allot_goods_id' ];
|
|
$item_sku_id = $goods_sku_item[ 'goods_sku_id' ];
|
|
$item_goods_id = $goods_sku_item[ 'goods_id' ];
|
|
|
|
$goods_num = numberFormat($goods_sku_item[ 'goods_num' ]);
|
|
|
|
$sku_condition = array (
|
|
[ 'sku_id', '=', $item_sku_id ]
|
|
);
|
|
$goods_sku_info = model('goods_sku')->getInfo($sku_condition);
|
|
|
|
$goods_price = $goods_sku_info[ 'cost_price' ];
|
|
$output_store_sku_condition = array (
|
|
[ 'store_id', '=', $output_store_id ],
|
|
[ 'goods_id', '=', $item_goods_id ],
|
|
[ 'sku_id', '=', $item_sku_id ]
|
|
);
|
|
$output_store_sku_info = model('store_goods_sku')->getInfo($output_store_sku_condition);
|
|
|
|
$output_store_stock = $output_store_sku_info[ 'real_stock' ] ?? 0;
|
|
$input_store_sku_condition = array (
|
|
[ 'store_id', '=', $input_store_id ],
|
|
[ 'goods_id', '=', $item_goods_id ],
|
|
[ 'sku_id', '=', $item_sku_id ]
|
|
);
|
|
$input_store_sku_info = model('store_goods_sku')->getInfo($input_store_sku_condition);
|
|
|
|
$input_store_stock = $input_store_sku_info[ 'real_stock' ] ?? 0;
|
|
$total_goods_money = $goods_num * $goods_price;
|
|
$update_data = array (
|
|
'output_store_stock' => numberFormat($output_store_stock),
|
|
'input_store_stock' => numberFormat($input_store_stock),
|
|
'goods_price' => $goods_price,
|
|
'total_goods_money' => $total_goods_money,
|
|
);
|
|
$update_condition = array (
|
|
[ 'allot_goods_id', '=', $allot_goods_id ]
|
|
);
|
|
model('stock_allot_goods')->update($update_data, $update_condition);
|
|
|
|
$goods_money = model('stock_allot_goods')->getSum([ [ 'site_id', '=', $site_id ], [ 'allot_id', '=', $allot_id ] ], 'total_goods_money');
|
|
|
|
model('stock_allot')->update([ 'goods_money' => $goods_money ], [
|
|
[ 'site_id', '=', $site_id ],
|
|
[ 'allot_id', '=', $allot_id ]
|
|
]);
|
|
|
|
//新增门店出库
|
|
$goods_sku_list = array (
|
|
[
|
|
'goods_sku_id' => $item_sku_id,
|
|
'goods_id' => $item_goods_id,
|
|
'goods_num' => $goods_num,
|
|
'goods_price' => $goods_price
|
|
]
|
|
);
|
|
|
|
$user_info = [
|
|
'uid' => $operater,
|
|
'username' => $operater_name,
|
|
];
|
|
$document_model = new Document();
|
|
$document_params = array (
|
|
'allot_id' => $allot_id,
|
|
'store_id' => $output_store_id,
|
|
'user_info' => $user_info,
|
|
'site_id' => $site_id,
|
|
);
|
|
$document_params[ 'document_type' ] = 'ALLOTPUT';
|
|
$document_params[ 'goods_sku_list' ] = $goods_sku_list;
|
|
|
|
$out_result = $document_model->addDocument(array_merge($document_params, [ 'is_out_stock' => 1 ]));
|
|
if ($out_result[ 'code' ] < 0) {
|
|
return $out_result;
|
|
}
|
|
|
|
$document_params[ 'store_id' ] = $input_store_id;
|
|
$document_params[ 'document_type' ] = 'ALLOTIN';
|
|
$out_result = $document_model->addDocument($document_params);
|
|
if ($out_result[ 'code' ] < 0) {
|
|
return $out_result;
|
|
}
|
|
}
|
|
|
|
return $this->success();
|
|
}
|
|
|
|
/**
|
|
* 获取调拨单分页列表
|
|
* @param array $condition
|
|
* @param int $page
|
|
* @param int $page_size
|
|
* @param string $order
|
|
* @param string $field
|
|
* @return array
|
|
*/
|
|
public function getStockAllotPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*', $alias = '', $join = '')
|
|
{
|
|
$document_list = model('stock_allot')->pageList($condition, $field, $order, $page, $page_size, $alias, $join);
|
|
return $this->success($document_list);
|
|
}
|
|
|
|
/**单据详情
|
|
* @param array $condition
|
|
* @param string $field
|
|
*/
|
|
public function getAllotInfo($condition = [], $field = '*')
|
|
{
|
|
$info = model('stock_allot')->getInfo($condition, $field);
|
|
if (!empty($info)) {
|
|
//单据产品项
|
|
$goods_list = model('stock_allot_goods')->getList([
|
|
'allot_id' => $info[ 'allot_id' ]
|
|
]);
|
|
foreach ($goods_list as $k => $v) {
|
|
$goods_list[ $k ][ 'goods_num' ] = numberFormat($goods_list[ $k ][ 'goods_num' ]);
|
|
$goods_list[ $k ][ 'output_store_stock' ] = numberFormat($goods_list[ $k ][ 'output_store_stock' ]);
|
|
$goods_list[ $k ][ 'input_store_stock' ] = numberFormat($goods_list[ $k ][ 'input_store_stock' ]);
|
|
$info[ 'goods_unit' ] = $v[ 'goods_unit' ];
|
|
}
|
|
$info[ 'goods_sku_list_array' ] = $goods_list;
|
|
$info[ 'goods_piece' ] = 0;
|
|
$info[ 'goods_total_price' ] = 0.00;
|
|
foreach ($goods_list as $key => $value) {
|
|
$info[ 'goods_sku_list_array' ][ $key ][ 'goods_sum' ] = floatval($value[ 'goods_num' ] * $value[ 'goods_price' ]);
|
|
$info[ 'goods_piece' ] += numberFormat($value[ 'goods_num' ]);
|
|
$info[ 'goods_total_price' ] += $info[ 'goods_sku_list_array' ][ $key ][ 'goods_sum' ];
|
|
}
|
|
$info[ 'goods_count' ] = count($info[ 'goods_sku_list_array' ]);
|
|
}
|
|
return $this->success($info);
|
|
}
|
|
|
|
}
|