jh-admin/addon/stock/model/stock/Stock.php

274 lines
9.5 KiB
PHP

<?php
/**
* SaaSMall商城系统 - 团队十年电商经验汇集巨献!
* =========================================================
* Copy right 2019-2029 上海牛之云网络科技有限公司, 保留所有权利。
* ----------------------------------------------
* 官方网址: https://www.gobuysaas.com
* =========================================================
*/
namespace addon\stock\model\stock;
use app\model\BaseModel;
use app\model\store\Store;
/**
* 库存model
*
* @author Administrator
*
*/
class Stock extends BaseModel
{
public $document_type_list = [
'PURCHASE' => [
'name' => '采购入库单',
'type' => 'input',
'prefix' => 'CGRK',
'key' => 'PURCHASE',
],
'REFUND' => [
'name' => '退货入库单',
'type' => 'input',
'prefix' => 'THRK',
'key' => 'REFUND',
],
'OTHERRK' => [
'name' => '其他入库单',
'type' => 'input',
'prefix' => 'QTRK',
'key' => 'OTHERRK',
],
'SEAILCK' => [
'name' => '销售出库单',
'type' => 'output',
'prefix' => 'XSCK',
'key' => 'SEAILCK',
],
'OTHERCK' => [
'name' => '其他出库单',
'type' => 'output',
'prefix' => 'QTCK',
'key' => 'OTHERCK',
],
'PDD' => [
'name' => '盘点单',
'type' => 'pandian',
'prefix' => 'PDD',
'key' => 'PDD',
],
'PANYING' => [
'name' => '盘盈入库单',
'type' => 'input',
'prefix' => 'PYRK',
'key' => 'PANYING',
],
'PANKUI' => [
'name' => '盘亏出库单',
'type' => 'output',
'prefix' => 'PKCK',
'key' => 'PANKUI',
],
'ALLOTIN' => [
'name' => '调拨入库单',
'type' => 'input',
'prefix' => 'DBRK',
'key' => 'ALLOTIN',
],
'ALLOTPUT' => [
'name' => '调拨出库单',
'type' => 'output',
'prefix' => 'DBCK',
'key' => 'ALLOTPUT',
],
];
/**
* 设置库存
* @param $params
*/
public function changeStock($params)
{
$user_info = $params['user_info'] ?? [];
$site_id = $params['site_id'];
$store_id = $params['store_id'] ?? 0;
if ($store_id == 0) {
$store_model = new Store();
$store_info = $store_model->getDefaultStore($params['site_id'])['data'] ?? [];
$store_id = $store_info['store_id'];
}
$key = $params['key'];
$remark = $params['remark'] ?? '';
$is_out_stock = $params['is_out_stock'] ?? 0;
$time = $params['time'] ?? time();
$document_model = new Document();
if (!empty($params['goods_sku_list'])) {
foreach ($params['goods_sku_list'] as $k => $v) {
$params['goods_sku_list'][$k] = [
'goods_sku_id' => $v['sku_id'],
'goods_id' => $v['goods_id'] ?? 0,
'site_id' => $v['site_id'] ?? 0,
'goods_num' => $v['num'] ?? $v['stock'],
'goods_price' => $v['price'] ?? 0
];
}
} else {
$sku_id = $params['sku_id'] ?? 0;
$goods_id = $params['goods_id'] ?? 0;
$goods_num = $params['num'] ?? $params['stock'];
$goods_price = $params['price'] ?? 0;
}
$goods_sku_list = $params['goods_sku_list'] ?? array(
[
'goods_sku_id' => $sku_id,
'goods_id' => $goods_id,
'goods_num' => $goods_num,
'site_id' => $site_id,
'goods_price' => $goods_price
]
);
$document_params = array(
'store_id' => $store_id,
'site_id' => $site_id,
'remark' => $remark,
'goods_sku_list' => $goods_sku_list,
'user_info' => $user_info,
'time' => $time,
'is_out_stock' => $is_out_stock
);
switch ($key) {
case 'PURCHASE'://采购入库单
$result = $document_model->addPurchase($document_params);
break;
case 'REFUND'://退货入库单
$result = $document_model->addRefundInput($document_params);
break;
case 'OTHERRK'://其他入库单
$result = $document_model->addOtherInput($document_params);
break;
case 'SEAILCK'://销售出库单
$result = $document_model->addSell($document_params);
break;
case 'OTHERCK'://其他出库单
$result = $document_model->addOtherOutput($document_params);
break;
case 'PANYING'://盘盈入库单
$result = $document_model->addDocument($document_params);
break;
case 'PANKUI'://盘亏出库单
$result = $document_model->addDocument($document_params);
break;
}
return $result;
}
/**
* 设置商品库存(比对差值,得出)
* @param $params
* @return array
*/
public function setGoodsStock($params)
{
$store_id = $params['store_id'] ?? 0;
if ($store_id > 0 && addon_is_exit('store')) {
$site_id = $params['site_id'];
$remark = $params['remark'] ?? '';
$goods_sku_list = $params['goods_sku_list'] ?? [];
//todo 这儿可以查询商品信息类型 来定义可能只有实物商品才需要出入库记录
if (!empty($goods_sku_list)) {
foreach ($goods_sku_list as $k => $v) {
$sku_list[] = array(
'goods_sku_id' => $v['sku_id'],
'goods_num' => $v['stock'],
);
}
} else {
$sku_id = $params['sku_id'];
$stock = $params['stock'];//设置的新库存
$sku_list = array(
[
'goods_sku_id' => $sku_id,
'goods_num' => $stock,
]
);
}
//同步整理, 将要设置的销售库存转化为实际库存
$sku_ids = array_column($sku_list, 'goods_sku_id');
$sku_info_list = model('store_goods_sku')->getList([['sku_id', 'in', $sku_ids], ['store_id', '=', $store_id]]);
foreach ($sku_info_list as $k => $v) {
$sku_info_list[$k]['stock'] = numberFormat($sku_info_list[$k]['stock']);
$sku_info_list[$k]['sale_num'] = numberFormat($sku_info_list[$k]['sale_num']);
$sku_info_list[$k]['real_stock'] = numberFormat($sku_info_list[$k]['real_stock']);
}
$sku_info_column_list = array_column($sku_info_list, null, 'sku_id');
$stock_sku_list = [];
foreach ($sku_list as $k => $item) {
$item_sku_id = $item['goods_sku_id'];
$temp_item = $sku_info_column_list[$item_sku_id] ?? [];
$item_stock = $temp_item['stock'] ?? 0;
$item_real_stock = $temp_item['real_stock'] ?? 0;
if ($item_stock != $item_real_stock) {
$item['goods_num'] = $item['goods_num'] + ($item_real_stock - $item_stock);
}
$stock_sku_list[] = $item;
}
$inventory_params = array(
'site_id' => $site_id,
'store_id' => $store_id,
'sku_list' => $stock_sku_list,
'user_info' => $params['user_info'] ?? [],
'remark' => $remark
);
$inventory_model = new Inventory();
$result = $inventory_model->addInventory($inventory_params);
return $result;
}
return $this->success();
}
/**
* 获取商品sku列表
* @param array $condition
* @param string $field
* @param string $order
* @param int $store_id
* @return array
*/
public function getStoreGoodsSkuList($condition = [], $field = '*', $order = 'gs.create_time desc', $store_id = 0)
{
$alias = 'gs';
$join = [
['goods g', 'g.goods_id = gs.goods_id', 'left'],
[
'store_goods_sku sgs',
'sgs.sku_id = gs.sku_id and (sgs.store_id is null or sgs.store_id = ' . $store_id . ')',
'left'
]
];
$list = model('goods_sku')->getList($condition, $field, $order, $alias, $join, '', 15);
foreach ($list as $k => $v) {
if (isset($v['goods_stock'])) {
$list[$k]['goods_stock'] = numberFormat($list[$k]['goods_stock']);
}
if (isset($v['stock'])) {
$list[$k]['stock'] = numberFormat($list[$k]['stock']);
}
if (isset($v['sale_num'])) {
$list[$k]['sale_num'] = numberFormat($list[$k]['sale_num']);
}
if (isset($v['virtual_sale'])) {
$list[$k]['virtual_sale'] = numberFormat($list[$k]['virtual_sale']);
}
if (isset($v['real_stock'])) {
$list[$k]['real_stock'] = numberFormat($list[$k]['real_stock']);
}
}
return $this->success($list);
}
}