jh-admin/addon/stock/model/stock/Allot.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);
}
}