123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- <?php
- namespace app\common\service;
- use app\common\model\ActivityApply;
- use app\common\model\ActivityApplyItem;
- use app\common\model\GoodsOrderRefund;
- use app\common\model\StoreOrderRefund;
- use app\api\controller\Alipay;
- use app\common\model\UserMessage;
- use EasyWeChat\Factory;
- use library\tools\Data;
- use think\Db;
- use think\Exception;
- /**
- * 活动管理
- * Class Activity
- */
- class Activity extends SerBase
- {
- /**
- * 订单申请退款【按票整个订单退款】
- * @param $order_id 订单id
- * @param $source 1用户申请2后台操作
- * @param $is_refund 是否立即退款
- */
- public static function orderRefundApply($order_id,$source = 1,$is_refund = 0,$message='')
- {
- $order_info = ActivityApply::where('id',$order_id)->with('itemList')->find()->toArray();
- if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付'];
- if($order_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款'];
- if(in_array($order_info['refund_state'],[1,2,4,5])) return ['code'=>201,'msg' => '订单已申请退款'];
- $refund_money = StoreOrderRefund::getRefundMoney($order_id);
- if($refund_money >= $order_info['money']) return ['code'=>201,'msg' => '订单已全额退款'];
- Db::startTrans();
- try {
- foreach ($order_info['item_list'] as $item_info) {
- if($item_info['money'] <= 0) continue;
- if($item_info['is_hx'] || $item_info['ticket_status']) throw new Exception('门票已审核无法退款');
- $refund_info = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_info['id'],'order_type'=>1])->find();
- if(!empty($refund_info) && in_array($refund_info->status,[0,1,3,4])) continue;
- Data::save('StoreOrderRefund',[
- 'user_id' => $order_info['user_id'],
- 'order_id' => $order_id,
- 'item_id' => $item_info['id'],
- 'order_type' => 1,
- 'is_deleted' => 0,
- 'sell_price' => $item_info['total_money'],
- 'refund_money' => $item_info['money'],//优惠后价格
- 'refund_no' =>$order_info['pay_no'].'_'.$item_info['id'],
- 'status' => 0,
- 'source' => $source,
- ],'order_id',['order_id'=>$order_id,'item_id'=> $item_info['id'],'order_type'=>1]);
- }
- ActivityApply::where('id',$order_id)->update(['refund_state'=>1]);
- // UserMessage::sendUserMessage($order_info['user_id'],'activity',4,1,0,$order_info['id'],$message,$order_info['id']);
- UserMessage::sendUserMessage($order_info['user_id'],'apply',4,1,0,$order_info['id'],$message,$order_info['id']);
- Db::commit();
- }catch (\Exception $e){
- Db::rollback();
- return ['code'=>201,'msg' => $e->getMessage() ];
- }
- return ['code'=>200,'msg' => '申请成功'];
- }
- /**
- * 订单退款【按整个订单退款】
- * @param $order_id 订单id
- */
- public static function orderRefundMoney($order_id,$message = '')
- {
- $order_info = ActivityApply::where('id',$order_id)->with('itemList')->find()->toArray();
- if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付'];
- if($order_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款'];
- if(!in_array($order_info['refund_state'],[2,4])) return ['code'=>201,'msg' => '退款状态有误'];
- $refund_money = StoreOrderRefund::getHasRefund($order_id);
- if($refund_money >= $order_info['money']) return ['code'=>201,'msg' => '订单已全额退款'];
- // (1.h5微信,2.h5支付宝,3.app微信,4.app支付宝,5.h5微信内支付,9线下支付)
- $apply_refund = StoreOrderRefund::where('order_id',$order_id)->where('order_type',1)->where('status','in','0,1,4')->select()->toArray();
- if(empty($apply_refund)) return ['code'=>201,'msg' => '没有退款记录'];
- $total_money = array_sum(array_column($apply_refund,'refund_money'));// 需要退款金额
- Db::startTrans();
- try {
- $refund_no = $order_info['pay_no'].'_'.$order_id.'_'.$order_info['act_id'];
- if(in_array($order_info['pay_type'],[1,3,5])){ // h5
- $app = $order_info['pay_type'] == 3 ? Factory::payment(config('app.app_wx')) : Factory::payment(config('app.wx_pay'));
- $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['money'] * 100, $total_money *100, ['refund_desc' => '订单退款']);
- if($result['return_code'] != 'SUCCESS') throw new Exception('微信退款异常');
- if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']);
- }
- // 支付宝退款
- if(in_array($order_info['pay_type'],[2,4,7]))
- {
- $result = Alipay::aliRefund($order_info['pay_no'], $total_money,$order_info['pay_type'] == 2 ?'H5':'APP');
- if(!$result) throw new Exception('支付宝退款异常');
- }
- GoodsOrderRefund::where('id','in',array_column($apply_refund,'id'))->update(['status'=>3]);
- ActivityApply::where('id',$order_id)->update(['refund_state'=>5]);
- //UserMessage::sendUserMessage($order_info['user_id'],'activity',4,2,0,$order_info['id'],$message,$order_info['id']);
- UserMessage::sendUserMessage($order_info['user_id'],'apply',4,1,0,$order_info['id'],$message,$order_info['id']);
- Db::commit();
- }catch (\Exception $e){
- Db::rollback();
- GoodsOrderRefund::where('id','in',array_column($apply_refund,'id'))->update(['status'=>4]);
- ActivityApply::where('id',$order_id)->update(['refund_state'=>4]);
- return ['code'=>201 ,'msg'=>$e->getMessage()];
- }
- return ['code'=>200,'msg'=>'退款成功'];
- }
- /**
- * 订单申请退款【按票退款】
- * @param $order_id 订单id
- * @param $item_id 票id
- * @param $source 1用户申请2后台操作
- * @param $is_refund 是否立即退款
- */
- public static function orderApplyRefund($order_id,$item_id,$source,$is_refund = 0)
- {
- //$ret_val = static::$ret_val;// ['code' => 200 , 'msg'=>'ok','extend'=>''];
- $order_info = ActivityApply::where('id',$order_id)->find()->toArray();
- $item_info = ActivityApplyItem::where('id',$item_id)->find()->toArray();
- if(!$order_info['pay_state']) return ['code'=>201,'msg' => '订单未支付'];
- if($item_info['money'] <= 0) return ['code'=>201,'msg' => '免费门票不支持退款'];
- $refund_money = StoreOrderRefund::getRefundMoney($order_id);
- if($refund_money >= $order_info['money'])return ['code'=>201,'msg' => '订单已全额退款'];
- $refund_info = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1])->find();
- if(!empty($refund_info) && in_array($refund_info->status,[0,1,3,4])) return ['code'=>201,'msg' => '订单已申请退款'];
- if($item_info['is_hx'] || $item_info['ticket_status'])return ['code'=>201,'msg' => '票已核销无法申请'];
- // 申请记录详情
- Data::save('StoreOrderRefund',[
- 'user_id' => $order_info['user_id'],
- 'order_id' => $order_id,
- 'item_id' => $item_id,
- 'order_type' => 1,
- 'is_deleted' => 0,
- 'sell_price' => $item_info['total_money'],
- 'refund_money' => $item_info['money'],//优惠后价格
- 'refund_no' => $order_info['pay_no'].'_'.$item_info['id'],
- 'status' => 0,
- 'source' => $source,
- ],'order_id',['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1]);
- if($is_refund) {
- $refund_id = StoreOrderRefund::where(['order_id'=>$order_id,'item_id'=>$item_id,'order_type'=>1])->value('id');
- $refund_res = static::orderRefund($refund_id);
- return $refund_res;
- }
- return ['code'=>200,'msg' => '申请成功'];
- }
- /**
- * 确定退款
- * @param $refund_id 退款记录id
- */
- public static function orderRefund($refund_id)
- {
- $refund_info = StoreOrderRefund::where('id',$refund_id)->find()->toArray();
- if(in_array($refund_info['status'],[2,3,5]) || $refund_info['is_deleted']) return ['code'=>201,'msg' => '退款记录异常'];
- $order_info = ActivityApply::where('id',$refund_info['order_id'])->find()->toArray();
- $item_info = ActivityApplyItem::where('id',$refund_info['item_id'])->find()->toArray();
- if($item_info['is_hx'] || $item_info['ticket_status'])return ['code'=>201,'msg' => '票已核销无法退款'];
- // (1.h5微信,2.h5支付宝,3.app微信,4.app支付宝,5.h5微信内支付,9线下支付)
- if($refund_info['refund_money'] <= 0 || $refund_info['refund_money'] > $order_info['money']) return ['code'=>201,'订单退款金额有误'];
- Db::startTrans();
- try {
- $refund_no = $refund_info['refund_no'] ? $refund_info['refund_no'] : get_order_sn();
- //微信退款
- if(in_array($order_info['pay_type'],[1,3,5,6])){ // h5
- $app = $order_info['pay_type'] == 3 ? Factory::payment(config('app.app_wx')) : Factory::payment(config('app.wx_pay'));
- $result = $app->refund->byOutTradeNumber($order_info['pay_no'], $refund_no, $order_info['money'] * 100, $refund_info['refund_money']*100, ['refund_desc' => '订单退款']);
- // var_dump($result);
- if($result['return_code'] != 'SUCCESS') throw new Exception('微信退款异常');
- if($result['result_code'] != 'SUCCESS') throw new Exception($result['err_code_des']);
- // 修改退款记录状态
- GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
- }
- // 支付宝退款
- if(in_array($order_info['pay_type'],[2,4,7]))
- {
- $result = Alipay::aliRefund($order_info['pay_no'], $refund_info['refund_money'],$order_info['pay_type'] == 2 ?'H5':'APP');
- if(!$result) throw new Exception('支付宝退款异常');
- // 修改退款记录状态
- GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
- }
- if(in_array($order_info['pay_type'],[9])) {
- // 修改退款记录状态
- GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['refund_no'=>$refund_no,'status'=>3]);
- }
- Db::commit();
- }catch (\Exception $e){
- Db::rollback();
- GoodsOrderRefund::where(['id'=>$refund_info['id']])->update(['status'=>4]);
- return ['code'=>201 ,'msg'=>$e->getMessage()];
- }
- return ['code'=>200,'msg'=>'退款成功'];
- }
- // 活动变更消息推送
- public static function activityChange($act_id)
- {
- $where = [];
- $where[] = ['a.pay_state','=',1];
- $where[] = ['a.refund_state','=',0];
- $act_info = \app\common\model\Activity::where('id',$act_id)->find()->toArray();
- $act_title = $act_info['title'];
- $list = ActivityApplyItem::field('i.id,i.apply_id,i.phone,i.email,i.user_id,i.act_id')
- ->alias('i')->where($where)
- ->leftJoin('ActivityApply a','i.apply_id = a.id')
- ->leftJoin('StoreOrderRefund r','r.item_id = i.id')
- ->group('i.user_id')
- ->select()->toArray();
- $message = '由于不可抗因素,您报名的《'.$act_title.'》活动,参会地点及时间变更为:'.$act_info['start_time'].',';
- $message.=$act_info['province'].$act_info['city'].$act_info['county'].$act_info['address'].',请悉知,跟您带来的不便,敬请谅解!期待与您再次相遇';
- foreach ($list as $item_info) {
- $refund_info = StoreOrderRefund::getRefundInfo($item_info['apply_id'],$item_info['id'],1);
- if(!empty($refund_info && in_array($refund_info['status'],[0,1,3,5])))continue;
- // 站内信 && 极光
- // UserMessage::sendUserMessage($item_info['user_id'],'activity',2,0,0,$item_info['act_id'],$message,$item_info['id']);
- UserMessage::sendUserMessage($item_info['user_id'],'activity',2,0,0,$item_info['act_id'],$message,$item_info['act_id']);
- // 短信推送
- // 邮箱提示
- $content = '您报名的活动:'.$act_title.'已发生变更';
- if($item_info['email'] && strpos ('@', $item_info['email'])) send_email($item_info['email'],$content);
- }
- }
- }
|