ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserSign.java
@@ -54,6 +54,8 @@ @TableField("create_time") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private LocalDateTime createTime; @TableField(exist = false) private Integer continueDays; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TAppUserVipDetail.java
@@ -91,6 +91,9 @@ @TableField(exist = false) private Integer type; @TableField(exist = false) private TVip vip; } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/model/TVip.java
New file @@ -0,0 +1,156 @@ package com.ruoyi.account.api.model; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.core.web.domain.BasePojo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> * * </p> * * @author 无关风月 * @since 2024-08-06 */ @Data @EqualsAndHashCode(callSuper = false) @TableName("t_vip") @ApiModel(value="TVip对象", description="") public class TVip extends BasePojo { private static final long serialVersionUID = 1L; @ApiModelProperty(value = "主键") @TableId(value = "id", type = IdType.AUTO) private Integer id; @ApiModelProperty(value = "会员名称") @TableField("name") private String name; @ApiModelProperty(value = "前端是否显示(0=否,1=是)") @TableField("reveal") private Integer reveal; @ApiModelProperty(value = "月卡价格") @TableField("monthly_card") private BigDecimal monthlyCard; @ApiModelProperty(value = "月卡显示(0=否,1=是)") @TableField("monthly_card_reveal") private Integer monthlyCardReveal; @ApiModelProperty(value = "月卡折扣") @TableField("monthly_card_discount") private BigDecimal monthlyCardDiscount; @ApiModelProperty(value = "月卡折扣开始时间") @TableField("monthly_card_discount_start") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime monthlyCardDiscountStart; @ApiModelProperty(value = "月卡折扣结束时间") @TableField("monthly_card_discount_end") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime monthlyCardDiscountEnd; @ApiModelProperty(value = "月卡折扣显示(0=否,1=是)") @TableField("monthly_card_discount_reveal") private Integer monthlyCardDiscountReveal; @ApiModelProperty(value = "季卡价格") @TableField("season_card") private BigDecimal seasonCard; @ApiModelProperty(value = "季卡显示(0=否,1=是)") @TableField("season_card_reveal") private Integer seasonCardReveal; @ApiModelProperty(value = "季卡折扣") @TableField("season_card_discount") private BigDecimal seasonCardDiscount; @ApiModelProperty(value = "季卡折扣开始时间") @TableField("season_card_discount_start") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime seasonCardDiscountStart; @ApiModelProperty(value = "季卡折扣结束时间") @TableField("season_card_discount_end") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime seasonCardDiscountEnd; @ApiModelProperty(value = "季卡折扣显示(0=否,1=是)") @TableField("season_card_discount_reveal") private Integer seasonCardDiscountReveal; @ApiModelProperty(value = "年卡价格") @TableField("annual_card") private BigDecimal annualCard; @ApiModelProperty(value = "年卡显示(0=否,1=是)") @TableField("annual_card_reveal") private Integer annualCardReveal; @ApiModelProperty(value = "年卡折扣") @TableField("annual_card_discount") private BigDecimal annualCardDiscount; @ApiModelProperty(value = "年卡折扣开始时间") @TableField("annual_card_discount_start") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime annualCardDiscountStart; @ApiModelProperty(value = "年卡折扣结束时间") @TableField("annual_card_discount_end") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss",timezone = "GMT+8") private LocalDateTime annualCardDiscountEnd; @ApiModelProperty(value = "年卡折扣显示(0=否,1=是)") @TableField("annual_card_discount_reveal") private Integer annualCardDiscountReveal; @ApiModelProperty(value = "折扣次数") @TableField("discount_times") private Integer discountTimes; @ApiModelProperty(value = "最高抵扣金额") @TableField("maximum_deduction") private BigDecimal maximumDeduction; @ApiModelProperty(value = "抵扣类型(1=服务费)") @TableField("deduction_type") private Integer deductionType; @ApiModelProperty(value = "优惠券[{\"id\":1,\"number\":1}]") @TableField("coupon") private String coupon; @ApiModelProperty(value = "双倍积分开关(0=否,1=是)") @TableField("double_integration") private Integer doubleIntegration; @ApiModelProperty(value = "商城专享价开关(0=否,1=是)") @TableField("mall_exclusive_price") private Integer mallExclusivePrice; @ApiModelProperty(value = "内部会员折扣") @TableField("discount") private BigDecimal discount; @ApiModelProperty(value = "添加的会员类型 1常规 2内部") @TableField("type") private Integer type; @ApiModelProperty(value = "优惠券名称和张数 后台列表展示使用") @TableField(exist = false) private String couponName; } ruoyi-api/ruoyi-api-integration/src/main/java/com/ruoyi/integration/api/feignClient/UploadRealTimeMonitoringDataClient.java
@@ -48,5 +48,5 @@ R<UploadRealTimeMonitoringPageData> getAll(@RequestBody MongoChargingOrderQuery mongoChargingOrderQuery); @PostMapping("/uploadRealTimeMonitoringData/delete") R delete(@RequestParam String id); R delete(@RequestParam("id") String id); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/model/TChargingOrderAccountingStrategy.java
@@ -105,5 +105,4 @@ } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/AccountingStrategyDetailOrderVo.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.order.api.vo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author zhibing.pu * @Date 2024/9/3 14:00 */ @Data public class AccountingStrategyDetailOrderVo { @ApiModelProperty(value = "主键") private Integer id; @ApiModelProperty(value = "策略id") private Integer accountingStrategyId; @ApiModelProperty(value = "阶段(1=尖阶段,2=峰阶段,3=平阶段,4=谷阶段)") private Integer type; @ApiModelProperty(value = "开始时间") private String startTime; @ApiModelProperty(value = "结束时间") private String endTime; @ApiModelProperty(value = "电价") private BigDecimal electrovalence; @ApiModelProperty(value = "服务费") private BigDecimal serviceCharge; @ApiModelProperty(value = "原价服务费") private BigDecimal costServiceCharge; @ApiModelProperty(value = "充电订单id") private Long chargingOrderId; private Long start; private Long end; private BigDecimal chargingCapacity; } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserController.java
@@ -40,6 +40,7 @@ import com.ruoyi.order.api.model.TGrantVip; import com.ruoyi.other.api.domain.*; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.dto.UnitListQueryDto; import com.ruoyi.other.api.feignClient.IntegralRuleClient; import com.ruoyi.other.api.feignClient.OtherClient; @@ -705,7 +706,7 @@ @ApiOperation(value = "优惠卷详情(1可使用2不可用)", tags = {"小程序-个人中心"}) @GetMapping(value = "/user/coupon/getById") @PostMapping(value = "/user/coupon/getById") public R<TAppCoupon> couponGetById(@RequestParam("id")Long id) { TAppCoupon appCoupon = appCouponService.getById(id); appCoupon.setUid(id.toString()); @@ -964,6 +965,10 @@ .eq(TAppUserSign::getAppUserId, userId) .orderByDesc(TAppUserSign::getSignDay) .list(); for (TAppUserSign signRecord : signRecords) { int i = signDayUtil.calculateContinuousSignDays1(signRecord.getAppUserId(), signRecord.getSignDay()); signRecord.setContinueDays(i); } return R.ok(signRecords); } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserVipDetailController.java
@@ -4,13 +4,13 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.account.api.dto.SendCouponDto; import com.ruoyi.account.api.model.TAppUserVipDetail; import com.ruoyi.account.api.model.TVip; import com.ruoyi.account.api.vo.GetAppUserVipDetail; import com.ruoyi.account.service.TAppUserVipDetailService; import com.ruoyi.account.util.VipInfoDto; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.security.service.TokenService; import com.ruoyi.other.api.domain.TCoupon; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.dto.VipCouponDto; import com.ruoyi.other.api.feignClient.OtherClient; import com.ruoyi.other.api.feignClient.VipClient; @@ -67,6 +67,7 @@ // TVip data = vipClient.getInfo1(tAppUserVipDetail.getVipId()).getData(); tAppUserVipDetail.setVipName(tVip.getName()); tAppUserVipDetail.setType(tVip.getType()); tAppUserVipDetail.setVip(tVip); } } ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/util/SignDayUtil.java
@@ -4,7 +4,9 @@ import cn.hutool.core.date.DateUtil; import com.ruoyi.account.api.model.TAppUserSign; import com.ruoyi.account.service.TAppUserSignService; import org.springframework.cglib.core.Local; import org.springframework.stereotype.Component; import sun.rmi.server.LoaderHandler; import javax.annotation.Resource; import java.time.LocalDate; @@ -48,6 +50,31 @@ return calculateMaxContinuousSignDays(signDays); } public int calculateContinuousSignDays1(Long userId, LocalDate date) { DateTime startOfMonth = DateUtil.beginOfMonth(new Date()); // DateTime endOfMonth = DateUtil.endOfMonth(new Date()); // 获取用户的所有签到记录 List<TAppUserSign> signRecords = signService.lambdaQuery() .between(TAppUserSign::getSignDay, startOfMonth, date) .eq(TAppUserSign::getAppUserId, userId) .orderByDesc(TAppUserSign::getSignDay) .list(); // 如果没有签到记录,则返回0 if (signRecords.isEmpty()) { return 0; } // 将签到日期转换为 LocalDate 列表,并按照日期排序 List<LocalDate> signDays = signRecords.stream() .map(TAppUserSign::getSignDay) .sorted() .collect(Collectors.toList()); // 计算连续签到的最大天数 return calculateMaxContinuousSignDays(signDays); } /** * 根据签到日期列表计算连续签到的最大天数 * @param signDays 签到日期列表 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TAccountingStrategyController.java
@@ -327,7 +327,7 @@ @PostMapping(value = "/auth/pageList") public AjaxResult<PageInfo<TAccountingStrategyVO>> authPageList(@RequestBody TAccountingStrategyQuery query) { return AjaxResult.ok(accountingStrategyService.pageList(query)); return AjaxResult.ok(accountingStrategyService.pageList1(query)); } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TChargingPileController.java
@@ -237,9 +237,19 @@ faultMessage.setDelFlag(false); faultMessage.setContent("设备故障"); faultMessageService.save(faultMessage); chargingPile.setStatus(0 == status ? 1 : 3); chargingPileService.updateById(chargingPile); TChargingPile chargingPile1 = new TChargingPile(); chargingPile1.setId(chargingPile.getId()); chargingPile1.setStatus(3); chargingPileService.updateById(chargingPile1); List<TChargingGun> list1 = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId())); for (TChargingGun chargingGun : list1) { TChargingGun chargingGun1 = new TChargingGun(); chargingGun1.setId(chargingGun.getId()); chargingGun1.setStatus(7); chargingGunService.updateById(chargingGun1); } } } if(chargingPile.getStatus() != 1 && 0 == status){ @@ -249,9 +259,19 @@ one.setEndTime(LocalDateTime.now()); faultMessageService.updateById(one); } chargingPile.setStatus(0 == status ? 1 : 3); chargingPileService.updateById(chargingPile); TChargingPile chargingPile1 = new TChargingPile(); chargingPile1.setId(chargingPile.getId()); chargingPile1.setStatus(1); chargingPileService.updateById(chargingPile1); List<TChargingGun> list1 = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId())); for (TChargingGun chargingGun : list1) { TChargingGun chargingGun1 = new TChargingGun(); chargingGun1.setId(chargingGun.getId()); chargingGun1.setStatus(2); chargingGunService.updateById(chargingGun1); } } if(0 == status){ Map<String, Object> charging_pile_online = redisService.getCacheMap("charging_pile_online"); ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/mapper/TAccountingStrategyMapper.java
@@ -28,7 +28,8 @@ * @return */ List<TAccountingStrategyVO> pageList(@Param("query") TAccountingStrategyQuery query, @Param("pageInfo")PageInfo<TAccountingStrategyVO> pageInfo); List<TAccountingStrategyVO> pageList1(@Param("query") TAccountingStrategyQuery query, @Param("pageInfo")PageInfo<TAccountingStrategyVO> pageInfo); /** * 获取平台添加的计费策略 ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/TAccountingStrategyService.java
@@ -24,7 +24,8 @@ * @return */ PageInfo<TAccountingStrategyVO> pageList(TAccountingStrategyQuery query); PageInfo<TAccountingStrategyVO> pageList1(TAccountingStrategyQuery query); /** * 获取平台添加的计费策略 * @return ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TAccountingStrategyServiceImpl.java
@@ -64,6 +64,28 @@ pageInfo.setRecords(list); return pageInfo; } @Override public PageInfo<TAccountingStrategyVO> pageList1(TAccountingStrategyQuery query) { PageInfo<TAccountingStrategyVO> pageInfo = new PageInfo<>(query.getPageCurr(),query.getPageSize()); List<TAccountingStrategyVO> list = this.baseMapper.pageList1(query,pageInfo); List<Integer> parentIds = list.stream().map(TAccountingStrategyVO::getId).collect(Collectors.toList()); for (TAccountingStrategyVO tAccountingStrategyVO : list) { SysUser data = sysUserClient.getSysUser(tAccountingStrategyVO.getUserId()).getData(); tAccountingStrategyVO.setUserName(data.getNickName()); if (tAccountingStrategyVO.getFirstUserId()!=null){ SysUser first = sysUserClient.getSysUser(tAccountingStrategyVO.getFirstUserId()).getData(); tAccountingStrategyVO.setFirstUserName(first==null?null:first.getNickName()); } if (tAccountingStrategyVO.getTwoUserId()!=null){ SysUser two = sysUserClient.getSysUser(tAccountingStrategyVO.getTwoUserId()).getData(); tAccountingStrategyVO.setTwoUserName(two==null?null:two.getNickName()); } } pageInfo.setRecords(list); return pageInfo; } /** ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/service/impl/TChargingPileServiceImpl.java
@@ -586,24 +586,29 @@ @Override public void updateStatus() { List<TChargingPile> list = this.list(new LambdaQueryWrapper<TChargingPile>().eq(TChargingPile::getDelFlag, 0)); List<TChargingPile> datas = new ArrayList(); Map<String, Object> charging_pile_online = redisService.getCacheMap("charging_pile_online"); for (TChargingPile chargingPile : list) { Long time = (Long) charging_pile_online.get(chargingPile.getCode()); if(null != time && System.currentTimeMillis() - time > 60000){ chargingPile.setStatus(2); datas.add(chargingPile); } } if(datas.size() > 0){ for (TChargingPile data : datas) { TFaultMessage faultMessage = faultMessageService.getOne(new LambdaQueryWrapper<TFaultMessage>().eq(TFaultMessage::getChargingPileId, data.getId()) TChargingPile chargingPile1 = new TChargingPile(); chargingPile1.setId(chargingPile.getId()); chargingPile1.setStatus(2); this.updateById(chargingPile1); List<TChargingGun> list1 = chargingGunService.list(new LambdaQueryWrapper<TChargingGun>().eq(TChargingGun::getChargingPileId, chargingPile.getId())); for (TChargingGun chargingGun : list1) { TChargingGun chargingGun1 = new TChargingGun(); chargingGun1.setId(chargingGun.getId()); chargingGun1.setStatus(1); chargingGunService.updateById(chargingGun1); } //添加记录 TFaultMessage faultMessage = faultMessageService.getOne(new LambdaQueryWrapper<TFaultMessage>().eq(TFaultMessage::getChargingPileId, chargingPile.getId()) .eq(TFaultMessage::getStatus, 1).eq(TFaultMessage::getDelFlag, 0).isNull(TFaultMessage::getEndTime)); if(null == faultMessage){ faultMessage = new TFaultMessage(); faultMessage.setSiteId(data.getSiteId()); faultMessage.setChargingPileId(data.getId()); faultMessage.setSiteId(chargingPile.getSiteId()); faultMessage.setChargingPileId(chargingPile.getId()); faultMessage.setStatus(1); faultMessage.setDownTime(LocalDateTime.now()); faultMessage.setCreateTime(LocalDateTime.now()); @@ -612,7 +617,6 @@ faultMessageService.save(faultMessage); } } this.updateBatchById(datas); } } } ruoyi-service/ruoyi-chargingPile/src/main/resources/mapper/chargingPile/TAccountingStrategyMapper.xml
@@ -43,6 +43,25 @@ ORDER BY create_time DESC </select> <select id="pageList1" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO"> SELECT id, site_id, `name`, description, discount,first_user_id,two_user_id,first_remark,two_remark,audit_status,first_audit_time,two_audit_time, create_time, del_flag,user_id,parent_id FROM t_accounting_strategy <where> <if test="query.name != null and query.name != ''"> AND `name` LIKE concat('%',#{query.name}, '%') </if> <if test="query.auditStatus != null"> AND audit_status = #{query.auditStatus} </if> AND site_id IS NULL AND (parent_id IS NULL OR audit_status = 1 OR audit_status = 2) AND del_flag = ${@com.ruoyi.common.core.enums.DelFlagEnum@NO.getCode()} </where> ORDER BY create_time DESC </select> <select id="getPlatformAccountingStrategy" resultType="com.ruoyi.chargingPile.api.vo.TAccountingStrategyVO"> ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -348,7 +348,6 @@ public AjaxResult<ChargingOrderInfoVO> chargingOrderInfo(String strategyId) { TChargingOrder byId = chargingOrderService.getById(strategyId); ChargingOrderInfoVO chargingOrderInfoVO = new ChargingOrderInfoVO(); chargingOrderInfoVO.setCdElectronic(byId.getCurrent()!=null?byId.getCurrent().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); chargingOrderInfoVO.setCdVoltage(byId.getVoltage()!=null?byId.getVoltage().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); chargingOrderInfoVO.setSurplus(byId.getTotalElectricity()!=null?byId.getTotalElectricity().setScale(2, BigDecimal.ROUND_HALF_DOWN)+"":""); @@ -842,7 +841,7 @@ @ResponseBody @PostMapping(value = "/watch/delete") @GetMapping(value = "/watch/deletes") @ApiOperation(value = "监控订单-删除", tags = {"管理后台-订单管理"}) public R watchChargingOrder(@RequestParam String id) { uploadRealTimeMonitoringDataClient.delete(id); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -50,6 +50,7 @@ import com.ruoyi.order.vo.EndOfChargePageInfo; import com.ruoyi.other.api.domain.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; import com.ruoyi.other.api.domain.TVip; import com.ruoyi.other.api.feignClient.*; import com.ruoyi.payment.api.feignClient.AliPaymentClient; import com.ruoyi.payment.api.feignClient.WxPaymentClient; @@ -65,10 +66,12 @@ import org.springframework.util.StringUtils; import javax.annotation.Resource; import javax.crypto.MacSpi; import java.lang.reflect.InvocationTargetException; import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; import java.text.ParseException; import java.text.SimpleDateFormat; import java.time.*; import java.time.format.DateTimeFormatter; @@ -656,10 +659,107 @@ log.error(chargingOrder.getCode() + ":-------------------远程调起开始充电请求-------------------" + platformStartCharging.toString()); sendMessageClient.platformStartCharging(platformStartCharging); //异步线程检测远程启动的应答结果。如果失败,则需要全额退款 Long id = chargingOrder.getId(); //执行5分钟的定时任务检测 ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); scheduler.scheduleAtFixedRate(()->{ if(timingDetection(id)){ scheduler.shutdown(); } }, 5, 1, TimeUnit.SECONDS); return AjaxResult.success(); } /** * 定时检测mongodb数据库数据 * @param id * @return */ public boolean timingDetection(Long id){ TChargingOrder chargingOrder = this.getById(id); if(chargingOrder.getStatus() != 2){ return true; } String code = chargingOrder.getCode(); String key = "AQJC_" + chargingOrder.getChargingGunId(); List<PlatformStartChargingReply> data = platformStartChargingReplyClient.getPlatformStartChargingReply(code).getData(); if(null == data || data.size() == 0){ return false; } log.error(code + ":-------------------开始检查调起充电结果-------------------" + data.toString()); if(data.size() != 0){ PlatformStartChargingReply platformStartChargingReply = data.get(1); Integer startup_result = platformStartChargingReply.getStartup_result(); Integer failure_cause = platformStartChargingReply.getFailure_cause(); Integer counter = counter_map.get(code); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); //5分钟内还未插枪则取消充电,退回金额。 if(failure_cause == 5 && (null == counter || counter < 300)){ counter = (null == counter ? 0 : counter) + 1; counter_map.put(code, counter); //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(failure_cause); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return false; } //清除计时器中的无效数据 counter_map.remove(code); TChargingOrder order = new TChargingOrder(); order.setId(id); order.setAppUserId(chargingOrder.getAppUserId()); if(0 == startup_result){ //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(failure_cause); //启动失败后取消订单,退款操作 refund(code); order.setStatus(-1); order.setEndMode(0); }else{ //启动成功 preChargeCheck1.setStartupSuccess(2); order.setStatus(3); order.setStartTime(LocalDateTime.now()); } this.updateById(order); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return true; }else{ Integer counter = boot_failed_map.get(code); log.error(code + ":-------------------未上传开启充电结果-------------------" + counter); PreChargeCheck preChargeCheck1 = redisService.getCacheObject(key); //5分钟内未启动成功,退回金额。 if(null == counter || counter < 300){ counter = (null == counter ? 0 : counter) + 1; boot_failed_map.put(code, counter); //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(0); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return false; } //清除计时器中的无效数据 boot_failed_map.remove(code); TChargingOrder order = new TChargingOrder(); order.setId(id); order.setAppUserId(chargingOrder.getAppUserId()); //启动失败 preChargeCheck1.setStartupSuccess(3); preChargeCheck1.setFailureCause(0); //启动失败后取消订单,退款操作 refund(code); order.setStatus(-1); order.setEndMode(0); this.updateById(order); redisService.setCacheObject(key, preChargeCheck1, 24L, TimeUnit.HOURS); return true; } } /** @@ -798,7 +898,10 @@ one.setRefundTime(LocalDateTime.now()); chargingOrderRefundService.updateById(one); TChargingOrder chargingOrder = this.getById(one.getChargingOrderId()); TChargingOrder order = this.getById(one.getChargingOrderId()); TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setId(one.getChargingOrderId()); chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setRefundStatus(2); chargingOrder.setRefundSerialNumber(refund_id); chargingOrder.setRefundTime(LocalDateTime.now()); @@ -866,14 +969,17 @@ @Override @GlobalTransactional(rollbackFor = Exception.class) public AjaxResult stopCharging(String id) { TChargingOrder chargingOrder = this.getById(id); Integer status = chargingOrder.getStatus(); TChargingOrder order = this.getById(id); Integer status = order.getStatus(); if(status != 3){ return AjaxResult.error("还未开始充电"); } if(status == 4 || status == 5){ return AjaxResult.error("不能重复操作"); } TChargingOrder chargingOrder = new TChargingOrder(); chargingOrder.setId(Long.valueOf(id)); chargingOrder.setAppUserId(order.getAppUserId()); chargingOrder.setEndTime(LocalDateTime.now()); chargingOrder.setEndMode(1); this.updateById(chargingOrder); @@ -1681,6 +1787,8 @@ //开始处理计费明细数据和优惠数据 chargingOrderAccountingStrategyService.remove(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, chargingOrder.getId())); SimpleDateFormat sdfs = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); List<AccountingStrategyDetailOrderVo> lists = new ArrayList<>(); for (int i = 0; i < accountingStrategyDetailOrderList.size(); i++) { Class<? extends TransactionRecordMessageVO> clazz = vo.getClass(); try { @@ -1709,44 +1817,100 @@ continue; } BigDecimal sharp_peak_charge = new BigDecimal(invoke.toString()); TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); chargingOrderAccountingStrategy.setType(strategyDetail.getType()); chargingOrderAccountingStrategy.setStartTime(chargingOrder.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm"))); chargingOrderAccountingStrategy.setEndTime(LocalDateTime.now().format(DateTimeFormatter.ofPattern("HH:mm"))); chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); //已充电总度数 BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); BigDecimal serviceCharge = originalServicePrice; BigDecimal vipDiscountAmount = BigDecimal.ZERO; //计算优惠金额 if(null != chargingOrder.getVipDiscount()){ vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.DOWN); serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN); } chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount); chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); total = total.add(electrovalenc.add(originalServicePrice)); AccountingStrategyDetailOrderVo vo1 = new AccountingStrategyDetailOrderVo(); BeanUtils.copyProperties(strategyDetail, vo1); vo1.setStart(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getStartTime() + ":00").getTime()); vo1.setEnd(sdfs.parse(vo.getStart_time().split(" ")[0] + " " + strategyDetail.getEndTime() + ":00").getTime()); vo1.setServiceCharge(sharp_peak_charge); lists.add(vo1); } catch (IllegalAccessException e) { throw new RuntimeException(e); } catch (InvocationTargetException e) { throw new RuntimeException(e); } catch (NoSuchMethodException e) { throw new RuntimeException(e); } catch (ParseException e) { throw new RuntimeException(e); } } Collections.sort(lists, new Comparator<AccountingStrategyDetailOrderVo>() { public int compare(AccountingStrategyDetailOrderVo s1, AccountingStrategyDetailOrderVo s2) { return s1.getStart() < s2.getStart() ? -1 : s1.getStart() == s2.getStart() ? 0 : 1; } }); if(!vo.getStart_time().split(" ")[0].equals(vo.getEnd_time().split(" ")[0])){ List<AccountingStrategyDetailOrderVo> list1 = new ArrayList<>(lists); for (AccountingStrategyDetailOrderVo orderVo : list1) { Calendar start = Calendar.getInstance(); start.setTimeInMillis(orderVo.getStart()); start.set(Calendar.DAY_OF_YEAR, start.get(Calendar.DAY_OF_YEAR) + 1); orderVo.setStart(start.getTimeInMillis()); Calendar end = Calendar.getInstance(); end.setTimeInMillis(orderVo.getEnd()); end.set(Calendar.DAY_OF_YEAR, end.get(Calendar.DAY_OF_YEAR) + 1); orderVo.setEnd(end.getTimeInMillis()); } lists.addAll(list1); } //开始处理明细 SimpleDateFormat sdf3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SS"); SimpleDateFormat sdf2 = new SimpleDateFormat("HH:mm"); Date start = null; Date end = null; try { start = sdf3.parse(vo.getStart_time()); end = sdf3.parse(vo.getEnd_time()); } catch (ParseException e) { throw new RuntimeException(e); } for (AccountingStrategyDetailOrderVo strategyDetail : lists) { if(strategyDetail.getStart() < start.getTime() || strategyDetail.getEnd() > end.getTime()){ continue; } BigDecimal sharp_peak_charge = strategyDetail.getChargingCapacity(); TChargingOrderAccountingStrategy chargingOrderAccountingStrategy = new TChargingOrderAccountingStrategy(); chargingOrderAccountingStrategy.setChargingOrderId(chargingOrder.getId()); chargingOrderAccountingStrategy.setAccountingStrategyDetailId(strategyDetail.getId()); chargingOrderAccountingStrategy.setType(strategyDetail.getType()); chargingOrderAccountingStrategy.setElectrovalence(strategyDetail.getElectrovalence()); chargingOrderAccountingStrategy.setServiceCharge(strategyDetail.getServiceCharge()); chargingOrderAccountingStrategy.setCostServiceCharge(strategyDetail.getCostServiceCharge()); if(start.getTime() >= strategyDetail.getStart()){ chargingOrderAccountingStrategy.setStartTime(sdf2.format(start)); }else{ chargingOrderAccountingStrategy.setStartTime(strategyDetail.getStartTime()); } if(end.getTime() >= strategyDetail.getEnd()){ chargingOrderAccountingStrategy.setStartTime(strategyDetail.getEndTime()); }else{ chargingOrderAccountingStrategy.setStartTime(sdf2.format(end)); } //已充电总度数 BigDecimal electrovalenc = strategyDetail.getElectrovalence().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); BigDecimal originalServicePrice = strategyDetail.getServiceCharge().multiply(sharp_peak_charge).setScale(2, RoundingMode.DOWN); BigDecimal serviceCharge = originalServicePrice; BigDecimal vipDiscountAmount = BigDecimal.ZERO; //计算优惠金额 if(null != chargingOrder.getVipDiscount()){ vipDiscountAmount = serviceCharge.multiply(new BigDecimal(1).subtract(chargingOrder.getVipDiscount())).setScale(2, RoundingMode.DOWN); serviceCharge = serviceCharge.multiply(chargingOrder.getVipDiscount()).setScale(2, RoundingMode.DOWN); } chargingOrderAccountingStrategy.setChargingCapacity(sharp_peak_charge); chargingOrderAccountingStrategy.setPeriodElectricPrice(electrovalenc); chargingOrderAccountingStrategy.setPeriodServicePrice(serviceCharge); chargingOrderAccountingStrategy.setPeriodOriginalServicePrice(originalServicePrice); chargingOrderAccountingStrategy.setVipDiscountAmount(vipDiscountAmount); chargingOrderAccountingStrategy.setCreateTime(LocalDateTime.now()); chargingOrderAccountingStrategyService.save(chargingOrderAccountingStrategy); periodElectricPrice_total = periodElectricPrice_total.add(electrovalenc); periodServicePrice_total = periodServicePrice_total.add(originalServicePrice); total = total.add(electrovalenc.add(originalServicePrice)); } //原金额 @@ -1876,9 +2040,10 @@ BigDecimal couponDiscountAmount = order.getCouponDiscountAmount(); if(null != couponDiscountAmount && couponDiscountAmount.compareTo(BigDecimal.ZERO) > 0){ List<TChargingOrderAccountingStrategy> list = chargingOrderAccountingStrategyService.list(new LambdaQueryWrapper<TChargingOrderAccountingStrategy>().eq(TChargingOrderAccountingStrategy::getChargingOrderId, order.getId())); BigDecimal reduce = list.stream().map(TChargingOrderAccountingStrategy::getPeriodServicePrice).reduce(BigDecimal.ZERO, BigDecimal::add); for (TChargingOrderAccountingStrategy chargingOrderAccountingStrategy : list) { BigDecimal periodServicePrice = chargingOrderAccountingStrategy.getPeriodServicePrice(); BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(periodServicePrice_total, new MathContext(4, RoundingMode.HALF_EVEN))); BigDecimal multiply = couponDiscountAmount.multiply(periodServicePrice.divide(reduce, new MathContext(4, RoundingMode.HALF_EVEN))); periodServicePrice = periodServicePrice.subtract(multiply); chargingOrderAccountingStrategy.setPeriodServicePrice(periodServicePrice); chargingOrderAccountingStrategy.setCouponDiscountAmount(multiply); ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TOrderInvoiceServiceImpl.java
@@ -218,6 +218,8 @@ BigDecimal payMoney = tChargingOrder.getStatus() < 4 ? tChargingOrder.getRechargeAmount() : tChargingOrder.getPaymentAmount(); myChargingOrderList.setPayMoney(payMoney); myChargingOrderList.setCreateTime(tChargingOrder.getCreateTime().format(DateTimeFormatter.ofPattern("yyyy.MM.dd HH:mm:ss"))); myChargingOrderList.setElectricCharge(tChargingOrder.getElectrovalence()); myChargingOrderList.setServiceCharge(tChargingOrder.getServiceCharge()); chargingOrder.add(myChargingOrderList); } myOrderInvoiceInfo.setChargingOrder(chargingOrder); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/controller/TGoodsController.java
@@ -351,7 +351,7 @@ //调起支付 PaymentOrder paymentOrder = new PaymentOrder(); paymentOrder.setCode(shopOrder.getCode()); paymentOrder.setAmount(exchangeDto.getOrderPrice()); paymentOrder.setAmount(exchangeDto.getPayPrice()); paymentOrder.setOpenId(user.getWxOpenid()); paymentOrder.setDescription("购买商品"); R<Map<String, Object>> mapR = wxPaymentClient.orderPay(paymentOrder); ruoyi-service/ruoyi-other/src/main/java/com/ruoyi/other/service/impl/TGoodsServiceImpl.java
@@ -60,7 +60,6 @@ @Override public PageInfo<TGoods> pageList1(AppGoodQuery basePage) { GoodsDTO dto = new GoodsDTO(); dto.setType(2); dto.setStatus(1); dto.setPageCurr(basePage.getPageCurr()); dto.setPageSize(basePage.getPageSize()); @@ -81,7 +80,7 @@ } String string = stringBuilder.toString(); // 订单号加上商品类型 String res = string+"-"+dto.getType(); String res = string+"-"+basePage.getType(); List<Integer> data = orderClient.getSalesCountByGoodsId(res).getData(); for (int i = 0; i < list.size(); i++) {