admin/addon/stock/model/stock/Allot.php

338 lines
12 KiB
PHP

<?php
/**
* ThinkShop商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.cdcloudshop.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 = $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' => $output_store_stock,
'input_store_stock' => $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']
]);
$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'] += intval($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);
}
}