111
k94314517
2023-10-09 bb0a8ba2fba9f22d66a3db7f194493f7f0a96ae0
server/services/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -4,30 +4,54 @@
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.web.response.HomeResponse;
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 {
@@ -45,6 +69,20 @@
    @Autowired
    private MemberRidesMapper memberRidesMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private BaseParamMapper baseParamMapper;
    @Autowired
    private RefundMapper refundMapper;
    @Autowired
    private MemberRidesJoinMapper memberRidesJoinMapper;
    @Autowired
    PricingRuleService pricingRuleService;
    @Override
    public String create(Goodsorder goodsorder) {
@@ -109,7 +147,6 @@
        MPJLambdaWrapper<Goodsorder> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        if (pageWrap.getModel().getCode() != null) {
            queryWrapper.like(Goodsorder::getCode, pageWrap.getModel().getCode());
        }
@@ -117,7 +154,6 @@
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.eq(Goodsorder::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getOnlineOrderid() != null) {
            queryWrapper.eq(Goodsorder::getOnlineOrderid, pageWrap.getModel().getOnlineOrderid());
@@ -133,7 +169,6 @@
                    .selectAs(Member::getName,Goodsorder::getMemberName)
                    .leftJoin(Member.class,Member::getId,Goodsorder::getMemberId)
                    .like(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()),Member::getName,pageWrap.getModel().getMemberName());
        return PageData.from(goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class,queryWrapper));
    }
@@ -145,6 +180,7 @@
    @Override
    public HomeResponse getHome(String memberId){
        HomeResponse homeResponse = new HomeResponse();
        homeResponse.setParkName(systemDictDataBiz.queryByCode(Constants.MINI_PROGRAMME,Constants.PROJECT_NAME).getCode());
@@ -160,20 +196,325 @@
                .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)) {
            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;
    }
    @Autowired
    private TransactionsMapper transactionsMapper;
    @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 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)){
            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);
            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(),"已支付过定金,无法重复该操作");
        }
        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;
    }
}