// +---------------------------------------------------------------------- declare (strict_types = 1); namespace app\store\controller; use app\api\controller\groupbuy\Activity; use app\common\library\helper; use app\common\service\Order as OrderService; use app\common\service\order\Refund as RefundService; use app\store\model\groupbuy\GroupBuyActivity as GroupBuyActivityModel; use app\store\model\groupbuy\GroupBuyActivityAction; use app\store\model\groupbuy\GroupBuyGoods; use app\store\model\groupbuy\GroupBuyHelp; use app\store\model\groupbuy\GroupBuyJoin; use think\App; use app\common\service\goods\source\Factory as StockFactory; use app\common\enum\order\OrderSource as OrderSourceEnum; /** * 团购管理 * Class GroupBuyActivity * @package app\store\controller */ class GroupBuyActivity extends Controller { private $actModel; public function __construct(App $app) { parent::__construct($app); $this->actModel = new GroupBuyActivityModel(); } /** * * @return array * @author: zq * @Time: 2022/4/6 16:49 */ public function list(){ $list = $this->actModel->getList($this->request->param()); return $this->renderSuccess(compact('list')); } /** * 添加团购活动 * @return array|string */ public function add() { // 新增记录 $param = $this->postForm(); $param['audit_user'] = $this->store['user']['real_name']?:''; $param['audit_admin_id'] = $this->store['user']['store_user_id']?:''; $param['admin_id'] = $this->store['user']['store_user_id']?:''; $activity_time = between_time_format($param['between_time']); // 生成活动编号 $param['start_time'] = date("Y-m-d H:i:s",$activity_time['start_time']); $param['end_time'] = date("Y-m-d H:i:s",$activity_time['end_time']); if (empty($param['goods']) || !count($param['goods'])){ return $this->renderError('请选择团购商品'); } if (isset($param['role']) && $param['role'] == 1){ $param['audit_time'] = Date("Y-m-d H:i:s",time()); $param['audit_status'] = 1; }else{ $param['audit_status'] = 0; } $arr = array_column($param['goods'],'limit_stock','goods_id'); $goods_id = helper::getArrayColumn($param['goods'],'goods_id'); $goods = \app\store\model\Goods::whereIn('goods_id',$goods_id)->select(); foreach ($goods as $good){ if(isset($arr[$good['goods_id']]) && $arr[$good['goods_id']]<=0){ return $this->renderError('商品 '.$good['goods_name'].' 库存不能设置为0'); } if(isset($arr[$good['goods_id']]) && $good['stock_total']<$arr[$good['goods_id']]){ return $this->renderError('商品 '.$good['goods_name'].' 库存不足'); } } $flag = $this->actModel->addOne($param); if ($flag == 1) { return $this->renderSuccess('添加成功'); } if ($flag == 3){ return $this->renderError('该商品已参加其他拼团活动'); } return $this->renderError($this->actModel->getError() ?: '添加失败'); } /** * 更新团购活动 * @return array|string */ public function update() { // 新增记录 $param = $this->postForm(); $model = GroupBuyActivityModel::detail(intval($param['id'])); $param['audit_user'] = $this->store['user']['real_name']?:''; $param['audit_admin_id'] = $this->store['user']['store_user_id']?:''; $activity_time = between_time_format($param['between_time']); $param['start_time'] = date("Y-m-d H:i:s",$activity_time['start_time']); $param['end_time'] = date("Y-m-d H:i:s",$activity_time['end_time']); if (empty($param['goods']) || !count($param['goods'])){ return $this->renderError('请选择团购商品'); } if (isset($param['role']) && $param['role'] == 1){ $param['audit_time'] = Date("Y-m-d H:i:s",time()); $param['audit_status'] = 1; }else{ $param['audit_status'] = 0; } $arr = array_column($param['goods'],'limit_stock','goods_id'); $goods_id = helper::getArrayColumn($param['goods'],'goods_id'); $goods = \app\store\model\Goods::whereIn('goods_id',$goods_id)->select(); foreach ($goods as $good){ if(isset($arr[$good['goods_id']]) && $arr[$good['goods_id']]<=0){ return $this->renderError('商品 '.$good['goods_name'].' 库存不能设置为0'); } $fullSendGoods = GroupBuyGoods::where(['group_buy_activity_id'=>$param['id'],'goods_id'=>$good['goods_id']])->find(); if(isset($arr[$good['goods_id']]) && $good['stock_total']<($arr[$good['goods_id']]-$fullSendGoods['purchase_stock'])){ return $this->renderError('商品 '.$good['goods_name'].' 库存不足'); } } $flag = $model->updOne($param); if ($flag == 1) { return $this->renderSuccess('修改成功'); }elseif ($flag == 3){ return $this->renderError('该商品已参加其他拼团活动'); } return $this->renderError($model->getError() ?: '修改失败'); } //满赠活动详情 public function detail(int $act_id){ $detail = GroupBuyActivityModel::detail($act_id,['goodsExcept']); $model = new GroupBuyActivityAction(); $detail['history'] = $model->getLists($act_id); $goods_ids = array_column([$detail['goodsExcept']],'goods_id'); $arr = \app\store\model\Goods::whereIn('goods_id',$goods_ids)->column('stock_total','goods_id'); if(isset($arr[$detail['goodsExcept']['goods_id']])){ $detail['goodsExcept']['stock_total'] = $arr[$detail['goodsExcept']['goods_id']]; } return $this->renderSuccess(compact('detail')); } /** * 更新拼团裂变活动 * @return array|string */ public function edit() { // 新增记录 $param = $this->postForm(); $model = GroupBuyActivityModel::detail(intval($param['id'])); $param['audit_user'] = $this->store['user']['real_name']?:''; $param['audit_admin_id'] = $this->store['user']['store_user_id']?:''; $flag = $model->editOne($param); if ($flag == 1) { return $this->renderSuccess('修改成功'); } return $this->renderError($model->getError() ?: '修改失败'); } /** * 团购详情启用/禁用 * @return array|bool */ public function status(){ $postData = $this->postForm(); $model = GroupBuyActivityModel::detail($postData['activity_id']); $res ='操作成功'; $status =$postData['status']; if($status==1){ $res = '已启用'; } if($status==0){ $res = '已禁用'; } $flag = $model->status($postData); if ($flag) { return $this->renderSuccess($postData,$res); } if ($status==1){ return $this->renderError( '与其他活动时间范围重叠,请检查活动时间'); } return $this->renderError($model->getError() ?: '操作失败'); } /** * 审核 * @param * @return array|bool */ public function audit() { // 确认审核 $postData = $this->postForm(); $model = GroupBuyActivityModel::detail(intval($postData['activity_id'])); if(empty($model)){ return $this->renderError('找不到满赠活动'); } $res ='操作成功'; $audit_status =$postData['audit_status']; if($audit_status == 1){ $res = '已审核通过'; $postData['status'] = 1;//启用 } if($audit_status == 2){ $res = '已审核不通过'; $postData['status'] = 1;//启用 } $postData['audit_time'] = Date("Y-m-d H:i:s",time()); $postData['audit_user'] = $this->store['user']['real_name']?:''; $postData['audit_admin_id'] = $this->store['user']['store_user_id']?:''; $flag = $model->audit($postData); if ($flag) { return $this->renderSuccess($postData,$res); } if($audit_status == 1){ return $this->renderError('已有活动处于进行中,请重新修改活动时间'); } return $this->renderError($model->getError() ?: '操作失败'); } /** * 行动日志 * @param int $act_id * @return array */ public function actionsList(int $act_id){ $model = new GroupBuyActivityAction(); $list = $model->getLists($act_id); return $this->renderSuccess(compact('list')); } /** * 拼团统计 * @param int $act_id * @return array */ public function ptStats(int $act_id){ //$m = new GroupBuyJoin(); $helpM = new GroupBuyHelp(); //拼团数 $gc = GroupBuyJoin::countActJoin($act_id); //参团人数 $pc = $helpM->sumActHelpCount($act_id); //活动累计成交额 $sale_volume = $helpM->sumActSaleVolume($act_id); $detail = GroupBuyActivityModel::detail($act_id,['goodsExcept']); return $this->renderSuccess(compact('gc','pc','sale_volume','detail')); } /** * 拼团记录分页 * @param int $act_id * @return array * @throws \think\db\exception\DbException */ public function ptRecord(int $act_id){ $m = new GroupBuyJoin(); $list = $m->getList($act_id); return $this->renderSuccess(compact('list')); } /** * 订单列表 * @param int $join_id * @return array */ public function joinOrders(int $join_id){ $m = new GroupBuyHelp(); $list = $m->getList($join_id); return $this->renderSuccess(compact('list')); } /** * * @param int $join_id * @return array */ public function failedGroup(int $join_id){ $m = new GroupBuyHelp(); $list = $m->getFailedGroupList($join_id); return $this->renderSuccess(compact('list')); } /** * 手动发起退款 * @param int $help_id * @return array * @throws \app\common\exception\BaseException * @throws \think\Exception * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\DbException * @throws \think\db\exception\ModelNotFoundException */ public function refundAct(int $help_id){ $m = new GroupBuyHelp(); $help = $m->find($help_id); if (empty($help)){ return $this->renderError('记录不存在'); } if ($help['finance_refund'] == 1){ return $this->renderError('已经退过款了'); } if ($help['finance_refund'] != 0 || $help['order_id'] != 0 || $help['pay_state'] != 1){ return $this->renderError('不支持退款'); } $help['pay_price'] = $help['pay_money']; $flag1 = false; //退到米卡 if($help->rice_card_id > 0){ $flag = riceCardReturn($help->rice_card_id,$help->rice_card_money,$help->order_no,$help->pay_money); if ($flag == false){ log_record('groupBuyHelpId::'.$help_id.'::退款退到米卡失败','error'); return $this->renderError('系统繁忙,稍后再试'); } } $data['finance_refund'] = 0; $data['finance_time'] = time(); if ($help['pay_money'] > 0){ $refund_number = OrderService::createOrderNoPrefix('TKGB'); //申请单编号 //直接退款逻辑 $RefundService = new RefundService(); $refund_ret = $RefundService->execute($help,$refund_number,$help['pay_money']); $data['refund_number'] = $refund_number; if ($refund_ret['status'] == 200) { $data['refund_transaction_id'] = $refund_ret['data']['transaction_id']; // 微信退款交易号 $flag1 = true; }else{ //退款失败 log_record('groupBuyHelpId::'.$help_id.'::微信退款失败','error'); $data['finance_refund'] = 2; } }else{ $flag1 = true; } if ($flag1 == true){ $data['finance_refund'] = 1 ; $msg = '已尝试退款,请联系用户核对'; }else{ $msg = '退款失败'; return $this->renderError($msg); } try { $m->where('id',$help_id)->update($data); }catch (\Exception $e){ log_record('groupBuyHelpId::'.$help_id.'::更新groupBuyHelp失败::'.$e->getMessage(),'error'); return $this->renderError('系统繁忙,稍后再试'); } //取消订单 回退库存 $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$help['group_buy_activity_id'])->find(); if($groupgoods){ StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->backGoodsSkuStockExpress($groupgoods->goods_id,$groupgoods->goods_sku_id,$help['goods_num']); StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($groupgoods->goods_id,$help['goods_num'],false); } return $this->renderSuccess($msg); } //拼团所有订单列表 public function allList(){ $list = (new GroupBuyHelp)->getAllList($this->request->param()); return $this->renderSuccess(compact('list')); } }