package com.peanut.modules.book.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.toolkit.IdWorker; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.peanut.common.utils.DateUtils; import com.peanut.common.utils.PageUtils; import com.peanut.common.utils.R; import com.peanut.config.Constants; import com.peanut.config.DelayQueueConfig; import com.peanut.modules.book.service.*; import com.peanut.modules.book.service.BuyOrderService; import com.peanut.modules.book.service.CityService; import com.peanut.modules.book.service.CountyService; import com.peanut.modules.book.service.ExpressOrderService; import com.peanut.modules.book.service.MyUserService; import com.peanut.modules.book.service.ProvinceService; import com.peanut.modules.book.service.TransactionDetailsService; import com.peanut.modules.book.service.UserAddressService; import com.peanut.modules.book.to.UserOrderDto; import com.peanut.modules.book.vo.UserAddressVo; import com.peanut.modules.book.vo.request.BuyOrderListRequestVo; import com.peanut.modules.book.vo.request.ModifyOrderAddressRequestVo; import com.peanut.modules.book.vo.request.ProductRequestVo; import com.peanut.modules.book.vo.request.ProductTransportVo; import com.peanut.modules.book.vo.response.BuyOrderResponseVo; import com.peanut.modules.book.vo.response.OrderAddressResponseVo; import com.peanut.modules.common.dao.UserCourseBuyDao; import com.peanut.modules.common.entity.*; import com.peanut.modules.common.service.*; import com.peanut.modules.pay.weChatPay.dto.WechatPaymentInfo; import com.peanut.modules.pay.weChatPay.service.WxpayService; import com.peanut.modules.sys.entity.SysConfigEntity; import com.peanut.modules.sys.service.SysConfigService; import lombok.extern.slf4j.Slf4j; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.amqp.core.MessagePostProcessor; import org.springframework.amqp.rabbit.core.RabbitTemplate; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import jakarta.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.OutputStream; import java.math.BigDecimal; import java.math.RoundingMode; import java.net.URLEncoder; import java.util.*; import java.util.stream.Collectors; /** * 订单表 * * @author yl * @email yl328572838@163.com * @date 2022-08-29 15:27:44 */ @Slf4j @RestController @RequestMapping("book/buyOrder") public class BuyOrderController { @Autowired private BuyOrderService buyOrderService; @Autowired private ShopProductService shopProductService; @Autowired private UserVipService userVipService; @Autowired private BuyOrderDetailService buyOrderDetailService; @Autowired private OrderCartService orderCartService; @Autowired private MyUserService myUserService; @Autowired private TransactionDetailsService transactionDetailsService; @Autowired private UserEbookBuyService userEbookBuyService; @Autowired private WxpayService wxpayService; @Autowired private RabbitTemplate rabbitTemplate; @Autowired private ShopProductBookService shopProductBookService; @Autowired private ExpressOrderService expressOrderService; @Autowired private UserAddressService userAddressService; @Autowired private ExpressFeeService expressFeeService; @Autowired private SysConfigService sysConfigService; @Autowired private BuyOrderProductService buyOrderProductService; @Autowired private ProvinceService provinceService; @Autowired private CityService cityService; @Autowired private CountyService countyService; @Autowired private UserCourseBuyDao userCourseBuyDao; @Autowired private JfTransactionDetailsService jfTransactionDetailsService; @Autowired private CouponService couponService; @Autowired private CouponHistoryService couponHistoryService; @Autowired private UserCourseBuyLogService userCourseBuyLogService; @RequestMapping(value = "/decomposeShipment", method = RequestMethod.POST) public R decomposeShipment(@RequestBody BuyOrderListRequestVo requestVo) { Map result = buyOrderService.decomposeShipment(requestVo); return R.ok().put("result", result); } // TODO 新版本上线后废弃 @RequestMapping("/list") public R list(@RequestParam Map params) throws Exception { PageUtils page = buyOrderService.list(params); return R.ok().put("page", page); } /** * 订单列表 * * @param requestVo request value object * @return R */ @RequestMapping(path = "/orderList", method = RequestMethod.POST) public R orderList(@RequestBody BuyOrderListRequestVo requestVo) { Page buyOrderPage = buyOrderService.orderList(requestVo); return R.ok().put("result", buyOrderPage); } //导出名医精彩订单 @RequestMapping("/exportMingyijingcaiOrder") public void exportMingyijingcaiOrder(HttpServletResponse response, @RequestBody BuyOrderListRequestVo requestVo) { requestVo.setOrderStatus("3"); requestVo.setPageIndex(1); requestVo.setPageSize(100000); R r = orderList(requestVo); if ("0".equals(r.get("code").toString())){ Page buyOrderPage = (Page) r.get("result"); XSSFWorkbook wb = new XSSFWorkbook(); Sheet sheet = wb.createSheet("名医精彩订单"); Row titleRow = sheet.createRow(0);//日期,姓名,电话,付款方式,金额 titleRow.createCell(0).setCellValue("序号"); titleRow.createCell(1).setCellValue("订单时间"); titleRow.createCell(2).setCellValue("订单编号"); titleRow.createCell(3).setCellValue("商品名"); titleRow.createCell(4).setCellValue("姓名"); titleRow.createCell(5).setCellValue("联系方式"); titleRow.createCell(6).setCellValue("用户邮箱"); titleRow.createCell(7).setCellValue("付款方式"); titleRow.createCell(8).setCellValue("订单金额"); titleRow.createCell(9).setCellValue("实付金额"); titleRow.createCell(10).setCellValue("积分抵扣"); //序号,默认为1 int cell = 1; //遍历 for (BuyOrder buyOrder : buyOrderPage.getRecords()) { Row row = sheet.createRow(cell); row.createCell(0).setCellValue(cell); row.createCell(1).setCellValue(DateUtils.format(buyOrder.getCreateTime(),"yyyy-MM-dd HH:mm:ss")); row.createCell(2).setCellValue(buyOrder.getOrderSn()); if ("relearn".equals(buyOrder.getOrderType())){ row.createCell(3).setCellValue(buyOrder.getRemark()); }else { row.createCell(3).setCellValue(buyOrder.getProductList().get(0).getProduct().getProductName()); } row.createCell(4).setCellValue(buyOrder.getUser().getName()); row.createCell(5).setCellValue(buyOrder.getUser().getTel()); row.createCell(6).setCellValue(buyOrder.getUser().getEmail()); String payMethod = ""; if ("1".equals(buyOrder.getPaymentMethod())){ payMethod = "微信"; }else if ("2".equals(buyOrder.getPaymentMethod())){ payMethod = "支付宝"; }else if ("3".equals(buyOrder.getPaymentMethod())){ payMethod = "IOS内购"; }else if ("4".equals(buyOrder.getPaymentMethod())){ payMethod = "虚拟币"; } row.createCell(7).setCellValue(payMethod); row.createCell(8).setCellValue(buyOrder.getOrderMoney().toString()); row.createCell(9).setCellValue(buyOrder.getRealMoney().toString()); row.createCell(10).setCellValue(buyOrder.getJfDeduction().toString()); //序号自增 cell++; } String fileName = "名医精彩订单.xlsx"; OutputStream outputStream =null; try { //文件名编码格式 fileName = URLEncoder.encode(fileName,"UTF-8"); //设置ContentType请求信息格式 response.setContentType("application/vnd.ms-excel"); //设置标头 response.setHeader("Content-disposition", "attachment;filename=" + fileName); outputStream = response.getOutputStream(); wb.write(outputStream); } catch (IOException e) { e.printStackTrace(); }finally { try { outputStream.flush(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } } /** * 获取用户订单列表 * @param userOrderDto * @return */ @RequestMapping("/getUserOrderList") public R getUserOrderList(@RequestBody UserOrderDto userOrderDto){ Page userOrderList = buyOrderService.getUserOrderList(userOrderDto); return R.ok().put("page",userOrderList); } /** * 获取用户订单各个状态的数量 * @param map * @return */ @RequestMapping("/getUserOrderStatusNum") public R getUserOrderStatusNum(@RequestBody Map map){ Integer userId = Integer.valueOf(map.get("userId").toString()); List userOrderStatusNum = buyOrderService.getUserOrderStatusNum(userId); Map m = new HashMap<>(); for (BuyOrder b : userOrderStatusNum){ m.put(b.getOrderStatus().toString(),b.getStatusNum()); } return R.ok().put("map",m); } //获取商品vip折扣金额 @RequestMapping("/getVipDiscountAmount") public R getVipDiscountAmount(@RequestBody BuyOrder buyOrder){ BigDecimal b = new BigDecimal(0); if (userVipService.isVip()){ List buyOrderProductList = buyOrder.getProductList(); for (BuyOrderProduct buyOrderProduct : buyOrderProductList) { BigDecimal pvda = shopProductService.getVipDiscountAmount(shopProductService.getById(buyOrderProduct.getProductId())); b = b.add(pvda.multiply(new BigDecimal(buyOrderProduct.getQuantity()))); } } return R.ok().put("discountAmount",b); } //获取商品活动折扣金额 @RequestMapping("/getDistrictAmount") public R getDistrictAmount(@RequestBody BuyOrder buyOrder){ BigDecimal total = new BigDecimal(0); List buyOrderProductList = buyOrder.getProductList(); for (BuyOrderProduct buyOrderProduct : buyOrderProductList) { ShopProduct shopProduct = shopProductService.getById(buyOrderProduct.getProductId()); if (userVipService.isVip()){ BigDecimal pvda = shopProductService.getVipDiscountAmount(shopProductService.getById(buyOrderProduct.getProductId())); if (pvda.compareTo(BigDecimal.ZERO)>0){ continue; } } if (shopProduct.getActivityPrice().compareTo(BigDecimal.ZERO)>0){ total = total.add((shopProduct.getPrice().subtract(shopProduct.getActivityPrice())).multiply(new BigDecimal(buyOrderProduct.getQuantity()))); } } return R.ok().put("districtAmount",total); } // @RequestMapping("/getShopProductListByIds") public R getShopProductListByIds(@RequestBody Map params){ String[] productIds = params.get("productIds").toString().split(","); LambdaQueryWrapper wrapper = new LambdaQueryWrapper(); wrapper.select(ShopProduct::getProductId,ShopProduct::getProductName,ShopProduct::getProductImages,ShopProduct::getPrice,ShopProduct::getActivityPrice,ShopProduct::getIsVipPrice,ShopProduct::getGoodsType); wrapper.in(ShopProduct::getProductId,Arrays.asList(productIds)); List shopProductList = shopProductService.list(wrapper); for (ShopProduct shopProduct:shopProductList){ if (userVipService.isVip()&&shopProduct.getIsVipPrice()==1){ shopProduct.setVipPrice(shopProductService.getVipPrice(shopProduct)); } } return R.ok().put("shopProductList",shopProductList); } /** * 订单详情 * * @param orderSn 订单号 * @return R */ @RequestMapping(path = "/orderDetail", method = RequestMethod.GET) public R orderDetail(@RequestParam("orderSn") String orderSn) { BuyOrderResponseVo buyOrderResponseVo = buyOrderService.orderDetail(orderSn); return R.ok().put("result", buyOrderResponseVo); } /** * 删除订单 * * @param orderSn 订单号 * @return R */ @RequestMapping(path = "/orderDel") public R orderDel(@RequestParam("orderSn") String orderSn) { LambdaQueryWrapper w = new LambdaQueryWrapper(); w.eq(BuyOrder::getOrderSn,orderSn); BuyOrder order = buyOrderService.getOne(w); order.setOrderStatus("4"); buyOrderService.saveOrUpdate(order); buyOrderService.removeById(order.getOrderId()); return R.ok(); } /** * 下单 * TODO 原下单接口,新版本上线后废弃 * * @param buyOrder 订单 * @return R */ @RequestMapping("/buySave") @Transactional public R buySave(@RequestBody BuyOrder buyOrder) throws IOException { return R.error("app版本太低请升级后再购买!!"); } /** * 下单 * * @param buyOrder * @return * @throws IOException */ @RequestMapping(value = "/placeOrder", method = RequestMethod.POST) @Transactional public R placeOrder(@RequestBody BuyOrder buyOrder) { List buyOrderProductList = buyOrder.getProductList(); // 订单实收金额 BigDecimal totalPrice = new BigDecimal(0); //是否存在手摸或脚模,修改用户的脉穴权限 List sjc =Arrays.asList(128,129,130,131,136,137,139,1612); boolean sj_check = false; //是否存在时辰取穴的权限触发商品 List scqq = Arrays.asList(133,134,135); boolean scqq_check = false; //五运六气权限 List wylq = Arrays.asList(39,62,123,127); boolean wylq_check = false; List prescript_b = Arrays.asList(43,62,124); boolean prescriot_b_check = false; if (buyOrder.getVipDiscountAmount()!=null&&buyOrder.getVipDiscountAmount().compareTo(new BigDecimal(0))>0 &&buyOrder.getCouponId()!=null&&buyOrder.getCouponId()!=0){ return R.error(500, "优惠不能叠加"); } // 遍历商品总价计算 for (BuyOrderProduct buyOrderProduct : buyOrderProductList) { if(sjc.contains(buyOrderProduct.getProductId())){ sj_check = true; } if(scqq.contains(buyOrderProduct.getProductId())){ scqq_check = true; } if(wylq.contains(buyOrderProduct.getProductId())){ wylq_check = true; } if(prescript_b.contains(buyOrderProduct.getProductId())){ prescriot_b_check = true; } Integer productId = buyOrderProduct.getProductId(); int quantity = buyOrderProduct.getQuantity(); ShopProduct product = shopProductService.getById(productId); BigDecimal price = getRealPrice(product); if (buyOrder.getVipDiscountAmount()!=null&&buyOrder.getVipDiscountAmount().compareTo(new BigDecimal(0))>0 &&userVipService.isVip()&&product.getIsVipPrice()==1){ if (shopProductService.getVipPrice(product).compareTo(BigDecimal.ZERO)>0){ price = shopProductService.getVipPrice(product); } } if (!handleStock(buyOrderProduct, product)) { return R.error(500, "库存不足"); } totalPrice = totalPrice.add(price.multiply(BigDecimal.valueOf(quantity))); } //商品价格减去优惠券的优惠金额 if (buyOrder.getCouponId()!=null&&buyOrder.getCouponId()!=0){ CouponHistory couponHistory = couponHistoryService.getById(buyOrder.getCouponId()); if (couponHistory!=null){ if (couponHistory.getStatus()==0){ if (couponHistory.getEffectType()!=0){ if (couponHistory.getStartTime().getTime()new Date().getTime()){ }else { return R.error("优惠券使用时间未到"); } } CouponEntity coupon = couponService.getById(couponHistory.getCouponId()); if (coupon != null){ totalPrice = totalPrice.subtract(coupon.getCouponAmount()); } }else { if (couponHistory.getStatus()==1){ return R.error("优惠券已被使用"); }else if (couponHistory.getStatus() == 2){ return R.error("优惠券已过期"); } } } } //加上运费金额 totalPrice = totalPrice.add(getShoppingAmount(buyOrder)); //减去积分抵扣 totalPrice = totalPrice.subtract(buyOrder.getJfDeduction()==null?BigDecimal.ZERO:buyOrder.getJfDeduction()); if(buyOrder.getRealMoney().compareTo(totalPrice)!=0){ return R.error("系统错误订单金额异常!"); } String orderSn = IdWorker.getTimeId().substring(0, 32); buyOrder.setOrderSn(orderSn); if(buyOrder.getAddressId()!=0){ QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("id", buyOrder.getAddressId()); UserAddress userAddress = userAddressService.getOne(queryWrapper); UserAddressVo vo = new UserAddressVo(); vo = userAddressService.getAddressName(vo, userAddress.getRegionCode()); buyOrder.setProvince(vo.getProvince()); buyOrder.setCity(vo.getCity()); buyOrder.setDistrict(vo.getCounty()); buyOrder.setAddress(userAddress.getDetailAddress()); String str = buyOrder.getShippingUser()+buyOrder.getAddress()+buyOrder.getRemark(); if (str.contains("+")||str.contains("&")) { return R.error(500, "信息中不能含有“+”、“&”符号!"); } } buyOrder.setOrderStatus("0"); buyOrderService.save(buyOrder); //解决购物车相关问题 for (BuyOrderProduct buyOrderProduct : buyOrderProductList) { buyOrderProduct.setOrderId(buyOrder.getOrderId()); if (Constants.BUY_TYPE_CART.equals(buyOrder.getBuyType())) { handleBuyCart(buyOrder, buyOrderProduct); } } buyOrderProductService.saveBatch(buyOrderProductList); // 1. 虚拟币支付 if (Constants.PAYMENT_METHOD_VIRTUAL.equals(buyOrder.getPaymentMethod())) { buyOrder.setOrderStatus(Constants.ORDER_STATUS_TO_BE_SHIPPED); MyUserEntity user = this.myUserService.getById(buyOrder.getUserId()); if (usePeanutCoin(user, totalPrice,sj_check,scqq_check,wylq_check,prescriot_b_check)&&useJfCoin(user,buyOrder.getJfDeduction())) { // 更新订单状态 if(buyOrderService.checkWlOrder(buyOrder.getOrderSn())){ buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "0"); }else{ buyOrderService.updateOrderStatus(user.getId(), buyOrder.getOrderSn(), "2"); } //记录用户虚拟币消费 if(totalPrice.compareTo(BigDecimal.ZERO)>0){ transactionDetailsService.recordTransaction(buyOrder, user, totalPrice); } //记录用户积分消费情况 if(buyOrder.getJfDeduction()!=null&&buyOrder.getJfDeduction().compareTo(BigDecimal.ZERO) > 0){ jfTransactionDetailsService.recordJfTransaction(buyOrder, user, buyOrder.getJfDeduction()); } //消费用户积分并记录用户积分消费记录 addEbookToUser(buyOrderProductList, buyOrder, 0); addCourseToUser(buyOrder); //使用优惠券 if (buyOrder.getCouponId()!=null&&buyOrder.getCouponId()!=0){ CouponHistory couponHistory = couponHistoryService.getById(buyOrder.getCouponId()); couponHistory.setOrderId(buyOrder.getOrderId()); couponService.useCouponAmount(couponHistory); } //发放优惠卷 couponService.insertCouponHistoryByProductId(buyOrder); } else { rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE, DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY, buyOrder.getOrderId(), messagePostProcessor() ); return R.error(500, "天医币余额不足!"); } } // 2. 微信支付,需要预支付 if (Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())) { WechatPaymentInfo paymentInfo = new WechatPaymentInfo(); paymentInfo.setOrderSn(orderSn); paymentInfo.setBuyOrderId(buyOrder.getOrderId()); paymentInfo.setTotalAmount(totalPrice); if(buyOrder.getCome()==null||buyOrder.getCome()==0){ paymentInfo.setAppName(buyOrder.getAppName()); } else if (buyOrder.getCome()==2){ paymentInfo.setAppName("wumen"); } else if (buyOrder.getCome()==1) { paymentInfo.setAppName("zmzm"); } else if (buyOrder.getCome()==3) { paymentInfo.setAppName("xlkj"); } else if (buyOrder.getCome()==4) { paymentInfo.setAppName("thyy"); } wxpayService.prepay(paymentInfo); } rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE, DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY, buyOrder.getOrderId(), messagePostProcessor() ); Map result = new HashMap<>(); result.put("orderSn", buyOrder.getOrderSn()); result.put("money", totalPrice); return R.ok(result); } @RequestMapping("/llll") public R ls(){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); ArrayList integers = new ArrayList<>(); integers.add(1); integers.add(2); integers.add(3); wrapper.gt(BuyOrder::getOrderId,4522); wrapper.in(BuyOrder::getOrderStatus,integers); wrapper.eq(BuyOrder::getOrderType,"order"); List list = buyOrderService.list(wrapper); for (BuyOrder b : list){ List orderBookId = shopProductBookService.getOrderBookId(b.getOrderSn()); // System.out.println(orderBookId); userEbookBuyService.addBookForUser(b.getUserId(),orderBookId); } return R.ok(); } @RequestMapping("/llll1") public R ls1(){ Integer[] is = {39,62,123,127}; List collect = buyOrderProductService.getBaseMapper().selectList(new LambdaQueryWrapper().in(BuyOrderProduct::getProductId, is)).stream().map(BuyOrderProduct::getOrderId).collect(Collectors.toList()); LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); List integers = Arrays.asList(1,2,3); wrapper.in(BuyOrder::getOrderStatus,integers); wrapper.in(BuyOrder::getOrderId,collect); wrapper.eq(BuyOrder::getOrderType,"order"); List list = buyOrderService.list(wrapper); for (BuyOrder b : list){ MyUserEntity byId = myUserService.getById(b.getUserId()); byId.setWylqPower(1); myUserService.updateById(byId); } return R.ok(); } /** * 计算运费 * * @param vo * @return */ @RequestMapping(path = "/calculateTransportPrice", method = RequestMethod.POST) public R getTransportPrice(@RequestBody ProductTransportVo vo) { //商品列表和收货区域编码 String regionCode = vo.getRegionCode(); List products = vo.getProducts(); //查询默认快递公司代码 defaultExpress.getParamValue() QueryWrapper configQueryWrapper = new QueryWrapper<>(); configQueryWrapper.eq("param_key", "DEFAULT_EXPRESS"); SysConfigEntity defaultExpress = sysConfigService.getOne(configQueryWrapper); if (defaultExpress == null) { return R.error("未设置默认快递"); } //总运费 BigDecimal totalExpressFee = new BigDecimal(0); BigDecimal totalWeight01 = new BigDecimal(0); BigDecimal totalWeight02 = new BigDecimal(0); BigDecimal totalWeight04 = new BigDecimal(0); for (ProductRequestVo product : products) { ShopProduct p = shopProductService.getById(product.getProductId()); if (p != null) { //现售:《针灸六经法要》 港澳台西藏不包邮 其他地区包邮 if (p.getProductId().equals(135)&&!regionCode.equals("710000")&&!regionCode.equals("810000") &&!regionCode.equals("820000")&&!regionCode.startsWith("54")) { continue; } //包邮 if(p.getIsFreeMail()==0){ continue; }else { BigDecimal weight = BigDecimal.valueOf(Double.valueOf(p.getWeight()) / 1000.0); BigDecimal totalWeight = weight.multiply(new BigDecimal(product.getQuantity())); if ("01".equals(p.getGoodsType())){ totalWeight01 = totalWeight01.add(totalWeight); } if ("02".equals(p.getGoodsType())){ totalWeight02 = totalWeight02.add(totalWeight); } //预售书单独计算 if ("03".equals(p.getGoodsType())){ totalExpressFee = totalExpressFee.add( expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight.setScale(0, RoundingMode.UP), regionCode)); } if ("04".equals(p.getGoodsType())){ totalWeight04 = totalWeight04.add(totalWeight); } } }else { return R.error("未查询到商品"); } } if(totalWeight01.compareTo(BigDecimal.ZERO)!=0){ totalExpressFee = totalExpressFee.add( expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight01.setScale(0, RoundingMode.UP), regionCode)); } if(totalWeight02.compareTo(BigDecimal.ZERO)!=0){ totalExpressFee = totalExpressFee.add( expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight02.setScale(0, RoundingMode.UP), regionCode)); } if(totalWeight04.compareTo(BigDecimal.ZERO)!=0){ totalExpressFee = totalExpressFee.add( expressFeeService.calculateExpressFee(defaultExpress.getParamValue(), totalWeight04.setScale(0, RoundingMode.UP), regionCode)); } return R.ok().put("result", totalExpressFee); } /** * 列表 */ @RequestMapping("/getMyOrderList") public R getMyOrderList(@RequestParam Map params) { PageUtils page = buyOrderService.getMyOrderList(params); return R.ok().put("page", page); } /** * @param orderSn 订单号 * @return R */ @RequestMapping(value = "/cancelOrder", method = RequestMethod.GET) @Transactional public R appDelete(@RequestParam("orderSn") String orderSn) { // QueryWrapper queryWrapper = new QueryWrapper<>(); // queryWrapper.eq("order_sn", orderSn); // BuyOrder buyOrder = buyOrderService.getOne(queryWrapper); // if (buyOrder == null) { // return R.error("订单不存在"); // } // //回滚优惠卷 // if (buyOrder.getCouponId()!=null&&buyOrder.getCouponId()!=0){ // buyOrder.setCouponId(null); // buyOrderService.updateById(buyOrder); // } // // 库存回滚 // QueryWrapper buyOrderProductQueryWrapper = new QueryWrapper<>(); // buyOrderProductQueryWrapper.eq("order_id", buyOrder.getOrderId()); // List buyOrderProductList = buyOrderProductService.list(buyOrderProductQueryWrapper); // for (BuyOrderProduct buyOrderProduct : buyOrderProductList) { // Integer productId = buyOrderProduct.getProductId(); // ShopProduct product = shopProductService.getById(productId); // product.setProductStock(product.getProductStock() + buyOrderProduct.getQuantity()); // shopProductService.updateById(product); // } // buyOrderService.removeById(buyOrder.getOrderId()); return R.ok(); } /** * 修改 */ @RequestMapping("/update") public R update(@RequestBody BuyOrder buyOrder) { buyOrderService.updateById(buyOrder); return R.ok(); } /** * 删除 */ @RequestMapping("/delete") public R delete(@RequestBody List orderSnList) { // QueryWrapper queryWrapper = new QueryWrapper<>(); // queryWrapper.in("order_sn", orderSnList); // buyOrderService.remove(queryWrapper); return R.ok(); } /** * app 端 取消订单 */ @RequestMapping("/appDelete") @Transactional public R appDelete(@RequestParam("orderId") Integer orderId) { //1. 判断订单状态 // BuyOrder buyOrder = buyOrderService.getById(orderId); // if (buyOrder != null) { // //回滚优惠卷 // if (buyOrder.getCouponId()!=null&&buyOrder.getCouponId()!=0){ // buyOrder.setCouponId(null); // buyOrderService.updateById(buyOrder); // } // // 库存回滚 // List buyOrderDetailEntities = buyOrderDetailService.getBaseMapper().selectList(new QueryWrapper() // .eq("order_id", buyOrder.getOrderId())); // for (BuyOrderDetail buyOrderDetailEntity : buyOrderDetailEntities) { // Integer productId = buyOrderDetailEntity.getProductId(); // ShopProduct product = shopProductService.getById(productId); // product.setProductStock(product.getProductStock() + buyOrderDetailEntity.getQuantity()); // shopProductService.updateById(product); // } // buyOrderService.removeById(orderId); // } return R.ok(); } /** * 充值专用订单生成接口 */ @RequestMapping("/rechargeSave") @Transactional public R rechargeSave(@RequestBody BuyOrder buyOrder) throws IOException { buyOrder.setOrderStatus("0"); buyOrder.setOrderType("point"); String timeId = IdWorker.getTimeId().substring(0, 32); buyOrder.setOrderSn(timeId); buyOrderService.save(buyOrder); //下单微信支付预付款订单 if(Constants.PAYMENT_METHOD_WECHAT_PAY.equals(buyOrder.getPaymentMethod())){ BuyOrder buyOrderEntity = buyOrderService.getBaseMapper().selectOne(new LambdaQueryWrapper().eq(BuyOrder::getOrderSn, timeId)); WechatPaymentInfo paymentInfo = new WechatPaymentInfo(); paymentInfo.setOrderSn(buyOrderEntity.getOrderSn()); paymentInfo.setBuyOrderId(Integer.valueOf(buyOrderEntity.getProductId())); paymentInfo.setTotalAmount(buyOrderEntity.getRealMoney()); // paymentInfo.setAppName(buyOrder.getAppName()); if (buyOrder.getCome()==2){ paymentInfo.setAppName("wumen"); } else if (buyOrder.getCome()==1) { paymentInfo.setAppName("zmzm"); } else if (buyOrder.getCome()==3) { paymentInfo.setAppName("xlkj"); } else if (buyOrder.getCome()==4) { paymentInfo.setAppName("thyy"); }else { paymentInfo.setAppName(buyOrder.getAppName()); } wxpayService.prepay(paymentInfo); } rabbitTemplate.convertAndSend( DelayQueueConfig.ORDER_TO_BE_PAY_EXCHANGE, DelayQueueConfig.ORDER_TO_BE_PAY_ROUTING_KEY, buyOrder.getOrderId(), messagePostProcessor() ); return R.ok().put("orderSn", timeId); } /** * 获取订单详情 * TODO 新版本上线后删除 * * @param orderId * @return */ @RequestMapping("/getOrderDetail") public R getOrderDetail(@RequestParam Integer orderId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(BuyOrder::getOrderId, orderId); BuyOrder one = buyOrderService.getOne(wrapper); if (one.equals(null)) { return R.error("order error:order is null"); } //添加用户信息 one.setUser(myUserService.getById(one.getUserId())); //添加商品信息 LambdaQueryWrapper wrapper1 = new LambdaQueryWrapper<>(); wrapper1.eq(BuyOrderDetail::getOrderId, orderId); List buyOrderDetailEntities = buyOrderDetailService.getBaseMapper().selectList(wrapper1); one.setProducts(buyOrderDetailEntities); return R.ok().put("detail", one); } /** * 获取订单详情 * * @param orderId 订单 ID * @return R * TODO 新版本上线后 该方法删除 */ @RequestMapping(value = "/getOrderInfo", method = RequestMethod.GET) public R appGetOrderInfo(@RequestParam("orderId") Integer orderId) { BuyOrder buyOrder = buyOrderService.getById(orderId); QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_id", orderId); List buyOrderDetailList = buyOrderDetailService.list(queryWrapper); for (BuyOrderDetail buyOrderDetail : buyOrderDetailList) { ShopProduct prod = shopProductService.getById(buyOrderDetail.getProductId()); if (prod != null) { buyOrderDetail.setImage(prod.getProductImages()); } } return R.ok().put("result", buyOrder); } /** * 修改订单地址 * * @param addressRequestVo 地址请求 value object * @return R */ @RequestMapping(value = "/modifyConsigneeAddress", method = RequestMethod.POST) public R modifyOrderAddress(@RequestBody ModifyOrderAddressRequestVo addressRequestVo) { QueryWrapper buyOrderQueryWrapper = new QueryWrapper<>(); buyOrderQueryWrapper.eq("order_sn", addressRequestVo.getOrderSn()); BuyOrder buyOrder = buyOrderService.getOne(buyOrderQueryWrapper); String provinceCode = addressRequestVo.getProvinceCode(); QueryWrapper provinceQueryWrapper = new QueryWrapper<>(); provinceQueryWrapper.eq("region_code", provinceCode); Province province = provinceService.getOne(provinceQueryWrapper); buyOrder.setProvince(province.getProvName()); String cityCode = addressRequestVo.getCityCode(); QueryWrapper cityQueryWrapper = new QueryWrapper<>(); cityQueryWrapper.eq("region_code", cityCode); City city = cityService.getOne(cityQueryWrapper); buyOrder.setCity(city.getCityName()); String countyCode = addressRequestVo.getCountyCode(); QueryWrapper countyQueryWrapper = new QueryWrapper<>(); countyQueryWrapper.eq("region_code", countyCode); County county = countyService.getOne(countyQueryWrapper); buyOrder.setDistrict(county.getCountyName()); buyOrder.setShippingUser(addressRequestVo.getConsigneeName()); buyOrder.setUserPhone(addressRequestVo.getConsigneeMobile()); buyOrder.setAddress(addressRequestVo.getAddress()); String str = buyOrder.getShippingUser()+buyOrder.getAddress()+buyOrder.getRemark(); if (str.contains("+")||str.contains("&")) { return R.error(500, "信息中不能含有“+”、“&”符号!"); } buyOrderService.updateById(buyOrder); return R.ok(); } /** * 获取订单地址 * * @param orderSn 订单号 * @return R */ @RequestMapping(value = "/getConsigneeAddress", method = RequestMethod.GET) public R getOrderAddress(@RequestParam("orderSn") String orderSn) { QueryWrapper queryWrapper = new QueryWrapper<>(); queryWrapper.eq("order_sn", orderSn); BuyOrder buyOrder = buyOrderService.getOne(queryWrapper); OrderAddressResponseVo responseVo = new OrderAddressResponseVo(); responseVo.setConsigneeMobile(buyOrder.getUserPhone()); responseVo.setConsigneeName(buyOrder.getShippingUser()); responseVo.setDetailAddress(buyOrder.getAddress()); String provinceName = buyOrder.getProvince(); String cityName = buyOrder.getCity(); String countyName = buyOrder.getDistrict(); QueryWrapper provinceQueryWrapper = new QueryWrapper<>(); provinceQueryWrapper.eq("prov_name", provinceName); Province province = provinceService.getOne(provinceQueryWrapper); responseVo.setProvinceCode(province.getRegionCode()); QueryWrapper cityQueryWrapper = new QueryWrapper<>(); cityQueryWrapper.eq("city_name", cityName); City city = cityService.getOne(cityQueryWrapper); responseVo.setCityCode(city.getRegionCode()); QueryWrapper countyQueryWrapper = new QueryWrapper<>(); countyQueryWrapper.eq("county_name", countyName); County county = countyService.getOne(countyQueryWrapper); responseVo.setCountyCode(county.getRegionCode()); return R.ok().put("result", responseVo); } /** * 查询订单快递 * * @param expressOrderSn 运单号 * @return R */ // @RequestMapping(value = "/queryExpress", method = RequestMethod.GET) // public R queryExpress(@RequestParam("expressOrderSn") String expressOrderSn, // @RequestParam("expressCompanyCode") String expressCompanyCode, // @RequestParam("customerName") String customerName) { // // ExpressQueryResponseVo vo = new ExpressQueryResponseVo(); // ExpressQueryResponse expressQueryResponse = expressOrderService.queryExpressOrder(expressCompanyCode, expressOrderSn, customerName); // vo.setLogisticCode(expressQueryResponse.getLogisticCode()); // vo.setTraces(expressQueryResponse.getTraces()); // return R.ok().put("result", vo); // } /** * 查询快递订单轨迹 * @param expressOrderSn * @return */ @RequestMapping("/searchExpress") public R searchExpress(@RequestParam String expressOrderSn){ LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(ExpressOrder::getExpressOrderSn,expressOrderSn); ExpressOrder expressOrder = expressOrderService.getBaseMapper().selectOne(wrapper); if(expressOrder==null){ return R.error("查询失败"); } String tel = expressOrder.getConsigneeMobile().substring(expressOrder.getConsigneeMobile().length()-4); ExpressQueryResponse expressQueryResponse = expressOrderService.queryExpressOrder(expressOrder.getExpressCompanyCode(), expressOrderSn, tel); return R.ok().put("express",expressQueryResponse); } /** * 检查可合并的订单信息 * * @return */ @RequestMapping("/checkOrder") public R checkOrder(@RequestParam Map params) { Page page = buyOrderService.checkOrder(params); return R.ok().put("page", page); } /** * 检查传来的orderId 是否有可合并的其他订单信息 * * @param orderIds * @return */ @RequestMapping("/checkMerge") public R checkMerge(@RequestBody Integer[] orderIds) { List list = buyOrderService.checkOrder(orderIds); return R.ok().put("list", list); } /** * 分包发货 * * @param expressCompanyCode 快递公司编码 * @param buyOrderProductId 订单商品 * @return R */ @RequestMapping(value = "/delivery", method = RequestMethod.POST) public R delivery(@RequestParam("expressCompanyCode") String expressCompanyCode, @RequestBody List buyOrderProductId) throws Exception { return buyOrderService.delivery(expressCompanyCode, buyOrderProductId); } @RequestMapping("/mytest") public R mytest() throws IOException { String mytest = buyOrderService.mytest(); return R.ok().put("url",mytest); } /** * 获取商品实际价格 * * @param product 商品信息 * @return 商品实际价格 */ private BigDecimal getRealPrice(ShopProduct product) { BigDecimal activityPrice = product.getActivityPrice(); return (activityPrice == null || activityPrice.equals(BigDecimal.ZERO)) ? product.getPrice() : activityPrice; } /** * 处理商品库存 * TODO 新版本上线后删除此方法 * * @param buyOrderDetail * @param product * @return */ private boolean handleStock(BuyOrderDetail buyOrderDetail, ShopProduct product) { int quantity = buyOrderDetail.getQuantity(); if (product.getProductStock() - quantity < 0) { return false; } product.setProductStock(product.getProductStock() - quantity); product.setSumSales(product.getSumSales() + quantity); shopProductService.updateById(product); return true; } /** * 处理商品库存 * * @param buyOrderProduct 订单商品信息 * @param product 商品 * @return boolean */ private boolean handleStock(BuyOrderProduct buyOrderProduct, ShopProduct product) { int quantity = buyOrderProduct.getQuantity(); if (product.getProductStock() - quantity < 0) { return false; } product.setProductStock(product.getProductStock() - quantity); product.setSumSales(product.getSumSales() + quantity); shopProductService.updateById(product); return true; } /** * 计算运费 * * @param buyOrder * @return */ private BigDecimal getShoppingAmount(BuyOrder buyOrder) { return buyOrder.getOrderMoney() == null ? BigDecimal.ZERO : buyOrder.getShippingMoney(); } /** * 使用虚拟币支付 * * @param user * @param totalPrice * @return */ private boolean usePeanutCoin(MyUserEntity user, BigDecimal totalPrice, boolean sj_check, boolean scqq_check, boolean wylq_check, boolean prescript_b_check) { if (user.getPeanutCoin().compareTo(totalPrice) >= 0) { if(totalPrice.compareTo(BigDecimal.ZERO)==0){//纯积分支付,虚拟币不用支付 return true; } user.setPeanutCoin(user.getPeanutCoin().subtract(totalPrice)); if (sj_check){ user.setPointPower(1); } if(scqq_check){ user.setTgdzPower(1); } if(wylq_check){ user.setWylqPower(1); } if(prescript_b_check){ user.setPrescriptBPower(1); } this.myUserService.updateById(user); return true; } return false; } private boolean useJfCoin(MyUserEntity user,BigDecimal jf){ if(jf==null){ return true; } if(user.getJf().compareTo(jf)>=0){ user.setJf(user.getJf().subtract(jf)); this.myUserService.updateById(user); return true; }else{ return false; } } /** * 给用户添加电子书 * TODO 新版本上线删除此接口 * @param products * * @param buyOrder */ private void addEbookToUser(List products, BuyOrder buyOrder) { List productIds = products.stream().map(BuyOrderDetail::getProductId).collect(Collectors.toList()); for (Integer productId : productIds) { List collect = shopProductBookService.getBaseMapper().selectList(new LambdaQueryWrapper() .eq(ShopProductBookEntity::getProductId, productId) .eq(ShopProductBookEntity::getDelFlag, 0)).stream().map(ShopProductBookEntity::getBookId).collect(Collectors.toList()); userEbookBuyService.addBookForUser(buyOrder.getUserId(), collect); } } /** * 给用户添加电子书 * TODO 这里的参数 0 没用 新版本上线后删除 * * @param products * @param buyOrder */ private void addEbookToUser(List products, BuyOrder buyOrder, Integer x) { List productIds = products.stream().map(BuyOrderProduct::getProductId).collect(Collectors.toList()); for (Integer productId : productIds) { List collect = shopProductBookService.getBaseMapper().selectList(new LambdaQueryWrapper() .eq(ShopProductBookEntity::getProductId, productId) .eq(ShopProductBookEntity::getDelFlag, 0)).stream().map(ShopProductBookEntity::getBookId).collect(Collectors.toList()); userEbookBuyService.addBookForUser(buyOrder.getUserId(), collect); } } private void addCourseToUser(BuyOrder orderEntity){ List orderCourse = buyOrderService.getOrderCourse(orderEntity.getOrderSn()); for (int i=0;i wrapper2 = new LambdaQueryWrapper<>(); wrapper2.eq(UserCourseBuyEntity::getUserId,orderEntity.getUserId()); wrapper2.eq(UserCourseBuyEntity::getCatalogueId,s.getCatalogueId()); wrapper2.and(r->r.isNull(UserCourseBuyEntity::getEndTime).or().gt(UserCourseBuyEntity::getEndTime,new Date())); List userCourseBuyEntities = userCourseBuyDao.selectList(wrapper2); //插入开课记录 UserCourseBuyLog userCourseBuyLog = new UserCourseBuyLog(); userCourseBuyLog.setUserId(orderEntity.getUserId()); userCourseBuyLog.setType("order"); userCourseBuyLog.setPayType("天医币"); userCourseBuyLog.setPayTime(orderEntity.getCreateTime()); userCourseBuyLog.setOrderSn(orderEntity.getOrderSn()); if(userCourseBuyEntities.size()>0){//延长有效期 UserCourseBuyEntity userCourseBuyEntity = userCourseBuyEntities.get(0); userCourseBuyLog.setUserCourseBuyId(userCourseBuyEntity.getId()); userCourseBuyLog.setBeginDay(userCourseBuyEntity.getDays()+1); userCourseBuyLog.setDays(s.getDays()); userCourseBuyEntity.setDays(userCourseBuyEntity.getDays()+s.getDays()); if(userCourseBuyEntity.getEndTime()!=null){ Calendar calendar = Calendar.getInstance(); calendar.setTime(userCourseBuyEntity.getEndTime()); calendar.add(Calendar.DAY_OF_MONTH,s.getDays()); userCourseBuyEntity.setEndTime(calendar.getTime()); } userCourseBuyEntity.setCome(userCourseBuyEntity.getCome()+";延期(虚拟币购买:"+orderEntity.getOrderSn()+")"); userCourseBuyDao.updateById(userCourseBuyEntity); }else{ UserCourseBuyEntity userCourseBuyEntity = new UserCourseBuyEntity(); userCourseBuyEntity.setUserId(orderEntity.getUserId()); userCourseBuyEntity.setCourseId(s.getCourseId()); userCourseBuyEntity.setCatalogueId(s.getCatalogueId()); userCourseBuyEntity.setDays(s.getDays()); userCourseBuyEntity.setCreateTime(new Date()); // userCourseBuyEntity.setStartTime(new Date()); // Calendar cal = Calendar.getInstance(); // cal.setTime(new Date()); // cal.add(Calendar.DAY_OF_MONTH,s.getDays()); // userCourseBuyEntity.setEndTime(cal.getTime()); userCourseBuyEntity.setCome("虚拟币购买:"+orderEntity.getOrderSn()); userCourseBuyDao.insert(userCourseBuyEntity); userCourseBuyLog.setUserCourseBuyId(userCourseBuyEntity.getId()); userCourseBuyLog.setBeginDay(0); userCourseBuyLog.setDays(s.getDays()); } BigDecimal fee = orderEntity.getRealMoney().divide(new BigDecimal(orderCourse.size()),2, BigDecimal.ROUND_HALF_UP); BigDecimal jf = orderEntity.getJfDeduction().divide(new BigDecimal(orderCourse.size()),2, BigDecimal.ROUND_HALF_UP); if (i==(orderCourse.size()-1)){ userCourseBuyLog.setFee(orderEntity.getRealMoney().subtract(fee.multiply(new BigDecimal(orderCourse.size()-1)))); userCourseBuyLog.setJf(orderEntity.getJfDeduction().subtract(jf.multiply(new BigDecimal(orderCourse.size()-1)))); }else { userCourseBuyLog.setFee(fee); userCourseBuyLog.setJf(jf); } userCourseBuyLogService.save(userCourseBuyLog); } } /** * 购物车 * TODO 新版本上线后删除此方法 * * @param buyOrder * @param buyOrderDetail */ private void handleBuyCart(BuyOrder buyOrder, BuyOrderDetail buyOrderDetail) { List orderCartList = orderCartService.getBaseMapper().selectList(new QueryWrapper() .eq("user_id", buyOrder.getUserId()).eq("product_id", buyOrderDetail.getProductId())); if (orderCartList.size() > 0) { List collect = orderCartList.stream().map(OrderCartEntity::getCartId).collect(Collectors.toList()); orderCartService.removeByIds(collect); } } /** * 购物车 * * @param buyOrder 订单 * @param buyOrderProduct */ private void handleBuyCart(BuyOrder buyOrder, BuyOrderProduct buyOrderProduct) { List orderCartList = orderCartService.getBaseMapper().selectList(new QueryWrapper() .eq("user_id", buyOrder.getUserId()).eq("product_id", buyOrderProduct.getProductId())); if (orderCartList.size() > 0) { List collect = orderCartList.stream().map(OrderCartEntity::getCartId).collect(Collectors.toList()); orderCartService.removeByIds(collect); } } private MessagePostProcessor messagePostProcessor() { return message -> { //设置有效期30分钟 message.getMessageProperties().setExpiration(String.valueOf(30 * 60 * 1000)); return message; }; } }