Merge branch 'dev-new' into dev-new-rabbitmq

This commit is contained in:
Guoqs
2024-11-22 14:21:58 +08:00
43 changed files with 1859 additions and 445 deletions

View File

@@ -1,7 +1,5 @@
package com.jsowell.pile.domain;
import java.math.BigDecimal;
import java.util.Date;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
@@ -9,9 +7,12 @@ import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import lombok.experimental.SuperBuilder;
import java.math.BigDecimal;
import java.util.Date;
/**
* 个人充电桩的充电记录
*/
* 个人充电桩的充电记录
*/
@Data
@Accessors(chain = true)
@SuperBuilder
@@ -20,157 +21,177 @@ import lombok.experimental.SuperBuilder;
@NoArgsConstructor
public class PersonalChargingRecord {
/**
* 主键
*/
* 主键
*/
private Integer id;
/**
* 交易流水号
*/
* 交易流水号
*/
private String transactionCode;
/**
* 订单状态(0-未启动1-充电中2-待结算3-待补缴4-异常5-可疑6-订单完成7-超时关闭)
*/
* 订单状态(0-未启动1-充电中2-待结算3-待补缴4-异常5-可疑6-订单完成7-超时关闭)
*/
private String status;
/**
* 会员id
*/
* 会员id
*/
private String memberId;
/**
* 站点id
*/
* 站点id
*/
private String stationId;
/**
* 运营商id
*/
* 运营商id
*/
private String merchantId;
/**
* 充电桩sn
*/
* 充电桩sn
*/
private String pileSn;
/**
* 充电桩枪口号
*/
* 充电桩枪口号
*/
private String connectorCode;
/**
* 充电桩枪口编号
*/
* 充电桩枪口编号
*/
private String pileConnectorCode;
/**
* 卡启动时的卡号
*/
* 卡启动时的卡号
*/
private String logicCard;
/**
* vin启动时的vin码
*/
* vin启动时的vin码
*/
private String vinCode;
/**
* 启动方式0-后管启动1-用户app启动2-卡启动3-离线卡启动; 4-第三方平台启动; 5-车辆vin码启动
*/
* 启动方式0-后管启动1-用户app启动2-卡启动3-离线卡启动; 4-第三方平台启动; 5-车辆vin码启动
*/
private String startMode;
/**
* 车牌号码
*/
* 车牌号码
*/
private String plateNumber;
/**
* 充电开始时间
*/
* 充电开始时间
*/
private Date chargeStartTime;
/**
* 充电结束时间
*/
* 充电结束时间
*/
private Date chargeEndTime;
/**
* 启动类型now-立即启动reservation-预约启动)
*/
* 启动类型now-立即启动reservation-预约启动)
*/
private String startType;
/**
* 预约开始时间
*/
* 预约开始时间
*/
private Date reservationStartTime;
/**
* 预约结束时间
*/
* 预约结束时间
*/
private Date reservationEndTime;
/**
* 开始SOC
*/
* 开始SOC
*/
private String startSoc;
/**
* 结束SOC
*/
* 结束SOC
*/
private String endSoc;
/**
* 总用电量
*/
* 电表总起值
*/
private String ammeterTotalStart;
/**
* 电表总止值
*/
private String ammeterTotalEnd;
/**
* 总用电量
*/
private BigDecimal totalUsedElectricity;
/**
* 尖时段用电量
*/
* 尖时段用电量
*/
private BigDecimal sharpUsedElectricity;
/**
* 峰时段用电量
*/
* 峰时段用电量
*/
private BigDecimal peakUsedElectricity;
/**
* 平时段用电量
*/
* 平时段用电量
*/
private BigDecimal flatUsedElectricity;
/**
* 谷时段用电量
*/
* 谷时段用电量
*/
private BigDecimal valleyUsedElectricity;
/**
* 异常原因
*/
* 异常原因
*/
private String reason;
/**
* 创建人
*/
* 交易日期
*/
private Date tradeDate;
/**
* 来源(4G/BT)
*/
private String sourceType;
/**
* 创建人
*/
private String createBy;
/**
* 创建时间
*/
* 创建时间
*/
private Date createTime;
/**
* 更新人
*/
* 更新人
*/
private String updateBy;
/**
* 更新时间
*/
* 更新时间
*/
private Date updateTime;
/**
* 删除标识0-正常1-删除)
*/
* 删除标识0-正常1-删除)
*/
private String delFlag;
}

View File

