Commit 5ca65d380e55671e04479855cada58a8b3328387
1 parent
66413a4f
重构开放平台门店同步逻辑,支持外部指定配送费
Showing
11 changed files
with
68 additions
and
202 deletions
src/main/java/com/diligrp/rider/controller/OpenStoreController.java
| @@ -43,7 +43,7 @@ public class OpenStoreController { | @@ -43,7 +43,7 @@ public class OpenStoreController { | ||
| 43 | @RequestParam(required = false) Long cityId, | 43 | @RequestParam(required = false) Long cityId, |
| 44 | @RequestParam(defaultValue = "1") int page) { | 44 | @RequestParam(defaultValue = "1") int page) { |
| 45 | String appKey = request.getHeader("X-App-Key"); | 45 | String appKey = request.getHeader("X-App-Key"); |
| 46 | - return Result.success(merchantService.storeList(cityId, null, page)); | 46 | + return Result.success(merchantService.storeListByApp(appKey, cityId, page)); |
| 47 | } | 47 | } |
| 48 | 48 | ||
| 49 | /** | 49 | /** |
src/main/java/com/diligrp/rider/dto/DeliveryOrderCreateDTO.java
| 1 | package com.diligrp.rider.dto; | 1 | package com.diligrp.rider.dto; |
| 2 | 2 | ||
| 3 | +import jakarta.validation.constraints.DecimalMin; | ||
| 3 | import jakarta.validation.constraints.NotBlank; | 4 | import jakarta.validation.constraints.NotBlank; |
| 4 | -import jakarta.validation.constraints.NotNull; | ||
| 5 | import lombok.Data; | 5 | import lombok.Data; |
| 6 | 6 | ||
| 7 | import java.math.BigDecimal; | 7 | import java.math.BigDecimal; |
| @@ -29,10 +29,10 @@ public class DeliveryOrderCreateDTO { | @@ -29,10 +29,10 @@ public class DeliveryOrderCreateDTO { | ||
| 29 | /** 发货门店地址 */ | 29 | /** 发货门店地址 */ |
| 30 | private String storeAddr; | 30 | private String storeAddr; |
| 31 | 31 | ||
| 32 | - /** 发货门店经度(extStoreId 为空时必填) */ | 32 | + /** 发货门店经度(outStoreId 无法补齐时必填) */ |
| 33 | private String storeLng; | 33 | private String storeLng; |
| 34 | 34 | ||
| 35 | - /** 发货门店纬度(extStoreId 为空时必填) */ | 35 | + /** 发货门店纬度(outStoreId 无法补齐时必填) */ |
| 36 | private String storeLat; | 36 | private String storeLat; |
| 37 | 37 | ||
| 38 | /** 收件人姓名 */ | 38 | /** 收件人姓名 */ |
| @@ -59,6 +59,10 @@ public class DeliveryOrderCreateDTO { | @@ -59,6 +59,10 @@ public class DeliveryOrderCreateDTO { | ||
| 59 | @NotBlank(message = "外部订单号不能为空") | 59 | @NotBlank(message = "外部订单号不能为空") |
| 60 | private String outOrderNo; | 60 | private String outOrderNo; |
| 61 | 61 | ||
| 62 | + /** 外部指定配送费;不传则按系统规则计算 */ | ||
| 63 | + @DecimalMin(value = "0.00", message = "配送费不能小于0") | ||
| 64 | + private BigDecimal deliveryFee; | ||
| 65 | + | ||
| 62 | /** 货物重量(kg),用于重量计费,0=不计重 */ | 66 | /** 货物重量(kg),用于重量计费,0=不计重 */ |
| 63 | private BigDecimal weight = BigDecimal.ZERO; | 67 | private BigDecimal weight = BigDecimal.ZERO; |
| 64 | 68 |
src/main/java/com/diligrp/rider/entity/ExtStore.java deleted
100644 → 0
| 1 | -package com.diligrp.rider.entity; | ||
| 2 | - | ||
| 3 | -import com.baomidou.mybatisplus.annotation.*; | ||
| 4 | -import lombok.Data; | ||
| 5 | - | ||
| 6 | -/** | ||
| 7 | - * 外部门店表 | ||
| 8 | - * 接入方通过 API 注册/同步自己系统的门店到配送中台 | ||
| 9 | - * 与 AppKey 绑定,一个应用可有多个门店 | ||
| 10 | - */ | ||
| 11 | -@Data | ||
| 12 | -@TableName("ext_store") | ||
| 13 | -public class ExtStore { | ||
| 14 | - | ||
| 15 | - @TableId(type = IdType.AUTO) | ||
| 16 | - private Long id; | ||
| 17 | - | ||
| 18 | - /** 所属应用 AppKey */ | ||
| 19 | - private String appKey; | ||
| 20 | - | ||
| 21 | - /** 接入方自己系统的门店ID(外部系统的原始ID,用于对账) */ | ||
| 22 | - private String outStoreId; | ||
| 23 | - | ||
| 24 | - /** 门店名称 */ | ||
| 25 | - private String name; | ||
| 26 | - | ||
| 27 | - /** 门店地址 */ | ||
| 28 | - private String address; | ||
| 29 | - | ||
| 30 | - /** 经度 */ | ||
| 31 | - private String lng; | ||
| 32 | - | ||
| 33 | - /** 纬度 */ | ||
| 34 | - private String lat; | ||
| 35 | - | ||
| 36 | - /** 所属城市ID */ | ||
| 37 | - private Long cityId; | ||
| 38 | - | ||
| 39 | - /** 门店联系电话 */ | ||
| 40 | - private String phone; | ||
| 41 | - | ||
| 42 | - /** 营业状态:0=关闭 1=营业 */ | ||
| 43 | - private Integer status; | ||
| 44 | - | ||
| 45 | - /** 备注 */ | ||
| 46 | - private String remark; | ||
| 47 | - | ||
| 48 | - private Long createTime; | ||
| 49 | - | ||
| 50 | - private Long updateTime; | ||
| 51 | -} |
src/main/java/com/diligrp/rider/entity/Orders.java
| @@ -123,9 +123,6 @@ public class Orders { | @@ -123,9 +123,6 @@ public class Orders { | ||
| 123 | /** 货物整单备注(如:放门口、不要辣) */ | 123 | /** 货物整单备注(如:放门口、不要辣) */ |
| 124 | private String itemRemark; | 124 | private String itemRemark; |
| 125 | 125 | ||
| 126 | - /** 关联外部门店ID(接入方在平台注册的门店) */ | ||
| 127 | - private Long extStoreId; | ||
| 128 | - | ||
| 129 | /** 是否删除 */ | 126 | /** 是否删除 */ |
| 130 | @TableLogic | 127 | @TableLogic |
| 131 | private Integer isDel; | 128 | private Integer isDel; |
src/main/java/com/diligrp/rider/mapper/ExtStoreMapper.java deleted
100644 → 0
src/main/java/com/diligrp/rider/service/ExtStoreService.java deleted
100644 → 0
| 1 | -package com.diligrp.rider.service; | ||
| 2 | - | ||
| 3 | -import com.diligrp.rider.entity.ExtStore; | ||
| 4 | - | ||
| 5 | -import java.util.List; | ||
| 6 | - | ||
| 7 | -public interface ExtStoreService { | ||
| 8 | - /** 同步门店(新增或更新,以 appKey+outStoreId 为唯一键) */ | ||
| 9 | - ExtStore syncStore(String appKey, ExtStore store); | ||
| 10 | - /** 查询某应用下的门店列表 */ | ||
| 11 | - List<ExtStore> listByApp(String appKey); | ||
| 12 | - /** 获取单个门店(appKey为null时不校验归属) */ | ||
| 13 | - ExtStore getById(Long id, String appKey); | ||
| 14 | - /** 设置门店状态 */ | ||
| 15 | - void setStatus(Long id, String appKey, int status); | ||
| 16 | - /** 删除门店 */ | ||
| 17 | - void delete(Long id, String appKey); | ||
| 18 | - /** 平台管理端:查看所有门店(可按 appKey/cityId 过滤) */ | ||
| 19 | - List<ExtStore> listAll(String appKey, Long cityId, int page); | ||
| 20 | -} |
src/main/java/com/diligrp/rider/service/MerchantService.java
| @@ -12,6 +12,7 @@ public interface MerchantService { | @@ -12,6 +12,7 @@ public interface MerchantService { | ||
| 12 | void editStore(MerchantStoreDTO dto); | 12 | void editStore(MerchantStoreDTO dto); |
| 13 | void editStore(MerchantStoreDTO dto, Long scopedCityId); | 13 | void editStore(MerchantStoreDTO dto, Long scopedCityId); |
| 14 | List<MerchantStore> storeList(Long cityId, String keyword, int page); | 14 | List<MerchantStore> storeList(Long cityId, String keyword, int page); |
| 15 | + List<MerchantStore> storeListByApp(String appKey, Long cityId, int page); | ||
| 15 | MerchantStore getStore(Long storeId); | 16 | MerchantStore getStore(Long storeId); |
| 16 | MerchantStore getStore(Long storeId, Long scopedCityId); | 17 | MerchantStore getStore(Long storeId, Long scopedCityId); |
| 17 | void setOperatingState(Long storeId, int state); | 18 | void setOperatingState(Long storeId, int state); |
src/main/java/com/diligrp/rider/service/impl/DeliveryOrderServiceImpl.java
| @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; | @@ -27,6 +27,7 @@ import org.springframework.stereotype.Service; | ||
| 27 | import org.springframework.transaction.annotation.Transactional; | 27 | import org.springframework.transaction.annotation.Transactional; |
| 28 | 28 | ||
| 29 | import java.math.BigDecimal; | 29 | import java.math.BigDecimal; |
| 30 | +import java.math.RoundingMode; | ||
| 30 | import java.time.LocalDate; | 31 | import java.time.LocalDate; |
| 31 | import java.time.format.DateTimeFormatter; | 32 | import java.time.format.DateTimeFormatter; |
| 32 | import java.util.List; | 33 | import java.util.List; |
| @@ -97,7 +98,10 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | @@ -97,7 +98,10 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | ||
| 97 | feeDTO.setWeight(dto.getWeight()); | 98 | feeDTO.setWeight(dto.getWeight()); |
| 98 | feeDTO.setPieces(calcPieces(dto.getItems())); | 99 | feeDTO.setPieces(calcPieces(dto.getItems())); |
| 99 | feeDTO.setServiceTime(dto.getServiceTime()); | 100 | feeDTO.setServiceTime(dto.getServiceTime()); |
| 100 | - DeliveryFeeResultVO fee = deliveryFeeService.calcFee(feeDTO); | 101 | + DeliveryFeeResultVO computedFee = deliveryFeeService.calcFee(feeDTO); |
| 102 | + DeliveryFeeResultVO fee = dto.getDeliveryFee() != null | ||
| 103 | + ? buildExternalFee(dto.getDeliveryFee(), computedFee) | ||
| 104 | + : computedFee; | ||
| 101 | 105 | ||
| 102 | // 4. 生成订单号 | 106 | // 4. 生成订单号 |
| 103 | String orderNo = generateOrderNo(); | 107 | String orderNo = generateOrderNo(); |
| @@ -111,11 +115,16 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | @@ -111,11 +115,16 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | ||
| 111 | extra.put("weight", dto.getWeight()); | 115 | extra.put("weight", dto.getWeight()); |
| 112 | extra.put("pieces", feeDTO.getPieces()); | 116 | extra.put("pieces", feeDTO.getPieces()); |
| 113 | extra.put("remark", dto.getRemark()); | 117 | extra.put("remark", dto.getRemark()); |
| 118 | + extra.put("feeSource", dto.getDeliveryFee() != null ? "external" : "computed"); | ||
| 119 | + if (dto.getDeliveryFee() != null) { | ||
| 120 | + extra.put("externalDeliveryFee", fee.getTotalFee()); | ||
| 121 | + } | ||
| 114 | extra.put("computed", Map.of( | 122 | extra.put("computed", Map.of( |
| 115 | - "money_basic", fee.getMoneyBasic(), | ||
| 116 | - "money_distance", fee.getMoneyDistance(), | ||
| 117 | - "money_piece", fee.getMoneyPiece(), | ||
| 118 | - "money_time", fee.getMoneyTime() | 123 | + "money_basic", computedFee.getMoneyBasic(), |
| 124 | + "money_distance", computedFee.getMoneyDistance(), | ||
| 125 | + "money_piece", computedFee.getMoneyPiece(), | ||
| 126 | + "money_time", computedFee.getMoneyTime(), | ||
| 127 | + "total_fee", computedFee.getTotalFee() | ||
| 119 | )); | 128 | )); |
| 120 | String extraJson; | 129 | String extraJson; |
| 121 | try { | 130 | try { |
| @@ -162,7 +171,6 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | @@ -162,7 +171,6 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | ||
| 162 | } catch (Exception ignored) {} | 171 | } catch (Exception ignored) {} |
| 163 | } | 172 | } |
| 164 | order.setItemRemark(dto.getItemRemark()); | 173 | order.setItemRemark(dto.getItemRemark()); |
| 165 | - order.setExtStoreId(null); // 改为通过 outStoreId 关联,不存具体ID | ||
| 166 | order.setRiderId(0L); | 174 | order.setRiderId(0L); |
| 167 | order.setOldRiderId(0L); | 175 | order.setOldRiderId(0L); |
| 168 | order.setIsTrans(0); | 176 | order.setIsTrans(0); |
| @@ -237,6 +245,24 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | @@ -237,6 +245,24 @@ public class DeliveryOrderServiceImpl implements DeliveryOrderService { | ||
| 237 | } | 245 | } |
| 238 | } | 246 | } |
| 239 | 247 | ||
| 248 | + private DeliveryFeeResultVO buildExternalFee(BigDecimal deliveryFee, DeliveryFeeResultVO computedFee) { | ||
| 249 | + BigDecimal actualFee = deliveryFee.setScale(2, RoundingMode.HALF_UP); | ||
| 250 | + DeliveryFeeResultVO feeVO = new DeliveryFeeResultVO(); | ||
| 251 | + feeVO.setMoneyBasic(actualFee); | ||
| 252 | + feeVO.setMoneyDistance(BigDecimal.ZERO); | ||
| 253 | + feeVO.setMoneyWeight(BigDecimal.ZERO); | ||
| 254 | + feeVO.setMoneyPiece(BigDecimal.ZERO); | ||
| 255 | + feeVO.setMoneyTime(BigDecimal.ZERO); | ||
| 256 | + feeVO.setTotalFee(actualFee); | ||
| 257 | + feeVO.setDistance(computedFee.getDistance()); | ||
| 258 | + feeVO.setEstimatedMinutes(computedFee.getEstimatedMinutes()); | ||
| 259 | + feeVO.setWeight(computedFee.getWeight()); | ||
| 260 | + feeVO.setPieces(computedFee.getPieces()); | ||
| 261 | + feeVO.setMinFee(computedFee.getMinFee()); | ||
| 262 | + feeVO.setMinFeeApplied(0); | ||
| 263 | + return feeVO; | ||
| 264 | + } | ||
| 265 | + | ||
| 240 | private DeliveryFeeResultVO buildFeeVO(Orders order) { | 266 | private DeliveryFeeResultVO buildFeeVO(Orders order) { |
| 241 | DeliveryFeeResultVO feeVO = new DeliveryFeeResultVO(); | 267 | DeliveryFeeResultVO feeVO = new DeliveryFeeResultVO(); |
| 242 | feeVO.setMoneyBasic(order.getMoneyDelivery()); | 268 | feeVO.setMoneyBasic(order.getMoneyDelivery()); |
src/main/java/com/diligrp/rider/service/impl/ExtStoreServiceImpl.java deleted
100644 → 0
| 1 | -package com.diligrp.rider.service.impl; | ||
| 2 | - | ||
| 3 | -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; | ||
| 4 | -import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; | ||
| 5 | -import com.diligrp.rider.common.exception.BizException; | ||
| 6 | -import com.diligrp.rider.entity.ExtStore; | ||
| 7 | -import com.diligrp.rider.mapper.ExtStoreMapper; | ||
| 8 | -import com.diligrp.rider.service.ExtStoreService; | ||
| 9 | -import lombok.RequiredArgsConstructor; | ||
| 10 | -import org.springframework.stereotype.Service; | ||
| 11 | - | ||
| 12 | -import java.util.List; | ||
| 13 | - | ||
| 14 | -@Service | ||
| 15 | -@RequiredArgsConstructor | ||
| 16 | -public class ExtStoreServiceImpl implements ExtStoreService { | ||
| 17 | - | ||
| 18 | - private final ExtStoreMapper extStoreMapper; | ||
| 19 | - | ||
| 20 | - @Override | ||
| 21 | - public ExtStore syncStore(String appKey, ExtStore store) { | ||
| 22 | - store.setAppKey(appKey); | ||
| 23 | - long now = System.currentTimeMillis() / 1000; | ||
| 24 | - | ||
| 25 | - // 根据 appKey + outStoreId 判断是新增还是更新 | ||
| 26 | - ExtStore existing = extStoreMapper.selectOne(new LambdaQueryWrapper<ExtStore>() | ||
| 27 | - .eq(ExtStore::getAppKey, appKey) | ||
| 28 | - .eq(ExtStore::getOutStoreId, store.getOutStoreId()) | ||
| 29 | - .last("LIMIT 1")); | ||
| 30 | - | ||
| 31 | - if (existing == null) { | ||
| 32 | - store.setStatus(store.getStatus() != null ? store.getStatus() : 1); | ||
| 33 | - store.setCreateTime(now); | ||
| 34 | - store.setUpdateTime(now); | ||
| 35 | - extStoreMapper.insert(store); | ||
| 36 | - } else { | ||
| 37 | - store.setId(existing.getId()); | ||
| 38 | - store.setUpdateTime(now); | ||
| 39 | - extStoreMapper.updateById(store); | ||
| 40 | - } | ||
| 41 | - return extStoreMapper.selectById(store.getId()); | ||
| 42 | - } | ||
| 43 | - | ||
| 44 | - @Override | ||
| 45 | - public List<ExtStore> listByApp(String appKey) { | ||
| 46 | - return extStoreMapper.selectList(new LambdaQueryWrapper<ExtStore>() | ||
| 47 | - .eq(ExtStore::getAppKey, appKey) | ||
| 48 | - .eq(ExtStore::getStatus, 1) | ||
| 49 | - .orderByDesc(ExtStore::getId)); | ||
| 50 | - } | ||
| 51 | - | ||
| 52 | - @Override | ||
| 53 | - public ExtStore getById(Long id, String appKey) { | ||
| 54 | - ExtStore store = extStoreMapper.selectById(id); | ||
| 55 | - if (store == null) throw new BizException("门店不存在"); | ||
| 56 | - if (appKey != null && !appKey.equals(store.getAppKey())) throw new BizException("无权访问该门店"); | ||
| 57 | - return store; | ||
| 58 | - } | ||
| 59 | - | ||
| 60 | - @Override | ||
| 61 | - public void setStatus(Long id, String appKey, int status) { | ||
| 62 | - ExtStore store = getById(id, appKey); | ||
| 63 | - extStoreMapper.update(null, new LambdaUpdateWrapper<ExtStore>() | ||
| 64 | - .eq(ExtStore::getId, id) | ||
| 65 | - .set(ExtStore::getStatus, status) | ||
| 66 | - .set(ExtStore::getUpdateTime, System.currentTimeMillis() / 1000)); | ||
| 67 | - } | ||
| 68 | - | ||
| 69 | - @Override | ||
| 70 | - public void delete(Long id, String appKey) { | ||
| 71 | - getById(id, appKey); | ||
| 72 | - extStoreMapper.deleteById(id); | ||
| 73 | - } | ||
| 74 | - | ||
| 75 | - // 平台管理端:不限 appKey 查看所有门店 | ||
| 76 | - @Override | ||
| 77 | - public List<ExtStore> listAll(String appKey, Long cityId, int page) { | ||
| 78 | - LambdaQueryWrapper<ExtStore> wrapper = new LambdaQueryWrapper<ExtStore>() | ||
| 79 | - .orderByDesc(ExtStore::getId); | ||
| 80 | - if (appKey != null && !appKey.isBlank()) wrapper.eq(ExtStore::getAppKey, appKey); | ||
| 81 | - if (cityId != null && cityId > 0) wrapper.eq(ExtStore::getCityId, cityId); | ||
| 82 | - int offset = (page - 1) * 20; | ||
| 83 | - wrapper.last("LIMIT " + offset + ",20"); | ||
| 84 | - return extStoreMapper.selectList(wrapper); | ||
| 85 | - } | ||
| 86 | -} |
src/main/java/com/diligrp/rider/service/impl/MerchantServiceImpl.java
| @@ -6,10 +6,12 @@ import com.diligrp.rider.common.exception.BizException; | @@ -6,10 +6,12 @@ import com.diligrp.rider.common.exception.BizException; | ||
| 6 | import com.diligrp.rider.dto.MerchantStoreDTO; | 6 | import com.diligrp.rider.dto.MerchantStoreDTO; |
| 7 | import com.diligrp.rider.entity.MerchantStore; | 7 | import com.diligrp.rider.entity.MerchantStore; |
| 8 | import com.diligrp.rider.entity.MerchantUsers; | 8 | import com.diligrp.rider.entity.MerchantUsers; |
| 9 | +import com.diligrp.rider.entity.OpenApp; | ||
| 9 | import com.diligrp.rider.mapper.MerchantStoreMapper; | 10 | import com.diligrp.rider.mapper.MerchantStoreMapper; |
| 10 | import com.diligrp.rider.mapper.MerchantUsersMapper; | 11 | import com.diligrp.rider.mapper.MerchantUsersMapper; |
| 11 | import com.diligrp.rider.service.CityService; | 12 | import com.diligrp.rider.service.CityService; |
| 12 | import com.diligrp.rider.service.MerchantService; | 13 | import com.diligrp.rider.service.MerchantService; |
| 14 | +import com.diligrp.rider.service.OpenAppService; | ||
| 13 | import lombok.RequiredArgsConstructor; | 15 | import lombok.RequiredArgsConstructor; |
| 14 | import org.springframework.stereotype.Service; | 16 | import org.springframework.stereotype.Service; |
| 15 | import org.springframework.transaction.annotation.Transactional; | 17 | import org.springframework.transaction.annotation.Transactional; |
| @@ -24,6 +26,7 @@ public class MerchantServiceImpl implements MerchantService { | @@ -24,6 +26,7 @@ public class MerchantServiceImpl implements MerchantService { | ||
| 24 | private final MerchantStoreMapper storeMapper; | 26 | private final MerchantStoreMapper storeMapper; |
| 25 | private final MerchantUsersMapper usersMapper; | 27 | private final MerchantUsersMapper usersMapper; |
| 26 | private final CityService cityService; | 28 | private final CityService cityService; |
| 29 | + private final OpenAppService openAppService; | ||
| 27 | 30 | ||
| 28 | private static final int PAGE_SIZE = 20; | 31 | private static final int PAGE_SIZE = 20; |
| 29 | 32 | ||
| @@ -95,6 +98,21 @@ public class MerchantServiceImpl implements MerchantService { | @@ -95,6 +98,21 @@ public class MerchantServiceImpl implements MerchantService { | ||
| 95 | } | 98 | } |
| 96 | 99 | ||
| 97 | @Override | 100 | @Override |
| 101 | + public List<MerchantStore> storeListByApp(String appKey, Long cityId, int page) { | ||
| 102 | + if (appKey == null || appKey.isBlank()) throw new BizException("AppKey不能为空"); | ||
| 103 | + LambdaQueryWrapper<MerchantStore> wrapper = new LambdaQueryWrapper<MerchantStore>() | ||
| 104 | + .eq(MerchantStore::getAppKey, appKey) | ||
| 105 | + .eq(MerchantStore::getIsDel, 0) | ||
| 106 | + .orderByAsc(MerchantStore::getListOrder) | ||
| 107 | + .orderByDesc(MerchantStore::getId); | ||
| 108 | + if (cityId != null && cityId > 0) wrapper.eq(MerchantStore::getCityId, cityId); | ||
| 109 | + int currentPage = Math.max(page, 1); | ||
| 110 | + int offset = (currentPage - 1) * PAGE_SIZE; | ||
| 111 | + wrapper.last("LIMIT " + offset + "," + PAGE_SIZE); | ||
| 112 | + return storeMapper.selectList(wrapper); | ||
| 113 | + } | ||
| 114 | + | ||
| 115 | + @Override | ||
| 98 | public MerchantStore getStore(Long storeId) { | 116 | public MerchantStore getStore(Long storeId) { |
| 99 | return getStore(storeId, null); | 117 | return getStore(storeId, null); |
| 100 | } | 118 | } |
| @@ -157,7 +175,12 @@ public class MerchantServiceImpl implements MerchantService { | @@ -157,7 +175,12 @@ public class MerchantServiceImpl implements MerchantService { | ||
| 157 | public MerchantStore syncStore(String appKey, MerchantStoreDTO dto) { | 175 | public MerchantStore syncStore(String appKey, MerchantStoreDTO dto) { |
| 158 | if (appKey == null || appKey.isBlank()) throw new BizException("AppKey不能为空"); | 176 | if (appKey == null || appKey.isBlank()) throw new BizException("AppKey不能为空"); |
| 159 | if (dto.getOutStoreId() == null || dto.getOutStoreId().isBlank()) throw new BizException("外部门店编号不能为空"); | 177 | if (dto.getOutStoreId() == null || dto.getOutStoreId().isBlank()) throw new BizException("外部门店编号不能为空"); |
| 160 | - ensureCityExists(dto.getCityId()); | 178 | + |
| 179 | + OpenApp app = openAppService.getByAppKey(appKey); | ||
| 180 | + if (app == null) throw new BizException("开放平台应用不存在"); | ||
| 181 | + if (app.getCityId() == null || app.getCityId() < 1) throw new BizException("该应用未绑定城市/租户,请联系平台管理员"); | ||
| 182 | + dto.setCityId(app.getCityId()); | ||
| 183 | + ensureCityExists(app.getCityId()); | ||
| 161 | 184 | ||
| 162 | long now = System.currentTimeMillis() / 1000; | 185 | long now = System.currentTimeMillis() / 1000; |
| 163 | MerchantStore existing = getByOutStoreId(appKey, dto.getOutStoreId()); | 186 | MerchantStore existing = getByOutStoreId(appKey, dto.getOutStoreId()); |
src/main/resources/schema.sql
| @@ -348,9 +348,11 @@ CREATE TABLE `merchant_store` ( | @@ -348,9 +348,11 @@ CREATE TABLE `merchant_store` ( | ||
| 348 | `list_order` INT NOT NULL DEFAULT 0 COMMENT '排序', | 348 | `list_order` INT NOT NULL DEFAULT 0 COMMENT '排序', |
| 349 | `is_del` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', | 349 | `is_del` TINYINT NOT NULL DEFAULT 0 COMMENT '逻辑删除', |
| 350 | `add_time` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', | 350 | `add_time` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '创建时间', |
| 351 | + `sync_app_key` VARCHAR(32) GENERATED ALWAYS AS (NULLIF(`app_key`, '')) STORED COMMENT '外部同步唯一键AppKey', | ||
| 352 | + `sync_out_store_id` VARCHAR(64) GENERATED ALWAYS AS (NULLIF(`out_store_id`, '')) STORED COMMENT '外部同步唯一键门店ID', | ||
| 351 | PRIMARY KEY (`id`), | 353 | PRIMARY KEY (`id`), |
| 352 | KEY `idx_city_id` (`city_id`), | 354 | KEY `idx_city_id` (`city_id`), |
| 353 | - KEY `idx_app_out_store` (`app_key`, `out_store_id`), | 355 | + UNIQUE KEY `uk_app_out_store` (`sync_app_key`, `sync_out_store_id`, `is_del`), |
| 354 | KEY `idx_order_del` (`list_order`, `is_del`) | 356 | KEY `idx_order_del` (`list_order`, `is_del`) |
| 355 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商家店铺表'; | 357 | ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='商家店铺表'; |
| 356 | 358 | ||
| @@ -504,30 +506,9 @@ INSERT INTO `orders_refund_reason` (`name`, `role`, `list_order`) VALUES | @@ -504,30 +506,9 @@ INSERT INTO `orders_refund_reason` (`name`, `role`, `list_order`) VALUES | ||
| 504 | ('无法完成配送', 2, 2), | 506 | ('无法完成配送', 2, 2), |
| 505 | ('其他原因', 2, 99); | 507 | ('其他原因', 2, 99); |
| 506 | 508 | ||
| 507 | --- 外部门店表(接入方通过开放平台同步自己系统的门店) | ||
| 508 | -CREATE TABLE `ext_store` ( | ||
| 509 | - `id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT, | ||
| 510 | - `app_key` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '所属应用AppKey', | ||
| 511 | - `out_store_id` VARCHAR(64) NOT NULL DEFAULT '' COMMENT '接入方门店原始ID', | ||
| 512 | - `name` VARCHAR(128) NOT NULL DEFAULT '' COMMENT '门店名称', | ||
| 513 | - `address` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '门店地址', | ||
| 514 | - `lng` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '经度', | ||
| 515 | - `lat` VARCHAR(32) NOT NULL DEFAULT '' COMMENT '纬度', | ||
| 516 | - `city_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '所属城市ID', | ||
| 517 | - `phone` VARCHAR(20) NOT NULL DEFAULT '' COMMENT '联系电话', | ||
| 518 | - `status` TINYINT NOT NULL DEFAULT 1 COMMENT '状态:0=关闭 1=营业', | ||
| 519 | - `remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '备注', | ||
| 520 | - `create_time` BIGINT UNSIGNED NOT NULL DEFAULT 0, | ||
| 521 | - `update_time` BIGINT UNSIGNED NOT NULL DEFAULT 0, | ||
| 522 | - PRIMARY KEY (`id`), | ||
| 523 | - UNIQUE KEY `uk_app_store` (`app_key`, `out_store_id`), | ||
| 524 | - KEY `idx_city_id` (`city_id`) | ||
| 525 | -) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='外部门店表'; | ||
| 526 | - | ||
| 527 | -- orders 表补充货物快照字段 | 509 | -- orders 表补充货物快照字段 |
| 528 | ALTER TABLE `orders` ADD COLUMN `items_json` TEXT COMMENT '货物清单快照JSON' AFTER `callback_url`; | 510 | ALTER TABLE `orders` ADD COLUMN `items_json` TEXT COMMENT '货物清单快照JSON' AFTER `callback_url`; |
| 529 | ALTER TABLE `orders` ADD COLUMN `item_remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '整单货物备注' AFTER `items_json`; | 511 | ALTER TABLE `orders` ADD COLUMN `item_remark` VARCHAR(255) NOT NULL DEFAULT '' COMMENT '整单货物备注' AFTER `items_json`; |
| 530 | -ALTER TABLE `orders` ADD COLUMN `ext_store_id` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '关联外部门店ID' AFTER `item_remark`; | ||
| 531 | 512 | ||
| 532 | -- orders 表补充调度字段 | 513 | -- orders 表补充调度字段 |
| 533 | ALTER TABLE `orders` ADD COLUMN `dispatch_time` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '系统派单时间' AFTER `trans_time`; | 514 | ALTER TABLE `orders` ADD COLUMN `dispatch_time` BIGINT UNSIGNED NOT NULL DEFAULT 0 COMMENT '系统派单时间' AFTER `trans_time`; |