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("æä½æå"); } }