BargainActivityLogic.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | likeshop100%开源免费商用商城系统
  4. // +----------------------------------------------------------------------
  5. // | 欢迎阅读学习系统程序代码,建议反馈是我们前进的动力
  6. // | 开源版本可自由商用,可去除界面版权logo
  7. // | 商业版本务必购买商业授权,以免引起法律纠纷
  8. // | 禁止对系统程序代码以任何目的,任何形式的再发布
  9. // | gitee下载:https://gitee.com/likeshop_gitee
  10. // | github下载:https://github.com/likeshop-github
  11. // | 访问官网:https://www.likeshop.cn
  12. // | 访问社区:https://home.likeshop.cn
  13. // | 访问手册:http://doc.likeshop.cn
  14. // | 微信公众号:likeshop技术社区
  15. // | likeshop团队 版权所有 拥有最终解释权
  16. // +----------------------------------------------------------------------
  17. // | author: likeshopTeam
  18. // +----------------------------------------------------------------------
  19. namespace app\adminapi\logic\bargain;
  20. use app\adminapi\validate\bargain\BargainActivityValidate;
  21. use app\common\enum\ActivityEnum;
  22. use app\common\enum\BargainEnum;
  23. use app\common\enum\OrderEnum;
  24. use app\common\enum\YesNoEnum;
  25. use app\common\logic\BaseLogic;
  26. use app\common\model\BargainActivity;
  27. use app\common\model\BargainGoods;
  28. use app\common\model\BargainHelp;
  29. use app\common\model\BargainInitiate;
  30. use app\common\model\GoodsActivity;
  31. use app\common\model\GoodsItem;
  32. use app\common\model\Order;
  33. use app\common\service\FileService;
  34. use think\facade\Db;
  35. /**
  36. * 砍价逻辑层
  37. * Class BargainActivityLogic
  38. * @package app\adminapi\logic\bargain
  39. */
  40. class BargainActivityLogic extends BaseLogic
  41. {
  42. /**
  43. * @notes 选择商品
  44. * @param $params
  45. * @return mixed
  46. * @author Tab
  47. * @date 2021/8/26 16:55
  48. */
  49. public static function chooseGoods($params)
  50. {
  51. $where = [
  52. ['g.id', 'in', $params['goods_ids']]
  53. ];
  54. $field = [
  55. 'g.id' => 'goods_id',
  56. 'g.image' => 'goods_image',
  57. 'g.name' => 'goods_name',
  58. 'gi.id' => 'item_id',
  59. 'gi.spec_value_str',
  60. 'gi.sell_price'
  61. ];
  62. $lists = GoodsItem::alias('gi')
  63. ->leftJoin('goods g', 'g.id = gi.goods_id')
  64. ->field($field)
  65. ->where($where)
  66. ->order('g.id', 'desc')
  67. ->select()
  68. ->toArray();
  69. // 格式化数据
  70. $data = [];
  71. foreach($lists as &$item) {
  72. $item['goods_image'] = FileService::getFileUrl($item['goods_image']);
  73. $data[$item['goods_id']]['goods_id'] = $item['goods_id'];
  74. $data[$item['goods_id']]['goods_name'] = $item['goods_name'];
  75. $data[$item['goods_id']]['goods_image'] = $item['goods_image'];
  76. $item['first_knife'] = 0;
  77. $item['floor_price'] = 0;
  78. unset($item['goods_name']);
  79. unset($item['goods_image']);
  80. $data[$item['goods_id']]['items'][] = $item;
  81. }
  82. $data = array_values($data);
  83. return $data;
  84. }
  85. /**
  86. * @notes 添加砍价活动
  87. * @param $params
  88. * @return bool
  89. * @author Tab
  90. * @date 2021/8/27 11:24
  91. */
  92. public static function add($params)
  93. {
  94. Db::startTrans();
  95. try {
  96. // 添加砍价活动记录
  97. $activityId = self::addBarginActivity($params);
  98. // 添加砍价商品
  99. $params['activity_id'] = $activityId;
  100. self::addBarginGoods($params);
  101. // 添加商品活动信息
  102. self::addGoodsActivity($params);
  103. Db::commit();
  104. return true;
  105. } catch (\Exception $e) {
  106. self::setError($e->getMessage());
  107. Db::rollback();
  108. return false;
  109. }
  110. }
  111. /**
  112. * @notes 添加砍价活动记录
  113. * @param $params
  114. * @author Tab
  115. * @date 2021/8/27 11:24
  116. */
  117. public static function addBarginActivity($params)
  118. {
  119. $bargainActivity = new BargainActivity();
  120. $params['sn'] = generate_sn($bargainActivity, 'sn');
  121. $bargainActivity->save($params);
  122. return $bargainActivity->id;
  123. }
  124. /**
  125. * @notes 添加砍价商品
  126. * @param $params
  127. * @throws \Exception
  128. * @author Tab
  129. * @date 2021/8/27 11:30
  130. */
  131. public static function addBarginGoods($params)
  132. {
  133. $goods = self::formatData($params);
  134. $bargainGoods = new BargainGoods();
  135. $bargainGoods->saveAll($goods);
  136. }
  137. /**
  138. * @notes 添加商品活动信息
  139. * @param $params
  140. * @author Tab
  141. * @date 2021/10/11 16:53
  142. */
  143. public static function addGoodsActivity($params)
  144. {
  145. $goods = self::formatData($params);
  146. foreach ($goods as &$good) {
  147. unset($good['first_knife']);
  148. unset($good['floor_price']);
  149. $good['activity_type'] = ActivityEnum::BARGAIN;
  150. }
  151. $goodsActivity = new GoodsActivity();
  152. $goodsActivity->saveAll($goods);
  153. }
  154. /**
  155. * @notes 格式化数据
  156. * @param $params
  157. * @return array
  158. * @author Tab
  159. * @date 2021/8/27 11:27
  160. */
  161. public static function formatData($params)
  162. {
  163. $data = [];
  164. foreach($params['goods'] as $item) {
  165. foreach ($item['items'] as $subItem) {
  166. if (empty($subItem['first_knife']) || empty($subItem['floor_price'])) {
  167. throw new \Exception('首刀金额和底价均不能为空或者为0');
  168. }
  169. // 获取规格原价
  170. $itemPrice = GoodsItem::where('id', $subItem['item_id'])->value('sell_price');
  171. if ($itemPrice <= $subItem['floor_price']) {
  172. throw new \Exception('底价须低于原价');
  173. }
  174. $subItem['goods_id'] = $item['goods_id'];
  175. $subItem['activity_id'] = $params['activity_id'];
  176. $subItem['virtual_click_num'] = $item['virtual_click_num'] ?? 0;
  177. $subItem['virtual_sales_num'] = $item['virtual_sales_num'] ?? 0;
  178. $data[] = $subItem;
  179. }
  180. }
  181. return $data;
  182. }
  183. /**
  184. * @notes 查看砍价活动详情
  185. * @param $params
  186. * @return array
  187. * @author Tab
  188. * @date 2021/8/27 15:02
  189. */
  190. public static function detail($params)
  191. {
  192. // 砍价活动规则数据
  193. $bargainActivity = BargainActivity::withoutField('sn,create_time,update_time,delete_time')
  194. ->append(['status_desc'])
  195. ->findOrEmpty($params['id'])->toArray();
  196. if (empty($bargainActivity)) {
  197. return [];
  198. }
  199. $field = [
  200. 'bg.activity_id',
  201. 'bg.goods_id',
  202. 'bg.item_id',
  203. 'bg.first_knife',
  204. 'bg.floor_price',
  205. 'bg.virtual_sales_num',
  206. 'bg.virtual_click_num',
  207. 'g.name' => 'goods_name',
  208. 'g.image' => 'goods_image',
  209. 'g.spec_type',
  210. 'g.total_stock',
  211. 'gi.id',
  212. 'gi.spec_value_str',
  213. 'gi.sell_price',
  214. 'gi.stock',
  215. ];
  216. // 砍价活动商品数据
  217. $bargainGoods = BargainGoods::alias('bg')
  218. ->leftJoin('goods g', 'g.id = bg.goods_id')
  219. ->leftJoin('goods_item gi', 'gi.id = bg.item_id')
  220. ->field($field)
  221. ->where('activity_id', $params['id'])->select()->toArray();
  222. // 格式化数据
  223. $data = [];
  224. foreach($bargainGoods as &$item) {
  225. // halt($item);
  226. $item['goods_image'] = FileService::getFileUrl($item['goods_image']);
  227. $data[$item['goods_id']]['id'] = $item['goods_id'];
  228. $data[$item['goods_id']]['name'] = $item['goods_name'];
  229. $data[$item['goods_id']]['image'] = $item['goods_image'];
  230. $data[$item['goods_id']]['spec_type'] = $item['spec_type'];
  231. $data[$item['goods_id']]['total_stock'] = $item['total_stock'];
  232. $data[$item['goods_id']]['virtual_sales_num'] = $item['virtual_sales_num'];
  233. $data[$item['goods_id']]['virtual_click_num'] = $item['virtual_click_num'];
  234. if (isset($data[$item['goods_id']]['sell_price'])) {
  235. $data[$item['goods_id']]['sell_price'] = min($data[$item['goods_id']]['sell_price'] = $item['sell_price'], $item['sell_price']);
  236. } else {
  237. $data[$item['goods_id']]['sell_price'] = $item['sell_price'];
  238. }
  239. unset($item['goods_name']);
  240. unset($item['goods_image']);
  241. unset($item['total_stock']);
  242. $data[$item['goods_id']]['item'][] = $item;
  243. }
  244. $bargainActivity['goods'] = array_values($data);
  245. return $bargainActivity;
  246. }
  247. /**
  248. * @notes 编辑砍价活动
  249. * @param $params
  250. * @return bool
  251. * @author Tab
  252. * @date 2021/8/27 16:16
  253. */
  254. public static function edit($params)
  255. {
  256. Db::startTrans();
  257. try {
  258. $bargainActivity = BargainActivity::findOrEmpty($params['id'])->toArray();
  259. if (empty($bargainActivity)) {
  260. throw new \Exception('砍价活动不存在');
  261. }
  262. if ($bargainActivity['status'] == BargainEnum::ACTIVITY_STATUS_END) {
  263. throw new \Exception('砍价活动已结束');
  264. }
  265. $params = request()->post();
  266. // 未开始的砍价活动
  267. if ($bargainActivity['status'] == BargainEnum::ACTIVITY_STATUS_WAIT) {
  268. validate(BargainActivityValidate::class)
  269. ->scene('editWait')
  270. ->check($params);
  271. self::editWait($params);
  272. }
  273. // 进行中的砍价活动
  274. if ($bargainActivity['status'] == BargainEnum::ACTIVITY_STATUS_ING) {
  275. validate(BargainActivityValidate::class)
  276. ->scene('editIng')
  277. ->check($params);
  278. self::editIng($params);
  279. }
  280. Db::commit();
  281. return true;
  282. } catch(\Exception $e) {
  283. Db::rollback();
  284. self::setError($e->getMessage());
  285. return false;
  286. }
  287. }
  288. /**
  289. * @notes 编辑未开始的砍价活动
  290. * @param $params
  291. * @throws \Exception
  292. * @author Tab
  293. * @date 2021/8/27 16:41
  294. */
  295. public static function editWait($params)
  296. {
  297. // 更新砍价活动表
  298. $allowField = ['name','start_time','end_time','remark','is_distribution','buy_condition','valid_period','help_num','knife_amount_type','self','count','buy_limit','order_limit','use_coupon'];
  299. self::updateBargainActivity($allowField, $params);
  300. // 更新砍价商品表
  301. self::updateBargainGoods($params);
  302. }
  303. /**
  304. * @notes 编辑进行中的砍价活动
  305. * @author Tab
  306. * @date 2021/8/27 16:43
  307. */
  308. public static function editIng($params)
  309. {
  310. $allowField = ['name', 'end_time', 'remark'];
  311. self::updateBargainActivity($allowField, $params);
  312. }
  313. /**
  314. * @notes 更新砍价活动表
  315. * @param $allowField
  316. * @param $params
  317. * @author Tab
  318. * @date 2021/8/27 16:36
  319. */
  320. public static function updateBargainActivity($allowField,$params)
  321. {
  322. BargainActivity::update($params, ['id' => $params['id']], $allowField);
  323. }
  324. /**
  325. * @notes 更新砍价商品
  326. * @param $params
  327. * @throws \Exception
  328. * @author Tab
  329. * @date 2021/8/27 16:40
  330. */
  331. public static function updateBargainGoods($params)
  332. {
  333. // 删除旧数据
  334. $destroyIds = BargainGoods::where('activity_id', $params['id'])->column('id');
  335. BargainGoods::destroy($destroyIds);
  336. // 删除商品参与活动的信息
  337. $goodsActivityIds = GoodsActivity::where([
  338. 'activity_type' => ActivityEnum::BARGAIN,
  339. 'activity_id' => $params['id'],
  340. ])->column('id');
  341. if (count($goodsActivityIds)) {
  342. GoodsActivity::destroy($goodsActivityIds);
  343. }
  344. // 添加新数据
  345. $params['activity_id'] = $params['id'];
  346. self::addBarginGoods($params);
  347. // 添加商品活动信息
  348. self::addGoodsActivity($params);
  349. }
  350. /**
  351. * @notes 确认砍价活动
  352. * @param $params
  353. * @return bool
  354. * @author Tab
  355. * @date 2021/8/27 17:12
  356. */
  357. public static function confirm($params)
  358. {
  359. try {
  360. $bargainActivity = BargainActivity::findOrEmpty($params['id']);
  361. if ($bargainActivity->isEmpty()) {
  362. throw new \Exception('砍价活动不存在');
  363. }
  364. if ($bargainActivity->status != BargainEnum::ACTIVITY_STATUS_WAIT) {
  365. throw new \Exception('不是未开始状态的砍价活动不允许确认');
  366. }
  367. $bargainActivity->status = BargainEnum::ACTIVITY_STATUS_ING;
  368. $bargainActivity->save();
  369. return true;
  370. } catch (\Exception $e) {
  371. self::setError($e->getMessage());
  372. return false;
  373. }
  374. }
  375. /**
  376. * @notes 结束砍价活动
  377. * @param $params
  378. * @return bool
  379. * @author Tab
  380. * @date 2021/8/27 17:29
  381. */
  382. public static function stop($params)
  383. {
  384. Db::startTrans();
  385. try {
  386. $bargainActivity = BargainActivity::findOrEmpty($params['id']);
  387. if ($bargainActivity->isEmpty()) {
  388. throw new \Exception('砍价活动不存在');
  389. }
  390. if ($bargainActivity->status != BargainEnum::ACTIVITY_STATUS_ING) {
  391. throw new \Exception('不是进行中状态的砍价活动不允许结束');
  392. }
  393. // 更新砍价活动状态
  394. $bargainActivity->status = BargainEnum::ACTIVITY_STATUS_END;
  395. $bargainActivity->close_time = time();
  396. $bargainActivity->save();
  397. // 更新砍价中的记录为砍价失败
  398. $bargainInitiate = BargainInitiate::where([
  399. 'activity_id' => $bargainActivity->id,
  400. 'status' => BargainEnum::STATUS_ING
  401. ])->select()->toArray();
  402. $updateData = [];
  403. foreach($bargainInitiate as $item) {
  404. $updateData[] = [
  405. 'id' => $item['id'],
  406. 'status' => BargainEnum::STATUS_FAIL
  407. ];
  408. }
  409. (new BargainInitiate)->saveAll($updateData);
  410. // 删除商品参与活动的信息
  411. $goodsActivityIds = GoodsActivity::where([
  412. 'activity_type' => ActivityEnum::BARGAIN,
  413. 'activity_id' => $params['id'],
  414. ])->column('id');
  415. if (count($goodsActivityIds)) {
  416. GoodsActivity::destroy($goodsActivityIds);
  417. }
  418. Db::commit();
  419. return true;
  420. } catch (\Exception $e) {
  421. Db::rollback();
  422. self::setError($e->getMessage());
  423. return false;
  424. }
  425. }
  426. /**
  427. * @notes 删除砍价活动
  428. * @param $params
  429. * @return bool
  430. * @author Tab
  431. * @date 2021/8/27 17:35
  432. */
  433. public static function delete($params)
  434. {
  435. Db::startTrans();
  436. try {
  437. $bargainActivity = BargainActivity::findOrEmpty($params['id']);
  438. if ($bargainActivity->isEmpty()) {
  439. throw new \Exception('砍价活动不存在');
  440. }
  441. // 删除砍价商品
  442. $destroyIds = BargainGoods::where('activity_id', $bargainActivity->id)->column('id');
  443. BargainGoods::destroy($destroyIds);
  444. // 删除砍价活动
  445. BargainActivity::destroy($bargainActivity->id);
  446. // 更新砍价中的记录为砍价失败
  447. $bargainInitiate = BargainInitiate::where([
  448. 'activity_id' => $bargainActivity->id,
  449. 'status' => BargainEnum::STATUS_ING
  450. ])->select()->toArray();
  451. $updateData = [];
  452. foreach($bargainInitiate as $item) {
  453. $updateData[] = [
  454. 'id' => $item['id'],
  455. 'status' => BargainEnum::STATUS_FAIL
  456. ];
  457. }
  458. (new BargainInitiate)->saveAll($updateData);
  459. // 删除商品参与活动的信息
  460. $goodsActivityIds = GoodsActivity::where([
  461. 'activity_type' => ActivityEnum::BARGAIN,
  462. 'activity_id' => $params['id'],
  463. ])->column('id');
  464. if (count($goodsActivityIds)) {
  465. GoodsActivity::destroy($goodsActivityIds);
  466. }
  467. Db::commit();
  468. return true;
  469. } catch (\Exception $e) {
  470. Db::rollback();
  471. self::setError($e->getMessage());
  472. return false;
  473. }
  474. }
  475. /**
  476. * @notes 活动数据
  477. * @param $params
  478. * @author Tab
  479. * @date 2021/9/23 18:56
  480. */
  481. public static function activityData($params)
  482. {
  483. return [
  484. 'activity_info' => self::activityInfo($params),
  485. 'activity_data' => self::activityDataInfo($params),
  486. 'activity_goods' => self::activityGoods($params)
  487. ];
  488. }
  489. /**
  490. * @notes 活动信息
  491. * @param $params
  492. * @author Tab
  493. * @date 2021/9/24 10:43
  494. */
  495. public static function activityInfo($params)
  496. {
  497. $field = [
  498. 'sn',
  499. 'name',
  500. 'start_time' => 'start_time_desc',
  501. 'end_time' => 'end_time_desc',
  502. 'status',
  503. 'status' => 'status_desc',
  504. 'close_time'
  505. ];
  506. $info = BargainActivity::field($field)->findOrEmpty($params['id'])->toArray();
  507. return $info;
  508. }
  509. /**
  510. * @notes 活动数据
  511. * @param $params
  512. * @author Tab
  513. * @date 2021/9/24 11:57
  514. */
  515. public static function activityDataInfo($params)
  516. {
  517. // 浏览量
  518. $visited = BargainActivity::where('id', $params['id'])->value('visited');
  519. // 活动对应的订单id
  520. $orderIds = BargainInitiate::where('activity_id', $params['id'])->whereNotNull('order_id')->column('order_id');
  521. // 成交订单数
  522. $orderCount = Order::where([
  523. ['order_type', '=' ,OrderEnum::BARGAIN_ORDER],
  524. ['pay_status', '=', YesNoEnum::YES],
  525. ['id', 'in', $orderIds]
  526. ])->count();
  527. // 销量
  528. $totalNum = Order::where([
  529. ['order_type', '=' ,OrderEnum::BARGAIN_ORDER],
  530. ['pay_status', '=', YesNoEnum::YES],
  531. ['id', 'in', $orderIds]
  532. ])->sum('total_num');
  533. // 销售额
  534. $totalAmount = Order::where([
  535. ['order_type', '=' ,OrderEnum::BARGAIN_ORDER],
  536. ['pay_status', '=', YesNoEnum::YES],
  537. ['id', 'in', $orderIds]
  538. ])->sum('order_amount');
  539. // 发起砍价次数
  540. $initiateCount = BargainInitiate::where('activity_id', $params['id'])->count();
  541. // 砍价成功次数
  542. $initiateSuccessCount = BargainInitiate::where([
  543. 'activity_id' => $params['id'],
  544. 'status' => BargainEnum::STATUS_SUCCESS
  545. ])->count();
  546. // 帮砍人数
  547. $initiateIds = BargainInitiate::where('activity_id', $params['id'])->column('id');
  548. $helpCount = BargainHelp::where('initiate_id', 'in', $initiateIds)->count();
  549. return [
  550. 'visited' => $visited,
  551. 'total_amount' => $totalAmount,
  552. 'total_num' => $totalNum,
  553. 'order_count' => $orderCount,
  554. 'initiate_count' => $initiateCount,
  555. 'initiate_success_count' => $initiateSuccessCount,
  556. 'help_count' => $helpCount,
  557. ];
  558. }
  559. /**
  560. * @notes 活动商品
  561. * @param $params
  562. * @return mixed
  563. * @throws \think\db\exception\DataNotFoundException
  564. * @throws \think\db\exception\DbException
  565. * @throws \think\db\exception\ModelNotFoundException
  566. * @author Tab
  567. * @date 2021/9/24 14:48
  568. */
  569. public static function activityGoods($params)
  570. {
  571. $field = [
  572. 'g.id' => 'goods_id',
  573. 'g.image' => 'goods_image',
  574. 'g.name' => 'goods_name',
  575. 'gi.id' => 'item_id',
  576. 'gi.spec_value_str',
  577. 'gi.sell_price',
  578. 'bg.visited',
  579. 'bg.visited',
  580. 'bg.activity_id',
  581. ];
  582. $lists = BargainGoods::alias('bg')
  583. ->leftJoin('goods g', 'g.id = bg.goods_id')
  584. ->leftJoin('goods_item gi', 'gi.id = bg.item_id')
  585. ->field($field)
  586. ->where('bg.activity_id', $params['id'])
  587. ->select()
  588. ->toArray();
  589. foreach ($lists as &$item) {
  590. $item['goods_image'] = FileService::getFileUrl($item['goods_image']);
  591. $initiateInfo = self::initiateInfo($item);
  592. // 发起砍价次数
  593. $item['initiate_count'] = $initiateInfo['initiate_count'];
  594. // 帮砍次数
  595. $item['help_count'] = $initiateInfo['help_count'];
  596. // 发起砍价成功次数
  597. $item['initiate_success_count'] = $initiateInfo['initiate_success_count'];
  598. // 成交订单
  599. $item['order_count'] = $initiateInfo['order_count'];
  600. // 销售量
  601. $item['total_num'] = $initiateInfo['total_num'];
  602. // 销售额
  603. $item['total_amount'] = $initiateInfo['total_amount'];
  604. }
  605. return $lists;
  606. }
  607. /**
  608. * @notes 砍价信息
  609. * @param $item
  610. * @return array
  611. * @throws \think\db\exception\DataNotFoundException
  612. * @throws \think\db\exception\DbException
  613. * @throws \think\db\exception\ModelNotFoundException
  614. * @author Tab
  615. * @date 2021/9/24 14:41
  616. */
  617. public static function initiateInfo($item)
  618. {
  619. $bargainInitiate = BargainInitiate::where('goods_snapshot->goods_id', $item['goods_id'])
  620. ->where('goods_snapshot->item_id', $item['item_id'])
  621. ->select()->toArray();
  622. // 砍价次数
  623. $initiateCount = count($bargainInitiate);
  624. // 帮砍人数
  625. $helpCount = 0;
  626. // 砍价成功
  627. $initiateSuccessCount = 0;
  628. // 订单id
  629. $orderIds = [];
  630. foreach ($bargainInitiate as $item) {
  631. $helpCount = $item['help_num'];
  632. if ($item['status'] == BargainEnum::STATUS_SUCCESS) {
  633. $initiateSuccessCount++;
  634. }
  635. if (!empty($item['order_id'])) {
  636. $orderIds[] = $item['order_id'];
  637. }
  638. }
  639. // 成交订单
  640. $orderCount = Order::where([
  641. ['pay_status', '=', YesNoEnum::YES],
  642. ['id', 'in', $orderIds]
  643. ])->count();
  644. // 销售量
  645. $totalNum = Order::where([
  646. ['pay_status', '=', YesNoEnum::YES],
  647. ['id', 'in', $orderIds]
  648. ])->sum('total_num');
  649. // 销售额
  650. $totalAmount = Order::where([
  651. ['pay_status', '=', YesNoEnum::YES],
  652. ['id', 'in', $orderIds]
  653. ])->sum('order_amount');
  654. return [
  655. 'initiate_count' => $initiateCount,
  656. 'help_count' => $helpCount,
  657. 'initiate_success_count' => $initiateSuccessCount,
  658. 'order_count' => $orderCount,
  659. 'total_num' => $totalNum,
  660. 'total_amount' => $totalAmount,
  661. ];
  662. }
  663. /**
  664. * @notes 结束砍价记录
  665. * @param $params
  666. * @return bool
  667. * @author Tab
  668. * @date 2021/9/24 18:17
  669. */
  670. public static function stopInitiate($params)
  671. {
  672. try {
  673. $bargainInitiate = BargainInitiate::findOrEmpty($params['id']);
  674. if ($bargainInitiate->isEmpty()) {
  675. throw new \Exception('砍价记录不存在');
  676. }
  677. $bargainInitiate->status = BargainEnum::STATUS_FAIL;
  678. $bargainInitiate->end_time = time();
  679. $bargainInitiate->save();
  680. return true;
  681. } catch(\Exception $e) {
  682. self::setError($e->getMessage());
  683. return false;
  684. }
  685. }
  686. /**
  687. * @notes 数据中心
  688. * @return array
  689. * @author Tab
  690. * @date 2021/9/24 18:27
  691. */
  692. public static function dataCenter()
  693. {
  694. return [
  695. 'center_data' => self::centerData(),
  696. 'top_visited' => self::topVisited(),
  697. 'top_amount' => self::topAmount(),
  698. ];
  699. }
  700. /**
  701. * @notes 数据概览 - 活动数据
  702. * @author Tab
  703. * @date 2021/9/24 18:28
  704. */
  705. public static function centerData()
  706. {
  707. // 累计活动场次(已结束的)
  708. $activityCount = BargainActivity::where('status', BargainEnum::ACTIVITY_STATUS_END)->count();
  709. // 累计浏览量
  710. $activityVisited = BargainActivity::sum('visited');
  711. // 累计销售额
  712. $totalOrderAmount = Order::where([
  713. 'order_type' => OrderEnum::BARGAIN_ORDER,
  714. 'pay_status' => YesNoEnum::YES
  715. ])->sum('order_amount');
  716. // 累计销量
  717. $totalNum = Order::where([
  718. 'order_type' => OrderEnum::BARGAIN_ORDER,
  719. 'pay_status' => YesNoEnum::YES
  720. ])->sum('total_num');
  721. // 累计成交订单
  722. $orderCount = Order::where([
  723. 'order_type' => OrderEnum::BARGAIN_ORDER,
  724. 'pay_status' => YesNoEnum::YES
  725. ])->count();
  726. // 累计发起砍价次数
  727. $initiateCount = BargainInitiate::count();
  728. // 累计发起砍价成功次数
  729. $initiateSuccessCount = BargainInitiate::where('status', BargainEnum::STATUS_SUCCESS)->count();
  730. return [
  731. 'activity_count' => $activityCount,
  732. 'activity_visited' => $activityVisited,
  733. 'total_order_amount' => $totalOrderAmount,
  734. 'total_num' => $totalNum,
  735. 'order_count' => $orderCount,
  736. 'initiate_count' => $initiateCount,
  737. 'initiate_success_count' => $initiateSuccessCount,
  738. ];
  739. }
  740. /**
  741. * @notes 活动浏览量排行
  742. * @return array
  743. * @throws \think\db\exception\DataNotFoundException
  744. * @throws \think\db\exception\DbException
  745. * @throws \think\db\exception\ModelNotFoundException
  746. * @author Tab
  747. * @date 2021/9/24 18:40
  748. */
  749. public static function topVisited()
  750. {
  751. $lists =BargainActivity::field('name,visited')
  752. ->order([
  753. 'visited' => 'desc',
  754. 'id' => 'desc'
  755. ])
  756. ->limit(10)
  757. ->select()
  758. ->toArray();
  759. return $lists;
  760. }
  761. /**
  762. * @notes 活动销售额排行
  763. * @throws \think\db\exception\DataNotFoundException
  764. * @throws \think\db\exception\DbException
  765. * @throws \think\db\exception\ModelNotFoundException
  766. * @author Tab
  767. * @date 2021/9/24 18:47
  768. */
  769. public static function topAmount()
  770. {
  771. $lists = BargainActivity::field('id,name')->select()->toArray();
  772. foreach ($lists as &$item) {
  773. $item['total_order_amount'] = self::totalOrderAmount($item);
  774. }
  775. $sortArr = array_column($lists, 'total_order_amount');
  776. array_multisort($sortArr, SORT_DESC , SORT_NUMERIC , $lists);
  777. return array_slice($lists, 0, 10);
  778. }
  779. /**
  780. * @notes 活动销售额
  781. * @param $params
  782. * @author Tab
  783. * @date 2021/9/24 18:47
  784. */
  785. public static function totalOrderAmount($params)
  786. {
  787. $orderIds = BargainInitiate::where('activity_id', $params['id'])
  788. ->whereNotNull('order_id')
  789. ->column('order_id');
  790. $totalOrderAmount = Order::where([
  791. ['order_type', '=', OrderEnum::BARGAIN_ORDER],
  792. ['pay_status', '=', YesNoEnum::YES],
  793. ['id', 'in', $orderIds],
  794. ])->sum('order_amount');
  795. return $totalOrderAmount;
  796. }
  797. }