Explorar o código

开发优惠券相关的功能

jinshihui hai 1 semana
pai
achega
ef153f4309

+ 27 - 7
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/CouponReceiveController.java

@@ -1,6 +1,5 @@
 package com.ylx.web.controller.massage;
 
-
 import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
@@ -12,7 +11,9 @@ import com.ylx.common.core.domain.R;
 import com.ylx.massage.domain.vo.ClaimCouponRequestVO;
 import com.ylx.massage.domain.vo.CouponReceiveVo;
 import com.ylx.massage.domain.vo.CouponReceivesVO;
+import com.ylx.massage.domain.vo.ShareVolutionDetailVO;
 import com.ylx.massage.service.CouponReceiveService;
+import com.ylx.massage.service.ShareVolutionService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
@@ -31,7 +32,7 @@ import java.util.List;
 @RestController
 @RequestMapping("couponReceive")
 @Slf4j
-@Api(tags = {"优惠劵认领"})
+@Api(tags = { "优惠劵认领" })
 public class CouponReceiveController {
     /**
      * 服务对象
@@ -39,6 +40,9 @@ public class CouponReceiveController {
     @Resource
     private CouponReceiveService couponReceiveService;
 
+    @Resource
+    private ShareVolutionService shareVolutionService;
+
     /**
      * 分页查询所有数据
      *
@@ -82,7 +86,7 @@ public class CouponReceiveController {
     }
 
     /**
-     *首页领取优惠卷(批量领取优惠券)
+     * 首页领取优惠卷(批量领取优惠券)
      *
      * @param couponReceive
      * @return R
@@ -99,14 +103,13 @@ public class CouponReceiveController {
         }
     }
 
-
     /**
      * 用户领取劵中心的优惠劵
      *
      * @param claimCouponRequestVO
      * @return R<?>
      */
-    @ApiOperation(value="用户领取劵中心的优惠劵", notes="用户领取劵中心的优惠劵")
+    @ApiOperation(value = "用户领取劵中心的优惠劵", notes = "用户领取劵中心的优惠劵")
     @PostMapping(value = "/receiveCoupon")
     public R<?> receiveCoupon(@Validated @RequestBody ClaimCouponRequestVO claimCouponRequestVO) {
         try {
@@ -135,7 +138,6 @@ public class CouponReceiveController {
         }
     }
 
-
     /**
      * 删除数据
      *
@@ -153,5 +155,23 @@ public class CouponReceiveController {
     public R<List<Coupon>> couponWindows(@RequestBody CouponReceive couponReceive) {
         return R.ok(this.couponReceiveService.couponWindows(couponReceive));
     }
-}
 
+    /**
+     * 通过分享ID查询优惠券详情
+     *
+     * @param shareVolutionId
+     * @return R<ShareVolutionDetailVO>
+     */
+    @GetMapping("getShareVolutionDetail")
+    @ApiOperation("通过分享ID查询优惠券详情")
+    public R<ShareVolutionDetailVO> getShareVolutionDetail(@RequestParam("shareVolutionId") String shareVolutionId) {
+        try {
+            log.info("通过分享ID查询优惠券详情, shareVolutionId: {}", shareVolutionId);
+            return shareVolutionService.getVolutionDetailByShareVolutionId(shareVolutionId);
+        } catch (Exception e) {
+            log.error("通过分享ID查询优惠券详情异常, shareVolutionId: {}", shareVolutionId, e);
+            return R.fail(e.getMessage());
+        }
+    }
+
+}

+ 1 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/TJsController.java

@@ -219,7 +219,7 @@ public class TJsController extends BaseController {
      * @return R 技师列表
      */
     @RequestMapping(value = "wx/select", method = RequestMethod.GET)
-    @Log(title = "微信查询技师列表", businessType = BusinessType.OTHER)
+    //@Log(title = "微信查询技师列表", businessType = BusinessType.OTHER)
     @ApiOperation("微信查询技师列表")
     public R wxSelect(Page<TJs> page, TJsVo js) {
         try {

+ 1 - 1
nightFragrance-admin/src/main/java/com/ylx/web/controller/massage/WeChatController.java

@@ -598,7 +598,7 @@ public class WeChatController extends BaseController {
      */
     @ApiOperation("手机号登录")
     @PostMapping("/phoneLogin")
-    @Log(title = "手机号登录", businessType = BusinessType.OTHER)
+    //@Log(title = "手机号登录", businessType = BusinessType.OTHER)
     public R<WxLoginUser> phoneLogin(@RequestBody PhoneLoginBody phoneLoginBody) {
         String phone = phoneLoginBody.getPhone();
         String code = phoneLoginBody.getCode();

+ 8 - 14
nightFragrance-massage/src/main/java/com/ylx/massage/domain/CouponReceive.java

@@ -33,24 +33,18 @@ public class CouponReceive implements Serializable {
     /** 优惠券id */
     private String couponId;
 
-    /** 优惠券名称 */
-    private String couponName;
-
     /** 优惠券类型 1-兑换券 2-折扣券 3-满减券 */
-    private String couponType;
-
-    /** 优惠券类型描述 */
-    private String couponTypeDesc;
+    private Integer couponType;
 
     /** 领取用户openID */
     private String receiveOpenId;
 
-    /** 领取人手机号 */
-    private String receiveUserPhone;
-
     /** 领取时间 */
     private LocalDateTime receiveTime;
 
+    /** 领取人手机号 */
+    private String receiveUserPhone;
+
     /** 有效期类型 1-固定日期范围, 2-领券后N天有效, 3-长期有效,4-三方赠送 */
     private Integer validityType;
 
@@ -61,19 +55,19 @@ public class CouponReceive implements Serializable {
     private Date expirationTime;
 
     /** 有效天数 */
-    private String validDays;
+    private Integer validDays;
 
     /** 核销使用时间 */
     private LocalDateTime useTime;
 
-    /** 使用状态 0:待使用 1:使用中 2:已完成 */
-    private Integer useState;
+    /** 优惠券状态 0:待使用 1:使用中 2:已完成 */
+    private Integer couponStatus;
 
     /** 关联的订单ID */
     private String orderId;
 
     /** 订单类型 1-服务 2-商品 */
-    private String orderType;
+    private Integer orderType;
 
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)

+ 0 - 1
nightFragrance-massage/src/main/java/com/ylx/massage/domain/TOrder.java

@@ -302,7 +302,6 @@ public class TOrder implements Serializable {
 
     /**
      * 领取优惠券ID
-     * 使用的优惠券记录ID
      */
     @TableField("coupon_receive_id")
     @ApiModelProperty("领取优惠券ID")

+ 3 - 8
nightFragrance-massage/src/main/java/com/ylx/massage/domain/UserCouponRelation.java

@@ -31,13 +31,13 @@ public class UserCouponRelation implements Serializable {
     private String imageUrl;
 
     /** 优惠券类型 1-兑换券 2-折扣券 3-满减券 */
-    private String couponType;
+    private Integer couponType;
 
     /** 优惠券状态 0:待使用,1:使用中 2:已使用 3:已失效 */
-    private Integer status;
+    private Integer couponStatus;
 
     /** 使用有限期类型 1.用户领取后生效 2.三方用户赠送时间起 3.固定时间段 4.长期可用 */
-    private String useType;
+    private Integer validityType;
 
     /** 开始时间 */
     private LocalDate startTime;
@@ -114,15 +114,10 @@ public class UserCouponRelation implements Serializable {
     /** 商户名称 */
     private String storeName;
 
-    /** 创建者 */
-    private String createBy;
-
     /** 创建时间 */
     @TableField(fill = FieldFill.INSERT)
     private LocalDateTime createTime;
 
-    /** 修改者 */
-    private String updateBy;
 
     /** 修改时间 */
     @TableField(fill = FieldFill.INSERT_UPDATE)

+ 7 - 2
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/CouponReceiveVo.java

@@ -43,12 +43,17 @@ public class CouponReceiveVo{
     /**
      * 优惠券类型(1-兑换券, 2-折扣券, 3-满减券)
      */
-    private String couponType;
+    private Integer couponType;
+
+    /**
+     * 优惠券状态 0:待使用,1:使用中 2:已使用 3:已失效
+     */
+    private Integer couponStatus;
 
     /**
      * 有效期类型: 1-固定日期范围 2-领券后N天有效 3-长期有效 4-三方赠送
      */
-    private String useType;
+    private Integer validityType;
 
     /**
      * 开始时间

+ 167 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/domain/vo/ShareVolutionDetailVO.java

@@ -0,0 +1,167 @@
+package com.ylx.massage.domain.vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel(value = "分享优惠券详情响应VO")
+public class ShareVolutionDetailVO {
+    /**
+     * 分享用户ID
+     */
+    @ApiModelProperty(value = "分享用户ID")
+    private String userId;
+
+    /**
+     * 模板ID(优惠券ID)
+     */
+    @ApiModelProperty(value = "模板ID")
+    private String templateId;
+
+    /**
+     * 优惠券名称
+     */
+    @ApiModelProperty(value = "优惠券名称")
+    private String name;
+
+    /**
+     * 优惠券图片URL
+     */
+    @ApiModelProperty(value = "图片URL")
+    private String imageUrl;
+
+    /**
+     * 优惠券类型
+     */
+    @ApiModelProperty(value = "类型")
+    private String type;
+
+    /**
+     * 优惠券类型描述
+     */
+    @ApiModelProperty(value = "优惠券类型描述")
+    private String couponTypeDesc;
+
+    /**
+     * 关联类型
+     */
+    @ApiModelProperty(value = "关联类型")
+    private String relatedType;
+
+    /**
+     * 关联ID
+     */
+    @ApiModelProperty(value = "关联ID")
+    private String relatedId;
+
+    /**
+     * 关联名称
+     */
+    @ApiModelProperty(value = "关联名称")
+    private String relatedName;
+
+    /**
+     * 门槛金额: 满X元生效,适用于满减/折扣
+     */
+    @ApiModelProperty(value = "门槛金额: 满X元生效,适用于满减/折扣")
+    private BigDecimal ruleMinSpendAmount;
+
+    /**
+     * 折扣率: 如0.80表示8折,仅折扣券使用
+     */
+    @ApiModelProperty(value = "折扣率")
+    private BigDecimal ruleDiscountRate;
+
+    /**
+     * 折扣封顶金额: 折扣最高优惠
+     */
+    @ApiModelProperty(value = "折扣上限金额")
+    private BigDecimal ruleDiscountCapAmount;
+
+    /**
+     * 满减金额: 仅满减券使用
+     */
+    @ApiModelProperty(value = "减免金额")
+    private BigDecimal ruleReductionAmount;
+
+    /**
+    * 有效期类型: 1-固定日期范围, 2-领券后N天有效, 3-长期有效,4-三方赠送
+     */
+    @ApiModelProperty(value = "有效期类型")
+    private String validityType;
+
+    /**
+     * 有效期开始时间
+     */
+    @ApiModelProperty(value = "有效期开始时间")
+    private String validStartTime;
+
+    /**
+     * 有效期结束时间
+     */
+    @ApiModelProperty(value = "有效期结束时间")
+    private String validEndTime;
+
+    /**
+     * 有效天数
+     */
+    @ApiModelProperty(value = "有效天数")
+    private String validDays;
+
+    /**
+     * 平台来源
+     */
+    @ApiModelProperty(value = "平台来源")
+    private String platformSource;
+
+    /**
+     * 所在地区码
+     */
+    @ApiModelProperty(value = "所在地区码")
+    private String country;
+
+    /**
+     * 所在地区全部码
+     */
+    @ApiModelProperty(value = "全国")
+    private String countryAll;
+
+    /**
+     * 所在地区
+     */
+    @ApiModelProperty(value = "所在地区")
+    private String locality;
+
+    /**
+     * 商户ID
+     */
+    @ApiModelProperty(value = "商户ID")
+    private String merchantId;
+
+    /**
+     * 商户名称
+     */
+    @ApiModelProperty(value = "商户名称")
+    private String storeName;
+
+    /**
+     * 成本价
+     */
+    @ApiModelProperty(value = "成本价")
+    private BigDecimal costPrice;
+
+    /**
+     * 商品ID
+     */
+    @ApiModelProperty(value = "商品ID")
+    private String productId;
+
+    /**
+     * 商品名称
+     */
+    @ApiModelProperty(value = "商品名称")
+    private String productName;
+}

+ 9 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/ShareVolutionService.java

@@ -0,0 +1,9 @@
+package com.ylx.massage.service;
+
+import com.ylx.common.core.domain.R;
+import com.ylx.massage.domain.vo.ShareVolutionDetailVO;
+
+public interface ShareVolutionService {
+
+    R<ShareVolutionDetailVO> getVolutionDetailByShareVolutionId(String shareVolutionId);
+}

+ 10 - 12
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/CouponReceiveServiceImpl.java

@@ -101,7 +101,7 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
             couponRec.setReceiveOpenId(couponReceive.getOpenId());
             /*couponRec.setDeptId(coupon.getDeptId());
             couponRec.setDeptName(coupon.getDeptName());*/
-            couponRec.setUseState(0);
+            couponRec.setCouponStatus(0);
             couponRec.setExpirationTime(DateTimeUtils.addDays(new Date(), coupon.getTermDays()));
             couponReceives.add(couponRec);
         });
@@ -127,9 +127,7 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         CouponReceive couponReceive = new CouponReceive();
         couponReceive.setIssuerCouponId(claimCouponRequestVO.getUserId());
         couponReceive.setCouponId(claimCouponRequestVO.getTemplateId());
-        couponReceive.setCouponName(claimCouponRequestVO.getName());
-        couponReceive.setCouponType(claimCouponRequestVO.getType());
-        couponReceive.setCouponTypeDesc(claimCouponRequestVO.getCouponTypeDesc());
+        couponReceive.setCouponType(Integer.parseInt(claimCouponRequestVO.getType()));
         couponReceive.setReceiveOpenId(wxLoginUser.getCOpenid());
         couponReceive.setReceiveTime(LocalDateTime.now());
         //设置领取人手机号
@@ -146,7 +144,7 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
             //领券后N天有效
             case "2":
                 couponReceive.setValidityType(2);
-                couponReceive.setValidDays(claimCouponRequestVO.getValidDays());
+                couponReceive.setValidDays(Integer.parseInt(claimCouponRequestVO.getValidDays()));
                 break;
             //长期有效
             case "3":
@@ -156,7 +154,7 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
                 throw new IllegalArgumentException("有效期类型错误");
         }
         // 设置使用状态:待使用
-        couponReceive.setUseState(0);
+        couponReceive.setCouponStatus(0);
         int insert = couponReceiveMapper.insert(couponReceive);
         if (insert == 0) {
             return R.fail("优惠券领取失败");
@@ -168,24 +166,24 @@ public class CouponReceiveServiceImpl extends ServiceImpl<CouponReceiveMapper, C
         userCouponRelation.setCouponId(claimCouponRequestVO.getTemplateId());
         userCouponRelation.setCouponName(claimCouponRequestVO.getName());
         userCouponRelation.setImageUrl(claimCouponRequestVO.getImageUrl());
-        userCouponRelation.setCouponType(claimCouponRequestVO.getType());
+        userCouponRelation.setCouponType(Integer.parseInt(claimCouponRequestVO.getType()));
         //设置状态为未使用
-        userCouponRelation.setStatus(0);
+        userCouponRelation.setCouponStatus(0);
         switch (validityType) {
             // 固定日期范围
             case "1":
-                userCouponRelation.setUseType(validityType);
+                userCouponRelation.setValidityType(Integer.parseInt(validityType));
                 couponReceive.setValidStartTime(claimCouponRequestVO.getValidStartTime());
                 couponReceive.setExpirationTime(claimCouponRequestVO.getValidEndTime());
                 break;
             //领券后N天有效
             case "2":
-                userCouponRelation.setUseType(validityType);
-                couponReceive.setValidDays(claimCouponRequestVO.getValidDays());
+                userCouponRelation.setValidityType(Integer.parseInt(validityType));
+                couponReceive.setValidDays(Integer.parseInt(claimCouponRequestVO.getValidDays()));
                 break;
             //长期有效
             case "3":
-                userCouponRelation.setUseType(validityType);
+                userCouponRelation.setValidityType(Integer.parseInt(validityType));
                 break;
             default:
                 throw new IllegalArgumentException("有效期类型错误");

+ 63 - 0
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/ShareVolutionServiceImpl.java

@@ -0,0 +1,63 @@
+package com.ylx.massage.service.impl;
+
+import cn.hutool.core.util.StrUtil;
+import cn.hutool.http.HttpUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONObject;
+import com.ylx.common.core.domain.R;
+import com.ylx.common.exception.ServiceException;
+import com.ylx.massage.domain.vo.ShareVolutionDetailVO;
+import com.ylx.massage.service.ShareVolutionService;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Slf4j
+@Service
+public class ShareVolutionServiceImpl implements ShareVolutionService {
+
+    @Value("${remote.local-live.base-url}")
+    private String localLiveBaseUrl;
+
+    private static final String GET_VOLUTION_DETAIL_PATH = "/customer/volution/getVolutionDetailByShareVolutionId";
+
+    private static final int DEFAULT_TIMEOUT = 5000;
+
+    @Override
+    public R<ShareVolutionDetailVO> getVolutionDetailByShareVolutionId(String shareVolutionId) {
+        if (StrUtil.isBlank(shareVolutionId)) {
+            return R.fail("分享优惠券ID不能为空");
+        }
+
+        try {
+            String url = localLiveBaseUrl + GET_VOLUTION_DETAIL_PATH + "?shareVolutionId=" + shareVolutionId;
+            log.info("调用远程接口查询分享优惠券详情, URL: {}, shareVolutionId: {}", url, shareVolutionId);
+
+            String result = HttpUtil.get(url, DEFAULT_TIMEOUT);
+            if (StrUtil.isEmpty(result)) {
+                log.error("调用远程接口返回为空, shareVolutionId: {}", shareVolutionId);
+                return R.fail("查询分享优惠券详情失败");
+            }
+            log.info("调用远程接口返回结果: {}", result);
+
+            JSONObject jsonObject = JSON.parseObject(result);
+            if (jsonObject == null) {
+                return R.fail("解析分享优惠券详情失败");
+            }
+            Boolean success = jsonObject.getBoolean("success");
+            if (success == null || !success) {
+                String message = jsonObject.getString("message");
+                return R.fail(StrUtil.isNotBlank(message) ? message : "查询分享优惠券详情失败");
+            }
+            JSONObject resultData = jsonObject.getJSONObject("result");
+            if (resultData == null) {
+                return R.fail("分享优惠券详情数据为空");
+            }
+            ShareVolutionDetailVO detailVO = JSON.parseObject(resultData.toJSONString(), ShareVolutionDetailVO.class);
+            return R.ok(detailVO);
+        } catch (Exception e) {
+            log.error("调用远程接口异常, shareVolutionId: {}", shareVolutionId, e);
+            throw new ServiceException("查询分享优惠券详情异常: " + e.getMessage());
+        }
+    }
+}

+ 3 - 4
nightFragrance-massage/src/main/java/com/ylx/massage/service/impl/TOrderServiceImpl.java

@@ -630,6 +630,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         if (user.getdBalance().compareTo(orderNew.getTotalPrice()) < MassageConstants.INTEGER_ZERO) {
             throw new ServiceException("账户金额不够请充值");
         } else {
+            //余额支付
             orderPayManage(user, orderNew);
             //添加待接单消息通知(技师侧)
             orderNotificationService.sendPendingRemindNotification(orderNew);
@@ -670,7 +671,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         if (StringUtils.isNotBlank(orderNew.getCouponReceiveId())) {
             CouponReceive couponReceive = new CouponReceive();
             couponReceive.setId(orderNew.getCouponReceiveId());
-            couponReceive.setUseState(MassageConstants.INTEGER_TWO);
+            couponReceive.setCouponStatus(MassageConstants.INTEGER_TWO);
             if (!couponReceiveService.updateById(couponReceive)) {
                 log.error("优惠券状态更新失败id:,{}", orderNew.getCouponReceiveId());
             }
@@ -729,8 +730,6 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         updateJs(orderNew);
         // 更新订单的信息
         updateById(orderParam);
-        //
-        //this.newOrderNotification(orderNew);
 
         //添加待接单消息通知(技师侧)
         orderNotificationService.sendPendingRemindNotification(orderNew);
@@ -786,7 +785,7 @@ public class TOrderServiceImpl extends ServiceImpl<TOrderMapper, TOrder> impleme
         //退优惠卷
         if (StringUtils.isNotBlank(orderNew.getCouponReceiveId())) {
             CouponReceive couponReceive = couponReceiveService.getById(orderNew.getCouponReceiveId());
-            couponReceive.setUseState(MassageConstants.INTEGER_ZERO);
+            couponReceive.setCouponStatus(MassageConstants.INTEGER_ZERO);
             couponReceiveService.updateById(couponReceive);
         }
         log.info("余额支付退款user:{}", user);

+ 4 - 4
nightFragrance-massage/src/main/resources/mapper/massage/CouponReceiveMapper.xml

@@ -8,7 +8,7 @@
         <result property="couponId" column="coupon_id" jdbcType="VARCHAR"/>
         <result property="couponName" column="coupon_name" jdbcType="VARCHAR"/>
         <result property="couponType" column="coupon_type" jdbcType="INTEGER"/>
-        <result property="useType" column="use_type" jdbcType="VARCHAR"/>
+        <result property="validityType" column="validity_type" jdbcType="INTEGER"/>
         <result property="validStartTime" column="valid_start_time" jdbcType="TIMESTAMP"/>
         <result property="expirationTime" column="expiration_time" jdbcType="TIMESTAMP"/>
         <result property="ruleMinSpendAmount" column="rule_min_spend_amount" jdbcType="DECIMAL"/>
@@ -18,8 +18,8 @@
     </resultMap>
 
     <sql id="selectCouponReceiveVo">
-        a.id, a.receive_open_id, a.coupon_id, a.valid_start_time,a.expiration_time, a.create_time, a.update_time, a.is_delete,a.use_state,
-         b.coupon_name, b.image_url,b.coupon_type,b.use_type,b.rule_min_spend_amount,b.rule_discount_rate,b.rule_discount_cap_amount,b.rule_reduction_amount,
+        a.id, a.receive_open_id, a.coupon_id, a.validity_type,a.valid_start_time,a.expiration_time,a.coupon_status,a.create_time, a.update_time, a.is_delete,
+         b.coupon_name, b.image_url,b.coupon_type,b.rule_min_spend_amount,b.rule_discount_rate,b.rule_discount_cap_amount,b.rule_reduction_amount,
             b.related_type,b.related_id,b.related_name
     </sql>
 
@@ -69,7 +69,7 @@
         FROM coupon_receive a
         LEFT JOIN user_coupon_relation b ON a.coupon_id = b.coupon_id
         WHERE a.is_delete = 0
-        AND a.use_state = 0
+        AND a.coupon_status = 0
         and a.receive_open_id = #{openid}
     </select>