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