jiangping
2023-10-10 580cead2bc3a8502cd9bdd098df02345c0616b3b
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -4,21 +4,56 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.constants.Constants;
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.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.ID;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.GoodsorderMapper;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.*;
import com.doumee.dao.business.MemberRidesMapper;
import com.doumee.dao.business.join.GoodsorderJoinMapper;
import com.doumee.dao.business.model.Bikes;
import com.doumee.dao.business.model.Goodsorder;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.MemberRides;
import com.doumee.dao.business.vo.GoodsorderExportVO;
import com.doumee.dao.business.vo.GoodsorderTotalDataVO;
import com.doumee.dao.business.web.response.*;
import com.doumee.dao.business.join.MemberRidesJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.service.business.GoodsorderService;
import com.doumee.service.business.PricingRuleService;
import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import javax.servlet.http.HttpServletRequest;
import java.math.BigDecimal;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;
@Service
public class GoodsorderServiceImpl implements GoodsorderService {
@@ -30,6 +65,32 @@
    @Autowired
    GoodsorderJoinMapper goodsorderJoinMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private MemberRidesMapper memberRidesMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private BaseParamMapper baseParamMapper;
    @Autowired
    private RefundMapper refundMapper;
    @Autowired
    private MemberRidesJoinMapper memberRidesJoinMapper;
    @Autowired
    private AdMapper adMapper;
    @Autowired
    private TransactionsMapper transactionsMapper;
    @Autowired
    PricingRuleService pricingRuleService;
    @Override
    public String create(Goodsorder goodsorder) {
@@ -87,38 +148,56 @@
        QueryWrapper<Goodsorder> wrapper = new QueryWrapper<>(goodsorder);
        return goodsorderMapper.selectList(wrapper);
    }
    @Override
    public   List<GoodsorderExportVO> findExportNotBikPage(Goodsorder model){
        List<GoodsorderExportVO> list = new ArrayList<>();
        MPJLambdaWrapper<Goodsorder> queryWrapper = initQueryParamByModel(model);
        List<Goodsorder> goodsorderList = goodsorderJoinMapper.selectJoinList(Goodsorder.class,queryWrapper);
        if(goodsorderList!=null){
            for(Goodsorder order : goodsorderList){
                GoodsorderExportVO vo = new GoodsorderExportVO();
                vo.setId(order.getId());
                vo.setOpenid(order.getMemberName());
                vo.setPayDate(order.getPayDate());
                vo.setCloseDate(order.getCloseDate());
                vo.setCloseDate(order.getCloseDate());
                vo.setCloseMoney(Constants.formatDecimalNum(order.getCloseMoney()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_UP));
                vo.setRefundDate(order.getRefundDate());
                vo.setRefundMoney(Constants.formatDecimalNum(order.getRefundMoney()).divide(new BigDecimal(100), 2, BigDecimal.ROUND_UP));
                list.add(vo);
            }
        }
        return list;
    }
    private MPJLambdaWrapper<Goodsorder> initQueryParamByModel(Goodsorder model) {
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(model);
        //只查询支付成功的
        model.setPayStatus(Constants.ONE);
        queryWrapper.selectAll(Goodsorder.class);
        queryWrapper.selectAs(Member::getOpenid, Goodsorder::getMemberOpenid);
        queryWrapper.leftJoin(Member.class, Member::getId  ,Goodsorder::getMemberId);
        queryWrapper.select("select max(r.done_date) from refund r where t1.obj_id=t.id  and r.status=2 ) as refund_date");
        queryWrapper.select("select sum(r.money) from refund r where t1.obj_id=t.id and r.status=2) as refund_money");
        //时间段筛选
        queryWrapper.ge(model.getStartDate()!=null, Goodsorder::getPayDate, model.getStartDate());
        queryWrapper.le(model.getEndDate()!=null, Goodsorder::getPayDate, model.getEndDate());
        queryWrapper.eq(model.getPayStatus() !=null,Goodsorder::getPayStatus,model.getPayStatus());
        queryWrapper.eq(model.getCode() !=null,Goodsorder::getCode,model.getCode());
        queryWrapper.eq(model.getStatus() !=null,Goodsorder::getStatus,model.getStatus());
        queryWrapper.eq(model.getOnlineOrderid() !=null,Goodsorder::getOnlineOrderid,model.getOnlineOrderid());
        queryWrapper.like(model.getMemberOpenid() !=null,Member::getOpenid,model.getMemberOpenid());
        queryWrapper.eq(Goodsorder::getIsdeleted,Constants.ZERO);
        queryWrapper.orderByDesc(Goodsorder::getPayDate);
        return  queryWrapper;
    }
    @Override
    public PageData<Goodsorder> findPage(PageWrap<Goodsorder> pageWrap) {
        IPage<Goodsorder> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.like(Goodsorder::getCode, pageWrap.getModel().getCode());
        }
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.eq(Goodsorder::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getOnlineOrderid() != null) {
            queryWrapper.eq(Goodsorder::getOnlineOrderid, pageWrap.getModel().getOnlineOrderid());
        }
        if (pageWrap.getModel().getPayDate() != null) {
            queryWrapper.ge(Goodsorder::getPayDate, Utils.Date.getStart(pageWrap.getModel().getPayDate()));
            queryWrapper.le(Goodsorder::getPayDate, Utils.Date.getEnd(pageWrap.getModel().getPayDate()));
        }
        queryWrapper.orderByDesc(Goodsorder::getCreateDate);
        queryWrapper.selectAll(Goodsorder.class)
                    .selectAs(Member::getName,Goodsorder::getMemberName)
                    .leftJoin(Member.class,Member::getId,Goodsorder::getMemberId)
                    .like(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()),Member::getName,pageWrap.getModel().getMemberName());
        MPJLambdaWrapper<Goodsorder> queryWrapper = initQueryParamByModel(pageWrap.getModel());
        return PageData.from(goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class,queryWrapper));
    }
