111
k94314517
2023-10-10 2c33de81d301818aea8c7210b384545dbc8d2e39
111
已添加1个文件
已修改7个文件
306 ■■■■■ 文件已修改
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/request/RefundDTO.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/GoodsorderService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/MemberRidesService.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 143 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java 71 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/BusinessApi.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/services/src/main/java/com/doumee/core/wx/WxMiniUtilService.java
@@ -61,6 +61,7 @@
                refund.setType(refundDTO.getType());
                refund.setObjId(refundDTO.getOrderId());
                refund.setReason(refundDTO.getReason());
                refund.setCanBalance(refundDTO.getCanBalance());
                refundMapper.insert(refund);
                //存储交易流水表
                Transactions transactions = new Transactions();
server/services/src/main/java/com/doumee/dao/business/web/request/RefundDTO.java
@@ -24,6 +24,10 @@
    @ApiModelProperty(value = "订单总金额(分)")
    private BigDecimal totalAmount;
    @ApiModelProperty(value = "可退金额(分)")
    private BigDecimal canBalance;
    @ApiModelProperty(value = "用户主键")
    private String memberId;
server/services/src/main/java/com/doumee/dao/business/web/response/MemberRidesDetailResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,25 @@
package com.doumee.dao.business.web.response;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/10/10 11:39
 */
@Data
@ApiModel("骑行记录状态信息返回类")
public class MemberRidesDetailResponse {
    @ApiModelProperty(value = "骑行记录主键")
    private String id;
    @ApiModelProperty(value = "骑行记录状态 0请求开锁中 1骑行中 2已还车  3开锁失败")
    private Integer status;
}
server/services/src/main/java/com/doumee/service/business/GoodsorderService.java
@@ -1,6 +1,7 @@
package com.doumee.service.business;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Bikes;
@@ -153,5 +154,19 @@
    GoodsorderTotalDataVO getTotalData(Goodsorder pageWrap);
    /**
     * éªŒè¯æ˜¯å¦ä¸ºè¥ä¸šæ—¶é—´
     */
    void checkBusiness();
    /**
     * éªŒè¯æ˜¯å¦å¤„于停止运营时间
     */
    void checkTemporaryStop();
    Goodsorder findOneByWrapper(QueryWrapper<Goodsorder> wrapper);
    List<GoodsorderExportVO> findExportNotBikPage(Goodsorder model);
    void goodsOrderSettlement(String orderId);
}
server/services/src/main/java/com/doumee/service/business/MemberRidesService.java
@@ -6,6 +6,7 @@
import com.doumee.dao.business.web.request.MemberRidesQuery;
import com.doumee.dao.business.web.response.BikeLogDTO;
import com.doumee.dao.business.web.response.MemberRidesDTO;
import com.doumee.dao.business.web.response.MemberRidesDetailResponse;
import java.util.List;
@@ -115,6 +116,20 @@
     */
    String getOnlineBike(String memberId);
    /**
     * æ‰«ç è§£é”
     * @param code
     * @param memberId
     * @return
     */
    MemberRidesDetailResponse openLock(String code, String memberId);
    /**
     * åˆ·æ–°è§£é”æƒ…况
     * @param id
     * @return
     */
    MemberRidesDetailResponse refreshLock(String id);
    void updateDuration(MemberRides memberRides);
    void forceBack(MemberRides memberRides);
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -16,6 +16,7 @@
import com.doumee.core.utils.ID;
import com.doumee.core.utils.Utils;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.core.wx.WxMiniUtilService;
import com.doumee.dao.business.*;
import com.doumee.dao.business.MemberRidesMapper;
import com.doumee.dao.business.join.GoodsorderJoinMapper;
@@ -25,6 +26,7 @@
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.request.RefundDTO;
import com.doumee.dao.business.web.response.*;
import com.doumee.dao.business.join.MemberRidesJoinMapper;
import com.doumee.dao.business.model.*;
@@ -40,6 +42,7 @@
import org.checkerframework.checker.units.qual.A;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
@@ -88,6 +91,9 @@
    @Autowired
    private TransactionsMapper transactionsMapper;
    @Autowired
    private WxMiniUtilService wxMiniUtilService;
    @Autowired
    PricingRuleService pricingRuleService;
@@ -140,6 +146,11 @@
    @Override
    public Goodsorder findOne(Goodsorder goodsorder) {
        QueryWrapper<Goodsorder> wrapper = new QueryWrapper<>(goodsorder);
        return goodsorderMapper.selectOne(wrapper);
    }
    @Override
    public Goodsorder findOneByWrapper(QueryWrapper<Goodsorder> wrapper) {
        return goodsorderMapper.selectOne(wrapper);
    }
