ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/factory/AppUserCarFallbackFactory.java
@@ -31,6 +31,11 @@ public R<List<TAppUserCar>> getCarByIds(List<Long> carIds) { return R.fail("根据用户车辆id查询车辆信息失败:"+throwable.getMessage()); } @Override public R<TAppUserCar> getAppUserCarByLicensePlate(String licensePlate) { return R.fail("根据车牌号查询数据失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-account/src/main/java/com/ruoyi/account/api/feignClient/AppUserCarClient.java
@@ -28,4 +28,13 @@ */ @PostMapping(value = "/t-app-user-car/getCarByIds") public R<List<TAppUserCar>> getCarByIds(@RequestBody List<Long> carIds); /** * 根据车牌号查询数据 * @param licensePlate * @return */ @PostMapping(value = "/t-app-user-car/getAppUserCarByLicensePlate") R<TAppUserCar> getAppUserCarByLicensePlate(@RequestParam("licensePlate") String licensePlate); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingLotFallbackFactory.java
@@ -44,6 +44,11 @@ public R<BigDecimal> getRecordAmount(LocalDate sixBefore) { return null; } @Override public R<TParkingLot> getParkingLotByAppKey(String appKey) { return R.fail("根据停车场标识查询失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/factory/ParkingRecordFallbackFactory.java
New file @@ -0,0 +1,48 @@ package com.ruoyi.chargingPile.api.factory; import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.GetParkingRecord; import com.ruoyi.common.core.domain.R; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; /** * 停车场服务降级处理 * * @author ruoyi */ @Component public class ParkingRecordFallbackFactory implements org.springframework.cloud.openfeign.FallbackFactory<ParkingRecordClient> { private static final Logger log = LoggerFactory.getLogger(ParkingRecordFallbackFactory.class); @Override public ParkingRecordClient create(Throwable throwable) { log.error("停车记录调用失败:{}", throwable.getMessage()); return new ParkingRecordClient() { @Override public R<TParkingRecord> getParkingRecord(GetParkingRecord query) { return R.fail("根据车牌和状态查询停车数据失败:" + throwable.getMessage()); } @Override public void updateParkingRecord(TParkingRecord parkingRecord) { } @Override public R<TParkingRecord> getParkingRecordById(Long id) { return R.fail("根据id获取数失败:" + throwable.getMessage()); } @Override public void addParkingRecord(TParkingRecord parkingRecord) { } }; } } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingLotClient.java
@@ -34,5 +34,13 @@ @PostMapping(value = "/t-parking-lot/getRecordAmount") public R<BigDecimal> getRecordAmount(@RequestParam("sixBefore") LocalDate sixBefore); /** * 根据停车场标识查询停车场 * @param appKey * @return */ @PostMapping(value = "/t-parking-lot/getParkingLotByAppKey") R<TParkingLot> getParkingLotByAppKey(@RequestParam("appKey") String appKey); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/feignClient/ParkingRecordClient.java
New file @@ -0,0 +1,54 @@ package com.ruoyi.chargingPile.api.feignClient; import com.ruoyi.chargingPile.api.factory.ParkingRecordFallbackFactory; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.GetParkingRecord; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestParam; /** * @author zhibing.pu * @Date 2024/9/5 14:05 */ @FeignClient(contextId = "ParkingRecordClient", value = ServiceNameConstants.CHARGINGPILE_SERVICE, fallbackFactory = ParkingRecordFallbackFactory.class) public interface ParkingRecordClient { /** * 根据车牌和状态查询停车数据 * @param query * @return */ @PostMapping("/t-parking-record/getParkingRecord") R<TParkingRecord> getParkingRecord(@RequestBody GetParkingRecord query); /** * 修改停车数据 * @param parkingRecord */ @PostMapping("/t-parking-record/updateParkingRecord") void updateParkingRecord(@RequestBody TParkingRecord parkingRecord); /** * 根据id获取数据 * @param id * @return */ @PostMapping("/t-parking-record/getParkingRecordById") R<TParkingRecord> getParkingRecordById(@RequestParam("id") Long id); /** * 添加数据 * @param parkingRecord */ @PostMapping("/t-parking-record/addParkingRecord") void addParkingRecord(@RequestBody TParkingRecord parkingRecord); } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/model/TParkingRecord.java
@@ -39,11 +39,13 @@ @ApiModelProperty(value = "车牌号") @TableField("license_plate") private String licensePlate; @TableField(exist = false) private String name; @TableField(exist = false) private String uid; @ApiModelProperty(value = "订单编号") @TableField("code") private String code; @@ -87,6 +89,26 @@ @ApiModelProperty(value = "添加时间") @TableField("create_time") private LocalDateTime createTime; @ApiModelProperty(value = "超时占位费") @TableField("timeout_amount") private BigDecimal timeoutAmount; @ApiModelProperty(value = "电话") @TableField("phone") private String phone; @ApiModelProperty(value = "免费时长(分钟)") @TableField("free_duration") private Integer freeDuration; @ApiModelProperty(value = "免费金额") @TableField("free_amount") private BigDecimal freeAmount; @ApiModelProperty(value = "车场流水号") @TableField("serialnumber") private String serialnumber; } ruoyi-api/ruoyi-api-chargingPile/src/main/java/com/ruoyi/chargingPile/api/vo/GetParkingRecord.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.chargingPile.api.vo; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 14:16 */ @Data public class GetParkingRecord { /** * 车牌 */ private String licensePlate; /** * 状态(1=已进场,2=已出场,3=已缴费出场) */ private Integer status; } ruoyi-api/ruoyi-api-chargingPile/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports
@@ -3,4 +3,5 @@ com.ruoyi.chargingPile.api.factory.ParkingLotFallbackFactory com.ruoyi.chargingPile.api.factory.ChargingGunFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyDetailFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory com.ruoyi.chargingPile.api.factory.AccountingStrategyFallbackFactory com.ruoyi.chargingPile.api.factory.ParkingRecordFallbackFactory ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/factory/ChargingOrderFallbackFactory.java
@@ -9,6 +9,7 @@ import com.ruoyi.order.api.query.TChargingCountQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.cloud.openfeign.FallbackFactory; @@ -90,6 +91,11 @@ public void excelEndCharge(String code) { } @Override public R<TChargingOrder> getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { return R.fail("根据车牌号和时间查询有效的充电数据失败:" + throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/feignClient/ChargingOrderClient.java
@@ -11,6 +11,7 @@ import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingBillVO; import io.swagger.annotations.ApiOperation; import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.*; @@ -95,4 +96,13 @@ */ @PostMapping("/t-charging-order/excelEndCharge") void excelEndCharge(@RequestParam("code") String code); /** * 根据车牌号和时间查询有效的充电数据 * @param query * @return */ @PostMapping("/t-charging-order/getChargingOrderByLicensePlate") R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query); } ruoyi-api/ruoyi-api-order/src/main/java/com/ruoyi/order/api/vo/GetChargingOrderByLicensePlate.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.order.api.vo; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import java.time.LocalDateTime; /** * @author zhibing.pu * @Date 2024/9/5 14:25 */ @Data public class GetChargingOrderByLicensePlate { /** * 车牌 */ private String licensePlate; /** * 开始时间 */ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") private LocalDateTime startTime; } ruoyi-auth/src/main/java/com/ruoyi/auth/controller/TokenController.java
@@ -9,6 +9,7 @@ import io.seata.spring.annotation.GlobalTransactional; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.CollectionUtils; import org.springframework.web.bind.annotation.*; import com.ruoyi.auth.form.LoginBody; import com.ruoyi.auth.form.RegisterBody; @@ -48,11 +49,11 @@ HashMap<String, Object> map = new HashMap<>(); map.put("token", tokenService.createToken(userInfo)); List<SysRole> roles = userInfo.getSysUser().getRoles(); // if(CollectionUtils.isEmpty(roles)){ // return R.fail("请关联角色!"); // } if(CollectionUtils.isEmpty(roles)){ return R.fail("请关联角色!"); } // map.put("roleName",roles.get(0).getRoleName()); map.put("roleName",roles.get(0).getRoleName()); map.put("info", userInfo); // 修改用户最后登录时间 SysUser sysUser = new SysUser(); ruoyi-common/ruoyi-common-security/src/main/java/com/ruoyi/common/security/service/TokenService.java
@@ -94,7 +94,7 @@ public LoginUserApplet getLoginUserApplet() { LoginUserApplet loginUserAppletToken = getLoginUserAppletToken(ServletUtils.getRequest()); if (loginUserAppletToken == null) { throw new UserAppletException("登录失效,请重新登录!", 401); throw new RuntimeException("令牌已过期,请重新登录!"); } return loginUserAppletToken; } @@ -130,7 +130,11 @@ * @return 用户信息 */ public LoginUser getLoginUser() { return getLoginUser(ServletUtils.getRequest()); LoginUser loginUser = getLoginUser(ServletUtils.getRequest()); if (loginUser == null) { throw new RuntimeException("令牌已过期,请重新登录!"); } return loginUser; } /** @@ -209,10 +213,10 @@ public void refreshToken1(LoginUserApplet dto) { dto.setLoginTime(System.currentTimeMillis()); dto.setExpireTime(dto.getLoginTime() + expireTime * MILLIS_MINUTE); dto.setExpireTime(dto.getLoginTime() + expireAppletTime * MILLIS_MINUTE); // 根据uuid将loginUser缓存 String userKey = getTokenKey(dto.getToken()); redisService.setCacheObject(userKey, dto, expireTime, TimeUnit.MINUTES); redisService.setCacheObject(userKey, dto, expireAppletTime, TimeUnit.MINUTES); } private String getTokenKey(String token) { ruoyi-service/ruoyi-account/src/main/java/com/ruoyi/account/controller/TAppUserCarController.java
@@ -1,15 +1,13 @@ package com.ruoyi.account.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.account.api.model.TAppUserCar; import com.ruoyi.account.service.TAppUserCarService; import com.ruoyi.common.core.domain.R; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import java.util.List; @@ -37,6 +35,18 @@ public R<List<TAppUserCar>> getCarByIds(@RequestBody List<Long> carIds){ return R.ok(appUserCarService.list(Wrappers.lambdaQuery(TAppUserCar.class).in(TAppUserCar::getId,carIds))); } /** * 根据车牌号查询数据 * @param licensePlate * @return */ @PostMapping(value = "/t-app-user-car/getAppUserCarByLicensePlate") public R<TAppUserCar> getAppUserCarByLicensePlate(@RequestParam("licensePlate") String licensePlate){ TAppUserCar one = appUserCarService.getOne(new LambdaQueryWrapper<TAppUserCar>().eq(TAppUserCar::getLicensePlate, licensePlate).eq(TAppUserCar::getDelFlag, 0)); return R.ok(one); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingLotController.java
@@ -1,6 +1,7 @@ package com.ruoyi.chargingPile.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.toolkit.Wrappers; import com.ruoyi.chargingPile.api.dto.TParkingLotDTO; import com.ruoyi.chargingPile.api.model.TCarport; @@ -156,5 +157,18 @@ BigDecimal sum = parkingRecordService.getSum(sixBefore); return R.ok(); } /** * 根据停车场标识查询停车场 * @param appKey * @return */ @PostMapping(value = "/getParkingLotByAppKey") public R<TParkingLot> getParkingLotByAppKey(@RequestParam("appKey") String appKey){ TParkingLot parkingLot = parkingLotService.getOne(new LambdaQueryWrapper<TParkingLot>() .eq(TParkingLot::getAppKey, appKey).eq(TParkingLot::getDelFlag, 0)); return R.ok(parkingLot); } } ruoyi-service/ruoyi-chargingPile/src/main/java/com/ruoyi/chargingPile/controller/TParkingRecordController.java
@@ -1,9 +1,11 @@ package com.ruoyi.chargingPile.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.GetParkingRecord; import com.ruoyi.chargingPile.dto.ParkingRecordPageQuery; import com.ruoyi.chargingPile.service.TParkingLotService; import com.ruoyi.chargingPile.service.TParkingRecordService; @@ -64,8 +66,50 @@ return R.ok(); } /** * 根据车牌和状态查询停车数据 * @param query * @return */ @PostMapping("/getParkingRecord") public R<TParkingRecord> getParkingRecord(@RequestBody GetParkingRecord query){ TParkingRecord one = parkingRecordService.getOne(new LambdaQueryWrapper<TParkingRecord>() .eq(TParkingRecord::getLicensePlate, query.getLicensePlate()).eq(TParkingRecord::getStatus, query.getStatus())); return R.ok(one); } /** * 修改停车数据 * @param parkingRecord */ @PostMapping("/updateParkingRecord") public void updateParkingRecord(@RequestBody TParkingRecord parkingRecord){ parkingRecordService.updateById(parkingRecord); } /** * 根据id获取数据 * @param id * @return */ @PostMapping("/getParkingRecordById") public R<TParkingRecord> getParkingRecordById(@RequestParam("id") Long id){ TParkingRecord parkingRecord = parkingRecordService.getById(id); return R.ok(parkingRecord); } /** * 添加数据 * @param parkingRecord */ @PostMapping("/addParkingRecord") public void addParkingRecord(@RequestBody TParkingRecord parkingRecord){ parkingRecordService.save(parkingRecord); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/CouponController.java
New file @@ -0,0 +1,50 @@ package com.ruoyi.integration.barrierGate.controller; import com.ruoyi.integration.barrierGate.model.BaseResponse; import com.ruoyi.integration.barrierGate.model.GetCouponReq; import com.ruoyi.integration.barrierGate.model.GetCouponResp; import com.ruoyi.integration.barrierGate.model.UsedCoupon; import com.ruoyi.integration.barrierGate.server.CouponService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * 优惠券控制器 * @author zhibing.pu * @Date 2024/9/5 11:10 */ @RestController @RequestMapping("/coupon") public class CouponController { @Resource private CouponService couponService; /** * 获取优惠券 * 减免停车费的优惠 * @param req * @return */ @ResponseBody @PostMapping("/getCoupon") public BaseResponse<GetCouponResp> getCoupon(@RequestBody GetCouponReq req){ GetCouponResp coupon = couponService.getCoupon(req); return BaseResponse.ok(coupon); } /** * 使用优惠券 * @param req * @return */ @ResponseBody @PostMapping("/usedCoupon") public BaseResponse usedCoupon(@RequestBody UsedCoupon req){ couponService.usedCoupon(req); return BaseResponse.ok(); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/controller/ParkingOrderController.java
New file @@ -0,0 +1,93 @@ package com.ruoyi.integration.barrierGate.controller; import com.ruoyi.integration.barrierGate.model.*; import com.ruoyi.integration.barrierGate.server.ParkingOrderService; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; /** * @author zhibing.pu * @Date 2024/9/5 16:14 */ @RestController @RequestMapping("/parkingOrder") public class ParkingOrderController { @Resource private ParkingOrderService parkingOrderService; /** * 云停车入场 * @param order */ @ResponseBody @PostMapping("/cloudParkingInOrder") public BaseResponse cloudParkingInOrder(@RequestBody CloudParkingOrder order){ parkingOrderService.cloudParkingInOrder(order); return BaseResponse.ok(); } /** * 云停车出场 * @param order */ @ResponseBody @PostMapping("/cloudParkingOutOrder") public BaseResponse cloudParkingOutOrder(@RequestBody CloudParkingOrder order){ parkingOrderService.cloudParkingOutOrder(order); return BaseResponse.ok(); } /** * 云停车实时车位 * @param parkingSpace */ @ResponseBody @PostMapping("/cloudParkingSpace") public BaseResponse cloudParkingSpace(@RequestBody CloudParkingSpace parkingSpace){ parkingOrderService.cloudParkingSpace(parkingSpace); return BaseResponse.ok(); } /** * 线下停车场入场 * @param order */ @ResponseBody @PostMapping("/offlineParkingInOrder") public BaseResponse offlineParkingInOrder(@RequestBody OfflineParkingOrder order){ parkingOrderService.offlineParkingInOrder(order); return BaseResponse.ok(); } /** * 线下停车场出场 * @param order */ @ResponseBody @PostMapping("/offlineParkingOutOrder") public BaseResponse offlineParkingOutOrder(@RequestBody OfflineParkingOrder order){ parkingOrderService.offlineParkingOutOrder(order); return BaseResponse.ok(); } /** * 线下停车场实时车位 * @param parkingSpace */ @ResponseBody @PostMapping("/offlineParkingSpace") public BaseResponse offlineParkingSpace(@RequestBody OfflineParkingSpace parkingSpace){ parkingOrderService.offlineParkingSpace(parkingSpace); return BaseResponse.ok(); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/BaseResponse.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 11:29 */ @Data public class BaseResponse<T> { private String code; private String msg; private T data; public static BaseResponse ok(){ return ok(new Object()); } public static <T> BaseResponse<T> ok(T data){ BaseResponse baseResponse = new BaseResponse(); baseResponse.setCode("0"); baseResponse.setData(data); baseResponse.setMsg("成功"); return baseResponse; } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingOrder.java
New file @@ -0,0 +1,84 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * 云停车订单实体 * @author zhibing.pu * @Date 2024/9/5 15:54 */ @Data public class CloudParkingOrder { /** * 停车场appKey */ private String appkey; /** * 车场业务ID */ private String id; /** * 入场通道号 */ private String enterChannel; /** * 入场时间 */ private String enterDateTime; /** * 车牌号 */ private String plate; /** * 入场通道名称 */ private String enterChannelName; /** * 车牌颜色 */ private String plateColor; /** * 卡种类 */ private String kind; /** * 姓名 */ private String name; /** * 应收金额 */ private String receivable; /** * 实收金额 */ private String payment; /** * 支付方式 */ private String payType; /** * 离场通道号 */ private String leaveChannel; /** * 离场时间 */ private String leaveDateTime; /** * 离场通道名称 */ private String leaveChannelName; /** * 停车时长 */ private String longTime; /** * 时间戳 */ private String timestamp; /** * 签名 */ private String sign; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/CloudParkingSpace.java
New file @@ -0,0 +1,35 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 16:22 */ @Data public class CloudParkingSpace { /** * 停车场appkey */ private String appkey; /** * 总车位数 */ private String total; /** * 已用车位 */ private String used; /** * 空余车位 */ private String free; /** * 时间戳 */ private String timestamp; /** * 签名 */ private String sign; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponReq.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 11:12 */ @Data public class GetCouponReq { /** * 停车场appkey */ private String appKey; /** * 车牌号 */ private String carNumber; /** * 时间戳 */ private String timestamp; /** * 停车费用 */ private String fee; /** * 签名 */ private String sign; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/GetCouponResp.java
New file @@ -0,0 +1,43 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 11:19 */ @Data public class GetCouponResp { /** * 优惠券记录id */ private Long recordId; /** * 车牌号 */ private String carNumber; /** * 平台编号 */ private String sysOrgId; /** * 商户名称 */ private String posName; /** * 优惠券名称 */ private String couponName; /** * 发放人 */ private String lssuer; /** * 类型:1单次全免、2金额优惠、3单笔折扣、4优惠时长、5日期范围全免 */ private Integer type; /** * 优惠明细 */ private Parameter parameter; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingOrder.java
New file @@ -0,0 +1,91 @@ package com.ruoyi.integration.barrierGate.model; import com.fasterxml.jackson.annotation.JsonFormat; import com.fasterxml.jackson.annotation.JsonProperty; import lombok.Data; /** * 云停车订单实体 * @author zhibing.pu * @Date 2024/9/5 15:54 */ @Data public class OfflineParkingOrder { /** * 停车场appKey */ private String appkey; /** * 10 位时间戳 */ private String timestamp; /** * 签名 */ private String sign; /** * 进出记录 ID */ private String id; /** * 卡号 */ private String cardid; /** * 会员 ID */ private String memberid; /** * 会员类型 */ private String membertype; /** * 会员姓名 */ private String name; /** * 车牌号 */ private String platenumber; /** * 车牌颜色 */ private String platecolor; /** * 入场通道 */ private String enterchannel; /** * 入场时间 */ private String entertime; /** * 是否库中库 0、不是库中库,1、是库中库 */ private Integer subplace; /** * 抓拍图片(base64) */ private String image; /** * 备注 */ private String remark; /** * 停车时长(分钟) */ @JsonProperty("long") private String longTime; /** * 停车费用 */ private String money; /** * 出场通道 */ private String leavechannel; /** * 出场时间 */ private String leavetime; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/OfflineParkingSpace.java
New file @@ -0,0 +1,39 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 16:22 */ @Data public class OfflineParkingSpace { /** * 停车场appkey */ private String appkey; /** * 10 位时间戳 */ private String timestamp; /** * 签名 */ private String sign; /** * 总车位数 */ private Integer place; /** * 剩余车位数 */ private Integer surplus; /** * 固定车数量 */ private Integer fixed; /** * 临时车数量 */ private Integer interim; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/Parameter.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 11:24 */ @Data public class Parameter { /** * 使用门槛 */ private Boolean isHaveUseRequirement; /** * 金额优惠满减阈值 */ private Double minAmount; /** * 时长优惠满减阈值 */ private Double minRequirement; /** * 全免标记 */ private Boolean freeFlag; /** * 优惠折扣 */ private Double discount; /** * 优惠金额 */ private Double money; /** * 优惠时长 */ private Integer time; /** * 开始日期 yyyy-mm-dd HH:mm:ss #日期范围开始 */ private String startTime; /** * 结束日期 yyyy-mm-dd HH:mm:ss #日期范围开始 */ private String endTime; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/model/UsedCoupon.java
New file @@ -0,0 +1,47 @@ package com.ruoyi.integration.barrierGate.model; import lombok.Data; /** * @author zhibing.pu * @Date 2024/9/5 15:39 */ @Data public class UsedCoupon { /** * 停车场appkey */ private String appKey; /** * 车牌号 */ private String carNumber; /** * 车场流水号 */ private String serialnumber; /** * 时间戳 */ private String timestamp; /** * 未优惠停车费用 */ private String fee; /** * 优惠金额 */ private String actualFee; /** * 优惠券id */ private String recordId; /** * 平台编号 */ private String sysOrgId; /** * 签名 */ private String sign; } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/CouponService.java
New file @@ -0,0 +1,120 @@ package com.ruoyi.integration.barrierGate.server; import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.GetParkingRecord; import com.ruoyi.integration.barrierGate.model.GetCouponReq; import com.ruoyi.integration.barrierGate.model.GetCouponResp; import com.ruoyi.integration.barrierGate.model.Parameter; import com.ruoyi.integration.barrierGate.model.UsedCoupon; import com.ruoyi.order.api.feignClient.ChargingOrderClient; import com.ruoyi.order.api.model.TChargingOrder; import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import org.springframework.stereotype.Service; import org.springframework.web.bind.annotation.RequestBody; import javax.annotation.Resource; import java.math.BigDecimal; import java.time.LocalDateTime; /** * @author zhibing.pu * @Date 2024/9/5 11:11 */ @Service public class CouponService { @Resource private ParkingLotClient parkingLotClient; @Resource private ParkingRecordClient parkingRecordClient; @Resource private ChargingOrderClient chargingOrderClient; /** * 获取优惠券 * @param req * @return */ public GetCouponResp getCoupon(GetCouponReq req){ //根据车牌查询入场时间,后再根据入场时间和车牌查询是否有充电订单 String carNumber = req.getCarNumber(); String appKey = req.getAppKey(); TParkingLot parkingLot = parkingLotClient.getParkingLotByAppKey(appKey).getData(); if(null == parkingLot){ return null; } GetParkingRecord query = new GetParkingRecord(); query.setStatus(1); query.setLicensePlate(carNumber); TParkingRecord data = parkingRecordClient.getParkingRecord(query).getData(); if(null == data){ return null; } //入场时间 LocalDateTime inParkingTime = data.getInParkingTime(); //开始查询充电订单 GetChargingOrderByLicensePlate getChargingOrderByLicensePlate = new GetChargingOrderByLicensePlate(); getChargingOrderByLicensePlate.setLicensePlate(carNumber); getChargingOrderByLicensePlate.setStartTime(inParkingTime); TChargingOrder tChargingOrder = chargingOrderClient.getChargingOrderByLicensePlate(getChargingOrderByLicensePlate).getData(); GetCouponResp resp = new GetCouponResp(); resp.setRecordId(data.getId()); resp.setCarNumber(carNumber); // todo 需要第三方提供数据 resp.setSysOrgId(""); resp.setPosName(""); resp.setLssuer("admin"); resp.setType(4); Parameter parameter = new Parameter(); parameter.setFreeFlag(false); if(null == tChargingOrder){ //按照非充电进行优惠计算 resp.setCouponName("普通停车时长优惠"); parameter.setTime(parkingLot.getNonChargeFreeDuration()); data.setFreeDuration(parkingLot.getNonChargeFreeDuration()); parkingRecordClient.updateParkingRecord(data); }else{ resp.setCouponName("充电停车时长优惠"); parameter.setTime(parkingLot.getChargeFreeDuration()); data.setFreeDuration(parkingLot.getNonChargeFreeDuration()); data.setChargingOrderId(tChargingOrder.getId()); data.setAppUserId(tChargingOrder.getAppUserId()); parkingRecordClient.updateParkingRecord(data); } resp.setParameter(parameter); return resp; } /** * 使用优惠券 * @param req */ public void usedCoupon(UsedCoupon req){ TParkingRecord data = parkingRecordClient.getParkingRecordById(Long.valueOf(req.getRecordId())).getData(); data.setSerialnumber(req.getSerialnumber()); data.setFreeAmount(new BigDecimal(req.getActualFee())); data.setOrderAmount(new BigDecimal(req.getFee())); BigDecimal subtract = data.getOrderAmount().subtract(data.getFreeAmount()); if(BigDecimal.ZERO.compareTo(subtract) < 0){ data.setTimeoutAmount(subtract); data.setOutParkingType(1); data.setStatus(3); }else{ data.setTimeoutAmount(BigDecimal.ZERO); data.setOutParkingType(2); data.setStatus(2); } parkingRecordClient.updateParkingRecord(data); } } ruoyi-service/ruoyi-integration/src/main/java/com/ruoyi/integration/barrierGate/server/ParkingOrderService.java
New file @@ -0,0 +1,134 @@ package com.ruoyi.integration.barrierGate.server; import com.ruoyi.account.api.feignClient.AppUserCarClient; import com.ruoyi.chargingPile.api.feignClient.ParkingLotClient; import com.ruoyi.chargingPile.api.feignClient.ParkingRecordClient; import com.ruoyi.chargingPile.api.model.TParkingLot; import com.ruoyi.chargingPile.api.model.TParkingRecord; import com.ruoyi.chargingPile.api.vo.GetParkingRecord; import com.ruoyi.integration.barrierGate.model.CloudParkingOrder; import com.ruoyi.integration.barrierGate.model.CloudParkingSpace; import com.ruoyi.integration.barrierGate.model.OfflineParkingOrder; import com.ruoyi.integration.barrierGate.model.OfflineParkingSpace; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.Date; /** * @author zhibing.pu * @Date 2024/9/5 16:15 */ @Service public class ParkingOrderService { @Resource private ParkingRecordClient parkingRecordClient; @Resource private AppUserCarClient appUserCarClient; @Resource private ParkingLotClient parkingLotClient; /** * 云停车入场记录 * @param order */ public void cloudParkingInOrder(CloudParkingOrder order) { TParkingRecord parkingRecord = new TParkingRecord(); parkingRecord.setLicensePlate(order.getPlate()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = "TC" + Math.random() * 1000 + sdf.format(new Date()); parkingRecord.setCode(code); parkingRecord.setVehicleColor(order.getPlateColor()); TParkingLot data = parkingLotClient.getParkingLotByAppKey(order.getAppkey()).getData(); parkingRecord.setParkingLotId(data.getId()); parkingRecord.setInParkingTime(LocalDateTime.parse(order.getEnterDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); parkingRecord.setStatus(1); parkingRecord.setCreateTime(LocalDateTime.now()); parkingRecord.setSerialnumber(order.getId()); parkingRecordClient.addParkingRecord(parkingRecord); } /** * 云停车出场记录 * @param order */ public void cloudParkingOutOrder(CloudParkingOrder order) { GetParkingRecord query = new GetParkingRecord(); query.setLicensePlate(order.getPlate()); query.setStatus(1); TParkingRecord parkingRecord = parkingRecordClient.getParkingRecord(query).getData(); parkingRecord.setOutParkingTime(LocalDateTime.parse(order.getLeaveDateTime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); parkingRecord.setParkingDuration(Integer.valueOf(order.getLongTime())); parkingRecord.setOrderAmount(new BigDecimal(order.getReceivable())); BigDecimal payment = new BigDecimal(order.getPayment()); parkingRecord.setStatus(BigDecimal.ZERO.compareTo(payment) == 0 ? 2 : 3); parkingRecordClient.updateParkingRecord(parkingRecord); } /** * 云停车实时车位 * @param parkingSpace */ public void cloudParkingSpace(CloudParkingSpace parkingSpace){ } /** * 线下停车场入场记录 * @param order */ public void offlineParkingInOrder(OfflineParkingOrder order) { TParkingRecord parkingRecord = new TParkingRecord(); parkingRecord.setLicensePlate(order.getPlatenumber()); SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmssSSS"); String code = "TC" + Math.random() * 1000 + sdf.format(new Date()); parkingRecord.setCode(code); parkingRecord.setVehicleColor(order.getPlatecolor()); TParkingLot data = parkingLotClient.getParkingLotByAppKey(order.getAppkey()).getData(); parkingRecord.setParkingLotId(data.getId()); parkingRecord.setInParkingTime(LocalDateTime.parse(order.getEntertime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); parkingRecord.setStatus(1); parkingRecord.setCreateTime(LocalDateTime.now()); parkingRecord.setSerialnumber(order.getId()); parkingRecordClient.addParkingRecord(parkingRecord); } /** * 线下停车场出场记录 * @param order */ public void offlineParkingOutOrder(OfflineParkingOrder order) { GetParkingRecord query = new GetParkingRecord(); query.setLicensePlate(order.getPlatenumber()); query.setStatus(1); TParkingRecord parkingRecord = parkingRecordClient.getParkingRecord(query).getData(); parkingRecord.setOutParkingTime(LocalDateTime.parse(order.getLeavetime(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))); parkingRecord.setParkingDuration(Integer.valueOf(order.getLongTime())); parkingRecord.setOrderAmount(new BigDecimal(order.getMoney())); parkingRecordClient.updateParkingRecord(parkingRecord); } /** * 线下停车场实时车位 * @param parkingSpace */ public void offlineParkingSpace(OfflineParkingSpace parkingSpace){ } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/controller/TChargingOrderController.java
@@ -42,6 +42,7 @@ import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingOrderInfoVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.GetMyChargingOrderList; import com.ruoyi.order.dto.GetNoInvoicedOrder; @@ -813,4 +814,16 @@ public void excelEndCharge(@RequestParam("code") String code){ chargingOrderService.excelEndCharge(code); } /** * 根据车牌号和时间查询有效的充电数据 * @param query * @return */ @PostMapping("/getChargingOrderByLicensePlate") public R<TChargingOrder> getChargingOrderByLicensePlate(@RequestBody GetChargingOrderByLicensePlate query){ TChargingOrder chargingOrder = chargingOrderService.getChargingOrderByLicensePlate(query); return R.ok(chargingOrder); } } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/TChargingOrderService.java
@@ -12,6 +12,8 @@ import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.GetChargingOrderByLicensePlate; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.dto.*; import com.ruoyi.order.vo.ChargingOrderListInfoVO; @@ -154,4 +156,13 @@ * @param orderCode */ void excelEndCharge(String orderCode); /** * 根据车牌号和开始时间查询充电数据 * @param query * @return */ TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query); } ruoyi-service/ruoyi-order/src/main/java/com/ruoyi/order/service/impl/TChargingOrderServiceImpl.java
@@ -34,10 +34,7 @@ import com.ruoyi.order.api.model.*; import com.ruoyi.order.api.query.ChargingOrderQuery; import com.ruoyi.order.api.query.UploadRealTimeMonitoringDataQuery; import com.ruoyi.order.api.vo.ChargingOrderListVO; import com.ruoyi.order.api.vo.ChargingOrderTimeVO; import com.ruoyi.order.api.vo.ChargingOrderVO; import com.ruoyi.order.api.vo.TCharingOrderVO; import com.ruoyi.order.api.vo.*; import com.ruoyi.order.dto.*; import com.ruoyi.order.mapper.TChargingOrderMapper; import com.ruoyi.order.service.TChargingOrderAccountingStrategyService; @@ -592,7 +589,7 @@ preChargeCheck1.setFailureCause(failure_cause); //启动失败后取消订单,退款操作 refund(code); order.setStatus(5); order.setStatus(-1); order.setEndMode(0); }else{ preChargeCheck1.setStartupSuccess(2); @@ -1615,4 +1612,22 @@ return null; } /** * 根据车牌号和开始时间查询充电数据 * @param query * @return */ @Override public TChargingOrder getChargingOrderByLicensePlate(GetChargingOrderByLicensePlate query) { TAppUserCar appUserCar = appUserCarClient.getAppUserCarByLicensePlate(query.getLicensePlate()).getData(); if(null == appUserCar){ return null; } TChargingOrder one = this.getOne(new LambdaQueryWrapper<TChargingOrder>().eq(TChargingOrder::getAppUserCarId, appUserCar.getId()) .eq(TChargingOrder::getDelFlag, 0).gt(TChargingOrder::getStartTime, query.getStartTime()) .eq(TChargingOrder::getRechargePaymentStatus, 2).ne(TChargingOrder::getStatus, -1)); return one; } }