@@ -127,4 +206,424 @@
        QueryWrapper<Goodsorder> wrapper = new QueryWrapper<>(goodsorder);
        return goodsorderMapper.selectCount(wrapper);
    }
    @Override
    public HomeResponse getHome(String memberId){
        HomeResponse homeResponse = new HomeResponse();
        homeResponse.setParkName(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PROJECT_NAME).getCode());
        homeResponse.setServerPhone(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.SERVER_PHONE).getCode());
        homeResponse.setLeaseNoticeUrl(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.LEASE_NOTICE_URL).getCode());
        homeResponse.setLeaseNotice(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.LEASE_NOTICE).getCode());
        homeResponse.setDeposit(new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.RENT_DEPOSIT).getCode()));
        homeResponse.setTips(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.TIPS).getCode());
        homeResponse.setLeaseVideoUrl(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.RENT_TIPS_VIDEO).getCode());
        homeResponse.setPricingRules(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.PRICING_RULE).getCode());
        homeResponse.setStopServeTips(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.STOP_SERVE_TIPS).getCode());
        homeResponse.setIsStopServe(Constants.ZERO);
        homeResponse.setAdList(adMapper.selectList(new QueryWrapper<Ad>()
                .eq("isdeleted",Constants.ZERO)
                .eq("status",Constants.ZERO)
                .orderByDesc("create_date")
        ));
        if(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.IS_STOP_SERVE).getCode().equals(Constants.ONE)){
            String stopServeStartTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.STOP_SERVE_STARTTIME).getCode();
            String stopServeEndTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.STOP_SERVE_ENDTIME).getCode();
            //查询当前时间是否在停止中
            long s = DateUtil.StringToDate(stopServeStartTime).getTime();
            long e = DateUtil.StringToDate(stopServeEndTime).getTime();
            if(e>System.currentTimeMillis()&&s<=System.currentTimeMillis()){
                homeResponse.setIsStopServe(Constants.ONE);
            }
        }
        //查询是否存在 已支付的 押金订单
        Integer status = this.goodsorderMapper.selectCount(new QueryWrapper<Goodsorder>()
                .eq("member_id",memberId)
                .eq("status",Constants.goodsorderStatus.pay));
        homeResponse.setDepositStatus(status);
        homeResponse.setRideStatus(-1);
        if(homeResponse.getDepositStatus()==Constants.goodsorderStatus.pay) {
            //查询当前骑行状态
            MemberRides memberRides = memberRidesMapper.selectOne(new QueryWrapper<MemberRides>().eq("member_id", memberId)
                    .orderByDesc(" create_date ")
                    .last(" limit 1  "));
            if (!Objects.isNull(memberRides)) {
                homeResponse.setRideStatus(memberRides.getStatus());
                MemberRidesResponse memberRidesResponse = new MemberRidesResponse();
                BaseParam baseParam = baseParamMapper.selectById(memberRides.getParamId());
                if(!Objects.isNull(baseParam)){
                    memberRidesResponse.setBikeType(baseParam.getName());
                }
                memberRidesResponse.setRideStartTime(memberRides.getRentDate());
                memberRidesResponse.setRideEndTime(memberRides.getBackDate());
                memberRidesResponse.setRideTime(DateUtil.betweenMin(memberRidesResponse.getRideStartTime(),memberRidesResponse.getRideEndTime()));
                memberRidesResponse.setBikeCode(memberRides.getBikeCode());
                memberRidesResponse.setBasePrice(memberRides.getBasePrice());
                memberRidesResponse.setBaseTime(memberRides.getBaseTime());
                memberRidesResponse.setUnitTime(memberRidesResponse.getUnitTime());
                memberRidesResponse.setUnitPrice(memberRidesResponse.getUnitPrice());
                homeResponse.setMemberRidesResponse(memberRidesResponse);
            }
        }
        return homeResponse;
    }
    @Override
    public GoodsorderDetailDTO getGoodsorderDetailDTO(String id) {
        List<PayOrderDTO> payOrderDTOList = new ArrayList<>();
        Goodsorder goodsorder = goodsorderMapper.selectById(id);
        QueryWrapper<Refund> refundQuery = new QueryWrapper<>();
        refundQuery.lambda()
                    .eq(Refund::getObjId,id);
        List<Refund> refunds = refundMapper.selectList(refundQuery);
        PayOrderDTO payOrderDTO = new PayOrderDTO();
        payOrderDTO.setOrderCode(goodsorder.getCode());
        payOrderDTO.setPayWay(goodsorder.getPayWay());
        payOrderDTO.setMoney(goodsorder.getMoney());
        payOrderDTO.setPayDate(goodsorder.getPayDate());
        payOrderDTOList.add(0,payOrderDTO);
        if (!CollectionUtils.isEmpty(refunds)){
            refunds.forEach(s->{
                PayOrderDTO refundOrderDTO = new PayOrderDTO();
                refundOrderDTO.setOrderCode(s.getCode());
                refundOrderDTO.setPayWay(s.getPayWay());
                refundOrderDTO.setRefundType(s.getType());
                refundOrderDTO.setMoney(s.getMoney());
                refundOrderDTO.setPayDate(s.getDoneDate());
                payOrderDTOList.add(refundOrderDTO);
            });
        }
        MPJLambdaWrapper<MemberRides> wrapper = new MPJLambdaWrapper<>();
        wrapper.leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId)
                .eq(BaseParam::getType, Constants.THREE);
        List<MemberRides> memberRides = memberRidesJoinMapper.selectJoinList(MemberRides.class, wrapper);
        GoodsorderDetailDTO goodsorderDetailDTO = new GoodsorderDetailDTO();
        goodsorderDetailDTO.setPayOrderDTOList(payOrderDTOList);
        goodsorderDetailDTO.setMemberRidesList(memberRides);
        return goodsorderDetailDTO;
    }
    @Override
    public void closerGoodsorder(String id) {
        LoginUserInfo principal = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Goodsorder goodsorder = goodsorderMapper.selectById(id);
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(MemberRides::getOrdreId,id);
        List<MemberRides> memberRides = memberRidesMapper.selectList(wrapper);
        if (!CollectionUtils.isEmpty(memberRides)){
            boolean exitUnBack = memberRides.stream().anyMatch(s -> !Constants.MEMBER_RIDES_STATUS.BACK_CYCLING.getKey().equals(s.getStatus()));
            if (exitUnBack){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前订单有未完成的骑行,无法强制结算");
            }
            PricingRuleDTO pricingRule = pricingRuleService.getPricingRule(memberRides);
            RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
            List<MemberRidesResponse> collect = memberRides.stream().map(s -> {
                MemberRidesResponse memberRidesResponse = new MemberRidesResponse();
                memberRidesResponse.setRideStartTime(s.getRentDate());
                memberRidesResponse.setRideEndTime(s.getBackDate());
                memberRidesResponse.setRideTime(DateUtil.betweenMin(memberRidesResponse.getRideStartTime(), memberRidesResponse.getRideEndTime()));
                memberRidesResponse.setDuration(s.getDuration());
                memberRidesResponse.setBikeType(s.getParamName());
                memberRidesResponse.setBikeCode(s.getBikeCode());
                memberRidesResponse.setBasePrice(s.getBasePrice());
                memberRidesResponse.setBaseTime(s.getBaseTime());
                memberRidesResponse.setUnitPrice(s.getUnitTime());
                memberRidesResponse.setUnitTime(s.getUnitTime());
                return memberRidesResponse;
            }).collect(Collectors.toList());
            Integer durationSum = memberRides.stream().filter(s -> s.getDuration() > 0).mapToInt(s -> s.getDuration()).sum();
            if (durationSum > pricingRule.getMemberRides().getBaseTime()){
                BigDecimal basePrice = pricingRule.getMemberRides().getBasePrice();
                BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice().multiply(new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime())));
                ridesDetailResponse.setAmount(basePrice.add(multiply));
            }else {
                ridesDetailResponse.setAmount(pricingRule.getMemberRides().getBasePrice());
            }
            ridesDetailResponse.setBikeType(pricingRule.getBikeType());
            ridesDetailResponse.setDuration(durationSum);
            ridesDetailResponse.setMemberRidesResponseList(collect);
            Refund refund = new Refund();
            refund.setCreateDate(new Date());
            refund.setCreator(principal.getId());
            refund.setEditDate(new Date());
            refund.setEditor(principal.getId());
            refund.setIsdeleted(Constants.ZERO);
            refund.setInfo("系统结算后订单自动完结");
