package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; 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.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.*; 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 { @Autowired private GoodsorderMapper goodsorderMapper; @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 PricingRuleService pricingRuleService; @Override public String create(Goodsorder goodsorder) { goodsorderMapper.insert(goodsorder); return goodsorder.getId(); } @Override public void deleteById(String id) { goodsorderMapper.deleteById(id); } @Override public void delete(Goodsorder goodsorder) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(goodsorder); goodsorderMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } goodsorderMapper.deleteBatchIds(ids); } @Override public void updateById(Goodsorder goodsorder) { goodsorderMapper.updateById(goodsorder); } @Override public void updateByIdInBatch(List goodsorders) { if (CollectionUtils.isEmpty(goodsorders)) { return; } for (Goodsorder goodsorder: goodsorders) { this.updateById(goodsorder); } } @Override public Goodsorder findById(String id) { return goodsorderMapper.selectById(id); } @Override public Goodsorder findOne(Goodsorder goodsorder) { QueryWrapper wrapper = new QueryWrapper<>(goodsorder); return goodsorderMapper.selectOne(wrapper); } @Override public List findList(Goodsorder goodsorder) { QueryWrapper wrapper = new QueryWrapper<>(goodsorder); return goodsorderMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper 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()); return PageData.from(goodsorderJoinMapper.selectJoinPage(page, Goodsorder.class,queryWrapper)); } @Override public long count(Goodsorder goodsorder) { QueryWrapper 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()); //查询是否存在 已支付的 押金订单 Integer status = this.goodsorderMapper.selectCount(new QueryWrapper() .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().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; } @Autowired private TransactionsMapper transactionsMapper; @Override public GoodsorderDetailDTO getGoodsorderDetailDTO(String id) { List payOrderDTOList = new ArrayList<>(); Goodsorder goodsorder = goodsorderMapper.selectById(id); QueryWrapper refundQuery = new QueryWrapper<>(); refundQuery.lambda() .eq(Refund::getObjId,id); List 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 wrapper = new MPJLambdaWrapper<>(); wrapper.leftJoin(BaseParam.class,BaseParam::getId,MemberRides::getParamId) .eq(BaseParam::getType, Constants.THREE); List 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 wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(MemberRides::getOrdreId,id); List 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 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 wrapper = new QueryWrapper<>(); wrapper.lambda() .eq(MemberRides::getOrdreId,id); List 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 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; } }