无关风月
21 小时以前 ff94903b42fc1616cc139d071d915e271d12422a
会员订单
5个文件已修改
8个文件已添加
1051 ■■■■ 已修改文件
cloud-server-activity/src/main/java/com/dsh/activity/controller/CouponController.java 50 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/entity/VipDetail.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/model/VipDetailVO.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-activity/src/main/java/com/dsh/activity/model/request/VipDetailDto.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/course/feignClient/activity/CouponClient.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipDetailController.java 221 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/controller/code/TVipPaymentController.java 181 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/VipDetailDto.java 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/dto/VipPaymentDto.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/vo/VipDetailVO.java 86 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/java/com/dsh/guns/modular/system/model/vo/VipPaymentVO.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/WEB-INF/view/system/vipDetail/vip_detail.html 109 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
cloud-server-management/src/main/webapp/static/modular/system/vipDetail/vipDetail.js 187 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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);
    }
}