mirror of
https://codeup.aliyun.com/67c68d4e484ca2f0a13ac3c1/ydc/jsowell-charger-web.git
synced 2026-05-13 06:20:07 +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.dto.QueryPersonPileDTO;
|
||||||
import com.jsowell.pile.service.PileBasicInfoService;
|
import com.jsowell.pile.service.PileBasicInfoService;
|
||||||
import com.jsowell.pile.service.PileMerchantInfoService;
|
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.PersonPileConnectorSumInfoVO;
|
||||||
import com.jsowell.pile.vo.uniapp.PersonPileRealTimeVO;
|
import com.jsowell.pile.vo.uniapp.PersonPileRealTimeVO;
|
||||||
import com.jsowell.pile.vo.uniapp.PersonalPileInfoVO;
|
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
|
* http://localhost:8080/uniapp/personalPile/updateReservedStatus
|
||||||
@@ -277,27 +326,5 @@ public class PersonPileController extends BaseController {
|
|||||||
return response;
|
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.service.*;
|
||||||
import com.jsowell.pile.transaction.dto.PileTransactionDTO;
|
import com.jsowell.pile.transaction.dto.PileTransactionDTO;
|
||||||
import com.jsowell.pile.transaction.service.TransactionService;
|
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.ConnectorInfoVO;
|
||||||
import com.jsowell.pile.vo.base.MerchantInfoVO;
|
import com.jsowell.pile.vo.base.MerchantInfoVO;
|
||||||
import com.jsowell.pile.vo.base.PileInfoVO;
|
import com.jsowell.pile.vo.base.PileInfoVO;
|
||||||
@@ -562,8 +563,10 @@ public class PileService {
|
|||||||
*/
|
*/
|
||||||
public void updateReservedStatus(PileReservedDTO dto) {
|
public void updateReservedStatus(PileReservedDTO dto) {
|
||||||
if (StringUtils.equals(dto.getStatus(), Constants.ZERO)) {
|
if (StringUtils.equals(dto.getStatus(), Constants.ZERO)) {
|
||||||
|
// 停用
|
||||||
pileReservedInfoService.deactivateReserved(dto);
|
pileReservedInfoService.deactivateReserved(dto);
|
||||||
} else if (StringUtils.equals(dto.getStatus(), Constants.ONE)) {
|
} else if (StringUtils.equals(dto.getStatus(), Constants.ONE)) {
|
||||||
|
// 启用
|
||||||
pileReservedInfoService.activateReserved(dto);
|
pileReservedInfoService.activateReserved(dto);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -588,4 +591,34 @@ public class PileService {
|
|||||||
pileReservedInfoService.insertSelective(reservedInfo);
|
pileReservedInfoService.insertSelective(reservedInfo);
|
||||||
return reservedInfo.getId();
|
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_UNBIND_PILE_ERROR("00400012", "解绑个人桩异常!"),
|
||||||
|
|
||||||
CODE_CREATE_RESERVED_ERROR("00400013", "创建预约失败"),
|
CODE_CREATE_RESERVED_ERROR("00400013", "创建预约失败"),
|
||||||
|
|
||||||
CODE_UPDATE_RESERVED_STATUS_ERROR("00400014", "修改预约充电状态失败"),
|
CODE_UPDATE_RESERVED_STATUS_ERROR("00400014", "修改预约充电状态失败"),
|
||||||
|
|
||||||
|
CODE_QUERY_RESERVED_LIST_ERROR("00400015", "查询预约充电列表失败"),
|
||||||
|
|
||||||
|
CODE_UPDATE_RESERVED_STATUS_REFUSED("00400016", "时间与现有预订重叠"),
|
||||||
|
|
||||||
/* 个人桩 end */
|
/* 个人桩 end */
|
||||||
|
|
||||||
CODE_THIS_CARNO_HAS_BEEN_BINDING("00500001", "当前车牌号已经绑定,请检查!"),
|
CODE_THIS_CARNO_HAS_BEEN_BINDING("00500001", "当前车牌号已经绑定,请检查!"),
|
||||||
|
|||||||
@@ -23,6 +23,15 @@ public class PileReservedDTO {
|
|||||||
*/
|
*/
|
||||||
private String status;
|
private String status;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 桩编号
|
||||||
|
*/
|
||||||
|
private String pileSn;
|
||||||
|
|
||||||
|
private Integer pageNo;
|
||||||
|
|
||||||
|
private Integer pageSize;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
|
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
|
||||||
|
|||||||
@@ -1,12 +1,15 @@
|
|||||||
package com.jsowell.pile.service.impl;
|
package com.jsowell.pile.service.impl;
|
||||||
|
|
||||||
import com.jsowell.common.constant.Constants;
|
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.DateUtils;
|
||||||
import com.jsowell.common.util.StringUtils;
|
import com.jsowell.common.util.StringUtils;
|
||||||
import com.jsowell.pile.dto.PileReservedDTO;
|
import com.jsowell.pile.dto.PileReservedDTO;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
import javax.annotation.Resource;
|
import javax.annotation.Resource;
|
||||||
|
import java.sql.Time;
|
||||||
import java.time.LocalTime;
|
import java.time.LocalTime;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
@@ -125,17 +128,17 @@ public class PileReservedInfoServiceImpl implements PileReservedInfoService {
|
|||||||
* @param reservationId
|
* @param reservationId
|
||||||
* @return
|
* @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");
|
List<PileReservedInfo> reservations = pileReservedInfoMapper.findByMemberIdAndPileSnAndStatus(memberId, pileSn, "1");
|
||||||
LocalTime newStartTime = LocalTime.parse(DateUtils.formatDateTime(startTime));
|
LocalTime newStartTime = startTime.toLocalTime();
|
||||||
LocalTime newEndTime = LocalTime.parse(DateUtils.formatDateTime(endTime));
|
LocalTime newEndTime = endTime.toLocalTime();
|
||||||
|
|
||||||
for (PileReservedInfo res : reservations) {
|
for (PileReservedInfo res : reservations) {
|
||||||
if (res.getId().equals(reservationId)) {
|
if (res.getId().equals(reservationId)) {
|
||||||
continue; // Skip the current reservation if updating
|
continue; // Skip the current reservation if updating
|
||||||
}
|
}
|
||||||
LocalTime existingStartTime = LocalTime.parse(DateUtils.formatDateTime(res.getStartTime()));
|
LocalTime existingStartTime = res.getStartTime().toLocalTime();
|
||||||
LocalTime existingEndTime = LocalTime.parse(DateUtils.formatDateTime(res.getEndTime()));
|
LocalTime existingEndTime = res.getEndTime().toLocalTime();
|
||||||
|
|
||||||
if (newStartTime.isBefore(existingEndTime) && newEndTime.isAfter(existingStartTime)) {
|
if (newStartTime.isBefore(existingEndTime) && newEndTime.isAfter(existingStartTime)) {
|
||||||
return false; // Time slot overlaps
|
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())) {
|
if (isTimeSlotAvailable(reservation.getMemberId(), reservation.getPileSn(), reservation.getStartTime(), reservation.getEndTime(), reservation.getId())) {
|
||||||
this.updateByPrimaryKeySelective(reservation);
|
this.updateByPrimaryKeySelective(reservation);
|
||||||
} else {
|
} 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