From ac3e9a7f0b21fb630049f9e191bd760eefd21467 Mon Sep 17 00:00:00 2001
From: 无关风月 <443237572@qq.com>
Date: 星期六, 16 八月 2025 18:04:38 +0800
Subject: [PATCH] 管理后台会员管理
---
cloud-server-account/src/main/java/com/dsh/account/entity/VipPayment.java | 15
cloud-server-activity/src/main/java/com/dsh/activity/model/GrantCoupon.java | 40
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipController.java | 450 +++++++
cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_add.html | 170 ++
cloud-server-account/src/main/java/com/dsh/account/vo/CouponVipResp.java | 43
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipResp.java | 43
cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java | 3
cloud-server-account/src/main/java/com/dsh/account/entity/Vip.java | 109 +
cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/TCoupon.html | 66 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TVipServiceImpl.java | 33
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponStore.java | 52
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Vip.java | 107 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java | 18
cloud-server-account/src/main/java/com/dsh/account/vo/VipPaymentVO.java | 25
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Protocol.java | 2
cloud-server-management/src/main/resources/mapper/VipMapper.xml | 16
cloud-server-activity/src/main/java/com/dsh/activity/service/VipDetailService.java | 18
cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/Coupon.java | 11
cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java | 11
cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java | 122 +
cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java | 84 +
cloud-server-activity/src/main/java/com/dsh/activity/service/impl/VipDetailServiceImpl.java | 19
cloud-server-activity/src/main/java/com/dsh/activity/mapper/VipDetailMapper.java | 23
cloud-server-management/src/main/java/com/dsh/course/mapper/TVipMapper.java | 26
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipVo.java | 43
cloud-server-management/src/main/webapp/static/modular/system/vip/TCoupon.js | 335 +++++
cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java | 5
cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java | 56
cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/TicketDetailVO.java | 15
cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip.html | 52
cloud-server-management/src/main/webapp/static/modular/system/vip/vip.js | 557 ++++++++
cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java | 114 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TicketVipResp.java | 22
cloud-server-account/src/main/java/com/dsh/account/vo/TicketVipResp.java | 22
cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/GrantCoupon.java | 42
cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java | 65 +
cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java | 88 +
cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IVipService.java | 18
cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/CouponListOfSearch.java | 1
cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_edit.html | 191 +++
cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java | 5
cloud-server-account/src/main/java/com/dsh/account/vo/ConponJsonRuleModel.java | 25
cloud-server-management/src/main/webapp/static/modular/system/vip/vip_info.js | 278 ++++
cloud-server-account/src/main/java/com/dsh/account/service/IVipPaymentService.java | 2
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ConponJsonRuleModel.java | 25
cloud-server-account/src/main/java/com/dsh/account/feignclient/other/VipClient.java | 28
cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_detail.html | 184 ++
47 files changed, 3,608 insertions(+), 71 deletions(-)
diff --git a/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java b/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
index 57ad510..c3f74a1 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/controller/AppUserController.java
@@ -3,16 +3,13 @@
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.extension.api.R;
import com.dsh.account.dto.BindDto;
import com.dsh.account.dto.IntroduceUserQuery;
import com.dsh.account.dto.SelectDto;
import com.dsh.account.dto.UpdateInfoDto;
-import com.dsh.account.entity.IntroduceUser;
-import com.dsh.account.entity.TAppGift;
-import com.dsh.account.entity.TAppUser;
-import com.dsh.account.entity.TCourseInfoRecord;
-import com.dsh.account.entity.TStudent;
-import com.dsh.account.entity.UserIntegralChanges;
+import com.dsh.account.entity.*;
+import com.dsh.account.feignclient.other.VipClient;
import com.dsh.account.model.AddAppUserVo;
import com.dsh.account.model.AdvertisementChangeStateDTO;
import com.dsh.account.model.AppUserByNameAndPhoneDTO;
@@ -34,6 +31,7 @@
import com.dsh.account.util.TokenUtil;
import com.dsh.account.util.ToolUtil;
import com.dsh.account.util.wx.WxV3PayConfig;
+import com.dsh.account.vo.VipPaymentVO;
import com.wechat.pay.contrib.apache.httpclient.util.AesUtil;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
@@ -68,6 +66,8 @@
@Autowired
private TAppUserService appUserService;
+ @Autowired
+ private VipClient vipClient;
@Autowired
private PayMoneyUtil payMoneyUtil;
@@ -438,9 +438,10 @@
@ApiOperation(value = "购买年度会员", tags = {"APP-成为会员"})
@ApiImplicitParams({
@ApiImplicitParam(value = "支付方式(1=微信,2=支付宝)", name = "payType", dataType = "int", required = true),
+ @ApiImplicitParam(value = "会员卡id", name = "id", dataType = "int", required = true),
@ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
})
- public ResultUtil addVipPayment(Integer payType) {
+ public ResultUtil addVipPayment(Integer payType,Integer id) {
if (ToolUtil.isEmpty(payType)) {
return ResultUtil.paranErr("payType");
}
@@ -449,59 +450,84 @@
if (null == uid) {
return ResultUtil.tokenErr();
}
- return vipPaymentService.addVipPayment(uid, payType);
+ return vipPaymentService.addVipPayment(uid, payType, id);
} catch (Exception e) {
e.printStackTrace();
return ResultUtil.runErr();
}
}
-
-
- /**
- * 购买年度会员支付微信回调V3版本回调
- *
- * @param request
- * @param response
- */
@ResponseBody
- @PostMapping("/base/appUser/addVipPaymentWeChatCallback1")
- public void addVipPaymentWeChatCallback1(HttpServletRequest request, HttpServletResponse response) {
- try {
- System.err.println("微信回调");
- System.err.println("请求" + request);
- BufferedReader reader = request.getReader();
- String string1 = reader.toString();
- System.err.println("请求reader" + string1);
- StringBuilder requestBody = new StringBuilder();
- String line;
- while ((line = reader.readLine()) != null) {
- requestBody.append(line);
- }
- System.err.println("全部请求体" + requestBody);
- JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
- JSONObject resource = jsonObject.getJSONObject("resource");
+ @PostMapping("/api/appUser/vipPayment")
+ @ApiOperation(value = "页面数据展示", tags = {"APP-成为会员"})
+ @ApiImplicitParams({
+ @ApiImplicitParam(name = "Authorization", value = "用户token(Bearer +token)", required = true, dataType = "String", paramType = "header", defaultValue = "Bearer eyJhbGciOiJIUzUxMiJ9.....")
+ })
+ public ResultUtil<VipPaymentVO> vipPayment() {
- AesUtil aesUtil = new AesUtil(WxV3PayConfig.apiV3Key.getBytes(StandardCharsets.UTF_8));
- String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
- resource.getString("ciphertext"));
- System.err.println("微信解密的字符串信息" + decryptedData);
- JSONObject jsonInfo = (JSONObject) JSONObject.parse(decryptedData);
- String out_trade_no = jsonInfo.getString("out_trade_no");
- String transaction_id = jsonInfo.getString("transaction_id");
- String trade_state = jsonInfo.getString("trade_state");
- if (trade_state.equals("SUCCESS")) {
- ResultUtil resultUtil = vipPaymentService.addVipPaymentCallback(out_trade_no, transaction_id);
- if (resultUtil.getCode() == 200) {
- PrintWriter out = response.getWriter();
- out.write("SUCCESS");
- out.flush();
- out.close();
- }
+ try {
+ Integer uid = tokenUtil.getUserIdFormRedis();
+ if (null == uid) {
+ return ResultUtil.tokenErr();
}
+ TAppUser appUser = appUserService.getById(uid);
+ VipPaymentVO res = new VipPaymentVO();
+ res.setHeadImg(appUser.getHeadImg());
+ res.setName(appUser.getName());
+ res.setIsVip(appUser.getIsVip());
+ List<Vip> vips = vipClient.listAll();
+ res.setVipList(vips);
} catch (Exception e) {
e.printStackTrace();
+ return ResultUtil.runErr();
}
+ return ResultUtil.success();
}
+//
+// /**
+// * 购买年度会员支付微信回调V3版本回调
+// *
+// * @param request
+// * @param response
+// */
+// @ResponseBody
+// @PostMapping("/base/appUser/addVipPaymentWeChatCallback1")
+// public void addVipPaymentWeChatCallback1(HttpServletRequest request, HttpServletResponse response) {
+// try {
+// System.err.println("微信回调");
+// System.err.println("请求" + request);
+// BufferedReader reader = request.getReader();
+// String string1 = reader.toString();
+// System.err.println("请求reader" + string1);
+// StringBuilder requestBody = new StringBuilder();
+// String line;
+// while ((line = reader.readLine()) != null) {
+// requestBody.append(line);
+// }
+// System.err.println("全部请求体" + requestBody);
+// JSONObject jsonObject = JSONObject.parseObject(requestBody.toString());
+// JSONObject resource = jsonObject.getJSONObject("resource");
+//
+// AesUtil aesUtil = new AesUtil(WxV3PayConfig.apiV3Key.getBytes(StandardCharsets.UTF_8));
+// String decryptedData = aesUtil.decryptToString(resource.getString("associated_data").getBytes(StandardCharsets.UTF_8), resource.getString("nonce").getBytes(StandardCharsets.UTF_8),
+// resource.getString("ciphertext"));
+// System.err.println("微信解密的字符串信息" + decryptedData);
+// JSONObject jsonInfo = (JSONObject) JSONObject.parse(decryptedData);
+// String out_trade_no = jsonInfo.getString("out_trade_no");
+// String transaction_id = jsonInfo.getString("transaction_id");
+// String trade_state = jsonInfo.getString("trade_state");
+// if (trade_state.equals("SUCCESS")) {
+// ResultUtil resultUtil = vipPaymentService.addVipPaymentCallback(out_trade_no, transaction_id);
+// if (resultUtil.getCode() == 200) {
+// PrintWriter out = response.getWriter();
+// out.write("SUCCESS");
+// out.flush();
+// out.close();
+// }
+// }
+// } catch (Exception e) {
+// e.printStackTrace();
+// }
+// }
/**
* 购买年度会员支付微信回调
*
diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/Vip.java b/cloud-server-account/src/main/java/com/dsh/account/entity/Vip.java
new file mode 100644
index 0000000..80ca82e
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/entity/Vip.java
@@ -0,0 +1,109 @@
+package com.dsh.account.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.dsh.account.vo.CouponVipResp;
+import com.dsh.account.vo.TicketVipResp;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 会员管理
+ */
+@TableName("t_vip")
+@Data
+@ApiModel(description = "会员")
+public class Vip {
+ /**
+ * 主键id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ @TableField("id")
+ @ApiModelProperty(value = "主键id")
+ private Integer id;
+
+ /**
+ * 会员名称
+ */
+ @TableField("vipName")
+ @ApiModelProperty(value = "会员名称")
+ private String vipName;
+
+ /**
+ * 会员时长类型 1天 2月 3年
+ */
+ @TableField("timeType")
+ @ApiModelProperty(value = "会员时长类型 1天 2月 3年")
+ private Integer timeType;
+
+ /**
+ * 会员时长
+ */
+ @TableField("time")
+ @ApiModelProperty(value = "会员时长数量 对应会员时长类型 x天 x月 x年")
+ private Integer time;
+
+ /**
+ * 会员价格
+ */
+ @TableField("price")
+ @ApiModelProperty(value = "会员价格")
+ private BigDecimal price;
+
+ /**
+ * 状态 1上架2下架
+ */
+ @TableField("status")
+ @ApiModelProperty(value = "状态 1上架2下架")
+ private Integer status;
+
+ /**
+ * 添加时间
+ */
+ @TableField("insertTime")
+ @ApiModelProperty(value = "添加时间")
+ private Date insertTime;
+ /**
+ * 添加时间
+ */
+ @TableField("couponJson")
+ @ApiModelProperty(value = "优惠券json[{\n" +
+ "\t\"id\": \"1\",\n" +
+ "\t\"value\": \"1\"\n" +
+ "}, {\n" +
+ "\t\"id\": \"2\",\n" +
+ "\t\"value\": \"1\"\n" +
+ "}\n" +
+ "}]")
+ private String couponJson;
+ /**
+ * 添加时间
+ */
+ @TableField("ticketJson")
+ @ApiModelProperty(value = "门票json门票json[{\n" +
+ "\t\"name\": \"门票名称\",\n" +
+ "\t\"time\": \"1\",\n" +
+ "\"count\": \"1\",\n" +
+ "}]")
+ private String ticketJson;
+
+ /**
+ * 会员优惠券权益
+ */
+ @TableField(exist = false)
+ @ApiModelProperty(value = "会员优惠券权益")
+ private List<CouponVipResp> couponList;
+ /**
+ * 会员门票权益
+ */
+ @TableField(exist = false)
+ @ApiModelProperty(value = "会员门票权益")
+ private List<TicketVipResp> ticketList;
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/entity/VipPayment.java b/cloud-server-account/src/main/java/com/dsh/account/entity/VipPayment.java
index 6e633c7..c2257b7 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/entity/VipPayment.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/entity/VipPayment.java
@@ -64,11 +64,26 @@
@TableField("state")
private Integer state;
/**
+ * 会员id
+ */
+ @TableField("vipId")
+ private Integer vipId;
+ /**
* 添加时间
*/
@TableField("insertTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insertTime;
+ /**
+ * 购买会员时 获得的门票权益
+ */
+ @TableField("ticketJson")
+ private String ticketJson;
+ /**
+ * 购买会员时 获得的优惠券权益
+ */
+ @TableField("couponJson")
+ private String couponJson;
public static String CODE() {
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
index 44f1a3a..6bc4e53 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/UserConponClient.java
@@ -1,6 +1,7 @@
package com.dsh.account.feignclient.activity;
import com.dsh.account.feignclient.activity.model.CommodityRequest;
+import com.dsh.account.feignclient.activity.model.GrantCoupon;
import com.dsh.account.feignclient.activity.model.UserCoupon;
import com.dsh.account.model.dto.Coupon;
import com.dsh.account.model.vo.sourceDetail.CouponStuAvailableVo;
@@ -43,4 +44,8 @@
@PostMapping("/userCoupon/queryCounts1")
Integer queryCounts1(@RequestBody List<Integer> queryIds);
+
+ @PostMapping("/userCoupon/grantCoupon")
+ void grantCoupon(@RequestBody GrantCoupon grantCoupon);
+
}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/GrantCoupon.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/GrantCoupon.java
new file mode 100644
index 0000000..80b6784
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/activity/model/GrantCoupon.java
@@ -0,0 +1,42 @@
+package com.dsh.account.feignclient.activity.model;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * <p>
+ * 开会员送券
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-29
+ */
+@Data
+public class GrantCoupon {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 优惠券json
+ */
+ private String couponJson;
+ /**
+ * 优惠券json
+ */
+ private String ticketJson;
+ /**
+ * 用户id
+ */
+ private Integer userId;
+ /**
+ * vipId
+ */
+ private Integer vipId;
+ /**
+ * 会员支付记录id
+ */
+ private Integer vipPaymentId;
+
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/VipClient.java b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/VipClient.java
new file mode 100644
index 0000000..c85a845
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/feignclient/other/VipClient.java
@@ -0,0 +1,28 @@
+package com.dsh.account.feignclient.other;
+
+import com.dsh.account.entity.OperatorUser;
+import com.dsh.account.entity.User;
+import com.dsh.account.entity.Vip;
+import com.dsh.account.feignclient.competition.model.BillingDataRequestVo;
+import com.dsh.account.feignclient.other.model.SiteBooking;
+import com.dsh.account.model.RequestOfTypeVo;
+import com.dsh.account.model.vo.exploreDetail.SiteVo;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.ResponseBody;
+
+import java.util.List;
+import java.util.Map;
+
+
+@FeignClient("mb-cloud-other")
+public interface VipClient {
+
+
+ @PostMapping("/vip/listAll")
+ List<Vip> listAll();
+ @PostMapping("/vip/getVipByIds")
+ List<Vip> getVipByIds(@RequestBody String ids);
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/IVipPaymentService.java b/cloud-server-account/src/main/java/com/dsh/account/service/IVipPaymentService.java
index 31bea44..2a30fac 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/IVipPaymentService.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/IVipPaymentService.java
@@ -22,7 +22,7 @@
* @return
* @throws Exception
*/
- ResultUtil addVipPayment(Integer uid, Integer payType) throws Exception;
+ ResultUtil addVipPayment(Integer uid, Integer payType,Integer vipId) throws Exception;
/**
diff --git a/cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java b/cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java
index 53dfda7..55b5a3d 100644
--- a/cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java
+++ b/cloud-server-account/src/main/java/com/dsh/account/service/impl/VipPaymentServiceImpl.java
@@ -1,26 +1,37 @@
package com.dsh.account.service.impl;
import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
import com.alipay.api.response.AlipayTradeQueryResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.dsh.account.entity.TAppUser;
+import com.dsh.account.entity.Vip;
import com.dsh.account.entity.VipPayment;
import com.dsh.account.feignclient.activity.UserConponClient;
+import com.dsh.account.feignclient.activity.UserCouponPaymentClient;
+import com.dsh.account.feignclient.activity.model.GrantCoupon;
+import com.dsh.account.feignclient.other.VipClient;
import com.dsh.account.mapper.VipPaymentMapper;
import com.dsh.account.model.IncomeQuery;
import com.dsh.account.service.IVipPaymentService;
import com.dsh.account.service.TAppUserService;
+import com.dsh.account.util.DateUtil;
import com.dsh.account.util.PayMoneyUtil;
import com.dsh.account.util.RedisUtil;
import com.dsh.account.util.ResultUtil;
import com.dsh.account.util.wx.WxV3PayConfig;
+import com.dsh.account.vo.CouponVipResp;
+import org.apache.commons.lang.time.DateUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;
import javax.annotation.Resource;
import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.ZoneId;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
@@ -44,6 +55,9 @@
@Autowired
private RedisUtil redisUtil;
+ @Autowired
+ private VipClient vipClient;
+
/**
@@ -54,14 +68,26 @@
* @throws Exception
*/
@Override
- public ResultUtil addVipPayment(Integer uid, Integer payType) throws Exception {
+ public ResultUtil addVipPayment(Integer uid, Integer payType, Integer vipId) throws Exception {
+ if (vipId == null) {
+ return ResultUtil.error("会员id未传参");
+ }
+ List<Vip> vipByIds = vipClient.getVipByIds(vipId.toString());
+ if (vipByIds.isEmpty()) {
+ return ResultUtil.error("会员不存在");
+ }
+ Vip vip = vipByIds.get(0);
VipPayment vipPayment = new VipPayment();
vipPayment.setCode(VipPayment.CODE());
- vipPayment.setAmount(0.01D);
+ vipPayment.setAmount(vip.getPrice().doubleValue());
vipPayment.setAppUserId(uid);
vipPayment.setInsertTime(new Date());
vipPayment.setPayStatus(1);
vipPayment.setState(1);
+ vipPayment.setPayType(payType);
+ vipPayment.setVipId(vip.getId());
+ vipPayment.setCouponJson(vip.getCouponJson());
+ vipPayment.setTicketJson(vip.getTicketJson());
this.baseMapper.insert(vipPayment);
if (payType == 1) {//微信
return weixinpay(vipPayment);
@@ -82,7 +108,7 @@
*/
public ResultUtil weixinpay(VipPayment vipPayment) throws Exception {
String code = vipPayment.getCode();
- ResultUtil weixinpay = payMoneyUtil.weixinpay("购买年度会员", "", code, vipPayment.getAmount().toString(),
+ ResultUtil weixinpay = payMoneyUtil.weixinpay("购买会员", "", code, vipPayment.getAmount().toString(),
"/base/appUser/addVipPaymentWeChatCallback", "APP", "");
// ResultUtil weixinpay = payMoneyUtil.weixinpayV3(WxV3PayConfig.smidVx,"购买年度会员",
// code,"/base/appUser/addVipPaymentWeChatCallback1",
@@ -98,14 +124,15 @@
* @throws Exception
*/
private String smid = "2088330203191220";//平台支付宝商户号
+
public ResultUtil alipay(VipPayment vipPayment) throws Exception {
String code = vipPayment.getCode();
String amount = vipPayment.getAmount().toString();
ResultUtil alipay = payMoneyUtil.alipay
- (smid,"购买年度会员", "购买年度会员",
+ (smid, "购买年度会员", "购买年度会员",
vipPayment.getAppUserId() + "",
code, vipPayment.getAmount().toString(),
- "/base/appUser/addVipPaymentAliCallback");
+ "/base/appUser/addVipPaymentAliCallback");
if (alipay.getCode() == 200) {
new Thread(new Runnable() {
@Override
@@ -210,12 +237,51 @@
if (null == vipEndTime) {
vipEndTime = new Date();
}
- Calendar calendar = Calendar.getInstance();
- calendar.setTime(vipEndTime);
- calendar.set(Calendar.YEAR, calendar.get(Calendar.YEAR) + 1);
+ // 将Date类型 转化为LocalDateTime
+ LocalDateTime localDateTime = LocalDateTime.ofInstant(vipEndTime.toInstant(), ZoneId.systemDefault());
+ List<Vip> vipByIds = vipClient.getVipByIds(vipPayment1.getVipId() + "");
+ if (vipByIds.isEmpty()) {
+ return ResultUtil.error("会员不存在");
+ }
+ Vip vip = vipByIds.get(0);
+ Integer time = vip.getTime();
+
+ // 根据time和时间类型 决定给会员加多少天
+ switch (vip.getTimeType()) {
+ case 1:
+ // 天
+ localDateTime.plusDays(time);
+ break;
+ case 2:
+ // 月
+ localDateTime.plusMonths(time);
+
+ break;
+ case 3:
+ // 年
+ localDateTime.plusYears(time);
+ break;
+ }
appUser.setIsVip(1);
- appUser.setVipEndTime(calendar.getTime());
+ Date date = Date.from(localDateTime.atZone(ZoneId.systemDefault()).toInstant());
+ appUser.setVipEndTime(date);
appUserService.updateById(appUser);
+ // 会员权益送券和门票
+ String couponJson = vipPayment1.getCouponJson();
+ GrantCoupon grantCoupon = new GrantCoupon();
+
+ if (StringUtils.hasLength(couponJson)) {
+ grantCoupon.setCouponJson(couponJson);
+ grantCoupon.setUserId(vipPayment1.getAppUserId());
+ grantCoupon.setVipPaymentId(vipPayment1.getId());
+ }
+ String ticketJson = vipPayment1.getTicketJson();
+ if (StringUtils.hasLength(ticketJson)) {
+ grantCoupon.setTicketJson(ticketJson);
+ }
+ // 远程调用 给用户送优惠券和门票
+ userConponClient.granCoupon(grantCoupon);
+
// 注册会员送券 先判断是否有注册送券类型的优惠券 判断优惠券状态 审核是否通过 是否删除 是否在有效期内 是否领取数量达上限
List<Long> longs = userConponClient.queryCouponByUser(appUser.getId());
redisUtil.setStrValue("VIP_P_" + vipPayment1.getAppUserId(), JSON.toJSONString(longs), 3600);
diff --git a/cloud-server-account/src/main/java/com/dsh/account/vo/ConponJsonRuleModel.java b/cloud-server-account/src/main/java/com/dsh/account/vo/ConponJsonRuleModel.java
new file mode 100644
index 0000000..be45c01
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/vo/ConponJsonRuleModel.java
@@ -0,0 +1,25 @@
+package com.dsh.account.vo;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class ConponJsonRuleModel {
+ /**
+ * 条件金额
+ */
+ @ApiModelProperty("条件金额(例如 :满xx可用)")
+ String conditionalAmount;
+ /**
+ * 抵扣金额(代金券 取 该字段)
+ */
+ @ApiModelProperty("抵扣金额(代金券 取 该字段) 例如:¥ xxx")
+ String deductionAmount;
+ /**
+ * 体验券名称
+ */
+ @ApiModelProperty("体验券名称 ")
+ String experienceName;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/vo/CouponVipResp.java b/cloud-server-account/src/main/java/com/dsh/account/vo/CouponVipResp.java
new file mode 100644
index 0000000..964a9cf
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/vo/CouponVipResp.java
@@ -0,0 +1,43 @@
+package com.dsh.account.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("会员权益优惠券列表")
+public class CouponVipResp {
+
+ @ApiModelProperty("优惠券id")
+ private Integer id;
+
+ @ApiModelProperty("优惠券名称")
+ private String name;
+
+ @ApiModelProperty("优惠券类型(1=满减券,2=代金券,3=体验券)")
+ private Integer type;
+
+ @ApiModelProperty("适用范围1全国通用 2指定城市可用 3指定门店可用")
+ private Integer useCondition;
+
+ @ApiModelProperty("适用范围名称")
+ private String available;
+
+ @ApiModelProperty("useCondition = 2,为地址字符串;useCondition = 3,为门店名称+地址字符串")
+ private String cityOrStore;
+
+ @ApiModelProperty("优惠券说明(使用说明)")
+ private String instructionsForUse;
+
+ @ApiModelProperty("金额条件封装")
+ private ConponJsonRuleModel ruleModel;
+
+ @ApiModelProperty("有效时间(2021-05-05)")
+ private String effectiveTime;
+ @ApiModelProperty("数量 张")
+ private Integer count;
+
+
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/vo/TicketVipResp.java b/cloud-server-account/src/main/java/com/dsh/account/vo/TicketVipResp.java
new file mode 100644
index 0000000..b790117
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/vo/TicketVipResp.java
@@ -0,0 +1,22 @@
+package com.dsh.account.vo;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("会员权益门票列表")
+public class TicketVipResp {
+
+
+ @ApiModelProperty("门票名称")
+ private String name;
+
+ @ApiModelProperty("领取后x天有效")
+ private Integer time;
+
+ @ApiModelProperty("数量 张")
+ private Integer count;
+
+}
diff --git a/cloud-server-account/src/main/java/com/dsh/account/vo/VipPaymentVO.java b/cloud-server-account/src/main/java/com/dsh/account/vo/VipPaymentVO.java
new file mode 100644
index 0000000..f1b9917
--- /dev/null
+++ b/cloud-server-account/src/main/java/com/dsh/account/vo/VipPaymentVO.java
@@ -0,0 +1,25 @@
+package com.dsh.account.vo;
+
+import com.dsh.account.entity.Vip;
+import com.dsh.account.entity.VipPayment;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.io.Serializable;
+import java.util.List;
+
+@Data
+@ApiModel("购买会员页面数据返回VO")
+public class VipPaymentVO {
+
+ @ApiModelProperty(value = "头像")
+ private String headImg;
+ @ApiModelProperty(value = "用户名称")
+ private String name;
+ @ApiModelProperty(value = "当前是否会员 0否1是")
+ private Integer isVip;
+ @ApiModelProperty(value = "所有上架的会员卡")
+ private List<Vip> vipList;
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
index 606f194..730d3b4 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
@@ -189,6 +189,31 @@
return null;
}
}
+
+ @ResponseBody
+ @PostMapping("/coupon/queryCouponAll")
+ public List<Coupon> queryCouponAll() {
+ try {
+
+ return couponService.lambdaQuery().eq(Coupon::getState,1)
+ .eq(Coupon::getAuditStatus,2).list();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
+ @ResponseBody
+ @PostMapping("/coupon/queryCouponList")
+ public List<Coupon> queryCouponList() {
+ try {
+
+ return couponService.lambdaQuery().ne(Coupon::getState,3)
+ .eq(Coupon::getAuditStatus,2).list();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return null;
+ }
+ }
@ResponseBody
@PostMapping("/coupon/queryUserCouponById")
public Integer queryUserCouponById(@RequestBody Long id) {
@@ -416,6 +441,26 @@
int count = ucService.count(new LambdaQueryWrapper<UserCoupon>()
.eq(UserCoupon::getCouponId, o));
stringObjectMap.put("hasPickQty", count);
+ }
+ }
+ return mapList;
+ }
+ @ResponseBody
+ @PostMapping("/base/coupon/getCouponListAllOfSearch")
+ public List<Map<String, Object>> getCouponListAllOfSearch(@RequestBody CouponListOfSearch ofSearch) {
+ List<Map<String, Object>> mapList1 = couponService.queryCouponListOfSearch(ofSearch);
+
+ List<Map<String, Object>> mapList = new ArrayList<>();
+ if (ofSearch.getStoreIds() == null) {
+ ArrayList<Integer> list = new ArrayList<>();
+ ofSearch.setStoreIds(list);
+ }
+ mapList = mapList1;
+ if (mapList.size() > 0) {
+ for (Map<String, Object> stringObjectMap : mapList) {
+ Object startTime = stringObjectMap.get("startTime");
+ Object endTime = stringObjectMap.get("endTime");
+ stringObjectMap.put("timeValue", startTime + "至" + endTime);
}
}
return mapList;
@@ -796,12 +841,23 @@
List<CouponCity> list = cityService.list(new LambdaQueryWrapper<CouponCity>().eq(CouponCity::getCouponId, id));
return list;
}
+ @ResponseBody
+ @PostMapping("/base/coupon/queryAllCity")
+ public List<CouponCity> queryAllCity() {
+ List<CouponCity> list = cityService.list(new LambdaQueryWrapper<CouponCity>());
+ return list;
+ }
@ResponseBody
@PostMapping("/base/coupon/queryStore")
public List<Integer> queryStore(@RequestBody Integer id) {
return couStoreService.list(new LambdaQueryWrapper<CouponStore>().eq(CouponStore::getCouponId, id)).stream().map(CouponStore::getStoreId).collect(Collectors.toList());
}
+ @ResponseBody
+ @PostMapping("/base/coupon/queryAllStore")
+ public List<CouponStore> queryAllStore() {
+ return couStoreService.list(new LambdaQueryWrapper<CouponStore>());
+ }
@PostMapping("/base/coupon/listRecord")
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
index a6a67dc..82b47e7 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/PointMercharsController.java
@@ -623,6 +623,8 @@
@Autowired
private UserCouponService userCouponService;
+ @Autowired
+ private VipDetailService vipDetailService;
@PostMapping("/base/pointMerchars/getGoodDetails")
public ProductDetailsVo getGoodDetailsWithId(@RequestBody ProductDetailRequest detailRequest) {
@@ -1039,6 +1041,28 @@
detailsVo.setDetailsResponses(responses);
}
+ // 2.0新增会员权益赠送门票
+ List<VipDetail> list = vipDetailService.lambdaQuery()
+ .eq(VipDetail::getAppUserId, appUserId).eq(VipDetail::getType, 2).list();
+ for (VipDetail vipDetail : list) {
+ ExchangeDetailsResponse detailsResponse = new ExchangeDetailsResponse();
+ // 添加-用于区分会员权益门票
+ detailsResponse.setDetailsId(Long.valueOf("-"+vipDetail.getId()));
+ detailsResponse.setGoodName(vipDetail.getTicketName());
+ detailsResponse.setStartTime(simpleDateFormat.format(vipDetail.getStartTime()));
+ detailsResponse.setEndTime(simpleDateFormat.format(vipDetail.getEndTime()));
+
+
+ detailsResponse.setUseStatus(vipDetail.getStatus());
+ detailsResponse.setGoodType(3);
+ // 表明是会员赠送的门票
+ detailsResponse.setExchangeType(3);
+ // 全国通用
+ detailsResponse.setRid(Collections.singletonList(0));
+ detailsResponse.setSid(Collections.singletonList(0));
+
+ responses.add(detailsResponse);
+ }
if (userCoupons.size() > 0) {
for (UserCoupon userCoupon : userCoupons) {
@@ -1083,9 +1107,95 @@
public PointDetailsVo getSpecificsOfGoods(@RequestBody Long speMercharsId) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
PointDetailsVo detailsVo = new PointDetailsVo();
+
+ if (speMercharsId.toString().contains("-1")){
+ // 会员门票
+ VipDetail vipDetail = vipDetailService.getById(Math.abs(speMercharsId));
+ if (vipDetail.getType()==1){
+ Coupon coupon = iCouponService.getById(vipDetail.getCouponId());
+ detailsVo.setDetailsId(Long.valueOf(coupon.getId()));
+ List<String> list3 = new ArrayList<>();
+ list3.add(ToolUtil.isEmpty(coupon.getCover()) ? "" : coupon.getCover());
+ if (ToolUtil.isNotEmpty(coupon.getProductImages())) {
+ list3.addAll(Arrays.asList(StrUtils.splitStr2StrArr(coupon.getProductImages(), ",")));
+ }
+ detailsVo.setPics(list3);
+ Collections.sort(detailsVo.getPics(), (s1, s2) -> {
+ if (s1.equals(coupon.getCover())) {
+ return -1; // s1排在前面
+ } else if (s2.equals(coupon.getCover())) {
+ return 1; // s2排在前面
+ } else {
+ return 0; // 保持原顺序
+ }
+ });
+ detailsVo.setGoodName(coupon.getName());
+ detailsVo.setExchangeType(coupon.getRedemptionMethod());
+ if (coupon.getRedemptionMethod() == 1) {
+ detailsVo.setIntegral(coupon.getIntegral().intValue());
+ } else {
+ detailsVo.setIntegral(coupon.getIntegral().intValue());
+ detailsVo.setCash(coupon.getCash());
+ }
+ if (coupon.getUseScope() == 1) {
+ detailsVo.setExchangeAddrType(1);
+ detailsVo.setBelongs("全国通用");
+ } else if (coupon.getUseScope() == 2) {
+ detailsVo.setExchangeAddrType(2);
+ List<CouponCity> list = ccityService.list(new LambdaQueryWrapper<CouponCity>()
+ .eq(CouponCity::getCouponId, coupon.getId()));
+ if (list.size() > 0) {
+ detailsVo.setBelongs(list.get(0).getProvince() + "|" + list.get(0).getCity() + "用户可用");
+ }
+ } else {
+ detailsVo.setExchangeAddrType(3);
+ List<CouponStore> list = cstoreService.list(new QueryWrapper<CouponStore>()
+ .eq("couponId", coupon.getId()));
+ StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(list.get(0).getStoreId());
+ detailsVo.setBelongs(courseOfStore.getStoreName() + "可用");
+ }
+ SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
+ detailsVo.setStartTime(format.format(coupon.getStartTime()));
+ detailsVo.setEndTime(format.format(coupon.getEndTime()));
+
+ detailsVo.setContents(coupon.getIllustrate());
+ detailsVo.setGoodType(4);
+ }else{
+
+ // 门票
+ detailsVo.setDetailsId(Long.valueOf("-"+vipDetail.getId()));
+ detailsVo.setGoodName(vipDetail.getTicketName());
+ switch (vipDetail.getStatus()){
+ case 1:
+ detailsVo.setUseType(2);
+ break;
+ case 2:
+ detailsVo.setUseType(1);
+ break;
+ case 3:
+ detailsVo.setUseType(3);
+ break;
+ }
+ detailsVo.setStartTime(simpleDateFormat.format(vipDetail.getStartTime()));
+ detailsVo.setEndTime(simpleDateFormat.format(vipDetail.getEndTime()));
+ detailsVo.setOrderTime(simpleDateFormat.format(vipDetail.getInsertTime()));
+ if (vipDetail.getUseTime()!=null){
+ detailsVo.setWriteOffTime(simpleDateFormat.format(vipDetail.getUseTime()));
+ }
+ if (vipDetail.getUseStoreId()!=null){
+ StoreDetailOfCourse courseOfStore = stoClient.getCourseOfStore(vipDetail.getUseStoreId());
+ detailsVo.setWriteOffName(courseOfStore.getStoreName());
+ }
+
+ detailsVo.setBelongs("全国通用");
+ detailsVo.setGoodType(3);
+ detailsVo.setCardType(1);
+ detailsVo.setExchangeAddrType(1);
+ }
+ detailsVo.setDetailsId(Long.valueOf("-"+vipDetail.getId()));
+ return detailsVo;
+ }
UserPointsMerchandise byId = upmseService.getById(speMercharsId);
-
-
if (ToolUtil.isNotEmpty(byId)) {
List<PointsMerchandiseStore> stores = storeService.list(new QueryWrapper<PointsMerchandiseStore>().eq("pointsMerchandiseId", byId.getPointsMerchandiseId()));
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java b/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java
index 38aea5c..3b49b8b 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/controller/UserCouponController.java
@@ -1,21 +1,24 @@
package com.dsh.activity.controller;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.dsh.activity.entity.Coupon;
-import com.dsh.activity.entity.CouponStore;
-import com.dsh.activity.entity.TStudent;
-import com.dsh.activity.entity.UserCoupon;
+import com.dsh.activity.entity.*;
import com.dsh.activity.feignclient.account.AppUserClient;
import com.dsh.activity.feignclient.account.StudentClient;
import com.dsh.activity.feignclient.account.model.AppUser;
import com.dsh.activity.feignclient.model.CouponStuAvailableVo;
import com.dsh.activity.feignclient.model.QueryUserCouponByIdAndUserId;
import com.dsh.activity.model.CouponListVo;
+import com.dsh.activity.model.GrantCoupon;
import com.dsh.activity.model.SendCouponReq;
import com.dsh.activity.service.CouponStoreService;
import com.dsh.activity.service.ICouponService;
import com.dsh.activity.service.UserCouponService;
+import com.dsh.activity.service.VipDetailService;
+import com.dsh.activity.util.DateUtil;
import com.dsh.activity.util.ResultUtil;
import com.dsh.activity.util.TokenUtil;
import io.swagger.annotations.Api;
@@ -23,6 +26,7 @@
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
@@ -56,6 +60,8 @@
@Resource
private StudentClient studentClient;
+ @Autowired
+ private VipDetailService vipDetailService;
@@ -315,8 +321,78 @@
@PostMapping("/userCoupon/queryCounts1")
public Integer queryCounts1(@RequestBody List<Integer> queryIds) {
return userCouponService.count(new QueryWrapper<UserCoupon>().eq("couponId", queryIds.get(0)).eq("userId", queryIds.get(1)));
-
-
}
+ // 开通会员后 赠送优惠券和门票
+ @ResponseBody
+ @PostMapping("/userCoupon/grantCoupon")
+ public void grantCoupon(@RequestBody GrantCoupon grantCoupon) {
+ String couponJson = grantCoupon.getCouponJson();
+ if (StringUtils.hasLength(couponJson)) {
+
+ // 赠送优惠券
+ JSONArray objects = JSON.parseArray(couponJson);
+ for (Object object : objects) {
+ JSONObject jsonObject = (JSONObject) object;
+ // 优惠券id
+ String id = jsonObject.getString("id");
+ // 优惠券数量
+ String value = jsonObject.getString("value");
+ for (Integer i = 0; i < Integer.valueOf(value); i++) {
+ UserCoupon userCoupon = new UserCoupon();
+ userCoupon.setCouponId(Integer.valueOf(id));
+ userCoupon.setUserId(grantCoupon.getUserId());
+ userCoupon.setStatus(1);
+ userCoupon.setVerificationUserId(null);
+ userCoupon.setVerificationTime(null);
+ userCoupon.setInsertTime(new Date());
+ userCoupon.setIsVipGrant(1);
+ userCouponService.save(userCoupon);
+ // 生成对应的权益明细记录
+ VipDetail vipDetail = new VipDetail();
+ vipDetail.setAppUserId(grantCoupon.getUserId());
+ vipDetail.setStatus(1);
+ vipDetail.setInsertTime(new Date());
+ vipDetail.setVipId(grantCoupon.getVipId());
+ vipDetail.setType(1);
+ vipDetail.setVipPaymentId(grantCoupon.getVipPaymentId());
+ vipDetail.setCouponId(Integer.valueOf(id));
+ vipDetail.setUserCouponId(userCoupon.getId());
+ vipDetailService.save(vipDetail);
+ }
+ }
+ }
+ String ticketJson = grantCoupon.getTicketJson();
+ if (StringUtils.hasLength(ticketJson)) {
+ // 赠送优惠券
+ JSONArray objects = JSON.parseArray(ticketJson);
+ for (Object object : objects) {
+ JSONObject jsonObject = (JSONObject) object;
+ // 门票名称
+ String name = jsonObject.getString("name");
+ // 领取后x天有效
+ String time = jsonObject.getString("time");
+ Integer days = Integer.valueOf(time);
+ // 可用次数
+ String count = jsonObject.getString("count");
+ for (Integer i = 0; i < Integer.valueOf(count); i++) {
+ // 生成对应的权益明细记录
+ VipDetail vipDetail = new VipDetail();
+ vipDetail.setTicketName(name);
+ vipDetail.setStartTime(new Date());
+ Date date = new Date();
+ // 加X天
+ Date tomorrow = new Date(date.getTime() + 24 * 60 * 60 * 1000L * days);
+ vipDetail.setEndTime(tomorrow);
+ vipDetail.setAppUserId(grantCoupon.getUserId());
+ vipDetail.setStatus(1);
+ vipDetail.setInsertTime(new Date());
+ vipDetail.setVipId(grantCoupon.getVipPaymentId());
+ vipDetail.setType(2);
+ vipDetail.setVipPaymentId(grantCoupon.getVipPaymentId());
+ vipDetailService.save(vipDetail);
+ }
+ }
+ }
+ }
}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java
index 1871a88..349a798 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/UserCoupon.java
@@ -66,6 +66,11 @@
@TableField("insertTime")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date insertTime;
+ /**
+ * 是否为会员赠送 0否1是
+ */
+ @TableField("isVipGrant")
+ private Integer isVipGrant;
@Override
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java b/cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java
new file mode 100644
index 0000000..40ca4ab
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java
@@ -0,0 +1,65 @@
+package com.dsh.activity.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import java.util.Date;
+
+@Data
+@ApiModel(value = "VipDetail", description = "会员权益明细")
+public class VipDetail {
+
+ @ApiModelProperty(value = "主键")
+ @TableId(value = "id", type = IdType.NONE)
+ private Integer id;
+
+ @ApiModelProperty(value = "用户id")
+ private Integer appUserId;
+
+ @ApiModelProperty(value = "使用状态 1待使用 2已使用 3已过期")
+ private Integer status;
+
+ @ApiModelProperty(value = "获取时间")
+ private Date insertTime;
+
+ @ApiModelProperty(value = "会员id")
+ private Integer vipId;
+
+ @ApiModelProperty(value = "会员权益类型 1优惠券 2门票")
+ private Integer type;
+
+ @ApiModelProperty(value = "会员支付记录id")
+ private Integer vipPaymentId;
+
+ @ApiModelProperty(value = "优惠券id")
+ private Integer couponId;
+
+ @ApiModelProperty(value = "门票名称")
+ private String ticketName;
+
+ @ApiModelProperty(value = "开始时间")
+ private Date startTime;
+
+ @ApiModelProperty(value = "结束时间")
+ private Date endTime;
+
+ @ApiModelProperty(value = "可用次数")
+ private Integer useCount;
+
+ @ApiModelProperty(value = "使用门店id")
+ private Integer useStoreId;
+
+ @ApiModelProperty(value = "使用场地id")
+ private Integer useSiteId;
+
+ @ApiModelProperty(value = "使用时间")
+ private Date useTime;
+
+ @ApiModelProperty(value = "运营商id")
+ private Integer operatorId;
+
+ @ApiModelProperty(value = "用户优惠券id")
+ private Long userCouponId;
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/CouponListOfSearch.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/CouponListOfSearch.java
index fc2a538..2ca1c03 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/CouponListOfSearch.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/CouponListOfSearch.java
@@ -31,4 +31,5 @@
private List<Integer> storeIds;
// 运营商使用
private List<TOperatorCity> operatorCities;
+
}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java
index 854d597..2cd3d2f 100644
--- a/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/feignclient/model/PointDetailsVo.java
@@ -19,7 +19,7 @@
@ApiModelProperty(value = "商品名称")
private String goodName;
- @ApiModelProperty(value = "适用状态(1已使用 2未使用)")
+ @ApiModelProperty(value = "适用状态(1已使用 2未使用 3过期)")
private Integer useType;
@ApiModelProperty(value = "有效期开始时间")
@@ -59,6 +59,7 @@
@ApiModelProperty(value = "兑换方式(1=积分,2=积分+现金)")
private Integer exchangeType;
+ @ApiModelProperty("1日卡 2月卡 3季卡 4年卡")
private Integer cardType;
@ApiModelProperty(value = "使用范围")
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/mapper/VipDetailMapper.java b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/VipDetailMapper.java
new file mode 100644
index 0000000..78b5492
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/mapper/VipDetailMapper.java
@@ -0,0 +1,23 @@
+package com.dsh.activity.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.activity.entity.Coupon;
+import com.dsh.activity.entity.VipDetail;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 优惠券 Mapper 接口
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-29
+ */
+public interface VipDetailMapper extends BaseMapper<VipDetail> {
+
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/model/GrantCoupon.java b/cloud-server-activity/src/main/java/com/dsh/activity/model/GrantCoupon.java
new file mode 100644
index 0000000..4f62ec2
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/model/GrantCoupon.java
@@ -0,0 +1,40 @@
+package com.dsh.activity.model;
+
+import lombok.Data;
+
+/**
+ * <p>
+ * 开会员送券
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-06-29
+ */
+@Data
+public class GrantCoupon {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 优惠券json
+ */
+ private String couponJson;
+ /**
+ * 优惠券json
+ */
+ private String ticketJson;
+ /**
+ * 用户id
+ */
+ private Integer userId;
+ /**
+ * vipId
+ */
+ private Integer vipId;
+ /**
+ * 会员支付记录id
+ */
+ private Integer vipPaymentId;
+
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/VipDetailService.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/VipDetailService.java
new file mode 100644
index 0000000..cacddd0
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/VipDetailService.java
@@ -0,0 +1,18 @@
+package com.dsh.activity.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.activity.entity.VipDetail;
+import com.dsh.activity.model.IntroduceUser;
+import com.dsh.activity.model.IntroduceUserQuery;
+
+import java.util.List;
+
+/**
+ * <p>
+ * 介绍有礼-用户参与 服务类
+ * </p>
+ */
+public interface VipDetailService extends IService<VipDetail> {
+
+
+}
diff --git a/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/VipDetailServiceImpl.java b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/VipDetailServiceImpl.java
new file mode 100644
index 0000000..1ed491d
--- /dev/null
+++ b/cloud-server-activity/src/main/java/com/dsh/activity/service/impl/VipDetailServiceImpl.java
@@ -0,0 +1,19 @@
+package com.dsh.activity.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.activity.entity.THuiminAgreement;
+import com.dsh.activity.entity.VipDetail;
+import com.dsh.activity.mapper.HuiminAgreementMapper;
+import com.dsh.activity.mapper.VipDetailMapper;
+import com.dsh.activity.service.HuiminAgreementService;
+import com.dsh.activity.service.VipDetailService;
+import org.springframework.stereotype.Service;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/7/11 17:31
+ */
+@Service
+public class VipDetailServiceImpl extends ServiceImpl<VipDetailMapper, VipDetail> implements VipDetailService {
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java
index 0490859..dea9322 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java
@@ -3,6 +3,7 @@
import com.dsh.course.feignClient.activity.model.*;
import com.dsh.guns.modular.system.model.CouponDataVo;
+import com.dsh.guns.modular.system.model.CouponStore;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
@@ -16,6 +17,8 @@
@PostMapping("/base/coupon/queryCouponListSearch")
List<Map<String,Object>> getCouponListOfSearch(@RequestBody CouponListOfSearch ofSearch);
+ @PostMapping("/base/coupon/getCouponListAllOfSearch")
+ List<Map<String,Object>> getCouponListAllOfSearch(@RequestBody CouponListOfSearch ofSearch);
@PostMapping("/base/coupon/queryCouponListSearch1")
@@ -31,6 +34,10 @@
@PostMapping("/coupon/queryCouponById")
Coupon queryCouponById(@RequestBody Integer id);
+ @PostMapping("/coupon/queryCouponAll")
+ List<Coupon> queryCouponAll();
+ @PostMapping("/coupon/queryCouponList")
+ List<Coupon> queryCouponList();
@PostMapping("/base/coupon/updateCouponExamine")
@@ -41,8 +48,12 @@
@PostMapping("/base/coupon/queryCity")
List<CouponCity> queryCity(Integer id);
+ @PostMapping("/base/coupon/queryAllCity")
+ List<CouponCity> queryAllCity();
@PostMapping("/base/coupon/queryStore")
List<Integer> queryStore(Integer id);
+ @PostMapping("/base/coupon/queryAllStore")
+ List<CouponStore> queryAllStore();
@PostMapping("/base/coupon/listRecord")
List<Map<String,Object>> listRecord(CouponRecordQuery ofSearch);
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/Coupon.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/Coupon.java
index d299f01..6572476 100644
--- a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/Coupon.java
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/Coupon.java
@@ -85,6 +85,10 @@
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private Date endTime;
/**
+ * 有效期
+ */
+ private String timeValue;
+ /**
* 使用范围(1=全国,2=指定城市,3=指定门店)
*/
private Integer useScope;
@@ -128,5 +132,12 @@
* 城市管理者id
*/
private Integer cityManagerId;
+ /**
+ * 数量
+ */
+ private Integer count;
+ private String useScopeValue;
+ private String typeValue;
+ private String userPopulationValue;
}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/TicketDetailVO.java b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/TicketDetailVO.java
new file mode 100644
index 0000000..44e12ae
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/model/TicketDetailVO.java
@@ -0,0 +1,15 @@
+package com.dsh.course.feignClient.activity.model;
+
+import lombok.Data;
+
+@Data
+public class TicketDetailVO {
+
+ // 门票名称
+ private String name;
+ // 领取后多少天有效
+ private Integer time;
+ // 门票数量
+ private Integer count;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/course/mapper/TVipMapper.java b/cloud-server-management/src/main/java/com/dsh/course/mapper/TVipMapper.java
new file mode 100644
index 0000000..e9748b6
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/course/mapper/TVipMapper.java
@@ -0,0 +1,26 @@
+package com.dsh.course.mapper;
+
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.guns.modular.system.model.TStoreOtherConfig;
+import com.dsh.guns.modular.system.model.Vip;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * Mapper 接口
+ * </p>
+ *
+ * @author administrator
+ * @since 2023-09-19
+ */
+public interface TVipMapper extends BaseMapper<Vip> {
+
+ List<Map<String, Object>> listOfPage(@Param("vipName")String name, @Param("status")Integer status, @Param("page")Page<Map<String, Object>> page);
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
index 1498593..bc07141 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TCouponController.java
@@ -303,9 +303,21 @@
return couponListOfSearch;
}
- /**
- * 根据运营商ID 获取运营商管理的省市
- */
+ @RequestMapping(value = "/listSelect")
+ @ResponseBody
+ public Object listOfDatas(String name, Integer type, Integer status, Integer state) {
+ Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+ CouponListOfSearch ofSearch = new CouponListOfSearch();
+ ofSearch.setPage(page);
+ ofSearch.setName(name);
+ ofSearch.setType(type);
+ ofSearch.setStatus(status);
+ ofSearch.setState(state);
+ List<Map<String, Object>> couponListOfSearch = client.getCouponListAllOfSearch(ofSearch);
+ return couponListOfSearch;
+ }
+
+
/**
* 获取 优惠券管理
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipController.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipController.java
new file mode 100644
index 0000000..08f1f7d
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipController.java
@@ -0,0 +1,450 @@
+package com.dsh.guns.modular.system.controller.code;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.dsh.course.feignClient.activity.CouponClient;
+import com.dsh.course.feignClient.activity.model.Coupon;
+import com.dsh.course.feignClient.activity.model.CouponCity;
+import com.dsh.course.feignClient.activity.model.TicketDetailVO;
+import com.dsh.guns.core.base.controller.BaseController;
+import com.dsh.guns.core.common.constant.factory.PageFactory;
+import com.dsh.guns.modular.system.model.*;
+import com.dsh.guns.modular.system.service.IStoreService;
+import com.dsh.guns.modular.system.service.IVipService;
+import com.dsh.guns.modular.system.util.ResultUtil;
+import org.apache.poi.ss.formula.functions.T;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.web.bind.annotation.*;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @author zhibing.pu
+ * @Date 2023/8/1 14:02
+ */
+@Controller
+@RequestMapping("/vip")
+public class TVipController extends BaseController {
+
+ @Autowired
+ private IVipService vipService;
+ @Autowired
+ private CouponClient couponClient;
+ @Autowired
+ private IStoreService storeService;
+ private String PREFIX = "/system/vip/";
+
+
+ /**
+ * 跳转到优惠券管理首页
+ */
+ @RequestMapping("")
+ public String index(Model model) {
+
+ return PREFIX + "vip.html";
+ }
+ @RequestMapping("/add")
+ public String add(Model model) {
+
+ return PREFIX + "vip_add.html";
+ }
+ @RequestMapping("/edit/{id}")
+ public String edit(@PathVariable("id")Integer id,Model model) {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ Vip vip = vipService.getById(id);
+ model.addAttribute("vip",vip);
+ if (vip.getCouponJson() != null && !vip.getCouponJson().isEmpty()){
+ String couponJson = vip.getCouponJson();
+ // 转化为jsonArray
+ JSONArray couponJsonArray = JSONArray.parseArray(couponJson);
+ List<Integer> couponIds = new ArrayList<>();
+ Map<Integer, Integer> integerIntegerHashMap = new HashMap<>();
+ // 收集里面得id
+ for (Object o : couponJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ Integer couponId = couponJsonObject.getInteger("id");
+ Integer count = couponJsonObject.getInteger("value");
+ integerIntegerHashMap.put(couponId, count);
+ couponIds.add(couponId);
+ }
+ List<Coupon> coupons = couponClient.queryCouponList();
+
+ if (!couponIds.isEmpty()){
+ coupons = coupons.stream().filter(coupon -> couponIds.contains(coupon.getId())).collect(Collectors.toList());
+ for (Coupon coupon : coupons) {
+ Date startTime = coupon.getStartTime();
+ Date endTime = coupon.getEndTime();
+ coupon.setTimeValue(simpleDateFormat.format(startTime) + "至" + simpleDateFormat.format(endTime));
+ Integer orDefault = integerIntegerHashMap.getOrDefault(coupon.getId(), 0);
+ coupon.setCount(orDefault);
+ switch (coupon.getUseScope()){
+ case 1:
+ coupon.setUseScopeValue("全国");
+ break;
+ case 2:
+ coupon.setUseScopeValue("指定城市");
+ break;
+ case 3:
+ coupon.setUseScopeValue("指定门店");
+ break;
+ }
+ switch (coupon.getType()){
+ case 1:
+ coupon.setTypeValue("满减券");
+ break;
+ case 2:
+ coupon.setTypeValue("代金券");
+ break;
+ case 3:
+ coupon.setTypeValue("体验券");
+ break;
+ }
+ switch (coupon.getUserPopulation()){
+ case 1:
+ coupon.setUserPopulationValue("全部用户");
+ break;
+ case 2:
+ coupon.setUserPopulationValue("会员");
+ break;
+ case 3:
+ coupon.setUserPopulationValue("已有学员用户");
+ break;
+ }
+ }
+ model.addAttribute("couponList", coupons);
+ }else{
+ model.addAttribute("couponList", new ArrayList<Coupon>());
+ }
+ }
+ if (vip.getTicketJson() != null && !vip.getTicketJson().isEmpty()){
+ String ticketJson = vip.getTicketJson();
+ // 转化为jsonArray
+ JSONArray ticketJsonArray = JSONArray.parseArray(ticketJson);
+ // 收集里面得id
+ List<TicketDetailVO> ticketDetailVOS = new ArrayList<>();
+
+ for (Object o : ticketJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ TicketDetailVO ticketDetailVO = new TicketDetailVO();
+ ticketDetailVO.setName(couponJsonObject.getString("name"));
+ ticketDetailVO.setTime(couponJsonObject.getInteger("time"));
+ ticketDetailVO.setCount(couponJsonObject.getInteger("count"));
+ ticketDetailVOS.add(ticketDetailVO);
+ }
+ model.addAttribute("ticketList", ticketDetailVOS);
+ }
+ return PREFIX + "vip_edit.html";
+ }
+
+ public static void main(String[] args) {
+ String temp = "[{\"id\":\"36\",\"value\":\"1\"}]";
+ JSONArray couponJsonArray = JSONArray.parseArray(temp);
+ for (Object o : couponJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ Integer couponId = couponJsonObject.getInteger("id");
+ }
+ }
+ @RequestMapping("/detail/{id}")
+ public String detail(@PathVariable("id")Integer id, Model model) {
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+
+ Vip vip = vipService.getById(id);
+ model.addAttribute("vip",vip);
+ if (vip.getCouponJson() != null && !vip.getCouponJson().isEmpty()){
+ String couponJson = vip.getCouponJson();
+ // 转化为jsonArray
+ JSONArray couponJsonArray = JSONArray.parseArray(couponJson);
+ List<Integer> couponIds = new ArrayList<>();
+ Map<Integer, Integer> integerIntegerHashMap = new HashMap<>();
+ // 收集里面得id
+ for (Object o : couponJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ Integer couponId = couponJsonObject.getInteger("id");
+ Integer count = couponJsonObject.getInteger("value");
+ integerIntegerHashMap.put(couponId, count);
+ couponIds.add(couponId);
+ }
+ List<Coupon> coupons = couponClient.queryCouponList();
+
+ if (!couponIds.isEmpty()){
+ coupons = coupons.stream().filter(coupon -> couponIds.contains(coupon.getId())).collect(Collectors.toList());
+ for (Coupon coupon : coupons) {
+ Date startTime = coupon.getStartTime();
+ Date endTime = coupon.getEndTime();
+ coupon.setTimeValue(simpleDateFormat.format(startTime) + "至" + simpleDateFormat.format(endTime));
+ Integer orDefault = integerIntegerHashMap.getOrDefault(coupon.getId(), 0);
+ coupon.setCount(orDefault);
+ switch (coupon.getUseScope()){
+ case 1:
+ coupon.setUseScopeValue("全国");
+ break;
+ case 2:
+ coupon.setUseScopeValue("指定城市");
+ break;
+ case 3:
+ coupon.setUseScopeValue("指定门店");
+ break;
+ }
+ switch (coupon.getType()){
+ case 1:
+ coupon.setTypeValue("满减券");
+ break;
+ case 2:
+ coupon.setTypeValue("代金券");
+ break;
+ case 3:
+ coupon.setTypeValue("体验券");
+ break;
+ }
+ switch (coupon.getUserPopulation()){
+ case 1:
+ coupon.setUserPopulationValue("全部用户");
+ break;
+ case 2:
+ coupon.setUserPopulationValue("会员");
+ break;
+ case 3:
+ coupon.setUserPopulationValue("已有学员用户");
+ break;
+ }
+ }
+ model.addAttribute("couponList", coupons);
+ }else{
+ model.addAttribute("couponList", new ArrayList<Coupon>());
+ }
+ }
+ if (vip.getTicketJson() != null && !vip.getTicketJson().isEmpty()){
+ String ticketJson = vip.getTicketJson();
+ // 转化为jsonArray
+ JSONArray ticketJsonArray = JSONArray.parseArray(ticketJson);
+ // 收集里面得id
+ List<TicketDetailVO> ticketDetailVOS = new ArrayList<>();
+
+ for (Object o : ticketJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ TicketDetailVO ticketDetailVO = new TicketDetailVO();
+ ticketDetailVO.setName(couponJsonObject.getString("name"));
+ ticketDetailVO.setTime(couponJsonObject.getInteger("time"));
+ ticketDetailVO.setCount(couponJsonObject.getInteger("count"));
+ ticketDetailVOS.add(ticketDetailVO);
+ }
+ model.addAttribute("ticketList", ticketDetailVOS);
+ }
+
+ return PREFIX + "vip_detail.html";
+ }
+ /**
+ * 跳转到门店管理列表页
+ */
+ @RequestMapping("/couponList")
+ public String couponList(Model model) {
+ return PREFIX + "TCoupon.html";
+ }
+ @RequestMapping(value = "/addVipInfo")
+ @ResponseBody
+ public ResultUtil addVipInfo(String vipName, Integer time, Integer timeType, String price,String couponJson, String ticketJson) {
+ Vip vip = new Vip();
+ vip.setVipName(vipName);
+ vip.setTimeType(timeType);
+ vip.setTime(time);
+ vip.setPrice(new BigDecimal(price));
+ vip.setStatus(1);
+ vip.setInsertTime(new Date());
+ vip.setCouponJson(couponJson);
+ vip.setTicketJson(ticketJson);
+ vipService.save(vip);
+ return ResultUtil.success();
+ }
+ @RequestMapping(value = "/editVipInfo")
+ @ResponseBody
+ public ResultUtil addVipInfo(Integer id,String vipName, Integer time, Integer timeType, String price,String couponJson, String ticketJson) {
+ Vip vip = vipService.getById(id);
+ vip.setVipName(vipName);
+ vip.setTimeType(timeType);
+ vip.setTime(time);
+ vip.setPrice(new BigDecimal(price));
+ vip.setInsertTime(new Date());
+ if (couponJson==null){
+ couponJson = "";
+ }
+ vip.setCouponJson(couponJson);
+ if (ticketJson==null){
+ ticketJson = "";
+ }
+ vip.setTicketJson(ticketJson);
+ vipService.updateById(vip);
+ return ResultUtil.success();
+ }
+ @RequestMapping(value = "/offShelf")
+ @ResponseBody
+ public ResultUtil offShelf(Integer id) {
+ Vip vip = vipService.getById(id);
+ vip.setStatus(2);
+ vipService.updateById(vip);
+ return ResultUtil.success();
+ }
+ @RequestMapping(value = "/onShelf")
+ @ResponseBody
+ public ResultUtil onShelf(Integer id) {
+ Vip vip = vipService.getById(id);
+ vip.setStatus(1);
+ vipService.updateById(vip);
+ return ResultUtil.success();
+ }
+ /**
+ * 获取 会员卡列表
+ */
+ @RequestMapping(value = "/list")
+ @ResponseBody
+ public List<Map<String, Object>> list(String vipName, Integer status) {
+ Page<Map<String, Object>> page = new PageFactory<Map<String, Object>>().defaultPage();
+ List<Map<String, Object>> maps = vipService.listOfPage(vipName, status, page);
+ for (Map<String, Object> map : maps) {
+ Object timeType = map.get("timeType");
+ Object time = map.get("time");
+ Integer timeTypeValue = Integer.valueOf(timeType.toString());
+ Integer timeValue = Integer.valueOf(time.toString());
+ switch (timeTypeValue) {
+ case 1:
+ map.put("time",timeValue+"天");
+ break;
+ case 2:
+ map.put("time",timeValue+"月");
+ break;
+ case 3:
+ map.put("time",timeValue+"年");
+ break;
+ }
+ }
+ return maps;
+ }
+
+ // APP查询所有上架的会员卡
+ @ResponseBody
+ @PostMapping("/listAll")
+ public List<Vip> listAll() {
+ List<Vip> list = vipService.lambdaQuery().eq(Vip::getStatus, 1).list();
+ List<Coupon> coupons = couponClient.queryCouponAll();
+ List<CouponCity> couponCityList = couponClient.queryAllCity();
+ List<CouponStore> storeList = couponClient.queryAllStore();
+ List<TStore> shopList = storeService.list();
+ // 封装会员权益
+ for (Vip vip : list) {
+ List<CouponVipResp> couponVipRespList = new ArrayList<>();
+ List<TicketVipResp> ticketVipRespList = new ArrayList<>();
+ String couponJson = vip.getCouponJson();
+ JSONArray couponJsonArray = JSONArray.parseArray(couponJson);
+ for (Object o : couponJsonArray) {
+ JSONObject couponJsonObject = (JSONObject) o;
+ // 优惠券id
+ Integer id = Integer.valueOf(couponJsonObject.getString("id"));
+ // 优惠券数量
+ Integer value = Integer.valueOf(couponJsonObject.getString("value"));
+ Coupon coupon = coupons.stream().filter(e -> e.getId().equals(id)).findFirst().orElse(new Coupon());
+ CouponVipResp couponVipResp = new CouponVipResp();
+ couponVipResp.setId(coupon.getId());
+ couponVipResp.setName(coupon.getName());
+ couponVipResp.setType(coupon.getType());
+ couponVipResp.setUseCondition(coupon.getUseScope());
+ couponVipResp.setCount(value);
+ switch (coupon.getUseScope()) {
+ case 1:
+ couponVipResp.setAvailable("全国通用");
+ break;
+ case 2:
+ couponVipResp.setAvailable("指定城市可用");
+ List<CouponCity> couponId = couponCityList.stream().filter(e -> e.getCouponId().equals(id))
+ .collect(Collectors.toList());
+ StringBuilder stringBuilder = new StringBuilder();
+ for (CouponCity couponCity : couponId) {
+ stringBuilder.append(couponCity.getCity());
+ }
+ couponVipResp.setCityOrStore(String.valueOf(stringBuilder));
+ break;
+ case 3:
+ couponVipResp.setAvailable("指定门店可用");
+ // 门店ids
+ List<Integer> storeIds = storeList.stream().filter(e -> e.getCouponId().equals(id))
+ .map(CouponStore::getStoreId).collect(Collectors.toList());
+ StringBuilder storeNames = new StringBuilder("");
+
+ if (!storeIds.isEmpty()) {
+ List<TStore> stores = shopList.stream().filter(e -> storeIds.contains(e.getId())).collect(Collectors.toList());
+ for (TStore store : stores) {
+ storeNames.append(store.getName()).append(",");
+ }
+ // 去除最后一位
+ StringBuilder res = storeNames.deleteCharAt(storeNames.length() - 1);
+ couponVipResp.setCityOrStore(res.toString());
+ } else {
+ couponVipResp.setCityOrStore("无可用门店");
+ }
+ break;
+ default:
+ break;
+ }
+ couponVipResp.setInstructionsForUse(coupon.getIllustrate());
+ ConponJsonRuleModel ruleModel = new ConponJsonRuleModel();
+ JSONObject jsonObject = JSON.parseObject(coupon.getContent());
+ switch (coupon.getType()) {
+ case 1:
+// 满减券
+ Double num1 = jsonObject.getDouble("conditionalAmount");
+ Double num2 = jsonObject.getDouble("deductionAmount");
+ ruleModel.setConditionalAmount("满" + num1 + "可用");
+ ruleModel.setDeductionAmount("¥ " + num2);
+ ruleModel.setExperienceName("");
+ break;
+ case 2:
+// 代金券
+ Double jsonObjectDouble = jsonObject.getDouble("conditionalAmount");
+ ruleModel.setConditionalAmount("");
+ ruleModel.setDeductionAmount("¥ " + jsonObjectDouble);
+ ruleModel.setExperienceName("");
+ break;
+ case 3:
+// 体验券
+ ruleModel.setConditionalAmount("");
+ ruleModel.setDeductionAmount("");
+ ruleModel.setExperienceName(jsonObject.getString("experienceName"));
+ break;
+ default:
+ break;
+ }
+ couponVipResp.setRuleModel(ruleModel);
+
+ SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
+ couponVipResp.setEffectiveTime(simpleDateFormat.format(coupon.getEndTime()));
+ couponVipRespList.add(couponVipResp);
+ }
+ vip.setCouponList(couponVipRespList);
+ String ticketJson = vip.getTicketJson();
+ JSONArray ticketJsonArray = JSONArray.parseArray(ticketJson);
+ for (Object o : ticketJsonArray) {
+ JSONObject ticketJsonObject = (JSONObject) o;
+ TicketVipResp ticketVipResp = new TicketVipResp();
+ ticketVipResp.setName(ticketJsonObject.getString("name"));
+ ticketVipResp.setTime(ticketJsonObject.getInteger("time"));
+ ticketVipResp.setCount(ticketJsonObject.getInteger("count"));
+ ticketVipRespList.add(ticketVipResp);
+ }
+ vip.setTicketList(ticketVipRespList);
+ }
+ return list;
+ }
+
+ @ResponseBody
+ @PostMapping("/getVipByIds")
+ public List<Vip> getVipByIds(@RequestBody String ids) {
+ List<Vip> list = vipService.lambdaQuery().in(Vip::getId, Arrays.asList(ids.split(","))).list();
+ return list;
+ }
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ConponJsonRuleModel.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ConponJsonRuleModel.java
new file mode 100644
index 0000000..28f609a
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/ConponJsonRuleModel.java
@@ -0,0 +1,25 @@
+package com.dsh.guns.modular.system.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+
+@Data
+public class ConponJsonRuleModel {
+ /**
+ * 条件金额
+ */
+ @ApiModelProperty("条件金额(例如 :满xx可用)")
+ String conditionalAmount;
+ /**
+ * 抵扣金额(代金券 取 该字段)
+ */
+ @ApiModelProperty("抵扣金额(代金券 取 该字段) 例如:¥ xxx")
+ String deductionAmount;
+ /**
+ * 体验券名称
+ */
+ @ApiModelProperty("体验券名称 ")
+ String experienceName;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponStore.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponStore.java
new file mode 100644
index 0000000..d48bb12
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponStore.java
@@ -0,0 +1,52 @@
+package com.dsh.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.extension.activerecord.Model;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+/**
+ * <p>
+ * 优惠券使用门店关系数据
+ * </p>
+ *
+ * @author jqs
+ * @since 2023-07-07
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@TableName("t_coupon_store")
+public class CouponStore extends Model<CouponStore> {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ private Integer id;
+ /**
+ * 优惠券id
+ */
+ @TableField("couponId")
+ private Integer couponId;
+ /**
+ * 门店id
+ */
+ @TableField("storeId")
+ private Integer storeId;
+
+
+ @Override
+ protected Serializable pkVal() {
+ return this.id;
+ }
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipResp.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipResp.java
new file mode 100644
index 0000000..8df54b9
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipResp.java
@@ -0,0 +1,43 @@
+package com.dsh.guns.modular.system.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("会员权益优惠券列表")
+public class CouponVipResp {
+
+ @ApiModelProperty("优惠券id")
+ private Integer id;
+
+ @ApiModelProperty("优惠券名称")
+ private String name;
+
+ @ApiModelProperty("优惠券类型(1=满减券,2=代金券,3=体验券)")
+ private Integer type;
+
+ @ApiModelProperty("适用范围1全国通用 2指定城市可用 3指定门店可用")
+ private Integer useCondition;
+
+ @ApiModelProperty("适用范围名称")
+ private String available;
+
+ @ApiModelProperty("useCondition = 2,为地址字符串;useCondition = 3,为门店名称+地址字符串")
+ private String cityOrStore;
+
+ @ApiModelProperty("优惠券说明(使用说明)")
+ private String instructionsForUse;
+
+ @ApiModelProperty("金额条件封装")
+ private ConponJsonRuleModel ruleModel;
+
+ @ApiModelProperty("有效时间(2021-05-05)")
+ private String effectiveTime;
+ @ApiModelProperty("数量 张")
+ private Integer count;
+
+
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipVo.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipVo.java
new file mode 100644
index 0000000..935194e
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/CouponVipVo.java
@@ -0,0 +1,43 @@
+package com.dsh.guns.modular.system.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+@Data
+@ApiModel("会员权益优惠券返回VO")
+public class CouponVipVo {
+ /**
+ * 用户类型1=城市管理者 2=平台管理者
+ */
+ @ApiModelProperty("优惠券id")
+ Integer userType;
+ /**
+ * 城市管理者id
+ */
+ Integer cityManagerId;
+ /**
+ * 券名称
+ */
+ String couponName;
+ /**
+ * 优惠券类型
+ */
+ Integer prescription;
+ /**
+ * 条件金额
+ */
+ BigDecimal condition;
+ /**
+ * 减去金额
+ */
+ BigDecimal subtraction;
+ /**
+ * 折扣金额
+ */
+ BigDecimal discount;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Protocol.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Protocol.java
index 42ee1e2..bec2a40 100644
--- a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Protocol.java
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Protocol.java
@@ -21,7 +21,7 @@
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
/**
- * 数据类型(1=用户协议,2=隐私协议,3=运动安全公告书)
+ * 数据类型(1=用户协议,2=隐私协议,3=运动安全公告书 6)
*/
@TableField("type")
private Integer type;
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TicketVipResp.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TicketVipResp.java
new file mode 100644
index 0000000..2b13ef1
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/TicketVipResp.java
@@ -0,0 +1,22 @@
+package com.dsh.guns.modular.system.model;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+@ApiModel("会员权益门票列表")
+public class TicketVipResp {
+
+
+ @ApiModelProperty("门票名称")
+ private String name;
+
+ @ApiModelProperty("领取后x天有效")
+ private Integer time;
+
+ @ApiModelProperty("数量 张")
+ private Integer count;
+
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Vip.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Vip.java
new file mode 100644
index 0000000..181d445
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/Vip.java
@@ -0,0 +1,107 @@
+package com.dsh.guns.modular.system.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 会员管理
+ */
+@TableName("t_vip")
+@Data
+@ApiModel(description = "会员")
+public class Vip {
+ /**
+ * 主键id
+ */
+ @TableId(value = "id", type = IdType.AUTO)
+ @TableField("id")
+ @ApiModelProperty(value = "主键id")
+ private Integer id;
+
+ /**
+ * 会员名称
+ */
+ @TableField("vipName")
+ @ApiModelProperty(value = "会员名称")
+ private String vipName;
+
+ /**
+ * 会员时长类型 1天 2月 3年
+ */
+ @TableField("timeType")
+ @ApiModelProperty(value = "会员时长类型 1天 2月 3年")
+ private Integer timeType;
+
+ /**
+ * 会员时长
+ */
+ @TableField("time")
+ @ApiModelProperty(value = "会员时长")
+ private Integer time;
+
+ /**
+ * 会员价格
+ */
+ @TableField("price")
+ @ApiModelProperty(value = "会员价格")
+ private BigDecimal price;
+
+ /**
+ * 状态 1上架2下架
+ */
+ @TableField("status")
+ @ApiModelProperty(value = "状态 1上架2下架")
+ private Integer status;
+
+ /**
+ * 添加时间
+ */
+ @TableField("insertTime")
+ @ApiModelProperty(value = "添加时间")
+ private Date insertTime;
+ /**
+ * 添加时间
+ */
+ @TableField("couponJson")
+ @ApiModelProperty(value = "优惠券json[{\n" +
+ "\t\"id\": \"1\",\n" +
+ "\t\"value\": \"1\"\n" +
+ "}, {\n" +
+ "\t\"id\": \"2\",\n" +
+ "\t\"value\": \"1\"\n" +
+ "}\n" +
+ "}]")
+ private String couponJson;
+ /**
+ * 添加时间
+ */
+ @TableField("ticketJson")
+ @ApiModelProperty(value = "门票json门票json[{\n" +
+ "\t\"name\": \"门票名称\",\n" +
+ "\t\"time\": \"1\",\n" +
+ "\"count\": \"1\",\n" +
+ "}]")
+ private String ticketJson;
+
+ /**
+ * 会员优惠券权益
+ */
+ @TableField(exist = false)
+ @ApiModelProperty(value = "会员优惠券权益")
+ private List<CouponVipResp> couponList;
+ /**
+ * 会员门票权益
+ */
+ @TableField(exist = false)
+ @ApiModelProperty(value = "会员门票权益")
+ private List<TicketVipResp> ticketList;
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IVipService.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IVipService.java
new file mode 100644
index 0000000..1ded3ba
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/IVipService.java
@@ -0,0 +1,18 @@
+package com.dsh.guns.modular.system.service;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.dsh.guns.modular.system.model.Protocol;
+import com.dsh.guns.modular.system.model.Vip;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @author zhibing.pu
+ * @date 2023/6/14 15:04
+ */
+public interface IVipService extends IService<Vip> {
+ List<Map<String, Object>> listOfPage(String vipName, Integer status, Page<Map<String, Object>> page);
+}
diff --git a/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TVipServiceImpl.java b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TVipServiceImpl.java
new file mode 100644
index 0000000..2297e6c
--- /dev/null
+++ b/cloud-server-management/src/main/java/com/dsh/guns/modular/system/service/impl/TVipServiceImpl.java
@@ -0,0 +1,33 @@
+package com.dsh.guns.modular.system.service.impl;
+
+
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.dsh.course.mapper.TOperatorAuthMapper;
+import com.dsh.course.mapper.TVipMapper;
+import com.dsh.guns.modular.system.model.OperatorAuthAlipay;
+import com.dsh.guns.modular.system.model.Vip;
+import com.dsh.guns.modular.system.service.IOperatorAuthService;
+import com.dsh.guns.modular.system.service.IVipService;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 服务实现类
+ * </p>
+ *
+ * @author administrator
+ * @since 2023-09-19
+ */
+@Service
+public class TVipServiceImpl extends ServiceImpl<TVipMapper, Vip> implements IVipService {
+
+
+ @Override
+ public List<Map<String, Object>> listOfPage(String vipName, Integer status, Page<Map<String, Object>> page) {
+ return this.baseMapper.listOfPage(vipName, status, page);
+ }
+}
diff --git a/cloud-server-management/src/main/resources/mapper/VipMapper.xml b/cloud-server-management/src/main/resources/mapper/VipMapper.xml
new file mode 100644
index 0000000..56e172d
--- /dev/null
+++ b/cloud-server-management/src/main/resources/mapper/VipMapper.xml
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.dsh.course.mapper.TVipMapper">
+
+
+ <select id="listOfPage" resultType="java.util.Map">
+ select * from t_vip
+ where 1=1
+ <if test="vipName != null and vipName != ''">
+ and vipName like concat('%',#{vipName},'%')
+ </if>
+ <if test="status != null">
+ and status = #{status}
+ </if>
+ </select>
+</mapper>
\ No newline at end of file
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/TCoupon.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/TCoupon.html
new file mode 100644
index 0000000..a8e81d3
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/TCoupon.html
@@ -0,0 +1,66 @@
+@layout("/common/_container.html"){
+<div class="row">
+ <div class="col-sm-12">
+ <div class="ibox float-e-margins">
+ <div class="ibox-title">
+ <h5>选择</h5>
+ </div>
+ <div class="ibox-content">
+ <div class="row row-lg">
+ <div class="col-sm-12">
+ <div class="row">
+ <div class="col-sm-3">
+ <#NameCon id="name" name="优惠券名称" />
+ </div>
+ <div class="col-sm-3">
+ <#SelectCon id="type" name="优惠券类型" >
+ <option value="">全部</option>
+ <option value="1">满减券</option>
+ <option value="2">折扣券</option>
+ <option value="3">体验券</option>
+ </#SelectCon>
+ </div>
+ <div class="col-sm-3">
+ <#SelectCon id="status" name="活动状态" >
+ <option value="">全部</option>
+ <option value="1">未开始</option>
+ <option value="2">已开始</option>
+ <option value="3">已结束</option>
+ </#SelectCon>
+ </div>
+
+ </div>
+ <div class="col-sm-3">
+ <#SelectCon id="state" name="可售状态" >
+ <option value="">全部</option>
+ <option value="1">已上架</option>
+ <option value="2">已下架</option>
+ </#SelectCon>
+ </div>
+ <div class="col-sm-3">
+ <#button name="搜索" icon="fa-search" clickFun="TCoupon.search()"/>
+ <#button name="重置" icon="fa-trash" clickFun="TCoupon.resetSearch()"/>
+ </div>
+ </div>
+
+ <#table id="TCouponTable"/>
+ <div style="margin-left: 30%">
+ <button type="button" class="btn btn-info button-margin" onclick="TCoupon.storeOfClosePage()"
+ id="closePage" style="width: 30%;height: 40px;background: #0d8ddb;color: white;border: none;">
+ <i class="fa fa-check"></i> 关闭
+ </button>
+
+ <button type="button" class="btn btn-info button-margin" onclick="TCoupon.saveSelectStores()"
+ id="submit" style="margin-left: 5%;width: 30%;height: 40px;background: #0d8ddb;color: white;border: none;">
+ <i class="fa fa-check"></i> 保存
+ </button>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ </div>
+</div>
+<script src="${ctxPath}/modular/system/vip/TCoupon.js"></script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip.html
new file mode 100644
index 0000000..58ffe1b
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip.html
@@ -0,0 +1,52 @@
+@layout("/common/_container.html"){
+<div class="row">
+ <div class="col-sm-12">
+ <div class="ibox float-e-margins">
+
+ <div class="ibox-title">
+ <h5>会员管理</h5>
+ </div>
+ <div class="ibox-content">
+ <div class="row row-lg">
+ <div class="col-sm-12">
+ <div class="row">
+ <div class="col-sm-3">
+ <#NameCon id="vipName" name="会员名称" />
+ </div>
+ <div class="col-sm-3">
+ <div class="input-group">
+ <div class="input-group-btn open">
+ <button data-toggle="dropdown" class="btn btn-white dropdown-toggle" type="button" aria-expanded="true">
+ 可售状态
+ </button>
+ </div>
+ <select class="form-control" id="status" >
+ <option value="">全部</option>
+ <option value="1">上架</option>
+ <option value="2">下架</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="col-sm-3">
+ <#button name="搜索" icon="fa-search" clickFun="Vip.search()"/>
+ <#button name="重置" icon="fa-trash" clickFun="Vip.resetSearch()" space="true"/>
+ </div>
+ </div>
+ <div class="hidden-xs" id="TCompetitionTableToolbar" role="group">
+ <#button name="添加" icon="fa-plus" clickFun="Vip.add()"/>
+ <#button name="编辑" icon="fa-edit" clickFun="Vip.edit()" space="true"/>
+ <#button name="上架" icon="fa-check" clickFun="Vip.onShelf()" space="true"/>
+ <#button name="下架" icon="fa-remove" clickFun="Vip.offShelf()" space="true"/>
+ <#button name="查看详情" icon="fa-search" clickFun="Vip.detail()" space="true"/>
+ </div>
+ <#table id="VipTable"/>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/modular/system/vip/vip.js"></script>
+
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_add.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_add.html
new file mode 100644
index 0000000..d37da9d
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_add.html
@@ -0,0 +1,170 @@
+@layout("/common/_container.html"){
+<style>
+ .avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ height: 100px;
+ width: 100px;
+ overflow: hidden;
+ }
+
+ .avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+ }
+ .avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 100px;
+ height: 100px;
+ line-height: 100px;
+ margin-top: 34px;
+ text-align: center;
+ }
+ .avatar {
+ width: 100px;
+ height: 100px;
+ display: block;
+ }
+
+ .col-sm-12 {
+ margin-top: 20px;
+ }
+
+ .col-sm-12 select {
+ height: 33px;
+ }
+</style>
+<div class="ibox float-e-margins">
+ <div class="ibox-content">
+ <div class="form-horizontal" id="carInfoForm">
+ <div class="form-group" >
+ <label class="col-sm-3 control-label">*会员名称:</label>
+ <div class="col-sm-9" style="display: flex;">
+ <input style="width: 300px" class="form-control" id="vipName" placeholder="请输入会员名称" type="text">
+ </div>
+ </div>
+ <div class="form-group" style="display: flex" >
+ <label class="col-sm-3 control-label">*会员时长:</label>
+ <input class="form-control" style="width: 100px" id="time" name="time" type="number">
+ <div class="col-sm-9">
+ <select style="width: 200px" class="form-control" id="timeType" name = "timeType" >
+ <option value="1">天</option>
+ <option value="2">月</option>
+ <option value="3">年</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-3 control-label">售价:</label>
+ <div class="col-sm-9">
+ <input style="width: 300px" class="form-control" id="price" name="price" type="number">
+ </div>
+ </div>
+ <div class="row" id="storeSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送优惠券: </label>
+ <button onclick="couponList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 选择优惠券
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="couponTable">
+ <thead>
+ <tr>
+ <td>优惠券名称</td>
+ <td>适用范围</td>
+ <td>优惠券类型</td>
+ <td>有效期</td>
+ <td>用户人群</td>
+ <td>数量</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="coun"></tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="row" id="ticketSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送门票: </label>
+ <button onclick="ticketList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 添加门票
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="ticketTable">
+ <thead>
+ <tr>
+ <td>门票名称</td>
+ <td>领取后X天有效</td>
+ <td>可用次数</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="ticket"></tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ </div>
+
+ <div class="row btn-group-m-t">
+ <div class="col-sm-10 col-sm-offset-5">
+ <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="VipInfo.addSubmit()"/>
+ <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="VipInfo.close()"/>
+ </div>
+ </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script src="${ctxPath}/modular/system/vip/vip_info.js"></script>
+<script>
+
+ function couponList(){
+ var index = layer.open({
+ type: 2,
+ title: '优惠券列表',
+ area: ['80%', '80%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/couponList'
+ });
+ this.layerIndex = index;
+ }
+
+ // 存储门票数据的数组
+ var ticketData = [];
+
+ function ticketList(){
+ var str="";
+ str += '<tr class="timeClass1">' +
+ '<td><input type="text" id="name" name="name" value="">' +
+ '<td><input type="number" id="time" name="time" value="">' +
+ '<td><input type="number" id="count" name="count" value=""' +
+ '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+
+ $("#ticket").append(str);
+ }
+ function deleteSub(e) {
+ $(e).parent().parent().remove();
+ }
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_detail.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_detail.html
new file mode 100644
index 0000000..2ecf5b6
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_detail.html
@@ -0,0 +1,184 @@
+@layout("/common/_container.html"){
+<style>
+ .avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ height: 100px;
+ width: 100px;
+ overflow: hidden;
+ }
+
+ .avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+ }
+ .avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 100px;
+ height: 100px;
+ line-height: 100px;
+ margin-top: 34px;
+ text-align: center;
+ }
+ .avatar {
+ width: 100px;
+ height: 100px;
+ display: block;
+ }
+
+ .col-sm-12 {
+ margin-top: 20px;
+ }
+
+ .col-sm-12 select {
+ height: 33px;
+ }
+</style>
+<div class="ibox float-e-margins">
+ <div class="ibox-content">
+ <div class="form-horizontal" id="carInfoForm">
+ <div class="form-group" >
+ <label class="col-sm-3 control-label">*会员名称:</label>
+ <div class="col-sm-9" style="display: flex;">
+ <input style="width: 300px" class="form-control" id="vipName" value="${vip.vipName}" placeholder="请输入会员名称" type="text">
+ </div>
+ </div>
+ <div class="form-group" style="display: flex" >
+ <label class="col-sm-3 control-label">*会员时长:</label>
+ <input class="form-control" style="width: 100px" id="time" value="${vip.time}" name="time" type="number">
+ <div class="col-sm-9">
+ <select style="width: 200px" class="form-control" id="timeType" name = "timeType" >
+ <option value="1" ${vip.timeType == 1 ? 'selected=selected' : ''}>天</option>
+ <option value="2" ${vip.timeType == 2 ? 'selected=selected' : ''}>月</option>
+ <option value="3" ${vip.timeType == 3 ? 'selected=selected' : ''}>年</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-3 control-label">售价:</label>
+ <div class="col-sm-9">
+ <input style="width: 300px" class="form-control" value="${vip.price}" id="price" name="price" type="number">
+ </div>
+ </div>
+ <div class="row" id="storeSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送优惠券: </label>
+ <button onclick="couponList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 选择优惠券
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="couponTable">
+ <thead>
+ <tr>
+ <td>优惠券名称</td>
+ <td>适用范围</td>
+ <td>优惠券类型</td>
+ <td>有效期</td>
+ <td>用户人群</td>
+ <td>数量</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="coun">
+ @for(obj in couponList){
+ <tr class="timeClass">
+ <td><input type="hidden" id="id" name="id" value="${obj.id}"><input type="hidden" id="name" name="name" value="${obj.name}">${obj.name}
+ <td><input type="hidden" id="useScope" name="useScope" value="${obj.useScope}">${obj.useScopeValue}
+ <td><input type="hidden" id="type" name="type" value="${obj.type}">${obj.typeValue}
+ <td><input type="hidden" id="timeValue" name="timeValue" value="${obj.timeValue}">${obj.timeValue}
+ <td><input type="hidden" id="userPopulation" name="userPopulation" value="${obj.userPopulation}">${obj.userPopulationValue}
+ <td><input type="number" id="count" name="count" value="${obj.count}">
+ </td><td><button onclick="deleteSub(this)">移除</button></td>
+ </tr>
+ @}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="row" id="ticketSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送门票: </label>
+ <button onclick="ticketList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 添加门票
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="ticketTable">
+ <thead>
+ <tr>
+ <td>门票名称</td>
+ <td>领取后X天有效</td>
+ <td>可用次数</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="ticket">
+ @for(obj in ticketList){
+ <tr class="timeClass1">
+ <td><input type="text" id="name" name="name" value="${obj.name}">
+ <td><input type="number" id="time" name="time" value="${obj.time}">
+ <td><input type="number" id="count" name="count" value="${obj.count}">
+ </td><td><button onclick="deleteSub(this)">移除</button></td></tr>
+ </tr>
+ @}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ </div>
+ </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script src="${ctxPath}/modular/system/vip/vip_info.js"></script>
+<script>
+
+ function couponList(){
+ var index = layer.open({
+ type: 2,
+ title: '优惠券列表',
+ area: ['80%', '80%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/couponList'
+ });
+ this.layerIndex = index;
+ }
+
+ // 存储门票数据的数组
+ var ticketData = [];
+
+ function ticketList(){
+ var str="";
+ str += '<tr class="timeClass1">' +
+ '<td><input type="text" id="name" name="name" value="">' +
+ '<td><input type="number" id="time" name="time" value="">' +
+ '<td><input type="number" id="count" name="count" value=""' +
+ '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+
+ $("#ticket").append(str);
+ }
+ function deleteSub(e) {
+ $(e).parent().parent().remove();
+ }
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_edit.html b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_edit.html
new file mode 100644
index 0000000..b79e4f6
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/WEB-INF/view/system/vip/vip_edit.html
@@ -0,0 +1,191 @@
+@layout("/common/_container.html"){
+<style>
+ .avatar-uploader .el-upload {
+ border: 1px dashed #d9d9d9;
+ border-radius: 6px;
+ cursor: pointer;
+ position: relative;
+ height: 100px;
+ width: 100px;
+ overflow: hidden;
+ }
+
+ .avatar-uploader .el-upload:hover {
+ border-color: #409eff;
+ }
+ .avatar-uploader-icon {
+ font-size: 28px;
+ color: #8c939d;
+ width: 100px;
+ height: 100px;
+ line-height: 100px;
+ margin-top: 34px;
+ text-align: center;
+ }
+ .avatar {
+ width: 100px;
+ height: 100px;
+ display: block;
+ }
+
+ .col-sm-12 {
+ margin-top: 20px;
+ }
+
+ .col-sm-12 select {
+ height: 33px;
+ }
+</style>
+<div class="ibox float-e-margins">
+ <div class="ibox-content">
+ <div class="form-horizontal" id="carInfoForm">
+ <div class="form-group" >
+ <input type="hidden" id="vipId" value="${vip.id}">
+
+ <label class="col-sm-3 control-label">*会员名称:</label>
+ <div class="col-sm-9" style="display: flex;">
+ <input style="width: 300px" class="form-control" id="vipName" value="${vip.vipName}" placeholder="请输入会员名称" type="text">
+ </div>
+ </div>
+ <div class="form-group" style="display: flex" >
+ <label class="col-sm-3 control-label">*会员时长:</label>
+ <input class="form-control" style="width: 100px" id="time" value="${vip.time}" name="time" type="number">
+ <div class="col-sm-9">
+ <select style="width: 200px" class="form-control" id="timeType" name = "timeType" >
+ <option value="1" ${vip.timeType == 1 ? 'selected=selected' : ''}>天</option>
+ <option value="2" ${vip.timeType == 2 ? 'selected=selected' : ''}>月</option>
+ <option value="3" ${vip.timeType == 3 ? 'selected=selected' : ''}>年</option>
+ </select>
+ </div>
+ </div>
+
+ <div class="form-group">
+ <label class="col-sm-3 control-label">售价:</label>
+ <div class="col-sm-9">
+ <input style="width: 300px" class="form-control" value="${vip.price}" id="price" name="price" type="number">
+ </div>
+ </div>
+ <div class="row" id="storeSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送优惠券: </label>
+ <button onclick="couponList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 选择优惠券
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="couponTable">
+ <thead>
+ <tr>
+ <td>优惠券名称</td>
+ <td>适用范围</td>
+ <td>优惠券类型</td>
+ <td>有效期</td>
+ <td>用户人群</td>
+ <td>数量</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="coun">
+ @for(obj in couponList){
+ <tr class="timeClass">
+ <td><input type="hidden" id="id" name="id" value="${obj.id}"><input type="hidden" id="name" name="name" value="${obj.name}">${obj.name}
+ <td><input type="hidden" id="useScope" name="useScope" value="${obj.useScope}">${obj.useScopeValue}
+ <td><input type="hidden" id="type" name="type" value="${obj.type}">${obj.typeValue}
+ <td><input type="hidden" id="timeValue" name="timeValue" value="${obj.timeValue}">${obj.timeValue}
+ <td><input type="hidden" id="userPopulation" name="userPopulation" value="${obj.userPopulation}">${obj.userPopulationValue}
+ <td><input type="number" id="count" name="count" value="${obj.count}">
+ </td><td><button onclick="deleteSub(this)">移除</button></td>
+ </tr>
+ @}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+
+ <div class="row" id="ticketSelect" >
+ <div class="form-group">
+ <div class="form-group">
+ <div class="col-sm-12">
+ <label class="col-sm-3 control-label">*赠送门票: </label>
+ <button onclick="ticketList()"
+ style="height: 22px;width: 82px;background-color: #4a8ff1;color: white;z-index: 15;position:relative;border: none;margin-top: 1%">
+ 添加门票
+ </button>
+ </div>
+ <div class="col-sm-12" style="margin-left: -57px;margin-top: 20px">
+ <table class="table table-bordered" style="width: 70%;margin-left: 228px;" id="ticketTable">
+ <thead>
+ <tr>
+ <td>门票名称</td>
+ <td>领取后X天有效</td>
+ <td>可用次数</td>
+ <td>操作</td>
+ </tr>
+ </thead>
+ <tbody id="ticket">
+ @for(obj in ticketList){
+ <tr class="timeClass1">
+ <td><input type="text" id="name" name="name" value="${obj.name}">
+ <td><input type="number" id="time" name="time" value="${obj.time}">
+ <td><input type="number" id="count" name="count" value="${obj.count}">
+ </td><td><button onclick="deleteSub(this)">移除</button></td></tr>
+ </tr>
+ @}
+ </tbody>
+ </table>
+ </div>
+ </div>
+ </div>
+ </div>
+ <div class="row btn-group-m-t">
+ <div class="col-sm-10 col-sm-offset-5">
+ <#button btnCss="info" name="提交" id="ensure" icon="fa-check" clickFun="VipInfo.editSubmit()"/>
+ <#button btnCss="danger" name="取消" id="cancel" icon="fa-eraser" clickFun="VipInfo.close()"/>
+ </div>
+ </div>
+ </div>
+ </div>
+</div>
+</div>
+</div>
+<script src="${ctxPath}/js/vue/vue.js"></script>
+<script src="${ctxPath}/js/elementui/index.js"></script>
+<link rel="stylesheet" href="${ctxPath}/js/elementui/index.css">
+<script src="${ctxPath}/modular/system/vip/vip_info.js"></script>
+<script>
+
+ function couponList(){
+ var index = layer.open({
+ type: 2,
+ title: '优惠券列表',
+ area: ['80%', '80%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/couponList'
+ });
+ this.layerIndex = index;
+ }
+
+ // 存储门票数据的数组
+ var ticketData = [];
+
+ function ticketList(){
+ var str="";
+ str += '<tr class="timeClass1">' +
+ '<td><input type="text" id="name" name="name" value="">' +
+ '<td><input type="number" id="time" name="time" value="">' +
+ '<td><input type="number" id="count" name="count" value=""' +
+ '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+
+ $("#ticket").append(str);
+ }
+ function deleteSub(e) {
+ $(e).parent().parent().remove();
+ }
+</script>
+@}
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/vip/TCoupon.js b/cloud-server-management/src/main/webapp/static/modular/system/vip/TCoupon.js
new file mode 100644
index 0000000..12aff73
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/vip/TCoupon.js
@@ -0,0 +1,335 @@
+/**
+ * 管理初始化
+ */
+var TCoupon = {
+ id: "TCouponTable", //表格id
+ seItem: null, //选中的条目
+ table: null,
+ layerIndex: -1
+};
+
+/**
+ * 初始化表格的列
+ */
+TCoupon.initColumn = function () {
+ return [
+ {field: 'selectItem', checkbox: true},
+ {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle'},
+ {title: '优惠券名称', field: 'name', visible: true, align: 'center', valign: 'middle'},
+ {title: '适用范围', field: 'useScope', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "全国", 2: "指定城市", 3: "指定门店"}[value]
+ }
+ },
+ {title: '优惠券类型', field: 'type', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "满减券", 2: "代金券", 3: "体验券"}[value]
+ }},
+ {title: '发放方式', field: 'distributionMethod', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "积分购买", 2: "注册赠送", 3: "自动发券",4:"课包赠送"}[value]
+ }},
+ {title: '有效期', field: 'timeValue', visible: true, align: 'center', valign: 'middle'},
+ {title: '用户人群', field: 'userPopulation', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "全部用户", 2: "年度会员", 3: "已有学员用户"}[value]
+ }},
+ {title: '活动状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "未开始", 2: "已开始", 3: "已结束"}[value]
+ }},
+ {title: '可售状态', field: 'state', visible: true, align: 'center', valign: 'middle',
+ formatter: function (value, row, index) {
+ return {1: "上架", 2: "下架"}[value]
+ }},
+
+
+ ];
+};
+
+/**
+ * 检查是否选中
+ */
+TCoupon.check = function () {
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ if(selected.length == 0){
+ Feng.info("请先选中表格中的某一记录!");
+ return false;
+ }else{
+ TCoupon.seItem = selected[0];
+ return true;
+ }
+};
+
+/**
+ * 点击添加
+ */
+TCoupon.openAdd = function () {
+ var index = layer.open({
+ type: 2,
+ title: '添加',
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/tCouponManage/coupon_add'
+ });
+ this.layerIndex = index;
+};
+
+
+/**
+ * 点击编辑
+ */
+TCoupon.openChange = function () {
+ if (this.check()){
+ let size = TCoupon.seItem.size
+
+ if(size>0){
+ Feng.info("没有该权限");
+ return;
+ }
+ let publisherType = TCoupon.seItem.publisherType;
+ if ($("#objectType").val()==2){
+ if(publisherType != 1){
+ Feng.info("不能操作平台添加的优惠券");
+ return;
+ }
+ }
+ let id = TCoupon.seItem.id
+ let name = TCoupon.seItem.name
+ let quantityIssued = TCoupon.seItem.quantityIssued
+ let pickUpQuantity = TCoupon.seItem.pickUpQuantity
+ let illustrate = TCoupon.seItem.illustrate
+ let hasPickQty = TCoupon.seItem.hasPickQty
+ var index = layer.load(1,{
+ type: 1
+ , title: '编辑优惠券'
+ , area: ['50%', '50%']
+ , offset: 'auto' //具体配置参考:http://www.layui.com/doc/modules/layer.html#offset
+ , id: 'layerDemo' //防止重复弹出cge
+ , content: '<div class="form-horizontal">' +
+ ' <div class="col-sm-11" >' +
+ ' <div class="col-sm-11">' +
+ ' <div class="form-group">\n' +
+ ' <label class="col-sm-3 control-label">优惠券名称:</label>\n' +
+ ' <div class="col-sm-9">\n' +
+ ' <label class="form-control" id="name" >'+name+'</label> '+
+ ' </div>\n' +
+ ' </div>\n'+
+ ' <div class="form-group">\n' +
+ ' <label class="col-sm-3 control-label">发放数量:</label>\n' +
+ ' <div class="col-sm-9">\n' +
+ ' <input class="form-control" id="num" value="'+quantityIssued+'" > '+
+ ' </div>\n' +
+ ' </div>\n' +
+ ' <div class="form-group">\n' +
+ ' <label class="col-sm-3 control-label">限领数量:</label>\n' +
+ ' <div class="col-sm-9">\n' +
+ ' <input class="form-control" id="num1" value="'+pickUpQuantity+'" > '+
+ ' </div>\n' +
+ ' </div>\n' +
+ ' <div class="form-group">\n' +
+ ' <label class="col-sm-3 control-label">优惠券说明:</label>\n' +
+ ' <div class="col-sm-9">\n' +
+ ' <textarea class="form-control" id="text" >'+illustrate+'</textarea> '+
+ ' </div>\n' +
+ ' </div>\n' +
+ ' </div>' +
+ ' </div>' +
+ '</div>'
+ , btn: ['关闭', '保存']
+ , btnAlign: 'c' //按钮居中
+ , shade: 0.5 //不显示遮罩
+ ,load:1
+ , yes: function () {
+ layer.closeAll();
+ },
+ btn2:function () {
+ let num = $("#num").val()
+ if(num==''){
+ Feng.info("请输入发放数量")
+ return false;
+ }
+ let num1 = $("#num1").val()
+ if(num1==''){
+ Feng.info("请输入限领数量")
+ return false;
+ }
+ let text = $("#text").val()
+ if(text==''){
+ Feng.info("请输入优惠券说明")
+ return false;
+ }
+
+ if(num<hasPickQty){
+ Feng.info("发放数量不能小于已领取数量")
+ return false;
+ }
+ var ajax = new $ax(Feng.ctxPath + "/tCouponManage/update", function (data) {
+ if (data.code == 200) {
+ Feng.success("操作成功!");
+ window.location.reload();
+ window.parent.layer.closeAll();
+ } else if(data=="repeat"){
+ window.location.reload();
+ window.parent.layer.closeAll();
+ Feng.error("请勿重复操作");
+ }else {
+ return Feng.error(data.msg);
+ }
+ }, function (data) {
+ Feng.error("操作失败!")
+ window.location.reload();
+ window.parent.layer.closeAll();
+ return Feng.error("操作失败!");
+ });
+ ajax.set("id", id);
+ ajax.set("num", num);
+ ajax.set("num1", num1);
+ ajax.set("text", text);
+ ajax.start();
+ layer.closeAll();
+ }
+ });
+
+ this.layerIndex = index;
+ }
+};
+
+
+
+/**
+ * 上架
+ */
+
+
+/**
+ * 下架
+ */
+TCoupon.offShelf = function () {
+
+
+};
+
+
+/**
+ * 打开查看详情
+ */
+TCoupon.openDetail = function () {
+ if (this.check()) {
+ var index = layer.open({
+ type: 2,
+ title: '详情',
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/tCouponManage/coupon_detail/' + TCoupon.seItem.id
+ });
+ this.layerIndex = index;
+ }
+};
+
+
+
+
+/**
+ * 打开领取记录
+ */
+TCoupon.openCollectionRecord = function () {
+ if (this.check()) {
+ var index = layer.open({
+ type: 2,
+ title: '详情',
+ area: ['800px', '420px'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/tCouponManage/coupon_record/' + TCoupon.seItem.id
+ });
+ this.layerIndex = index;
+ }
+};
+TCoupon.onShelf = function (e) {
+ if (this.check()) {
+ let size = TCoupon.seItem.size
+ if(size>0){
+ Feng.info("没有该权限");
+ return;
+ }
+ var ajax = new $ax(Feng.ctxPath + "/tCouponManage/onShelf", function(data){
+ if(data.code==200){
+ Feng.success("操作成功!")
+ TCoupon.table.refresh();
+ }
+ },function(data){
+ Feng.error("操作失败!" + data.responseJSON.message + "!");
+ });
+ ajax.set("id",TCoupon.seItem.id)
+ ajax.set("type",e)
+ ajax.start();
+ }
+};
+
+
+
+/**
+ * 查询列表
+ */
+TCoupon.search = function () {
+ var queryData = {};
+ queryData['name'] = $("#name").val();
+ queryData['type'] = $("#type").val();
+ queryData['status'] = $("#status").val();
+ queryData['state'] = $("#state").val();
+ TCoupon.table.refresh({query: queryData});
+};
+TCoupon.storeOfClosePage = function (){
+ parent.layer.close(parent.layer.getFrameIndex(window.frameElement.id));
+}
+
+TCoupon.saveSelectStores = function (){
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ if (selected.length == 0) {
+ Feng.info("请先选中表格中的某一记录!");
+ return false;
+ }
+ var arr = [];
+ var name ='';
+ for(var i in selected){
+ console.log(selected)
+ if(typeof selected[i].id != "undefined"){
+ arr.push({
+ id: selected[i].id,
+ name: typeof selected[i].name != "undefined" ? selected[i].name : "",
+ useScope: typeof selected[i].useScope != "undefined" ? selected[i].useScope ==1?"全国":selected[i].useScope ==2?"指定城市":"指定门店" : "",
+ type: typeof selected[i].type != "undefined" ? selected[i].type ==1?"满减券":selected[i].useScope ==2?"代金券":"体验券" : "",
+ distributionMethod: typeof selected[i].distributionMethod != "undefined" ? selected[i].distributionMethod ==1?"积分购买":selected[i].distributionMethod ==2?"注册赠送":selected[i].distributionMethod ==3? "自动发券": "课包赠送":"",
+ timeValue: typeof selected[i].timeValue != "undefined" ? selected[i].timeValue : "",
+ userPopulation: typeof selected[i].userPopulation != "undefined" ? selected[i].userPopulation ==1?"全部用户":selected[i].userPopulation ==2?"会员":"已有学员用户" : "",
+ status: typeof selected[i].status != "undefined" ? selected[i].status ==1?"未开始":selected[i].useScope ==2?"已开始":"已结束" : "",
+ state: typeof selected[i].state != "undefined" ?selected[i].state ==1?"上架":"下架" : "",
+ })
+ }
+ }
+ console.log(arr)
+ window.parent.VipInfo.selecUserOpt(arr);
+ TCoupon.storeOfClosePage();
+}
+
+/**
+ * 重置搜索
+ */
+TCoupon.resetSearch = function () {
+ $("#name").val('');
+ $("#type").val('');
+ $("#status").val('');
+ $("#state").val('');
+ TCoupon.search();
+};
+
+$(function () {
+ var defaultColunms = TCoupon.initColumn();
+ var table = new BSTable(TCoupon.id, "/tCouponManage/listSelect", defaultColunms);
+ table.setPaginationType("client");
+ TCoupon.table = table.init();
+
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/vip/vip.js b/cloud-server-management/src/main/webapp/static/modular/system/vip/vip.js
new file mode 100644
index 0000000..42ee1b4
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/vip/vip.js
@@ -0,0 +1,557 @@
+/**
+ * 跨城站点管理管理初始化
+ */
+var Vip = {
+ id: "VipTable", //表格id
+ seItem: null, //选中的条目
+ table: null,
+ layerIndex: -1,
+ picture:"",
+ fileUrl:"",
+ img:"",
+ plan:"",
+ goodsPicArray:[],
+ validateFields: {
+ }
+};
+var objectType =$("#objectType").val()
+/**
+ * 初始化表格的列
+ */
+Vip.initColumn = function () {
+ return [
+ {field: 'selectItem', checkbox: true},
+ {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle'},
+ {title: '会员卡名称', field: 'vipName', visible: true, align: 'center', valign: 'middle'},
+ {title: '价格', field: 'price', visible: true, align: 'center', valign: 'middle'},
+ {title: '时长', field: 'time', visible: true, align: 'center', valign: 'middle'},
+ {
+ title: '状态', field: 'status', visible: true, align: 'center', valign: 'middle',
+ formatter: function(data) {
+ return {1: '上架中', 2: '下架中'}[data];
+ }
+ }
+ ];
+};
+
+/**
+ * 检查是否选中
+ */
+Vip.check = function () {
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ if(selected.length == 0){
+ Feng.info("请先选中表格中的某一记录!");
+ return false;
+ }else{
+ Vip.seItem = selected[0];
+ return true;
+ }
+};
+/**
+ * 上架
+ */
+
+Vip.onShelf = function () {
+ if (this.check()){
+ var ajax = new $ax(Feng.ctxPath + "/vip/onShelf", function (data) {
+ Feng.success("上架成功!");
+ Vip.table.refresh();
+ }, function (data) {
+ Feng.error("上架失败!" + data.responseJSON.message + "!");
+ });
+ ajax.set("id",this.seItem.id);
+ ajax.start();
+ }
+};
+Vip.offShelf = function () {
+ if (this.check()){
+ var ajax = new $ax(Feng.ctxPath + "/vip/offShelf", function (data) {
+ Feng.success("下架成功!");
+ Vip.table.refresh();
+ }, function (data) {
+ Feng.error("下架失败!" + data.responseJSON.message + "!");
+ });
+ ajax.set("id",this.seItem.id);
+ ajax.start();
+ }
+};
+/**
+ * 下架
+ */
+Vip.offShelf = function () {
+ if (this.check()){
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ const data1 = {
+ siteIds:[],
+ type:null
+ };
+ selected.forEach(function(obj) {
+ var id = obj.id;
+ data1.siteIds.push(id);
+ });
+ data1.type = 2;
+ $.ajax({
+ url: Feng.ctxPath + "/tSite/changeState",
+ type: "POST",
+ contentType: "application/json", // 设置请求头的 Content-Type
+ data: JSON.stringify(data1), // 将数据转换为 JSON 字符串
+ success: function(response) {
+ Feng.success("下架成功!");
+ Vip.search();
+ },
+ error: function(xhr, status, error) {
+ var errorMessage = xhr.responseText ? xhr.responseText : "下架失败!";
+ Feng.error("您的网络异常!");
+ }
+ });
+ }
+};
+/**
+ * 跳转添加场地页面
+ */
+Vip.add = function () {
+
+ var index = layer.open({
+ type: 2,
+ title: "添加会员卡",
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/add'
+ });
+ this.layerIndex = index;
+};
+
+/**
+ * 打开场地管理查看详情
+ */
+Vip.detail = function () {
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ if(selected.length >1 ){
+ Feng.info("只能选择一个会员卡查看!");
+ }else {
+ if (this.check()) {
+ var index = layer.open({
+ type: 2,
+ title: "查看详情",
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/detail/' + Vip.seItem.id
+ });
+ this.layerIndex = index;
+ }
+ }
+};
+/**
+ * 打开场地管理编辑
+ */
+Vip.edit = function () {
+ var selected = $('#' + this.id).bootstrapTable('getSelections');
+ if(selected.length >1 ){
+ Feng.info("只能选择一个会员卡进行编辑!");
+ }else {
+ if (this.check()) {
+ var index = layer.open({
+ type: 2,
+ title: "编辑会员卡",
+ area: ['100%', '100%'], //宽高
+ fix: false, //不固定
+ maxmin: true,
+ content: Feng.ctxPath + '/vip/edit/' + Vip.seItem.id
+ });
+ this.layerIndex = index;
+ }
+ }
+};
+/**
+ * 关闭此对话框
+ */
+Vip.close = function() {
+ parent.layer.close(window.parent.Vip.layerIndex);
+}
+
+var sh = ""; // 门店经营开始时间:小时
+var sm = "";// 门店经营开始时间:分钟
+var eh = "";// 门店经营结束时间:小时
+var em = "";// 门店经营结束时间:分钟
+
+Vip.addSubmit = function(){
+ var data = {
+ province:"",
+ city:"",
+ cityManagerId:"",
+ storeId:"",
+ siteTypeId:null,
+ appointmentStartTime:"",
+ appointmentEndTime:"",
+ cashPrice:null,
+ playPaiCoin:null,
+ insuranceEndTime:"",
+ name:"",
+ insuranceImg:"",
+ managementPlan:"",
+ operatorId:"",
+ typeName:"",
+ nextName:"",
+ ishalf:"",
+ cashPriceOne:"",
+ playPaiCoinOne:"",
+ halfName:"",
+ introduce:"",
+ imgs:"",
+ reservation:"",
+ isCanBeBooked:"",
+ type:"",
+
+ };
+ data.province = $("#pCode").val()
+ data.city = $("#cCode").val()
+ data.cityManagerId = $("#account").val()
+ data.storeId = $("#store").val()
+ data.siteTypeId = $("#siteTypeId").val()
+ data.appointmentStartTime= $("#start-time").val()
+ data.appointmentEndTime = $("#end-time").val()
+ data.cashPrice = $("#cashPrice").val()
+ data.playPaiCoin = $("#playPaiCoin").val()
+ data.insuranceEndTime = $("#insuranceEndTime").val()
+ data.name = $("#name").val()
+ data.insuranceImg = $("#img").val()
+ data.managementPlan = $('#courseVideo').val()
+ data.typeName = $('#siteTypeOne').val()
+ var sh =data.appointmentStartTime.split(':')[0];
+ var sm =data.appointmentStartTime.split(':')[1];
+ var eh =data.appointmentEndTime.split(':')[0];
+ var em =data.appointmentEndTime.split(':')[1];
+
+
+ console.log(data.typeName)
+
+ var reservation= $("input[name='reservation']:checked").val();
+ data.reservation= reservation;
+ data.isCanBeBooked= reservation;
+ console.log("看看是否可预约值")
+ console.log(reservation);
+ var checkbox = document.querySelector('input[name="pt"]');
+ console.log(checkbox)
+ if (checkbox!=null){
+ if (checkbox.checked) {
+ data.type = 1
+ console.log("选中是平台");
+ data.operatorId = 0;
+ } else {
+ console.log("运营商");
+ data.type = 2;
+ }
+ }
+
+ if (reservation == 1) {
+ if (data.typeName === "智慧场地") {
+ console.log("===========这是智慧球场")
+
+ console.log("=====" + data.appointmentStartTime)
+
+ var value = data.appointmentStartTime;
+ var lastTwoDigits = value.slice(-2);
+
+ if (lastTwoDigits === "00" || lastTwoDigits === "15" || lastTwoDigits === "30" || lastTwoDigits === "45") {
+ console.log("Last two digits are 00, 15, 30, or 45");
+ } else {
+ Feng.error("智慧场地的可预约时间段是15分钟的倍数")
+ return;
+
+ }
+
+
+ var value1 = data.appointmentEndTime;
+ var lastTwoDigits1 = value1.slice(-2);
+
+ if (lastTwoDigits1 === "00" || lastTwoDigits1 === "15" || lastTwoDigits1 === "30" || lastTwoDigits1 === "45") {
+ console.log("Last two digits are 00, 15, 30, or 45");
+ } else {
+ Feng.error("智慧场地的可预约时间段是15分钟的倍数")
+ return;
+
+ }
+
+
+ } else {
+ console.log("===========这是普通球场")
+
+ console.log("=====" + data.appointmentStartTime)
+ var value = data.appointmentStartTime;
+ var lastTwoDigits = value.slice(-2);
+
+ if (lastTwoDigits === "00" || lastTwoDigits === "30") {
+ console.log("Last two digits are 00, 15, 30, or 45");
+ } else {
+ Feng.info("普通场地可预约时间段需是30分钟的倍数")
+ return;
+ }
+
+
+ var value1 = data.appointmentEndTime;
+ var lastTwoDigits1 = value1.slice(-2);
+
+ if (lastTwoDigits1 === "00" || lastTwoDigits1 === "30") {
+ console.log("Last two digits are 00, 15, 30, or 45");
+ } else {
+ Feng.info("普通场地可预约时间段需是30分钟的倍数")
+ return;
+
+ }
+ }
+ }
+ var SelectValue="";
+ var getSelectValueMenbers = $("input[name='pt']:checked").each(function(j) {
+ if (j >= 0) {
+ SelectValue += $(this).val()
+ }
+ });
+ if(SelectValue==''){
+ let yys = $("#yys").val()
+ if(yys==""){
+ Feng.info("请选择运营商")
+ return;
+ }
+ SelectValue= yys
+ }
+ data.operatorId= SelectValue;
+ let num24 = $('input[name="name1"]');
+ var nextName="";
+ for (let i = 0; i < num24.length; i++) {
+ if($(num24[i]).val()==''){
+ Feng.info("请填写场地名称")
+ return;
+ }
+ if(i==num24.length-1){
+ nextName += $(num24[i]).val()
+ }else {
+ nextName += $(num24[i]).val()+","
+ }
+ }
+ data.nextName= nextName;
+ var ishalf= $("input[name='ishalf']:checked").val();
+ data.ishalf= ishalf;
+
+ var halfName="";
+ if (reservation==1) {
+ if (ishalf == 1) {
+ let cashPriceOne = $("#cashPriceOne").val()
+ if (cashPriceOne == '') {
+ Feng.info("请填写现金价格")
+ return;
+ }
+ data.cashPriceOne = cashPriceOne;
+
+ let playPaiCoinOne = $("#playPaiCoinOne").val()
+ if (playPaiCoinOne == '') {
+ Feng.info("请填写玩湃币价格")
+ return;
+ }
+
+ data.playPaiCoinOne = playPaiCoinOne;
+ let num2 = $('input[name="name2"]');
+ for (let i = 0; i < num2.length; i++) {
+ if ($(num2[i]).val() == '') {
+ Feng.info("请填写半场名称")
+ return;
+ }
+ if (i == num2.length - 1) {
+ halfName += $(num2[i]).val()
+ } else {
+ halfName += $(num2[i]).val() + ","
+ }
+ }
+ }
+ }
+
+
+ data.halfName= halfName;
+
+ let introduce ;
+ if (objectType==1){
+ introduce = Vip.editor.getContent();
+ }
+
+ console.log(introduce)
+ if(introduce==""){
+ Feng.info("请输入公告内容")
+ return;
+ }
+ data.introduce= introduce;
+
+
+ var goodImgs = this.goodsPicArray;
+ if(objectType==1){
+ if(goodImgs.length==0){
+ Feng.info("请上传实景图")
+ return;
+ }
+ }
+
+ var imgOne ="";
+ for (let i = 0; i <goodImgs.length; i++) {
+ if(i==goodImgs.length-1){
+ imgOne += (goodImgs[i].response)
+ }else {
+ imgOne+=(goodImgs[i].response+",")
+ }
+
+ }
+ data.imgs = imgOne
+
+
+
+ if($("#store").val()=='' ){
+ Feng.info("请选择门店")
+ return;
+ }
+ if($("#siteTypeId").val()=='' ){
+ Feng.info("请选择场地分类")
+ return;
+ }
+ if($("#name").val()==''){
+ Feng.info("请输入场地名称")
+ return;
+ }
+
+ if (reservation==1){
+ if($("#start-time").val()=='' ){
+ Feng.info("请输入可预约时间段 开始时间")
+ return;
+ }
+ if($("#end-time").val()==''){
+ Feng.info("请输入可预约时间段 结束时间")
+ return;
+ }
+ if($("#cashPrice").val()==''){
+ Feng.info("请输入现金价格")
+ return;
+ }
+ if($("#playPaiCoin").val()==''){
+ Feng.info("请输入玩湃币价格")
+ return;
+ }
+ }
+ if($("#insuranceEndTime").val()==''){
+ Feng.info("请输入场地责任险有效期")
+ return;
+ }
+ if($("#img").val()==''){
+ Feng.info("请上传场地责任有效期图片")
+ return;
+ }
+ if($('#courseVideo').val()==''){
+ Feng.info("请上传消防及应急管理方案")
+ return;
+ }
+ var sTime = document.getElementById("start-time"); //获取输入的开始时间
+ var eTime = document.getElementById("end-time"); // 获取输入的结束时间
+ var rStime = ""; //门店的经营开始时间
+ var rEtime = ""; //门店的经营结束时间
+ var selectedText = $('#store option:selected').text();
+ $.ajax({
+ url: Feng.ctxPath + "/tSite/getTime/" + selectedText,
+ type: "GET",
+ contentType: "application/json", // 设置请求头的 Content-Type
+ success: function (response) {
+ if (reservation==1) {
+ rStime = response.startTime;
+ sh = rStime.split(':')[0];// 门店经营开始时间:小时
+ sm = rStime.split(':')[1];// 门店经营开始时间:分钟
+
+ rEtime = response.endTime;
+ eh = rEtime.split(':')[0];// 门店经营结束时间:小时
+ em = rEtime.split(':')[1];// 门店经营结束时间:分钟
+
+ var start = sTime.value;
+ var startHour = start.split(':')[0]; // 输入的可预约开始时间:小时
+ var startMinute = start.split(':')[1];// 输入的可预约开始时间:分钟
+ if (Number(sh) > Number(startHour)) {
+ Feng.error("预约的开始时间不应小于营业开始时间!")
+ return false;
+ } else if (Number(sh) === Number(startHour)) {
+ if (Number(sm) > Number(startMinute)) {
+ Feng.error("预约的开始时间不应大于营业开始时间!")
+ return false;
+ }
+ } else if (Number(eh) < Number(startHour)) {
+ Feng.error("预约的开始时间不应大于营业结束时间!")
+ return false;
+ } else if (Number(eh) === Number(startHour)) {
+ Feng.error("预约的开始时间不应大于等于营业结束时间!")
+ return false;
+ }
+ var end = eTime.value;
+ var endHour = end.split(':')[0]; // 输入的可预约结束时间:小时
+ var endMinute = end.split(':')[1];// 输入的可预约结束时间:分钟
+ if (Number(eh) < Number(endHour)) {
+ Feng.error("预约的结束时间不应大于营业结束时间!")
+ return;
+ } else if (Number(eh) === Number(endHour)) {
+ if (Number(em) < Number(endMinute)) {
+ Feng.error("预约的开始时间不应大于开始营业时间!")
+ return;
+ }
+ } else if (Number(sh) > Number(endHour)) {
+ Feng.error("预约的结束时间不应小于营业开始时间!")
+ return;
+ }
+ if (Number(endHour) === Number(sh)) {
+ if (Number(endMinute) < Number(sm)) {
+ Feng.error("预约结束时间不应小于营业开始时间");
+ return;
+ }
+ }
+ if (Number(startHour) === Number(endHour) && Number(startMinute) === Number(endMinute)) {
+ Feng.error("至少预约半个小时");
+ return;
+ }
+ }
+ $.ajax({
+ url: Feng.ctxPath + "/tSite/addSite" ,
+ type: "POST",
+ data: JSON.stringify(data),
+ contentType: "application/json",
+ success: function (response) {
+ window.parent.Vip.table.refresh();
+ Vip.close();
+ Feng.success("添加成功");
+ },
+ error: function (xhr, status, error) {
+ Feng.error("添加失败!" + error);
+ }
+ });
+ },
+ error: function (xhr, status, error) {
+ var errorMessage = xhr.responseText ? xhr.responseText : "上架失败!";
+ Feng.error("您的网络异常!");
+ return false;
+ }
+ });
+};
+
+Vip.search = function () {
+ var queryData = {};
+ queryData['vipName'] = $("#vipName").val();
+ queryData['status'] = $("#status").val();
+ Vip.table.refresh({query: queryData});
+};
+
+Vip.resetSearch = function () {
+ $("#vipName").val("");
+ $("#status").val("");
+ Vip.search();
+};
+
+function UploadFileFn(){
+ $('#upFile').click();
+}
+
+$(function () {
+ var defaultColunms = Vip.initColumn();
+ var table = new BSTable(Vip.id, "/vip/list", defaultColunms);
+ table.setPaginationType("client");
+ Vip.table = table.init();
+});
diff --git a/cloud-server-management/src/main/webapp/static/modular/system/vip/vip_info.js b/cloud-server-management/src/main/webapp/static/modular/system/vip/vip_info.js
new file mode 100644
index 0000000..71dad58
--- /dev/null
+++ b/cloud-server-management/src/main/webapp/static/modular/system/vip/vip_info.js
@@ -0,0 +1,278 @@
+/**
+ * 初始化车辆管理详情对话框
+ */
+var language=1;
+var VipInfo = {
+ layerIndex: -1,
+ validateFields: {
+ },
+ goodsPicArray:[],
+ couponIds: [],
+
+};
+
+/**
+ * 验证数据是否为空
+ */
+VipInfo.validate = function () {
+ $('#carInfoForm').data("bootstrapValidator").resetForm();
+ $('#carInfoForm').bootstrapValidator('validate');
+ return $("#carInfoForm").data('bootstrapValidator').isValid();
+};
+
+/**
+ * 清除数据
+ */
+VipInfo.clearData = function() {
+ this.tCarInfoData = {};
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+VipInfo.set = function(key, val) {
+ this.tCarInfoData[key] = (typeof val == "undefined") ? $("#" + key).val() : val;
+ return this;
+}
+
+/**
+ * 设置对话框中的数据
+ *
+ * @param key 数据的名称
+ * @param val 数据的具体值
+ */
+VipInfo.get = function(key) {
+ return $("#" + key).val();
+}
+VipInfo.selecUserOpt = function (arrays){
+ //获取所有的值
+ var subArr= this.couponIds;
+ $(".timeClass").each(function () {
+ subArr.push($(this).find("input[name*='id']").val());
+ });
+ var str = '';
+ for(var i in arrays){
+ var b = true;
+ for(var j in subArr){
+ if(arrays[i].id === Number(subArr[j])){
+ b = false;
+ break
+ }
+ }
+ if(b){
+ this.couponIds.push(arrays[i].id)
+ str += '<tr class="timeClass">' +
+ '<td><input type="hidden" id="id" name="id" value="'+arrays[i].id+'"><input type="hidden" id="name" name="name" value="'+arrays[i].name+'">' + arrays[i].name +
+ '<td><input type="hidden" id="useScope" name="useScope" value="'+arrays[i].useScope+'">' + arrays[i].useScope +
+ '<td><input type="hidden" id="type" name="type" value="'+arrays[i].type+'">' + arrays[i].type +
+ '<td><input type="hidden" id="timeValue" name="timeValue" value="'+arrays[i].timeValue+'">' + arrays[i].timeValue +
+ '<td><input type="hidden" id="userPopulation" name="userPopulation" value="'+arrays[i].userPopulation+'">' + arrays[i].userPopulation +
+ '<td><input type="number" id="count" name="count" value="1">' +
+ '</td><td><button onclick="deleteSub(this)">移除</button></td></tr>';
+ }
+ }
+ console.log("添加门店后的场地数组和门店数组")
+ console.log(this.storeIds)
+ console.log(this.siteIds)
+ $("#coun").append(str);
+}
+VipInfo.collectDataToJson = function() {
+ var dataArray = []; // 用于存储所有行数据的数组
+
+ // 遍历所有具有 timeClass 类的 tr 元素
+ $(".timeClass").each(function() {
+ var rowData = {}; // 用于存储当前行数据的对象
+
+ // 提取每个隐藏 input 的值并存入 rowData 对象
+ // 使用 $(this) 确保在当前行内查找
+ rowData.id = $(this).find("input[name='id']").val();
+ rowData.value = $(this).find("input[name='count']").val();
+
+ // 将当前行的数据对象添加到数组中
+ dataArray.push(rowData);
+ });
+
+ return dataArray;
+}
+
+VipInfo.collectDataToJson1 = function() {
+ var dataArray = []; // 用于存储所有行数据的数组
+
+ // 遍历所有具有 timeClass 类的 tr 元素
+ $(".timeClass1").each(function() {
+ var rowData = {}; // 用于存储当前行数据的对象
+
+ // 提取每个隐藏 input 的值并存入 rowData 对象
+ // 使用 $(this) 确保在当前行内查找
+ rowData.name = $(this).find("input[name='name']").val();
+ rowData.time = $(this).find("input[name='time']").val();
+ rowData.count = $(this).find("input[name='count']").val();
+ // 将当前行的数据对象添加到数组中
+ dataArray.push(rowData);
+ });
+
+
+
+ return dataArray; // 返回 JSON 字符串
+}
+
+function deleteSub(e) {
+ console.log(e);
+ var row = $(e).closest('tr');
+ var value = row.find('#id').val();
+ VipInfo.couponIds.splice(VipInfo.couponIds.indexOf(parseInt(value)), 1)
+ $(e).parent().parent().remove();
+ console.log('couponIds',VipInfo.couponIds)
+}
+VipInfo.addSubmit = function(){
+
+ if ($("#vipName").val() == '') {
+ Feng.info("请输入会员名称")
+ return;
+ }
+ if ($("#time").val() == '') {
+ Feng.info("请输入会员时长")
+ return;
+ }
+ if ($("#price").val() == '') {
+ Feng.info("请输入售价")
+ return;
+ }
+
+ var ajax = new $ax(Feng.ctxPath + "/vip/addVipInfo", function(data){
+ Feng.success("编辑成功!");
+ window.parent.Vip.table.refresh();
+ VipInfo.close();
+ });
+ var collectDataToJson = VipInfo.collectDataToJson();
+ var collectDataToJson1 = VipInfo.collectDataToJson1();
+ if (collectDataToJson.length == 0 && collectDataToJson1.length == 0){
+ Feng.error("优惠券和门票必须选择其中一类")
+ return;
+ }
+ if (collectDataToJson.length>0){
+ var collectDataToJson = JSON.stringify(collectDataToJson);
+ console.log("收集到的 优惠券JSON 数据:", collectDataToJson);
+ ajax.set("couponJson",collectDataToJson);
+
+ }
+ if (collectDataToJson1.length>0){
+ var collectDataToJson = JSON.stringify(collectDataToJson1);
+ console.log("收集到的 门票JSON 数据:", collectDataToJson);
+ ajax.set("ticketJson",collectDataToJson);
+
+ }
+ ajax.set("vipName",$("#vipName").val());
+ ajax.set("price",$("#price").val());
+ ajax.set("time",$("#time").val());
+ ajax.set("timeType",$("#timeType").val());
+ ajax.start();
+};
+VipInfo.editSubmit = function(){
+
+ if ($("#vipName").val() == '') {
+ Feng.info("请输入会员名称")
+ return;
+ }
+ if ($("#time").val() == '') {
+ Feng.info("请输入会员时长")
+ return;
+ }
+ if ($("#price").val() == '') {
+ Feng.info("请输入售价")
+ return;
+ }
+
+ var ajax = new $ax(Feng.ctxPath + "/vip/editVipInfo", function(data){
+ Feng.success("编辑成功!");
+ window.parent.Vip.table.refresh();
+ VipInfo.close();
+ });
+ var collectDataToJson = VipInfo.collectDataToJson();
+ var collectDataToJson1 = VipInfo.collectDataToJson1();
+ if (collectDataToJson.length == 0 && collectDataToJson1.length == 0){
+ Feng.error("优惠券和门票必须选择其中一类")
+ return;
+ }
+ if (collectDataToJson.length>0){
+ var collectDataToJson = JSON.stringify(collectDataToJson);
+ console.log("收集到的 优惠券JSON 数据:", collectDataToJson);
+ ajax.set("couponJson",collectDataToJson);
+
+ }
+ if (collectDataToJson1.length>0){
+ var collectDataToJson = JSON.stringify(collectDataToJson1);
+ console.log("收集到的 门票JSON 数据:", collectDataToJson);
+ ajax.set("ticketJson",collectDataToJson);
+
+ }
+ ajax.set("id",$("#vipId").val());
+
+ ajax.set("vipName",$("#vipName").val());
+ ajax.set("price",$("#price").val());
+ ajax.set("time",$("#time").val());
+ ajax.set("timeType",$("#timeType").val());
+ ajax.start();
+};
+VipInfo.close = function() {
+ parent.layer.close(window.parent.VipInfo.layerIndex);
+}
+VipInfo.oneChangeYys = function(e){
+ var oneId = $(e).val();
+ var checkbox = document.querySelector('input[name="pt"]');
+ if (checkbox.checked) {
+ oneId=0;
+ console.log("选中是平台");
+ }else{
+ oneId = 1;
+ console.log("运营商");
+ console.log(oneId)
+ }
+ if (oneId == "1"){
+ oneId = $("#yys").val()
+ if (oneId==""){
+ oneId = 1
+ }
+ console.log("看看选择之后")
+ console.log(oneId)
+ var button = document.getElementById("yys");
+ button.removeAttribute("disabled");
+ }
+ var ajax = new $ax(Feng.ctxPath + "/tSite/getChangeOne", function(data){
+ if(data!=null){
+ // var content1 = '<option value="0">平台</option>';
+ console.log("看看oneId")
+ console.log(oneId)
+ if (oneId == 0) {
+ console.log("锁住")
+ $("#yys").prop('disabled', true);
+ }else{
+ console.log("放开")
+ $("#yys").prop('disabled', false);
+ }
+
+ var content='<option value="">选择门店</option>';
+ $.each(data, function(k,v) {
+ content += "<option value='"+v.id+"'>"+v.name+"</option>";
+ });
+ $("#store").empty().append(content);
+ }
+ });
+
+
+
+ ajax.set("oneId",oneId);
+ ajax.start();
+};
+/**
+ * 关闭此对话框
+ */
+VipInfo.close = function() {
+ parent.layer.close(window.parent.Vip.layerIndex);
+}
+function UploadFileFn(){
+ $('#upFile').click();
+}
--
Gitblit v1.7.1