@@ -47,6 +47,18 @@ public class PileFirmwareInfo extends BaseEntity {
@Excel(name = "适用类型")
private String applyType;
/**
* 使用范围
*/
@Excel(name = "使用范围")
private String useRange;
/**
* 下载链接url
*/
@Excel(name = "下载链接url")
private String downloadUrl;
/**
* 删除标识0-正常1-删除)
*/
@@ -54,16 +66,15 @@ public class PileFirmwareInfo extends BaseEntity {
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("id", getId())
.append("name", getName())
.append("desc", getDescription())
.append("filePath", getFilePath())
.append("createTime", getCreateTime())
.append("createBy", getCreateBy())
.append("updateTime", getUpdateTime())
.append("updateBy", getUpdateBy())
.append("delFlag", getDelFlag())
return new ToStringBuilder(this)
.append("id", id)
.append("name", name)
.append("description", description)
.append("filePath", filePath)
.append("applyType", applyType)
.append("useRange", useRange)
.append("downloadUrl", downloadUrl)
.append("delFlag", delFlag)
.toString();
}
}

View File

@@ -2,6 +2,8 @@ package com.jsowell.pile.dto;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
/**
* 蓝牙充电记录
@@ -95,7 +97,6 @@ public class BluetoothChargingRecordDTO {
@JsonProperty(value = "MoneyValley")
private String moneyValley;
// 电表总起值
@JsonProperty(value = "StartKwh")
private String startKwh;
@@ -135,4 +136,42 @@ public class BluetoothChargingRecordDTO {
// 物理卡号
@JsonProperty(value = "PCardID")
private String pCardID;
@Override
public String toString() {
return new ToStringBuilder(this, ToStringStyle.JSON_STYLE)
.append("memberId", memberId)
.append("trxSN", trxSN)
.append("pileNo", pileNo)
.append("plugNo", plugNo)
.append("startTime", startTime)
.append("endTime", endTime)
.append("priceSharp", priceSharp)
.append("energySharp", energySharp)
.append("lossKwhSharp", lossKwhSharp)
.append("moneySharp", moneySharp)
.append("pricePeak", pricePeak)
.append("energyPeak", energyPeak)
.append("lossKwhPeak", lossKwhPeak)
.append("moneyPeak", moneyPeak)
.append("priceFlat", priceFlat)
.append("energyFlat", energyFlat)
.append("lossKwhFlat", lossKwhFlat)
.append("moneyFlat", moneyFlat)
.append("priceValley", priceValley)
.append("energyValley", energyValley)
.append("lossKwhValley", lossKwhValley)
.append("moneyValley", moneyValley)
.append("startKwh", startKwh)
.append("stopKwh", stopKwh)
.append("totalEnergy", totalEnergy)
.append("lossTotalKwh", lossTotalKwh)
.append("totalMoney", totalMoney)
.append("vin", vin)
.append("startMode", startMode)
.append("tradeTime", tradeTime)
.append("stopReason", stopReason)
.append("pCardID", pCardID)
.toString();
}
}

View File

@@ -0,0 +1,30 @@
package com.jsowell.pile.dto;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* 查询桩固件DTO
*
* @author Lemon
* @Date 2024/11/21 16:03:18
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class PileFirmwareInfoDTO {
private Integer pageNo;
private Integer pageSize;
/**
* 使用范围
* 1-4G2-蓝牙
*/
private String useRange;
}

View File

