123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366 |
- <?php
- namespace app\api\model\order;
- use app\api\model\member\GoldRice as GoldRiceModel;
- 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\groupbuy\GroupBuyJoin;
- use app\api\model\groupbuy\GroupBuyHelp;
- use app\api\model\groupbuy\GroupBuyGoods;
- 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\api\model\subscribe\WechatSub;
- use app\common\service\commission\RecordWaitCommission;
- class GroupBuyPay 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 = GroupBuyHelp::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->writeUserGoldRice($model);
- $this->writeUserRiceCard($model);//写入金米粒逻辑
- $join = GroupBuyJoin::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);
- }
- });
- $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$model['group_buy_activity_id'])->find();//拼团付款成功后加销量
- if($groupgoods){
- StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSalesExpress($groupgoods->goods_id,$model['goods_num']);
- }
- // Db::commit();
- return $res;
- }
- /**
- * 写入金米粒记录
- * @param int $payType
- * @return false|int
- * @throws \Exception
- */
- private function writeUserGoldRice($model)
- {
- if($model['gold_rice_amount']>0){
- //写金米粒出账记录
- GoldRiceModel::add($model['user_id'],$model['order_no'],'下单抵扣',$model['gold_rice_amount'],0);
- //扣除冻结中的金米粒
- UserModel::setDecByField($model['user_id'],'gold_rice_frozen',(float)$model['gold_rice_amount']);
- }
- }
- /**
- * 写入米卡记录
- * @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 ptSuccessNotify(int $join_id){
- $join = GroupBuyJoin::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){
- $helpList = GroupBuyHelp::where('join_id',$join_id)->where('fans',0)->where('order_id',0)->where('pay_state',1)->select();
- foreach($helpList as $help){
- $order_id = $this->add($help,'');
- GroupBuyHelp::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();
- $this->activityEnd($join->user_id,$join->id);
- }
- //测试
- public function test(){
- $help = GroupBuyHelp::where('id',100)->find();
- $this->add($help,'');
- }
- //下单并发起拼团,拼团成功后发送
- public function activityEnd($user_id,$join_id){
- $template_type = 'normal_xia_dan_faqi_tuan';//
- $sub = new WechatSub($template_type);
- $page = 'pages/activity/pages/groupShopping/groupShopping/groupShopping?shareId='.$join_id;
- $data = ['thing2'=>["value"=>"拼团活动"],'thing3'=>["value"=>'活动已结束,去看看活动结果']];
- $sub->pushSub($user_id,$page,$data);
- $this->helpEnd($join_id);
- }
- //团员结束
- public function helpEnd($join_id){
- $user_id_arr = GroupBuyHelp::where("join_id",$join_id)->column('user_id');
- $template_type = 'normal_li_ji_can_tuan'; //normal_xia_dan_faqi_tuan
- $sub = new WechatSub($template_type);
- $page = 'pages/activity/pages/groupShopping/groupShopping/groupShopping?shareId='.$join_id;
- $data =['thing1'=>["value"=>"拼团活动"],'thing3'=>["value"=>'活动已结束,去看看活动结果']];
- foreach($user_id_arr as $user_id){
- $res = $sub->pushSub($user_id,$page,$data);
- // var_dump($res);
- }
- }
- /**
- * 新增订单记录
- * @param $order
- * @param string $remark
- * @return false|int
- */
- public function add($help, $remark = ''){
- $groupgoods = GroupBuyGoods::where('group_buy_activity_id',$help['group_buy_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'];
- }
- $groupbuy_money = helper::bcsub($goodsList[0]['total_price'],$goodsList[0]['group_price']*$goodsNum);
- if($groupbuy_money<0){
- $groupbuy_money = 0;
- }
- // 订单数据
- $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::GROUPBUY,
- 'order_source_id' => $help['id'],
- 'groupbuy_money' =>$groupbuy_money,
- 'order_status' => OrderStatusEnum::NORMAL,
- 'store_id' => 10001,
- 'provider_ids' => $help['provider_ids']??0,
- 'distributor_total_money' => 0,
- 'gold_rice_amount' => $help['gold_rice_amount']??0,
- 'gold_rice_money' => $help['gold_rice_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'],
- 'promotion_monitor_id'=>$help['promotion_monitor_id'],
- 'staff_user_id' => $help['staff_user_id']?? 0,
- 'staff_shop_id' => $help['staff_shop_id']?? 0
- ];
- // 保存订单记录
- $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,
- 'gold_rice_amount' => $help['gold_rice_amount']??0,
- 'gold_rice_money' => $help['gold_rice_money']??0,
- 'rice_card_id' => $help['rice_card_id']??0,
- 'group_buy_id' => $help['group_buy_activity_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);
- // $order['goodsList'] = $goodsList;
- // $order['goods'] = $goodsList;
- // $order['delivery'] = DeliveryTypeEnum::EXPRESS;
- // $order['delivery_type'] = DeliveryTypeEnum::EXPRESS;
-
- // StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateGoodsStock($order);
- // StockFactory::getFactory(OrderSourceEnum::GROUPBUY)->updateStockSales($order);
- //待结算佣金计算
- $RecordWaitCommission = new RecordWaitCommission;
- //分销记录放入队列
- $RecordWaitCommission->recordWaitCommission($order_id);
- return $order_id;
- }
- /**
- * 记录收货地址
- * @param $address
- * @return false|\think\Model
- */
- private function saveOrderAddress($address)
- {
- return $this->model->address()->save();
- }
- }
|