@@ -492,24 +503,9 @@
            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(),"当前小程序停止服务,请注意查看公告");
            }
        }
        this.checkTemporaryStop();
        //是否处于营业时间
        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(),"当前时间暂未营业服务,请注意查看营业时间");
        }
        this.checkBusiness();
        Goodsorder goodsorder = new Goodsorder();
        goodsorder.setId(Constants.getUUID());
        goodsorder.setCreateDate(new Date());
@@ -541,6 +537,119 @@
        }
    }
    /**
     * éªŒè¯è¥ä¸šæ—¶é—´
     */
    @Override
    public void checkBusiness(){
        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(),"当前时间暂未营业服务,请注意查看营业时间");
        }
    }
    /**
     * ä¸´æ—¶åœæ­¢æœåŠ¡ æœªäº¤æŠ¼é‡‘的用户,无法扫车使用;已经交过押金的用户可以继续扫码骑行;
     */
    @Override
    public void checkTemporaryStop(){
        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(),"当前小程序停止服务,请注意查看公告");
            }
        }
    }
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void goodsOrderSettlement(String orderId) {
        Goodsorder goodsorder = goodsorderMapper.selectById(orderId);
        QueryWrapper<MemberRides> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(MemberRides::getOrdreId,orderId);
        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())).divide(new BigDecimal(pricingRule.getMemberRides().getUnitTime())).setScale(0,BigDecimal.ROUND_CEILING));
                ridesDetailResponse.setAmount(basePrice.add(multiply));
            }else {
                ridesDetailResponse.setAmount(pricingRule.getMemberRides().getBasePrice());
            }
            ridesDetailResponse.setBikeType(pricingRule.getBikeType());
            ridesDetailResponse.setDuration(durationSum);
            ridesDetailResponse.setMemberRidesResponseList(collect);
            RefundDTO refundDTO = new RefundDTO();
            refundDTO.setOrderId(orderId);
            refundDTO.setCanBalance(goodsorder.getMoney());
            refundDTO.setRefundAmount(goodsorder.getMoney().subtract(ridesDetailResponse.getAmount()));
            refundDTO.setTotalAmount(goodsorder.getMoney());
            refundDTO.setMemberId(goodsorder.getMemberId());
            refundDTO.setReason("用户主动退款");
            refundDTO.setType(Constants.REFUND_TYPE.NORMAL.getKey());
            Refund refund = wxMiniUtilService.wxRefund(refundDTO);
            //存储 æ¶ˆè´¹ äº¤æ˜“流水
            Transactions transactions = new Transactions();
            transactions.setMemberId(refundDTO.getMemberId());
            transactions.setCreateDate(new Date());
            transactions.setIsdeleted(Constants.ZERO);
            transactions.setOrderId(refundDTO.getOrderId());
            transactions.setMoney(ridesDetailResponse.getAmount());
            transactions.setType(Constants.transactionsType.consumption);
            transactions.setDoneDate(new Date());
            transactions.setTitle("消费结算");
            transactions.setContent("结算实际消费");
            transactions.setBalance(BigDecimal.ZERO);
            transactions.setObjId(refund.getId());
            transactions.setObjType(Constants.ONE);
            transactionsMapper.insert(transactions);
            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.setCloseType(Constants.ONE);
            goodsorderMapper.updateById(update);
        }
    }
    @Override
    public String payNotify(String preOrderId,String paymentNo){
        Goodsorder goodsorder = this.goodsorderMapper.selectById(preOrderId);
server/services/src/main/java/com/doumee/service/business/impl/MemberRidesServiceImpl.java
@@ -4,19 +4,30 @@
import com.doumee.core.constants.Constants;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
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.Utils;
import com.doumee.dao.business.GoodsorderMapper;
import com.doumee.dao.business.LocksMapper;
import com.doumee.dao.business.ActionLogMapper;
import com.doumee.dao.business.MemberRidesMapper;
import com.doumee.dao.business.join.MemberRidesJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.model.BaseParam;
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.model.*;
import com.doumee.dao.business.web.request.MemberRidesQuery;
import com.doumee.dao.business.web.response.BikeLogDTO;
import com.doumee.dao.business.web.response.MemberRidesDTO;
import com.doumee.dao.business.web.response.MemberRidesDetailResponse;
import com.doumee.service.business.DeviceService;
import com.doumee.service.business.GoodsorderService;
import com.doumee.service.business.MemberRidesService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -25,6 +36,8 @@
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.checkerframework.checker.units.qual.C;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -48,12 +61,17 @@
    @Autowired
    private ActionLogMapper actionLogMapper;
    @Autowired
    private MemberRidesJoinMapper memberRidesJoinMapper;
    @Autowired
    private DeviceService deviceService;
    @Autowired
    private LocksMapper locksMapper;
    @Autowired
    private GoodsorderService goodsorderService;
    @Override
    public String create(MemberRides memberRides) {
@@ -316,7 +334,58 @@
    }
    @Override
    public MemberRidesDetailResponse openLock(String code,String memberId){
        //判断当前是否已支付押金
        Goodsorder goodsorder = goodsorderService.findOneByWrapper(new QueryWrapper<Goodsorder>()
                .eq("isdeleted",Constants.ZERO)
                .eq("status",Constants.goodsorderStatus.pay)
                .eq("member_id",memberId)
                .orderByDesc("create_date")
                .last("limit 1"));
        if(Objects.isNull(goodsorder)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"未支付押金,无法进行该操作!");
        }
        //判断当前押金订单是否为今日押金
        if(!DateUtil.DateToStr(goodsorder.getPayDate(),"yyyy-MM-dd").equals(DateUtil.getDate(new Date(),"yyyy-MM-dd"))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"非今日押金订单,请结算后重新支付!");
        }
        //判断是否处于营业时间
        goodsorderService.checkBusiness();
        //查询是否处于骑行中
        if(memberRidesMapper.selectCount(new QueryWrapper<MemberRides>().eq("member_id",memberId).in("status",0,1))>Constants.ZERO){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"存在骑行中车辆,无法扫码");
        };
        Locks locks = locksMapper.selectOne(new QueryWrapper<Locks>().eq("code",code).eq("isdeleted", Constants.ZERO).last("limit 1"));
        Boolean flag = deviceService.openLock(locks);
        if(!flag){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"开锁失败");
        }
        //存储骑行记录
        MemberRides memberRides = new MemberRides();
        memberRides.setIsdeleted(Constants.ZERO);
        memberRides.setMemberId(memberId);
        memberRides.setCreateDate(new Date());
        memberRides.setRentSiteId(locks.getSiteId());
        memberRides.setRentLockId(locks.getId());
        memberRides.setStatus(Constants.MEMBER_RIDES_STATUS.LOCKING.getKey());
        memberRidesMapper.insert(memberRides);
        MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse();
        BeanUtils.copyProperties(memberRides,memberRidesDetailResponse);
        return memberRidesDetailResponse;
    }
    @Override
    public MemberRidesDetailResponse refreshLock(String id){
        MemberRides memberRides = memberRidesMapper.selectById(id);
        if(Objects.isNull(memberRides)){
            throw new BusinessException(ResponseStatus.DATA_EMPTY);
        }
        MemberRidesDetailResponse memberRidesDetailResponse = new MemberRidesDetailResponse();
        BeanUtils.copyProperties(memberRides,memberRidesDetailResponse);
        return memberRidesDetailResponse;
    }
}
server/web/src/main/java/com/doumee/api/web/BusinessApi.java
@@ -11,6 +11,7 @@
import com.doumee.dao.business.model.RentSite;
import com.doumee.dao.business.model.Transactions;
import com.doumee.dao.business.web.request.RepairRequest;
import com.doumee.dao.business.web.response.MemberRidesDetailResponse;
import com.doumee.dao.business.web.response.RidesDetailResponse;
import com.doumee.service.business.*;
import io.swagger.annotations.Api;
@@ -141,9 +142,40 @@
    }
    @LoginRequired
    @ApiOperation(value = "扫码解锁", notes = "小程序端")
    @GetMapping("/openLock")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "锁头码", required = true)
    })
    public ApiResponse<MemberRidesDetailResponse> openLock(@RequestParam String code) {
        return  ApiResponse.success("操作成功",memberRidesService.openLock(code,getMemberId()));
    }
    @LoginRequired
    @ApiOperation(value = "刷新解锁情况", notes = "小程序端")
    @GetMapping("/refreshLock")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "id", value = "骑行记录主键", required = true)
    })
    public ApiResponse<MemberRidesDetailResponse> refreshLock(@RequestParam String id) {
        return  ApiResponse.success("操作成功",memberRidesService.refreshLock(id));
    }
    @LoginRequired
    @ApiOperation(value = "订单结算", notes = "小程序端")
    @GetMapping("/goodsOrderSettlement")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "orderId", value = "订单主键", required = true)
    })
    public ApiResponse goodsOrderSettlement(@RequestParam String orderId) {
        goodsorderService.goodsOrderSettlement(orderId);
        return  ApiResponse.success("操作成功");
    }
}