diff --git a/app/Http/Controllers/Goods/GoodsSkusController.php b/app/Http/Controllers/Goods/GoodsSkusController.php index 31c1b1a..c98032f 100644 --- a/app/Http/Controllers/Goods/GoodsSkusController.php +++ b/app/Http/Controllers/Goods/GoodsSkusController.php @@ -7,9 +7,11 @@ use App\Exports\GoodsSkusExport; use App\Http\Controllers\Controller; use App\Http\Requests\GoodsRequest; use App\Http\Requests\GoodsSkuRequest; +use App\Models\BusinessOrderItem; use App\Models\Goods; use App\Models\Log; use App\Models\Log as LogModel; +use App\Utils\ArrayUtils; use App\Utils\DateTimeUtils; use Illuminate\Http\Request; use App\Models\GoodsSku; @@ -61,6 +63,23 @@ class GoodsSkusController extends Controller }]) ->orderBy('updated_at', 'desc') ->paginate($request->get('per_page')); + foreach ($goodsSkus as &$sku) { + $externalSkuId = $sku['goods']['goods_code'] . '_' . $sku['sku_code']; + $lastInventoryTime = $sku['daily']['inventory_time']; + $addOrderGoodsNum = BusinessOrderItem::query() + ->where('external_sku_id', $externalSkuId) + ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { + $query->where('updated_at', '>', $lastInventoryTime); + }) + ->sum('goods_number'); + $reduceOrderGoodsNum = BusinessOrderItem::query() + ->where('external_sku_id', $externalSkuId) + ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { + $query->where('updated_at', '>', $lastInventoryTime); + }) + ->sum('already_cancel_number'); + $sku['order_goods_num'] = $addOrderGoodsNum - $reduceOrderGoodsNum; + } return GoodsSkuResource::collection($goodsSkus); } @@ -204,21 +223,61 @@ class GoodsSkusController extends Controller DB::beginTransaction(); try { $logs = []; - foreach ($request->skus as $sku) { + $requestSkus = ArrayUtils::index($request->skus, 'id'); + $skus = GoodsSku::query() + ->whereIn('id', array_keys($requestSkus)) + ->with(['goods:id,goods_code']) + ->get(['id', 'goods_id', 'sku_code']) + ->toArray(); + $today = DateTimeUtils::getToday(); + $nextDay = DateTimeUtils::getNextDay(); + $dateTime = date('Y-m-d H:i:s'); + foreach ($skus as $sku) { + if (!isset($requestSkus[$sku['id']])) { + continue; + } + // 更新今天 + $record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', $today)->first(); + // 日志记录 $inventoryLog = [ 'module' => 'goods', 'action' => $request->getMethod(), 'target_type' => 'goods_sku', 'target_id' => $sku['id'], - 'user_id' => $request->user()->id + 'user_id' => $request->user()->id, + 'target_field' => 'inventory', + 'before_update' => $record->inventory, + 'after_update' => $requestSkus[$sku['id']]['inventory'] ]; - $record = DailyStockRecord::query()->where('sku_id', $sku['id'])->where('day', DateTimeUtils::getToday())->first(['id', 'inventory']); - $inventoryLog['target_field'] = 'inventory'; - $inventoryLog['before_update'] = $record->inventory; - $record->inventory = $sku['inventory']; - $record->save(); - $inventoryLog['after_update'] = $record->inventory; $logs[] = $inventoryLog; + $externalSkuId = $sku['goods']['goods_code'] . '_' . $sku['sku_code']; + // 自上一次盘点过后有订单发生的数量(包含退单) + $lastInventoryTime = $record->inventory_time; + $addOrderGoodsNum = BusinessOrderItem::query() + ->where('external_sku_id', $externalSkuId) + ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { + $query->where('updated_at', '>', $lastInventoryTime); + }) + ->sum('goods_number'); + $reduceOrderGoodsNum = BusinessOrderItem::query() + ->where('external_sku_id', $externalSkuId) + ->when($lastInventoryTime, function ($query) use ($lastInventoryTime) { + $query->where('updated_at', '>', $lastInventoryTime); + }) + ->sum('already_cancel_number'); + $orderGoodsNum = $addOrderGoodsNum - $reduceOrderGoodsNum; + $record->inventory = $requestSkus[$sku['id']]['inventory']; + $record->inventory_time = $dateTime; + $record->order_goods_num += $orderGoodsNum; + $record->save(); + // 更新明天 + DailyStockRecord::updateOrCreate( + ['sku_id' => $sku['id'], 'day' => $nextDay], + [ + 'inventory' => $record->inventory, + 'inventory_time' => $dateTime, + ] + ); } $log = new LogModel(); $log->batchInsert($logs); diff --git a/app/Models/DailyStockRecord.php b/app/Models/DailyStockRecord.php index 84c1c61..00f6161 100644 --- a/app/Models/DailyStockRecord.php +++ b/app/Models/DailyStockRecord.php @@ -5,4 +5,6 @@ namespace App\Models; class DailyStockRecord extends Model { protected $hidden = ['created_at', 'updated_at']; + + protected $guarded = []; } diff --git a/app/Utils/DateTimeUtils.php b/app/Utils/DateTimeUtils.php index 69d0886..e23b44d 100644 --- a/app/Utils/DateTimeUtils.php +++ b/app/Utils/DateTimeUtils.php @@ -18,6 +18,17 @@ class DateTimeUtils return date('Y-m-d', $time); } + public static function getNextDay() + { + $time = time(); + $inventoryTime = strtotime(date('Y-m-d 07:00:00')); + if ($time > $inventoryTime) { + $time = strtotime('+1 day'); + } + + return date('Y-m-d', $time); + } + public static function getMicroTime($dateTime = null) { $time = microtime(true); diff --git a/database/migrations/2022_07_26_103559_create_daily_stock_records_table.php b/database/migrations/2022_07_26_103559_create_daily_stock_records_table.php index 6d985ce..f13e54e 100644 --- a/database/migrations/2022_07_26_103559_create_daily_stock_records_table.php +++ b/database/migrations/2022_07_26_103559_create_daily_stock_records_table.php @@ -19,7 +19,7 @@ class CreateDailyStockRecordsTable extends Migration $table->date('day'); $table->unsignedInteger('arrived_today_num')->default(0)->comment('今日到货'); $table->unsignedInteger('loss_num')->default(0)->comment('损耗'); - $table->unsignedInteger('inventory')->default(0)->comment('库存盘点'); + $table->integer('inventory')->default(0)->comment('库存盘点'); $table->timestamps(); // 索引 $table->unique(['sku_id', 'day']); diff --git a/database/migrations/2022_08_23_152332_add_fields_with_daily_stock_records_table.php b/database/migrations/2022_08_23_152332_add_fields_with_daily_stock_records_table.php new file mode 100644 index 0000000..006e4ec --- /dev/null +++ b/database/migrations/2022_08_23_152332_add_fields_with_daily_stock_records_table.php @@ -0,0 +1,31 @@ +integer('order_goods_num')->default(0)->comment('截止盘点时间订单商品数量'); + $table->timestamp('inventory_time')->nullable()->comment('盘点时间'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + // + } +}