|
@@ -5,8 +5,11 @@ namespace App\Module\Mex\Logic;
|
|
|
use App\Module\Mex\Models\MexAdminOperation;
|
|
use App\Module\Mex\Models\MexAdminOperation;
|
|
|
use App\Module\Mex\Models\MexWarehouse;
|
|
use App\Module\Mex\Models\MexWarehouse;
|
|
|
use App\Module\Mex\Models\MexTransaction;
|
|
use App\Module\Mex\Models\MexTransaction;
|
|
|
|
|
+use App\Module\Mex\Models\MexPriceConfig;
|
|
|
use App\Module\Mex\Enums\AdminOperationType;
|
|
use App\Module\Mex\Enums\AdminOperationType;
|
|
|
use App\Module\Mex\Enums\TransactionType;
|
|
use App\Module\Mex\Enums\TransactionType;
|
|
|
|
|
+use App\Module\GameItems\Services\ItemService;
|
|
|
|
|
+use App\Module\Game\Enums\REWARD_SOURCE_TYPE;
|
|
|
use Illuminate\Support\Facades\DB;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
|
|
|
|
/**
|
|
/**
|
|
@@ -64,7 +67,19 @@ class MexAdminLogic
|
|
|
|
|
|
|
|
$beforeQuantity = $warehouse->quantity;
|
|
$beforeQuantity = $warehouse->quantity;
|
|
|
|
|
|
|
|
- // 更新仓库库存(注入操作相当于系统买入)
|
|
|
|
|
|
|
+ // 1. 给仓库账户添加真实物品(确保用户可以买到)
|
|
|
|
|
+ $addItemResult = ItemService::addItem(self::WAREHOUSE_USER_ID, $itemId, $quantity, [
|
|
|
|
|
+ 'reason' => 'mex_admin_inject',
|
|
|
|
|
+ 'source_type' => REWARD_SOURCE_TYPE::ADMIN_GRANT->value,
|
|
|
|
|
+ 'source_id' => $adminUserId,
|
|
|
|
|
+ 'remark' => "管理员注入物品到农贸市场,管理员ID:{$adminUserId}"
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ if (!$addItemResult['success']) {
|
|
|
|
|
+ throw new \Exception('给仓库账户添加物品失败:' . ($addItemResult['message'] ?? '未知错误'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 更新仓库库存统计(注入操作相当于系统买入)
|
|
|
$warehouse->quantity += $quantity;
|
|
$warehouse->quantity += $quantity;
|
|
|
$warehouse->total_buy_quantity += $quantity;
|
|
$warehouse->total_buy_quantity += $quantity;
|
|
|
$warehouse->total_buy_amount = bcadd($warehouse->total_buy_amount, $totalAmount, 5);
|
|
$warehouse->total_buy_amount = bcadd($warehouse->total_buy_amount, $totalAmount, 5);
|
|
@@ -150,7 +165,18 @@ class MexAdminLogic
|
|
|
|
|
|
|
|
$beforeQuantity = $warehouse->quantity;
|
|
$beforeQuantity = $warehouse->quantity;
|
|
|
|
|
|
|
|
- // 更新仓库库存(回收操作相当于系统卖出)
|
|
|
|
|
|
|
+ // 1. 从仓库账户扣除真实物品
|
|
|
|
|
+ $consumeItemResult = ItemService::consumeItem(self::WAREHOUSE_USER_ID, $itemId, null, $quantity, [
|
|
|
|
|
+ 'reason' => 'mex_admin_recycle',
|
|
|
|
|
+ 'source_id' => $adminUserId,
|
|
|
|
|
+ 'remark' => "管理员从农贸市场回收物品,管理员ID:{$adminUserId}"
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ if (!$consumeItemResult['success']) {
|
|
|
|
|
+ throw new \Exception('从仓库账户扣除物品失败:' . ($consumeItemResult['message'] ?? '未知错误'));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 更新仓库库存统计(回收操作相当于系统卖出)
|
|
|
$warehouse->quantity -= $quantity;
|
|
$warehouse->quantity -= $quantity;
|
|
|
$warehouse->total_sell_quantity += $quantity;
|
|
$warehouse->total_sell_quantity += $quantity;
|
|
|
$warehouse->total_sell_amount = bcadd($warehouse->total_sell_amount, $totalAmount, 5);
|
|
$warehouse->total_sell_amount = bcadd($warehouse->total_sell_amount, $totalAmount, 5);
|
|
@@ -302,4 +328,83 @@ class MexAdminLogic
|
|
|
'end_date' => now(),
|
|
'end_date' => now(),
|
|
|
];
|
|
];
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 初始化库存
|
|
|
|
|
+ * 为所有已启用定价的商品创建库存记录(库存为0)
|
|
|
|
|
+ *
|
|
|
|
|
+ * @param int $adminUserId 管理员用户ID
|
|
|
|
|
+ * @return array 初始化结果
|
|
|
|
|
+ */
|
|
|
|
|
+ public static function initializeWarehouse(int $adminUserId): array
|
|
|
|
|
+ {
|
|
|
|
|
+ try {
|
|
|
|
|
+ return DB::transaction(function () use ($adminUserId) {
|
|
|
|
|
+ // 1. 检查是否已有库存记录
|
|
|
|
|
+ $existingWarehouseCount = MexWarehouse::count();
|
|
|
|
|
+ if ($existingWarehouseCount > 0) {
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'success' => false,
|
|
|
|
|
+ 'message' => '库存表不为空,无法初始化。当前已有 ' . $existingWarehouseCount . ' 条库存记录。'
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 2. 获取所有已启用的定价配置
|
|
|
|
|
+ $priceConfigs = MexPriceConfig::where('is_enabled', true)->get();
|
|
|
|
|
+ if ($priceConfigs->isEmpty()) {
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'success' => false,
|
|
|
|
|
+ 'message' => '没有找到已启用的定价配置,无法初始化库存。'
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ $initializedItems = [];
|
|
|
|
|
+ $now = now();
|
|
|
|
|
+
|
|
|
|
|
+ // 3. 为每个已定价的商品创建库存记录
|
|
|
|
|
+ foreach ($priceConfigs as $priceConfig) {
|
|
|
|
|
+ $warehouse = MexWarehouse::create([
|
|
|
|
|
+ 'item_id' => $priceConfig->item_id,
|
|
|
|
|
+ 'quantity' => 0,
|
|
|
|
|
+ 'total_buy_amount' => '0.00000',
|
|
|
|
|
+ 'total_sell_amount' => '0.00000',
|
|
|
|
|
+ 'total_buy_quantity' => 0,
|
|
|
|
|
+ 'total_sell_quantity' => 0,
|
|
|
|
|
+ 'last_transaction_at' => $now,
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ $initializedItems[] = [
|
|
|
|
|
+ 'item_id' => $priceConfig->item_id,
|
|
|
|
|
+ 'min_price' => $priceConfig->min_price,
|
|
|
|
|
+ 'max_price' => $priceConfig->max_price,
|
|
|
|
|
+ 'warehouse_id' => $warehouse->id,
|
|
|
|
|
+ ];
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ // 4. 创建管理员操作记录
|
|
|
|
|
+ $operation = MexAdminOperation::create([
|
|
|
|
|
+ 'admin_user_id' => $adminUserId,
|
|
|
|
|
+ 'operation_type' => AdminOperationType::INJECT, // 使用注入类型记录初始化操作
|
|
|
|
|
+ 'item_id' => 0, // 特殊标记:0表示批量初始化
|
|
|
|
|
+ 'quantity' => count($initializedItems),
|
|
|
|
|
+ 'price' => '0.00000',
|
|
|
|
|
+ 'total_amount' => '0.00000',
|
|
|
|
|
+ 'before_warehouse_quantity' => 0,
|
|
|
|
|
+ 'after_warehouse_quantity' => 0,
|
|
|
|
|
+ 'transaction_id' => null,
|
|
|
|
|
+ 'remark' => "初始化农贸市场库存,为 " . count($initializedItems) . " 个商品创建库存记录",
|
|
|
|
|
+ ]);
|
|
|
|
|
+
|
|
|
|
|
+ return [
|
|
|
|
|
+ 'success' => true,
|
|
|
|
|
+ 'message' => '库存初始化成功',
|
|
|
|
|
+ 'operation_id' => $operation->id,
|
|
|
|
|
+ 'initialized_count' => count($initializedItems),
|
|
|
|
|
+ 'initialized_items' => $initializedItems,
|
|
|
|
|
+ ];
|
|
|
|
|
+ });
|
|
|
|
|
+ } catch (\Exception $e) {
|
|
|
|
|
+ return ['success' => false, 'message' => '库存初始化失败:' . $e->getMessage()];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|