GroupBuyActivity.php 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. <?php
  2. // +----------------------------------------------------------------------
  3. // | 萤火商城系统 [ 致力于通过产品和服务,帮助商家高效化开拓市场 ]
  4. // +----------------------------------------------------------------------
  5. // | Copyright (c) 2017~2021 https://www.yiovo.com All rights reserved.
  6. // +----------------------------------------------------------------------
  7. // | Licensed 这不是一个自由软件,不允许对程序代码以任何形式任何目的的再发行
  8. // +----------------------------------------------------------------------
  9. // | Author: 萤火科技 <admin@yiovo.com>
  10. // +----------------------------------------------------------------------
  11. declare (strict_types = 1);
  12. namespace app\store\controller;
  13. use app\api\controller\groupbuy\Activity;
  14. use app\common\library\helper;
  15. use app\common\service\Order as OrderService;
  16. use app\common\service\order\Refund as RefundService;
  17. use app\store\model\groupbuy\GroupBuyActivity as GroupBuyActivityModel;
  18. use app\store\model\groupbuy\GroupBuyActivityAction;
  19. use app\store\model\groupbuy\GroupBuyGoods;
  20. use app\store\model\groupbuy\GroupBuyHelp;
  21. use app\store\model\groupbuy\GroupBuyJoin;
  22. use think\App;
  23. use app\common\service\goods\source\Factory as StockFactory;
  24. use app\common\enum\order\OrderSource as OrderSourceEnum;
  25. /**
  26. * 团购管理
  27. * Class GroupBuyActivity
  28. * @package app\store\controller
  29. */
  30. class GroupBuyActivity extends Controller
  31. {
  32. private $actModel;
  33. public function __construct(App $app)
  34. {
  35. parent::__construct($app);
  36. $this->actModel = new GroupBuyActivityModel();
  37. }
  38. /**
  39. *
  40. * @return array
  41. * @author: zq
  42. * @Time: 2022/4/6 16:49
  43. */
  44. public function list(){
  45. $list = $this->actModel->getList($this->request->param());
  46. return $this->renderSuccess(compact('list'));
  47. }
  48. /**
  49. * 添加团购活动
  50. * @return array|string
  51. */
  52. public function add()
  53. {
  54. // 新增记录
  55. $param = $this->postForm();
  56. $param['audit_user'] = $this->store['user']['real_name']?:'';
  57. $param['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  58. $param['admin_id'] = $this->store['user']['store_user_id']?:'';
  59. $activity_time = between_time_format($param['between_time']); // 生成活动编号
  60. $param['start_time'] = date("Y-m-d H:i:s",$activity_time['start_time']);
  61. $param['end_time'] = date("Y-m-d H:i:s",$activity_time['end_time']);
  62. if (empty($param['goods']) || !count($param['goods'])){
  63. return $this->renderError('请选择团购商品');
  64. }
  65. if (isset($param['role']) && $param['role'] == 1){
  66. $param['audit_time'] = Date("Y-m-d H:i:s",time());
  67. $param['audit_status'] = 1;
  68. }else{
  69. $param['audit_status'] = 0;
  70. }
  71. $arr = array_column($param['goods'],'limit_stock','goods_id');
  72. $goods_id = helper::getArrayColumn($param['goods'],'goods_id');
  73. $goods = \app\store\model\Goods::whereIn('goods_id',$goods_id)->select();
  74. foreach ($goods as $good){
  75. if(isset($arr[$good['goods_id']]) && $arr[$good['goods_id']]<=0){
  76. return $this->renderError('商品 '.$good['goods_name'].' 库存不能设置为0');
  77. }
  78. if(isset($arr[$good['goods_id']]) && $good['stock_total']<$arr[$good['goods_id']]){
  79. return $this->renderError('商品 '.$good['goods_name'].' 库存不足');
  80. }
  81. }
  82. $flag = $this->actModel->addOne($param);
  83. if ($flag == 1) {
  84. return $this->renderSuccess('添加成功');
  85. }
  86. if ($flag == 3){
  87. return $this->renderError('该商品已参加其他拼团活动');
  88. }
  89. return $this->renderError($this->actModel->getError() ?: '添加失败');
  90. }
  91. /**
  92. * 更新团购活动
  93. * @return array|string
  94. */
  95. public function update()
  96. {
  97. // 新增记录
  98. $param = $this->postForm();
  99. $model = GroupBuyActivityModel::detail(intval($param['id']));
  100. $param['audit_user'] = $this->store['user']['real_name']?:'';
  101. $param['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  102. $activity_time = between_time_format($param['between_time']);
  103. $param['start_time'] = date("Y-m-d H:i:s",$activity_time['start_time']);
  104. $param['end_time'] = date("Y-m-d H:i:s",$activity_time['end_time']);
  105. if (empty($param['goods']) || !count($param['goods'])){
  106. return $this->renderError('请选择团购商品');
  107. }
  108. if (isset($param['role']) && $param['role'] == 1){
  109. $param['audit_time'] = Date("Y-m-d H:i:s",time());
  110. $param['audit_status'] = 1;
  111. }else{
  112. $param['audit_status'] = 0;
  113. }
  114. $arr = array_column($param['goods'],'limit_stock','goods_id');
  115. $goods_id = helper::getArrayColumn($param['goods'],'goods_id');
  116. $goods = \app\store\model\Goods::whereIn('goods_id',$goods_id)->select();
  117. foreach ($goods as $good){
  118. if(isset($arr[$good['goods_id']]) && $arr[$good['goods_id']]<=0){
  119. return $this->renderError('商品 '.$good['goods_name'].' 库存不能设置为0');
  120. }
  121. $fullSendGoods = GroupBuyGoods::where(['group_buy_activity_id'=>$param['id'],'goods_id'=>$good['goods_id']])->find();
  122. if(isset($arr[$good['goods_id']]) && $good['stock_total']<($arr[$good['goods_id']]-$fullSendGoods['purchase_stock'])){
  123. return $this->renderError('商品 '.$good['goods_name'].' 库存不足');
  124. }
  125. }
  126. $flag = $model->updOne($param);
  127. if ($flag == 1) {
  128. return $this->renderSuccess('修改成功');
  129. }elseif ($flag == 3){
  130. return $this->renderError('该商品已参加其他拼团活动');
  131. }
  132. return $this->renderError($model->getError() ?: '修改失败');
  133. }
  134. //满赠活动详情
  135. public function detail(int $act_id){
  136. $detail = GroupBuyActivityModel::detail($act_id,['goodsExcept']);
  137. $model = new GroupBuyActivityAction();
  138. $detail['history'] = $model->getLists($act_id);
  139. $goods_ids = array_column([$detail['goodsExcept']],'goods_id');
  140. $arr = \app\store\model\Goods::whereIn('goods_id',$goods_ids)->column('stock_total','goods_id');
  141. if(isset($arr[$detail['goodsExcept']['goods_id']])){
  142. $detail['goodsExcept']['stock_total'] = $arr[$detail['goodsExcept']['goods_id']];
  143. }
  144. return $this->renderSuccess(compact('detail'));
  145. }
  146. /**
  147. * 更新拼团裂变活动
  148. * @return array|string
  149. */
  150. public function edit()
  151. {
  152. // 新增记录
  153. $param = $this->postForm();
  154. $model = GroupBuyActivityModel::detail(intval($param['id']));
  155. $param['audit_user'] = $this->store['user']['real_name']?:'';
  156. $param['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  157. $flag = $model->editOne($param);
  158. if ($flag == 1) {
  159. return $this->renderSuccess('修改成功');
  160. }
  161. return $this->renderError($model->getError() ?: '修改失败');
  162. }
  163. /**
  164. * 团购详情启用/禁用
  165. * @return array|bool
  166. */
  167. public function status(){
  168. $postData = $this->postForm();
  169. $model = GroupBuyActivityModel::detail($postData['activity_id']);
  170. $res ='操作成功';
  171. $status =$postData['status'];
  172. if($status==1){
  173. $res = '已启用';
  174. }
  175. if($status==0){
  176. $res = '已禁用';
  177. }
  178. $flag = $model->status($postData);
  179. if ($flag) {
  180. return $this->renderSuccess($postData,$res);
  181. }
  182. if ($status==1){
  183. return $this->renderError( '与其他活动时间范围重叠,请检查活动时间');
  184. }
  185. return $this->renderError($model->getError() ?: '操作失败');
  186. }
  187. /**
  188. * 审核
  189. * @param
  190. * @return array|bool
  191. */
  192. public function audit()
  193. {
  194. // 确认审核
  195. $postData = $this->postForm();
  196. $model = GroupBuyActivityModel::detail(intval($postData['activity_id']));
  197. if(empty($model)){
  198. return $this->renderError('找不到满赠活动');
  199. }
  200. $res ='操作成功';
  201. $audit_status =$postData['audit_status'];
  202. if($audit_status == 1){
  203. $res = '已审核通过';
  204. $postData['status'] = 1;//启用
  205. }
  206. if($audit_status == 2){
  207. $res = '已审核不通过';
  208. $postData['status'] = 1;//启用
  209. }
  210. $postData['audit_time'] = Date("Y-m-d H:i:s",time());
  211. $postData['audit_user'] = $this->store['user']['real_name']?:'';
  212. $postData['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  213. $flag = $model->audit($postData);
  214. if ($flag) {
  215. return $this->renderSuccess($postData,$res);
  216. }
  217. if($audit_status == 1){
  218. return $this->renderError('已有活动处于进行中,请重新修改活动时间');
  219. }
  220. return $this->renderError($model->getError() ?: '操作失败');
  221. }
  222. /**
  223. * 行动日志
  224. * @param int $act_id
  225. * @return array
  226. */
  227. public function actionsList(int $act_id){
  228. $model = new GroupBuyActivityAction();
  229. $list = $model->getLists($act_id);
  230. return $this->renderSuccess(compact('list'));
  231. }
  232. /**
  233. * 拼团统计
  234. * @param int $act_id
  235. * @return array
  236. */
  237. public function ptStats(int $act_id){
  238. //$m = new GroupBuyJoin();
  239. $helpM = new GroupBuyHelp();
  240. //拼团数
  241. $gc = GroupBuyJoin::countActJoin($act_id);
  242. //参团人数
  243. $pc = $helpM->sumActHelpCount($act_id);
  244. //活动累计成交额
  245. $sale_volume = $helpM->sumActSaleVolume($act_id);
  246. $detail = GroupBuyActivityModel::detail($act_id,['goodsExcept']);
  247. return $this->renderSuccess(compact('gc','pc','sale_volume','detail'));
  248. }
  249. /**
  250. * 拼团记录分页
  251. * @param int $act_id
  252. * @return array
  253. * @throws \think\db\exception\DbException
  254. */
  255. public function ptRecord(int $act_id){
  256. $m = new GroupBuyJoin();
  257. $list = $m->getList($act_id);
  258. return $this->renderSuccess(compact('list'));
  259. }
  260. /**
  261. * 订单列表
  262. * @param int $join_id
  263. * @return array
  264. */
  265. public function joinOrders(int $join_id){
  266. $m = new GroupBuyHelp();
  267. $list = $m->getList($join_id);
  268. return $this->renderSuccess(compact('list'));
  269. }
  270. /**
  271. *
  272. * @param int $join_id
  273. * @return array
  274. */
  275. public function failedGroup(int $join_id){
  276. $m = new GroupBuyHelp();
  277. $list = $m->getFailedGroupList($join_id);
  278. return $this->renderSuccess(compact('list'));
  279. }
  280. /**
  281. * 手动发起退款
  282. * @param int $help_id
  283. * @return array
  284. * @throws \app\common\exception\BaseException
  285. * @throws \think\Exception
  286. * @throws \think\db\exception\DataNotFoundException
  287. * @throws \think\db\exception\DbException
  288. * @throws \think\db\exception\ModelNotFoundException
  289. */
  290. public function refundAct(int $help_id){
  291. $m = new GroupBuyHelp();
  292. $help = $m->find($help_id);
  293. if (empty($help)){
  294. return $this->renderError('记录不存在');
  295. }
  296. if ($help['finance_refund'] == 1){
  297. return $this->renderError('已经退过款了');
  298. }
  299. if ($help['finance_refund'] != 0 || $help['order_id'] != 0 || $help['pay_state'] != 1){
  300. return $this->renderError('不支持退款');
  301. }
  302. $help['pay_price'] = $help['pay_money'];
  303. $flag1 = false;
  304. //退到米卡
  305. if($help->rice_card_id > 0){
  306. $flag = riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money);
  307. if ($flag == false){
  308. log_record('groupBuyHelpId::'.$help_id.'::退款退到米卡失败','error');
  309. return $this->renderError('系统繁忙,稍后再试');
  310. }
  311. }
  312. $data['finance_refund'] = 0;
  313. $data['finance_time'] = time();
  314. if ($help['pay_money'] > 0){
  315. $refund_number = OrderService::createOrderNoPrefix('TKGB'); //申请单编号
  316. //直接退款逻辑
  317. $RefundService = new RefundService();
  318. $refund_ret = $RefundService->execute($help,$refund_number,$help['pay_money']);
  319. $data['refund_number'] = $refund_number;
  320. if ($refund_ret['status'] == 200) {
  321. $data['refund_transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号
  322. $flag1 = true;
  323. }else{
  324. //退款失败
  325. log_record('groupBuyHelpId::'.$help_id.'::微信退款失败','error');
  326. $data['finance_refund'] = 2;
  327. }
  328. }else{
  329. $flag1 = true;
  330. }
  331. if ($flag1 == true){
  332. $data['finance_refund'] = 1 ;
  333. $msg = '已尝试退款,请联系用户核对';
  334. }else{
  335. $msg = '退款失败';
  336. return $this->renderError($msg);
  337. }
  338. try {
  339. $m->where('id',$help_id)->update($data);
  340. }catch (\Exception $e){
  341. log_record('groupBuyHelpId::'.$help_id.'::更新groupBuyHelp失败::'.$e->getMessage(),'error');
  342. return $this->renderError('系统繁忙,稍后再试');
  343. }
  344. //取消订单 回退库存
  345. $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$help['group_buy_activity_id'])->find();
  346. if($groupgoods){
  347. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help['goods_num']);
  348. StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($groupgoods->goods_id,$help['goods_num'],false);
  349. }
  350. return $this->renderSuccess($msg);
  351. }
  352. //拼团所有订单列表
  353. public function allList(){
  354. $list = (new GroupBuyHelp)->getAllList($this->request->param());
  355. return $this->renderSuccess(compact('list'));
  356. }
  357. }