main
黄海 8 months ago
parent cdbb9c28c6
commit 30ce8c0422

@ -62,6 +62,11 @@ public class SysConnectorServiceImpl implements SysConnectorService {
@Lazy
StationOperatorLinkService stationOperatorLinkService;
/**
* ID
* @param connectorId
* @return
*/
@Override
public SysConnector getConnectorById(String connectorId) {
if(TextUtils.isBlank(connectorId)){
@ -70,24 +75,30 @@ public class SysConnectorServiceImpl implements SysConnectorService {
else if(connectorId.length() <= 9){
return null;
}
String key = HlhtRedisKey.SYS_CONNECTOR + connectorId;
String key = HlhtRedisKey.SYS_CONNECTOR + connectorId;//redis中的键值
SysConnector sysConnector = RedisUtils.getCacheObject(key);
if(sysConnector != null){
return sysConnector;
return sysConnector;//如果redis中存在直接返回
}
//到这里就是不在redis上存在了需要查询数据库
//表sys_connector
LambdaQueryWrapper<SysConnector> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(SysConnector::getConnectorId, connectorId);
queryWrapper.last("limit 1");
List<SysConnector> list = iService.list(queryWrapper);
if(list != null && list.size() > 0){
sysConnector = list.get(0);
RedisUtils.setCacheObject(key, sysConnector, Duration.ofMinutes(5));
RedisUtils.setCacheObject(key, sysConnector, Duration.ofMinutes(5));//5分钟的TTL值
return sysConnector;
}
return null;
}
/**
* ,
* @param connectorId
* @return
*/
@Override
public Boolean isConnectorIdValid(String connectorId) {
if(TextUtils.isBlank(connectorId)){

@ -31,27 +31,39 @@ public class SysOperatorServiceImpl implements SysOperatorService {
@Lazy
SysOperatorService selfService;
/**
* ID
* @param operatorId
* @return
*/
@Override
public SysOperator getOperatorById(String operatorId) {
//operatorId:MA01D1QR8
if(TextUtils.isBlank(operatorId)){
return null;
}
else if(operatorId.length() != 9){
return null;
}
//键值 = keys:v1:hlht:sys:operator:MA01D1QR8
String key = HlhtRedisKey.SYS_OPERATOR + operatorId;
//根据组装的key到Redis上去获取一个对象然后反序列化成对象返回
SysOperator sysOperator = RedisUtils.getCacheObject(key);
if(sysOperator != null){
return sysOperator;
}
LambdaQueryWrapper<SysOperator> queryWrapper = Wrappers.lambdaQuery();
//到表sys_operator中去查找 operator_id = MA01D1QR8
// select * from sys_operator where operator_id = 'MA01D1QR8' --北京奥陌科技有限公司
queryWrapper.eq(SysOperator::getOperatorId, operatorId);
queryWrapper.last("limit 1");
List<SysOperator> list = iService.list(queryWrapper);
if(list != null && list.size() > 0){
sysOperator = list.get(0);
//记录回Redis中去
RedisUtils.setCacheObject(HlhtRedisKey.SYS_OPERATOR + sysOperator.getOperatorId(), sysOperator);
return sysOperator;
return sysOperator;//将查询到的对象返回
//基础设施运营商信息表
}
return null;
}

@ -20,6 +20,7 @@ import java.util.Map;
@Configuration
public class SimCenter {
//某个充电桩是不是在线的Map,如果存在就是存线不存在就是不在线那么一定有一个定时检查的任务在处理这个map!
private static Map<String, SimPileClient> pileMap = new LinkedHashMap<>();
@DubboReference
@ -31,18 +32,15 @@ public class SimCenter {
@DubboReference
RemoteTradeService remoteTradeService;
public Boolean isOnline(String connectorId)
{
if(pileMap.containsKey(connectorId)){
public Boolean isOnline(String connectorId) {
if (pileMap.containsKey(connectorId)) {//桩是不是在线
return true;
}
else{
} else {
return false;
}
}
public void start(String connectorId) throws BaseException
{
public void start(String connectorId) throws BaseException {
log.info("启动模态充电桩:" + connectorId);
if (pileMap.containsKey(connectorId)) {
throw new BaseException("模态桩已启动");
@ -63,17 +61,14 @@ public class SimCenter {
pileClient.start();
log.info("模态桩服务------启动成功");
}).start();
}
catch (BaseException ex){
} catch (BaseException ex) {
throw ex;
}
catch (Exception ex){
} catch (Exception ex) {
throw new BaseException("未知错误");
}
}
public void stop(String connectorId) throws BaseException
{
public void stop(String connectorId) throws BaseException {
if (!pileMap.containsKey(connectorId)) {
throw new BaseException("模态桩未启动");
}
@ -85,17 +80,14 @@ public class SimCenter {
}
pileClient.stop();
}
catch (BaseException ex){
} catch (BaseException ex) {
throw ex;
}
finally {
} finally {
pileMap.remove(connectorId);
}
}
public void link(String connectorId) throws BaseException
{
public void link(String connectorId) throws BaseException {
if (!pileMap.containsKey(connectorId)) {
throw new BaseException("充电桩未启动");
}
@ -106,8 +98,7 @@ public class SimCenter {
pileClient.link();
}
public void unlink(String connectorId) throws BaseException
{
public void unlink(String connectorId) throws BaseException {
if (!pileMap.containsKey(connectorId)) {
throw new BaseException("充电桩未启动");
}
@ -118,8 +109,7 @@ public class SimCenter {
pileClient.unlink();
}
public void startCharge(SysChargeOrder sysChargeOrder) throws BaseException
{
public void startCharge(SysChargeOrder sysChargeOrder) throws BaseException {
if (sysChargeOrder == null || TextUtils.isBlank(sysChargeOrder.getConnectorId())) {
throw new BaseException("无效的枪信息");
}
@ -130,8 +120,7 @@ public class SimCenter {
pileClient.startCharge(sysChargeOrder);
}
public void stopCharge(SysChargeOrder sysChargeOrder) throws BaseException
{
public void stopCharge(SysChargeOrder sysChargeOrder) throws BaseException {
if (sysChargeOrder == null || TextUtils.isBlank(sysChargeOrder.getConnectorId())) {
throw new BaseException("无效的枪信息");
}

@ -45,28 +45,41 @@ public class SimTestController {
@Operation(summary = "启动一个测试订单", method = "GET")
@GetMapping("/startChargeTest")
public R startChargeTest(String connectorId) {
//connector_id:充电设备接口编码同一运营商内唯一9位组织机构编码+14桩编码+3枪号
//select LENGTH('2411010810000101') 这个返回是16位也不是26位啊我也是服了~
try {
//获取运营商实体 Bean ,基础设施运营商信息表 :北京奥陌科技有限公司
SysOperator sysOperator = remoteSysOperatorService.getOperatorById("MA01D1QR8");
//QueryStartChargeData JAVA BEAN: 启动充电请求报文
QueryStartChargeData queryStartChargeData = new QueryStartChargeData();
//"充电订单号格式“运营商ID+唯一编号”27字符
queryStartChargeData.setStartChargeSeq(sysOperator.getOperatorId() + System.currentTimeMillis());
//充电设备接口编码
queryStartChargeData.setConnectorID(connectorId);
//账户余额
queryStartChargeData.setBalance(new BigDecimal("9999999"));
//用户手机号,这里是测试,写死的手机号
queryStartChargeData.setPhoneNum("13910000000");
//车牌号
queryStartChargeData.setPlateNum("京kz3433");
//二维码,这里没有传入二维码
queryStartChargeData.setQrCode("");
//sysOperator:运营商,看来支持多运营商
//queryStartChargeData组装好的实体Bean
//startCharging:开始充电
int result = remoteStartChargingService.startCharging(sysOperator, queryStartChargeData);
//如果没有错误,那么是启动成功
if (0 == result) {
return R.ok("启动订单成功");
}
else{
} else {
//否则返回错误码
return R.ok("启动订单失败" + result);
}
}
catch (Exception ex){
} catch (Exception ex) {
log.error("启动一个测试订单失败", ex);
return R.fail("启动一个测试订单失败");
}
}
@Operation(summary = "停止一个测试订单", method = "GET")
@ -84,12 +97,10 @@ public class SimTestController {
int result = remoteStopChargingService.stopCharging(sysOperator, queryStopChargeData);
if (0 == result) {
return R.ok("停止订单成功");
}
else{
} else {
return R.fail("停止订单失败:" + result);
}
}
catch (Exception ex){
} catch (Exception ex) {
log.error("停止订单失败", ex);
return R.fail("停止订单失败");
}

@ -50,48 +50,73 @@ public class RemoteStartChargingServiceImpl implements RemoteStartChargingServic
@Lazy
SimCenter simCenter;
/**
*
* @param sysOperator
* @param queryStartChargeData
* @return
* @throws BaseException
*/
@Override
public int startCharging(SysOperator sysOperator, QueryStartChargeData queryStartChargeData) throws BaseException {
//如果模拟器中显示此设备不在线返回错误码2
if(!simCenter.isOnline(queryStartChargeData.getConnectorID())){
return 2;
}
//获取充电设备信息如果Redis缓存中有了就直接用没有的话就查询数据库并且记录到缓存中再使用
SysConnector sysConnector = remoteSysConnectorService.getConnectorById(queryStartChargeData.getConnectorID());
if(sysConnector == null || sysConnector.getState() != 0 || sysConnector.getStatus() != 2){
//getStatus状态 0离网 1空闲 2占用未充电3占用充电4占用预约锁定255故障
//state充电桩状态 0正常 1故障
return 3;
return 3;//返回错误码3:没找着枪枪故障或者枪离线或者枪被占用等反正就是枪不好用都返回3
}
//表sys_charge_order:充电订单信息表
SysChargeOrder sysChargeOrder = new SysChargeOrder();
//充电订单号
String lockKey = HlhtRedisKey.LOCK_KEY_CHARGE_ORDER_INFO + queryStartChargeData.getStartChargeSeq();
LockInfo lockInfo = null;
try{
//分布式锁框架Lock4j
//https://segmentfault.com/a/1190000044440523
//对Redis的key键值进行锁定
lockInfo = lockTemplate.lock(lockKey, 3000L, 5000L, RedissonLockExecutor.class);
sysChargeOrder.setStartChargeSeq(queryStartChargeData.getStartChargeSeq());
sysChargeOrder.setOperatorId(sysOperator.getOperatorId());
sysChargeOrder.setTradeNo(queryStartChargeData.getStartChargeSeq());
sysChargeOrder.setConnectorId(sysConnector.getConnectorId());
sysChargeOrder.setStartChargeSeq(queryStartChargeData.getStartChargeSeq());//序列号
sysChargeOrder.setOperatorId(sysOperator.getOperatorId());//运营商id
sysChargeOrder.setTradeNo(queryStartChargeData.getStartChargeSeq());//交易号,与序列号是一个东西
sysChargeOrder.setConnectorId(sysConnector.getConnectorId());//设备ID
//充电订单状态1启动中 2充电中 3停止中 4已结束 5未知
sysChargeOrder.setStartChargeSeqStat((short) 2);
//1空闲 2占用未充电 3占用充电中 4占用预约锁定 255故障
sysChargeOrder.setConnectorStatus(3);
//开始充电时间
sysChargeOrder.setStartTime(new Date());
//订单结束后是否已和用户平台同步 0否 1是
sysChargeOrder.setSyncFlag((short) 0);
//是否已上报至市政平台
sysChargeOrder.setReportGov((short) 0);
//手机号
sysChargeOrder.setPhoneNum(queryStartChargeData.getPhoneNum());
//车牌号
sysChargeOrder.setPlateNum(queryStartChargeData.getPlateNum());
//获取收费的标准,应该是支持分时电价
List<PolicyInfoData> priceList = priceService.getConnectorPriceList(sysConnector.getConnectorId());
if(priceList != null && priceList.size() > 0){
sysChargeOrder.setPriceInfo(JsonUtils.toJsonString(priceList));
sysChargeOrder.setPriceInfo(JsonUtils.toJsonString(priceList));//直接JSON化后将JSON字符串写入数据库
}
log.info(JSON.toJSONString(sysChargeOrder));
//调用dubbo 远程服务保存订单信息
remoteSysChargeOrderService.save(sysChargeOrder);
log.info("启动订单创建成功:" + JSON.toJSONString(sysChargeOrder));
}
finally {
if(lockInfo != null){
//释放锁
lockTemplate.releaseLock(lockInfo);
}
}
//模拟器启动充电
simCenter.startCharge(sysChargeOrder);
return 0;
}

@ -105,12 +105,12 @@ public class SimPileClient implements SimPileIClient {
public void startCharge(SysChargeOrder sysChargeOrder) throws BaseException {
log.info("充电桩" + sysConnector.getConnectorId() + "状态码:" + sysConnector.getStatus());
chargeOrderItemMap = new HashMap<>();
//0离网 1空闲 2占用未充电3占用充电4占用预约锁定255故障
if (sysConnector.getStatus() == 2) {
//可以充电
log.info("充电桩" + sysConnector.getConnectorId() + "状态码设置3");
sysConnector.setStatus((short) 3);
}
else{
} else {
startChargingReturnService.startFail(sysChargeOrder);
throw new BaseException("启动失败-状态" + sysConnector.getStatus());
}
@ -123,7 +123,7 @@ public class SimPileClient implements SimPileIClient {
log.info("" + dbInfo.getStartChargeSeq());
this.sysChargeOrder = new SysChargeOrder();
this.sysChargeOrder.setStartChargeSeq(dbInfo.getStartChargeSeq());
this.sysChargeOrder.setStartChargeSeq(dbInfo.getStartChargeSeq());//序列号
this.sysChargeOrder.setStartChargeSeqStat((short) 2);
this.sysChargeOrder.setTradeNo(dbInfo.getStartChargeSeq());
this.sysChargeOrder.setConnectorId(sysConnector.getConnectorId());
@ -156,8 +156,7 @@ public class SimPileClient implements SimPileIClient {
sysConnector.setStatus((short) 2);
sendRealTimeData(true);
stopChargingReturnService.stopSuccess(sysChargeOrder);
}
else{
} else {
stopChargingReturnService.stopFail(sysChargeOrder);
throw new BaseException("停止失败");
}
@ -172,8 +171,7 @@ public class SimPileClient implements SimPileIClient {
public void sendRealTimeData(Boolean sendForce) throws BaseException {
try {
long minDurant = (sysChargeOrder == null) ? 60000 : 15000;
if((System.currentTimeMillis() - lastRealtime < minDurant) && !sendForce)
{
if ((System.currentTimeMillis() - lastRealtime < minDurant) && !sendForce) {
return;
}
lastRealtime = System.currentTimeMillis();
@ -183,28 +181,26 @@ public class SimPileClient implements SimPileIClient {
short isPlugn = 0;
if (sysConnector.getStatus() == 0) {
status = 2;
}
else if(sysConnector.getStatus() == 1){
} else if (sysConnector.getStatus() == 1) {
status = 2;
}
else if(sysConnector.getStatus() == 2){
} else if (sysConnector.getStatus() == 2) {
status = 2;
isHome = 0;
isPlugn = 1;
}
else if(sysConnector.getStatus() == 3){
} else if (sysConnector.getStatus() == 3) {
status = 3;
isHome = 0;
isPlugn = 1;
}
else if(sysConnector.getStatus() == 4){
} else if (sysConnector.getStatus() == 4) {
status = 2;
}
else{
} else {
status = 255;
}
PlatConnectorRealtimeData platConnectorRealtimeData = null;
/*
0 1 234255
*/
if (sysConnector.getStatus() == 3) {
culChargeState();
if (sysConnector.getStatus() != 3) {
@ -230,8 +226,7 @@ public class SimPileClient implements SimPileIClient {
platConnectorRealtimeData.setLoseKwh(sysChargeOrder.getTotalPower());
platConnectorRealtimeData.setChargeMoney(sysChargeOrder.getTotalMoney());
platConnectorRealtimeData.setCreateTime(new Date());
}
else {
} else {
//发送一般实时状态
platConnectorRealtimeData = new PlatConnectorRealtimeData();
platConnectorRealtimeData.setTradeNo("");
@ -346,8 +341,7 @@ public class SimPileClient implements SimPileIClient {
sendRealTimeData(false);
if (sysChargeOrder != null) {
Thread.sleep(5000);
}
else {
} else {
Thread.sleep(10000);
}
if (sysConnector != null && sysConnector.getStatus() == 0) {
@ -364,9 +358,8 @@ public class SimPileClient implements SimPileIClient {
}
private void culChargeState()
{
if(sysChargeOrder == null || sysConnector.getStatus() != 3){
private void culChargeState() {
if (sysChargeOrder == null || sysConnector.getStatus() != 3) {//3:充电中
//异常情况 中止充电
stopCharge(0, sysChargeOrder);
return;
@ -402,8 +395,7 @@ public class SimPileClient implements SimPileIClient {
item.setPower(item.getPower().add(currentPower));
item.setElecMoney(item.getElecMoney().add(priceE.multiply(currentPower)).setScale(4, RoundingMode.UP));
item.setServiceMoney(item.getServiceMoney().add(priceE.multiply(currentPower)));
}
else{
} else {
item = new SysChargeOrderItem();
Calendar startCal = Calendar.getInstance();
startCal.setTime(date);

Loading…
Cancel
Save