充电桩预约功能

This commit is contained in:
Guoqs
2024-06-18 17:13:29 +08:00
parent 313392104a
commit f5b00e9696
6 changed files with 144 additions and 29 deletions

View File

@@ -15,6 +15,7 @@ import com.jsowell.pile.dto.PileMemberBindingDTO;
import com.jsowell.pile.dto.QueryPersonPileDTO;
import com.jsowell.pile.service.PileBasicInfoService;
import com.jsowell.pile.service.PileMerchantInfoService;
import com.jsowell.pile.vo.PileReservedVO;
import com.jsowell.pile.vo.uniapp.PersonPileConnectorSumInfoVO;
import com.jsowell.pile.vo.uniapp.PersonPileRealTimeVO;
import com.jsowell.pile.vo.uniapp.PersonalPileInfoVO;
@@ -253,6 +254,54 @@ public class PersonPileController extends BaseController {
* 个人桩启动充电
*/
/**
* 添加预约充电
* http://localhost:8080/uniapp/personalPile/createReserved
*/
@PostMapping("/createReserved")
public RestApiResponse<?> createReserved(HttpServletRequest request, @RequestBody CreateReservedDTO dto) {
// logger.info("修改预约充电状态params:{}", dto);
RestApiResponse<?> response = null;
try {
String memberId = getMemberIdByAuthorization(request);
dto.setMemberId(memberId);
int reservedId = pileService.createReserved(dto);
response = new RestApiResponse<>(ImmutableMap.of("reservedId", reservedId));
} catch (BusinessException e) {
logger.error("添加预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
logger.error("添加预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_CREATE_RESERVED_ERROR);
}
logger.info("添加预约充电params:{}, result:{}", dto, response);
return response;
}
/**
* 查询预约充电列表
* http://localhost:8080/uniapp/personalPile/queryReservedList
*/
@PostMapping("/queryReservedList")
public RestApiResponse<?> queryReservedList(HttpServletRequest request, @RequestBody PileReservedDTO dto) {
// logger.info("修改预约充电状态params:{}", dto);
RestApiResponse<?> response = null;
try {
String memberId = getMemberIdByAuthorization(request);
dto.setMemberId(memberId);
PageResponse pageResponse = pileService.queryReservedList(dto);
response = new RestApiResponse<>(pageResponse);
} catch (BusinessException e) {
logger.error("查询预约列表error, params:{}", dto, e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
logger.error("查询预约列表error, params:{}", dto, e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_QUERY_RESERVED_LIST_ERROR);
}
logger.info("查询预约列表params:{}, result:{}", dto, response);
return response;
}
/**
* 修改预约充电状态
* http://localhost:8080/uniapp/personalPile/updateReservedStatus
@@ -277,27 +326,5 @@ public class PersonPileController extends BaseController {
return response;
}
/**
* 添加预约充电
* http://localhost:8080/uniapp/personalPile/createReserved
*/
@PostMapping("/createReserved")
public RestApiResponse<?> createReserved(HttpServletRequest request, @RequestBody CreateReservedDTO dto) {
// logger.info("修改预约充电状态params:{}", dto);
RestApiResponse<?> response = null;
try {
String memberId = getMemberIdByAuthorization(request);
dto.setMemberId(memberId);
int reservedId = pileService.createReserved(dto);
response = new RestApiResponse<>(ImmutableMap.of("reservedId", reservedId));
} catch (BusinessException e) {
logger.error("添加预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(e.getCode(), e.getMessage());
} catch (Exception e) {
logger.error("添加预约充电error, params:{}", dto, e);
response = new RestApiResponse<>(ReturnCodeEnum.CODE_CREATE_RESERVED_ERROR);
}
logger.info("添加预约充电params:{}, result:{}", dto, response);
return response;
}
}

View File

@@ -22,6 +22,7 @@ import com.jsowell.pile.util.SnUtils;
import com.jsowell.pile.service.*;
import com.jsowell.pile.transaction.dto.PileTransactionDTO;
import com.jsowell.pile.transaction.service.TransactionService;
import com.jsowell.pile.vo.PileReservedVO;
import com.jsowell.pile.vo.base.ConnectorInfoVO;
import com.jsowell.pile.vo.base.MerchantInfoVO;
import com.jsowell.pile.vo.base.PileInfoVO;
@@ -562,8 +563,10 @@ public class PileService {
*/
public void updateReservedStatus(PileReservedDTO dto) {
if (StringUtils.equals(dto.getStatus(), Constants.ZERO)) {
// 停用
pileReservedInfoService.deactivateReserved(dto);
} else if (StringUtils.equals(dto.getStatus(), Constants.ONE)) {
// 启用
pileReservedInfoService.activateReserved(dto);
}
}
@@ -588,4 +591,34 @@ public class PileService {
pileReservedInfoService.insertSelective(reservedInfo);
return reservedInfo.getId();
}
public PageResponse queryReservedList(PileReservedDTO dto) {
int pageNo = dto.getPageNo() == null ? Constants.one : dto.getPageNo();
int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize();
PageHelper.startPage(pageNo, pageSize);
List<PileReservedInfo> list = pileReservedInfoService.getReservationsByMemberIdAndPileSn(dto.getMemberId(), dto.getPileSn());
PageInfo<PileReservedInfo> pageInfo = new PageInfo<>(list);
PageResponse pageResponse = new PageResponse();
pageResponse.setPageNum(pageInfo.getPageNum());
pageResponse.setPageSize(pageInfo.getPageSize());
pageResponse.setPages(pageInfo.getPages());
pageResponse.setTotal(pageInfo.getTotal());
List<PileReservedVO> resultList = Lists.newArrayList();
for (PileReservedInfo reservedInfo : pageInfo.getList()) {
resultList.add(
PileReservedVO.builder()
.reservedId(reservedInfo.getId() + "")
.pileSn(reservedInfo.getPileSn())
.startTime(reservedInfo.getStartTime().toString())
.endTime(reservedInfo.getEndTime().toString())
.freq(reservedInfo.getFreq())
.status(reservedInfo.getStatus())
.build()
);
}
pageResponse.setList(resultList);
return pageResponse;
}
}

View File

@@ -168,8 +168,13 @@ public enum ReturnCodeEnum {
CODE_UNBIND_PILE_ERROR("00400012", "解绑个人桩异常!"),
CODE_CREATE_RESERVED_ERROR("00400013", "创建预约失败"),
CODE_UPDATE_RESERVED_STATUS_ERROR("00400014", "修改预约充电状态失败"),
CODE_QUERY_RESERVED_LIST_ERROR("00400015", "查询预约充电列表失败"),
CODE_UPDATE_RESERVED_STATUS_REFUSED("00400016", "时间与现有预订重叠"),
/* 个人桩 end */
CODE_THIS_CARNO_HAS_BEEN_BINDING("00500001", "当前车牌号已经绑定,请检查!"),

View File

@@ -23,6 +23,15 @@ public class PileReservedDTO {
*/
private String status;
/**
* 桩编号
*/
private String pileSn;
private Integer pageNo;
private Integer pageSize;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)

View File

@@ -1,12 +1,15 @@
package com.jsowell.pile.service.impl;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.enums.ykc.ReturnCodeEnum;
import com.jsowell.common.exception.BusinessException;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.StringUtils;
import com.jsowell.pile.dto.PileReservedDTO;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.sql.Time;
import java.time.LocalTime;
import java.util.Date;
import java.util.List;
@@ -125,17 +128,17 @@ public class PileReservedInfoServiceImpl implements PileReservedInfoService {
* @param reservationId
* @return
*/
public boolean isTimeSlotAvailable(String memberId, String pileSn, Date startTime, Date endTime, Integer reservationId) {
public boolean isTimeSlotAvailable(String memberId, String pileSn, Time startTime, Time endTime, Integer reservationId) {
List<PileReservedInfo> reservations = pileReservedInfoMapper.findByMemberIdAndPileSnAndStatus(memberId, pileSn, "1");
LocalTime newStartTime = LocalTime.parse(DateUtils.formatDateTime(startTime));
LocalTime newEndTime = LocalTime.parse(DateUtils.formatDateTime(endTime));
LocalTime newStartTime = startTime.toLocalTime();
LocalTime newEndTime = endTime.toLocalTime();
for (PileReservedInfo res : reservations) {
if (res.getId().equals(reservationId)) {
continue; // Skip the current reservation if updating
}
LocalTime existingStartTime = LocalTime.parse(DateUtils.formatDateTime(res.getStartTime()));
LocalTime existingEndTime = LocalTime.parse(DateUtils.formatDateTime(res.getEndTime()));
LocalTime existingStartTime = res.getStartTime().toLocalTime();
LocalTime existingEndTime = res.getEndTime().toLocalTime();
if (newStartTime.isBefore(existingEndTime) && newEndTime.isAfter(existingStartTime)) {
return false; // Time slot overlaps
@@ -148,7 +151,7 @@ public class PileReservedInfoServiceImpl implements PileReservedInfoService {
if (isTimeSlotAvailable(reservation.getMemberId(), reservation.getPileSn(), reservation.getStartTime(), reservation.getEndTime(), reservation.getId())) {
this.updateByPrimaryKeySelective(reservation);
} else {
throw new RuntimeException("Time slot overlaps with an existing reservation.");
throw new BusinessException(ReturnCodeEnum.CODE_UPDATE_RESERVED_STATUS_REFUSED);
}
}
}

View File

@@ -0,0 +1,38 @@
package com.jsowell.pile.vo;
import lombok.Builder;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Builder
public class PileReservedVO {
private String reservedId;
/**
* 充电桩编号
*/
private String pileSn;
/**
* 预约开始时间
*/
private String startTime;
/**
* 预约结束时间
*/
private String endTime;
/**
* 周期性预约的频率,对于单次预约,该字段可以为 NULL。可能的值包括 daily, weekly, monthly
*/
private String freq;
/**
* 状态0-未生效1-生效)
*/
private String status;
}