ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/dto/CouponListDto.java
@@ -16,5 +16,7 @@ private Long userId; @ApiModelProperty("预付价格") private BigDecimal payMoney; @ApiModelProperty("桩编号") private Integer number; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/vo/CouponListVOVO.java
@@ -34,9 +34,7 @@ private Integer isUse; @ApiModelProperty(value = "优惠券id") private Long couponId; @ApiModelProperty(value = "优惠券id") private BigDecimal payMoney; @ApiModelProperty(value = "最高折扣金额 用于判断哪一张优惠券优惠力度最大 前端忽略") @ApiModelProperty(value = "使用了优惠券后的服务费 用于判断哪一张优惠券优惠力度最大 前端忽略") private BigDecimal money; @ApiModelProperty(value = "当前用户是否为会员0否1是 前端忽略") private Integer isVip; ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ChargingPileFallbackFactory.java
@@ -8,6 +8,7 @@ import org.springframework.cloud.openfeign.FallbackFactory; import org.springframework.stereotype.Component; import java.math.BigDecimal; import java.util.List; /** @@ -29,6 +30,11 @@ public R<List<TChargingPile>> getChargingPileBySiteId(Integer siteId) { return R.fail("通过站点id获取充电桩列表失败:"+throwable.getMessage()); } @Override public R<BigDecimal> getServiceMoney(String param) { return R.fail("根据会员折扣、预付金额 计算服务费失败:"+throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ChargingPileClient.java
@@ -9,6 +9,7 @@ import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import java.math.BigDecimal; import java.util.List; /** @@ -25,5 +26,10 @@ @PostMapping(value = "/t-charging-pile/getChargingPileBySiteId") public R<List<TChargingPile>> getChargingPileBySiteId(@RequestParam("siteId") Integer siteId); /** * 小程序远程调用 根据会员折扣、预付金额 计算服务费 * @return */ @PostMapping(value = "/getServiceMoney") public R<BigDecimal> getServiceMoney(@RequestParam("param") String param); } ruoyi-api/ruoyi-api-other/src/main/java/com/ruoyi/other/api/domain/TVip.java
@@ -137,7 +137,7 @@ @ApiModelProperty(value = "内部会员折扣") @TableField("discount") private BigDecimal discount; @ApiModelProperty(value = "会员类型 1常规 2内部") @ApiModelProperty(value = "添加的会员类型 1常规 2内部") @TableField("type") private Integer type; ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/service/impl/TAppCouponServiceImpl.java
@@ -14,6 +14,7 @@ import com.ruoyi.account.service.TAppCouponService; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.chargingPile.api.feignClient.ChargingPileClient; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.DateUtils; import com.ruoyi.common.core.web.page.BasePage; import com.ruoyi.common.core.web.page.PageInfo; @@ -31,8 +32,11 @@ import org.springframework.stereotype.Service; import org.springframework.util.StringUtils; import java.math.BigDecimal; import java.math.BigInteger; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.Comparator; import java.util.Date; import java.util.List; @@ -139,9 +143,14 @@ PageInfo<CouponListVOVO> pageInfo = new PageInfo<>(dto.getPageCurr(),dto.getPageSize()); List<CouponListVOVO> list = this.baseMapper.couponList(pageInfo,dto.getUserId()); TAppUser tAppUser = tAppUserMapper.selectById(dto.getUserId()); Integer isVip = 0;// 是否能享受会员折扣 Integer isVip = 0;// 是否能享受会员折扣 0否 1是普通会员 2内部会员 // 会员折扣 Double discount = 0.0; // 普通会员最高折扣金额 Double discountMoney = 0.0; if (tAppUser.getVipEndTime() == null){ // 不是会员 isVip = 0; }else { // 判断会员有没有过期 if (tAppUser.getVipEndTime().isAfter(java.time.LocalDateTime.now())){ @@ -161,20 +170,79 @@ TVip data1 = vipClient.getInfo1(vipId).getData(); Integer discountTimes = data1.getDiscountTimes(); if (data>=discountTimes){ // 不能再享受会员折扣 // 折扣次数用光了 不能再享受会员折扣 isVip = 0; }else{ isVip = 1; if (data1.getType() == 2){ // 如果内部会员 使用该折扣 discount = data1.getDiscount().doubleValue(); isVip = 2; }else{ // 普通会员 最高折扣金额 discountMoney = data1.getMaximumDeduction().doubleValue(); isVip = 1; } } }else{ // 会员过期 不能享受 isVip = 0; } } for (CouponListVOVO couponListVOVO : list) { couponListVOVO.setValidityTime("有效期:"+format.format(couponListVOVO.getCreateTime())+" - "+format.format(couponListVOVO.getEndTime())); } List<CouponListVOVO> data = otherClient.getCouponInfoByCouponIds(list).getData(); // 桩编号 + 是否是会员 + 内部会员折扣 + 普通会员最高折扣金额 + 预付金额 String temp = dto.getNumber()+"-"+isVip+"-"+discount+"-"+discountMoney+"-"+dto.getPayMoney(); // 根据当前时间段和预付金额计算服务费 BigDecimal serviceMoney = chargingPileClient.getServiceMoney(temp).getData(); for (CouponListVOVO datum : data) { // 根据当前时间段和预付金额计算服务费 // 判断优惠券类型 switch (datum.getPreferentialMode()){ case 1: datum.setIsUse(1); // 满减券 判断服务费是否满足满减条件 if (datum.getMeetTheConditions().compareTo(new BigDecimal(BigInteger.ZERO)) == 0){ // 无门槛优惠券 datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount())); }else if (serviceMoney.compareTo(datum.getMeetTheConditions())>=0){ // 满足条件 datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount())); }else{ // 不满足条件 datum.setMoney(serviceMoney); datum.setIsUse(0); } break; case 2: datum.setIsUse(1); // 折扣券 判断 if (datum.getMeetTheConditions().compareTo(new BigDecimal(BigInteger.ZERO)) == 0){ // 无门槛优惠券 datum.setMoney(serviceMoney.subtract(datum.getDiscountAmount())); }else if (serviceMoney.compareTo(datum.getMeetTheConditions())>=0){ // 折扣后的服务费 BigDecimal divide = serviceMoney.multiply(datum.getDiscount()).divide(new BigDecimal(10), 2, BigDecimal.ROUND_HALF_UP); // 计算折扣了多少钱 判断是否超过最高折扣金额 BigDecimal subtract = serviceMoney.subtract(divide); if (subtract.compareTo(datum.getMaximumDiscountAmount())>0){ // 超过最高折扣金额 减去最高折扣金额 datum.setMoney(serviceMoney.subtract(datum.getMaximumDiscountAmount())); }else{ // 没超过最高折扣金额 datum.setMoney(divide); } }else{ // 不满足条件 datum.setMoney(serviceMoney); datum.setIsUse(0); } break; } } // 通过集合的money字段 将money从大到小排序 data.sort(Comparator.comparing(CouponListVOVO::getMoney).reversed()); pageInfo.setRecords(data); return pageInfo; } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -1,18 +1,19 @@ package com.ruoyi.chargingPile.controller; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.chargingPile.api.dto.TAccountingStrategyDTO; import com.ruoyi.chargingPile.api.model.TAccountingStrategy; import com.ruoyi.chargingPile.api.model.TAccountingStrategyDetail; import com.ruoyi.chargingPile.api.model.TCarport; import com.ruoyi.chargingPile.api.model.TVehicleRamp; import com.ruoyi.chargingPile.api.model.*; import com.ruoyi.chargingPile.api.query.TAccountingStrategyQuery; import com.ruoyi.chargingPile.api.vo.TAccountingStrategyDetailVO; import com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO; import com.ruoyi.chargingPile.service.ISiteService; import com.ruoyi.chargingPile.service.TAccountingStrategyDetailService; import com.ruoyi.chargingPile.service.TAccountingStrategyService; import com.ruoyi.chargingPile.service.TChargingPileService; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.web.domain.AjaxResult; import com.ruoyi.common.core.web.page.PageInfo; import com.ruoyi.common.security.service.TokenService; @@ -25,6 +26,10 @@ import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.BigInteger; import java.math.RoundingMode; import java.time.LocalTime; import java.util.List; /** @@ -42,6 +47,10 @@ private final TAccountingStrategyService accountingStrategyService; private final TAccountingStrategyDetailService accountingStrategyDetailService; @Autowired private TChargingPileService chargingPileService; @Autowired private ISiteService siteService; @Resource private TokenService tokenService; @@ -175,5 +184,69 @@ return AjaxResult.ok(accountingStrategyService.pageList(query)); } /** * 小程序远程调用 根据会员折扣、预付金额 计算服务费 * @return */ @PostMapping(value = "/getServiceMoney") public R<BigDecimal> getServiceMoney(@RequestParam("param") String param){ // 桩编号 + 是否是会员 + 内部会员折扣金额 + 普通会员最高折扣金额 + 预付金额 String[] split = param.split("-"); // 根据桩编号 查询电站 TChargingPile one = chargingPileService.lambdaQuery().eq(TChargingPile::getNumber, split[0]).one(); Site byId = siteService.getById(one.getSiteId()); // 计费策略 TAccountingStrategy one1 = accountingStrategyService.lambdaQuery().eq(TAccountingStrategy::getSiteId, byId.getId()) .eq(TAccountingStrategy::getAuditStatus, 3).one(); // 会员折扣 BigDecimal discount = one1.getDiscount(); List<TAccountingStrategyDetail> list = accountingStrategyDetailService.lambdaQuery().eq(TAccountingStrategyDetail::getAccountingStrategyId, one1.getId()) .list(); // 当前时间属于哪个计费策略 LocalTime now = LocalTime.now(); // 电价 BigDecimal electronic = new BigDecimal(BigInteger.ZERO); // 最终服务费 BigDecimal serviceMoney = new BigDecimal(BigInteger.ZERO); // 预付金额 BigDecimal beforeMoney = new BigDecimal(split[4]); // 普通会员最高折扣金额 BigDecimal discountMoney = new BigDecimal(split[3]); // 内部会员折扣 BigDecimal discountInner = new BigDecimal(split[2]); // 最终服务费 BigDecimal res = new BigDecimal(BigInteger.ZERO); for (TAccountingStrategyDetail tAccountingStrategyDetail : list) { if (now.isAfter(LocalTime.parse(tAccountingStrategyDetail.getStartTime())) && now.isBefore(LocalTime.parse(tAccountingStrategyDetail.getEndTime()))){ electronic = tAccountingStrategyDetail.getElectrovalence(); // 非会员下的服务费 BigDecimal multiply = beforeMoney.multiply(tAccountingStrategyDetail.getServiceCharge()).divide(electronic, 2, RoundingMode.HALF_UP); if (byId.getBusinessCategory() == 1){ // 直营才享受会员折扣 // 根据电价和预付金额 是否有会员折扣 计算最终服务费 if (split[1].equals("1")){ // 抵扣金额 BigDecimal multiply1 = multiply.multiply(discount); if (multiply1.compareTo(discountMoney)>0){ multiply1 = discountMoney; } // 普通最终服务费 res = multiply.subtract(multiply1); } if (split[1].equals("2")){ // 内部会员折扣 最终服务费 res = discountInner.multiply(multiply); } }else{ // 非直营 res = multiply; } break; } } return R.ok(res); } } ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TVipController.java
@@ -34,25 +34,25 @@ @Autowired private TVipService vipService; @PostMapping("/saveVip") @ApiOperation(value = "会员添加") @ApiOperation(tags = {"管理后台-会员管理"},value = "会员添加") public AjaxResult saveVip(@RequestBody TVip dto) { vipService.save(dto); return AjaxResult.success(); } @GetMapping("/delete") @ApiOperation(value = "会员删除") @ApiOperation(tags = {"管理后台-会员管理"},value = "会员删除") public AjaxResult delete(Integer id) { vipService.removeById(id); return AjaxResult.success(); } @PostMapping("/updateVip") @ApiOperation(value = "会员修改") @ApiOperation(tags = {"管理后台-会员管理"},value = "会员修改") public AjaxResult updateVip(@RequestBody TVip dto) { vipService.updateById(dto); return AjaxResult.success(); } @GetMapping("/getInfo") @ApiOperation(value = "会员查看详情") @ApiOperation(tags = {"管理后台-会员管理"},value = "会员查看详情") public AjaxResult<TVip> getInfo(Integer id) { return AjaxResult.ok(vipService.getById(id)); } @@ -66,7 +66,7 @@ public R<TVip> getInfo1(@RequestParam("id")Integer id) { return R.ok(vipService.getById(id)); } @ApiOperation(value = "会员列表分页查询") @ApiOperation(tags = {"管理后台-会员管理"},value = "会员列表分页查询") @PostMapping(value = "/pageList") @ApiImplicitParams({ @ApiImplicitParam(name = "pageCurr", value = "分页参数,当前页码", required = true), ruoyi-service/ruoyi-other/src/main/resources/mapper/other/TVipMapper.xml
@@ -32,12 +32,15 @@ <result column="double_integration" property="doubleIntegration" /> <result column="mall_exclusive_price" property="mallExclusivePrice" /> <result column="create_time" property="createTime" /> <result column="discount" property="discount" /> <result column="type" property="type" /> <result column="del_flag" property="delFlag" /> </resultMap> <!-- 通用查询结果列 --> <sql id="Base_Column_List"> id, name, reveal, monthly_card, monthly_card_reveal, monthly_card_discount, monthly_card_discount_start, monthly_card_discount_end, monthly_card_discount_reveal, season_card, season_card_reveal, season_card_discount, season_card_discount_start, season_card_discount_end, season_card_discount_reveal, annual_card, annual_card_reveal, annual_card_discount, annual_card_discount_start, annual_card_discount_end, annual_card_discount_reveal, discount_times, maximum_deduction, deduction_type, coupon, double_integration, mall_exclusive_price, create_time, del_flag ,discount, type </sql> <select id="pageList" resultType="com.ruoyi.other.api.domain.TVip"> select * from t_vip