cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java
@@ -7,10 +7,7 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.dsh.activity.entity.Coupon; import com.dsh.activity.entity.CouponCity; import com.dsh.activity.entity.CouponStore; import com.dsh.activity.entity.UserCoupon; import com.dsh.activity.entity.*; import com.dsh.activity.feignclient.account.AppUserClient; import com.dsh.activity.feignclient.account.CityClient; import com.dsh.activity.feignclient.account.StoreStaffClient; @@ -29,14 +26,13 @@ import com.dsh.activity.feignclient.other.model.TOperatorCity; import com.dsh.activity.model.CouponListVo; import com.dsh.activity.model.CouponRecordQuery; import com.dsh.activity.model.VipDetailVO; import com.dsh.activity.model.request.CommodityRequest; import com.dsh.activity.model.request.CouponDataVo; import com.dsh.activity.model.request.CouponPackageReq; import com.dsh.activity.model.request.VipDetailDto; import com.dsh.activity.model.response.CouponPackageResp; import com.dsh.activity.service.CouponCityService; import com.dsh.activity.service.CouponStoreService; import com.dsh.activity.service.ICouponService; import com.dsh.activity.service.UserCouponService; import com.dsh.activity.service.*; import com.dsh.activity.util.GDMapGeocodingUtil; import com.dsh.activity.util.ResultUtil; import com.dsh.activity.util.TokenUtil; @@ -47,7 +43,9 @@ import io.swagger.annotations.ApiOperation; import io.swagger.models.auth.In; import org.checkerframework.checker.units.qual.A; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; @@ -67,6 +65,8 @@ @Autowired private ICouponService couponService; @Autowired private VipDetailService vipDetailService; @Autowired private TokenUtil tokenUtil; @@ -106,7 +106,41 @@ @PostMapping("/base/coupon/vipDetail") @ResponseBody List<VipDetailVO> vipDetail(VipDetailDto vipDetailDto){ List<VipDetailVO> vipDetailVOS = new ArrayList<>(); List<VipDetail> list = vipDetailService.lambdaQuery() .in(!vipDetailDto.getVipIds().isEmpty(), VipDetail::getVipId, vipDetailDto.getVipIds()) .in(!vipDetailDto.getUserIds().isEmpty(), VipDetail::getAppUserId, vipDetailDto.getUserIds()) .in(!vipDetailDto.getStoreIds().isEmpty(), VipDetail::getUseStoreId, vipDetailDto.getStoreIds()) .ge(StringUtils.hasLength(vipDetailDto.getStartTime()), VipDetail::getInsertTime, vipDetailDto.getStartTime()) .le(StringUtils.hasLength(vipDetailDto.getEndTime()), VipDetail::getInsertTime, vipDetailDto.getEndTime()) .ge(StringUtils.hasLength(vipDetailDto.getUseStartTime()), VipDetail::getUseTime, vipDetailDto.getUseStartTime()) .le(StringUtils.hasLength(vipDetailDto.getUseEndTime()), VipDetail::getUseTime, vipDetailDto.getUseEndTime()) .eq(vipDetailDto.getOperatorId() != null, VipDetail::getOperatorId, vipDetailDto.getOperatorId()) .eq(vipDetailDto.getType() != null, VipDetail::getType, vipDetailDto.getType()) .eq(vipDetailDto.getStatus() != null, VipDetail::getStatus, vipDetailDto.getStatus()).list(); // 使用 Stream + 手动拷贝提升性能和可读性(或使用 MapStruct) vipDetailVOS = list.stream().map(vipDetail -> { VipDetailVO vo = new VipDetailVO(); BeanUtils.copyProperties(vo, vipDetail); // 注意参数顺序是否正确 return vo; }).collect(Collectors.toList()); List<Coupon> coupons = couponService.list(); for (VipDetailVO vipDetailVO : vipDetailVOS) { if (vipDetailVO.getType()==1){ Coupon coupon = coupons.stream().filter(coupon1 -> coupon1.getId().equals(vipDetailVO.getCouponId())).findFirst().orElse(null); if (coupon!=null){ vipDetailVO.setTicketName(coupon.getName()); vipDetailVO.setGoodsName(coupon.getName()); } } } return vipDetailVOS; } /** * 查询注册赠送优惠券 判断当前优惠券限领数量 cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java
@@ -2,6 +2,7 @@ import com.baomidou.mybatisplus.annotation.IdType; 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; @@ -9,6 +10,7 @@ @Data @ApiModel(value = "VipDetail", description = "会员权益明细") @TableName("t_vip_detail") public class VipDetail { @ApiModelProperty(value = "主键") @@ -53,7 +55,8 @@ @ApiModelProperty(value = "使用场地id") private Integer useSiteId; @ApiModelProperty(value = "使用商品id") private Integer useGoodsId; @ApiModelProperty(value = "使用时间") private Date useTime; cloud-server-activity/src/main/java/com/dsh/activity/model/VipDetailVO.java
New file @@ -0,0 +1,84 @@ package com.dsh.activity.model; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * 会员权益明细列表 */ @Data public class VipDetailVO { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "用户id") private Integer appUserId; @ApiModelProperty(value = "用户名称") private String appUserName; @ApiModelProperty(value = "用户电话") private String appUserPhone; @ApiModelProperty(value = "使用状态 1待使用 2已使用 3已过期") private Integer status; @ApiModelProperty(value = "获取时间") private Date insertTime; @ApiModelProperty(value = "会员id") private Integer vipId; @ApiModelProperty(value = "会员名称") private String vipName; @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 = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @ApiModelProperty(value = "结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @ApiModelProperty(value = "可用次数") private Integer useCount; @ApiModelProperty(value = "使用门店id") private Integer useStoreId; @ApiModelProperty(value = "门店名称") private String storeName; @ApiModelProperty(value = "使用场地id") private Integer useSiteId; @ApiModelProperty(value = "使用商品id") private Integer useGoodsId; @ApiModelProperty(value = "使用商品/场地名称") private String goodsName; @ApiModelProperty(value = "使用时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date useTime; @ApiModelProperty(value = "运营商id") private Integer operatorId; @ApiModelProperty(value = "运营商名称") private String operatorName; @ApiModelProperty(value = "用户优惠券id") private Long userCouponId; } cloud-server-activity/src/main/java/com/dsh/activity/model/request/VipDetailDto.java
New file @@ -0,0 +1,32 @@ package com.dsh.activity.model.request; import lombok.Data; import java.util.List; /** * 会员权益明细 */ @Data public class VipDetailDto { // 会员ids List<Integer> vipIds; // 用户ids List<Integer> userIds; // 门店ids List<Integer> storeIds; // 获得时间 开始 String startTime; // 获得时间 结束 String endTime; // 使用时间开始 String useStartTime; // 使用时间结束 String useEndTime; // 运营商id Integer operatorId; // 使用状态 1未使用 2已使用 3已过期 Integer status; // 权益类型 1优惠券2门票 Integer type; } cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java
@@ -4,6 +4,8 @@ import com.dsh.course.feignClient.activity.model.*; import com.dsh.guns.modular.system.model.CouponDataVo; import com.dsh.guns.modular.system.model.CouponStore; import com.dsh.guns.modular.system.model.dto.VipDetailDto; import com.dsh.guns.modular.system.model.vo.VipDetailVO; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; @@ -62,4 +64,6 @@ void updateType(Long id); @PostMapping("/base/pointMerchars/goodsList") List<PointsMerchandise> goodsList(); @PostMapping("/base/coupon/vipDetail") List<VipDetailVO> vipDetail(VipDetailDto vipDetailDto); } cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipDetailController.java
@@ -3,19 +3,24 @@ 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.extension.plugins.pagination.Page; import com.dsh.course.feignClient.account.AppUserClient; import com.dsh.course.feignClient.account.model.QueryByNamePhone; import com.dsh.course.feignClient.account.model.TAppUser; 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.config.UserExt; 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.IProtocolService; import com.dsh.guns.modular.system.service.IStoreService; import com.dsh.guns.modular.system.service.IVipService; import com.dsh.guns.modular.system.model.dto.VipDetailDto; import com.dsh.guns.modular.system.model.dto.VipPaymentDto; import com.dsh.guns.modular.system.model.vo.VipDetailVO; import com.dsh.guns.modular.system.model.vo.VipPaymentVO; import com.dsh.guns.modular.system.service.*; import com.dsh.guns.modular.system.util.ResultUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; @@ -44,7 +49,11 @@ private IStoreService storeService; @Autowired private AppUserClient appUserClient; private String PREFIX = "/system/vip/"; @Autowired private ITSiteService siteService; @Autowired private TOperatorService operatorService; private String PREFIX = "/system/vipPayment/"; /** @@ -52,8 +61,7 @@ */ @RequestMapping("") public String index(Model model) { return PREFIX + "vipDetail.html"; return PREFIX + "vip_payment.html"; } /** @@ -61,176 +69,49 @@ */ @RequestMapping(value = "/list") @ResponseBody public List<Map<String, Object>> list(String vipName, Integer type , Integer phone, String storeName , Integer operatorId, Integer status , String startTime, String endTime , Integer useStartTime, Integer useEndTim) { // 根据会员名查询会员ids public List<VipPaymentVO> list(String appUserName , String phone, String vipName , Integer isRefund , String time ) { VipPaymentDto vipPaymentDto = new VipPaymentDto(); if (StringUtils.hasLength(vipName)){ List<Integer> vipIds = vipService.lambdaQuery().like(Vip::getVipName, vipName) .list().stream().map(Vip::getId).collect(Collectors.toList()); if (vipIds.isEmpty()){ vipIds.add(-1); } // QueryByNamePhone // appUserClient.listAll() // 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; // } // } vipPaymentDto.setVipIds(vipIds); } if (StringUtils.hasLength(phone)){ QueryByNamePhone queryByNamePhone = new QueryByNamePhone(); queryByNamePhone.setPhone( phone); List<Integer> userIds = appUserClient.queryByNamePhone(queryByNamePhone).stream().map(TAppUser::getId) .collect(Collectors.toList()); vipPaymentDto.setUserIds(userIds); } if (StringUtils.hasLength(appUserName)){ QueryByNamePhone queryByNamePhone = new QueryByNamePhone(); queryByNamePhone.setName( appUserName); List<Integer> userIds = appUserClient.queryByNamePhone(queryByNamePhone).stream().map(TAppUser::getId) .collect(Collectors.toList()); if (vipPaymentDto.getUserIds()!=null){ // 取交集 vipPaymentDto.setUserIds(vipPaymentDto.getUserIds().stream().filter(userIds::contains).collect(Collectors.toList())); }else{ vipPaymentDto.setUserIds(userIds); } } if (StringUtils.hasLength(appUserName)|| StringUtils.hasLength(phone)){ if (vipPaymentDto.getUserIds().isEmpty()){ List<Integer> userIds = vipPaymentDto.getUserIds(); userIds.add(-1); vipPaymentDto.setUserIds(userIds); } } return null; } // 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; } @Autowired private IProtocolService protocolService; @ResponseBody @PostMapping("/getAgreement") public String getAgreement() { Protocol one = protocolService.lambdaQuery().eq(Protocol::getType, 6).one(); if (one==null){ Protocol protocol = new Protocol(); protocol.setType(6); protocol.setContent(""); protocol.setInsertTime(new Date()); protocolService.save( protocol); return ""; }else{ return one.getContent(); } } @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; } } cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipPaymentController.java
New file @@ -0,0 +1,181 @@ package com.dsh.guns.modular.system.controller.code; import com.dsh.course.feignClient.account.AppUserClient; import com.dsh.course.feignClient.account.model.QueryByNamePhone; import com.dsh.course.feignClient.account.model.TAppUser; import com.dsh.course.feignClient.activity.CouponClient; import com.dsh.guns.config.UserExt; import com.dsh.guns.core.base.controller.BaseController; import com.dsh.guns.modular.system.model.TOperator; import com.dsh.guns.modular.system.model.TSite; import com.dsh.guns.modular.system.model.TStore; import com.dsh.guns.modular.system.model.Vip; import com.dsh.guns.modular.system.model.dto.VipDetailDto; import com.dsh.guns.modular.system.model.vo.VipDetailVO; import com.dsh.guns.modular.system.service.IStoreService; import com.dsh.guns.modular.system.service.ITSiteService; import com.dsh.guns.modular.system.service.IVipService; import com.dsh.guns.modular.system.service.TOperatorService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.util.StringUtils; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import java.util.List; import java.util.stream.Collectors; /** * @author zhibing.pu * @Date 2023/8/1 14:02 */ @Controller @RequestMapping("/vipPayment") public class TVipPaymentController extends BaseController { @Autowired private IVipService vipService; @Autowired private CouponClient couponClient; @Autowired private IStoreService storeService; @Autowired private AppUserClient appUserClient; @Autowired private ITSiteService siteService; @Autowired private TOperatorService operatorService; private String PREFIX = "/system/vip/"; /** * 跳转到优惠券管理首页 */ @RequestMapping("") public String index(Model model) { Integer objectType = UserExt.getUser().getObjectType(); Integer objectId = UserExt.getUser().getObjectId(); if (objectType!=1){ List<TOperator> list = operatorService.lambdaQuery().eq(TOperator::getId, objectId).list(); model.addAttribute("list",list); }else{ List<TOperator> list = operatorService.lambdaQuery().ne(TOperator::getState,3).list(); model.addAttribute("list",list); } model.addAttribute("objectType",objectType); return PREFIX + "vip_detail.html"; } /** * 获取 会员权益使用明细列表 */ @RequestMapping(value = "/list") @ResponseBody public List<VipDetailVO> list(String vipName, Integer type , String phone, String storeName , Integer operatorId, Integer status , String time , String useTime) { Integer objectType = UserExt.getUser().getObjectType(); Integer objectId = UserExt.getUser().getObjectId(); VipDetailDto vipDetailDto = new VipDetailDto(); vipDetailDto.setOperatorId(operatorId); vipDetailDto.setStatus(status); vipDetailDto.setType(type); vipDetailDto.setObjectType(objectType); if (objectType == 2){ vipDetailDto.setStatus(2); } if (StringUtils.hasLength(vipName)){ List<Integer> vipIds = vipService.lambdaQuery().like(Vip::getVipName, vipName) .list().stream().map(Vip::getId).collect(Collectors.toList()); if (vipIds.isEmpty()){ vipIds.add(-1); } vipDetailDto.setVipIds(vipIds); } if (StringUtils.hasLength(phone)){ QueryByNamePhone queryByNamePhone = new QueryByNamePhone(); queryByNamePhone.setPhone( phone); List<Integer> userIds = appUserClient.queryByNamePhone(queryByNamePhone).stream().map(TAppUser::getId) .collect(Collectors.toList()); if (userIds.isEmpty()){ userIds.add(-1); } vipDetailDto.setUserIds(userIds); } if (StringUtils.hasLength(storeName)){ List<Integer> storeIds = storeService.lambdaQuery().like(TStore::getName, storeName) .eq(objectType!=1,TStore::getOperatorId,objectId ).list() .stream().map(TStore::getId).collect(Collectors.toList()); if (storeIds.isEmpty()){ storeIds.add(-1); } vipDetailDto.setStoreIds(storeIds); } if (StringUtils.hasLength(time)){ String stareTime = null; String endTime = null; stareTime = time.split(" - ")[0] + " 00:00:00"; endTime = time.split(" - ")[1] + " 23:59:59"; vipDetailDto.setStartTime(stareTime); vipDetailDto.setEndTime(endTime); } if (StringUtils.hasLength(useTime)){ String stareTime = null; String endTime = null; stareTime = time.split(" - ")[0] + " 00:00:00"; endTime = time.split(" - ")[1] + " 23:59:59"; vipDetailDto.setUseStartTime(stareTime); vipDetailDto.setUseEndTime(endTime); } List<VipDetailVO> res = couponClient.vipDetail(vipDetailDto); QueryByNamePhone queryByNamePhone = new QueryByNamePhone(); List<TAppUser> tAppUsers = appUserClient.queryByNamePhone(queryByNamePhone); List<Vip> vipList = vipService.list(); List<TStore> storeList = storeService.list(); List<TSite> siteList = siteService.list(); List<TOperator> operatorList = operatorService.list(); for (VipDetailVO re : res) { TAppUser tAppUser = tAppUsers.stream().filter(e -> e.getId().equals(re.getAppUserId())).findFirst().orElse(null); if (tAppUser!=null){ re.setAppUserName(tAppUser.getName()); re.setAppUserPhone(tAppUser.getPhone()); } Vip vip = vipList.stream().filter(e -> e.getId().equals(re.getVipId())).findFirst().orElse(null); if (vip!=null){ re.setVipName(vip.getVipName()); } if (re.getUseSiteId()!=null){ TSite site = siteList.stream().filter(e -> e.getId().equals(re.getUseSiteId())).findFirst().orElse(null); if (site!=null){ re.setGoodsName(site.getName()); } } if (re.getUseStoreId()!=null){ TStore store = storeList.stream().filter(e -> e.getId().equals(re.getUseStoreId())).findFirst().orElse(null); if (store!=null){ re.setStoreName(store.getName()); } } if (re.getOperatorId()!=null){ if (re.getOperatorId()==0){ re.setOperatorName("总平台"); }else{ TOperator operator = operatorList.stream().filter(e -> e.getId().equals(re.getOperatorId())).findFirst().orElse(null); if (operator!=null){ re.setOperatorName(operator.getName()); } } } } return res; } } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/VipDetailDto.java
@@ -9,10 +9,26 @@ */ @Data public class VipDetailDto { // 会员ids List<Integer> vipIds; // 用户ids List<Integer> userIds; String store; String site; // 门店ids List<Integer> storeIds; // 获得时间 开始 String startTime; // 获得时间 结束 String endTime; // 使用时间开始 String useStartTime; // 使用时间结束 String useEndTime; // 运营商id Integer operatorId; // 使用状态 1未使用 2已使用 3已过期 Integer status; // 权益类型 1优惠券2门票 Integer type; Integer id; // 1平台 2运营商 Integer objectType; } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/VipPaymentDto.java
New file @@ -0,0 +1,25 @@ package com.dsh.guns.modular.system.model.dto; import com.baomidou.mybatisplus.extension.api.R; import lombok.Data; import java.util.List; /** * 会员权益明细 */ @Data public class VipPaymentDto { // 会员ids List<Integer> vipIds; // 用户ids List<Integer> userIds; // 是否退款 0否1是 Integer isRefund; // 下单时间开始 String useStartTime; // 下单时间结束 String useEndTime; } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/vo/VipDetailVO.java
New file @@ -0,0 +1,86 @@ package com.dsh.guns.modular.system.model.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; import java.util.List; /** * 会员权益明细列表 */ @Data public class VipDetailVO { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "用户id") private Integer appUserId; @ApiModelProperty(value = "用户名称") private String appUserName; @ApiModelProperty(value = "用户电话") private String appUserPhone; @ApiModelProperty(value = "使用状态 1待使用 2已使用 3已过期") private Integer status; @ApiModelProperty(value = "获取时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; @ApiModelProperty(value = "会员id") private Integer vipId; @ApiModelProperty(value = "会员名称") private String vipName; @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 = "开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @ApiModelProperty(value = "结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @ApiModelProperty(value = "可用次数") private Integer useCount; @ApiModelProperty(value = "使用门店id") private Integer useStoreId; @ApiModelProperty(value = "门店名称") private String storeName; @ApiModelProperty(value = "使用场地id") private Integer useSiteId; @ApiModelProperty(value = "使用商品id") private Integer useGoodsId; @ApiModelProperty(value = "使用商品/场地名称") private String goodsName; @ApiModelProperty(value = "使用时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date useTime; @ApiModelProperty(value = "运营商id") private Integer operatorId; @ApiModelProperty(value = "运营商名称") private String operatorName; @ApiModelProperty(value = "用户优惠券id") private Long userCouponId; } cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/vo/VipPaymentVO.java
New file @@ -0,0 +1,45 @@ package com.dsh.guns.modular.system.model.vo; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; /** * 会员订单列表 */ @Data public class VipPaymentVO { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "订单编号") private String code; @ApiModelProperty(value = "用户id") private Integer appUserId; @ApiModelProperty(value = "用户名称") private String appUserName; @ApiModelProperty(value = "用户电话") private String appUserPhone; @ApiModelProperty(value = "会员名称") private String vipName; @ApiModelProperty(value = "会员id") private Integer vipId; @ApiModelProperty(value = "会员时长") private String vipTime; @ApiModelProperty(value = "金额¥") private String amountValue; @ApiModelProperty(value = "金额") private BigDecimal amount; @ApiModelProperty(value = "下单时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date insertTime; @ApiModelProperty(value = "是否退款 0否1时") private Integer isRefund; @ApiModelProperty(value = "备注") private Integer remark; } cloud-server-management/src/main/webapp/WEB-INF/view/system/vipDetail/vip_detail.html
New file @@ -0,0 +1,109 @@ @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="type" > <option value="">全部</option> <option value="1">优惠券</option> <option value="2">门票</option> </select> </div> </div> <div class="col-sm-3"> <#NameCon id="phone" name="会员电话" /> </div> <div class="col-sm-3"> <#NameCon id="storeName" 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="operatorId" > <option value="">全部</option> @for(obj in list){ <option value="${obj.id}">${obj.name}</option> @} </select> </div> </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> <option value="3">已过期</option> </select> </div> </div> <div class="col-sm-3"> <#TimeCon id="time" name="获得日期" isTime="false"/> </div> <div class="col-sm-3"> <#TimeCon id="useTime" name="使用日期" isTime="false"/> </div> <div class="col-sm-3"> <#button name="搜索" icon="fa-search" clickFun="TCompetition.search()"/> <#button name="重置" icon="fa-trash" clickFun="TCompetition.resetSearch()" space="true"/> </div> </div> <div class="hidden-xs" id="TCompetitionTableToolbar" role="group"> @if(objectType==1){ <#button name="导出" icon="fa-plus" clickFun="TCompetition.export()"/> @} </div> <#table id="TCompetitionTable"/> </div> </div> </div> </div> </div> </div> <script src="${ctxPath}/modular/system/vipDetail/vipDetail.js"></script> <script> laydate.render({ elem: '#time' , trigger: 'click' , range: true }); laydate.render({ elem: '#useTime' , trigger: 'click' , range: true }); </script> @} cloud-server-management/src/main/webapp/static/modular/system/vipDetail/vipDetail.js
New file @@ -0,0 +1,187 @@ /** * 车辆管理管理初始化 */ var TCompetition = { id: "TCompetitionTable", //表格id seItem: null, //选中的条目 table: null, layerIndex: -1 }; var language =1 var role =$("#role").val() /** * 初始化表格的列 */ TCompetition.initColumn = function () { return [ {field: 'selectItem', radio: true}, {title: '序号', field: 'id', visible: true, align: 'center', valign: 'middle'}, {title: '权益名称', field: 'ticketName', visible: true, align: 'center', valign: 'middle'}, {title: '权益类型', field: 'type', visible: true, align: 'center', valign: 'middle', formatter:function (data) { return {1:"优惠券",2:"门票"}[data] } }, {title: '关联会员类型', field: 'vipName', visible: true, align: 'center', valign: 'middle'}, {title: '购买会员姓名', field: 'appUserName', visible: true, align: 'center', valign: 'middle'}, {title: '联系电话', field: 'appUserPhone', visible: true, align: 'center', valign: 'middle'}, {title: '使用状态', field: 'status', visible: true, align: 'center', valign: 'middle', formatter:function (data) { return {1:"未使用",2:"已使用",3:"已过期"}[data] } }, {title: '使用场地/商品名称', field: 'goodsName', visible: true, align: 'center', valign: 'middle'}, {title: '使用门店', field: 'storeName', visible: true, align: 'center', valign: 'middle'}, {title: '归属运营商', field: 'operatorName', visible: true, align: 'center', valign: 'middle'}, {title: '获得时间', field: 'insertTime', visible: true, align: 'center', valign: 'middle'}, {title: '使用时间', field: 'useTime', visible: true, align: 'center', valign: 'middle'}, ]; }; /** * 查询车辆管理列表 */ TCompetition.search = function () { var queryData = {}; queryData['vipName'] = $("#vipName").val(); queryData['type'] = $("#type").val(); queryData['phone'] = $("#phone").val(); queryData['storeName'] = $("#storeName").val(); queryData['operatorId'] = $("#operatorId").val(); queryData['status'] = $("#status").val(); queryData['time'] = $("#time").val(); queryData['useTime'] = $("#useTime").val(); TCompetition.table.refresh({query: queryData}); }; TCompetition.resetSearch = function () { $("#vipName").val(""); $("#type").val(""); $("#name").val(""); $("#phone").val(""); $("#storeName").val(""); $("#operatorId").val(""); $("#status").val(""); $("#time").val(""); $("#useTime").val(""); TCompetition.search(); }; $(function () { var defaultColunms = TCompetition.initColumn(); var table = new BSTable(TCompetition.id, "/vipDetail/list", defaultColunms); table.setPaginationType("client"); TCompetition.table = table.init(); TCompetition.getAmount(); }); /** * 下载模板 */ TCompetition.uploadCarModel = function () { window.location.href = Feng.ctxPath + "/TCompetition/uploadCarModel"; } var agreement = function(){ this.init = function(){ //模拟上传excel $("#uploadEventBtn").unbind("click").bind("click",function(){ $("#uploadEventFile").click(); }); }; } /** * 导入合同 */ TCompetition.exporTCompetition = function () { var uploadEventFile = $("#uploadEventFile").val(); if(uploadEventFile == ''){ if(language==1){ Feng.info("请选择Excel,再上传"); }else if(language==2){ Feng.info("Please select Excel and upload"); }else { Feng.info("Silakan pilih Excel dan upload"); } }else if(uploadEventFile.lastIndexOf(".xls")<0){//可判断以.xls和.xlsx结尾的excel if(language==1){ Feng.info("只能上传Excel文件"); }else if(language==2){ Feng.info("Only Excel files can be uploaded"); }else { Feng.info("Hanya berkas Excel yang dapat diunggah"); } }else{ var url = Feng.ctxPath + '/TCompetition/exporTCompetition'; var file = document.querySelector('input[name=file]').files[0]; var reader = new FileReader(); if (file) { var formData = new FormData(); formData.append("myfile", file); this.sendAjaxRequest(url, 'POST', formData); } } } TCompetition.sendAjaxRequest = function(url,type,data){ $.ajax({ url : url, type : type, data : data, success : function(result) { if(result.code==500) { Feng.info(result.message); }else { if(language==1){ Feng.success("导入成功!"); }else if(language==2){ Feng.success("SUCCESSFUL IMPORT!"); }else { Feng.success("Import berhasil!"); } } TCompetition.table.refresh(); }, error : function() { if(language==1){ Feng.error("excel上传失败!"); }else if(language==2){ Feng.error("Uploading excel Fails. Procedure!"); }else { Feng.error("Gagal mengunggah excel!"); } }, cache : false, contentType : false, processData : false }); }; var agreement; $(function(){ agreement = new agreement(); agreement.init(); }); /** * 导出车辆操作 */ TCompetition.ouTCompetition = function () { var operation = function() { window.location.href = Feng.ctxPath + "/TCompetition/ouTCompetition"; }; if(language==1){ Feng.confirm("是否确认导出车辆信息?", operation); }else if(language==2){ Feng.confirm("Are you sure to export vehicle information?", operation); }else { Feng.confirm("Apakah Anda pasti akan mengekspor informasi kendaraan?", operation); } }