server/admin/src/main/java/com/doumee/api/business/OrdersController.java
@@ -12,10 +12,7 @@ import com.doumee.dao.dto.DispatchDTO; import com.doumee.dao.dto.HandleOrderExceptionDTO; import com.doumee.dao.dto.ManualRefundDTO; import com.doumee.dao.vo.OrderDetailVO; import com.doumee.dao.vo.OrderDispatchVO; import com.doumee.dao.vo.OrdersExportVO; import com.doumee.dao.vo.OrderSummaryVO; import com.doumee.dao.vo.*; import com.doumee.service.business.OrdersService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; @@ -109,6 +106,8 @@ vo.setOverdueAmount(String.valueOf(Constants.getFormatMoney(o.getOverdueAmount()))); vo.setExceptionAmount(String.valueOf(Constants.getFormatMoney(o.getExceptionAmount()))); vo.setDeductionAmount(String.valueOf(Constants.getFormatMoney(o.getDeductionAmount()))); vo.setShopCompensationAmount(String.valueOf(Constants.getFormatMoney(o.getShopCompensationAmount()))); vo.setExceptionFee(String.valueOf(Constants.getFormatMoney(o.getExceptionFee()))); vo.setStatusDesc(o.getStatusDesc()); vo.setSettlementDesc(o.getSettlementStatus() != null ? (o.getSettlementStatus() == 1 ? "å·²ç»ç®" : "å¾ ç»ç®") : ""); vo.setPayTime(o.getPayTime()); @@ -174,4 +173,11 @@ return ApiResponse.success("æä½æå"); } @ApiOperation("æå¨é款详æ ") @GetMapping("/manualRefundDetail/{orderId}") @RequiresPermissions("business:orders:query") public ApiResponse<ManualRefundDetailVO> manualRefundDetail(@PathVariable Integer orderId) { return ApiResponse.success(ordersService.getManualRefundDetail(orderId)); } } server/admin/src/main/resources/application.yml
@@ -12,7 +12,7 @@ spring: profiles: active: dev active: pro # JSONè¿åé ç½® jackson: # é»è®¤æ¶åº server/services/src/main/java/com/doumee/biz/system/impl/OperationConfigBizImpl.java
@@ -50,9 +50,9 @@ dto.setRegisterCouponId(getValue(Constants.OP_REGISTER_COUPON_ID)); dto.setRegisterGiftCouponIds(getValue(Constants.OP_REGISTER_GIFT_COUPON_IDS)); dto.setRegisterRewardOrderCount(getValue(Constants.OP_REGISTER_REWARD_ORDER_COUNT)); dto.setRegisterRewardAmount(fenToYuan(getValue(Constants.OP_REGISTER_REWARD_AMOUNT))); dto.setRegisterRewardAmount(getValue(Constants.OP_REGISTER_REWARD_AMOUNT)); dto.setPlatformRewardOrderCount(getValue(Constants.OP_PLATFORM_REWARD_ORDER_COUNT)); dto.setPlatformRewardAmount(fenToYuan(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT))); dto.setPlatformRewardAmount(getValue(Constants.OP_PLATFORM_REWARD_AMOUNT)); dto.setInvoiceMonthLimit(getValue(Constants.OP_INVOICE_MONTH_LIMIT)); return dto; } server/services/src/main/java/com/doumee/config/wx/WxPayV3Service.java
@@ -59,7 +59,7 @@ com.wechat.pay.java.service.payments.jsapi.model.Amount amount = new com.wechat.pay.java.service.payments.jsapi.model.Amount(); amount.setTotal(1);//totalCents.intValue()); amount.setTotal(totalCents.intValue()); amount.setCurrency("CNY"); request.setAmount(amount); @@ -109,8 +109,8 @@ request.setNotifyUrl(notifyUrl); AmountReq amount = new AmountReq(); amount.setRefund(1L);//refundCents); amount.setTotal(1L);//totalCents); amount.setRefund(refundCents); amount.setTotal(totalCents); amount.setCurrency("CNY"); request.setAmount(amount); server/services/src/main/java/com/doumee/dao/dto/DriverOrderPageDTO.java
@@ -16,4 +16,7 @@ @ApiModelProperty(value = "订åç¶æçéï¼null=å ¨é¨ï¼3=å¾ åä»¶ï¼4=é éä¸ï¼7=已宿") private Integer status; @ApiModelProperty(value = "æç´¢å ³é®è¯ï¼æ¶ä»¶äºº/æ¶ä»¶äººçµè¯æ¨¡ç³/订åå·ç²¾åï¼") private String keyword; } server/services/src/main/java/com/doumee/dao/vo/LocationTagShopCountVO.java
@@ -24,4 +24,7 @@ @ApiModelProperty("é¨åºæ°é") private Integer shopCount; @ApiModelProperty(value = "æåºç ", hidden = true) private Integer sortnum; } server/services/src/main/java/com/doumee/dao/vo/ManualRefundDetailVO.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,25 @@ package com.doumee.dao.vo; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel("æå¨é款详æ ") public class ManualRefundDetailVO { @ApiModelProperty(value = "鿬¾éé¢ï¼åï¼") private Long refundAmount; @ApiModelProperty(value = "åä»¶é¨åºæ£æ¬¾éé¢ï¼åï¼") private Long depositShopDeduct; @ApiModelProperty(value = "åä»¶é¨åºæ£æ¬¾éé¢ï¼åï¼") private Long takeShopDeduct; @ApiModelProperty(value = "叿ºæ£æ¬¾éé¢ï¼åï¼") private Long driverDeduct; @ApiModelProperty(value = "鿬¾å¤æ³¨") private String refundRemark; } server/services/src/main/java/com/doumee/dao/vo/MyOrderDetailVO.java
@@ -76,6 +76,8 @@ private Date arriveTime; // ---- åä»¶é¨åº ---- @ApiModelProperty(value = "åä»¶é¨åºä¸»é®", example = "1") private Integer depositShopId; @ApiModelProperty(value = "åä»¶é¨åºåç§°") private String depositShopName; @@ -132,6 +134,9 @@ @ApiModelProperty(value = "å®é æ¯ä»è´¹ç¨ï¼åï¼") private Long actualPayAmount; @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") private Long deductionAmount; // ---- 龿 ---- //é¾æç¶æ: 0=æªå°åºæªé¾æ 1=æªå°åºåå¨é¾æ 2=å·²å°åºæªåå¨é¾æ 3=å·²å°åºå¾ æ¯ä»é¾æ 4=龿已æ¯ä» server/services/src/main/java/com/doumee/dao/vo/MyOrderVO.java
@@ -148,4 +148,7 @@ @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") private Long deductionAmount; @ApiModelProperty(value = "æ¯å¦å¼å¸¸è®¢åï¼0=å¦ï¼1=æ¯") private Integer abnormalOrder; } server/services/src/main/java/com/doumee/dao/vo/OrderDetailVO.java
@@ -6,6 +6,7 @@ import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; import java.util.List; /** @@ -82,4 +83,22 @@ @ApiModelProperty(value = "伿 叿µæ£éé¢ï¼åï¼") private Long deductionAmount; @ApiModelProperty(value = "è¯ä»·å 容") private String commentContent; @ApiModelProperty(value = "è¯ä»·æ¶é´") private Date commentTime; @ApiModelProperty(value = "è¯ä»·éä»¶å¾ç") private List<String> commentImages; @ApiModelProperty(value = "å¯åé¨åºè¯å") private Integer depositScore; @ApiModelProperty(value = "åä»¶é¨åºè¯å") private Integer takeScore; @ApiModelProperty(value = "叿ºè¯å") private Integer driverScore; } server/services/src/main/java/com/doumee/dao/vo/OrdersExportVO.java
@@ -47,15 +47,21 @@ @ExcelColumn(name = "伿 叿æ£(å )", index = 12) private String deductionAmount; @ExcelColumn(name = "订åç¶æ", index = 13) @ExcelColumn(name = "é¨åºè¡¥å¿è´¹ç¨(å )", index = 13) private String shopCompensationAmount; @ExcelColumn(name = "叿ºè¡¥å¿è´¹ç¨(å )", index = 14) private String exceptionFee; @ExcelColumn(name = "订åç¶æ", index = 15) private String statusDesc; @ExcelColumn(name = "ç»ç®ç¶æ", index = 14) @ExcelColumn(name = "ç»ç®ç¶æ", index = 16) private String settlementDesc; @ExcelColumn(name = "æ¯ä»æ¶é´", index = 15, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) @ExcelColumn(name = "æ¯ä»æ¶é´", index = 17, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) private Date payTime; @ExcelColumn(name = "å建æ¶é´", index = 16, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) @ExcelColumn(name = "å建æ¶é´", index = 18, dateFormat = "yyyy-MM-dd HH:mm:ss", width = 16) private Date createTime; } server/services/src/main/java/com/doumee/dao/vo/ShopCenterVO.java
@@ -6,6 +6,9 @@ @Data public class ShopCenterVO { @ApiModelProperty(value = "é¨åºä¸»é®") private Integer id; @ApiModelProperty(value = "é¨åºå¤´åå ¨è·¯å¾") private String fullCoverImg; server/services/src/main/java/com/doumee/service/business/MemberCouponService.java
@@ -5,6 +5,7 @@ import com.doumee.dao.business.model.MemberCoupon; import java.util.List; import java.util.Map; public interface MemberCouponService { @@ -27,4 +28,6 @@ PageData<MemberCoupon> findMemberPage(Integer memberId, Integer status, PageWrap<MemberCoupon> pageWrap); void claimCoupon(Integer memberId, Integer couponId); Map<String, Integer> findPendingCount(Integer memberId); } server/services/src/main/java/com/doumee/service/business/OrdersService.java
@@ -466,4 +466,5 @@ */ Boolean checkOperationRadius(Integer orderId, Integer userId, Integer userType, Double lng, Double lat); ManualRefundDetailVO getManualRefundDetail(Integer orderId); } server/services/src/main/java/com/doumee/service/business/impl/CouponServiceImpl.java
@@ -164,6 +164,12 @@ if (coupon.getPrice() >= coupon.getLimitPrice()) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "伿 éé¢å¿ é¡»å°äºæ»¡é¢"); } if (coupon.getLimitPrice() < 1000) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "满åé颿ä½10å "); } if (coupon.getLimitPrice() - coupon.getPrice() < 1000) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "满åéé¢å¿ é¡»å¤§äºæ£åéé¢10å 以ä¸"); } if (Objects.isNull(coupon.getPushDays()) || coupon.getPushDays() < 1) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ¨éåé¢åææå¤©æ°å¿ 须大äºçäº1天"); } server/services/src/main/java/com/doumee/service/business/impl/DataBoardServiceImpl.java
@@ -150,10 +150,10 @@ Map<String, Long> map = members.stream() .collect(Collectors.groupingBy(m -> sdf.format(m.getCreateTime()), Collectors.counting())); return buildTrendList(range, (date) -> { return buildTrendList(range, (key, label) -> { MemberTrendVO vo = new MemberTrendVO(); vo.setDate(date); vo.setCount(map.getOrDefault(date, 0L)); vo.setDate(label); vo.setCount(map.getOrDefault(key, 0L)); return vo; }); } @@ -169,10 +169,10 @@ Map<String, List<Orders>> grouped = orders.stream() .collect(Collectors.groupingBy(o -> sdf.format(o.getCreateTime()))); return buildTrendList(range, (date) -> { List<Orders> dayOrders = grouped.getOrDefault(date, Collections.emptyList()); return buildTrendList(range, (key, label) -> { List<Orders> dayOrders = grouped.getOrDefault(key, Collections.emptyList()); OrderTrendVO vo = new OrderTrendVO(); vo.setDate(date); vo.setDate(label); vo.setLocalCount(dayOrders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ZERO)).count()); vo.setRemoteCount(dayOrders.stream().filter(o -> Constants.equalsInteger(o.getType(), Constants.ONE)).count()); return vo; @@ -227,11 +227,11 @@ } } return buildTrendList(range, (date) -> { return buildTrendList(range, (key, label) -> { RevenueTrendVO vo = new RevenueTrendVO(); vo.setDate(date); long local = localOrderRevenue.getOrDefault(date, 0L); long remote = remoteOrderRevenue.getOrDefault(date, 0L); vo.setDate(label); long local = localOrderRevenue.getOrDefault(key, 0L); long remote = remoteOrderRevenue.getOrDefault(key, 0L); vo.setLocalRevenue(BigDecimal.valueOf(local).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); vo.setRemoteRevenue(BigDecimal.valueOf(remote).divide(BigDecimal.valueOf(100), 2, RoundingMode.HALF_UP)); return vo; @@ -718,7 +718,7 @@ @FunctionalInterface private interface TrendVOBuilder<T> { T build(String date); T build(String key, String label); } private <T> List<T> buildTrendList(TrendDateRange range, TrendVOBuilder<T> builder) { @@ -732,7 +732,8 @@ Calendar end = Calendar.getInstance(); end.setTime(range.endDate); while (!loop.after(end)) { result.add(builder.build(sdf.format(loop.getTime()))); String dateStr = sdf.format(loop.getTime()); result.add(builder.build(dateStr, dateStr)); loop.add(Calendar.DAY_OF_MONTH, 1); } } else { @@ -741,8 +742,9 @@ endCal.setTime(range.endDate); int endMonth = endCal.get(Calendar.MONTH); // 0-based for (int m = 0; m <= endMonth; m++) { String label = String.format("%02d", m + 1); result.add(builder.build(label)); String key = String.format("%02d", m + 1); String label = (m + 1) + "æ"; result.add(builder.build(key, label)); } } return result; server/services/src/main/java/com/doumee/service/business/impl/DriverInfoServiceImpl.java
@@ -246,7 +246,6 @@ IPage<DriverInfo> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper<DriverInfo> queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); pageWrap.getModel().setDeleted(Constants.ZERO); // 叿ºå§å/ææºå·ï¼å ³é®åæ¨¡ç³æ¥è¯¢ï¼ if (StringUtils.isNotBlank(pageWrap.getModel().getKeyword())) { @@ -282,7 +281,8 @@ queryWrapper.selectAll(DriverInfo.class) .select(" ( select ifnull(sum(r.OPT_TYPE * r.AMOUNT),0) from revenue r where r.MEMBER_TYPE = 1 and r.MEMBER_ID= t.id and r.VAILD_STATUS = 1 ) as memberAmount ") .selectAs(Category::getName,DriverInfo::getCarTypeName) .leftJoin(Category.class, Category::getId,DriverInfo::getCarType); .leftJoin(Category.class, Category::getId,DriverInfo::getCarType) .eq(DriverInfo::getDeleted, Constants.ZERO); queryWrapper.orderByDesc(DriverInfo::getId); PageData<DriverInfo> pageData = PageData.from(driverInfoMapper.selectPage(page, queryWrapper)); for (DriverInfo d : pageData.getRecords()) { @@ -560,8 +560,13 @@ driverInfoMapper.insert(newChange); saveDriverAttachments(newChange.getId(), request, now); // æ è®°åå²çåæ´çæ¬ä¸ºå é¤ driverInfoMapper.update(new UpdateWrapper<DriverInfo>().lambda() .set(DriverInfo::getDeleted, Constants.ONE) .set(DriverInfo::getUpdateTime, now) .eq(DriverInfo::getMemberId, memberId) .eq(DriverInfo::getVersionType, Constants.ONE) .eq(DriverInfo::getDeleted, Constants.ZERO) .ne(DriverInfo::getId, newChange.getId())); } else { // auditStatus=0/2ï¼ç´æ¥æ´æ°åæ´çæ¬ @@ -1881,6 +1886,9 @@ if (!driverId.equals(order.getAcceptDriver())) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "æ ææä½è¯¥è®¢å"); } if (Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å¼å¸¸è®¢åæ æ³è¿è¡ç¡®è®¤éè¾¾"); } // 3. ä¿åéè¾¾å¾ç Date now = new Date(); @@ -2271,7 +2279,13 @@ .eq(status != null, Orders::getStatus, status) .eq(Orders::getDeleted, Constants.ZERO) .orderByDesc(Orders::getAcceptTime); // å ³é®è¯æç´¢ï¼æ¶ä»¶äºº/æ¶ä»¶äººçµè¯æ¨¡ç³ã订åå·ç²¾å if (StringUtils.isNotBlank(model.getKeyword())) { String kw = model.getKeyword().trim(); wrapper.and(w -> w.like(Orders::getTakeUser, kw) .or().like(Orders::getTakePhone, kw) .or().like(Orders::getCode, kw)); } IPage<Orders> orderPage = ordersMapper.selectJoinPage(p, Orders.class, wrapper); List<DriverGrabOrderVO> voList = new ArrayList<>(); server/services/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -26,7 +26,9 @@ import java.util.Calendar; import java.util.Date; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Objects; @Service @@ -197,6 +199,22 @@ } @Override public Map<String, Integer> findPendingCount(Integer memberId) { Long waitClaim = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>().lambda() .eq(MemberCoupon::getMemberId, memberId) .eq(MemberCoupon::getStatus, Constants.CouponStatus.waitClaim.getKey()) .eq(MemberCoupon::getIsdeleted, Constants.ZERO)); Long waitUse = memberCouponMapper.selectCount(new QueryWrapper<MemberCoupon>().lambda() .eq(MemberCoupon::getMemberId, memberId) .eq(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) .eq(MemberCoupon::getIsdeleted, Constants.ZERO)); Map<String, Integer> result = new LinkedHashMap<>(); result.put("waitClaim", waitClaim != null ? waitClaim.intValue() : 0); result.put("waitUse", waitUse != null ? waitUse.intValue() : 0); return result; } @Override @Transactional(rollbackFor = {Exception.class, BusinessException.class}) public void claimCoupon(Integer memberId, Integer couponId) { // æ¥è¯¢è¯¥ä¼åçå¾ é¢å伿 å¸è®°å½ @@ -207,11 +225,6 @@ .eq(MemberCoupon::getIsdeleted, Constants.ZERO)); if (mc == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } // æ ¡éªä¼æ 叿¯å¦ææ Coupon coupon = couponMapper.selectById(couponId); if (coupon == null || coupon.getStatus() != Constants.ZERO) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "伿 叿 æ"); } // æ è®°å·²é¢åï¼è®¡ç®æææ Date now = new Date(); server/services/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -410,9 +410,9 @@ } } // æ ¹æ®openidæ¥è¯¢å½åç»å®çé¨åº if (StringUtils.isNotBlank(member.getOpenid())) { if (Objects.nonNull(member.getLoginShopId())) { ShopInfo bindShop = shopInfoMapper.selectOne(new QueryWrapper<ShopInfo>().lambda() .eq(ShopInfo::getOpenid, member.getOpenid()) .eq(ShopInfo::getId, member.getLoginShopId()) .eq(ShopInfo::getDeleted, Constants.ZERO) .last("limit 1")); if (bindShop != null) { @@ -725,6 +725,12 @@ ); } /** * æ³¨åæ»¡Xå¹´èµ é伿 å¸ï¼å®æ¶ä»»å¡è°ç¨ï¼ * è§åï¼æ ¹æ®è¿è¥é ç½® registerCouponYearsï¼æ»¡å å¹´èµ éï¼ãregisterCouponGiftCountï¼è³å¤èµ 鿬¡æ°ï¼ãregisterCouponIdï¼èµ é伿 å¸IDå表ï¼ï¼ * éåæææ®éä¼åï¼è®¡ç®æ³¨åå¹´éï¼æ¯æ»¡é 置年æ°èµ é䏿¬¡ï¼ç´¯è®¡èµ 鿬¡æ°ä¸è¶ è¿é ç½®ä¸éã * ä¾å¦ï¼é 置满2å¹´èµ éãè³å¤3次ï¼å注å第2/4/6å¹´åèµ é䏿¬¡ï¼å ±3次ã */ @Override public void giftRegisterCoupon() { // 1. 读åé ç½® @@ -753,11 +759,17 @@ return; } // 3. æ¥è¯¢æææ®éä¼å // 3. æ°æ®åºå±é¢è¿æ»¤ï¼æ³¨å满configYears䏿ªèµ æ»¡çæ®éä¼å Calendar cal = Calendar.getInstance(); cal.add(Calendar.YEAR, -configYears); Date minRegisterDate = cal.getTime(); List<Member> members = memberMapper.selectList(new QueryWrapper<Member>().lambda() .eq(Member::getDeleted, Constants.ZERO) .eq(Member::getStatus, Constants.ZERO) .eq(Member::getUserType, Constants.ZERO) .le(Member::getCreateTime, minRegisterDate) .lt(Member::getRegisterCouponGiftCount, maxGiftCount) .isNotNull(Member::getCreateTime)); Date now = new Date(); server/services/src/main/java/com/doumee/service/business/impl/OrdersServiceImpl.java
@@ -133,6 +133,8 @@ @Autowired private MemberCouponMapper memberCouponMapper; @Autowired private CouponMapper couponMapper; @Autowired private AreasBiz areasBiz; @@ -662,7 +664,7 @@ .le(MemberCoupon::getLimitPrice, totalPrice) .ge(MemberCoupon::getEndDate, now) .orderByDesc(MemberCoupon::getPrice) .orderByAsc(MemberCoupon::getEndDate)); .orderByAsc(MemberCoupon::getCreateDate)); result.setAvailableCoupons(availableCoupons); if (couponId == null) { @@ -1151,6 +1153,11 @@ if (Objects.isNull(order)) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } // å®ä»éé¢ = æ¯ä»éé¢ - 鿬¾éé¢ + é¾æè´¹ç¨ long pay = order.getPayAmount() != null ? order.getPayAmount() : 0L; long refund = order.getRefundAmount() != null ? order.getRefundAmount() : 0L; long overdue = order.getOverdueAmount() != null ? order.getOverdueAmount() : 0L; order.setPayAmount(pay - refund + overdue); OrderDetailVO vo = new OrderDetailVO(); vo.setOrder(order); @@ -1217,6 +1224,25 @@ for (OrderItemVO v:vo.getDetailList()) { v.setTypeName(category.getName()); } } // è¯ä»·ä¿¡æ¯ List<OrderComment> comments = orderCommentMapper.selectList(new QueryWrapper<OrderComment>().lambda() .eq(OrderComment::getOrderId, id) .eq(OrderComment::getDeleted, Constants.ZERO)); if (CollectionUtils.isNotEmpty(comments)) { for (OrderComment c : comments) { if (Constants.equalsInteger(c.getTargetType(), Constants.ONE)) { vo.setDepositScore(c.getScore()); } else if (Constants.equalsInteger(c.getTargetType(), Constants.TWO)) { vo.setTakeScore(c.getScore()); } else if (Constants.equalsInteger(c.getTargetType(), Constants.THREE)) { vo.setDriverScore(c.getScore()); } } vo.setCommentContent(comments.get(0).getContent()); vo.setCommentTime(comments.get(0).getCreateTime()); vo.setCommentImages(getFileUrls(id, Constants.FileType.COMMENT_ATTACH.getKey(), imgPrefix)); } // åæ¶/鿬¾ç¶ææ¶æ¥è¯¢éæ¬¾è®°å½ @@ -1655,7 +1681,8 @@ cal.set(Calendar.MINUTE, 0); cal.set(Calendar.SECOND, 0); cal.set(Calendar.MILLISECOND, 0); wrapper.ge(Orders::getFinishTime, cal.getTime()); wrapper.ge(Orders::getFinishTime, cal.getTime()) .eq(Orders::getStatus, Constants.OrderStatus.finished.getKey()); } } // å ³é®è¯æç´¢ï¼æ¶ä»¶äºº/æ¶ä»¶äººçµè¯æ¨¡ç³ã订åå·ç²¾å @@ -1737,6 +1764,8 @@ fillOverdueStatus(vo, o, details); // 伿 叿µæ£éé¢ vo.setDeductionAmount(o.getDeductionAmount()); // å¼å¸¸è®¢åæ è¯ vo.setAbnormalOrder(o.getExceptionStatus()); // å¯å¼ç¥¨éé¢ï¼æ¯ä»éé¢ - 鿬¾éé¢ï¼ if (model != null && model.getInvoiceStatus() != null && Constants.equalsInteger(model.getInvoiceStatus(), Constants.ONE)) { long payAmt = o.getPayAmount() != null ? o.getPayAmount() : 0L; @@ -1815,7 +1844,7 @@ .or(w3-> w3.eq(Orders::getType, Constants.ONE).eq(Orders::getDepositShopId, shopId) .eq(Orders::getStatus, Constants.OrderStatus.waitDeposit.getStatus())) .or(w2 -> w2.eq(Orders::getType, Constants.ONE).eq(Orders::getTakeShopId, shopId) .eq(Orders::getStatus, Constants.OrderStatus.arrived.getStatus()))) .in(Orders::getStatus, Constants.OrderStatus.arrived.getStatus(),Constants.OrderStatus.delivering.getStatus()))) ); } else { wrapper.and(w -> w.eq(Orders::getDepositShopId, shopId).or().eq(Orders::getTakeShopId, shopId)); @@ -1975,6 +2004,7 @@ vo.setUrgentAmount(order.getUrgentAmount()); vo.setIsUrgent(order.getIsUrgent()); vo.setActualPayAmount(Constants.equalsInteger(order.getPayStatus(), Constants.ONE)?order.getPayAmount():order.getEstimatedAmount()); vo.setDeductionAmount(order.getDeductionAmount()); // æ è®° vo.setExceptionStatus(order.getExceptionStatus()); @@ -1988,13 +2018,12 @@ vo.setPayCountdownMs(calcPayCountdownMs(order)); } //åºå· vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId()); if(order.getTakeShopId()!=null){ String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date()); String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0); String sort = order.getTakeShopId() + "-" + dateStr + "-" + autoNumStr; vo.setSortnumTake(sort); } // vo.setSortnum(Constants.formatIntegerNum(order.getDepositShopId())+"-"+order.getId()); String dateStr = new SimpleDateFormat("dd").format(order.getPayTime() != null ? order.getPayTime() : new Date()); String autoNumStr = String.format("%03d", order.getAutoNum() != null ? order.getAutoNum() : 0); String sort = order.getDepositShopId() + "-" + dateStr + "-" + autoNumStr; vo.setSortnum(sort); vo.setDepositShopId(order.getDepositShopId()); // åä»¶é¨åº if (order.getDepositShopId() != null) { ShopInfo depositShop = shopInfoMapper.selectById(order.getDepositShopId()); @@ -2282,16 +2311,71 @@ * ä¿ååæ¶è®¢åæä½æ¥å¿ */ private void restoreCoupon(Orders order) { // if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) { // return; // } // memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() // .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) // .set(MemberCoupon::getUseDate, null) // .set(MemberCoupon::getOrderId, null) // .eq(MemberCoupon::getId, order.getCouponId()) // .eq(MemberCoupon::getOrderId, order.getId()) // .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey())); if (order.getCouponId() == null || order.getDeductionAmount() == null || order.getDeductionAmount() <= 0) { return; } memberCouponMapper.update(new UpdateWrapper<MemberCoupon>().lambda() .set(MemberCoupon::getStatus, Constants.CouponStatus.claimed.getKey()) .set(MemberCoupon::getUseDate, null) .set(MemberCoupon::getOrderId, null) .eq(MemberCoupon::getId, order.getCouponId()) .eq(MemberCoupon::getOrderId, order.getId()) .eq(MemberCoupon::getStatus, Constants.CouponStatus.used.getKey())); } private void giftOrderCoupon(Integer memberId) { String orderCountStr = operationConfigBiz.getConfig().getOrderCouponOrderCount(); String giftCountStr = operationConfigBiz.getConfig().getOrderCouponGiftCount(); String couponIdsStr = operationConfigBiz.getConfig().getOrderCouponId(); if (StringUtils.isAnyBlank(orderCountStr, giftCountStr, couponIdsStr)) return; int orderCount = Integer.parseInt(orderCountStr); int maxGift = Integer.parseInt(giftCountStr); Member member = memberMapper.selectById(memberId); if (member == null) return; int gifted = member.getOrderCouponGiftCount() != null ? member.getOrderCouponGiftCount() : 0; if (gifted >= maxGift) return; long completedCount = ordersMapper.selectCount(new QueryWrapper<Orders>().lambda() .eq(Orders::getMemberId, memberId) .eq(Orders::getDeleted, Constants.ZERO) .notIn(Orders::getStatus, Constants.OrderStatus.waitPay.getKey(), Constants.OrderStatus.waitDeposit.getKey())); if (completedCount < orderCount || completedCount % orderCount != 0) return; String[] idArr = couponIdsStr.split(","); Date now = new Date(); for (String idStr : idArr) { String trimmed = idStr.trim(); if (StringUtils.isBlank(trimmed)) continue; Coupon coupon = couponMapper.selectById(Integer.valueOf(trimmed)); if (coupon == null || Constants.equalsInteger(coupon.getIsdeleted(), Constants.ONE)) continue; MemberCoupon mc = new MemberCoupon(); mc.setCouponId(coupon.getId()); mc.setMemberId(memberId); mc.setStatus(Constants.CouponStatus.waitClaim.getKey()); Calendar validCal = Calendar.getInstance(); validCal.add(Calendar.DAY_OF_MONTH, coupon.getPushDays() != null ? coupon.getPushDays() : 7); mc.setValidDate(validCal.getTime()); mc.setName(coupon.getName()); mc.setInfo(coupon.getInfo()); mc.setType(coupon.getType()); mc.setLimitPrice(coupon.getLimitPrice()); mc.setPrice(coupon.getPrice()); mc.setGetMethod(coupon.getGetMethod()); mc.setCouponType(coupon.getCouponType()); mc.setPushDays(coupon.getPushDays()); mc.setValidDays(coupon.getValidDays()); mc.setIsdeleted(Constants.ZERO); mc.setCreateDate(now); mc.setEditDate(now); memberCouponMapper.insert(mc); } member.setOrderCouponGiftCount(gifted + 1); memberMapper.updateById(member); } private void saveCancelLog(Orders order, Constants.OrderLogType logType, String reason, Integer memberId) { @@ -2406,7 +2490,7 @@ refund.setRefundTime(now); ordersRefundMapper.updateById(refund); // 鿬¾æåï¼æ§è¡æ£æ¬¾ processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct); //processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct); } else if (com.wechat.pay.java.service.refund.model.Status.PROCESSING.equals(refundStatus)) { refund.setStatus(Constants.ZERO); // 鿬¾ä¸ï¼çåè° ordersRefundMapper.updateById(refund); @@ -2428,7 +2512,6 @@ // 7. æ´æ°è®¢åï¼æ è®°å·²æå¨é款ï¼ç´¯å 鿬¾éé¢ ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getManualRefund, Constants.ONE) .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + dto.getRefundAmount()) .set(Orders::getUpdateTime, now) .eq(Orders::getId, order.getId())); } @@ -2511,10 +2594,11 @@ Long driverDeduct = deductJson.getLong("driverDeduct"); processManualRefundDeduction(order, depositShopDeduct, takeShopDeduct, driverDeduct); // æ 记订åå·²æå¨é款ï¼ç´¯å 鿬¾éé¢ // æ 记订åå·²æå¨é款ï¼ç´¯å 鿬¾éé¢ï¼åæ¥æ´æ°totalAmount ordersMapper.update(new UpdateWrapper<Orders>().lambda() .set(Orders::getManualRefund, Constants.ONE) .setSql(" REFUND_AMOUNT = IFNULL(REFUND_AMOUNT, 0) + " + refundRecord.getRefundAmount()) .setSql(" TOTAL_AMOUNT = IFNULL(TOTAL_AMOUNT, 0) - " + refundRecord.getRefundAmount()) .set(Orders::getUpdateTime, new Date()) .eq(Orders::getId, order.getId())); } @@ -3262,6 +3346,8 @@ sendOrderNotice(order.getMemberId(), Constants.MemberOrderNotify.WAIT_PICKUP_REMIND, order.getId(), "orderNo", order.getCode(), "shopName", shopName); } // å¯åæåèµ é伿 å¸ giftOrderCoupon(order.getMemberId()); } else if (Constants.equalsInteger(status, Constants.OrderStatus.arrived.getStatus())) { // å¼å°å¯å + æ åä»¶é¨åº â æ æ³æ ¸éï¼å®¢æ·èªåï¼æ é¨åºæä½ï¼ if (Constants.equalsInteger(order.getType(), Constants.ONE) && order.getTakeShopId() == null) { @@ -3881,14 +3967,16 @@ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), "æ ¸éç æ æ"); } // ä» å¼å°å¯å + æåä»¶é¨åº + æ´¾éä¸(4) 坿 ¸é if (!Constants.equalsInteger(order.getType(), Constants.ONE)) { // ä» å¼å°å¯å + æåä»¶é¨åº + æ´¾éä¸(4) 坿 ¸éï¼å¼å¸¸è®¢åå è®¸ï¼ if (!Constants.equalsInteger(order.getType(), Constants.ONE) && !Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä» å¼å°å¯åè®¢åæ¯æå¸æºæ ¸é"); } if (order.getTakeShopId() == null) { if (order.getTakeShopId() == null && !Constants.equalsInteger(order.getExceptionStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "è¯¥è®¢åæ åä»¶é¨åºï¼æ é叿ºæ ¸é"); } if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())) { if (!Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus()) && !Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.deposited.getStatus())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "å½å订åç¶æä¸å è®¸æ ¸é"); } @@ -4601,7 +4689,7 @@ sendSmsNotify(member != null ? member.getTelephone() : null, Constants.SmsNotify.MEMBER_CANCELLED, "orderNo", order.getCode()); } restoreCoupon(order); count++; } catch (Exception e) { log.error("åæ¶è¶ æ¶è®¢åå¼å¸¸, orderId={}, error={}", order.getId(), e.getMessage()); @@ -5019,29 +5107,26 @@ } targetLat = order.getDepositLat(); targetLgt = order.getDepositLgt(); } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())) { // status=5 é¨åºå®ææ ¸é if (Constants.equalsInteger(order.getType(), Constants.ZERO)) { // å°±å°åå â 对æ¯åä»¶é¨åº if (!Constants.equalsInteger(order.getDepositShopId(), userId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); } targetLat = order.getDepositLat(); targetLgt = order.getDepositLgt(); } else { // å¼å°åå â 对æ¯åä»¶é¨åº if (!Constants.equalsInteger(order.getTakeShopId(), userId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); } targetLat = order.getTakeLat(); targetLgt = order.getTakeLgt(); } else if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus())&&Constants.equalsInteger(order.getType(), Constants.ZERO)) { // å°±å°åå â 对æ¯åä»¶é¨åº if (!Constants.equalsInteger(order.getDepositShopId(), userId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); } targetLat = order.getDepositLat(); targetLgt = order.getDepositLgt(); } else if ((Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.delivering.getStatus())||Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.arrived.getStatus()))&&Constants.equalsInteger(order.getType(), Constants.ONE)) { // å¼å°åå â 对æ¯åä»¶é¨åº if (!Constants.equalsInteger(order.getTakeShopId(), userId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); } targetLat = order.getTakeLat(); targetLgt = order.getTakeLgt(); } else { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "订åç¶æä¸å è®¸æ¤æä½"); } } else if (Constants.equalsInteger(userType, Constants.ONE)) { // 叿ºæä½ if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.deposited.getStatus())) { if (Constants.equalsInteger(order.getStatus(), Constants.OrderStatus.accepted.getStatus())) { // status=2 叿ºåä»¶ if (!Constants.equalsInteger(order.getAcceptDriver(), userId)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "æ ææä½è¯¥è®¢å"); @@ -5082,8 +5167,8 @@ if (original.getTakeShopId() != null) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²å ³èåä»¶é¨åºï¼ä¸æ¯æå¼å¸¸å¤ç"); } if (!Constants.equalsInteger(original.getStatus(), Constants.FIVE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä» æ¯æå·²éè¾¾ç¶æç订å"); if (!Constants.equalsInteger(original.getStatus(), Constants.OrderStatus.delivering.getKey())) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "ä» æ¯æé éä¸ç订åè¿è¡å¼å¸¸å¤ç"); } if (Constants.equalsInteger(original.getExceptionStatus(), Constants.ONE)) { throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "该订åå·²å¤çè¿å¼å¸¸ï¼è¯·å¿é夿ä½"); @@ -5299,4 +5384,27 @@ } } @Override public ManualRefundDetailVO getManualRefundDetail(Integer orderId) { OrdersRefund refundRecord = ordersRefundMapper.selectOne(new QueryWrapper<OrdersRefund>().lambda() .eq(OrdersRefund::getOrderId, orderId) .eq(OrdersRefund::getType, Constants.FOUR) .eq(OrdersRefund::getDeleted, Constants.ZERO) .orderByDesc(OrdersRefund::getCreateTime) .last("limit 1")); if (refundRecord == null) { throw new BusinessException(ResponseStatus.DATA_EMPTY); } ManualRefundDetailVO vo = new ManualRefundDetailVO(); vo.setRefundAmount(refundRecord.getRefundAmount()); if (StringUtils.isNotBlank(refundRecord.getDeductInfo())) { JSONObject json = JSONObject.parseObject(refundRecord.getDeductInfo()); vo.setDepositShopDeduct(json.getLong("depositShopDeduct")); vo.setTakeShopDeduct(json.getLong("takeShopDeduct")); vo.setDriverDeduct(json.getLong("driverDeduct")); } vo.setRefundRemark(refundRecord.getRefundRemark()); return vo; } } server/services/src/main/java/com/doumee/service/business/impl/ShopInfoServiceImpl.java
@@ -19,6 +19,7 @@ import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.MultifileMapper; import com.doumee.dao.business.OrdersMapper; import com.doumee.dao.business.OtherOrdersMapper; import com.doumee.dao.business.PricingRuleMapper; import com.doumee.dao.business.RevenueMapper; import com.doumee.dao.business.ShopInfoMapper; @@ -27,6 +28,7 @@ import com.doumee.dao.business.model.Member; import com.doumee.dao.business.model.Multifile; import com.doumee.dao.business.model.Orders; import com.doumee.dao.business.model.OtherOrders; import com.doumee.dao.business.model.PricingRule; import com.doumee.dao.business.model.Revenue; import com.doumee.dao.business.model.ShopInfo; @@ -122,6 +124,9 @@ @Autowired private CategoryMapper categoryMapper; @Autowired private OtherOrdersMapper otherOrdersMapper; @Override public Integer create(ShopInfo shopInfo) { @@ -342,6 +347,8 @@ newChange.setCreateTime(now); newChange.setUpdateTime(now); newChange.setRegionMemberId(member.getId()); newChange.setRevenueShareConfig(changeVersion.getRevenueShareConfig()); newChange.setDeliveryArea(changeVersion.getDeliveryArea()); setDepositAmountFromPricingRule(newChange); shopInfoMapper.insert(newChange); @@ -564,6 +571,7 @@ changeVersion.setAuditUserId(auditDTO.getAuditUser()); changeVersion.setRevenueShareConfig(revenueShareConfig); changeVersion.setUpdateTime(now); setDefaultDeliveryRange(changeVersion); shopInfoMapper.updateById(changeVersion); // æ è®°åå²çåæ´çæ¬ä¸ºå é¤ @@ -1213,8 +1221,20 @@ vo.setTagId(tag.getId()); vo.setTagName(tag.getName()); vo.setShopCount(count != null ? count.intValue() : 0); vo.setSortnum(tag.getSortnum()); result.add(vo); } // æé¨åºæ°éååºï¼ç¸åæ¶ææåºç éåº result.sort((a, b) -> { int cmp = Integer.compare( b.getShopCount() != null ? b.getShopCount() : 0, a.getShopCount() != null ? a.getShopCount() : 0); if (cmp != 0) return cmp; return Integer.compare( b.getSortnum() != null ? b.getSortnum() : 0, a.getSortnum() != null ? a.getSortnum() : 0); }); // æ»æ°æ¾å¨å表第ä¸ä¸ª Long totalCount = shopInfoMapper.selectCount(baseQw); @@ -1396,6 +1416,7 @@ throw new BusinessException(ResponseStatus.DATA_EMPTY); } ShopCenterVO vo = new ShopCenterVO(); vo.setId(shop.getId()); vo.setShopName(shop.getName()); vo.setLinkName(shop.getLinkName()); vo.setCompanyType(shop.getCompanyType()); @@ -1597,14 +1618,34 @@ .count(); vo.setFinishedOrderCount((int) finishedCount); // æ»è¥æ¶éé¢ = sum(totalAmount - refundAmount) long totalRevenue = orders.stream() // æ»è¥æ¶éé¢ = sum(æ¯ä»éé¢ - 鿬¾éé¢) + 龿éé¢ long baseRevenue = orders.stream() .mapToLong(o -> { long total = o.getTotalAmount() != null ? o.getTotalAmount() : 0L; long pay = o.getPayAmount() != null ? o.getPayAmount() : 0L; long refund = o.getRefundAmount() != null ? o.getRefundAmount() : 0L; return total - refund; return pay - refund; }).sum(); vo.setTotalRevenue(totalRevenue); // æ¥è¯¢è¯¥é¨åºåä¸çé¾æè´¹ç¨ï¼ä»other_orders表è·åï¼type=2å·²æ¯ä»ï¼ QueryWrapper<OtherOrders> overdueQw = new QueryWrapper<>(); overdueQw.lambda() .eq(OtherOrders::getDeleted, Constants.ZERO) .eq(OtherOrders::getType, Constants.TWO) .eq(OtherOrders::getPayStatus, Constants.ONE) .inSql(OtherOrders::getOrderId, "SELECT id FROM orders WHERE DELETED = 0 AND (DEPOSIT_SHOP_ID = " + shopId + " OR TAKE_SHOP_ID = " + shopId + ")"); if (query.getStartDate() != null) { overdueQw.lambda().ge(OtherOrders::getCreateTime, query.getStartDate()); } if (query.getEndDate() != null) { overdueQw.lambda().le(OtherOrders::getCreateTime, Utils.Date.getEnd(query.getEndDate())); } List<OtherOrders> overdueOrders = otherOrdersMapper.selectList(overdueQw); long overdueTotal = overdueOrders.stream() .mapToLong(o -> o.getPayAccount() != null ? o.getPayAccount() : 0L) .sum(); vo.setTotalRevenue(baseRevenue + overdueTotal); // é¨åºåæéé¢ long shopFee = 0L; server/web/src/main/java/com/doumee/api/web/MemberCouponApi.java
@@ -14,6 +14,8 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import java.util.Map; @Slf4j @Api(tags = "ä¼å伿 å¸") @RestController @@ -35,6 +37,16 @@ } @LoginRequired @ApiOperation(value = "å¾ é¢å/å¾ ä½¿ç¨æ°é", notes = "è§æ ç¨") @GetMapping("/pendingCount") @ApiImplicitParams({ @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "ç¨æ·tokenå¼", required = true), }) public ApiResponse<Map<String, Integer>> pendingCount() { return ApiResponse.success("æä½æå", memberCouponService.findPendingCount(getMemberId())); } @LoginRequired @ApiOperation(value = "é¢å伿 å¸", notes = "å°ç¨åºç«¯") @GetMapping("/claim") @ApiImplicitParams({ server/web/src/main/java/com/doumee/api/web/PaymentCallback.java
@@ -202,7 +202,8 @@ log.info("鿬¾è®°å½ç¶æå·²æ´æ°, refundRecordId={}, status={}", refundRecord.getId(), refundRecord.getStatus()); // æå¨é款(type=4)鿬¾æå â æ§è¡æ£æ¬¾ if (Status.SUCCESS.equals(refundStatus) && Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) { if (Status.SUCCESS.equals(refundStatus) && Constants.equalsInteger(refundRecord.getType(), Constants.FOUR)) { try { ordersService.processManualRefundCallback(refundRecord); } catch (Exception ex) {