From fa7ac16021db8d9a6a5bc214f50600420876325e Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期一, 08 九月 2025 10:57:41 +0800
Subject: [PATCH] jtt808初始化
---
server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java | 159 ++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 134 insertions(+), 25 deletions(-)
diff --git a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
index ecf63d4..273a168 100644
--- a/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
+++ b/server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
@@ -3,6 +3,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.TypeReference;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.doumee.biz.system.SystemDictDataBiz;
@@ -26,10 +27,12 @@
import com.doumee.dao.business.web.request.LocaltionDTO;
import com.doumee.dao.business.web.request.OpenElecBikeRequest;
import com.doumee.dao.business.web.response.MemberRidesDetailResponse;
+import com.doumee.dao.business.web.response.UserResponse;
import com.doumee.jtt808.web.endpoint.MessageManager;
import com.doumee.service.business.GoodsorderService;
import com.doumee.service.business.PricingRuleService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.slf4j.Slf4j;
import me.chanjar.weixin.common.error.WxErrorException;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
@@ -55,6 +58,7 @@
import java.util.concurrent.ConcurrentMap;
@Service
+@Slf4j
public class Jtt808Service {
@Value("${tencent.map.remoteHost}")
private String mapHost;
@@ -80,7 +84,6 @@
@Autowired
private MemberRidesJoinMapper memberRidesJoinMapper;
-
@Autowired
private PricingParamMapper pricingParamMapper;
@@ -102,6 +105,10 @@
return data;
}
+ /**
+ * 鎵嬪姩杩樿溅
+ * @param param
+ */
@Transactional(rollbackFor = {BusinessException.class})
public void backElecBike(BackElecBikeRequest param) {
Member member = memberMapper.selectById(param.getMemberId());
@@ -113,6 +120,22 @@
gparam.setStatus(Constants.goodsorderStatus.pay);
gparam.setType(Constants.ZERO);
Goodsorder goodsorder = goodsorderService.findOne(gparam);
+ this.backBike(goodsorder);
+ }
+
+ /**
+ * 鑷姩杩樿溅
+ * @param id
+ */
+ @Transactional
+ public void forceBack(String id){
+ Goodsorder goodsorder = goodsorderService.findById(id);
+ this.backBike(goodsorder);
+ }
+
+
+ @Transactional(rollbackFor = {BusinessException.class})
+ public void backBike(Goodsorder goodsorder){
if(Objects.isNull(goodsorder)){
throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"鏃犻獞琛岃鍗曡褰�");
}
@@ -127,15 +150,15 @@
if(Constants.equalsInteger(rides.getStatus(),Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey())
&&Constants.equalsInteger(rides.getType(),Constants.ONE)){
//濡傛灉鏄數杞﹀苟涓旀槸楠戣涓� 杩涜鍏抽攣澶勭悊
-// Bikes bike = getElecBikeByCode(rides.getBikeCode());
-// //鏌ヨ鍋滆溅绔欑偣淇℃伅
-// if(bike.getSiteId() ==null){
-// throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
-// }
-// lockBikes(bike.getDeviceSn(),Constants.ZERO);//鍙戣捣鍏抽攣鎸囦护璇锋眰
+ Bikes bike = getElecBikeByCode(rides.getBikeCode());
+ //鏌ヨ鍋滆溅绔欑偣淇℃伅
+ if(bike.getSiteId() ==null){
+ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍓嶅線鍋滆溅鐐瑰仠杞︼紒");
+ }
+ lockBikes(bike.getDeviceSn(),Constants.ONE);//鍙戣捣鍏抽攣鎸囦护璇锋眰
backIds.add(rides.getId());
rides.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey());//宸茶繕杞�
-// rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
+ rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
rides.setBackDate(new Date());
Integer freeRentTime = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
@@ -152,6 +175,10 @@
goodsorder.setEditDate(date);
goodsorder.setEditor(null);
goodsorderService.dealCloseGoodsorderBiz( goodsorder,Constants.REFUND_TYPE.NORMAL.getKey(),memberRides);
+ //鏇存柊鐢靛姩杞﹁溅杈嗙姸鎬�
+ bikesMapper.update(null,new UpdateWrapper<Bikes>().lambda().set(Bikes::getStatus,Constants.ZERO).eq(Bikes::getType,Constants.ONE)
+ .apply(" code in ( select m.bike_code from member_rides m where m.ordre_id = '"+goodsorder.getId()+"' ) ")
+ );
}
private Bikes getElecBikeByCode(String bikeCode) {
@@ -198,6 +225,9 @@
}
}
+
+
+
/**
* 鏌ヨ鍋滆溅绔欑偣淇℃伅
* @return
@@ -218,7 +248,7 @@
if(array == null || array.size() ==0){
continue;
}
- if(PositionUtil.isInPolygon(lat,lng,array)){
+ if(PositionUtil.isInPolygon(lng,lat,array)){
//濡傛灉鍦ㄥ仠杞︾偣鑼冨洿鍐咃紱
site = sites;
break;
@@ -243,6 +273,7 @@
Goodsorder gparam = new Goodsorder();
gparam.setMemberId(param.getMemberId());
gparam.setStatus(Constants.goodsorderStatus.pay);
+ gparam.setType(Constants.ZERO);
Goodsorder goodsorder = goodsorderService.findOne(gparam);
if(Objects.isNull(goodsorder)){
throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓鍗曡褰�");
@@ -256,9 +287,10 @@
if(memberRides ==null || memberRides.getBikeCode() == null){
throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓褰�");
}
-// Bikes bike = getElecBikeByCode(memberRides.getBikeCode());
-// //鏌ヨ鍋滆溅浣嶇疆鏄惁绗﹀悎鍋滆溅浣嶇疆瑙勮寖
-// checkPausePostionBiz(bike);
+ Bikes bike = getElecBikeByCode(memberRides.getBikeCode());
+ //鏌ヨ鍋滆溅浣嶇疆鏄惁绗﹀悎鍋滆溅浣嶇疆瑙勮寖
+ checkPausePostionBiz(bike);
+ lockBikes(bike.getDeviceSn(),Constants.ONE);//鍙戣捣鍏抽攣鎸囦护璇锋眰
memberRides.setPauseDate(new Date());
memberRides.setEditDate(memberRides.getBackDate());
memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey());
@@ -272,7 +304,7 @@
ruleType =Integer.parseInt( systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PAUSE_BIKE_TYPE).getCode());
}catch (Exception e){
}
- if(ruleType == 0){
+ if(ruleType == 1){
//濡傛灉浠呴檺浜庡洯鍖轰复鏃跺仠杞�
List<LocaltionDTO> array = new ArrayList<>();
try {
@@ -283,7 +315,7 @@
if(array == null || array.size() ==0){
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝鍥尯杩愯惀鍖哄煙閰嶇疆鏈夎锛岃鑱旂郴鍥尯绠$悊鍛樺鐞嗭紒");
}
- if( !PositionUtil.isInPolygon(bike.getLatitude().doubleValue(),bike.getLongitude().doubleValue(),array)){
+ if( !PositionUtil.isInPolygon(bike.getLongitude().doubleValue(),bike.getLatitude().doubleValue(),array)){
//濡傛灉鍦ㄥ仠杞︾偣鑼冨洿鍐咃紱
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "瀵逛笉璧凤紝璇锋寜瑕佹眰鍦ㄥ洯鍖鸿繍钀ュ尯鍩熻寖鍥村唴鍋滆溅锛�");
}
@@ -310,6 +342,7 @@
if(m.getLongitude()!=0){
bike.setLongitude(new BigDecimal(m.getLongitude()).divide(new BigDecimal(1000000),8,BigDecimal.ROUND_HALF_UP));
}
+ updateMapLocation(bike);
bike.setHeartDate(DateUtil.getDateFromLocalDateTime(m.getDeviceTime()));
if(m.getAttributes()!=null ){
Battery battery= (Battery) m.getAttributes().get(AttributeKey.Battery);
@@ -355,6 +388,15 @@
}
}
+ private void updateMapLocation(Bikes bike) {
+ if(bike.getLatitude() == null || bike.getLongitude() == null){
+ return;
+ }
+ PositionUtil.AMap aMap =PositionUtil.transform(bike.getLongitude().doubleValue() ,bike.getLatitude().doubleValue());
+ bike.setLatitude(new BigDecimal(aMap.getLatitude()));
+ bike.setLongitude(new BigDecimal(aMap.getLongitude()));
+ }
+
public ConcurrentMap<String,Integer> cacheOpenLock = new ConcurrentReferenceHashMap<>();
@@ -369,11 +411,18 @@
}
Bikes bike = bikesMapper.selectOne(new QueryWrapper<Bikes>().lambda().eq(Bikes::getCode,openElecBikeRequest.getCode()).eq(Bikes::getIsdeleted,Constants.ZERO)
.eq(Bikes::getType,Constants.ONE).last(" limit 1 "));
+
if(bike == null && StringUtils.isBlank(bike.getParamId())){
//濡傛灉杞﹁締绫诲瀷鏄┖
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), " 璇ヨ溅鍨嬫殏鏃朵笉鑳藉�熻溅鎿嶄綔鍝︼紝璇锋洿鎹㈠叾浠栬溅鍨嬮噸璇曪紒");
}
- cacheOpenLock.put(bike.getCode(), 1);
+ if(!Constants.equalsInteger(bike.getBikeStatus(),Constants.ONE)){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"璇ヨ溅杈嗙姸鎬佸紓甯革紝涓嶆敮鎸佸嚭鍊燂紝璇峰皾璇曟洿鎹㈠叾浠栬溅杈嗭紒");
+ }
+ if(!Constants.equalsInteger(bike.getStatus(),Constants.ZERO)){
+ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"瀵逛笉璧凤紝璇ヨ溅杈嗗凡琚攣瀹氬�熺敤锛岃灏濊瘯鏇存崲鍏朵粬杞﹁締锛�");
+ }
+ cacheOpenLock.put(openElecBikeRequest.getCode(), 1);
try {
//鍒ゆ柇褰撳墠鏄惁宸叉敮浠樻娂閲�
Goodsorder goodsorder = goodsorderService.findOneByWrapper(new QueryWrapper<Goodsorder>()
@@ -404,7 +453,7 @@
//鏍规嵁杞﹀瀷鏌ヨ璁′环鏂规
isValidePricingType(bike,memberRides) ;
MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse();
-// this.lockBikes(bike.getDeviceSn(),1);
+ this.lockBikes(bike.getDeviceSn(),0);
//瀛樺偍楠戣璁板綍
memberRides.setId(Constants.getUUID());
memberRides.setIsdeleted(Constants.ZERO);
@@ -420,10 +469,12 @@
memberRidesJoinMapper.insert(memberRides);
BeanUtils.copyProperties(memberRides, memberRidesDetailResponse);
return memberRidesDetailResponse;
- }catch (Exception e){
- throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "寮�閿佸け璐ワ紝璇疯仈绯荤鐞嗗憳");
+ }catch (BusinessException biz){
+ throw biz;
+ }catch (Exception biz){
+ throw new BusinessException(ResponseStatus.SERVER_ERROR);
}finally {
- cacheOpenLock.remove(bike.getCode());
+ cacheOpenLock.remove(openElecBikeRequest.getCode());
}
}
@@ -437,6 +488,7 @@
Goodsorder gparam = new Goodsorder();
gparam.setMemberId(param.getMemberId());
gparam.setStatus(Constants.goodsorderStatus.pay);
+ gparam.setType(Constants.ZERO);
Goodsorder goodsorder = goodsorderService.findOne(gparam);
if(Objects.isNull(goodsorder)){
throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"瀵逛笉璧凤紝鏈煡璇㈠埌鎮ㄥ綋鍓嶆湁楠戣涓鍗曡褰�");
@@ -459,7 +511,7 @@
//濡傛灉杞﹁締绫诲瀷鏄┖
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "杞﹀瀷淇℃伅寮傚父锛岃鑱旂郴绠$悊鍛�");
}
- this.lockBikes(bike.getDeviceSn(),1);
+ this.lockBikes(bike.getDeviceSn(),0);
//鏇存柊楠戣鐘舵�佷负楠戣涓�
memberRides.setEditDate(memberRides.getBackDate());
memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey());
@@ -536,9 +588,10 @@
.eq(MemberRides::getIsdeleted,Constants.ZERO)
.eq(MemberRides::getType,Constants.ONE)
.eq(MemberRides::getStatus,Constants.MEMBER_RIDES_STATUS.RIDES_PAUSING.getKey())
- .apply(" NOW() >= t.create_date + INTERVAL '2 hours' ")
+ .apply(" NOW() >= (t.create_date + INTERVAL '"+systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PAUSE_AUTO_CLOSE_TIME).getCode()+" min') ")
);
+ ;
for (MemberRides timeOutRides:memberRidesList) {
Goodsorder goodsorder = goodsorderService.findById(timeOutRides.getOrdreId());
//鏌ヨ楠戣璁板綍
@@ -553,10 +606,14 @@
.eq(Bikes::getIsdeleted,Constants.ZERO)
.eq(Bikes::getCode,rides.getBikeCode())
);
- lockBikes(bike.getDeviceSn(),Constants.ZERO);//鍙戣捣鍏抽攣鎸囦护璇锋眰
+ lockBikes(bike.getDeviceSn(),Constants.ONE);//鍙戣捣鍏抽攣鎸囦护璇锋眰
rides.setStatus(Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey());//宸茶繕杞�
rides.setBackSiteId(bike.getSiteId());//杩樿溅绔欑偣
rides.setBackDate(new Date());
+ Integer freeRentTime = Integer.valueOf(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME, Constants.FREE_RENT_TIME).getCode());
+ Integer rideTime = DateUtil.betweenMin(rides.getRentDate(), rides.getBackDate());
+ //璁$畻楠戣璁¤垂鏃堕暱
+ rides.setDuration( rideTime > freeRentTime ? rideTime : 0 );
rides.setEditDate(rides.getBackDate());
memberRidesJoinMapper.updateById(rides);//鏇存柊楠戣鐘舵�佷负宸茶繕杞�
}
@@ -567,16 +624,68 @@
goodsorder.setEditDate(date);
goodsorder.setEditor(null);
goodsorderService.dealCloseGoodsorderBiz( goodsorder,Constants.REFUND_TYPE.NORMAL.getKey(),memberRides);
+
+ //鏇存柊鐢靛姩杞﹁溅杈嗙姸鎬�
+ bikesMapper.update(null,new UpdateWrapper<Bikes>().lambda().set(Bikes::getStatus,Constants.ZERO).eq(Bikes::getType,Constants.ONE)
+ .apply(" code in ( select m.bike_code from member_rides m where m.ordre_id = '"+goodsorder.getId()+"' ) ")
+ );
+
//鍙戦�佸皬绋嬪簭閫氱煡
Member member = memberMapper.selectById(goodsorder.getMemberId());
if(Objects.nonNull(member)&&StringUtils.isNotBlank(member.getOpenid())){
- sendWxMessage.bookingsCancel(member.getOpenid(),goodsorder.getId(), WxMiniConfig.wxMaService.getAccessToken(),timeOutRides.getBikeCode(),goodsorder.getPayDate(),goodsorder.getEndDate());
+ sendWxMessage.bookingsCancel(member.getOpenid(),goodsorder.getId(),
+ WxMiniConfig.wxMaService.getAccessToken(),
+ timeOutRides.getBikeCode(),goodsorder.getPayDate(),goodsorder.getEditDate());
}
-
-
}
}
+ public String updateLockStatusBatch(UserResponse user, List<String> idList, Integer lockStatus) {
+ if(idList ==null && idList.size()==0){
+ throw new BusinessException(ResponseStatus.BAD_REQUEST);
+ }
+ String message = "";
+ int sNum =0,eNum=0,ingNum=0;
+ lockStatus = lockStatus==0?0:1;
+ List<Bikes> bikesList = bikesMapper.selectList(new LambdaQueryWrapper<Bikes>()
+ .eq(Bikes::getType,Constants.ONE)
+ .in(Bikes::getIsdeleted,Constants.ZERO)
+ .in(Bikes::getId,idList)
+ );
+ for(Bikes bike: bikesList){
+ if(Constants.equalsInteger(bike.getStatus(),Constants.ONE)){
+ //鍑哄�熶腑
+ ingNum++;
+ continue;
+ }
+ boolean r = true;
+ try {
+ this.lockBikes(bike.getDeviceSn(),lockStatus==0?1:0);
+ }catch (Exception e){
+ log.error(e.getMessage());
+ r =false;
+ eNum++;
+ }
+ if(r){
+ bikesMapper.update(null,new UpdateWrapper<Bikes>().lambda()
+ .set(Bikes::getEditDate,new Date())
+ .set(Bikes::getEditor,user.getId())
+ .set(Bikes::getLockStatus,lockStatus)
+ .set(Bikes::getIsdeleted,Constants.ZERO)
+ .eq(Bikes::getType,Constants.ONE )
+ .eq(Bikes::getId,bike.getId()));
+ sNum++;
+ }
+ }
+ message="鎴愬姛鎿嶄綔["+sNum+"]杈嗙數杞�";
+ if(ingNum>0){
+ message = message+"锛孾"+ingNum+"]杈嗙數杞︽鍑哄�熶腑";
+ }
+ if(eNum>0){
+ message = message+"锛孾"+eNum+"]杈嗙數杞﹁繙绋嬫搷浣滃け璐�";
+ }
+ return message;
+ }
--
Gitblit v1.9.3