jiangping
2025-02-18 9d67b4462bf494a0b25c1b40be8198f71666131e
server/web/src/main/java/com/doumee/jtt808/web/service/Jtt808Service.java
@@ -1,23 +1,177 @@
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;
    }
}