mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-05-03 17:40:13 +08:00
充电桩预约功能
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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", "当前车牌号已经绑定,请检查!"),
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user