优惠卷的步骤:
    1.点击支付时判断是否此用户满足条件的优惠卷
    2.在创建订单的控制器把优惠卷的满足条件统一处理
    3.创建订单控制器处理完之后,返回一个标识200
    4.当这个标识符合200的时候,跳转到优惠卷页面
    5.点击使用优惠卷,将id传给前台,在订单页面显示对应的优惠卷信息
    6.在第一次跳转到选择优惠卷的控制器时存取一个标识
    7.在用户支付时取消支付返回到订单页面,再次发起支付时,判断是否有这个标识,当有这个标识的时候,就不会在跳出是否使用优惠卷

    优惠卷的俩张表
    1.优惠卷表
    优惠卷解决方案 - 图1
    2.优惠卷领取表
    优惠卷解决方案 - 图2
    3.视图在确认订单视图判断订单是否存在

    1. // 获取优惠卷
    2. var coupon_id = $('.container').attr('coupon_id');
    3. if(coupon_id){
    4. $.getJSON("{:U('addon/WeiuidDeit/Mobile/creatOrder')}",{mark:mark,id:address_id,shop_id:str,coupon_id:coupon_id},function(result){
    5. if(result.return_code == 200){
    6. // 跳转支付页面
    7. // location.href="{:U('addon/WeiuidDeit/Mobile/pay/orderid/"+result.return_data.orderid+"')}";
    8. location.href="{:U('Home/Wxpay/pay/orderid/"+result.return_data.orderid+"')}";
    9. }
    10. })
    11. }else{
    12. $.getJSON("{:U('addon/WeiuidDeit/Mobile/creatOrder')}",{mark:mark,id:address_id,shop_id:str},function(result){
    13. if(result.return_codes == 201){
    14. // 获取优惠卷是否已经使用过一次
    15. var usecoupon = $('#usecoupon').val();
    16. // 判断当前订单如果已经使用了优惠卷,就不能在使用优惠卷
    17. if(!usecoupon){
    18. // 点击确认订单会弹出是否使用优惠卷
    19. var r=confirm("是否使用优惠卷");
    20. if(r == true){
    21. var mark = $('#mark').val();
    22. // 存储备注
    23. $.post("{:U('addon/WeiuidDeit/Mobile/mark')}",{mark:mark});
    24. // 跳转到优惠卷使用页面
    25. location.href="{:U('addon/WeiuidDeit/Mobile/paper_noyes')}";
    26. }else{
    27. // location.href="{:U('addon/WeiuidDeit/Mobile/pay/orderid/"+result.return_data.orderid+"')}";
    28. location.href="{:U('Home/Wxpay/pay/orderid/"+result.return_data.orderid+"')}";
    29. }
    30. }else{
    31. location.href="{:U('Home/Wxpay/pay/orderid/"+result.return_data.orderid+"')}";
    32. }
    33. }else if(result.return_code == 200){
    34. // 跳转支付页面
    35. // location.href="{:U('addon/WeiuidDeit/Mobile/pay/orderid/"+result.return_data.orderid+"')}";
    36. location.href="{:U('Home/Wxpay/pay/orderid/"+result.return_data.orderid+"')}";
    37. }
    38. })
    39. }

    4.后台创建订单控制器的判断
    当点击支付按钮时判断当前用户是否有未使用并且满足条件的优惠卷,在视图获取优惠卷id,判断当有这个优惠卷id的时候,在后台将这个优惠卷的信息查出,然后assign到视图,将优惠卷展示出来,并且在创建订单的控制器,将商品的价格直接减掉和商品的订单总结跟优惠卷条件做判断。并且在控制器返回201标识,表示有可用的优惠卷。在跳到优惠卷页面,选择对应的优惠卷

    1. // 自取 点击确认订单 创建订单
    2. public function creatOrder()
    3. {
    4. // 判断用户是进的外买还是自取
    5. $takeoutfood = $_COOKIE['takeoutfood'];
    6. // 获取前台地址id
    7. $address_id = I('address_id');
    8. // 商品id
    9. $shop_id = I('shop_id');
    10. session('shop_id',$shop_id);
    11. // 获取在订单页面的ajax优惠卷id
    12. $couponid = I('coupon_id');
    13. // 获取地址栏的优惠卷id,如果有代表用户已经选择了优惠卷,如果没有则继续选择优惠卷
    14. if(!$couponid){
    15. // 查询优惠表的数据,判断用户是否有可用优惠卷
    16. $coupon_data = M()->table('antweb_foodcouponreceive as a')
    17. ->join('antweb_foodcoupon as b on b.id=a.foodcoupon_id')
    18. ->where([
    19. 'foodmumber_id'=>session('userinfo')['id'],
    20. 'receive_status'=>1,
    21. ])
    22. ->order('a.id desc')
    23. ->select();
    24. }
    25. $data['number'] = time('YmdHis').rand(100,999).session('userinfo.id');//订单编号
    26. $data['total_fee'] = $_SESSION['total'];//订单金额
    27. // 判断订单页的优惠卷id是否存在,存在直接将金额减去
    28. if($couponid){
    29. $couponinfo = D('foodcoupon')->where([
    30. 'id'=>$couponid
    31. ])->find();
    32. // $data['cash_fee'] = $_SESSION['total']- $couponinfo['coupon_denomination'];
    33. $data['cash_fee'] = $_SESSION['total'];
    34. }else{
    35. $data['cash_fee'] = $_SESSION['total'];//实付金额
    36. }
    37. if($takeoutfood == 2){
    38. $data['type'] = 2;//订单产生方式 自取
    39. }else{
    40. $data['type'] = 3;//订单产生方式 外卖
    41. }
    42. $data['mpid'] = session('userinfo.mpid');//公众号的id
    43. $data['status'] = 1;//订单状态
    44. $data['userid'] = session('userinfo.id');//买家id
    45. $data['mark'] = I('mark');//备注
    46. $data['create_time'] = time();//创建时间
    47. $data['deal_time'] = time();//支付时间
    48. $data['address_id'] = I('id');//地址id
    49. $data['total_price'] = $_SESSION['total'];
    50. // 将商品id存带表,输出订单列表要用
    51. $data['food_id'] = I('shop_id');
    52. if(session('?shop_id')){
    53. // 将从订单传送过来的字符串id,转换为数组
    54. $arr = explode(',',session('shop_id'));
    55. // 循环过来的商品id ,$v就是商品的id
    56. foreach($arr as $k => $v){
    57. // 循环数据查询产品的基本信息
    58. $pro_data = D('food')->where([
    59. 'id'=>$v
    60. ])->find();
    61. // 组装视图要显示的商品数据 从订单过来的数据有很大的可能会不是一件商品 所以在组装数据的时候,要给俩组值,以商品的id作为下标,防止当有俩件产品的时候,最后一件商品的数据将之前的数据都覆盖
    62. // 注意::用户选择的产品数量是存在session里边的
    63. $confirm_list[$v]['id'] = $pro_data['id'];
    64. $confirm_list[$v]['food_picture'] = $pro_data['food_picture'];
    65. $confirm_list[$v]['food_name'] = $pro_data['food_name'];
    66. $confirm_list[$v]['food_price'] = $pro_data['food_price'];
    67. $confirm_list[$v]['user_num'] = $_SESSION['Cart'][$v]['user_num'];
    68. }
    69. }
    70. //重新修改订单下单的时候商品信息
    71. $data['food_id'] = ",".I('shop_id').",";
    72. $data['cartorder'] = json_encode($confirm_list);
    73. // 商家id
    74. $data['business_id'] = session('business_id');
    75. // 查询店铺信息
    76. $businessData = D('foodmanagement')->where([
    77. 'id'=>$data['business_id']
    78. ])->find();
    79. // 店铺名
    80. $data['business_name'] = $businessData['shop_name'];
    81. // 创建订单
    82. $orderid = D('foodorder')->add($data);
    83. // 判断订单是否创建成功
    84. if($orderid){
    85. // 订单id
    86. $order['orderid'] = $orderid;
    87. $return['return_code'] = 200;
    88. $return['return_msg'] = '成功';
    89. // 循环优惠卷领取表
    90. foreach($coupon_data as $k=>$v){
    91. // 判断是否有可用的优惠卷
    92. if($_SESSION['total'] >= $v['coupon_condition']){
    93. $return['return_codes'] = 201;
    94. $return['return_msgs'] ='有可用的优惠卷';
    95. // $this->ajaxReturn($return);
    96. }
    97. }
    98. // 返回订单id,给支付页面传数据id
    99. $return['return_data'] = $order;
    100. $this->ajaxReturn($return);
    101. }else{
    102. $return['return_code'] = 201;
    103. $return['return_msg'] = '暂无订单';
    104. $this->ajaxReturn($return);
    105. }
    106. }
    107. ///优惠卷选择页面的js
    108. // 使用优惠卷
    109. $('.free-collecte').click(function(){
    110. // 获取用户点击使用的优惠卷id
    111. var coupon_id = $(this).attr('coupon_id');
    112. $.post("{:U('addon/WeiuidDeit/Mobile/couponselect')}",{coupon_id:coupon_id},function(data){
    113. if(data.return_code == 200){
    114. location.href="{:U('addon/WeiuidDeit/Mobile/shop_order_index/couponid/"+data.coupon_id+"')}";
    115. }else if(data.code == 400){
    116. alert('此优惠卷不满足条件')
    117. }
    118. });
    119. })
    120. /*
    121. 点击确认订单判断用户时候有优惠卷,如果有,判断优惠卷的使用条件
    122. author:咔咔
    123. time:2018.6.1
    124. */
    125. // 优惠卷的选择
    126. public function couponselect()
    127. {
    128. // 获取到未使用的优惠卷id
    129. $coupon_id = I('coupon_id');
    130. // 查询未使用的优惠卷信息
    131. $foodcouponreceive_data = D('foodcouponreceive')->where([
    132. 'id'=>$coupon_id
    133. ])->find();
    134. // 根据未使用的优惠卷id,查询优惠卷表,查出优惠卷信息
    135. $foodcoupon_data = D('foodcoupon')->where([
    136. 'id'=>$foodcouponreceive_data['foodcoupon_id']
    137. ])->find();
    138. // 查询成功,判断优惠条件
    139. if($foodcoupon_data){
    140. // 判断用户选择的优惠卷是否满足条件
    141. if($_SESSION['total'] >= $foodcoupon_data['coupon_condition']){
    142. // 当用户有满足条件的优惠卷时,点击使用的时候,直接将总价减掉
    143. $_SESSION['total'] = $_SESSION['total'] - $foodcoupon_data['coupon_denomination'];
    144. // 当优惠卷满足条件时,存一个标识
    145. $_SESSION['usecoupon'] = 1;
    146. // 如果满足条件会直接跳转到订单页面,显示优惠卷信息
    147. $foodcoupon_data = D('foodcouponreceive')->where([
    148. 'id'=>$coupon_id
    149. ])->setInc('receive_status');
    150. $return['coupon_id'] =$coupon_id;
    151. $return['return_code'] = 200;
    152. $return['return_msg'] = '此优惠卷满足条件';
    153. }else{
    154. $return['code'] = 400;
    155. $return['msg'] = '此优惠卷不满足条件';
    156. }
    157. $this->ajaxReturn($return);
    158. }
    159. }