['app', 'mini', 'h5', 'official']], [['pay_type'], 'in', 'range' => [1, 2, 3, 4, 5, Order::PAY_TYPE_YUNST_WECHAT_PAY]], // 'WECHAT_PAY', 'HUODAO_PAY', 'BALANCE_PAY' 'ALIPAY', [['form_id', 'order_id_list', '_from'], 'string'], ['is_combine', 'default', 'value' => 0], [['parent_user_id', 'condition', 'order_id', 'is_combine'], 'integer'], ]; } public function search() { //$this->wechatPay = \Yii::$app->controller->wechatPay; if (!$this->validate()) { return [ 'code' => 1, 'msg' => $this->getErrorSummary(false)[0], ]; } $t = \Yii::$app->db->beginTransaction(); if ($this->order_id) { //单个订单付款 //检测活动是否存在 $this->order = PtActivityOrder::findOne([ 'id' => $this->order_id, ]); $pt_activity = PtActivityOrderDetail::find()->alias('pod')->where(['pod.order_id' => $this->order_id]) ->leftJoin(['pa' => PtActivity::tableName()], 'pod.activity_id = pa.id') ->select('pa.start_time, pa.end_time, pa.id, pa.party_size, pa.party_type, pa.party_goods_count, pa.split_time, pa.join_num, pod.goods_id')->asArray()->one(); if (empty($pt_activity)) { return [ 'code' => 1, 'msg' => "拼团活动不存在", ]; } $join_num = $pt_activity['join_num']; $s_today_time = strtotime(date('Y-m-d')); $e_today_time = (strtotime(date('Y-m-d')) + 3600 * 24); $join_count = PtActivityOrderDetail::find()->alias('od') ->leftJoin(['o' => PtActivityOrder::tableName()], 'od.order_id = o.id') ->where(['od.goods_id' => $pt_activity['goods_id'], 'o.user_id' => get_user_id(), 'is_pay' => 1]) ->andWhere(['AND', ['>', 'od.created_at', $s_today_time], ['<', 'od.created_at', $e_today_time]])->select('od.id')->count(); if($pt_activity->party_type == 0){ if ($join_num > 0 && $join_count >= $join_num) { return [ 'code' => 1, 'msg' => "今日参加此商品的拼团次数已达上限" ]; } } if ($pt_activity['end_time'] < time() || $pt_activity['start_time'] > time()) { return [ 'code' => 1, 'msg' => "当前时间不在拼团活动时间范围内", ]; } //判断是否开奖 $saas_user = get_saas_user(); $user = User::findOne(['binding' => $saas_user->mobile, 'store_id' => $this->order->store_id, 'is_delete' => 0]); $user_id = 0; if ($user) { \Yii::$app->jwt->setUser($user); $user_id = $user->id; } if (!empty($this->order->pt_number)) { $pt_order = PtActivityOrder::findOne(['id' => $this->order->pt_number]); if ($pt_order) { if ((int)$pt_order->is_pay === 0) { return [ 'code' => 1, 'msg' => "当前团暂未开放" ]; } //error $check_pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1]) ->andWhere(['OR', ['id' => $this->order->pt_number], ['pt_number' => $this->order->pt_number]]) ->select('id, is_winner')->asArray()->all(); //判断是否到解散时间 $end_time = (($pt_activity['split_time'] * 60 * 60) + ($pt_order->pay_time)); if ($end_time <= time()) { return [ 'code' => 1, 'msg' => "当前团已解散" ]; } $open = false; foreach ($check_pt_order as $item) { if ((int)$item['is_winner'] > 0) { $open = true; } if ((int)$item['user_id'] === $user_id) { return [ 'code' => 1, 'msg' => "已加入,不可重复操作" ]; } } if ($open) { return [ 'code' => 1, 'msg' => "当前团已开奖" ]; } if($pt_activity['party_type'] == 0){ if ($pt_activity['party_size'] <= count($check_pt_order)) { return [ 'code' => 1, 'msg' => "当前团人数已达上限" ]; } } if($pt_activity['party_type'] == 1){ $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod') ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id') ->where(['po.is_pay' => 1, 'pod.is_delete' => 0]) ->andWhere(['OR' , ['po.id' => $this->order->pt_number], ['po.pt_number' => $this->order->pt_number]]); $goodsCount = $goodsCountQuery->sum('pod.num'); if($pt_activity['party_goods_count'] <= (int)$goodsCount){ return [ 'code' => 1, 'msg' => "当前团商品数量已达上限" ]; } } } } else { if ($this->order->head_integral > 0) { if ($this->order->head_integral > $user->integral) { return [ 'code' => 1, 'msg' => '开团积分不足' ]; } } } // 供应链系统下单时是否使用平台商户号,1使用,0未使用 if (!Store::hasIncoming($this->order->store_id)) { $this->order->is_use_platform_mch = 1; $this->order->save(); } //0元订单开始 if ($this->order->pay_price == 0) { // 这里要判断订单之前是不是货到付款的订单 如果是货到付款的订单 $this->order->pay_time = time(); $this->order->is_pay = 1; $this->order->pay_type = 3; $this->order->trade_status = Order::ORDER_FLOW_NO_SEND; $this->order->save(); $t->commit(); //TODO 拼团成功后需要走注释部分 // 支付完成后,相关操作 // (new NotifyForm())->videoGoodsShare($this->order); // $form = new OrderComplete(); // $form->order_id = $this->order->id; // $form->order_type = 0; // $form->store_id = get_store_id(); // $form->notify(); $pt_number = $this->order->pt_number ?: $this->order->id; //判断是团长开团 $is_first_order = false; if ($pt_number === $this->order->id) { $is_first_order = true; } $this->order->pt_number && $this->order = PtActivityOrder::findOne($this->order->pt_number); $order_detail = PtActivityOrderDetail::find()->where(['order_id' => $pt_number])->select('goods_id, activity_id')->asArray()->one(); if (!empty($this->order) && !empty($order_detail)) { $pt_activity_goods = PtActivityGoods::findOne([ 'activity_id' => $order_detail['activity_id'], 'goods_id' => $order_detail['goods_id'], 'is_delete' => 0 ]); if ($pt_activity_goods) { $pt_activity = PtActivity::findOne(['id' => $pt_activity_goods->activity_id, 'is_delete' => 0]); if ($pt_activity) { $pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1]) ->andWhere(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])->select('id')->column(); if($pt_activity->party_type == 0){ if ($pt_activity->party_size <= count($pt_order)) { queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $this->order->id)])); } } if($pt_activity->party_type == 1){ $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod') ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id') ->where(['po.is_pay' => 1, 'pod.is_delete' => 0]) ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]); $goodsCount = $goodsCountQuery->sum('pod.num'); if($pt_activity->party_goods_count <= (int)$goodsCount){ queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $this->order->id)])); } } //判断是团长开团 if ($is_first_order) { $delay = $pt_activity->split_time * 60 * 60; queue_push(new CancelPtOrderJob(['order_id' => $this->order->id, 'store_id' => $this->order->store_id]), $delay); } } } } return [ 'code' => 0, 'msg' => '支付成功' ]; } if (!$this->order) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单不存在', ]; } if ($this->order->is_delete == 1 || $this->order->trade_status == Order::ORDER_FLOW_CANCEL) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单已取消', ]; } if ($this->order->is_pay == 1 || ($this->order->trade_status > -1 && $this->order->pay_type != 2)) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单状态异常', ]; } // try { // $this->checkGoodsConfine($this->order); // } catch (\Exception $e) { // $t->rollBack(); // return [ // 'code' => 1, // 'msg' => $e->getMessage() // ]; // } // 存储parent_id // if ($this->user && $this->user->parent_user_id) { // CommonOrder::saveParentId($this->user->parent_user_id); // } $goods_names = ''; $goods_list = PtActivityOrderDetail::find()->alias('od')->leftJoin(['g' => Goods::tableName()], 'g.id=od.goods_id')->where(['od.order_id' => $this->order->id, 'od.is_delete' => 0, ])->select('g.name')->asArray()->all(); foreach ($goods_list as $goods) { $goods_names .= $goods['name'] . ';'; } $goods_names = mb_substr($goods_names, 0, 32, 'utf-8'); //TODO 拼团成功后需要走注释部分 // $this->setReturnData($this->order); if (!$this->order->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '订单保存失败' ]; } // 余额抵扣支付 $balance_price = 0; $this->order->combine_money = 0; $this->order->is_combine_pay = Order::NOT_COMBINE_PAY; $this->order->save(); if ($this->pay_type == 1 || $this->pay_type == 4 || $this->pay_type == 5 || $this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) { if ($this->order->pay_price == 0) { $this->order->is_pay = 1; $this->order->pay_type = 1; if ($this->pay_type == 4) { $this->order->pay_type = 4; } $this->order->pay_time = time(); if (!$this->order->save()) { $t->rollBack(); return [ 'code' => 1, 'msg' => '支付失败' ]; } // 支付完成后,相关操作 // (new NotifyForm())->videoGoodsShare($this->order); // $form = new OrderComplete(); // $form->order_id = $this->order->id; // $form->order_type = 0; // $form->store_id = get_store_id(); // $form->notify(); // $this->setReturnData($this->order); $pt_number = $this->order->pt_number ?: $this->order->id; debug_log('拼团处理:'. 11111,'ptOrderLog.log'); $this->order->pt_number && $order = PtActivityOrder::findOne($this->order->pt_number); $order_detail = PtActivityOrderDetail::find()->where(['order_id' => $pt_number])->select('goods_id, activity_id')->asArray()->one(); if (!empty($order) && !empty($order_detail)) { $pt_activity_goods = PtActivityGoods::findOne([ 'activity_id' => $order_detail['activity_id'], 'goods_id' => $order_detail['goods_id'], 'is_delete' => 0 ]); if ($pt_activity_goods) { $pt_activity = PtActivity::findOne(['id' => $pt_activity_goods->activity_id, 'is_delete' => 0]); if ($pt_activity) { $pt_order = PtActivityOrder::find()->where(['trade_status' => 0, 'is_pay' => 1]) ->andWhere(['OR', ['id' => $pt_number], ['pt_number' => $pt_number]])->select('id')->column(); if($pt_activity->party_type == 0){ if ($pt_activity->party_size <= count($pt_order)) { queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $order->id)])); } } if($pt_activity->party_type == 1){ $goodsCountQuery = PtActivityOrderDetail::find()->alias('pod') ->leftJoin(['po' => PtActivityOrder::tableName()], 'pod.order_id = po.id') ->where(['po.is_pay' => 1, 'pod.is_delete' => 0]) ->andWhere(['OR' , ['po.id' => $pt_number], ['po.pt_number' => $pt_number]]); $goodsCount = $goodsCountQuery->sum('pod.num'); if($pt_activity->party_goods_count <= (int)$goodsCount){ queue_push(new CreatedPtOrderJob(['order_id' => ($pt_number ?: $order->id)])); } } } } } $t->commit(); return [ 'code' => 0, 'msg' => '0元支付' ]; } if ($this->pay_type == 1) { // \Yii::error($this->_from); if ($this->_from == self::PAY_FROM_APP) { if (!Store::hasIncoming($this->order->store_id)) { $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_PT, $goods_names, 0, true, $balance_price); } else { $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, true, $balance_price); } } else if ($this->_from == self::PAY_FROM_H5) { if (!Store::hasIncoming($this->order->store_id)) { $result = WechatPay::orderUnify($this->order, OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, true); } else { $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, true); } } else if ($this->_from == self::PAY_FROM_OFFICIAL) { if (!Store::hasIncoming($this->order->store_id)) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, false, true); } else { $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price, false, true); } } else { if (!Store::hasIncoming($this->order->store_id)) { $result = WechatPay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price); } else { $result = WechatAlliancePay::orderUnify($this->order,OrderNo::ORDER_PT, $goods_names, 0, false, $balance_price); } } if (isset($result['code']) && $result['code'] == 1) { if ($this->_from == self::PAY_FROM_OFFICIAL) { $result['wechat_platform_open_id'] = get_user()->wechat_platform_open_id; $result['h5_auth_link'] = LoginForm::getAuthLink(); } return $result; } CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); $t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => (object)$result['data'], 'res' => $result['res'], 'body' => $goods_names ]; } if ($this->pay_type == Order::PAY_TYPE_YUNST_WECHAT_PAY) { // if (!Store::hasIncoming($this->order->store_id, 'yunst')) { // return [ // 'code' => 1, // 'msg' => '商家未配置通联支付' // ]; // } //是非独立部署 进件流程//通联支付 start $store = Store::findOne(['id' => $this->order->store_id]); $OrderYunst = new OrderYunst(); $result2 = $OrderYunst->payYunst($this->order->store_id, $this->order->order_no, $store->cusid, $this->order->pay_price * 100); if ($result2['subCode'] == 'SUCCESS') { $payInfo = json_decode($result2['data']['payinfo'], true); if (!empty($payInfo)) { if (is_array($payInfo)) { return [ 'code' => 0, 'data' => $payInfo, 'msg' => 'success', 'res' => $payInfo ]; } return [ 'code' => 1, 'msg' => $result2['data']['errmsg'] ]; } return [ 'code' => 1, 'msg' => $result2['subMsg'] ]; } return $result2; //通联支付 end } if ($this->pay_type == 4) { $user = ($this->user ?: get_saas_user()); if ($this->_from == self::PAY_FROM_MINI) { //TODO 兼容 //AlipayUnion if (is_profit_pay('ali')) { $result = AlipayUnion::mini($this->order, $goods_names, $user, '', '', false, 0, $balance_price); } else { $result = Alipay::mini($this->order, $goods_names, $user, '', '', 0, $balance_price); } if (isset($result['code']) && $result['code'] == 1) { return $result; } //$t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data']['trade_no'], 'body' => $goods_names ]; } else { if (is_profit_pay('ali')) { $result = AlipayProfit::app($this->order, $goods_names, $this->user, $balance_price); } else { $result = Alipay::app($this->order, $goods_names, $this->user, $balance_price); } if (isset($result['code']) && $result['code'] == 1) { //$t->commit(); return $result; } //$t->commit(); return [ 'code' => 0, 'msg' => 'success', 'data' => $result['data'], 'body' => $goods_names ]; } } // // 抖音小程序 // if ($this->pay_type == 5) { // $result = ByteDance::pay($this->order, '', $goods_names, 0 , $balance_price); // if (isset($result['code']) && $result['code'] == 1) { // return $result; // } // //$t->commit(); // return [ // 'code' => 0, // 'msg' => 'success', // 'data' => $result['data'], // ]; // } } // //货到付款和余额支付数据处理 // if ($this->pay_type == 2 || $this->pay_type == 3) { // $order = $this->order; // // 中间页选择货到付款,需要存入支付类型 // if ($this->pay_type == 2) { // $order->is_pay = 0; // $order->pay_type = 2; // $order->save(); // } // // //余额支付 用户余额变动 // // if ($this->pay_type == 3) { // // $user = User::findOne(['id' => $order->user_id]); // // if ($user->money < $order->pay_price) { // // $t->rollBack(); // // return [ // // 'code' => 1, // // 'msg' => '支付失败,余额不足', // // ]; // // } // // // $user->money -= floatval($order->pay_price); // // $res = AccountLog::saveLog($user->id, floatval($order->pay_price), AccountLog::TYPE_BALANCE, AccountLog::LOG_TYPE_EXPEND, 1, $order->id, "商城余额支付,订单号为:{$order->order_no}。"); // // if (!$res) { // // $t->rollBack(); // // return [ // // 'code' => 1, // // 'msg' => '支付失败' // // ]; // // } // // $order->is_pay = 1; // // $order->pay_type = 3; // // $order->trade_status = Order::ORDER_FLOW_NO_SEND; // // $order->pay_time = time(); // // if ($order->user_id != get_user_id()) { // // $order->pay_user_id = get_user_id(); // // } // // if (!$order->save()) { // // $t->rollBack(); // // return [ // // 'code' => 1, // // 'msg' => '支付失败' // // ]; // // } // // } // // 同城配送订单下单 // if ($order->is_delivery == 1) { // $detail_goods = OrderDetail::find()->where(['order_id' => $order->id])->select('goods_name as name, pic, num, total_price as price')->asArray()->all(); // Delivery::addOrder($detail_goods, $order->order_no); // } // // 支付完成后,相关操作 // $form = new OrderComplete(); // $form->order_id = $order->id; // $form->order_type = 0; // $form->store_id = $this->order->store_id; // $form->notify(); // CloudPrint::doPrint($this->order->id, 0, $this->order->store_id); // //$t->commit(); // return [ // 'code' => 0, // 'msg' => '支付成功', // 'data' => '' // ]; // } } } /** * 设置佣金 * @param Order $order * @return mixed */ private function setReturnData($order) { $form = new ShareMoneyForm(); $form->order = $order; $form->order_type = 0; return $form->setData(); } /** * @param Order $PtActivityOrder * @throws \Exception * 检查限购 */ private function checkGoodsConfine($order) { $saas_user = get_saas_user(); $user = User::findOne(['binding'=>$saas_user->mobile,'store_id'=>get_store_id(),'is_delete'=>0]); foreach ($order->detail as $detail) { /* @var Goods $goods*/ /* @var OrderDetail $detail*/ $goods = $detail->goods; if ($goods->confine_count && $goods->confine_count > 0) { $goodsNum = Goods::getBuyNum($user, $goods->id); if ($goodsNum) { } else { $goodsNum = 0; } $goodsTotalNum = intval($goodsNum + $detail->num); if ($goodsTotalNum > $goods->confine_count) { throw new \Exception('商品:' . $goods->name . ' 超出购买数量', 1); } } //起订数量 if (($goods['order_min_count'] && $goods['order_min_count'] > 0)) { if ($detail->num < $goods['order_min_count']) { throw new \Exception('商品:' . $goods->name . ' 起订数量' . $goods['order_min_count'], 1); } } } } /** * @param Goods $goods * @param OrderDetail $detail * @param Order $order */ private function bookCheckGoodsNum($goods, $detail, $order) { // 判断时间 if (time() - $order->created_at > 15 * 60) { return [ 'code' => 1, 'msg' => '订单已过支付时间,将自动取消' ]; } $attr = Json::decode($detail->attr); // 酒店预约 if ($order->order_type == 1) { // $date_book = GoodsBook::findOne(['goods_id' => $goods->id])->date_book; // $date_book = Json::decode($date_book); // if (!$date_book) { // return [ // 'code' => 1, // 'msg' => '数据异常' // ]; // } // $data_config = array_combine(array_column($date_book, 'date'), array_column($date_book, 'num')); // foreach ($attr as $value) { // if (isset($data_config[$value['date']])) { // if ($data_config[$value['date']] < $detail->num) { // return [ // 'code' => 1, // 'msg' => '选中日期' . $value['date'] . '内暂无房源' // ]; // } // } else { // return [ // 'code' => 1, // 'msg' => '未找到预约时间下相关商品数据' // ]; // } // } } // 服务预约 if ($order->order_type == 2) { $service_book = GoodsBook::findOne(['goods_id' => $goods->id])->service_book; $service_book = Json::decode($service_book); if (!$service_book) { return [ 'code' => 1, 'msg' => '数据异常' ]; } $date_data = $this->getDateByInterval(7); $count = 0; $new_arr = [ 'data' => [] ]; $order = Order::find()->alias('o') ->leftJoin(['od' => OrderDetail::tableName()], 'o.id = od.order_id') ->where(['o.trade_status' => [0, 2, 3], 'o.is_delete' => 0, 'o.order_type' => 2, 'goods_id' => $goods['id']]) ->andWhere(['>', 'o.created_at', strtotime(date("Y-m-d"))]) ->select('od.attr, od.num')->asArray()->all(); foreach ($date_data as $index => $datum) { $new_arr['data'][$index]['date'] = $datum; $new_arr['data'][$index]['time'] = $service_book['data'][0]['time']; } if (!$new_arr) { return [ 'code' => 1, 'msg' => '数据异常' ]; } $service_book = $new_arr['data']; $service_book_date = array_column($service_book, NULL, 'date'); $service_book_time = $service_book_date[$attr['date']]['time']; $num = 0; $is = false; foreach ($order as $item) { $item['attr'] = json_decode($item['attr'], true); if ($item['attr']['date'] === $attr['date']) { if ($attr['time'] == $item['attr']['time']) { $num += $item['num']; } } } foreach ($service_book_time as $m) { foreach ($m['times'] as $n) { $is = true; if ($n['time'] == $attr['time']) { if (($detail->num + $num) > $n['num']) { return [ 'code' => 1, 'msg' => $n['time'] . '时间段内暂不可预约' ]; } } } } if ($is === false) { return [ 'code' => 1, 'msg' => '未找到预约时间下相关商品数据' ]; } } return [ 'code' => 0, 'msg' => 'success' ]; } public function getDateByInterval(int $num) :array { //var_dump($st, $et);die; $returnData = []; $i = 0; do { $temp = date('Y-m-d', strtotime('+' . $i . ' day', strtotime(date('Y-m-d')))); $returnData[] = $temp; $i++; } while ($i < $num); return $returnData; } }