From ae1471f378f399f76518539ec8992e64a3673436 Mon Sep 17 00:00:00 2001 From: 陶杰 <1378534974@qq.com> Date: 星期三, 08 一月 2025 15:26:06 +0800 Subject: [PATCH] 1.订单提交:订单最小金额配置 --- src/main/java/com/mzl/flower/service/payment/OrderService.java | 306 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 files changed, 287 insertions(+), 19 deletions(-) diff --git a/src/main/java/com/mzl/flower/service/payment/OrderService.java b/src/main/java/com/mzl/flower/service/payment/OrderService.java index 68f2395..2dcfedd 100644 --- a/src/main/java/com/mzl/flower/service/payment/OrderService.java +++ b/src/main/java/com/mzl/flower/service/payment/OrderService.java @@ -12,8 +12,11 @@ import com.mzl.flower.config.security.SecurityUtils; import com.mzl.flower.constant.Constants; import com.mzl.flower.dto.PriceDTO; +import com.mzl.flower.dto.request.comment.QueryFlowerCommentDTO; import com.mzl.flower.dto.request.menber.MemberGrowthRecordDTO; import com.mzl.flower.dto.request.payment.*; +import com.mzl.flower.dto.response.comment.FlowerCommentVO; +import com.mzl.flower.dto.response.coupon.CouponRecordVO; import com.mzl.flower.dto.response.flower.FlowerCartListDTO; import com.mzl.flower.dto.response.flower.FlowerCartListWrapDTO; import com.mzl.flower.dto.response.flower.FlowerDTO; @@ -42,6 +45,8 @@ import com.mzl.flower.mapper.system.UserWechatMapper; import com.mzl.flower.mapper.warehouse.WarehouseLocationMapper; import com.mzl.flower.service.BaseService; +import com.mzl.flower.service.ConfigParamService; +import com.mzl.flower.service.comment.FlowerCommentService; import com.mzl.flower.service.coupon.CouponRecordService; import com.mzl.flower.service.flower.FlowerService; import com.mzl.flower.service.menber.MemberGrowthRecordService; @@ -50,6 +55,7 @@ import com.mzl.flower.service.system.CodeService; import com.mzl.flower.service.system.WeChatService; import com.mzl.flower.service.transport.TransportService; +import com.mzl.flower.utils.ExcelExportUtil; import com.mzl.flower.utils.UUIDGenerator; import com.wechat.pay.java.core.util.GsonUtil; import io.micrometer.core.instrument.util.StringUtils; @@ -60,15 +66,17 @@ import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.ObjectUtils; +import javax.servlet.http.HttpServletResponse; import java.math.BigDecimal; import java.math.RoundingMode; +import java.net.URLEncoder; import java.time.LocalDate; import java.time.LocalDateTime; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; +import java.time.LocalTime; +import java.util.*; +import java.util.stream.Collectors; @Service @Transactional @@ -160,6 +168,11 @@ @Autowired private CouponRecordService couponRecordService; + @Autowired + private FlowerCommentService flowerCommentService; + + @Autowired + private ConfigParamService configParamService; public void changeFlower2Cart(CartSaveDTO dto) { String userId = SecurityUtils.getUserId(); @@ -192,7 +205,7 @@ Integer completeNumToday=getFlowerCompleteNumToday(userId,c.getFlowerId()); Integer tmp=completeNumToday+c.getNum(); if(null!=tmp && null!=flowerDetail.getLimited() - && tmp.compareTo(flowerDetail.getLimited())>0){ + && tmp.compareTo(flowerDetail.getLimited())>0){ throw new ValidationException("当天的订单的花数量加上购物车的数量不能超过限售数量!"); } @@ -204,7 +217,7 @@ // 限购 1.首先查看购物车中的数量是否已经超过限售数量 if(null!=c.getNum() && null!=flowerDetail.getLimited() - && c.getNum().compareTo(flowerDetail.getLimited())>0){ + && c.getNum().compareTo(flowerDetail.getLimited())>0){ throw new ValidationException("数量不能超过限售数量!"); } @@ -212,7 +225,7 @@ Integer completeNumToday=getFlowerCompleteNumToday(userId,c.getFlowerId()); Integer tmp=completeNumToday+c.getNum(); if(null!=tmp && null!=flowerDetail.getLimited() - && tmp.compareTo(flowerDetail.getLimited())>0){ + && tmp.compareTo(flowerDetail.getLimited())>0){ throw new ValidationException("当天的订单的花数量加上购物车的数量不能超过限售数量!"); } @@ -443,7 +456,7 @@ } } - public Map commitOrder(OrderCommitDTO dto, PreOrderDTO p, Map<Long, PriceDTO> priceMap) { + public Map commitOrder(OrderCommitDTO dto, PreOrderDTO p, Map<Long, PriceDTO> priceMap) throws Exception { String userId = SecurityUtils.getUserId(); p.getFlowers().forEach(flower -> { // 限购数量 鲜花数量校验 @@ -485,6 +498,19 @@ usePointGoods(order.getId(), goodsRecordIdList);//使用积分商品兑换券 order.create(userId); + // 根据当前的时间判断,如果时间大于当天的下午17:00 ,那么日期则为下一天的日期,否则为当天日期 + if(null!=order.getCreateTime()){ + LocalDateTime createDateTime = order.getCreateTime(); + LocalDate createDate = createDateTime.toLocalDate(); + LocalDateTime today1700 = createDateTime.with(LocalTime.of(17, 0)); + // 比较时间是否大于当天的 17:00 + if (createDateTime.isAfter(today1700)) { + // 如果大于 17:00,设置为下一天的日期 + createDate = createDate.plusDays(1); + } + order.setCreateDateSta(createDate); + } +// order.setCreateDate(); order.setRemarks(dto.getRemarks()); order.setSpecialNeeds(dto.getSpecialNeeds()); order.setStatusBackend(Constants.ORDER_STATUS_BACKEND.PENDING.name()); @@ -495,7 +521,7 @@ order.setMemberName(p.getMemberName()); order.setMemberDiscountType(p.getMemberDiscountType()); order.setMemberDiscountRatio(p.getMemberDiscountRatio()); - order.setMemberCouponAmount(p.getMemberDiscountAmount()); + order.setMemberDiscountAmount(p.getMemberDiscountAmount()); order.setFlowerAmount(p.getTotalMemberAmount());//使用会员价总价 order.setPackingFee(p.getPacking()); @@ -517,9 +543,26 @@ totalAmount = new BigDecimal(0); } totalAmount = totalAmount.add(p.getPacking()).add(transportFee); - if(totalAmount.doubleValue() <= 0){//假如总价小于等于0,则支付0.01元 - totalAmount = new BigDecimal(0.01); + + // 判断最低金额如果小于配置的钱,则不能提交 + String paramGroup = "orderpay"; + String paramKey = "order_min_fee"; + String baseString = configParamService.getBaseString(paramGroup, paramKey); + if(StringUtils.isNotEmpty(baseString)){ + // 判断类型是否错误,可转换成BigDecimal + try { + BigDecimal minFee = new BigDecimal(baseString); + if(totalAmount.compareTo(minFee) < 0){ + throw new ValidationException("订单金额不能低于"+minFee+"元"); + } + } catch (NumberFormatException e) { + log.error("订单金额配置有误,请检查配置", e); + throw new ValidationException("订单金额配置有误,请检查配置"); + } } +// if(totalAmount.doubleValue() <= 0){//假如总价小于等于0,则支付0.01元 +// totalAmount = new BigDecimal("0.01"); +// } order.setTotalAmount(totalAmount); order.setCustomer(address.getName()); @@ -641,7 +684,7 @@ return new BigDecimal(0); } - if(couponAmount.doubleValue() >= totalAmount.doubleValue()){ + if(couponAmount.compareTo(totalAmount) >= 0){ return price; } if(isLastOne){//最后的商品使用优惠券剩下的面值 @@ -911,6 +954,10 @@ orderIds.add(o.getId()); OrderPlatformListDTO p = new OrderPlatformListDTO(); + //增加订单扎数 + Integer sumNumByOrderId = orderItemMapper.getSumNumByOrderId(o.getId()); + o.setSaleNum(sumNumByOrderId); + BeanUtils.copyProperties(o, p); result.add(p); } @@ -1098,6 +1145,15 @@ List<OrderPointGoodsListDTO> pointGoodsList = orderMapper.getPointGoodsList(id); dto.setPointGoodsList(pointGoodsList); + //判断优惠券ID是否为空 用户优惠券id + if(StringUtils.isNotBlank(o.getMemberCouponId())){ + CouponRecordVO couponRecordVO = couponRecordService.getCouponRecordById(o.getMemberCouponId()); + if(!ObjectUtils.isEmpty(couponRecordVO)){ + dto.setCouponDiscountType(couponRecordVO.getCouponDiscountType()); + dto.setMinOrderAmount("满"+couponRecordVO.getMinOrderAmount()); + } + } + return dto; } @@ -1122,6 +1178,7 @@ new QueryWrapper<OrderItem>().eq("order_id", id)); Map<Long, String> stationMap = prepareStationMap(); + Map<String, FlowerCommentVO> commentMap=prepareCommentMap(id); List<OrderItemListDTO> result = new ArrayList<>(); for (OrderItem oi : ls) { @@ -1130,14 +1187,43 @@ dto.setStationName(stationMap.get(oi.getStationId())); + // 评论 + final FlowerCommentVO flowerCommentVO = commentMap.get(oi.getId()); + copyCommentInfo(dto,flowerCommentVO); + result.add(dto); } return result; } + private Map<String, FlowerCommentVO> prepareCommentMap(String orderId) { + QueryFlowerCommentDTO queryFlowerCommentDTO = new QueryFlowerCommentDTO(); + queryFlowerCommentDTO.setOrderId(orderId); + final List<FlowerCommentVO> list = flowerCommentService.getList(queryFlowerCommentDTO); + if (list == null || list.isEmpty()) { + return Collections.emptyMap(); + } + // 将 List 转换为 Map,其中 key 为 FlowerCommentVO 的 id + return list.stream().collect(Collectors.toMap(FlowerCommentVO::getOrderItemId, item -> item)); + } + + + private void copyCommentInfo(OrderItemListDTO dto,FlowerCommentVO flowerCommentVO){ + if(null != dto && null!=flowerCommentVO){ + dto.setCommentGrade(flowerCommentVO.getCommentGrade()); + dto.setComment(flowerCommentVO.getComment()); + dto.setCommentImages(flowerCommentVO.getCommentImages()); + dto.setAnonymityFalg(flowerCommentVO.getAnonymityFalg()); + } + } + public List<Order> autoReceive() { - int days = -5; //5天前的订单自动收货 + String paramGroup = "order"; + String paramKey = "order_auto_receive"; + String baseString = configParamService.getBaseString(paramGroup, paramKey); + int days = -Integer.parseInt(baseString); +// int days = -5; //5天前的订单自动收货 LocalDateTime endTime = LocalDateTime.now().plusDays(days); List<Order> ls = orderMapper.getOrderForAutoReceive(endTime); if (ls == null || ls.size() == 0) { @@ -1382,7 +1468,7 @@ return dto; } - public void processAbnormalOrder(String id) { + public void processAbnormalOrder(String id) throws Exception { Order o = orderMapper.selectById(id); String transferId = o.getTransferId(); if (StringUtils.isNotEmpty(transferId)) { @@ -1416,18 +1502,18 @@ deductAmount = deductAmount.add(a.getDeductAmount()); } + o.setTransferTime(LocalDateTime.now()); + o.update(SecurityUtils.getUserId()); + transferId = "NoNeedRefund"; if (deductAmount.doubleValue() > 0) { transferId = paymentV3Service.refundOrderSub(o, deductAmount); } o.setTransferId(transferId); - o.setTransferTime(LocalDateTime.now()); - o.update(SecurityUtils.getUserId()); orderMapper.updateById(o); - } - public void processLevelDown(OrderReduceDTO dto) { + public void processLevelDown(OrderReduceDTO dto) throws Exception { Order o = orderMapper.selectById(dto.getId()); String transferId = o.getTransferId(); if (StringUtils.isNotEmpty(transferId)) { @@ -1575,7 +1661,189 @@ } public Integer getFlowerCompleteNumToday(String userId,Long flowerId){ - Integer completeNum= orderMapper.getFlowerCompleteNumToday(userId,flowerId); + + int completeNum = 0; + // 获取当前时间 + LocalDateTime now = LocalDateTime.now(); + // 构造今天的17:00 + LocalDateTime todayAtFivePM = LocalDateTime.of(LocalDate.now(), LocalTime.of(17, 0)); + // 定义时间区间的开始和结束时间 + LocalDateTime startTime; + LocalDateTime endTime; + + if (now.isAfter(todayAtFivePM)) { + // 当前时间大于今天的17:00,取今天17:00到明天17:00的区间 + startTime = todayAtFivePM; + endTime = todayAtFivePM.plusDays(1); // 明天的17:00 + } else { + // 当前时间小于今天的17:00,取昨天17:00到今天17:00的区间 + startTime = todayAtFivePM.minusDays(1); // 昨天的17:00 + endTime = todayAtFivePM; // 今天的17:00 + } + + // 调用Mapper方法,传递开始时间和结束时间 + completeNum = orderMapper.getFlowerCompleteNumWithinTimeRange(userId, flowerId, startTime, endTime); + return completeNum; + + + } + + @Transactional + public String copyOrder(String id) { + List<OrderItem> ls = orderItemMapper.selectList( + new QueryWrapper<OrderItem>().eq("order_id", id)); + StringBuilder sb=new StringBuilder(); + ls.stream().forEach(orderItem -> { + Cart cart = null; + final Long flowerId = orderItem.getFlowerId(); + final Integer num = orderItem.getNum(); + final String userId=orderItem.getCreateBy(); + // 查看当前的花是否已经下架 + Flower flower = flowerMapper.selectById(flowerId); + // 查看当前的花的限购 + final Integer limited = flower.getLimited(); + + // 查看当前购物车里面是否已经存在当前花 + cart = cartMapper.selectOne(new QueryWrapper<Cart>() + .eq("create_by", orderItem.getCreateBy()).eq("flower_id",flowerId)); + + if(null==cart){ + cart = new Cart(); + cart.setFlowerId(flowerId); + cart.setNum(0); + cart.create(orderItem.getCreateBy()); + } + + if (!flower.getStatus().equals(Constants.FLOWER_STATUS.UP.name())) { + sb.append(flower.getName() + "已下架"); + }else if(flower.getStatus().equals(Constants.FLOWER_STATUS.UP.name())){ + // 未下架库存逻辑控制 + Integer tmpNum=cart.getNum()+num; + //查看当前的库存 + if (null!=flower.getStock() && flower.getStock() > 0 && flower.getStock().compareTo(tmpNum) >= 0) { + // 库存充足 + cart.setNum(tmpNum); + } else if (null!=flower.getStock() && flower.getStock() > 0 && flower.getStock().compareTo(tmpNum) < 0) { + // 库存不足,剩多少给多少 + cart.setNum(flower.getStock()); + sb.append(flower.getName() + "购物车的总数超过库存,已调整成库存数!"); + }else { + sb.append(flower.getName() + "已无库存"); + } + + // 限购控制,如果当前的购物车的数量大于限购的话,则需要控制 + if(null!=limited && limited>0){ + Integer buyedNum= getFlowerCompleteNumToday(userId,flowerId); + Integer todayNum=cart.getNum()+buyedNum; + // + if(todayNum>limited){ + cart.setNum(limited-buyedNum<=0?0:limited-buyedNum); + sb.append(flower.getName() + "购物车的总数超过限购,已调整成未限购数!"); + } + } + + } + + if(null!=cart){ + // 插入购物车 + if(null!=cart.getId()){ + // 新增 + cartMapper.updateById(cart); + }else{ + // 更新 + cartMapper.insert(cart); + } + } + + }); + + return sb.toString(); + + } + + public void operationUpdate(OrderAddressUpdateDTO dto) { + if (StringUtils.isBlank(dto.getId())) { + throw new ValidationException("id不能为空"); + } + Order order = orderMapper.selectById(dto.getId()); + if (ObjectUtils.isEmpty(order)) { + throw new ValidationException("订单不存在"); + } + if (StringUtils.isBlank(dto.getCustomerAddress()) || StringUtils.isBlank(dto.getCustomerCity()) || StringUtils.isBlank(dto.getCustomerProvince()) || StringUtils.isBlank(dto.getCustomerRegion())) { + throw new ValidationException("地址信息不能为空"); + } + if (StringUtils.isBlank(dto.getCustomerTel())) { + throw new ValidationException("联系方式不能为空"); + } + BeanUtils.copyProperties(dto, order); + order.update(SecurityUtils.getUserId()); + orderMapper.updateById(order); + } + + private List<OrderListExportDTO> getOrderExportListBase(OrderQueryDTO dto) { + dto.setStartDate(parseLocalDateTime(dto.getStartDateStr(), true)); + dto.setEndDate(parseLocalDateTime(dto.getEndDateStr(), false)); + dto.setCreateStartDate(parseLocalDateTime(dto.getCreateStartDateStr(), 17, 0, 0, -1)); + dto.setCreateEndDate(parseLocalDateTime(dto.getCreateEndDateStr(), 17, 0, 0, 0)); + List<OrderListExportDTO> ls = orderMapper.selectOrderExportList(dto); + return ls; + } + + public void exportOrderDetail(HttpServletResponse response, OrderQueryDTO dto) { + List<OrderListExportDTO> ls = getOrderExportListBase( dto); + String[] rowsName = new String[]{"序号","订单号", "用户账号", "收货人", "收货人电话", "收货地址", "订单金额" + , "底价","销售扎数", "订单状态", "下单时间", "合伙人", "库位", "特殊需求", "备注"}; + List<Object[]> dataList = new ArrayList<>(); + int sn = 1; + for (OrderListExportDTO o : ls) { + Object[] objs = new Object[rowsName.length]; + int a = 0; + objs[a++] = sn; + objs[a++] = o.getOrderNo(); + objs[a++] = o.getCreateName(); + objs[a++] = o.getCustomer(); + objs[a++] = o.getCustomerTel(); + objs[a++] = o.getCustomerAddress(); + objs[a++] = o.getTotalAmount(); + objs[a++] = o.getSupplierAmount(); + objs[a++] = o.getSaleNum(); + objs[a++] = o.getStatusBackendStr(); + objs[a++] = o.getCreateTime(); + objs[a++] = o.getPartnerName(); + objs[a++] = o.getWarehouseLocationCode(); + objs[a++] = o.getSpecialNeedsStr(); + objs[a++] = o.getRemarks(); + dataList.add(objs); + + sn++; + } + ExcelExportUtil excelExportUtil = new ExcelExportUtil("订单列表", rowsName, dataList, response); + try { + response.addHeader("filename", URLEncoder.encode("订单列表.xls", "UTF-8")); + response.addHeader("Access-Control-Expose-Headers", "filename"); + excelExportUtil.export(); + } catch (Exception e) { + log.error(e.getMessage(), e); + } + + } + + public void exportPartnerOrderList(HttpServletResponse response, OrderQueryDTO dto) { + Partner p = getCurrentPartner(); + dto.setPartnerId(p.getId()); + exportOrderDetail(response, dto); + } + + public void refreshDate() { + List<Order> allOrderList= orderMapper.selectAllDateList(); + + allOrderList.forEach(order -> { + orderMapper.updatePaymentCreateDate(order); + }); + } + + public Order getOrderInfoById(String id) { + return orderMapper.selectById(id); } } -- Gitblit v1.9.3