//            refund.setCode();
            refund.setMemberId(goodsorder.getMemberId());
            refund.setMoney(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
//            refund.setStatus();
//            refund.setPreOrderid();
//            refund.setOnlineOrderid();
            refund.setPayWay(goodsorder.getPayWay());
            refund.setDoneDate(new Date());
            refund.setType(Constants.ONE);
            refund.setObjId(goodsorder.getId());
            refund.setReason("确定强制结算吗?结算后订单自动完结");
            refundMapper.insert(refund);
            Goodsorder update = new Goodsorder();
            update.setId(goodsorder.getId());
            update.setStatus(Constants.GOODSORDER_STATUS.CLOSE.getKey());
            update.setCloseMoney(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
            update.setCloseId(refund.getId());
            update.setCloseDate(refund.getDoneDate());
            update.setCloseInfo(refund.getInfo());
            update.setCloseUserId(principal.getId());
            update.setCloseType(Constants.ONE);
            goodsorderMapper.updateById(update);
        }
    }
    @Override
    public GoodsorderTotalDataVO getTotalData(Goodsorder param){
            GoodsorderTotalDataVO model = new GoodsorderTotalDataVO();
            model.setPayMoney(new BigDecimal(0.00));
            model.setRefundMoney(new BigDecimal(0.00));
            model.setClosedMoney(new BigDecimal(0.00));
            model.setUnClosedMoney(new BigDecimal(0.00));
            model.setClosedNum(0);
            model.setUnClosedNum(0);
            model.setPayNum(0);
            model.setRefundNum(0);
            QueryWrapper<Goodsorder> queryWrapper = new QueryWrapper<>();
            queryWrapper.lambda().ge(param.getStartDate() !=null,Goodsorder::getPayDate,DateUtil.getShortDateStr(param.getStartDate()));
            queryWrapper.lambda().le(param.getEndDate() !=null,Goodsorder::getPayDate,DateUtil.getShortDateStr(param.getEndDate()));
            queryWrapper.lambda().eq(Goodsorder::getPayStatus, Constants.ONE);//已支付
            queryWrapper.lambda().eq(Goodsorder::getIsdeleted, Constants.ZERO);
            queryWrapper.lambda().groupBy(Goodsorder::getStatus);
            queryWrapper.select( "count(id) as count_num"
                    ,"sum(money) as money" );
            //按订单状态分组统计
            List<Goodsorder> detailList = goodsorderMapper.selectList(queryWrapper);
            for(Goodsorder goodsorder : detailList){
                if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.CLOSE.getKey()){
                    //已结算
                    model.setClosedNum(model.getClosedNum()+goodsorder.getCountNum());
                    model.setClosedMoney(model.getClosedMoney().add(Constants.formatDecimalNum(goodsorder.getCloseMoney())));
                    model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                    model.setPayMoney(model.getPayMoney().add(Constants.formatDecimalNum(goodsorder.getMoney())));
                }else  if(Constants.formatIntegerNum(goodsorder.getStatus()) == Constants.GOODSORDER_STATUS.HAVING_PAY.getKey()){
                    //已支付未结算
                    model.setUnClosedNum(model.getUnClosedNum()+goodsorder.getCountNum());
                    model.setUnClosedMoney(model.getUnClosedMoney().add(Constants.formatDecimalNum(goodsorder.getMoney())));
                    model.setPayNum(model.getPayNum()+goodsorder.getCountNum());
                    model.setPayMoney(model.getPayMoney().add(Constants.formatDecimalNum(goodsorder.getMoney())));
                }
            }
        QueryWrapper<Refund> queryWrapper2 = new QueryWrapper<>();
        queryWrapper2.lambda().ge(param.getStartDate() !=null,Refund::getDoneDate,DateUtil.getShortDateStr(param.getStartDate()));
        queryWrapper2.lambda().le(param.getEndDate() !=null,Refund::getDoneDate,DateUtil.getShortDateStr(param.getEndDate()));
        queryWrapper2.lambda().eq(Refund::getIsdeleted, Constants.ZERO);
        queryWrapper2.select( "count(id) as count_num"
                ,"sum(money) as money" );
        //统计退款数据
        Refund  refund = refundMapper.selectOne(queryWrapper2.last("limit 1"));
        if(refund !=null){
            model.setRefundNum(Constants.formatIntegerNum(refund.getCountNum()));
            model.setRefundMoney( Constants.formatDecimalNum(refund.getMoney()));
        }
        return  model;
    }
    @Override
    public RidesDetailResponse getRidesDetailResponse(String id) {
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
        wrapper.lambda()
                .eq(MemberRides::getOrdreId,id);
        List<MemberRides> memberRides = memberRidesMapper.selectList(wrapper);
        if (!CollectionUtils.isEmpty(memberRides)){
            PricingRuleDTO pricingRule = pricingRuleService.getPricingRule(memberRides);
            RidesDetailResponse ridesDetailResponse = new RidesDetailResponse();
            List<MemberRidesResponse> collect = memberRides.stream().map(s -> {
                MemberRidesResponse memberRidesResponse = new MemberRidesResponse();
                memberRidesResponse.setRideStartTime(s.getRentDate());
                memberRidesResponse.setRideEndTime(s.getBackDate());
                memberRidesResponse.setRideTime(DateUtil.betweenMin(memberRidesResponse.getRideStartTime(), memberRidesResponse.getRideEndTime()));
                memberRidesResponse.setDuration(s.getDuration());
                memberRidesResponse.setBikeType(s.getParamName());
                memberRidesResponse.setBikeCode(s.getBikeCode());
                memberRidesResponse.setBasePrice(s.getBasePrice());
                memberRidesResponse.setBaseTime(s.getBaseTime());
                memberRidesResponse.setUnitPrice(s.getUnitTime());
                memberRidesResponse.setUnitTime(s.getUnitTime());
                return memberRidesResponse;
            }).collect(Collectors.toList());
            Integer durationSum = memberRides.stream().filter(s -> s.getDuration() > 0).mapToInt(s -> s.getDuration()).sum();
            if (durationSum > pricingRule.getMemberRides().getBaseTime()){
                BigDecimal basePrice = pricingRule.getMemberRides().getBasePrice();
                BigDecimal multiply = pricingRule.getMemberRides().getUnitPrice().multiply(new BigDecimal((durationSum - pricingRule.getMemberRides().getBaseTime())));
                ridesDetailResponse.setAmount(basePrice.add(multiply));
            }else {
                ridesDetailResponse.setAmount(pricingRule.getMemberRides().getBasePrice());
            }
            ridesDetailResponse.setBikeType(pricingRule.getBikeType());
            ridesDetailResponse.setDuration(durationSum);
            ridesDetailResponse.setMemberRidesResponseList(collect);
            return ridesDetailResponse;
        }
        return new RidesDetailResponse();
    }
    @Override
    public Object createGoodsOrderPay(String memberId){
        Member member = memberMapper.selectById(memberId);
        if(Objects.isNull(member)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到用户对象信息");
        }
        Goodsorder qry = new Goodsorder();
        qry.setStatus(Constants.goodsorderStatus.pay);
        qry.setMemberId(memberId);
        qry.setIsdeleted(Constants.ZERO);
        if(goodsorderMapper.selectCount(new QueryWrapper<>(qry))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"已支付过定金,无法重复该操作");
        }
        //是否处于小程序停止服务时间内
        if(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.IS_STOP_SERVE).getCode().equals(Constants.ONE)){
            String stopServeStartTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.STOP_SERVE_STARTTIME).getCode();
            String stopServeEndTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.STOP_SERVE_ENDTIME).getCode();
            //查询当前时间是否在停止中
            long s = DateUtil.StringToDate(stopServeStartTime).getTime();
            long e = DateUtil.StringToDate(stopServeEndTime).getTime();
            if(e>System.currentTimeMillis()&&s<=System.currentTimeMillis()){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前小程序停止服务,请注意查看公告");
            }
        }
        //是否处于营业时间
        String businessStartTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.BUSINESS_STARTTIME).getCode();
        String businessEndTime = systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.BUSINESS_ENDTIME).getCode();
        String nowTime = DateUtil.getDate(new Date(),"HH:mm");
        if(Integer.valueOf(nowTime.replace(":",""))<= Integer.valueOf(businessStartTime.replace(":",""))
            ||Integer.valueOf(nowTime.replace(":","")) > Integer.valueOf(businessEndTime.replace(":",""))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"当前时间暂未营业服务,请注意查看营业时间");
        }
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setId(Constants.getUUID());
        goodsorder.setCreateDate(new Date());
        goodsorder.setIsdeleted(Constants.ZERO);
        goodsorder.setMemberId(memberId);
        goodsorder.setMoney(new BigDecimal(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.RENT_DEPOSIT).getCode()));
        goodsorder.setStatus(Constants.goodsorderStatus.waitPay);
        goodsorder.setPreOrderid(goodsorder.getId());
        goodsorder.setPayStatus(Constants.goodsorderPayStatus.waitPay);
        goodsorder.setPayWay(Constants.ZERO);
        this.goodsorderMapper.insert(goodsorder);
        //调起支付
        try {
            Object response = null;
            WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest();
            request.setBody("支付押金");
            request.setAttach("createGoodsOrder");
            request.setOutTradeNo(goodsorder.getId());
//            request.setTotalFee(BaseWxPayRequest.yuanToFen(goodsorder.getMoney().toString()));
            request.setTotalFee(1);
            request.setSpbillCreateIp(this.getIpAddr());
            request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss"));
            request.setOpenid(member.getOpenid());
            response = WxMiniConfig.wxPayService.createOrder(request);
            return response;
        } catch (WxPayException e) {
            e.printStackTrace();
            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),e.getMessage());
        }
    }
    @Override
    public String payNotify(String preOrderId,String paymentNo){
        Goodsorder goodsorder = this.goodsorderMapper.selectById(preOrderId);
        if(goodsorder.getStatus()==Constants.goodsorderStatus.pay){
            return WxPayNotifyResponse.success("处理成功!");
        }
        goodsorder.setOnlineOrderid(paymentNo);
        goodsorder.setPayStatus(Constants.goodsorderPayStatus.pay);
        goodsorder.setStatus(Constants.goodsorderStatus.pay);
        goodsorder.setPayDate(new Date());
        goodsorder.setEditDate(new Date());
        goodsorderMapper.updateById(goodsorder);
        //存储交易流水表
        Transactions transactions = new Transactions();
        transactions.setMemberId(goodsorder.getMemberId());
        transactions.setCreateDate(new Date());
        transactions.setIsdeleted(Constants.ZERO);
        transactions.setOrderId(goodsorder.getId());
        transactions.setMoney(goodsorder.getMoney());
        transactions.setType(Constants.transactionsType.deposit);
        transactions.setPreOrderid(goodsorder.getPreOrderid());
        transactions.setOnlineOrderid(goodsorder.getOnlineOrderid());
        transactions.setDoneDate(new Date());
        transactions.setTitle("支付");
        transactions.setContent("押金支付");
        transactions.setBalance(goodsorder.getMoney());
        transactions.setObjId(goodsorder.getId());
        transactions.setObjType(Constants.ZERO);
        transactionsMapper.insert(transactions);
        return WxPayNotifyResponse.success("处理成功!");
    }
    /**
     * 得到request对象
     *
     * @return
     */
    public HttpServletRequest getRequest() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        return request;
    }
    public String getIpAddr() {
        HttpServletRequest request = this.getRequest();
        String ipAddress = null;
        try {
            ipAddress = request.getHeader("x-forwarded-for");
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getHeader("WL-Proxy-Client-IP");
            }
            if (ipAddress == null || ipAddress.length() == 0 || "unknown".equalsIgnoreCase(ipAddress)) {
                ipAddress = request.getRemoteAddr();
                if (ipAddress.equals("127.0.0.1")) {
                    // 根据网卡取本机配置的IP
                    InetAddress inet = null;
                    try {
                        inet = InetAddress.getLocalHost();
                    } catch (UnknownHostException e) {
                        e.printStackTrace();
                    }
                    ipAddress = inet.getHostAddress();
                }
            }
            // 对于通过多个代理的情况,第一个IP为客户端真实IP,多个IP按照','分割
            if (ipAddress != null && ipAddress.length() > 15) { // "***.***.***.***".length()
                // = 15
                if (ipAddress.indexOf(",") > 0) {
                    ipAddress = ipAddress.substring(0, ipAddress.indexOf(","));
                }
            }
        } catch (Exception e) {
            ipAddress = "47.111.178.164";
        }
        // ipAddress = this.getRequest().getRemoteAddr();
        return ipAddress;
    }
}