package com.doumee.jtt808.web.service;
|
|
import com.alibaba.fastjson.JSONArray;
|
import com.alibaba.fastjson.JSONObject;
|
import com.alibaba.fastjson.TypeReference;
|
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
|
import com.doumee.biz.system.SystemDictDataBiz;
|
import com.doumee.core.constants.Constants;
|
import com.doumee.core.constants.ResponseStatus;
|
import com.doumee.core.exception.BusinessException;
|
import com.doumee.core.utils.PositionUtil;
|
import com.doumee.core.utils.StringTools;
|
import com.doumee.core.wx.WxMiniUtilService;
|
import com.doumee.dao.business.*;
|
import com.doumee.dao.business.join.GoodsorderJoinMapper;
|
import com.doumee.dao.business.join.MemberRidesJoinMapper;
|
import com.doumee.dao.business.join.RefundJoinMapper;
|
import com.doumee.dao.business.model.*;
|
import com.doumee.dao.business.web.request.BackElecBikeRequest;
|
import com.doumee.dao.business.web.request.LocaltionDTO;
|
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 org.apache.commons.lang3.StringUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.stereotype.Service;
|
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.web.bind.annotation.RequestBody;
|
import org.yzh.commons.model.APIResult;
|
import org.yzh.protocol.t808.T0201_0500;
|
import org.yzh.protocol.t808.T8500;
|
import reactor.core.publisher.Mono;
|
|
import java.util.Date;
|
import java.util.List;
|
import java.util.Objects;
|
|
@Service
|
public class Jtt808Service {
|
@Autowired
|
private MessageManager messageManager;
|
@Autowired
|
private GoodsorderService goodsorderService;
|
|
@Autowired
|
private DiscountMemberMapper discountMemberMapper;
|
|
@Autowired
|
private DiscountLogMapper discountLogMapper;
|
|
@Autowired
|
GoodsorderJoinMapper goodsorderJoinMapper;
|
|
@Autowired
|
private SystemDictDataBiz systemDictDataBiz;
|
|
@Autowired
|
private MemberMapper memberMapper;
|
@Autowired
|
private BaseParamMapper baseParamMapper;
|
@Autowired
|
private RefundMapper refundMapper;
|
|
@Autowired
|
private RefundJoinMapper refundJoinMapper;
|
@Autowired
|
private SitesMapper sitesMapper;
|
|
@Autowired
|
private MemberRidesJoinMapper memberRidesJoinMapper;
|
|
@Autowired
|
private AdMapper adMapper;
|
|
@Autowired
|
private TransactionsMapper transactionsMapper;
|
|
@Autowired
|
private WxMiniUtilService wxMiniUtilService;
|
|
@Autowired
|
PricingRuleService pricingRuleService;
|
public APIResult<T0201_0500> bikeControl(@RequestBody T8500 request) {
|
Mono<APIResult<T0201_0500>> result = messageManager.requestR(request, T0201_0500.class);
|
APIResult<T0201_0500> data = result.block();
|
return data;
|
}
|
|
@Transactional(rollbackFor = {BusinessException.class})
|
public void backElecBike(BackElecBikeRequest param) {
|
if (param.getLatitude() == null || param.getLongitude() == null || StringUtils.isBlank(param.getMemberId())) {
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,定位信息有误,请确认定位权限已开启!");
|
}
|
Member member = memberMapper.selectById(param.getMemberId());
|
if (member == null) {
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,您的账号信息查询失败,请返回重新进入小程序再试!");
|
}
|
Goodsorder gparam = new Goodsorder();
|
gparam.setMemberId(param.getMemberId());
|
gparam.setStatus(Constants.goodsorderStatus.pay);
|
Goodsorder goodsorder = goodsorderService.findOne(gparam);
|
if(Objects.isNull(goodsorder)){
|
throw new BusinessException(ResponseStatus.NO_UNCLOSEED_ORDER.getCode(),"无骑行订单记录");
|
}
|
if(Constants.formatIntegerNum(goodsorder.getStatus()) != Constants.GOODSORDER_STATUS.HAVING_PAY.getKey() ){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,该订单当前状态不支持结算操作,请尝试刷新列表重试!" );
|
}
|
//查询骑行记录
|
List<MemberRides> memberRides = goodsorderService.getMemberRidesForClose(goodsorder.getId());
|
if(memberRides!=null && memberRides.size()>0){
|
for (MemberRides rides : memberRides){
|
if(Constants.equalsInteger(rides.getStatus(),Constants.MEMBER_RIDES_STATUS.RIDES_RUNNING.getKey())){
|
if(StringUtils.isNotBlank(rides.getDeviceSn()) &&Constants.equalsInteger(rides.getType(),Constants.ONE) ){
|
Sites site = getBackSiteByPostion(param);//查询停车站点信息
|
//如果是电车并且是骑行中 进行关锁处理
|
lockBikes(rides.getDeviceSn(),Constants.ZERO);//发起关锁指令请求
|
}
|
}
|
}
|
}
|
//订单结算
|
Date date = new Date();
|
goodsorder.setEditDate(date);
|
goodsorder.setEditor(null);
|
goodsorderService.dealCloseGoodsorderBiz( goodsorder,Constants.REFUND_TYPE.NORMAL.getKey(),memberRides);
|
|
}
|
|
/**
|
* 发起关锁、开锁指令请求
|
* @param clientId
|
*/
|
private void lockBikes(String clientId,int type) {
|
T8500 request = new T8500();
|
request.setType(type);//关锁
|
request.setClientId(StringTools.leftPad(clientId,12,'0'));
|
Mono<APIResult<T0201_0500>> result = messageManager.requestR(request, T0201_0500.class);
|
APIResult<T0201_0500> data = result.block();
|
if(!data.isSuccess()){
|
//如果开锁失败,则返回异常
|
throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,还车关锁失败,请稍后重试,或者联系园区管理人员!");
|
}
|
}
|
|
/**
|
* 查询停车站点信息
|
* @param param
|
* @return
|
*/
|
private Sites getBackSiteByPostion(BackElecBikeRequest param) {
|
Sites site = null;//查询停车站点信息
|
List<Sites> sitesList = sitesMapper.selectList(new QueryWrapper<Sites>().lambda()
|
.eq(Sites::getStatus,Constants.ZERO)
|
.eq(Sites::getIsdeleted,Constants.ZERO)
|
.eq(Sites::getType,Constants.ONE));
|
if(sitesList ==null ||sitesList.size() ==0){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,请按照要求前往停车点停车!");
|
}
|
for(Sites sites :sitesList){
|
TypeReference typeReference = new TypeReference<List<LocaltionDTO>>(){};
|
List<LocaltionDTO> array = JSONObject.parseObject(sites.getElectronicFence(), typeReference.getType());
|
if(array == null || array.size() ==0){
|
continue;
|
}
|
if(PositionUtil.isInPolygon(param.getLongitude(),param.getLatitude(),array)){
|
//如果在停车点范围内;
|
site = sites;
|
break;
|
}
|
if(site ==null){
|
throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "对不起,请按照要求前往停车点停车!");
|
}
|
}
|
return site;
|
}
|
}
|