MexAdminToolController.php 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. <?php
  2. namespace App\Module\Mex\AdminControllers;
  3. use App\Module\Mex\Services\MexAdminService;
  4. use Spatie\RouteAttributes\Attributes\Get;
  5. use Spatie\RouteAttributes\Attributes\Post;
  6. use UCore\DcatAdmin\AdminController;
  7. use Dcat\Admin\Form;
  8. use Dcat\Admin\Layout\Content;
  9. use Dcat\Admin\Widgets\Card;
  10. use Dcat\Admin\Admin;
  11. use Illuminate\Http\Request;
  12. /**
  13. * 农贸市场管理员工具
  14. *
  15. * 提供物品注入、回收等管理员操作功能
  16. *
  17. * @menu 游戏运营管理/农贸市场管理/🛠 管理工具
  18. */
  19. class MexAdminToolController extends AdminController
  20. {
  21. /**
  22. * 页面标题
  23. *
  24. * @var string
  25. */
  26. protected $title = '农贸市场管理工具';
  27. /**
  28. * 工具页面
  29. */
  30. #[Get('mex-admin-tools', name: 'dcat.admin.mex-admin-tools.index')]
  31. public function index(Content $content)
  32. {
  33. return $content
  34. ->title($this->title)
  35. ->description('管理员操作工具')
  36. ->body($this->buildToolsPage());
  37. }
  38. /**
  39. * 物品注入页面
  40. */
  41. #[Get('mex-admin-tools/inject', name: 'dcat.admin.mex-admin-tools.inject')]
  42. public function inject(Content $content)
  43. {
  44. return $content
  45. ->title('物品注入')
  46. ->description('向市场注入物品,增加供应量')
  47. ->body($this->buildInjectForm());
  48. }
  49. /**
  50. * 物品回收页面
  51. */
  52. #[Get('mex-admin-tools/recycle', name: 'dcat.admin.mex-admin-tools.recycle')]
  53. public function recycle(Content $content)
  54. {
  55. return $content
  56. ->title('物品回收')
  57. ->description('从市场回收物品,减少供应量')
  58. ->body($this->buildRecycleForm());
  59. }
  60. /**
  61. * 处理物品注入
  62. */
  63. #[Post('mex-admin-tools/inject', name: 'dcat.admin.mex-admin-tools.inject.store')]
  64. public function storeInject(Request $request)
  65. {
  66. $request->validate([
  67. 'item_id' => 'required|integer|min:1',
  68. 'quantity' => 'required|integer|min:1',
  69. 'price' => 'required|numeric|min:0',
  70. 'remark' => 'nullable|string|max:255',
  71. ], [
  72. 'item_id.required' => '商品ID不能为空',
  73. 'item_id.integer' => '商品ID必须是整数',
  74. 'item_id.min' => '商品ID必须大于0',
  75. 'quantity.required' => '数量不能为空',
  76. 'quantity.integer' => '数量必须是整数',
  77. 'quantity.min' => '数量必须大于0',
  78. 'price.required' => '价格不能为空',
  79. 'price.numeric' => '价格必须是数字',
  80. 'price.min' => '价格不能为负数',
  81. 'remark.max' => '备注不能超过255个字符',
  82. ]);
  83. try {
  84. $result = MexAdminService::injectItem(
  85. adminUserId: Admin::user()->id,
  86. itemId: $request->item_id,
  87. quantity: $request->quantity,
  88. price: $request->price,
  89. remark: $request->remark ?? '后台管理员注入'
  90. );
  91. if ($result['success']) {
  92. admin_success('注入成功!', '操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id']);
  93. return redirect()->route('dcat.admin.mex-admin-tools.inject');
  94. } else {
  95. admin_error('注入失败', $result['message']);
  96. return back()->withInput();
  97. }
  98. } catch (\Exception $e) {
  99. admin_error('注入失败', $e->getMessage());
  100. return back()->withInput();
  101. }
  102. }
  103. /**
  104. * 处理物品回收
  105. */
  106. #[Post('mex-admin-tools/recycle', name: 'dcat.admin.mex-admin-tools.recycle.store')]
  107. public function storeRecycle(Request $request)
  108. {
  109. $request->validate([
  110. 'item_id' => 'required|integer|min:1',
  111. 'quantity' => 'required|integer|min:1',
  112. 'price' => 'required|numeric|min:0',
  113. 'remark' => 'nullable|string|max:255',
  114. ], [
  115. 'item_id.required' => '商品ID不能为空',
  116. 'item_id.integer' => '商品ID必须是整数',
  117. 'item_id.min' => '商品ID必须大于0',
  118. 'quantity.required' => '数量不能为空',
  119. 'quantity.integer' => '数量必须是整数',
  120. 'quantity.min' => '数量必须大于0',
  121. 'price.required' => '价格不能为空',
  122. 'price.numeric' => '价格必须是数字',
  123. 'price.min' => '价格不能为负数',
  124. 'remark.max' => '备注不能超过255个字符',
  125. ]);
  126. try {
  127. $result = MexAdminService::recycleItem(
  128. adminUserId: Admin::user()->id,
  129. itemId: $request->item_id,
  130. quantity: $request->quantity,
  131. price: $request->price,
  132. remark: $request->remark ?? '后台管理员回收'
  133. );
  134. if ($result['success']) {
  135. admin_success('回收成功!', '操作ID: ' . $result['operation_id'] . ', 成交ID: ' . $result['transaction_id']);
  136. return redirect()->route('dcat.admin.mex-admin-tools.recycle');
  137. } else {
  138. admin_error('回收失败', $result['message']);
  139. return back()->withInput();
  140. }
  141. } catch (\Exception $e) {
  142. admin_error('回收失败', $e->getMessage());
  143. return back()->withInput();
  144. }
  145. }
  146. /**
  147. * 构建工具页面
  148. */
  149. private function buildToolsPage()
  150. {
  151. $card = new Card('农贸市场管理工具', '
  152. <div class="row">
  153. <div class="col-md-6">
  154. <div class="card">
  155. <div class="card-body text-center">
  156. <i class="fa fa-plus-circle fa-3x text-success mb-3"></i>
  157. <h5>物品注入</h5>
  158. <p class="text-muted">向市场投放商品,增加供应量</p>
  159. <a href="' . route('dcat.admin.mex-admin-tools.inject') . '" class="btn btn-success">
  160. <i class="fa fa-plus"></i> 开始注入
  161. </a>
  162. </div>
  163. </div>
  164. </div>
  165. <div class="col-md-6">
  166. <div class="card">
  167. <div class="card-body text-center">
  168. <i class="fa fa-minus-circle fa-3x text-warning mb-3"></i>
  169. <h5>物品回收</h5>
  170. <p class="text-muted">从市场回收商品,减少供应量</p>
  171. <a href="' . route('dcat.admin.mex-admin-tools.recycle') . '" class="btn btn-warning">
  172. <i class="fa fa-minus"></i> 开始回收
  173. </a>
  174. </div>
  175. </div>
  176. </div>
  177. </div>
  178. <div class="row mt-4">
  179. <div class="col-md-12">
  180. <div class="alert alert-info">
  181. <h6><i class="fa fa-info-circle"></i> 使用说明</h6>
  182. <ul class="mb-0">
  183. <li><strong>物品注入</strong>:相当于系统向仓库"卖出"物品,增加仓库库存,系统获得资金</li>
  184. <li><strong>物品回收</strong>:相当于系统从仓库"买入"物品,减少仓库库存,系统支出资金</li>
  185. <li>所有操作都会记录在管理员操作记录中,并生成对应的成交记录</li>
  186. <li>操作前请确认商品ID、数量和价格的准确性</li>
  187. </ul>
  188. </div>
  189. </div>
  190. </div>
  191. ');
  192. return $card;
  193. }
  194. /**
  195. * 构建注入表单
  196. */
  197. private function buildInjectForm()
  198. {
  199. $form = new Form();
  200. $form->action(route('dcat.admin.mex-admin-tools.inject.store'));
  201. $form->number('item_id', '商品ID')
  202. ->required()
  203. ->min(1)
  204. ->help('请输入要注入的商品ID');
  205. $form->number('quantity', '注入数量')
  206. ->required()
  207. ->min(1)
  208. ->help('请输入要注入的数量');
  209. $form->decimal('price', '注入价格')
  210. ->required()
  211. ->help('请输入注入价格(每个商品的价格)');
  212. $form->textarea('remark', '操作备注')
  213. ->rows(3)
  214. ->help('可选,记录本次操作的原因或说明');
  215. $form->html('<div class="alert alert-warning">
  216. <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
  217. <ul class="mb-0">
  218. <li>注入操作相当于系统向仓库"卖出"物品</li>
  219. <li>会增加仓库的库存数量</li>
  220. <li>系统会获得相应的资金收入</li>
  221. <li>操作不可撤销,请谨慎操作</li>
  222. </ul>
  223. </div>');
  224. return $form;
  225. }
  226. /**
  227. * 构建回收表单
  228. */
  229. private function buildRecycleForm()
  230. {
  231. $form = new Form();
  232. $form->action(route('dcat.admin.mex-admin-tools.recycle.store'));
  233. $form->number('item_id', '商品ID')
  234. ->required()
  235. ->min(1)
  236. ->help('请输入要回收的商品ID');
  237. $form->number('quantity', '回收数量')
  238. ->required()
  239. ->min(1)
  240. ->help('请输入要回收的数量');
  241. $form->decimal('price', '回收价格')
  242. ->required()
  243. ->help('请输入回收价格(每个商品的价格)');
  244. $form->textarea('remark', '操作备注')
  245. ->rows(3)
  246. ->help('可选,记录本次操作的原因或说明');
  247. $form->html('<div class="alert alert-warning">
  248. <h6><i class="fa fa-exclamation-triangle"></i> 注意事项</h6>
  249. <ul class="mb-0">
  250. <li>回收操作相当于系统从仓库"买入"物品</li>
  251. <li>会减少仓库的库存数量</li>
  252. <li>系统会支出相应的资金</li>
  253. <li>回收数量不能超过当前库存</li>
  254. <li>操作不可撤销,请谨慎操作</li>
  255. </ul>
  256. </div>');
  257. return $form;
  258. }
  259. }