@@ -247,6 +247,15 @@ public interface OrderBasicInfoMapper {
*/
SendMessageVO selectOrderInfoByOrderCode(@Param("orderCode") String orderCode);
/**
* 查询时间段内订单列表
* TODO 慢sql需要优化
* @param startTime
* @param endTime
* @param orderStatus
* @param payStatus
* @return
*/
List<OrderBasicInfo> selectOrderListByTimeRangeAndStatus(@Param("startTime") String startTime,
@Param("endTime") String endTime,
@Param("orderStatus") String orderStatus,

View File

@@ -8,7 +8,6 @@ import com.jsowell.pile.dto.QueryPersonPileDTO;
import java.util.List;
public interface PersonalChargingRecordService{
int deleteByPrimaryKey(Integer id);
int insert(PersonalChargingRecord record);

View File

@@ -1,6 +1,9 @@
package com.jsowell.pile.service;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.pile.domain.PileFirmwareInfo;
import com.jsowell.pile.dto.PileFirmwareInfoDTO;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -58,4 +61,11 @@ public interface PileFirmwareInfoService {
* @return 结果
*/
public int deletePileFirmwareInfoById(Long id);
/**
* 通过使用范围查询桩固件信息列表
* @param dto
* @return
*/
PageResponse selectPileFirmwareListByUseRange(PileFirmwareInfoDTO dto);
}

View File

@@ -35,6 +35,7 @@ import java.net.UnknownHostException;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class PileRemoteService {
@@ -289,19 +290,20 @@ public class PileRemoteService {
pileBillingTemplate.setId(Long.valueOf(billingTemplateVO.getTemplateId()));
pileBillingTemplate.setPublishTime(new Date());
pileBillingTemplateService.updatePileBillingTemplate(pileBillingTemplate);
// 获取到站点下所有的桩, 下发计费模板, 电单车不支持
if (StringUtils.equals(billingTemplateVO.getDeviceType(), Constants.ONE)) {
List<PileDetailVO> pileList = pileBasicInfoService.selectPileListByStationIds(Lists.newArrayList(Long.valueOf(dto.getStationId())));
if (CollectionUtils.isNotEmpty(pileList)) {
// for (PileDetailVO pileInfoVO : pileList) {
// // 下发计费模板
// publishPileBillingTemplate(pileInfoVO.getPileSn(), billingTemplateVO);
// }
// 获取到站点下所有的桩
List<PileDetailVO> pileList = pileBasicInfoService.selectPileListByStationIds(Lists.newArrayList(Long.valueOf(dto.getStationId())));
if (CollectionUtils.isNotEmpty(pileList)) {
// 删除缓存
List<String> collect = pileList.parallelStream()
.map(vo -> CacheConstants.BILLING_TEMPLATE_BY_PILE_SN + vo.getPileSn())
.collect(Collectors.toList());
redisCache.deleteObject(collect);
// 下发计费模板, 电单车不支持
if (StringUtils.equals(billingTemplateVO.getDeviceType(), Constants.ONE)) {
// 下发指令
pileList.parallelStream().forEach(pileInfoVO -> publishPileBillingTemplate(pileInfoVO.getPileSn(), billingTemplateVO));
}
}
// 修改计费模板状态
pileBillingTemplateService.changeStationTemplate(dto.getStationId(), dto.getTemplateId(), billingTemplateVO.getDeviceType());
return true;

View File

@@ -132,7 +132,7 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord
chargingRecord.setTotalUsedElectricity(totalUsedElectricity);
chargingRecord.setReason(data.getStopReasonMsg());
// 创建或更新
personalChargingRecordMapper.insertOrUpdateSelective(chargingRecord);
this.insertOrUpdateSelective(chargingRecord);
}
/**
@@ -176,7 +176,7 @@ public class PersonalChargingRecordServiceImpl implements PersonalChargingRecord
// chargingRecord.setTotalUsedElectricity(totalUsedElectricity);
// chargingRecord.setReason(data.getStopReasonMsg());
// 创建或更新
personalChargingRecordMapper.insertOrUpdateSelective(chargingRecord);
this.insertOrUpdateSelective(chargingRecord);
}
@Override

View File

@@ -839,7 +839,16 @@ public class PileBillingTemplateServiceImpl implements PileBillingTemplateServic
*/
@Override
public BillingTemplateVO selectBillingTemplateDetailByPileSn(String pileSn) {
return pileBillingTemplateMapper.selectBillingTemplateByPileSn(pileSn);
String redisKey = CacheConstants.BILLING_TEMPLATE_BY_PILE_SN + pileSn;
Object cacheObject = redisCache.getCacheObject(redisKey);
if (cacheObject != null) {
return JSON.parseObject(cacheObject.toString(), BillingTemplateVO.class);
}
BillingTemplateVO billingTemplateVO = pileBillingTemplateMapper.selectBillingTemplateByPileSn(pileSn);
if (billingTemplateVO != null) {
redisCache.setCacheObject(redisKey, JSON.toJSONString(billingTemplateVO), CacheConstants.cache_expire_time_1d);
}
return billingTemplateVO;
}
@Override

View File

@@ -1,11 +1,19 @@
package com.jsowell.pile.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.jsowell.common.constant.Constants;
import com.jsowell.common.core.page.PageResponse;
import com.jsowell.common.util.DateUtils;
import com.jsowell.common.util.file.AliyunOssUploadUtils;
import com.jsowell.pile.domain.PileFirmwareInfo;
import com.jsowell.pile.domain.PileReservationInfo;
import com.jsowell.pile.dto.PileFirmwareInfoDTO;
import com.jsowell.pile.mapper.PileFirmwareInfoMapper;
import com.jsowell.pile.service.PileFirmwareInfoService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
@@ -98,4 +106,32 @@ public class PileFirmwareInfoServiceImpl implements PileFirmwareInfoService {
public int deletePileFirmwareInfoById(Long id) {
return pileFirmwareInfoMapper.deletePileFirmwareInfoById(id);
}
/**
* 通过使用范围查询桩固件信息列表
* @param dto
* @return
*/
@Override
public PageResponse selectPileFirmwareListByUseRange(PileFirmwareInfoDTO dto) {
int pageNo = dto.getPageNo() == null ? Constants.one : dto.getPageNo();
int pageSize = dto.getPageSize() == null ? 10 : dto.getPageSize();
PileFirmwareInfo pileFirmwareInfo = new PileFirmwareInfo();
pileFirmwareInfo.setUseRange(dto.getUseRange());
PageHelper.startPage(pageNo, pageSize);
List<PileFirmwareInfo> list = selectPileFirmwareInfoList(pileFirmwareInfo);
PageInfo<PileFirmwareInfo> pageInfo = new PageInfo<>(list);
PageResponse pageResponse = new PageResponse();
pageResponse.setPageNum(pageInfo.getPageNum());
pageResponse.setPageSize(pageInfo.getPageSize());
pageResponse.setPages(pageInfo.getPages());
pageResponse.setTotal(pageInfo.getTotal());
pageResponse.setList(pageInfo.getList());
return pageResponse;
}
}

View File

@@ -151,9 +151,9 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService {
public byte[] supplySend(byte[] msg, String pileSn, Enum<YKCFrameTypeCode> frameTypeCode, long timeout, TimeUnit unit) throws Exception {
// 通过桩编号获取channel
ChannelHandlerContext ctx = PileChannelEntity.getChannelByPileSn(pileSn);
String value = ((YKCFrameTypeCode) frameTypeCode).getValue(); // 帧类型名称
String frameTypeName = ((YKCFrameTypeCode) frameTypeCode).getValue(); // 帧类型名称
if (Objects.isNull(ctx)) {
log.error("push命令[{}]失败, 桩号:{}无法获取到长连接, 请检查充电桩连接状态!", value, pileSn);
log.error("push命令[{}]失败, 桩号:{}无法获取到长连接, 请检查充电桩连接状态!", frameTypeName, pileSn);
throw new NullPointerException("channel");
}
if(msg == null) {
@@ -206,12 +206,12 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService {
// 检查操作的状态
if (channelFutureListener.isSuccess()) {
log.info("【push结果===>成功】, pileSn:{}, remoteAddress:{}, channelId:{}, 帧类型:{}, 报文:{}",
pileSn, ctx.channel().remoteAddress(), ctx.channel().id(), value, wholeMsg);
pileSn, ctx.channel().remoteAddress(), ctx.channel().id(), frameTypeName, wholeMsg);
} else {
// 如果发生错误则访问描述原因的Throwable
Throwable cause = channelFutureListener.cause();
log.info("【push结果===>失败】, pileSn:{}, remoteAddress:{}, channelId:{}, 帧类型:{}, 报文:{}",
pileSn, ctx.channel().remoteAddress(), ctx.channel().id(), value, wholeMsg);
pileSn, ctx.channel().remoteAddress(), ctx.channel().id(), frameTypeName, wholeMsg);
log.error("push发送命令失败, pileSn:{}", pileSn, cause);
}
});
@@ -221,9 +221,9 @@ public class YKCPushCommandServiceImpl implements YKCPushCommandService {
if(rpcResponse == null) {
if(syncPromise.isTimeout()) {
// throw new TimeoutException("等待响应结果超时");
log.error("发送[{}]指令后, 等待响应结果超时", value);
log.error("pileSn:{}, 发送[{}]指令后, 等待响应结果超时", pileSn, frameTypeName);
} else{
log.error("发送[{}]指令后, 发生其他异常", value);
log.error("pileSn:{}, 发送[{}]指令后, 发生其他异常", pileSn, frameTypeName);
}
}
// 移除容器

View File

@@ -41,4 +41,9 @@ public class PersonPileConnectorSumInfoVO {
* 累计充电时长
*/
private String sumChargingTime;
/**
* 来源(4G/BT) sourceType
*/
private String sourceType;
}