433 lines
19 KiB
PHP
433 lines
19 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\storegoods\StoreGoods;
|
|
|
|
/**
|
|
* 盘点
|
|
*
|
|
* @author Administrator
|
|
*
|
|
*/
|
|
class Inventory extends BaseModel
|
|
{
|
|
|
|
/**
|
|
* 添加盘点单
|
|
* @param array $inventory_data
|
|
* @param array $inventory_goods_data (sku_id:盘点数量,sku_id:盘点数量)
|
|
*/
|
|
public function addInventory($params)
|
|
{
|
|
//同商品同时只能存在一个盘点单据
|
|
model('stock_inventory')->startTrans();
|
|
try {
|
|
$site_id = $params[ 'site_id' ];
|
|
$store_id = $params[ 'store_id' ];
|
|
$sku_list = $params[ 'sku_list' ];
|
|
$user_info = $params[ 'user_info' ];
|
|
$inventory_no = 'PD' . date('ymdhis', time()) . rand(1111, 9999);
|
|
//查询门店名称信息
|
|
$store_model = new Store();
|
|
$store_condition = array (
|
|
[ 'store_id', '=', $store_id ]
|
|
);
|
|
$store_info = $store_model->getStoreInfo($store_condition, 'store_name')[ 'data' ] ?? [];
|
|
if (empty($store_info)) {
|
|
model('stock_inventory')->rollback();
|
|
return $this->success([], '找不到所选的门店');
|
|
}
|
|
$store_name = $store_info[ 'store_name' ];
|
|
$common_data = array (
|
|
'site_id' => $site_id,
|
|
'create_time' => time(),
|
|
'store_id' => $store_id
|
|
);
|
|
$data = array (
|
|
'operater' => $user_info[ 'uid' ] ?? 0,
|
|
'operater_name' => $user_info[ 'username' ] ?? '',
|
|
'create_time' => time(),
|
|
'inventory_no' => $inventory_no,
|
|
'store_name' => $store_name,
|
|
'remark' => $params[ 'remark' ] ?? ''
|
|
);
|
|
//盘点单据
|
|
$inventory_data = array_merge($data, $common_data);
|
|
$inventory_id = model('stock_inventory')->add($inventory_data);
|
|
$common_data[ 'inventory_id' ] = $inventory_id;
|
|
foreach ($sku_list as $k => $goods_sku) {
|
|
$goods_sku_id = $goods_sku[ 'goods_sku_id' ];
|
|
$goods_num = numberFormat($goods_sku[ 'goods_num' ]);
|
|
$goods_remark = '';
|
|
//具体业务尚未调试,表结构不一致
|
|
$goods_sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $goods_sku_id ] ], 'sku_id,goods_id,sku_name,sku_no,sku_image,spec_name');
|
|
$goods_sku_data_info = model('store_goods_sku')->getInfo([ [ 'sku_id', '=', $goods_sku_id ], [ 'store_id', '=', $store_id ] ], '*');
|
|
$goods_stock = $goods_sku_data_info[ 'real_stock' ] ?? 0;
|
|
$goods_sku_data = [];
|
|
$goods_sku_data[ 'inventory_num' ] = $goods_num;
|
|
$goods_sku_data[ 'inventory_remark' ] = $goods_remark;
|
|
$goods_sku_data[ 'goods_id' ] = $goods_sku_info[ 'goods_id' ];
|
|
$goods_sku_data[ 'goods_sku_id' ] = $goods_sku_id;
|
|
$goods_sku_data[ 'goods_sku_name' ] = $goods_sku_info[ 'sku_name' ];
|
|
$goods_sku_data[ 'goods_sku_no' ] = $goods_sku_info[ 'sku_no' ];
|
|
$goods_sku_data[ 'goods_sku_spec' ] = $goods_sku_info[ 'spec_name' ];
|
|
$goods_sku_data[ 'goods_img' ] = $goods_sku_info[ 'sku_image' ];
|
|
$goods_sku_data[ 'stock' ] = numberFormat($goods_stock);
|
|
model('stock_inventory_goods')->add(array_merge($goods_sku_data, $common_data));
|
|
}
|
|
//主动调用审核
|
|
$inventory_params = array (
|
|
'inventory_id' => $inventory_id,
|
|
'site_id' => $site_id,
|
|
'user_info' => $user_info
|
|
);
|
|
$audit_result = $this->audit($inventory_params);
|
|
if ($audit_result[ 'code' ] < 0) {
|
|
model('stock_inventory')->rollback();
|
|
return $audit_result;
|
|
}
|
|
model('stock_inventory')->commit();
|
|
return $this->success();
|
|
} catch (\Exception $e) {
|
|
model('stock_inventory')->rollback();
|
|
return $this->error($e->getMessage() . $e->getFile() . $e->getLine());
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* 通过审核
|
|
* @param $params
|
|
*/
|
|
public function audit($params)
|
|
{
|
|
$inventory_id = $params[ 'inventory_id' ];
|
|
$site_id = $params[ 'site_id' ];
|
|
$user_info = $params[ 'user_info' ];
|
|
$condition = array (
|
|
[ 'inventory_id', '=', $inventory_id ],
|
|
[ 'site_id', '=', $site_id ]
|
|
);
|
|
$info = model('stock_inventory')->getInfo($condition);
|
|
if (empty($info))
|
|
return $this->error([], '找不到可审核的单据');
|
|
|
|
$data = array (
|
|
'status' => 1
|
|
);
|
|
model('stock_inventory')->update($data, $condition);
|
|
$store_id = $info[ 'store_id' ];
|
|
$result = $this->complete([ 'inventory_id' => $inventory_id, 'site_id' => $site_id, 'store_id' => $store_id, 'user_info' => $user_info ]);
|
|
return $result;
|
|
}
|
|
|
|
/**
|
|
* 单据通过审核
|
|
* @param $params
|
|
*/
|
|
public function complete($params)
|
|
{
|
|
$inventory_id = $params[ 'inventory_id' ];
|
|
$user_info = $params[ 'user_info' ] ?? [];
|
|
$site_id = $params[ 'site_id' ];
|
|
$condition = array (
|
|
[ 'inventory_id', '=', $inventory_id ],
|
|
[ 'site_id', '=', $site_id ]
|
|
);
|
|
$info = model('stock_inventory')->getInfo($condition);
|
|
if (empty($info))
|
|
return $this->error([], '找不到可审核的单据');
|
|
|
|
$stock_inventory_goods_list = model('stock_inventory_goods')->getList($condition, '*');
|
|
if (empty($stock_inventory_goods_list))
|
|
return $this->error([], '找不到可审核的单据');
|
|
|
|
$store_id = $info[ 'store_id' ];
|
|
$stat_data = $this->stat([ 'inventory_id' => $inventory_id, 'store_id' => $store_id ])[ 'data' ] ?? [];
|
|
|
|
$data = array (
|
|
'kinds_num' => $stat_data[ 'kinds_num' ],
|
|
'kinds_profit_num' => $stat_data[ 'kinds_profit_num' ],
|
|
'kinds_loss_num' => $stat_data[ 'kinds_loss_num' ],
|
|
'kinds_even_num' => $stat_data[ 'kinds_even_num' ],
|
|
'num' => $stat_data[ 'num' ],
|
|
'profit_num' => $stat_data[ 'profit_num' ],
|
|
'loss_num' => $stat_data[ 'loss_num' ],
|
|
'even_num' => $stat_data[ 'even_num' ],
|
|
'profitloss_num' => $stat_data[ 'profitloss_num' ],
|
|
'inventory_cost_money' => $stat_data[ 'inventory_cost_money' ],
|
|
'profitloss_sale_money' => $stat_data[ 'profitloss_sale_money' ],
|
|
);
|
|
model('stock_inventory')->update($data, $condition);
|
|
$inventory_goods_list = $stat_data[ 'inventory_goods_list' ] ?? [];
|
|
|
|
$goods_model = new \app\model\goods\Goods();
|
|
$store_goods_model = new StoreGoods();
|
|
foreach ($inventory_goods_list as $k => $v) {
|
|
$item_sku_id = $v[ 'goods_sku_id' ];
|
|
$item_goods_id = $v[ 'goods_id' ];
|
|
$input_array = [];
|
|
$output_array = [];
|
|
$item_condition = array (
|
|
[ 'inventory_id', '=', $inventory_id ],
|
|
[ 'goods_sku_id', '=', $item_sku_id ]
|
|
);
|
|
$item_data = array (
|
|
'inventory_id' => $inventory_id,
|
|
'goods_id' => $v[ 'goods_id' ],
|
|
'goods_sku_id' => $v[ 'goods_sku_id' ],
|
|
'stock' => $v[ 'stock' ],
|
|
'inventory_num' => $v[ 'inventory_num' ],
|
|
'inventory_remark' => $v[ 'inventory_remark' ] ?? '',
|
|
'profitloss_num' => $v[ 'profitloss_num' ],
|
|
'inventory_cost_money' => $v[ 'inventory_cost_money' ],
|
|
'profitloss_sale_money' => $v[ 'profitloss_sale_money' ],
|
|
);
|
|
model('stock_inventory_goods')->update($item_data, $item_condition);
|
|
|
|
$store_goods_sku_condition = array (
|
|
[ 'sku_id', '=', $item_sku_id ],
|
|
[ 'store_id', '=', $store_id ]
|
|
);
|
|
|
|
$store_sku_info = $store_goods_model->getStoreGoodsSkuInfo($store_goods_sku_condition)[ 'data' ] ?? [];
|
|
|
|
$store_sku_stock = $store_sku_info[ 'real_stock' ] ?? 0;
|
|
$inventory_num = $v[ 'inventory_num' ];
|
|
$goods_sku_condition = array (
|
|
[ 'sku_id', '=', $item_sku_id ],
|
|
);
|
|
$sku_info = $goods_model->getGoodsSkuInfo($goods_sku_condition, 'sku_name, unit')[ 'data' ] ?? [];
|
|
$item_price = $store_sku_info[ 'cost_price' ] ?? 0;
|
|
$item_unit = $store_sku_info[ 'unit' ] ?? '件';
|
|
$diff = abs($inventory_num - $store_sku_stock);
|
|
if ($diff != 0) {
|
|
if ($inventory_num > $store_sku_stock) {
|
|
$input_array[] = [
|
|
'goods_id' => $item_goods_id,
|
|
'goods_sku_id' => $item_sku_id,
|
|
'goods_sku_name' => $sku_info[ 'sku_name' ],
|
|
'goods_unit' => $item_unit,
|
|
'goods_num' => $diff,
|
|
'goods_price' => $item_price,
|
|
];
|
|
} else if ($inventory_num < $store_sku_stock) {
|
|
$output_array[] = [
|
|
'goods_id' => $item_goods_id,
|
|
'goods_sku_id' => $item_sku_id,
|
|
'goods_sku_name' => $sku_info[ 'sku_name' ],
|
|
'goods_unit' => $item_unit,
|
|
'goods_num' => $diff,
|
|
'goods_price' => $item_price,
|
|
];
|
|
}
|
|
$document = new Document();
|
|
|
|
$document_params = array (
|
|
'inventory_id' => $inventory_id,
|
|
'store_id' => $store_id,
|
|
'user_info' => $user_info,
|
|
'site_id' => $site_id
|
|
);
|
|
|
|
if (!empty($input_array)) {
|
|
$document_params[ 'document_type' ] = 'PANYING';
|
|
$document_params[ 'goods_sku_list' ] = $input_array;
|
|
$result = $document->addDocument($document_params);
|
|
}
|
|
if (!empty($output_array)) {
|
|
$document_params[ 'document_type' ] = 'PANKUI';
|
|
$document_params[ 'goods_sku_list' ] = $output_array;
|
|
$document_params[ 'is_out_stock' ] = 1;
|
|
$result = $document->addDocument($document_params);
|
|
}
|
|
|
|
if ($result[ 'code' ] < 0) {
|
|
return $result;
|
|
}
|
|
}
|
|
|
|
}
|
|
return $this->success();
|
|
}
|
|
|
|
/**
|
|
* 数据统计以及整理
|
|
* @param $params
|
|
* @return array
|
|
*/
|
|
public function stat($params)
|
|
{
|
|
$inventory_id = $params[ 'inventory_id' ];
|
|
$condition = array (
|
|
[ 'inventory_id', '=', $inventory_id ]
|
|
);
|
|
$info = model('stock_inventory')->getInfo($condition);
|
|
$store_id = $info[ 'store_id' ];
|
|
$kinds_num = $kinds_profit_num = $kinds_loss_num = $kinds_even_num = $num = $profit_num = $loss_num = $even_num = $profitloss_num = $inventory_cost_money = $profitloss_sale_money = 0;
|
|
|
|
$stock_inventory_goods_list = model('stock_inventory_goods')->getList($condition, '*');
|
|
$store_goods_model = new StoreGoods();
|
|
$inventory_goods_list = [];
|
|
foreach ($stock_inventory_goods_list as $k => $v) {
|
|
$kinds_num++;
|
|
$sku_id = $v[ 'goods_sku_id' ];
|
|
$goods_id = $v[ 'goods_id' ];
|
|
$store_sku_condition = array (
|
|
[ 'store_id', '=', $store_id ],
|
|
[ 'sku_id', '=', $sku_id ]
|
|
);
|
|
|
|
$v[ 'stock' ] = numberFormat($v[ 'stock' ]);
|
|
$v[ 'inventory_num' ] = numberFormat($v[ 'inventory_num' ]);
|
|
$v[ 'profitloss_num' ] = numberFormat($v[ 'profitloss_num' ]);
|
|
|
|
$sku_info = model('goods_sku')->getInfo([ [ 'sku_id', '=', $sku_id ] ]);
|
|
$item_info = $store_goods_model->getStoreGoodsSkuInfo($store_sku_condition)[ 'data' ] ?? [];
|
|
$item_price = $item_info[ 'price' ] ?? 0;//销售价
|
|
$item_cost_price = $item_info[ 'cost_price' ] ?? 0;// 成本价
|
|
$item_stock = $item_info[ 'real_stock' ] ?? 0;//实物库存
|
|
// $item_sale_stock = $item_info['stock'] ?? 0;//销售库存
|
|
// $item_total_cost_money = $item_cost_price * $item_stock;//总成本价
|
|
$item_total_sale_money = $item_price * $item_stock;//总销售价
|
|
|
|
$inventory_num = $v[ 'inventory_num' ];//盘点数量
|
|
$item_inventory_cost_money = $inventory_num * $item_cost_price;
|
|
$inventory_cost_money += $item_inventory_cost_money;//盘点总成本价
|
|
$ing_total_sale_money = $inventory_num * $item_price;//盘点总销售价
|
|
$num += $inventory_num;//盘点总数
|
|
$item_profitloss_num = $inventory_num - $item_stock;
|
|
$item_profitloss_sale_money = 0;
|
|
if ($item_profitloss_num == 0) {//持平
|
|
$kinds_even_num++;
|
|
$even_num += abs($item_profitloss_num);
|
|
} else if ($item_profitloss_num > 0) {//盘盈数
|
|
$kinds_profit_num++;
|
|
$profit_num += abs($item_profitloss_num);
|
|
$item_profitloss_sale_money = $ing_total_sale_money - $item_total_sale_money;
|
|
} else {//盘亏数
|
|
$kinds_loss_num++;
|
|
$loss_num += abs($item_profitloss_num);
|
|
}
|
|
$profitloss_num += $item_profitloss_num;
|
|
$profitloss_sale_money += $item_profitloss_sale_money;
|
|
|
|
$inventory_goods_list[ $sku_id ] = [
|
|
'goods_id' => $goods_id,
|
|
'goods_sku_id' => $sku_id,
|
|
'goods_sku_name' => $sku_info[ 'sku_name' ],
|
|
'goods_sku_no' => $sku_info[ 'sku_no' ],
|
|
'goods_unit' => $sku_info[ 'unit' ],
|
|
'stock' => numberFormat($item_stock),
|
|
'inventory_num' => numberFormat($inventory_num),
|
|
// 'goods_price' => $item_info['cost_price'],
|
|
|
|
'profitloss_num' => numberFormat($item_profitloss_num),
|
|
'inventory_cost_money' => $item_inventory_cost_money,
|
|
'profitloss_sale_money' => $item_profitloss_sale_money,
|
|
];
|
|
}
|
|
$data = array (
|
|
'kinds_num' => $kinds_num,
|
|
'kinds_profit_num' => $kinds_profit_num,
|
|
'kinds_loss_num' => $kinds_loss_num,
|
|
'kinds_even_num' => $kinds_even_num,
|
|
'num' => $num,
|
|
'profit_num' => $profit_num,
|
|
'loss_num' => $loss_num,
|
|
'even_num' => $even_num,
|
|
'profitloss_num' => $profitloss_num,
|
|
'inventory_cost_money' => $inventory_cost_money,
|
|
'profitloss_sale_money' => $profitloss_sale_money,
|
|
'inventory_goods_list' => $inventory_goods_list
|
|
);
|
|
|
|
return $this->success($data);
|
|
}
|
|
|
|
/**
|
|
* 库存盘点单列表
|
|
* @param array $conditionstock_document
|
|
* @param number $page
|
|
* @param string $page_size
|
|
* @param string $order
|
|
* @param string $field
|
|
*/
|
|
public function getInventoryPageList($condition = [], $page = 1, $page_size = PAGE_LIST_ROWS, $order = '', $field = '*')
|
|
{
|
|
$list = model('stock_inventory')->pageList($condition, $field, $order, $page, $page_size);
|
|
foreach ($list as $k => $v) {
|
|
if (isset($v[ 'num' ])) {
|
|
$list[ $k ][ 'num' ] = numberFormat($list[ $k ][ 'num' ]);
|
|
}
|
|
if (isset($v[ 'profit_num' ])) {
|
|
$list[ $k ][ 'profit_num' ] = numberFormat($list[ $k ][ 'profit_num' ]);
|
|
}
|
|
if (isset($v[ 'loss_num' ])) {
|
|
$list[ $k ][ 'loss_num' ] = numberFormat($list[ $k ][ 'loss_num' ]);
|
|
}
|
|
if (isset($v[ 'even_num' ])) {
|
|
$list[ $k ][ 'even_num' ] = numberFormat($list[ $k ][ 'even_num' ]);
|
|
}
|
|
if (isset($v[ 'profitloss_num' ])) {
|
|
$list[ $k ][ 'profitloss_num' ] = numberFormat($list[ $k ][ 'profitloss_num' ]);
|
|
}
|
|
}
|
|
return $this->success($list);
|
|
}
|
|
|
|
/**
|
|
* 单据详情
|
|
* @param array $condition
|
|
* @param string $field
|
|
*/
|
|
public function getInventoryInfo($condition = [], $field = '*')
|
|
{
|
|
$inventory_info = model('stock_inventory')->getInfo($condition, $field);
|
|
if (!empty($inventory_info)) {
|
|
if (isset($inventory_info[ 'num' ])) {
|
|
$inventory_info[ 'num' ] = numberFormat($inventory_info[ 'num' ]);
|
|
}
|
|
if (isset($inventory_info[ 'profit_num' ])) {
|
|
$inventory_info[ 'profit_num' ] = numberFormat($inventory_info[ 'profit_num' ]);
|
|
}
|
|
if (isset($inventory_info[ 'loss_num' ])) {
|
|
$inventory_info[ 'loss_num' ] = numberFormat($inventory_info[ 'loss_num' ]);
|
|
}
|
|
if (isset($inventory_info[ 'even_num' ])) {
|
|
$inventory_info[ 'even_num' ] = numberFormat($inventory_info[ 'even_num' ]);
|
|
}
|
|
if (isset($inventory_info[ 'profitloss_num' ])) {
|
|
$inventory_info[ 'profitloss_num' ] = numberFormat($inventory_info[ 'profitloss_num' ]);
|
|
}
|
|
|
|
//单据产品项
|
|
$inventory_goods_list = model('stock_inventory_goods')->getList([
|
|
[ 'inventory_id', '=', $inventory_info[ 'inventory_id' ] ]
|
|
]);
|
|
foreach ($inventory_goods_list as $k => $v) {
|
|
$inventory_goods_list[ $k ][ 'stock' ] = numberFormat($inventory_goods_list[ $k ][ 'stock' ]);
|
|
$inventory_goods_list[ $k ][ 'inventory_num' ] = numberFormat($inventory_goods_list[ $k ][ 'inventory_num' ]);
|
|
$inventory_goods_list[ $k ][ 'profitloss_num' ] = numberFormat($inventory_goods_list[ $k ][ 'profitloss_num' ]);
|
|
}
|
|
$inventory_info[ 'goods_sku_list_array' ] = $inventory_goods_list;
|
|
$inventory_info[ 'goods_count' ] = count($inventory_info[ 'goods_sku_list_array' ]);
|
|
$inventory_info[ 'create_time' ] = date('Y-m-d H:i:s', $inventory_info[ 'create_time' ]);
|
|
}
|
|
return $this->success($inventory_info);
|
|
}
|
|
|
|
}
|