// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\common\service\goods\source; use app\common\model\Goods as GoodsModel; use app\common\model\GoodsSku as GoodsSkuModel; use app\common\enum\goods\DeductStockType as DeductStockTypeEnum; /** * 商品来源-普通商品扩展类 * Class Master * @package app\common\service\stock */ class Master extends Basics { /** * 更新商品库存 (针对下单减库存的商品) * @param $goodsList * @return bool */ public function updateGoodsStock($goodsList) { $goodsData = []; $goodsSkuData = []; foreach ($goodsList as $goods) { // 是否减库存 (下单减库存) $isUpdateStockNum = $goods['deduct_stock_type'] == 10; // 商品的数据 $isUpdateStockNum && $goodsData[] = [ 'where' => ['goods_id' => $goods['goods_id']], 'data' => [ // 递减商品总库存 'stock_total' => ['dec', $goods['total_num']] ] ]; // 商品SKU数据 $isUpdateStockNum && $goodsSkuData[] = [ 'data' => ['stock_num' => ['dec', $goods['total_num']]], 'where' => [ 'goods_id' => $goods['goods_id'], 'goods_sku_id' => $goods['goods_sku_id'], ], ]; } // 更新商品信息 !empty($goodsData) && $this->updateGoods($goodsData); // 更新商品sku信息 !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData); return true; } /** * 更新商品库存销量(订单付款后) * @param $goodsList * @return bool */ public function updateStockSales($goodsList) { $goodsData = []; $goodsSkuData = []; foreach ($goodsList as $goods) { // 是否减库存 (付款减库存) $isUpdateStockNum = $goods['deduct_stock_type'] == 20; // 商品的数据 $goodsDataItm = [ 'where' => ['goods_id' => $goods['goods_id']], 'data' => [ // 累计商品实际销量 'sales_actual' => ['inc', $goods['total_num']] ] ]; // 递减商品总库存 $isUpdateStockNum && $goodsDataItm['data']['stock_total'] = ['dec', $goods['total_num']]; $goodsData[] = $goodsDataItm; // 付款减库存 $isUpdateStockNum && $goodsSkuData[] = [ 'where' => [ 'goods_id' => $goods['goods_id'], 'goods_sku_id' => $goods['goods_sku_id'], ], 'data' => ['stock_num' => ['dec', $goods['total_num']]], ]; } // 更新商品信息 !empty($goodsData) && $this->updateGoods($goodsData); // 更新商品sku信息 !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData); return true; } /** * 回退商品库存 * @param $goodsList * @param $isPayOrder * @return array|false * @throws \Exception */ public function backGoodsStock($goodsList, $isPayOrder = false) { $goodsSkuData = []; foreach ($goodsList as $goods) { $item = [ 'where' => [ 'goods_id' => $goods['goods_id'], 'goods_sku_id' => $goods['goods_sku_id'], ], 'data' => ['stock_num' => ['inc', $goods['total_num']]], ]; if ($isPayOrder == true) { // 付款订单全部库存 $goodsSkuData[] = $item; } else { // 未付款订单,判断必须为下单减库存时才回退 $goods['deduct_stock_type'] == DeductStockTypeEnum::CREATE && $goodsSkuData[] = $item; } } // 更新商品sku库存 return !empty($goodsSkuData) && $this->updateGoodsSku($goodsSkuData); } /** * 更新商品信息 * @param array $data * @return array|false */ private function updateGoods(array $data) { return (new GoodsModel)->updateAll($data); } /** * 更新商品sku信息 * @param array $data * @return array|false */ private function updateGoodsSku(array $data) { return (new GoodsSkuModel)->updateAll($data); } }