GroupBuyLbActivity.php 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415
  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\common\library\helper;
  14. use app\common\service\Order as OrderService;
  15. use app\common\service\order\Refund as RefundService;
  16. use app\store\model\groupbuylb\GroupBuyLbActivity as GroupBuyLbActivityModel;
  17. use app\store\model\groupbuylb\GroupBuyLbActivityAction as GroupBuyLbActivityActionModel;
  18. use app\store\model\groupbuylb\GroupBuyLbGoods;
  19. use app\store\model\groupbuylb\GroupBuyLbHelp;
  20. use app\store\model\groupbuylb\GroupBuyLbJoin;
  21. use app\store\model\groupbuylb\GroupBuyLbCoupon;
  22. use think\App;
  23. use app\common\service\goods\source\Factory as StockFactory;
  24. use app\common\enum\order\OrderSource as OrderSourceEnum;
  25. use app\store\model\Coupon;
  26. /**
  27. * 拼团裂变管理
  28. * Class GroupBuyLbActivity
  29. * @package app\store\controller
  30. */
  31. class GroupBuyLbActivity extends Controller
  32. {
  33. private $actModel;
  34. public function __construct(App $app)
  35. {
  36. parent::__construct($app);
  37. $this->actModel = new GroupBuyLbActivityModel();
  38. }
  39. /**
  40. *
  41. * @return array
  42. * @author: zq
  43. * @Time: 2022/4/6 16:49
  44. */
  45. public function list(){
  46. $list = $this->actModel->getList($this->request->param());
  47. return $this->renderSuccess(compact('list'));
  48. }
  49. /**
  50. * 添加拼团活动
  51. * @return array|string
  52. */
  53. public function add()
  54. {
  55. // 新增记录
  56. $param = $this->postForm();
  57. $param['audit_user'] = $this->store['user']['real_name']?:'';
  58. $param['audit_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 = GroupBuyLbActivityModel::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 = GroupBuyLbGoods::where(['group_buy_lb_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. * 更新拼团裂变活动
  136. * @return array|string
  137. */
  138. public function edit()
  139. {
  140. // 新增记录
  141. $param = $this->postForm();
  142. $model = GroupBuyLbActivityModel::detail(intval($param['id']));
  143. $param['audit_user'] = $this->store['user']['real_name']?:'';
  144. $param['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  145. $flag = $model->editOne($param);
  146. if ($flag == 1) {
  147. return $this->renderSuccess('修改成功');
  148. }
  149. return $this->renderError($model->getError() ?: '修改失败');
  150. }
  151. //拼团裂变详情
  152. public function detail(int $act_id){
  153. $detail = GroupBuyLbActivityModel::detail($act_id,['goodsExcept','relcoupon']);
  154. $model = new GroupBuyLbActivityActionModel();
  155. $detail['history'] = $model->getLists($act_id);
  156. $detail['coupon'] =[];
  157. if(isset($detail['relcoupon'])){
  158. $coupon_id_arr = array_column($detail['relcoupon']->toArray(), 'coupon_id' ,'coupon_id');
  159. $detail['coupon'] = $this->couponlist($coupon_id_arr);
  160. }
  161. return $this->renderSuccess(compact('detail'));
  162. }
  163. //拼团裂变所有订单列表
  164. public function allList(){
  165. $list = (new GroupBuyLbHelp)->getAllList($this->request->param());
  166. return $this->renderSuccess(compact('list'));
  167. }
  168. /**
  169. *拼团裂变详情启用/禁用
  170. * @return array|bool
  171. */
  172. public function status(){
  173. $postData = $this->postForm();
  174. $model = GroupBuyLbActivityModel::detail($postData['activity_id']);
  175. $res ='操作成功';
  176. $status =$postData['status'];
  177. if($status==1){
  178. $res = '已启用';
  179. }
  180. if($status==0){
  181. $res = '已禁用';
  182. }
  183. $flag = $model->status($postData);
  184. if ($flag) {
  185. return $this->renderSuccess($postData,$res);
  186. }
  187. if ($status==1){
  188. return $this->renderError( '与其他活动时间范围重叠,请检查活动时间');
  189. }
  190. return $this->renderError($model->getError() ?: '操作失败');
  191. }
  192. /**
  193. * 拼团裂变审核
  194. * @param
  195. * @return array|bool
  196. */
  197. public function audit()
  198. {
  199. // 确认审核
  200. $postData = $this->postForm();
  201. $model = GroupBuyLbActivityModel::detail(intval($postData['activity_id']));
  202. if(empty($model)){
  203. return $this->renderError('找不到拼团裂变活动');
  204. }
  205. $res ='操作成功';
  206. $audit_status =$postData['audit_status'];
  207. if($audit_status == 1){
  208. $res = '已审核通过';
  209. $postData['status'] = 1;//启用
  210. $path = "/pages/activity/pages/groupShopping/groupGoodsDetail/groupGoodsDetail?activity_id=".$model['id']."&isfission=1&share=xcx";
  211. $postData['wx_qrcode'] = request()->domain()."/api/mp_wx/qrcode?path=".urlencode($path);
  212. }
  213. if($audit_status == 2){
  214. $res = '已审核不通过';
  215. $postData['status'] = 1;//启用
  216. }
  217. $postData['audit_time'] = Date("Y-m-d H:i:s",time());
  218. $postData['audit_user'] = $this->store['user']['real_name']?:'';
  219. $postData['audit_admin_id'] = $this->store['user']['store_user_id']?:'';
  220. $flag = $model->audit($postData);
  221. if ($flag) {
  222. return $this->renderSuccess($postData,$res);
  223. }
  224. if($audit_status == 1){
  225. return $this->renderError( '已有拼团裂变活动处于进行中,请重新修改活动时间');
  226. }
  227. return $this->renderError($model->getError() ?: '操作失败');
  228. }
  229. /**
  230. * 行动日志
  231. * @param int $act_id
  232. * @return array
  233. */
  234. public function actionsList(int $act_id){
  235. $model = new GroupBuyLbActivityAction();
  236. $list = $model->getLists($act_id);
  237. return $this->renderSuccess(compact('list'));
  238. }
  239. /**
  240. * 拼团裂变统计
  241. * @param int $act_id
  242. * @return array
  243. */
  244. public function ptStats(int $act_id){
  245. $helpM = new GroupBuyLbHelp();
  246. //拼团数
  247. $gc = GroupBuyLbJoin::countActJoin($act_id);
  248. //参团人数
  249. $pc = $helpM->sumActHelpCount($act_id);
  250. //活动累计成交额
  251. $sale_volume = $helpM->sumActSaleVolume($act_id);
  252. $detail = GroupBuyLbActivityModel::detail($act_id,['goodsExcept','relcoupon']);
  253. $action = new GroupBuyLbActivityActionModel();
  254. $detail['history'] = $action->getLists($act_id);
  255. $detail['coupon'] =[];
  256. if(isset($detail['relcoupon'])){
  257. $coupon_id_arr = array_column($detail['relcoupon']->toArray(), 'coupon_id' ,'coupon_id');
  258. $detail['coupon'] = $this->couponlist($coupon_id_arr);
  259. }
  260. return $this->renderSuccess(compact('gc','pc','sale_volume','detail'));
  261. }
  262. /**
  263. * 拼团记录分页
  264. * @param int $act_id
  265. * @return array
  266. * @throws \think\db\exception\DbException
  267. */
  268. public function ptRecord(int $act_id){
  269. $m = new GroupBuyLbJoin();
  270. $list = $m->getList($act_id);
  271. return $this->renderSuccess(compact('list'));
  272. }
  273. /**
  274. * 订单列表
  275. * @param int $join_id
  276. * @return array
  277. */
  278. public function joinOrders(int $join_id){
  279. $m = new GroupBuyLbHelp();
  280. $list = $m->getList($join_id);
  281. return $this->renderSuccess(compact('list'));
  282. }
  283. /**
  284. *
  285. * @param int $join_id
  286. * @return array
  287. */
  288. public function failedGroup(int $join_id){
  289. $m = new GroupBuyLbHelp();
  290. $list = $m->getFailedGroupList($join_id);
  291. return $this->renderSuccess(compact('list'));
  292. }
  293. /**
  294. * 手动发起退款
  295. * @param int $help_id
  296. * @return array
  297. * @throws \app\common\exception\BaseException
  298. * @throws \think\Exception
  299. * @throws \think\db\exception\DataNotFoundException
  300. * @throws \think\db\exception\DbException
  301. * @throws \think\db\exception\ModelNotFoundException
  302. */
  303. public function refundAct(int $help_id){
  304. $m = new GroupBuyLbHelp();
  305. $help = $m->find($help_id);
  306. if (empty($help)){
  307. return $this->renderError('记录不存在');
  308. }
  309. if ($help['finance_refund'] == 1){
  310. return $this->renderError('已经退过款了');
  311. }
  312. if ($help['finance_refund'] != 0 || $help['order_id'] != 0 || $help['pay_state'] != 1){
  313. return $this->renderError('不支持退款');
  314. }
  315. $help['pay_price'] = $help['pay_money'];
  316. $flag1 = false;
  317. //退到米卡
  318. if($help->rice_card_id > 0){
  319. $flag = riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money);
  320. if ($flag == false){
  321. log_record('groupBuyHelpLbId::'.$help_id.'::退款退到米卡失败','error');
  322. return $this->renderError('系统繁忙,稍后再试');
  323. }
  324. }
  325. $data['finance_refund'] = 0;
  326. $data['finance_time'] = time();
  327. if ($help['pay_money'] > 0){
  328. $refund_number = OrderService::createOrderNoPrefix('TKGB'); //申请单编号
  329. //直接退款逻辑
  330. $RefundService = new RefundService();
  331. $refund_ret = $RefundService->execute($help,$refund_number,$help['pay_money']);
  332. $data['refund_number'] = $refund_number;
  333. if ($refund_ret['status'] == 200) {
  334. $data['refund_transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号
  335. $flag1 = true;
  336. }else{
  337. //退款失败
  338. log_record('groupBuyLbHelpLbId::'.$help_id.'::微信退款失败','error');
  339. $data['finance_refund'] = 2;
  340. }
  341. }else{
  342. $flag1 = true;
  343. }
  344. if ($flag1 == true){
  345. $data['finance_refund'] = 1 ;
  346. $msg = '已尝试退款,请联系用户核对';
  347. }else{
  348. $msg = '退款失败';
  349. return $this->renderError($msg);
  350. }
  351. try {
  352. $m->where('id',$help_id)->update($data);
  353. }catch (\Exception $e){
  354. log_record('groupBuyLbHelpId::'.$help_id.'::更新groupBuyLbHelp失败::'.$e->getMessage(),'error');
  355. return $this->renderError('系统繁忙,稍后再试');
  356. }
  357. //取消订单 回退库存
  358. $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$help['group_buy_lb_activity_id'])->find();
  359. if($groupgoods){
  360. StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help['goods_num']);
  361. StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->updateStockSalesExpress($groupgoods->goods_id,$help['goods_num'],false);
  362. }
  363. return $this->renderSuccess($msg);
  364. }
  365. //优惠券
  366. public function couponlist($coupon_id_arr = []){
  367. $p[] = ['coupon_id','in',$coupon_id_arr];
  368. return (new Coupon())->getCouponGroupBuyLblist($p);
  369. }
  370. }