123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407 |
- <?php
- namespace app\api\model\order;
- use app\common\service\Order;
- use app\api\model\Order as CheckOrder;
- use app\common\enum\OrderType as OrderTypeEnum;
- use app\api\model\User as UserModel;
- use app\api\model\groupbuylb\GroupBuyLbJoin;
- use app\api\model\groupbuylb\GroupBuyLbHelp;
- use app\api\model\groupbuylb\GroupBuyLbGoods;
- use app\common\model\Order as OrderModel;
- use app\common\model\OrderGoods as OrderGoodsModel;
- use app\common\enum\order\OrderSource as OrderSourceEnum;
- use app\common\enum\order\PayStatus as PayStatusEnum;
- use app\common\enum\order\OrderStatus as OrderStatusEnum;
- use app\common\enum\order\DeliveryType as DeliveryTypeEnum;
- use app\api\model\Goods as GoodsModel;
- use app\api\model\GoodsSku as GoodsSkuModel;
- use app\common\enum\order\PayType as OrderPayTypeEnum;
- use app\common\library\helper;
- use app\common\model\OrderAddress as OrderAddressModel;
- use app\common\service\goods\source\Factory as StockFactory;
- use think\facade\Db;
- use app\api\model\card\UserRiceCard as UserRiceCardModel;
- use app\api\model\card\UserRiceCardConsume as UserRiceCardConsumeModel;
- use app\common\model\groupbuylb\GroupBuyLbCoupon as GroupBuyLbCouponModel;
- use app\common\model\Coupon;
- use app\api\model\UserCoupon;
- use app\common\model\Wechat;
- use think\cache\driver\Redis;
- use app\common\model\PushLog;
- class GroupBuyLbPay implements IOrder {
- private $error = '';
- public function getError(){
- return $this->error;
- }
- public function prePay($args){
- }
- //重新支付
- public function repay($args){
- }
- //回调逻辑处理
- public function notifyPay($pay_data){
- $order_no = $pay_data['out_trade_no'];
- $model = GroupBuyLbHelp::getPayDetail($order_no);
- if(empty($model)){
- return false;
- }
- //已支付
- if($model['pay_state']==1){
- return false;
- }
-
- $user = UserModel::detail($model['user_id']);
- // Db::startTrans();
- $res = $model->transaction(function () use ($model,$pay_data,$user) {
- $model->save([
- 'pay_state'=> 1,
- 'pay_time' => time(),
- 'transaction_id'=>$pay_data['transaction_id']??''
- ]
- );
- $this->writeUserRiceCard($model);
- $join = GroupBuyLbJoin::where('id',$model['join_id'])->find();
- $join->help_count += 1; // 拼团人数+1
-
- $flag = false;
- //拼团人数够了
- if($join->help_count==$join->people_count){
- $flag = true;
- }
- $join->save();
- if($flag){ //成功了话写真实订单
- $this->ptSuccessNotify($join->id);
- }
- if($model['user_id']!=$join->user_id){
- $mobile = UserModel::where("user_id",$model['user_id'])->value("mobile")??'';
- $content ='恭喜您参与公明腊肠拼团,成功后给您安排发货。现在您可点击成为新团长,无需支付费用即可组织拼团,成团后享受平台奖励78元现金券。';
- PushLog::addSmsMon($content,$mobile,1);
- }
-
- });
- //发放优惠
- $join = GroupBuyLbJoin::where('id',$model['join_id'])->find();
- if($join->status==1 && $join->user_id>0){
- $this->receiveCoupon($join->user_id,$join->group_buy_lb_activity_id);
- }
-
- $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$model['group_buy_lb_activity_id'])->find();//拼团付款成功后加销量
- if($groupgoods){
- StockFactory::getFactory(OrderSourceEnum::GROUPBUYLB)->updateStockSalesExpress($groupgoods->goods_id,$model['goods_num']);
- }
- // Db::commit();
- return $res;
- }
- /**
- * 写入米卡记录
- * @param int $payType
- * @return false|int
- * @throws \Exception
- */
- private function writeUserRiceCard($help){
- if($help['rice_card_id']>0){
- //写现金卡出账记录
- $userRiceCard = UserRiceCardModel::find($help['rice_card_id']);
- UserRiceCardConsumeModel::add($userRiceCard,$help['order_no'],$help['pay_money'],$help['rice_card_money']);
- //如果可用余额为0并且冻结余额等于要抵扣的金额
- if($userRiceCard['balance']==0 && $help['rice_card_money']==$userRiceCard['frozen_amount']){
- //现金卡直接减冻结余额,并且状态改为已失效
- UserRiceCardModel::setIncDecByField($help['rice_card_id'],[],['frozen_amount'=>(float)$help['rice_card_money']],['effect_state'=>2]);
- }else{
- //现金卡直接减冻结余额
- UserRiceCardModel::setDecByField($help['rice_card_id'],'frozen_amount',(float)$help['rice_card_money']);
- }
- }
- }
- //拼团领券
- public function receiveCoupon($user_id,$activity_id){
- $couponArray = GroupBuyLbCouponModel::where('group_buy_lb_activity_id',$activity_id)->column("coupon_id");
- if(isset($couponArray)){
- $param[] = ['coupon_id','in',$couponArray];
- $avaiableCoupon = (new Coupon)->getCouponGroupBuyLblist($param);
- if(isset($avaiableCoupon)){
- foreach($avaiableCoupon as $row){
- $coupon_id = $row['coupon_id'];
- $userCoupon = new UserCoupon;
- $userCoupon->userreceive($coupon_id,$user_id);
- }
- }
- }
- }
- //拼团成功,写入订单逻辑
- public function ptSuccessNotify(int $join_id){
- $join = GroupBuyLbJoin::where('id',$join_id)->find();
- // $help = GroupBuyHelp::where('id',$help_id)->find();
- //假的订单 order_id = -1
- if($join->status==0&&$join->help_count==$join->people_count){
- //虚拟团不写订单,记得这个条件is_virtual_join_user=0
- $helpList = GroupBuyLbHelp::where('join_id',$join_id)->where('order_id',0)
- ->where('fans',0)
- ->where('pay_state',1)->where('is_virtual_join_user',0)->select();
- foreach($helpList as $help){
- $order_id = $this->add($help,'');
- GroupBuyLbHelp::where('order_id',0)->where('id',$help['id'])->update(['order_id'=>$order_id]);
- }
- }
- $join->status = 1;
- $join->success_time = Date("Y-m-d H:i:s",time());
- $join->save();
- //通知
- if($join->is_virtual==0){
- $this->activityEnd($join->user_id,$join->id);
- }else{
- $this->virtualActivityEnd($join->user_id,$join->id);
- }
-
- }
- //检查有没有订阅
- public function checkSub($open_id,$template_id){
- $key ='subscribe:open_id:'.$open_id.'template_id:'.$template_id;
- $rds = new Redis(config('cache.stores.redis'));
- $value = $rds->get($key);
- if($value=="1"){
- return true;
- }
- return false;
- }
- //下单并发起拼团,拼团成功后发送
- public function activityEnd($user_id,$join_id){
- $openid = UserModel::where('user_id',$user_id)->value('open_id');
- $template_id = 'M4Nw40B4Hpn4C8NkCiBDajEqz1St_CRRjGlkxDOVP1g';
- $weixinToken = (new Wechat)->weixinTokenCache();
- $accessToken = $weixinToken['access_token'];
- $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken;
- $data['touser']= $openid;
- $data['template_id'] = $template_id;
- $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id;
- $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial';
- $data['data']= ['thing1'=>["value"=>"拼团有礼"],'thing3'=>["value"=>'活动已结束,去看看活动结果']];
- if($this->checkSub($openid,$template_id)){
- post_curl($url,json_encode($data));
- }
- $this->helpEnd($join_id);
- }
- //虚拟团,拼团成功后发送
- public function virtualActivityEnd($user_id,$join_id){
- $openid = UserModel::where('user_id',$user_id)->value('open_id');
- $template_id = 'VG3VUaZKE4NkhSt9rn7xFhYlAjtopXACI1Y7HbIOf28';
- $weixinToken = (new Wechat)->weixinTokenCache();
- $accessToken = $weixinToken['access_token'];
- $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken;
- $data['touser']= $openid;
- $data['template_id'] = $template_id;
- $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id;
- $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial';
- $data['data']= ['thing2'=>["value"=>"拼团有礼"],'thing6'=>["value"=>'活动已结束,去看看活动结果']];
- if($this->checkSub($openid,$template_id)){
- post_curl($url,json_encode($data));
- }
- $this->helpEnd($join_id);
-
- }
- //团员结束
- public function helpEnd($join_id){
- $user_id_arr = GroupBuyLbHelp::where("join_id",$join_id)->column('user_id');
- $open_id_arr = UserModel::where("user_id",'in',$user_id_arr)->column("open_id");
- $template_id = 'AgOUjZCUMRo0hwPgLrVSwztkrPys3FAq9OgL4waBaCI';
- $weixinToken = (new Wechat)->weixinTokenCache();
- $accessToken = $weixinToken['access_token'];
- $url = "https://api.weixin.qq.com/cgi-bin/message/subscribe/send?access_token=" . $accessToken;
-
- $data['template_id'] = $template_id;
- $data['page'] = 'pages/activity/pages/groupShopping/groupFission/groupFission?shareId='.$join_id;
- $data['miniprogram_state'] = env('APP_ENV')=="production"?'formal':'trial';
- $data['data']= ['thing1'=>["value"=>"拼团有礼"],'thing2'=>["value"=>'活动已结束,去看看活动结果']];
- foreach($open_id_arr as $openid){
- $data['touser']= $openid;
- if($this->checkSub($openid,$template_id)){
- post_curl($url,json_encode($data));
- }
-
- }
- }
- //测试
- public function test(){
- $help = GroupBuyLbHelp::where('id',100)->find();
- $this->add($help,'');
- }
- /**
- * 新增订单记录
- * @param $order
- * @param string $remark
- * @return false|int
- */
- private function add($help, $remark = ''){
- $groupgoods = GroupBuyLbGoods::where('group_buy_lb_activity_id',$help['group_buy_lb_activity_id'])->find();
- $goods_id = $groupgoods->goods_id;
- $group_price = $groupgoods->group_price;
- $goodsSkuId = $groupgoods->goods_sku_id;
- $goodsNum = $help['goods_num'];
- $model = new GoodsModel;
- $goodsList = $model->getListByIdsFromApi([$goods_id]);
- // 隐藏冗余的属性
- $goodsList->hidden(array_merge($model->hidden, ['content', 'goods_images', 'images']));
- //返回商品处理
- foreach ($goodsList as &$item) {
- // 商品sku信息
- $item['skuInfo'] = GoodsSkuModel::detail($item['goods_id'], $goodsSkuId);
- // 商品单价
- $item['goods_price'] = $item['skuInfo']['goods_price'];
- // 商品购买数量
- $item['total_num'] = $goodsNum;
- // 商品SKU索引
- $item['goods_sku_id'] = $item['skuInfo']['goods_sku_id'];
- // 商品购买总金额
- $item['total_price'] = helper::bcmul($item['goods_price'], $goodsNum);
- // 获取最终拼团单价金额
- $item['group_price'] = $groupgoods['group_price'];
- }
- // 订单数据
- $data = [
- 'user_id' => $help['user_id'],
- 'order_no' => $help['order_no'],
- 'total_price' => $goodsList[0]['total_price'],//商品原总价,不包含折扣
- 'order_price' => $help['order_money'],//订单优惠完金额 商品优惠完金额+运费
- 'pay_price' => $help['pay_money'], //微信支付金额
- 'delivery_type' => DeliveryTypeEnum::EXPRESS,
- 'pay_type' => $help['pay_money'] > 0 ? OrderPayTypeEnum::WECHAT : OrderPayTypeEnum::MICAH_EXCHANGE,
- 'buyer_remark' => trim($remark),
- 'order_source' => OrderSourceEnum::GROUPBUYLB,
- 'order_source_id' => $help['id'],
- 'groupbuy_money' => helper::bcsub($goodsList[0]['total_price'],$goodsList[0]['group_price']*$goodsNum),
- 'order_status' => OrderStatusEnum::NORMAL,
- 'store_id' => 10001,
- 'provider_ids' => $help['provider_ids']??0,
- 'distributor_total_money' => 0,
- 'rice_card_id' => $help['rice_card_id']??0,
- 'rice_card_money' => $help['rice_card_money']??0,
- 'rice_card_express_money' => $help['rice_card_express_money']??0,
- 'pay_status' => PayStatusEnum::SUCCESS,
- 'pay_time' => time(),
- 'invoice_deadline'=> time() + OrderModel::getInvoiceDeadline() * 60,
- 'express_price'=> $help['express_money'],
- 'transaction_id'=>$help['transaction_id']
- ];
- // 保存订单记录
- $orderModel = new OrderModel;
- $orderModel->save($data);
- $order_id = $orderModel->order_id;
- $newGoodsList = [];
- foreach ($goodsList as $key=>$goods) {
- $total_pay_price = helper::bcsub
- ($help['pay_money'],$help['express_money']) > 0 ? helper::bcsub($help['pay_money'],$help['express_money']):0;
- $item = [
- 'order_id'=>$order_id,
- 'user_id' => $help['user_id'],
- 'store_id' => 10001,
- 'goods_id' => $goods['goods_id'],
- 'goods_name' => $goods['goods_name'],
- 'goods_no' => $goods['goods_no'] ?: '',
- 'image_id' => (int)current($goods['goods_images'])['file_id'],
- 'deduct_stock_type' => $goods['deduct_stock_type'],
- 'spec_type' => $goods['spec_type'],
- 'goods_sku_id' => $goods['skuInfo']['goods_sku_id'],
- 'goods_props' => $goods['skuInfo']['goods_props'] ?: '',
- 'content' => $goods['content'] ?? '',
- 'goods_sku_no' => $goods['skuInfo']['goods_sku_no'] ?: '',
- 'goods_price' => $goods['skuInfo']['goods_price'],
- 'specs' => $goods['skuInfo']['specs'],
- 'supplier' => $goods['supplier'],
- 'line_price' => $goods['skuInfo']['line_price'],
- 'goods_weight' => $goods['skuInfo']['goods_weight'],
- 'is_user_grade' => (int)$goods['is_user_grade'],
- 'grade_ratio' => $goods['grade_ratio']??0,
- 'grade_goods_price' => $goods['grade_goods_price']??0,
- 'grade_total_money' => $goods['grade_total_money']??0,
- 'coupon_id' => $goods['coupon_id']??0,
- 'coupon_money' => $goods['coupon_money']??0,
- 'points_bonus' => $goods['points_bonus']??0,
- 'total_num' => $goods['total_num'],
- 'total_price' => $goods['total_price'],
- 'total_pay_price' => $total_pay_price,
- 'provider_id' => $goods['provider_id'],
- 'brand' => $goods['brand'],
- 'province_id' => $goods['province_id'],
- 'city_id' => $goods['city_id'],
- 'storage' => $goods['storage'],
- 'unit' => $goods['unit'],
- 'clearing_price' => $goods['skuInfo']['clearing_price']??'0.00',
- 'platform_rate' => $goods['skuInfo']['platform_rate']??'0.00',
- 'staff_user_id' => $goods['staffUserId'],
- 'shop_id' => $goods['shopId'],
- 'distributor_radio' => $goods['distributor_radio']??0,
- 'distributor_goods_price' => $goods['distributor_goods_price']??0,
- 'distributor_total_money' => $goods['distributor_total_money']??0,
- 'rice_card_id' => $help['rice_card_id']??0,
- 'goods_type' => $goods['goods_type']??10,
- 'shop_id'=>0,
- 'rice_card_money'=>$help['good_rice_card_money']
- ];
- $newGoodsList[] = $item;
- }
- $orderGoodModel = new OrderGoodsModel;
- $orderGoodModel->saveAll($newGoodsList);
- $address = [
- 'order_id'=>$order_id,
- 'user_id' => $help['user_id'],
- 'store_id' =>10001,
- 'name' => $help['user_name'],
- 'phone' => $help['phone'],
- 'province_id' => $help['province_id'],
- 'city_id' => $help['city_id'],
- 'region_id' => $help['region_id'],
- 'detail' => $help['detail']
- ];
- $orderAddressModel = new OrderAddressModel;
- $orderAddressModel->save($address);
- return $order_id;
- }
- /**
- * 记录收货地址
- * @param $address
- * @return false|\think\Model
- */
- private function saveOrderAddress($address)
- {
- return $this->model->address()->save();
- }
- }
|