From 510e696030f99b129835932947fc435672a28bc3 Mon Sep 17 00:00:00 2001 From: cb <275647614@qq.com> Date: Fri, 22 Aug 2025 11:35:33 +0800 Subject: [PATCH] no message --- .../web/controller/goods/GoodsController.java | 102 ++++++++++++-- .../web/controller/order/OrderController.java | 129 +++++++++--------- .../ghy/web/pojo/vo/OrderListResponse.java | 5 + .../main/java/com/ghy/goods/domain/Goods.java | 2 + .../com/ghy/order/domain/OrderMaster.java | 5 + .../ghy/order/request/AppOrderRequest.java | 2 + .../mapper/order/OrderMasterMapper.xml | 6 + .../main/java/com/ghy/shop/domain/Shop.java | 1 + 8 files changed, 170 insertions(+), 82 deletions(-) diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java b/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java index 19c17634..c2ed23ea 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/goods/GoodsController.java @@ -405,41 +405,113 @@ public class GoodsController extends BaseController { try { Goods result = goodsService.selectById(goods.getGoodsId()); - Shop shop=shopService.getShop(result.getShopId()); - result.setShop(shop); - // 获取用户当前位置 Double userLatitude = goods.getLatitude(); Double userLongitude = goods.getLongitude(); - // 计算距离逻辑 - if (LocationUtils.isValidCoordinate(userLatitude, userLongitude) && shop != null) { + // 获取商品店铺信息 + Shop goodsShop = null; + if (result.getShopId() != null) { try { - if (LocationUtils.isValidCoordinate(shop.getLatitude(), shop.getLongitude())) { + goodsShop = shopService.getShop(result.getShopId()); + } catch (Exception e) { + logger.warn("获取商品店铺信息失败: {}", e.getMessage()); + } + } + + // 获取服务店铺信息 + Shop serviceShop = null; + if (result.getDeptGoodsCategoryId() != null) { + try { + // 1. 通过商品的类目ID获取类目信息 + DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.selectOneByGoodsCategoryId(result.getDeptGoodsCategoryId()); + if (deptGoodsCategory != null && deptGoodsCategory.getServiceCategoryId() != null) { + logger.debug("商品的服务类目ID: {}", deptGoodsCategory.getServiceCategoryId()); + + // 2. 通过服务类目ID查询所有使用该服务类目的商品 + Goods queryGoods = new Goods(); + queryGoods.setDeptGoodsCategoryId(deptGoodsCategory.getServiceCategoryId()); + queryGoods.setStatus(0); // 只查询上架的商品 + List goodsList = goodsService.selectGoodsList(queryGoods); + + // 3. 提取所有店铺ID(去重) + Set shopIds = goodsList.stream() + .filter(g -> g.getShopId() != null) + .map(Goods::getShopId) + .collect(Collectors.toSet()); + + if (!shopIds.isEmpty()) { + // 找到最近的店铺 + Shop nearestShop = null; + double minDistance = Double.MAX_VALUE; + + for (Long shopId : shopIds) { + Shop shop = shopService.getShop(shopId); + if (shop != null && LocationUtils.isValidCoordinate(shop.getLatitude(), shop.getLongitude())) { + if (LocationUtils.isValidCoordinate(userLatitude, userLongitude)) { + try { + double distanceInMeters = LocationUtils.getDistanceInMeters( + userLatitude, userLongitude, + shop.getLatitude(), shop.getLongitude() + ); + if (distanceInMeters < minDistance) { + minDistance = distanceInMeters; + nearestShop = shop; + } + } catch (Exception e) { + logger.warn("计算店铺[{}]距离失败: {}", shop.getShopName(), e.getMessage()); + } + } else { + // 如果用户没有提供位置,选择第一个有效店铺 + if (nearestShop == null) { + nearestShop = shop; + } + } + } + } + + serviceShop = nearestShop; + } + } else { + logger.debug("商品类目信息中未配置服务类目ID"); + } + } catch (Exception e) { + logger.warn("获取服务店铺信息失败: {}", e.getMessage()); + } + } + + // 设置商品店铺和服务店铺信息 + result.setShop(goodsShop); + + // 计算距离逻辑 + if (LocationUtils.isValidCoordinate(userLatitude, userLongitude) && serviceShop != null) { + try { + if (LocationUtils.isValidCoordinate(serviceShop.getLatitude(), serviceShop.getLongitude())) { // 计算距离(米) double distanceInMeters = LocationUtils.getDistanceInMeters( userLatitude, userLongitude, - shop.getLatitude(), shop.getLongitude() + serviceShop.getLatitude(), serviceShop.getLongitude() ); // 格式化距离并设置到商品对象 - result.setDistance(LocationUtils.formatDistance(distanceInMeters)); + serviceShop.setDistance(LocationUtils.formatDistance(distanceInMeters)); logger.debug("商品[{}]距离用户: {}", result.getGoodsName(), result.getDistance()); } else { // 店铺坐标不完整 - result.setDistance(null); + serviceShop.setDistance(null); } } catch (Exception e) { logger.warn("计算商品[{}]距离失败: {}", result.getGoodsName(), e.getMessage()); // 计算异常时设为null - result.setDistance(null); + serviceShop.setDistance(null); } } else { // 用户未提供位置或店铺信息不存在 - result.setDistance(null); + serviceShop.setDistance(null); } - + result.setServiceShop(serviceShop); + // 补全商品类目及父级类目信息 GoodsCategory goodsCategory = goodsCategoryService.selectById(result.getDeptGoodsCategoryId()); result.setDeptGoodsCategoryName(goodsCategory.getGoodsCategoryName()); @@ -664,20 +736,20 @@ public class GoodsController extends BaseController { // 1. 通过配件商品ID获取商品信息 Goods goods = goodsService.selectById(goodsId); if (goods == null) { - return AjaxResult.error("商品不存在"); + return null; } // 2. 获取商品对应的服务类目ID Long deptGoodsCategoryId = goods.getDeptGoodsCategoryId(); if (deptGoodsCategoryId == null) { - return AjaxResult.error("商品未关联服务类目"); + return null; } // 3. 通过类目ID获取当前类目下的所有店铺信息 // 先获取类目信息,找到所有使用该类目的商品 DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.get(deptGoodsCategoryId); if (deptGoodsCategory == null) { - return AjaxResult.error("服务类目不存在"); + return null; } // 查询所有使用该服务类目的商品 diff --git a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java index 72f97103..347b1999 100644 --- a/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java +++ b/ghy-admin/src/main/java/com/ghy/web/controller/order/OrderController.java @@ -26,6 +26,8 @@ import com.ghy.payment.domain.FinancialMaster; import com.ghy.payment.service.FinancialChangeRecordService; import com.ghy.payment.service.FinancialDetailService; import com.ghy.payment.service.FinancialMasterService; +import com.ghy.shop.domain.Shop; +import com.ghy.shop.service.ShopService; import com.ghy.system.domain.SysArea; import com.ghy.system.service.ISysAreaService; import com.ghy.system.service.IWxMsgService; @@ -115,6 +117,8 @@ public class OrderController extends BaseController { @Resource private LogisticsService logisticsService; + @Resource + private ShopService shopService; @GetMapping("/imgs") public String orderImgs(Long orderId, ModelMap mmap) { mmap.put("orderId", orderId); @@ -585,33 +589,39 @@ public class OrderController extends BaseController { OrderMaster orderMaster = new OrderMaster(); orderMaster.setOrderType(0); // 判断是否是配件商品 - if (goods.getType() != null && goods.getType() == 2) { - // 配件商品,需要获取对应的服务商品 - logger.info("当前商品是配件商品,需要获取对应的服务商品"); - orderMaster.setOrderType(1); + // if (goods.getType() != null && goods.getType() == 2) { + // // 配件商品,需要获取对应的服务商品 + // logger.info("当前商品是配件商品,需要获取对应的服务商品"); + // orderMaster.setOrderType(1); - // 通过商品的类目ID获取类目信息 - DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.selectOneByGoodsCategoryId(goods.getDeptGoodsCategoryId()); - if (deptGoodsCategory != null && deptGoodsCategory.getServiceCategoryId() != null) { - logger.info("配件商品的服务类目ID: {}", deptGoodsCategory.getServiceCategoryId()); + // // 通过商品的类目ID获取类目信息 + // DeptGoodsCategory deptGoodsCategory = deptGoodsCategoryService.selectOneByGoodsCategoryId(goods.getDeptGoodsCategoryId()); + // if (deptGoodsCategory != null && deptGoodsCategory.getServiceCategoryId() != null) { + // logger.info("配件商品的服务类目ID: {}", deptGoodsCategory.getServiceCategoryId()); - // 通过服务类目ID查询对应的服务商品 - Goods serviceGoodsQuery = new Goods(); - serviceGoodsQuery.setDeptGoodsCategoryId(deptGoodsCategory.getServiceCategoryId()); - serviceGoodsQuery.setType(1); // 服务商品类型 - serviceGoodsQuery.setStatus(0); // 上架状态 - List serviceGoodsList = goodsService.selectGoodsList(serviceGoodsQuery); - if (CollectionUtils.isNotEmpty(serviceGoodsList)) { - Goods serviceGoods = serviceGoodsList.get(0); // 取第一个服务商品 - logger.info("找到对应的服务商品: {}", serviceGoods); - orderMaster.setServerGoodsId(serviceGoods.getGoodsId()); - } else { - logger.warn("未找到服务类目ID为 {} 的服务商品", deptGoodsCategory.getServiceCategoryId()); - } - } else { - logger.warn("配件商品的类目信息中未配置服务类目ID"); - } - } + // // 通过服务类目ID查询对应的服务商品 + // Goods serviceGoodsQuery = new Goods(); + // serviceGoodsQuery.setDeptGoodsCategoryId(deptGoodsCategory.getServiceCategoryId()); + // serviceGoodsQuery.setType(1); // 服务商品类型 + // serviceGoodsQuery.setStatus(0); // 上架状态 + // List serviceGoodsList = goodsService.selectGoodsList(serviceGoodsQuery); + // if (CollectionUtils.isNotEmpty(serviceGoodsList)) { + // Goods serviceGoods = serviceGoodsList.get(0); // 取第一个服务商品 + // logger.info("找到对应的服务商品: {}", serviceGoods); + // orderMaster.setServerGoodsId(serviceGoods.getGoodsId()); + + // // 设置服务店铺ID + // if (serviceGoods.getShopId() != null) { + // orderMaster.setServiceShopId(serviceGoods.getShopId()); + // logger.info("设置服务店铺ID: {}", serviceGoods.getShopId()); + // } + // } else { + // logger.warn("未找到服务类目ID为 {} 的服务商品", deptGoodsCategory.getServiceCategoryId()); + // } + // } else { + // logger.warn("配件商品的类目信息中未配置服务类目ID"); + // } + // } // 师傅信息 Worker worker = workerService.selectById(goods.getWorkerId()); // 商户ID @@ -619,6 +629,7 @@ public class OrderController extends BaseController { Assert.notNull(deptId, "deptId is null!"); // 生成主单 + orderMaster.setServiceShopId(appOrderRequest.getServiceShopId()); orderMaster.setDeptId(deptId); orderMaster.setIsNeedBill(appOrderRequest.getIsNeedBill()); orderMaster.setCode(orderMasterService.createOrderCode()); @@ -1574,6 +1585,7 @@ public class OrderController extends BaseController { orderListResponse.setDrawCashTime(detail.getDrawCashTime()); orderListResponse.setCreateTime(detail.getCreateTime()); orderListResponse.setUpdateTime(detail.getUpdateTime()); + orderListResponse.setServiceShopId(orderMaster.getServiceShopId()); orderListResponses.add(orderListResponse); }); return orderListResponses; @@ -1699,6 +1711,7 @@ public class OrderController extends BaseController { orderListResponse.setOriginalWorkerId(master.getOriginalWorkerId()); orderListResponse.setServerGoodsId(master.getServerGoodsId()); + orderListResponse.setServiceShopId(master.getServiceShopId()); orderListResponse.setOrderType(master.getOrderType()); orderListResponse.setHasServiceOrder(master.getHasServiceOrder()); orderListResponse.setIsMonitoredOrder(condition); @@ -2001,6 +2014,7 @@ public class OrderController extends BaseController { try { Long orderMasterId = request.getId(); BigDecimal serviceMoney = request.getServerGoodsMoney(); + Long serviceShopId = request.getServiceShopId(); // 校验参数 if (orderMasterId == null) { @@ -2011,6 +2025,10 @@ public class OrderController extends BaseController { return AjaxResult.error("服务金额不能为空且不能为负数"); } + if (serviceShopId == null) { + return AjaxResult.error("服务店铺ID不能为空"); + } + // 查询配件主单信息 OrderMaster accessoryOrderMaster = orderMasterService.selectById(orderMasterId); if (accessoryOrderMaster == null) { @@ -2026,19 +2044,17 @@ public class OrderController extends BaseController { if (accessoryOrderMaster.getHasServiceOrder() != null && accessoryOrderMaster.getHasServiceOrder() == 1) { return AjaxResult.error("该配件订单已经派发过服务订单,不能重复操作"); } - if (accessoryOrderMaster.getServerGoodsId() == null) { - return AjaxResult.error("未关联服务商品"); - } - // 获取服务商品信息 - Goods serverGoods = goodsService.selectById(accessoryOrderMaster.getServerGoodsId()); - if (serverGoods == null) { - return AjaxResult.error("关联的服务商品不存在"); + + // 获取服务店铺信息 + Shop serviceShop = shopService.getShop(serviceShopId); + if (serviceShop == null) { + return AjaxResult.error("服务店铺不存在"); } - // 获取服务商品的师傅信息 - Worker serverWorker = workerService.selectById(serverGoods.getWorkerId()); - if (serverWorker == null) { - return AjaxResult.error("服务商品未关联师傅信息"); + // 获取服务店铺的师傅信息(创建店铺的师傅) + Worker serviceWorker = workerService.selectById(serviceShop.getWorkerId()); + if (serviceWorker == null) { + return AjaxResult.error("服务店铺未关联师傅信息"); } // 创建服务主单 @@ -2052,8 +2068,8 @@ public class OrderController extends BaseController { serviceOrderMaster.setAddressId(accessoryOrderMaster.getAddressId()); serviceOrderMaster.setPayStatus(PayStatus.WAIT_PAY.getCode()); serviceOrderMaster.setCreateTime(new Date()); - serviceOrderMaster.setWorkerId(request.getWorkerId()); // 使用服务商品的师傅 - serviceOrderMaster.setGoodsId(serverGoods.getGoodsId()); // 使用服务商品ID + serviceOrderMaster.setWorkerId(serviceWorker.getWorkerId()); // 使用服务店铺的师傅ID + serviceOrderMaster.setServiceShopId(serviceShopId); // 设置服务店铺ID serviceOrderMaster.setRemark("由配件订单[" + accessoryOrderMaster.getCode() + "]自动生成的服务订单,服务金额:" + serviceMoney); serviceOrderMaster.setExpectTimeStart(accessoryOrderMaster.getExpectTimeStart()); serviceOrderMaster.setExpectTimeEnd(accessoryOrderMaster.getExpectTimeEnd()); @@ -2079,17 +2095,6 @@ public class OrderController extends BaseController { orderMasterService.insertOrderMaster(serviceOrderMaster); Assert.notNull(serviceOrderMaster.getId(), "ServiceOrderMaster.id is null!"); - // 获取服务商品的规格信息(取第一个可用规格) - GoodsStandard serviceGoodsStandard = null; - List serviceGoodsStandards = goodsStandardService.selectByGoodsId(serverGoods.getGoodsId()); - if (CollectionUtils.isNotEmpty(serviceGoodsStandards)) { - serviceGoodsStandard = serviceGoodsStandards.get(0); // 取第一个规格 - } - - if (serviceGoodsStandard == null) { - throw new RuntimeException("服务商品没有可用的规格信息"); - } - // 生成财务主单(使用传入的服务金额) FinancialMaster serviceFinancialMaster = new FinancialMaster( financialMasterService.createCode(), @@ -2104,16 +2109,6 @@ public class OrderController extends BaseController { financialMasterService.insertFinancialMaster(serviceFinancialMaster); Assert.notNull(serviceFinancialMaster.getId(), "ServiceFinancialMaster.id is null!"); - // 生成服务商品订单 - OrderGoods serviceOrderGoods = new OrderGoods( - serviceOrderMaster.getId(), - serviceGoodsStandard.getGoodsStandardId(), - serviceGoodsStandard.getGoodsStandardName(), - 1, // 数量默认为1 - 0 - ); - orderGoodsService.insertOrderGoods(serviceOrderGoods); - // 更新配件主单,关联生成的服务订单并标记已派发服务订单 OrderMaster accessoryUpdate = new OrderMaster(); accessoryUpdate.setId(accessoryOrderMaster.getId()); @@ -2129,7 +2124,7 @@ public class OrderController extends BaseController { CustomerAddress address = customerAddressService.selectByCustomerAddressId(serviceOrderMaster.getAddressId()); paramsNew.put("thing14", address.getName()); paramsNew.put("time4", com.ghy.common.utils.DateUtils.parseDateToStr("yyyy年MM月dd日 HH:mm", new Date())); - WechatMsgUtils.sendWeChatMsg(WechatMsgUtils.getToken(), serverWorker.getWxOpenId(), WxMsgEnum.NORMAL_ORDER, paramsNew); + WechatMsgUtils.sendWeChatMsg(WechatMsgUtils.getToken(), serviceWorker.getWxOpenId(), WxMsgEnum.NORMAL_ORDER, paramsNew); } catch (Exception e) { logger.error("发送微信通知失败: {}", e.getMessage(), e); } @@ -2141,14 +2136,14 @@ public class OrderController extends BaseController { result.put("serviceOrderId", serviceOrderMaster.getId()); result.put("serviceOrderCode", serviceOrderMaster.getCode()); result.put("serviceFee", serviceMoney); - result.put("serviceGoodsId", serverGoods.getGoodsId()); - result.put("serviceGoodsName", serverGoods.getGoodsName()); - result.put("serviceWorkerId", serverWorker.getWorkerId()); - result.put("serviceWorkerName", serverWorker.getName()); - result.put("serviceWorkerPhone", serverWorker.getPhone()); + result.put("serviceShopId", serviceShopId); + result.put("serviceShopName", serviceShop.getShopName()); + result.put("serviceWorkerId", serviceWorker.getWorkerId()); + result.put("serviceWorkerName", serviceWorker.getName()); + result.put("serviceWorkerPhone", serviceWorker.getPhone()); - logger.info("成功为配件订单[{}]生成服务订单[{}],服务金额:{}", - accessoryOrderMaster.getCode(), serviceOrderMaster.getCode(), serviceMoney); + logger.info("成功为配件订单[{}]生成服务订单[{}],服务金额:{},服务店铺:{}", + accessoryOrderMaster.getCode(), serviceOrderMaster.getCode(), serviceMoney, serviceShop.getShopName()); return AjaxResult.success("服务订单生成成功", result); diff --git a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java index 6eca0528..e35cf667 100644 --- a/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java +++ b/ghy-admin/src/main/java/com/ghy/web/pojo/vo/OrderListResponse.java @@ -248,6 +248,11 @@ public class OrderListResponse { private Long serverGoodsId; + /** + * 服务店铺ID + */ + private Long serviceShopId; + private Date confirmStartTime; private Integer deliveryType; diff --git a/ghy-goods/src/main/java/com/ghy/goods/domain/Goods.java b/ghy-goods/src/main/java/com/ghy/goods/domain/Goods.java index cb553629..ebd56cc7 100644 --- a/ghy-goods/src/main/java/com/ghy/goods/domain/Goods.java +++ b/ghy-goods/src/main/java/com/ghy/goods/domain/Goods.java @@ -124,6 +124,8 @@ public class Goods extends BaseEntity { private Shop shop; + private Shop serviceShop; + private List goodsIds; private String goodsStandard; diff --git a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java index 9758c030..30b4a5be 100644 --- a/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java +++ b/ghy-order/src/main/java/com/ghy/order/domain/OrderMaster.java @@ -244,6 +244,11 @@ public class OrderMaster extends BaseEntity { private Long goodsOrderMasterId; + /** + * 服务店铺ID + */ + private Long serviceShopId; + private String trackingNumber; /** diff --git a/ghy-order/src/main/java/com/ghy/order/request/AppOrderRequest.java b/ghy-order/src/main/java/com/ghy/order/request/AppOrderRequest.java index c835d713..d1a5bab4 100644 --- a/ghy-order/src/main/java/com/ghy/order/request/AppOrderRequest.java +++ b/ghy-order/src/main/java/com/ghy/order/request/AppOrderRequest.java @@ -45,4 +45,6 @@ public class AppOrderRequest { private Long goodsId; private Long insuranceId; + + private Long serviceShopId; } diff --git a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml index d9a8174d..fcf22042 100644 --- a/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml +++ b/ghy-order/src/main/resources/mapper/order/OrderMasterMapper.xml @@ -53,6 +53,7 @@ + @@ -114,6 +115,7 @@ has_dispatched_all, withdrawn, server_goods_id, + service_shop_id, goods_order_master_id, tracking_number, server_goods_money, @@ -176,6 +178,7 @@ om.has_dispatched_all, om.withdrawn, om.server_goods_id, + om.service_shop_id, om.goods_order_master_id, om.tracking_number, om.server_goods_money, @@ -480,6 +483,7 @@ timeout_ = #{timeout}, insurance_id = #{insuranceId}, server_goods_id = #{serverGoodsId}, + service_shop_id = #{serviceShopId}, goods_order_master_id = #{goodsOrderMasterId}, tracking_number = #{trackingNumber}, server_goods_money = #{serverGoodsMoney}, @@ -547,6 +551,7 @@ country_name, street_name, server_goods_id, + service_shop_id, goods_order_master_id, tracking_number, server_goods_money, @@ -595,6 +600,7 @@ #{countryName}, #{streetName}, #{serverGoodsId}, + #{serviceShopId}, #{goodsOrderMasterId}, #{trackingNumber}, #{serverGoodsMoney}, diff --git a/ghy-shop/src/main/java/com/ghy/shop/domain/Shop.java b/ghy-shop/src/main/java/com/ghy/shop/domain/Shop.java index 7a4000ac..6246871d 100644 --- a/ghy-shop/src/main/java/com/ghy/shop/domain/Shop.java +++ b/ghy-shop/src/main/java/com/ghy/shop/domain/Shop.java @@ -27,4 +27,5 @@ public class Shop implements Serializable { private Double latitude; // 纬度 private Double longitude; // 经度 + private String distance; // 距离 } \ No newline at end of file