瀏覽代碼

Merge remote-tracking branch 'origin/master'

wangming 3 周之前
父節點
當前提交
6d14a9bd0e
共有 100 個文件被更改,包括 3690 次插入1289 次删除
  1. 2 1
      yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java
  2. 9 4
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java
  3. 5 4
      yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java
  4. 45 47
      yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopDetailController.java
  5. 199 198
      yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java
  6. 0 1
      yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java
  7. 28 25
      yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/UserRegisterParam.java
  8. 38 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/PointsRechargeTemplateDTO.java
  9. 5 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java
  10. 16 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ShopCategoryDto.java
  11. 29 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ShopCategoryExcelDTO.java
  12. 52 52
      yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DvyType.java
  13. 5 3
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProd.java
  14. 8 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ChannelProd.java
  15. 39 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ChannelShop.java
  16. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Dept.java
  17. 1 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/DeptUser.java
  18. 14 5
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/FrontCategory.java
  19. 44 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/Label.java
  20. 65 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsFailureRecord.java
  21. 102 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecharge.java
  22. 91 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java
  23. 96 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopCategory.java
  24. 7 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java
  25. 4 4
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopSku.java
  26. 68 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictData.java
  27. 59 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictType.java
  28. 4 1
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysUser.java
  29. 2 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java
  30. 76 0
      yami-shop-bean/src/main/java/com/yami/shop/bean/vo/FrontCategoryVO.java
  31. 1 0
      yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/impl/TransportManagerServiceImpl.java
  32. 1 0
      yami-shop-multishop/src/main/java/com/yami/shop/multishop/controller/CategoryController.java
  33. 95 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/AdvertInfoController.java
  34. 54 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/CategoryPropController.java
  35. 4 4
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/DeptUserController.java
  36. 117 117
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/FileController.java
  37. 84 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/LabelController.java
  38. 74 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsFailureRecordController.java
  39. 108 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java
  40. 74 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRecordController.java
  41. 194 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopCategoryController.java
  42. 7 7
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopSkuController.java
  43. 107 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/SysDictDataController.java
  44. 112 0
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/SysDictTypeController.java
  45. 2 3
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/FrontCategoryController.java
  46. 2 8
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/GoodsController.java
  47. 31 2
      yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/StoreManagementController.java
  48. 389 389
      yami-shop-platform/src/main/java/com/yami/shop/platform/task/OrderTask.java
  49. 1 1
      yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java
  50. 7 6
      yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/service/impl/YamiUserServiceImpl.java
  51. 2 0
      yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/token/AuthenticationToken.java
  52. 1 0
      yami-shop-security/yami-shop-security-platform/src/main/java/com/yami/shop/security/platform/config/ResourceServerConfiguration.java
  53. 4 5
      yami-shop-service/src/main/java/com/yami/shop/dao/CategoryProdMapper.java
  54. 33 33
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java
  55. 17 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ChannelShopMapper.java
  56. 3 1
      yami-shop-service/src/main/java/com/yami/shop/dao/DeptMapper.java
  57. 2 2
      yami-shop-service/src/main/java/com/yami/shop/dao/DeptUserMapper.java
  58. 2 0
      yami-shop-service/src/main/java/com/yami/shop/dao/FrontCategoryMapper.java
  59. 14 0
      yami-shop-service/src/main/java/com/yami/shop/dao/LabelMapper.java
  60. 14 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsFailureRecordMapper.java
  61. 14 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRechargeMapper.java
  62. 15 0
      yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java
  63. 35 0
      yami-shop-service/src/main/java/com/yami/shop/dao/ShopCategoryMapper.java
  64. 2 1
      yami-shop-service/src/main/java/com/yami/shop/dao/ShopDetailMapper.java
  65. 3 3
      yami-shop-service/src/main/java/com/yami/shop/dao/ShopSkuMapper.java
  66. 3 1
      yami-shop-service/src/main/java/com/yami/shop/dao/SkuMapper.java
  67. 96 0
      yami-shop-service/src/main/java/com/yami/shop/dao/SysDictDataMapper.java
  68. 85 0
      yami-shop-service/src/main/java/com/yami/shop/dao/SysDictTypeMapper.java
  69. 23 0
      yami-shop-service/src/main/java/com/yami/shop/dao/TzSysUserMapper.java
  70. 2 2
      yami-shop-service/src/main/java/com/yami/shop/service/CategoryProdService.java
  71. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/DeptService.java
  72. 4 4
      yami-shop-service/src/main/java/com/yami/shop/service/DeptUserService.java
  73. 18 0
      yami-shop-service/src/main/java/com/yami/shop/service/IFrontCategoryService.java
  74. 40 0
      yami-shop-service/src/main/java/com/yami/shop/service/IShopCategoryService.java
  75. 61 0
      yami-shop-service/src/main/java/com/yami/shop/service/ISysDictDataService.java
  76. 99 0
      yami-shop-service/src/main/java/com/yami/shop/service/ISysDictTypeService.java
  77. 14 0
      yami-shop-service/src/main/java/com/yami/shop/service/LabelService.java
  78. 15 0
      yami-shop-service/src/main/java/com/yami/shop/service/PointsFailureRecordService.java
  79. 31 0
      yami-shop-service/src/main/java/com/yami/shop/service/PointsRechargeService.java
  80. 15 0
      yami-shop-service/src/main/java/com/yami/shop/service/PointsRecordService.java
  81. 59 55
      yami-shop-service/src/main/java/com/yami/shop/service/ShopDetailService.java
  82. 0 22
      yami-shop-service/src/main/java/com/yami/shop/service/ShopProdService.java
  83. 13 0
      yami-shop-service/src/main/java/com/yami/shop/service/ShopSkuService.java
  84. 22 14
      yami-shop-service/src/main/java/com/yami/shop/service/SkuService.java
  85. 29 29
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBFrontCategoryService.java
  86. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBGoodsService.java
  87. 1 1
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBOrderService.java
  88. 27 0
      yami-shop-service/src/main/java/com/yami/shop/service/hb/IStoreManagementService.java
  89. 108 109
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBFrontCategoryService.java
  90. 29 30
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java
  91. 2 5
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java
  92. 46 10
      yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/StoreManagementService.java
  93. 2 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/AttachFileServiceImpl.java
  94. 22 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryProdServiceImpl.java
  95. 0 31
      yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryPropServiceImpl.java
  96. 3 11
      yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryServiceImpl.java
  97. 38 22
      yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelProdServiceImpl.java
  98. 7 6
      yami-shop-service/src/main/java/com/yami/shop/service/impl/DeptServiceImpl.java
  99. 5 5
      yami-shop-service/src/main/java/com/yami/shop/service/impl/DeptUserServiceImpl.java
  100. 30 0
      yami-shop-service/src/main/java/com/yami/shop/service/impl/FrontCategoryService.java

+ 2 - 1
yami-shop-api/src/main/java/com/yami/shop/api/controller/CategoryController.java

@@ -58,7 +58,8 @@ public class CategoryController {
             @ApiImplicitParam(name = "shopId", value = "店铺id", required = false, dataType = "Long")
     })
 
-    public ResponseEntity<IPage<CategoryDto>> categoryInfo(@RequestParam(value = "parentId", defaultValue = "0") Long parentId, @RequestParam(value = "shopId",required = false) Long shopId,
+    public ResponseEntity<IPage<CategoryDto>> categoryInfo(@RequestParam(value = "parentId", defaultValue = "0") Long parentId,
+                                                           @RequestParam(value = "shopId",required = false) Long shopId,
                                                            @RequestParam(value = "current", defaultValue = "1") Integer current,
                                                            @RequestParam(value = "size", defaultValue = "10") Integer size) {
         IPage<Category> categories = categoryService.listByParentIdAndShopId(parentId,shopId, current, size);

+ 9 - 4
yami-shop-api/src/main/java/com/yami/shop/api/controller/ProdController.java

@@ -32,6 +32,7 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
+import java.util.Comparator;
 import java.util.List;
 import java.util.stream.Collectors;
 
@@ -53,20 +54,23 @@ public class ProdController {
     private ProdCommService prodCommService;
 
 
-
     @GetMapping("/prodInfo")
     @ApiOperation(value = "商品详情信息", notes = "根据商品ID(prodId)获取商品信息")
     @ApiImplicitParam(name = "prodId", value = "商品ID", required = true, dataType = "Long")
-    public ResponseEntity<ProductDto> prodInfo(Long prodId) {
+    public ResponseEntity<ProductDto> prodInfo(Long prodId, Integer platform, Long shopId) {
 
         Product product = prodService.getProductByProdId(prodId);
         if (product == null || product.getStatus() != 1) {
             throw new GlobalException("商品已下线");
         }
 
-        List<Sku> skuList = skuService.listByProdId(prodId);
+        List<Sku> skuList = skuService.listByProdId(prodId, platform, shopId);
         // 启用的sku列表
-        List<Sku> useSkuList = skuList.stream().filter(sku -> sku.getStatus() == 1).collect(Collectors.toList());
+        List<Sku> useSkuList = skuList.stream().sorted(Comparator.comparing(
+                Sku::getPrice,
+                Comparator.nullsFirst(Comparator.naturalOrder())
+        )).peek((sku) -> product.setTotalStocks(product.getTotalStocks() + sku.getActualStocks())).collect(Collectors.toList());
+        product.setPrice(useSkuList.get(0).getPrice());
         product.setSkuList(useSkuList);
 //        ProductDto productDto = mapperFacade.map(product, ProductDto.class);
         ProductDto productDto = new ProductDto();
@@ -135,6 +139,7 @@ public class ProdController {
     public ResponseEntity<IPage<ProdCommDto>> getProdCommPageByProdId(PageParam page, Long prodId, Integer evaluate) {
         return ResponseEntity.ok(prodCommService.getProdCommDtoPageByProdId(page, prodId, evaluate));
     }
+
     @PostMapping("/listProdByCategoryIdAndShopId")
     @ApiOperation(value = "根据分类ID、商户ID查询归属的所有商品")
     public ResponseEntity<IPage<Product>> listProdByCategoryIdAndShopId(@RequestBody ProdByCategoryIdAndShopIdDTO prodByCategoryIdAndShopIdDTO) {

+ 5 - 4
yami-shop-api/src/main/java/com/yami/shop/api/controller/SearchController.java

@@ -12,6 +12,7 @@ package com.yami.shop.api.controller;
 
 
 import cn.hutool.core.collection.CollectionUtil;
+import com.alibaba.fastjson.JSON;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.app.param.SearchParam;
 import com.yami.shop.bean.dto.HotSearchDto;
@@ -51,7 +52,7 @@ public class SearchController {
             @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"),
             @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"),
     })
-    public ResponseEntity<List<HotSearchDto>> hotSearchByShopId(Long shopId,Integer number,Integer sort) {
+    public ResponseEntity<List<HotSearchDto>> hotSearchByShopId(Long shopId, Integer number, Integer sort) {
         List<HotSearchDto> list = hotSearchService.getHotSearchDtoByshopId(shopId);
 
         return getListResponseEntity(number, sort, list);
@@ -63,16 +64,16 @@ public class SearchController {
             @ApiImplicitParam(name = "number", value = "取数", required = true, dataType = "Integer"),
             @ApiImplicitParam(name = "sort", value = "是否按照顺序(0 否 1是)", required = false, dataType = "Integer"),
     })
-    public ResponseEntity<List<HotSearchDto>> hotSearch(Integer number,Integer sort) {
+    public ResponseEntity<List<HotSearchDto>> hotSearch(Integer number, Integer sort) {
         List<HotSearchDto> list = hotSearchService.getHotSearchDtoByshopId(0L);
         return getListResponseEntity(number, sort, list);
     }
 
     private ResponseEntity<List<HotSearchDto>> getListResponseEntity(Integer number, Integer sort, List<HotSearchDto> list) {
-        if(sort == null || sort == 0){
+        if (sort == null || sort == 0) {
             Collections.shuffle(list);
         }
-        if(!CollectionUtil.isNotEmpty(list) || list.size()< number){
+        if (!CollectionUtil.isNotEmpty(list) || list.size() < number) {
             return ResponseEntity.ok(list);
         }
         return ResponseEntity.ok(list.subList(0, number));

+ 45 - 47
yami-shop-api/src/main/java/com/yami/shop/api/controller/ShopDetailController.java

@@ -32,7 +32,6 @@ import java.util.Objects;
 
 
 /**
- *
  * @author lgh on 2018/08/29.
  */
 @RestController
@@ -43,52 +42,51 @@ public class ShopDetailController {
 
     private final ShopDetailService shopDetailService;
 
-	private final UserCollectionShopService userCollectionShopService;
-
-	@GetMapping("/headInfo")
-	@ApiOperation(value = "店铺头部信息", notes = "获取的店铺头部信息")
-	public ResponseEntity<ShopHeadInfoDto> getShopHeadInfo(Long shopId) {
-		ShopHeadInfoDto shopHeadInfoDto = new ShopHeadInfoDto();
-		// 粉丝数量
-		int fansCount = userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>().eq(UserCollectionShop::getShopId, shopId));
-		ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(shopId);
-		if(!Objects.equals(shopDetail.getShopStatus(),1)){
-			shopHeadInfoDto.setShopStatus(shopDetail.getShopStatus());
-			return ResponseEntity.ok(shopHeadInfoDto);
-		}
-		shopHeadInfoDto.setShopId(shopId);
-		shopHeadInfoDto.setShopLogo(shopDetail.getShopLogo());
-		shopHeadInfoDto.setShopName(shopDetail.getShopName());
+    private final UserCollectionShopService userCollectionShopService;
+
+    @GetMapping("/headInfo")
+    @ApiOperation(value = "店铺头部信息", notes = "获取的店铺头部信息")
+    public ResponseEntity<ShopHeadInfoDto> getShopHeadInfo(Long shopId) {
+        ShopHeadInfoDto shopHeadInfoDto = new ShopHeadInfoDto();
+        // 粉丝数量
+        int fansCount = userCollectionShopService.count(new LambdaQueryWrapper<UserCollectionShop>().eq(UserCollectionShop::getShopId, shopId));
+        ShopDetail shopDetail = shopDetailService.getShopDetailByShopId(shopId);
+        if (!Objects.equals(shopDetail.getShopStatus(), 1)) {
+            shopHeadInfoDto.setShopStatus(shopDetail.getShopStatus());
+            return ResponseEntity.ok(shopHeadInfoDto);
+        }
+        shopHeadInfoDto.setShopId(shopId);
+        shopHeadInfoDto.setShopLogo(shopDetail.getShopLogo());
+        shopHeadInfoDto.setShopName(shopDetail.getShopName());
         shopHeadInfoDto.setIntro(shopDetail.getIntro());
-		shopHeadInfoDto.setFansCount(fansCount);
-		shopHeadInfoDto.setTel(shopDetail.getTel());
-		shopHeadInfoDto.setThirdPartyCode(shopDetail.getThirdPartyCode());
-		return ResponseEntity.ok(shopHeadInfoDto);
-	}
-
-	@GetMapping("/hotShops")
-	@ApiOperation(value = "热门店铺", notes = "热门店铺")
-	public ResponseEntity<List<ShopHeadInfoDto>> hotShops() {
-		List<ShopHeadInfoDto> hotShopsHead =  shopDetailService.listHotShopsHead();
-
-		return ResponseEntity.ok(hotShopsHead);
-	}
-
-
-
-	@GetMapping("/searchShops")
-	@ApiOperation(value = "搜索店铺", notes = "根据店铺名称搜索店铺")
-	public ResponseEntity<Page<ShopHeadInfoDto>> searchShops(PageParam<ShopHeadInfoDto> page,ShopHeadInfoDto shopHeadInfoDto) {
-		Page<ShopHeadInfoDto> hotShopsHeadPage =  shopDetailService.searchShops(page,shopHeadInfoDto);
-
-		return ResponseEntity.ok(hotShopsHeadPage);
-	}
-
-	@GetMapping("/neighborShop")
-	@ApiOperation("根据经纬度获取最近店铺")
-	public ResponseEntity<ShopHeadInfoDto> neighborShop(@RequestParam("lat") String lat,
-														  @RequestParam("lon") String lon) {
-		return shopDetailService.neighborShop(lat, lon);
-	}
+        shopHeadInfoDto.setFansCount(fansCount);
+        shopHeadInfoDto.setTel(shopDetail.getTel());
+        shopHeadInfoDto.setThirdPartyCode(shopDetail.getThirdPartyCode());
+        return ResponseEntity.ok(shopHeadInfoDto);
+    }
+
+    @GetMapping("/hotShops")
+    @ApiOperation(value = "热门店铺", notes = "热门店铺")
+    public ResponseEntity<List<ShopHeadInfoDto>> hotShops() {
+        List<ShopHeadInfoDto> hotShopsHead = shopDetailService.listHotShopsHead();
+
+        return ResponseEntity.ok(hotShopsHead);
+    }
+
+
+    @GetMapping("/searchShops")
+    @ApiOperation(value = "搜索店铺", notes = "根据店铺名称搜索店铺")
+    public ResponseEntity<Page<ShopHeadInfoDto>> searchShops(PageParam<ShopHeadInfoDto> page, ShopHeadInfoDto shopHeadInfoDto) {
+        Page<ShopHeadInfoDto> hotShopsHeadPage = shopDetailService.searchShops(page, shopHeadInfoDto);
+
+        return ResponseEntity.ok(hotShopsHeadPage);
+    }
+
+    @GetMapping("/neighborShop")
+    @ApiOperation("根据经纬度获取最近店铺")
+    public ResponseEntity<ShopHeadInfoDto> neighborShop(@RequestParam("lat") String lat,
+                                                        @RequestParam("lon") String lon, @RequestParam("platform") Integer platform) {
+        return shopDetailService.neighborShop(lat, lon, platform);
+    }
 
 }

+ 199 - 198
yami-shop-api/src/main/java/com/yami/shop/api/controller/UserRegisterController.java

@@ -55,209 +55,210 @@ import java.util.Objects;
 
 /**
  * 用户信息
+ *
  * @author LGH
  */
 @RestController
 @RequestMapping("/user")
-@Api(tags="用户注册相关接口")
+@Api(tags = "用户注册相关接口")
 @AllArgsConstructor
 public class UserRegisterController {
 
-	private final UserService userService;
-
-	private final SmsLogService smsLogService;
-
-	private final AppConnectService appConnectService;
-
-	private final LoginAuthSuccessHandler loginAuthSuccessHandler;
-
-	private final WxConfig wxConfig;
-
-	private final YamiUserDetailsService yamiUserDetailsService;
-
-	private final PasswordEncoder passwordEncoder;
-
-
-	public static final String CHECK_REGISTER_SMS_FLAG = "checkRegisterSmsFlag";
-
-	public static final String CHECK_UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag";
-
-	@PutMapping("/sendRegisterSms")
-	@ApiOperation(value="发送注册验证码", notes="发送注册验证码")
-	public ResponseEntity<Void> register(@Valid @RequestBody SendSmsParam sendSmsParam) {
-		if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile, sendSmsParam.getMobile())) > 0) {
-			throw new GlobalException("该手机号已注册,无法重新注册");
-		}
-		// 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
-		smsLogService.sendSms(SmsType.REGISTER, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
-		return ResponseEntity.ok().build();
-	}
-
-	@PutMapping("/checkRegisterSms")
-	@ApiOperation(value="校验验证码", notes="校验验证码返回校验成功的标识")
-	public ResponseEntity<String> register(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
-		// 每个ip每分钟只能发十个注册的验证码,免得接口被利用
-		if (!smsLogService.checkValidCode(checkRegisterSmsParam.getMobile(), checkRegisterSmsParam.getValidCode(), SmsType.REGISTER)){
-			throw new GlobalException("验证码有误或已过期");
-		}
-		String checkRegisterSmsFlag = IdUtil.simpleUUID();
-		RedisUtil.set(CHECK_REGISTER_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
-		return ResponseEntity.ok(checkRegisterSmsFlag);
-	}
-
-	@PutMapping("/sendBindSms")
-	@ApiOperation(value="发送绑定验证码", notes="发送绑定验证码")
-	public ResponseEntity<Void> bindSms(@Valid @RequestBody SendSmsParam sendSmsParam) {
-		// 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
-		smsLogService.sendSms(SmsType.VALID, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
-		return ResponseEntity.ok().build();
-	}
-
-	@PutMapping("/registerOrBindUser")
-	@ApiOperation(value="注册或绑定手机号", notes="用户注册或绑定手机号接口")
-	public ResponseEntity<Void> register(HttpServletRequest request, HttpServletResponse response, @Valid @RequestBody UserRegisterParam userRegisterParam) {
-
-		String mobile = userRegisterParam.getMobile();
-		AppConnect appConnect = null;
-		User user = null;
-		String bizUserId = null;
-
-
-		// 正在进行注册,通过验证码校验
-		if (Objects.equals(userRegisterParam.getRegisterOrBind(), 1)) {
-
-			// 看看有没有校验验证码成功的标识
-			userService.validate(userRegisterParam, CHECK_REGISTER_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
-			// 正在进行申请注册
-			if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile,userRegisterParam.getMobile())) > 0) {
-				throw new GlobalException("手机号已存在,无法注册");
-			}
-		}
-		// 小程序注册/绑定手机号
-		else {
-			YamiUser yamiUser =  SecurityUtils.getUser();
-			appConnect = appConnectService.getByBizUserId(yamiUser.getBizUserId(), yamiUser.getAppType());
-			bizUserId = yamiUser.getBizUserId();
-			// 通过微信手机号校验
-			if (Objects.equals(2, userRegisterParam.getValidateType())) {
-				try {
-					WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxConfig.getWxMaService().getUserService().getPhoneNoInfo(yamiUser.getSessionKey(), userRegisterParam.getEncryptedData(), userRegisterParam.getIvStr());
-					mobile = wxMaPhoneNumberInfo.getPhoneNumber();
-
-				} catch (Exception e) {
-					throw new GlobalException("授权失败,请重新授权");
-				}
-				if (StrUtil.isBlank(mobile)) {
-					throw new GlobalException("无法获取用户手机号信息");
-				}
-				user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
-			}
-			// 通过账号密码校验
-			else if (Objects.equals(3, userRegisterParam.getValidateType())) {
-				user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
-				if (user == null) {
-					throw new GlobalException("账号或密码不正确");
-				}
-				String encodedPassword = user.getLoginPassword();
-				String rawPassword = userRegisterParam.getPassword();
-				// 密码不正确
-				if (StrUtil.isBlank(encodedPassword) || !passwordEncoder.matches(rawPassword,encodedPassword)){
-					throw new GlobalException("账号或密码不正确");
-				}
-			}
-			// 通过验证码校验
-			else {
-				if (!smsLogService.checkValidCode(userRegisterParam.getMobile(), userRegisterParam.getValidCode(), SmsType.VALID)){
-					throw new GlobalException("验证码有误或已过期");
-				}
-			}
-		}
-
-		Date now = new Date();
-
-		// 尝试用手机号获取用户信息
-		if (user == null && StrUtil.isNotBlank(mobile)) {
-			user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile,mobile));
-		}
-
-		// 新建用户
-		if (user == null) {
-			user = new User();
-			if (StrUtil.isBlank(userRegisterParam.getUserName())) {
-				userRegisterParam.setUserName(mobile);
-			}
-
-			// 如果有用户名,就判断用户名格式是否正确
-			if (!PrincipalUtil.isUserName(userRegisterParam.getUserName())) {
-				throw new GlobalException("用户名应由4-16位数字字母下划线组成");
-			}
-
-			user.setModifyTime(now);
-			user.setUserRegtime(now);
-			user.setUserRegip(IPHelper.getIpAddr());
-			user.setStatus(1);
-
-			user.setPic(userRegisterParam.getImg());
-			user.setUserMobile(mobile);
-			user.setUserName(userRegisterParam.getUserName());
-			if (StrUtil.isNotBlank(userRegisterParam.getPassword())) {
-				user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
-			}
-			// 用户名就是默认的昵称
-			user.setNickName(StrUtil.isBlank(userRegisterParam.getNickName())? userRegisterParam.getUserName(): userRegisterParam.getNickName());
-		}
-
-
-		appConnectService.registerOrBindUser(user, appConnect, userRegisterParam.getAppType());
-
-
-		//进行授权登录
-		UserDetails userDetails = yamiUserDetailsService.getYamiUser(userRegisterParam.getAppType(),user, bizUserId);
-		AuthenticationToken authenticationToken = new AuthenticationToken();
-		authenticationToken.setPrincipal(user.getUserMobile());
-		authenticationToken.setCredentials(user.getLoginPassword());
-		authenticationToken.setPrincipal(userDetails.getUsername());
-		authenticationToken.setDetails(userDetails);
-		authenticationToken.setAuthenticated(true);
-		loginAuthSuccessHandler.onAuthenticationSuccess(request,response,authenticationToken);
-
-		return ResponseEntity.ok().build();
-	}
-
-
-	@PutMapping("/checkUpdatePwdSms")
-	@ApiOperation(value="修改密码校验验证码", notes="校验验证码返回校验成功的标识")
-	public ResponseEntity<String> checkUpdatePwdSms(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
-		User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, checkRegisterSmsParam.getMobile()));
-		if (user == null) {
-			throw new GlobalException("无法获取用户信息");
-		}
-		if (!smsLogService.checkValidCode(user.getUserMobile(), checkRegisterSmsParam.getValidCode(), SmsType.UPDATE_PASSWORD)){
-			throw new GlobalException("验证码有误或已过期");
-		}
-		String checkRegisterSmsFlag = IdUtil.simpleUUID();
-		RedisUtil.set(CHECK_UPDATE_PWD_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
-		return ResponseEntity.ok(checkRegisterSmsFlag);
-	}
-
-	@PutMapping("/updatePwd")
-	@ApiOperation(value="修改密码", notes="修改密码")
-	public ResponseEntity<Void> updatePwd(@Valid @RequestBody UserRegisterParam userRegisterParam) {
-		User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, userRegisterParam.getMobile()));
-		if (user == null) {
-			throw new GlobalException("无法获取用户信息");
-		}
-		// 看看有没有校验验证码成功的标识
-		userService.validate(userRegisterParam, CHECK_UPDATE_PWD_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
-		if (StrUtil.isBlank(userRegisterParam.getPassword())) {
-			throw new GlobalException("新密码不能为空");
-		}
-		if (StrUtil.equals(passwordEncoder.encode(userRegisterParam.getPassword()),user.getLoginPassword())) {
-			throw new GlobalException("新密码不能与原密码相同!");
-		}
-		user.setModifyTime(new Date());
-		user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
-		userService.updateById(user);
-		return ResponseEntity.ok().build();
-	}
+    private final UserService userService;
+
+    private final SmsLogService smsLogService;
+
+    private final AppConnectService appConnectService;
+
+    private final LoginAuthSuccessHandler loginAuthSuccessHandler;
+
+    private final WxConfig wxConfig;
+
+    private final YamiUserDetailsService yamiUserDetailsService;
+
+    private final PasswordEncoder passwordEncoder;
+
+
+    public static final String CHECK_REGISTER_SMS_FLAG = "checkRegisterSmsFlag";
+
+    public static final String CHECK_UPDATE_PWD_SMS_FLAG = "updatePwdSmsFlag";
+
+    @PutMapping("/sendRegisterSms")
+    @ApiOperation(value = "发送注册验证码", notes = "发送注册验证码")
+    public ResponseEntity<Void> register(@Valid @RequestBody SendSmsParam sendSmsParam) {
+        if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile, sendSmsParam.getMobile())) > 0) {
+            throw new GlobalException("该手机号已注册,无法重新注册");
+        }
+        // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+        smsLogService.sendSms(SmsType.REGISTER, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+        return ResponseEntity.ok().build();
+    }
+
+    @PutMapping("/checkRegisterSms")
+    @ApiOperation(value = "校验验证码", notes = "校验验证码返回校验成功的标识")
+    public ResponseEntity<String> register(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
+        // 每个ip每分钟只能发十个注册的验证码,免得接口被利用
+        if (!smsLogService.checkValidCode(checkRegisterSmsParam.getMobile(), checkRegisterSmsParam.getValidCode(), SmsType.REGISTER)) {
+            throw new GlobalException("验证码有误或已过期");
+        }
+        String checkRegisterSmsFlag = IdUtil.simpleUUID();
+        RedisUtil.set(CHECK_REGISTER_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
+        return ResponseEntity.ok(checkRegisterSmsFlag);
+    }
+
+    @PutMapping("/sendBindSms")
+    @ApiOperation(value = "发送绑定验证码", notes = "发送绑定验证码")
+    public ResponseEntity<Void> bindSms(@Valid @RequestBody SendSmsParam sendSmsParam) {
+        // 每个手机号每分钟只能发十个注册的验证码,免得接口被利用
+        smsLogService.sendSms(SmsType.VALID, sendSmsParam.getMobile(), sendSmsParam.getMobile(), Maps.newHashMap());
+        return ResponseEntity.ok().build();
+    }
+
+    @PutMapping("/registerOrBindUser")
+    @ApiOperation(value = "注册或绑定手机号", notes = "用户注册或绑定手机号接口")
+    public ResponseEntity<Void> register(HttpServletRequest request, HttpServletResponse response, @Valid @RequestBody UserRegisterParam userRegisterParam) {
+
+        String mobile = userRegisterParam.getMobile();
+        AppConnect appConnect = null;
+        User user = null;
+        String bizUserId = null;
+
+
+        // 正在进行注册,通过验证码校验
+        if (Objects.equals(userRegisterParam.getRegisterOrBind(), 1)) {
+
+            // 看看有没有校验验证码成功的标识
+            userService.validate(userRegisterParam, CHECK_REGISTER_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
+            // 正在进行申请注册
+            if (userService.count(new LambdaQueryWrapper<User>().eq(User::getUserMobile, userRegisterParam.getMobile())) > 0) {
+                throw new GlobalException("手机号已存在,无法注册");
+            }
+        }
+        // 小程序注册/绑定手机号
+        else {
+            // 检查用户是否已经认证,只有在认证状态下才获取用户信息
+                YamiUser yamiUser = SecurityUtils.getUser();
+                appConnect = appConnectService.getByBizUserId(yamiUser.getBizUserId(), yamiUser.getAppType());
+                bizUserId = yamiUser.getBizUserId();
+                // 通过微信手机号校验
+                if (Objects.equals(2, userRegisterParam.getValidateType())) {
+                    try {
+                        WxMaPhoneNumberInfo wxMaPhoneNumberInfo = wxConfig.getWxMaService().getUserService().getPhoneNoInfo(yamiUser.getSessionKey(), userRegisterParam.getEncryptedData(), userRegisterParam.getIvStr());
+                        mobile = wxMaPhoneNumberInfo.getPhoneNumber();
+
+                    } catch (Exception e) {
+                        throw new GlobalException("授权失败,请重新授权");
+                    }
+                    if (StrUtil.isBlank(mobile)) {
+                        throw new GlobalException("无法获取用户手机号信息");
+                    }
+                    user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
+                }
+                // 通过账号密码校验
+                else if (Objects.equals(3, userRegisterParam.getValidateType())) {
+                    user = yamiUserDetailsService.loadUserByMobileOrUserName(mobile, 0);
+                    if (user == null) {
+                        throw new GlobalException("账号或密码不正确");
+                    }
+                    String encodedPassword = user.getLoginPassword();
+                    String rawPassword = userRegisterParam.getPassword();
+                    // 密码不正确
+                    if (StrUtil.isBlank(encodedPassword) || !passwordEncoder.matches(rawPassword, encodedPassword)) {
+                        throw new GlobalException("账号或密码不正确");
+                    }
+                }
+                // 通过验证码校验
+                else {
+                    if (!smsLogService.checkValidCode(userRegisterParam.getMobile(), userRegisterParam.getValidCode(), SmsType.VALID)) {
+                        throw new GlobalException("验证码有误或已过期");
+                    }
+                }
+        }
+
+        Date now = new Date();
+        if (user == null && StrUtil.isNotBlank(mobile)) {
+            user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, mobile).eq(User::getPlatform, userRegisterParam.getPlatform()));
+        }
+
+        // 新建用户
+        if (user == null) {
+            user = new User();
+            if (StrUtil.isBlank(userRegisterParam.getUserName())) {
+                userRegisterParam.setUserName(mobile);
+            }
+
+            // 如果有用户名,就判断用户名格式是否正确
+            if (!PrincipalUtil.isUserName(userRegisterParam.getUserName())) {
+                throw new GlobalException("用户名应由4-16位数字字母下划线组成");
+            }
+
+            user.setModifyTime(now);
+            user.setUserRegtime(now);
+            user.setUserRegip(IPHelper.getIpAddr());
+            user.setStatus(1);
+			user.setPlatform(userRegisterParam.getPlatform());
+            user.setPic(userRegisterParam.getImg());
+            user.setUserMobile(mobile);
+            user.setUserName(userRegisterParam.getUserName());
+            if (StrUtil.isNotBlank(userRegisterParam.getPassword())) {
+                user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
+            }
+            // 用户名就是默认的昵称
+            user.setNickName(StrUtil.isBlank(userRegisterParam.getNickName()) ? userRegisterParam.getUserName() : userRegisterParam.getNickName());
+        }
+
+
+        appConnectService.registerOrBindUser(user, appConnect, userRegisterParam.getAppType());
+
+
+        //进行授权登录
+        UserDetails userDetails = yamiUserDetailsService.getYamiUser(userRegisterParam.getAppType(), user, bizUserId);
+        AuthenticationToken authenticationToken = new AuthenticationToken();
+        authenticationToken.setPrincipal(user.getUserMobile());
+        authenticationToken.setCredentials(user.getLoginPassword());
+        authenticationToken.setPrincipal(userDetails.getUsername());
+        authenticationToken.setDetails(userDetails);
+        authenticationToken.setAuthenticated(true);
+//        authenticationToken.setPlatform(user.getPlatform());
+        loginAuthSuccessHandler.onAuthenticationSuccess(request, response, authenticationToken);
+
+        return ResponseEntity.ok().build();
+    }
+
+
+    @PutMapping("/checkUpdatePwdSms")
+    @ApiOperation(value = "修改密码校验验证码", notes = "校验验证码返回校验成功的标识")
+    public ResponseEntity<String> checkUpdatePwdSms(@Valid @RequestBody CheckRegisterSmsParam checkRegisterSmsParam) {
+        User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, checkRegisterSmsParam.getMobile()));
+        if (user == null) {
+            throw new GlobalException("无法获取用户信息");
+        }
+        if (!smsLogService.checkValidCode(user.getUserMobile(), checkRegisterSmsParam.getValidCode(), SmsType.UPDATE_PASSWORD)) {
+            throw new GlobalException("验证码有误或已过期");
+        }
+        String checkRegisterSmsFlag = IdUtil.simpleUUID();
+        RedisUtil.set(CHECK_UPDATE_PWD_SMS_FLAG + checkRegisterSmsFlag, checkRegisterSmsParam.getMobile(), 600);
+        return ResponseEntity.ok(checkRegisterSmsFlag);
+    }
+
+    @PutMapping("/updatePwd")
+    @ApiOperation(value = "修改密码", notes = "修改密码")
+    public ResponseEntity<Void> updatePwd(@Valid @RequestBody UserRegisterParam userRegisterParam) {
+        User user = userService.getOne(new LambdaQueryWrapper<User>().eq(User::getUserMobile, userRegisterParam.getMobile()));
+        if (user == null) {
+            throw new GlobalException("无法获取用户信息");
+        }
+        // 看看有没有校验验证码成功的标识
+        userService.validate(userRegisterParam, CHECK_UPDATE_PWD_SMS_FLAG + userRegisterParam.getCheckRegisterSmsFlag());
+        if (StrUtil.isBlank(userRegisterParam.getPassword())) {
+            throw new GlobalException("新密码不能为空");
+        }
+        if (StrUtil.equals(passwordEncoder.encode(userRegisterParam.getPassword()), user.getLoginPassword())) {
+            throw new GlobalException("新密码不能与原密码相同!");
+        }
+        user.setModifyTime(new Date());
+        user.setLoginPassword(passwordEncoder.encode(userRegisterParam.getPassword()));
+        userService.updateById(user);
+        return ResponseEntity.ok().build();
+    }
 }

+ 0 - 1
yami-shop-api/src/main/java/com/yami/shop/api/listener/ConfirmOrderListener.java

@@ -105,7 +105,6 @@ public class ConfirmOrderListener {
             shopCartItem.setActualTotal(shopCartItem.getProductTotalAmount());
             shopCartOrderDto.setTotalWeight(Arith.add(shopCartOrderDto.getTotalWeight(), Arith.mul(shopCartItem.getWeight(), shopCartItem.getProdCount())));
         }
-
         if (userAddr != null && !Objects.equals(orderParam.getDvyType(), DvyType.FETCH.value())) {
             // 将所有订单传入处理,计算运费
             transfee = transportManagerService.calculateTransfeeSecond2(shopCartItems.get(0).getShopId(), userAddr);

+ 28 - 25
yami-shop-bean/src/main/java/com/yami/shop/bean/app/param/UserRegisterParam.java

@@ -19,43 +19,46 @@ import javax.validation.constraints.NotNull;
 import javax.validation.constraints.Pattern;
 
 @Data
-@ApiModel(value= "设置用户信息")
+@ApiModel(value = "设置用户信息")
 public class UserRegisterParam {
 
-	@ApiModelProperty(value = "密码")
-	private String password;
+    @ApiModelProperty(value = "密码")
+    private String password;
 
-	@ApiModelProperty(value = "手机号")
-	private String mobile;
+    @ApiModelProperty(value = "手机号")
+    private String mobile;
 
-	@ApiModelProperty(value = "验证码")
-	private String validCode;
+    @ApiModelProperty(value = "验证码")
+    private String validCode;
 
-	@ApiModelProperty(value = "微信小程序的encryptedData")
-	private String encryptedData;
+    @ApiModelProperty(value = "微信小程序的encryptedData")
+    private String encryptedData;
 
-	@ApiModelProperty(value = "微信小程序的ivStr")
-	private String ivStr;
+    @ApiModelProperty(value = "微信小程序的ivStr")
+    private String ivStr;
 
-	@ApiModelProperty(value = "头像")
-	private String img;
+    @ApiModelProperty(value = "头像")
+    private String img;
 
-	@ApiModelProperty(value = "昵称")
-	private String nickName;
+    @ApiModelProperty(value = "昵称")
+    private String nickName;
 
-	@ApiModelProperty(value = "用户名")
-	private String userName;
+    @ApiModelProperty(value = "用户名")
+    private String userName;
 
-	@ApiModelProperty(value = "应用类型 1小程序 2微信公众号 3 PC 4 h5")
-	private Integer appType;
+    @ApiModelProperty(value = "应用类型 1小程序 2微信公众号 3 PC 4 h5")
+    private Integer appType;
 
-	@ApiModelProperty(value = "校验登陆注册验证码成功的标识")
-	private String checkRegisterSmsFlag;
+    @ApiModelProperty(value = "校验登陆注册验证码成功的标识")
+    private String checkRegisterSmsFlag;
 
-	@ApiModelProperty(value = "验证类型 1验证码验证 2 小程序encryptedData验证 3 密码验证 ")
-	private Integer validateType;
+    @ApiModelProperty(value = "验证类型 1验证码验证 2 小程序encryptedData验证 3 密码验证 ")
+    private Integer validateType;
 
-	@ApiModelProperty(value = "验证类型 1注册 2绑定 ")
-	private Integer registerOrBind;
+    @ApiModelProperty(value = "验证类型 1注册 2绑定 ")
+    private Integer registerOrBind;
+
+    @ApiModelProperty(value = "平台 1即使零售企业用户 2夫妻店 3 市民请集合C端 ")
+    private Integer platform;
 
 }

+ 38 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/PointsRechargeTemplateDTO.java

@@ -0,0 +1,38 @@
+package com.yami.shop.service.impl;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.format.DateTimeFormat;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * 积分充值导入模板DTO
+ */
+@Data
+public class PointsRechargeTemplateDTO {
+
+    @ExcelProperty("所属企业")
+    @ColumnWidth(20)
+    private String channelName;
+
+    @ExcelProperty("员工名称")
+    @ColumnWidth(20)
+    private String userName;
+
+    @ExcelProperty("员工电话号码")
+    @ColumnWidth(20)
+    private String userPhone;
+
+    @ExcelProperty("充值积分")
+    @ColumnWidth(20)
+    private BigDecimal points;
+
+    @ExcelProperty("过期日期")
+    @ColumnWidth(20)
+    @DateTimeFormat("yyyy/MM/dd") // 可选:指定日期格式
+    private Date expiryDate;
+
+}

+ 5 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/SearchProdDto.java

@@ -60,4 +60,9 @@ public class SearchProdDto {
     @ApiModelProperty(value = "sku列表")
     private List<SkuDto> skuList;
 
+    @ApiModelProperty(value = "banners图片列表")
+    private List<String> banners;
+
+
+
 }

+ 16 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ShopCategoryDto.java

@@ -0,0 +1,16 @@
+package com.yami.shop.bean.dto;
+
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * TODO
+ *
+ * @author mr wang
+ * @version 1.0.0
+ * @since 2025-09-23
+ */
+@Data
+@ApiModel("门店类目数据")
+public class ShopCategoryDto {
+}

+ 29 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/dto/ShopCategoryExcelDTO.java

@@ -0,0 +1,29 @@
+package com.yami.shop.bean.dto;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import lombok.Data;
+
+/**
+ * 门店前台类目Excel导入DTO
+ */
+@Data
+public class ShopCategoryExcelDTO {
+
+    @ExcelProperty("门店ID")
+    @ColumnWidth(20)
+    private Long shopId;
+
+    @ExcelProperty("门店名称")
+    @ColumnWidth(20)
+    private String shopName;
+
+    @ExcelProperty("一级类目名称")
+    @ColumnWidth(30)
+    private String name;
+
+    @ExcelProperty("二级类目名称")
+    @ColumnWidth(30)
+    private String subName;
+
+}

+ 52 - 52
yami-shop-bean/src/main/java/com/yami/shop/bean/enums/DvyType.java

@@ -1,52 +1,52 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.bean.enums;
-
-/**
- * 配送类型
- */
-public enum DvyType {
-
-    /**
-     * 快递
-     */
-    DELIVERY(1),
-    /**
-     * 自提
-     */
-    FETCH(2),
-
-    /**
-     * 无需快递
-     */
-    NOT_DELIVERY(3)
-    ;
-
-    private Integer num;
-
-    public Integer value() {
-        return num;
-    }
-
-    DvyType(Integer num) {
-        this.num = num;
-    }
-
-    public static DvyType instance(Integer value) {
-        DvyType[] enums = values();
-        for (DvyType statusEnum : enums) {
-            if (statusEnum.value().equals(value)) {
-                return statusEnum;
-            }
-        }
-        return null;
-    }
-}
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.enums;
+
+/**
+ * 配送类型
+ */
+public enum DvyType {
+
+    /**
+     * 快递
+     */
+    DELIVERY(1),
+    /**
+     * 自提
+     */
+    FETCH(2),
+
+    /**
+     * 无需快递
+     */
+    NOT_DELIVERY(3)
+    ;
+
+    private Integer num;
+
+    public Integer value() {
+        return num;
+    }
+
+    DvyType(Integer num) {
+        this.num = num;
+    }
+
+    public static DvyType instance(Integer value) {
+        DvyType[] enums = values();
+        for (DvyType statusEnum : enums) {
+            if (statusEnum.value().equals(value)) {
+                return statusEnum;
+            }
+        }
+        return null;
+    }
+}

+ 5 - 3
yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProp.java → yami-shop-bean/src/main/java/com/yami/shop/bean/model/CategoryProd.java

@@ -16,8 +16,8 @@ import lombok.Data;
 import java.io.Serializable;
 
 @Data
-@TableName("tz_category_prop")
-public class CategoryProp implements Serializable {
+@TableName("tz_category_prod")
+public class CategoryProd implements Serializable {
     @TableId
 
     private Long id;
@@ -33,4 +33,6 @@ public class CategoryProp implements Serializable {
      */
 
     private Long propId;
-}
+
+    private Integer isDelete;
+}

+ 8 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ChannelProd.java

@@ -44,6 +44,14 @@ public class ChannelProd implements Serializable {
      * 单品ID
      */
     private Long skuId;
+    /**
+     * 门店ID
+     */
+    private Long shopId;
+    /**
+     * 门店名称
+     */
+    private String shopName;
 
     /**
      * 进货价

+ 39 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ChannelShop.java

@@ -0,0 +1,39 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+
+/**
+ * 渠道对应门店管理实体类
+ *
+ * @author YourName
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_channel_shop")
+public class ChannelShop implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 渠道ID
+     */
+    private Long channelId;
+
+    /**
+     * 门店ID
+     */
+    private Long shopId;
+
+    /**
+     * 删除状态(0-正常,1 -删除)
+     */
+    private Integer isDelete;
+}

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Dept.java

@@ -48,7 +48,7 @@ public class Dept implements Serializable {
      */
     private Long leaderUserId;
     @TableField(exist = false)
-    private Long leaderUserName;
+    private String leaderUserName;
 
     /**
      * 联系电话(加密存储)

+ 1 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/DeptUser.java

@@ -31,7 +31,7 @@ public class DeptUser implements Serializable {
     /**
      * 用户ID
      */
-    private String userId;
+    private Long userId;
 
     /**
      * 创建时间

+ 14 - 5
yami-shop-bean/src/main/java/com/yami/shop/bean/model/FrontCategory.java

@@ -10,12 +10,14 @@
 
 package com.yami.shop.bean.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
 import lombok.Data;
 import lombok.experimental.Accessors;
 
 import java.io.Serializable;
+import java.util.List;
 
 @Data
 @TableName("tz_front_category")
@@ -28,10 +30,10 @@ public class FrontCategory implements Serializable {
     @TableId
     private Long id;
 
-    /**
-     * 父类目ID
-     */
-    private Long pid;
+//    /**
+//     * 父类目ID
+//     */
+//    private Long pid;
 
     /**
      * 编码
@@ -64,7 +66,7 @@ public class FrontCategory implements Serializable {
     private Integer isDelete;
 
     /**
-     * 类目等级
+     * 类目等级(0-一级,1-二级,2-三级)
      */
     private Integer level;
 
@@ -73,9 +75,16 @@ public class FrontCategory implements Serializable {
      */
     private String operateUser;
 
+    /**
+     * 图标
+     */
+    private String icon;
+
     /**
      * 是否叶子(1-是,2-不是)
      */
     private Integer isLeaves;
 
+    @TableField(exist = false)
+    private List<FrontCategory> children;
 }

+ 44 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/Label.java

@@ -0,0 +1,44 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 标签实体类
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_label")
+public class Label implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 标签名称
+     */
+    private String name;
+
+    /**
+     * 标签类型
+     */
+    private Integer type;
+
+    /**
+     * 创建日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date creationDate;
+}

+ 65 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsFailureRecord.java

@@ -0,0 +1,65 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 积分充值失败记录实体类
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_points_failure_record")
+public class PointsFailureRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 失败原因
+     */
+    private String reasonForFailure;
+
+    /**
+     * 渠道(企业ID)
+     */
+    private Long channelId;
+
+    /**
+     * 渠道(企业)名称
+     */
+    private String channelName;
+
+    /**
+     * 员工名称
+     */
+    private String userName;
+
+    /**
+     * 电话号码
+     */
+    private String userPhone;
+
+    /**
+     * 充值积分
+     */
+    private BigDecimal points;
+
+    /**
+     * 过期日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expiryDate;
+}

+ 102 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecharge.java

@@ -0,0 +1,102 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 积分充值实体类
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_points_recharge")
+public class PointsRecharge implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 员工名称
+     */
+    private String userName;
+
+    /**
+     * 电话号码
+     */
+    private String userPhone;
+
+    /**
+     * 渠道(企业ID)
+     */
+    private Long channelId;
+
+    /**
+     * 渠道(企业)名称
+     */
+    private String channelName;
+
+    /**
+     * 充值单号
+     */
+    private String rechargeNumber;
+
+    /**
+     * 充值类型
+     */
+    private Integer type;
+
+    /**
+     * 积分状态(1-未过期,2-过期)
+     */
+    private Integer rechargeStatus;
+
+    /**
+     * 充值积分
+     */
+    private BigDecimal points;
+
+    /**
+     * 过期日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expiryDate;
+
+    /**
+     * 创建者
+     */
+    private String createBy;
+
+    /**
+     * 创建时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /**
+     * 备注
+     */
+    private String remark;
+}

+ 91 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/PointsRecord.java

@@ -0,0 +1,91 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.util.Date;
+
+/**
+ * 积分记录详细实体类
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_points_record")
+public class PointsRecord implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 用户ID
+     */
+    private Long userId;
+
+    /**
+     * 渠道(企业ID)
+     */
+    private Long channelId;
+
+    /**
+     * 订单ID
+     */
+    private Long orderId;
+
+    /**
+     * 充值积分ID
+     */
+    private Long pointsId;
+
+    /**
+     * 编码
+     */
+    private String code;
+
+    /**
+     * 订单关联父编码
+     */
+    private String parentCode;
+
+    /**
+     * 积分
+     */
+    private BigDecimal points;
+
+    /**
+     * 变动积分
+     */
+    private BigDecimal variablePoints;
+
+    /**
+     * 积分记录类型(1-充值,2-下单,3-退款)
+     */
+    private Integer pointsType;
+
+    /**
+     * 积分使用状态(1-未使用,2-使用部分,3-已使用)
+     */
+    private Integer pointsAudit;
+
+    /**
+     * 创建日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date creationDate;
+
+    /**
+     * 过期日期
+     */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date expiryDate;
+}

+ 96 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopCategory.java

@@ -0,0 +1,96 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import java.io.Serializable;
+import java.util.List;
+
+/**
+ * 门店前台类目表
+ *
+ * @author YourName
+ * @since 2025-09-XX
+ */
+@Data
+@TableName("tz_shop_category")
+public class ShopCategory implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId
+    private Long id;
+
+    /**
+     * 类目名称
+     */
+    private String name;
+
+    /**
+     * 门店ID
+     */
+    private Long shopId;
+
+    /**
+     * 编码
+     */
+    private String code;
+
+    /**
+     * 父级分类编码
+     */
+    private String parentCode;
+
+    /**
+     * 父级分类名称
+     */
+    private String parentName;
+    /**
+     * 图标
+     */
+    private String icon;
+    /**
+     * 序号
+     */
+    private Integer num;
+
+    /**
+     * 是否删除(0 正常 1 已被删除)
+     */
+    private Integer isDelete;
+
+    /**
+     * 类目等级(0-一级,1-二级,2-三级)
+     */
+    private Integer level;
+
+    /**
+     * 操作人
+     */
+    private String operateUser;
+
+    /**
+     * 是否叶子(1-是,2-不是)
+     */
+    private Integer isLeaves;
+    /**
+     * 类目的显示图片
+     */
+        private String pic;
+    /**
+     * 标签
+     */
+    private String label;
+
+    /**
+     * 子类名称(导入时处理需要)
+     */
+    @TableField(exist = false)
+    private String subName;
+
+    @TableField(exist = false)
+    private List<ShopCategory> children;
+}

+ 7 - 1
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopDetail.java

@@ -12,8 +12,10 @@ package com.yami.shop.bean.model;
 
 import com.baomidou.mybatisplus.annotation.TableId;
 import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
 import lombok.Data;
 import lombok.experimental.Accessors;
+import org.springframework.format.annotation.DateTimeFormat;
 
 import java.io.Serializable;
 import java.util.Date;
@@ -133,11 +135,15 @@ public class ShopDetail implements Serializable {
     /**
      * 创建时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date createTime;
 
     /**
      * 更新时间
      */
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
     private Date updateTime;
 
     /**
@@ -163,7 +169,7 @@ public class ShopDetail implements Serializable {
     /**
      * 是否同步到配送平台
      */
-    private boolean sync;
+    private Boolean sync;
 
     /**
      * 配送平台店铺编码

+ 4 - 4
yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopProd.java → yami-shop-bean/src/main/java/com/yami/shop/bean/model/ShopSku.java

@@ -20,9 +20,9 @@ import java.io.Serializable;
 import java.util.Date;
 
 @Data
-@TableName("tz_shop_prod")
+@TableName("tz_shop_sku")
 @Accessors(chain = true)
-public class ShopProd implements Serializable {
+public class ShopSku implements Serializable {
     private static final long serialVersionUID = 3300529542917772262L;
     /**
      * 门店商品表ID
@@ -43,12 +43,12 @@ public class ShopProd implements Serializable {
     /**
      * 商品对应门店价格
      */
-    private Double shopProdPrice;
+    private Double shopSkuPrice;
 
     /**
      * 商品对应门店库存
      */
-    private Integer shopProdStocks;
+    private Integer shopSkuStocks;
 
     /**
      * 0 正常 1 已被删除

+ 68 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictData.java

@@ -0,0 +1,68 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * 字典数据表 sys_dict_data
+ *
+ * @author ruoyi
+ */
+@Data
+@TableName("sys_dict_data")
+public class SysDictData{
+    private static final long serialVersionUID = 2090714647038636896L;
+
+    /** 字典编码 */
+    private Long dictCode;
+
+    /** 字典排序 */
+    private Long dictSort;
+
+    /** 字典标签 */
+    private String dictLabel;
+
+    /** 字典键值 */
+    private String dictValue;
+
+    /** 字典类型 */
+    private String dictType;
+
+    /** 样式属性(其他样式扩展) */
+    private String cssClass;
+
+    /** 表格字典样式 */
+    private String listClass;
+
+    /** 是否默认(Y是 N否) */
+    private String isDefault;
+
+    /** 状态(0正常 1停用) */
+    private String status;
+
+    /** 搜索值 */
+    @JsonIgnore
+    private String searchValue;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    private String remark;
+
+}

+ 59 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysDictType.java

@@ -0,0 +1,59 @@
+package com.yami.shop.bean.model;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.Data;
+import org.apache.commons.lang3.builder.ToStringBuilder;
+import org.apache.commons.lang3.builder.ToStringStyle;
+
+import javax.validation.constraints.NotBlank;
+import javax.validation.constraints.Pattern;
+import javax.validation.constraints.Size;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * 字典类型表 sys_dict_type
+ *
+ * @author ruoyi
+ */
+@Data
+@TableName("sys_dict_type")
+public class SysDictType{
+    private static final long serialVersionUID = 2090714647038636896L;
+
+    /** 字典主键 */
+    private Long dictId;
+
+    /** 字典名称 */
+    private String dictName;
+
+    /** 字典类型 */
+    private String dictType;
+
+    /** 状态(0正常 1停用) */
+    private String status;
+
+    /** 搜索值 */
+    @JsonIgnore
+    private String searchValue;
+
+    /** 创建者 */
+    private String createBy;
+
+    /** 创建时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date createTime;
+
+    /** 更新者 */
+    private String updateBy;
+
+    /** 更新时间 */
+    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    private Date updateTime;
+
+    /** 备注 */
+    private String remark;
+
+}

+ 4 - 1
yami-shop-sys/src/main/java/com/yami/shop/sys/model/SysUser.java → yami-shop-bean/src/main/java/com/yami/shop/bean/model/SysUser.java

@@ -8,7 +8,7 @@
  * 版权所有,侵权必究!
  */
 
-package com.yami.shop.sys.model;
+package com.yami.shop.bean.model;
 
 
 import com.baomidou.mybatisplus.annotation.TableField;
@@ -86,6 +86,9 @@ public class SysUser implements Serializable {
 	 */
 	@TableField(exist=false)
 	private List<Dept> depts;
+	@TableField(exist=false)
+	private List<Long> deptIds;
+
 
 	/**
 	 * 创建时间

+ 2 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/model/User.java

@@ -150,4 +150,6 @@ public class User implements Serializable {
      */
     @TableField(exist = false)
     private String levelName;
+
+    private Integer platform;
 }

+ 76 - 0
yami-shop-bean/src/main/java/com/yami/shop/bean/vo/FrontCategoryVO.java

@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.bean.vo;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class FrontCategoryVO{
+
+    /**
+     * 类目ID
+     */
+    private Long id;
+
+    /**
+     * 父类目ID
+     */
+    private Long pid;
+
+    /**
+     * 编码
+     */
+    private String code;
+
+    /**
+     * 分类名称
+     */
+    private String name;
+
+    /**
+     * 父级分类编码
+     */
+    private String parentCode;
+
+    /**
+     * 父级分类名称
+     */
+    private String parentName;
+
+    /**
+     * 序号
+     */
+    private Integer num;
+
+    /**
+     * 是否删除(0 正常 1 已被删除)
+     */
+    private Integer isDelete;
+
+    /**
+     * 类目等级(0-一级,1-二级,2-三级)
+     */
+    private Integer level;
+
+    /**
+     * 操作人
+     */
+    private String operateUser;
+
+    /**
+     * 是否叶子(1-是,2-不是)
+     */
+    private Integer isLeaves;
+
+    private List<FrontCategoryVO> children;
+}

+ 1 - 0
yami-shop-delivery/yami-shop-delivery-comment/src/main/java/com/yami/shop/delivery/comment/service/impl/TransportManagerServiceImpl.java

@@ -226,6 +226,7 @@ public class TransportManagerServiceImpl implements TransportManagerService {
         }
 
         ShopDetail shopDetailByShopId = shopDetailService.getShopDetailByShopId(shopId);
+        //TODO wangjian NullPointerException
         double v = calculateDistance(latitude, longitude, Double.valueOf(shopDetailByShopId.getShopLat()), Double.valueOf(shopDetailByShopId.getShopLng()));
         Transport2 byDistance = transport2Service.findByDistance(shopId, v);
         if (ObjectUtil.isEmpty(byDistance)) {

+ 1 - 0
yami-shop-multishop/src/main/java/com/yami/shop/multishop/controller/CategoryController.java

@@ -19,6 +19,7 @@ import com.yami.shop.bean.model.Product;
 import com.yami.shop.bean.vo.ListCategoryVO;
 import com.yami.shop.common.annotation.SysLog;
 import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.security.multishop.util.SecurityUtils;
 import com.yami.shop.service.CategoryService;

+ 95 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/AdvertInfoController.java

@@ -0,0 +1,95 @@
+// 文件路径: com/yami/shop/platform/controller/AdvertInfoController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.AdvertInfo;
+import com.yami.shop.bean.param.AdvertInfoParam;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.IAdvertInfoService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+
+/**
+ * 广告信息管理控制器
+ *
+ * @author wy
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/advertInfo")
+@AllArgsConstructor
+public class AdvertInfoController {
+
+    private final IAdvertInfoService advertInfoService;
+
+    /**
+     * 分页获取广告列表
+     */
+    @GetMapping("/page")
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:page')")
+    public R<IPage<AdvertInfo>> page(
+            @RequestParam(required = false) String advertName,
+            @RequestParam(required = false) Integer status,
+            @RequestParam(defaultValue = "1") Integer current,
+            @RequestParam(defaultValue = "10") Integer size) {
+
+        ResponseEntity<IPage<AdvertInfo>> response = advertInfoService.search(advertName, status, current, size);
+        return R.SUCCESS(response.getBody());
+    }
+
+    /**
+     * 根据ID获取广告详情
+     */
+    @GetMapping("/info/{id}")
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:info')")
+    public R<AdvertInfoParam> info(@PathVariable("id") Integer id) {
+        ResponseEntity<AdvertInfoParam> response = advertInfoService.get(id);
+        return R.SUCCESS(response.getBody());
+    }
+
+    /**
+     * 添加广告
+     */
+    @PostMapping
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:save')")
+    public R<Void> save(@Valid @RequestBody AdvertInfoParam param) {
+        ResponseEntity<Void> response = advertInfoService.addOrUpdate(param);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 更新广告
+     */
+    @PutMapping
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:update')")
+    public R<Void> update(@Valid @RequestBody AdvertInfoParam param) {
+        ResponseEntity<Void> response = advertInfoService.addOrUpdate(param);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除广告
+     */
+    @DeleteMapping("/{id}")
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:delete')")
+    public R<Void> delete(@PathVariable("id") Integer id) {
+        ResponseEntity<Void> response = advertInfoService.del(id);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 操作广告状态(启用/禁用)
+     */
+    @PutMapping("/operate/{id}")
+    @PreAuthorize("@pms.hasPermission('platform:advertInfo:operate')")
+    public R<Void> operate(@PathVariable("id") Integer id) {
+        ResponseEntity<Void> response = advertInfoService.operate(id);
+        return R.SUCCESS();
+    }
+}

+ 54 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/CategoryPropController.java

@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.platform.controller;
+
+import cn.hutool.core.collection.CollectionUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.dto.ListCategoryDTO;
+import com.yami.shop.bean.model.Category;
+import com.yami.shop.bean.model.Product;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.bean.vo.ListCategoryVO;
+import com.yami.shop.common.annotation.SysLog;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.CategoryProdService;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.Date;
+import java.util.List;
+import java.util.Objects;
+
+
+/**
+ * 分类绑定商品管理
+ *
+ * @author fbj
+ * @version 1.0.0
+ * @since 2025-9-26
+ */
+@RestController
+@RequestMapping("/platform/categoryProd")
+public class CategoryPropController {
+
+	@Autowired
+	private CategoryProdService categoryProdService;
+
+
+
+
+}

+ 4 - 4
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/DeptUserController.java

@@ -35,7 +35,7 @@ public class DeptUserController {
     @GetMapping("/listByUserId/{userId}")
     @ApiOperation(value = "根据用户ID获取部门用户关联列表", notes = "根据用户ID获取部门用户关联列表")
     @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "String", paramType = "path")
-    public R<List<DeptUser>> listByUserId(@PathVariable("userId") String userId) {
+    public R<List<DeptUser>> listByUserId(@PathVariable("userId") Long userId) {
         List<DeptUser> deptUserList = deptUserService.listByUserId(userId);
         return R.SUCCESS(deptUserList);
     }
@@ -64,7 +64,7 @@ public class DeptUserController {
     @PostMapping("/saveUserDepts")
     @ApiOperation(value = "保存用户部门关联", notes = "保存用户与部门的关联关系")
     public R<Boolean> saveUserDepts(
-            @RequestParam("userId") String userId,
+            @RequestParam("userId") Long userId,
             @RequestBody List<Long> deptIds) {
         Boolean result = deptUserService.saveUserDept(userId, deptIds);
         return R.SUCCESS(result);
@@ -80,7 +80,7 @@ public class DeptUserController {
     @PostMapping("/saveBatchUserDepts")
     @ApiOperation(value = "批量保存用户部门关联", notes = "批量保存用户与部门的关联关系")
     public R<Boolean> saveBatchUserDepts(
-            @RequestBody List<String> userIds,
+            @RequestBody List<Long> userIds,
             @RequestParam("deptId") Long deptId) {
         Boolean result = deptUserService.saveBatchUserDepts(userIds, deptId);
         return R.SUCCESS(result);
@@ -95,7 +95,7 @@ public class DeptUserController {
     @DeleteMapping("/deleteByUserId/{userId}")
     @ApiOperation(value = "根据用户ID删除部门用户关联", notes = "根据用户ID删除部门用户关联")
     @ApiImplicitParam(name = "userId", value = "用户ID", required = true, dataType = "String", paramType = "path")
-    public R<Boolean> deleteByUserId(@PathVariable("userId") String userId) {
+    public R<Boolean> deleteByUserId(@PathVariable("userId") Long userId) {
         Boolean result = deptUserService.deleteByUserId(userId);
         return R.SUCCESS(result);
     }

+ 117 - 117
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/FileController.java

@@ -1,117 +1,117 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.platform.controller;
-
-import cn.hutool.core.io.FileUtil;
-import cn.hutool.core.util.StrUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yami.shop.bean.model.AttachFile;
-import com.yami.shop.common.bean.Qiniu;
-import com.yami.shop.common.config.Constant;
-import com.yami.shop.common.exception.GlobalException;
-import com.yami.shop.common.exception.YamiShopBindException;
-import com.yami.shop.common.util.PageParam;
-import com.yami.shop.config.ShopConfig;
-import com.yami.shop.security.platform.util.SecurityUtils;
-import com.yami.shop.service.AttachFileService;
-import org.apache.ibatis.annotations.Delete;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.web.bind.annotation.*;
-import org.springframework.web.multipart.MultipartFile;
-
-import java.io.IOException;
-import java.util.Date;
-import java.util.Objects;
-import com.yami.shop.common.util.R;
-/**
- * 文件上传管理实现
- *
- * @author lgh
- * @version 1.0.0
- * @since 2018-11-26
- */
-@RestController
-@RequestMapping("/admin/file")
-public class FileController {
-
-	@Autowired
-	private AttachFileService attachFileService;
-	@Autowired
-	private ShopConfig shopConfig;
-
-	@PostMapping("/upload/element")
-	public R<String> uploadElementFile(@RequestParam("file") MultipartFile file) throws IOException{
-		if(file.isEmpty()){
-            return R.FAIL("文件不能为空");
-        }
-		String fileName = attachFileService.uploadFile(file.getBytes(),file.getOriginalFilename());
-        return R.SUCCESS(fileName);
-	}
-
-	@PostMapping("/upload/img")
-	public R<String> uploadImg(@RequestParam("file") MultipartFile file) throws IOException{
-		if(file.isEmpty()){
-			return R.FAIL("文件不能为空");
-		}
-		AttachFile attachFile = new AttachFile();
-		attachFile.setFileType(FileUtil.extName(file.getOriginalFilename()));
-		attachFile.setFileName(FileUtil.mainName(file.getOriginalFilename()));
-		attachFile.setType(1);
-		attachFile.setShopId(Constant.PLATFORM_SHOP_ID);
-		attachFile.setUploadTime(new Date());
-		String fileName = attachFileService.uploadImg(file.getBytes(),attachFile);
-		return R.SUCCESS(fileName);
-	}
-
-	@PostMapping("/upload/tinymceEditor")
-	public R<String> uploadTinymceEditorImages(@RequestParam("editorFile") MultipartFile editorFile) throws IOException{
-		String fileName =  attachFileService.uploadFile(editorFile.getBytes(),editorFile.getOriginalFilename());
-        return R.SUCCESS(shopConfig.getDomain().getResourcesDomainName() + "/" + fileName);
-	}
-
-	/**
-	 * 分页获取历史图片
-	 */
-	@GetMapping("/attachFilePage")
-	public R<IPage<AttachFile>> attachFilePage(PageParam<AttachFile> page, AttachFile attachFile) {
-		attachFile.setShopId(Constant.PLATFORM_SHOP_ID);
-		IPage<AttachFile> attachFilePage = attachFileService.getPage(page,attachFile);
-//		IPage<AttachFile> attachFilePage = attachFileService.page(page,new LambdaQueryWrapper<AttachFile>()
-//				.eq(AttachFile::getShopId,Constant.PLATFORM_SHOP_ID)
-//				.eq(AttachFile::getType,1)
-//				.like(StrUtil.isNotBlank(attachFile.getFileName()),AttachFile::getFileName,attachFile.getFileName())
-//				.orderByDesc(AttachFile::getUploadTime));
-		return R.SUCCESS(attachFilePage);
-	}
-	/**
-	 * 删除图片
-	 */
-	@DeleteMapping("/deleteFile/{fileId}")
-	public R<Void> deleteFile(@PathVariable("fileId") Long fileId){
-		AttachFile attachFile = attachFileService.getById(fileId);
-		attachFileService.deleteFile(attachFile.getFilePath());
-		return R.SUCCESS();
-	}
-
-
-	/**
-	 * 更改图片名称
-	 */
-	@PutMapping("/updateFileName")
-	public R<Boolean> updateFileName(@RequestBody  AttachFile attachFile) {
-		if (Objects.isNull(attachFile.getFileName())){
-			throw new GlobalException("图片名称不能为空");
-		}
-		return R.SUCCESS(attachFileService.updateFileName(attachFile));
-	}
-}
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.platform.controller;
+
+import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.AttachFile;
+import com.yami.shop.common.bean.Qiniu;
+import com.yami.shop.common.config.Constant;
+import com.yami.shop.common.exception.GlobalException;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.config.ShopConfig;
+import com.yami.shop.security.platform.util.SecurityUtils;
+import com.yami.shop.service.AttachFileService;
+import org.apache.ibatis.annotations.Delete;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import java.io.IOException;
+import java.util.Date;
+import java.util.Objects;
+import com.yami.shop.common.util.R;
+/**
+ * 文件上传管理实现
+ *
+ * @author lgh
+ * @version 1.0.0
+ * @since 2018-11-26
+ */
+@RestController
+@RequestMapping("/admin/file")
+public class FileController {
+
+	@Autowired
+	private AttachFileService attachFileService;
+	@Autowired
+	private ShopConfig shopConfig;
+
+	@PostMapping("/upload/element")
+	public R<String> uploadElementFile(@RequestParam("file") MultipartFile file) throws IOException{
+		if(file.isEmpty()){
+            return R.FAIL("文件不能为空");
+        }
+		String fileName = attachFileService.uploadFile(file.getBytes(),file.getOriginalFilename());
+        return R.SUCCESS(fileName);
+	}
+
+	@PostMapping("/upload/img")
+	public R<String> uploadImg(@RequestParam("file") MultipartFile file) throws IOException{
+		if(file.isEmpty()){
+			return R.FAIL("文件不能为空");
+		}
+		AttachFile attachFile = new AttachFile();
+		attachFile.setFileType(FileUtil.extName(file.getOriginalFilename()));
+		attachFile.setFileName(FileUtil.mainName(file.getOriginalFilename()));
+		attachFile.setType(1);
+		attachFile.setShopId(Constant.PLATFORM_SHOP_ID);
+		attachFile.setUploadTime(new Date());
+		String fileName = attachFileService.uploadImg(file.getBytes(),attachFile);
+		return R.SUCCESS(fileName);
+	}
+
+	@PostMapping("/upload/tinymceEditor")
+	public R<String> uploadTinymceEditorImages(@RequestParam("editorFile") MultipartFile editorFile) throws IOException{
+		String fileName =  attachFileService.uploadFile(editorFile.getBytes(),editorFile.getOriginalFilename());
+        return R.SUCCESS(shopConfig.getDomain().getResourcesDomainName() + "/" + fileName);
+	}
+
+	/**
+	 * 分页获取历史图片
+	 */
+	@GetMapping("/attachFilePage")
+	public R<IPage<AttachFile>> attachFilePage(PageParam<AttachFile> page, AttachFile attachFile) {
+		attachFile.setShopId(Constant.PLATFORM_SHOP_ID);
+		IPage<AttachFile> attachFilePage = attachFileService.getPage(page,attachFile);
+//		IPage<AttachFile> attachFilePage = attachFileService.page(page,new LambdaQueryWrapper<AttachFile>()
+//				.eq(AttachFile::getShopId,Constant.PLATFORM_SHOP_ID)
+//				.eq(AttachFile::getType,1)
+//				.like(StrUtil.isNotBlank(attachFile.getFileName()),AttachFile::getFileName,attachFile.getFileName())
+//				.orderByDesc(AttachFile::getUploadTime));
+		return R.SUCCESS(attachFilePage);
+	}
+	/**
+	 * 删除图片
+	 */
+	@DeleteMapping("/deleteFile/{fileId}")
+	public R<Void> deleteFile(@PathVariable("fileId") Long fileId){
+		AttachFile attachFile = attachFileService.getById(fileId);
+		attachFileService.deleteFile(attachFile.getFilePath());
+		return R.SUCCESS();
+	}
+
+
+	/**
+	 * 更改图片名称
+	 */
+	@PutMapping("/updateFileName")
+	public R<Boolean> updateFileName(@RequestBody  AttachFile attachFile) {
+		if (Objects.isNull(attachFile.getFileName())){
+			throw new GlobalException("图片名称不能为空");
+		}
+		return R.SUCCESS(attachFileService.updateFileName(attachFile));
+	}
+}

+ 84 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/LabelController.java

@@ -0,0 +1,84 @@
+// LabelController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.Label;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.LabelService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * 标签 Controller
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/label")
+@AllArgsConstructor
+public class LabelController {
+
+    private final LabelService labelService;
+
+    /**
+     * 分页获取标签列表
+     */
+    @GetMapping("/page")
+    public R<IPage<Label>> page(PageParam<Label> pageParam) {
+        IPage<Label> page = labelService.page(pageParam);
+        return R.SUCCESS(page);
+    }
+
+    /**
+     * 获取全部标签
+     */
+    @GetMapping("/listAll")
+    public R<List<Label>> listAll() {
+        List<Label> list = labelService.list();
+        return R.SUCCESS(list);
+    }
+
+    /**
+     * 根据ID获取标签
+     */
+    @GetMapping("/{id}")
+    public R<Label> getById(@PathVariable Long id) {
+        Label label = labelService.getById(id);
+        return R.SUCCESS(label);
+    }
+
+    /**
+     * 添加标签
+     */
+    @PostMapping
+    public R<Void> save(@Valid @RequestBody Label label) {
+        labelService.save(label);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 更新标签
+     */
+    @PutMapping
+    public R<Void> update(@Valid @RequestBody Label label) {
+        labelService.updateById(label);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除标签
+     */
+    @DeleteMapping
+    public R<Void> delete(@RequestBody Long[] ids) {
+        labelService.removeByIds(Arrays.asList(ids));
+        return R.SUCCESS();
+    }
+}

+ 74 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsFailureRecordController.java

@@ -0,0 +1,74 @@
+// PointsFailureRecordController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.PointsFailureRecord;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.PointsFailureRecordService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Arrays;
+
+/**
+ * 积分充值失败记录 Controller
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/pointsFailureRecord")
+@AllArgsConstructor
+public class PointsFailureRecordController {
+
+    private final PointsFailureRecordService pointsFailureRecordService;
+
+    /**
+     * 分页获取积分充值失败记录列表
+     */
+    @GetMapping("/page")
+    public R<IPage<PointsFailureRecord>> page(PageParam<PointsFailureRecord> pageParam) {
+        IPage<PointsFailureRecord> page = pointsFailureRecordService.page(pageParam);
+        return R.SUCCESS(page);
+    }
+
+    /**
+     * 根据ID获取积分充值失败记录
+     */
+    @GetMapping("/{id}")
+    public R<PointsFailureRecord> getById(@PathVariable Long id) {
+        PointsFailureRecord pointsFailureRecord = pointsFailureRecordService.getById(id);
+        return R.SUCCESS(pointsFailureRecord);
+    }
+
+    /**
+     * 添加积分充值失败记录
+     */
+    @PostMapping
+    public R<Void> save(@Valid @RequestBody PointsFailureRecord pointsFailureRecord) {
+        pointsFailureRecordService.save(pointsFailureRecord);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 更新积分充值失败记录
+     */
+    @PutMapping
+    public R<Void> update(@Valid @RequestBody PointsFailureRecord pointsFailureRecord) {
+        pointsFailureRecordService.updateById(pointsFailureRecord);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除积分充值失败记录
+     */
+    @DeleteMapping
+    public R<Void> delete(@RequestBody Long[] ids) {
+        pointsFailureRecordService.removeByIds(Arrays.asList(ids));
+        return R.SUCCESS();
+    }
+}

+ 108 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRechargeController.java

@@ -0,0 +1,108 @@
+// PointsRechargeController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.PointsRecharge;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.PointsRechargeService;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.Arrays;
+
+/**
+ * 积分充值 Controller
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/pointsRecharge")
+@AllArgsConstructor
+public class PointsRechargeController {
+
+    private final PointsRechargeService pointsRechargeService;
+
+    /**
+     * 分页获取积分充值列表
+     */
+    @GetMapping("/page")
+    public R<IPage<PointsRecharge>> page(PageParam<PointsRecharge> pageParam) {
+        IPage<PointsRecharge> page = pointsRechargeService.page(pageParam);
+        return R.SUCCESS(page);
+    }
+
+    /**
+     * 根据ID获取积分充值
+     */
+    @GetMapping("/{id}")
+    public R<PointsRecharge> getById(@PathVariable Long id) {
+        PointsRecharge pointsRecharge = pointsRechargeService.getById(id);
+        return R.SUCCESS(pointsRecharge);
+    }
+
+    /**
+     * 添加积分充值
+     */
+    @PostMapping
+    public R<Void> save(@Valid @RequestBody PointsRecharge pointsRecharge) {
+        pointsRechargeService.save(pointsRecharge);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 更新积分充值
+     */
+    @PutMapping
+    public R<Void> update(@Valid @RequestBody PointsRecharge pointsRecharge) {
+        pointsRechargeService.updateById(pointsRecharge);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除积分充值
+     */
+    @DeleteMapping
+    public R<Void> delete(@RequestBody Long[] ids) {
+        pointsRechargeService.removeByIds(Arrays.asList(ids));
+        return R.SUCCESS();
+    }
+
+
+    /**
+     * 导出积分充值导入模板
+     */
+    @GetMapping("/exportTemplate")
+    @ApiOperation(value = "导出积分充值导入模板", notes = "导出积分充值导入模板")
+    public void exportTemplate(HttpServletResponse response) {
+        try {
+            pointsRechargeService.exportTemplate(response);
+        } catch (Exception e) {
+            log.error("导出积分充值模板失败:", e);
+            throw new RuntimeException("导出模板失败:" + e.getMessage());
+        }
+    }
+
+    /**
+     * 导入积分充值数据
+     */
+    @PostMapping("/import")
+    @ApiOperation(value = "导入积分充值数据", notes = "导入积分充值数据")
+    public R<String> importPointsRecharge(@RequestParam("file") MultipartFile file) {
+        try {
+            String result = pointsRechargeService.importPointsRecharge(file);
+            return R.SUCCESS(result);
+        } catch (Exception e) {
+            log.error("导入积分充值数据失败:", e);
+            return R.FAIL("导入失败:" + e.getMessage());
+        }
+    }
+
+}

+ 74 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/PointsRecordController.java

@@ -0,0 +1,74 @@
+// PointsRecordController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.PointsRecord;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.PointsRecordService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+
+import javax.validation.Valid;
+import java.util.Arrays;
+
+/**
+ * 积分记录详细 Controller
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/pointsRecord")
+@AllArgsConstructor
+public class PointsRecordController {
+
+    private final PointsRecordService pointsRecordService;
+
+    /**
+     * 分页获取积分记录详细列表
+     */
+    @GetMapping("/page")
+    public R<IPage<PointsRecord>> page(PageParam<PointsRecord> pageParam) {
+        IPage<PointsRecord> page = pointsRecordService.page(pageParam);
+        return R.SUCCESS(page);
+    }
+
+    /**
+     * 根据ID获取积分记录详细
+     */
+    @GetMapping("/{id}")
+    public R<PointsRecord> getById(@PathVariable Long id) {
+        PointsRecord pointsRecord = pointsRecordService.getById(id);
+        return R.SUCCESS(pointsRecord);
+    }
+
+    /**
+     * 添加积分记录详细
+     */
+    @PostMapping
+    public R<Void> save(@Valid @RequestBody PointsRecord pointsRecord) {
+        pointsRecordService.save(pointsRecord);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 更新积分记录详细
+     */
+    @PutMapping
+    public R<Void> update(@Valid @RequestBody PointsRecord pointsRecord) {
+        pointsRecordService.updateById(pointsRecord);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 删除积分记录详细
+     */
+    @DeleteMapping
+    public R<Void> delete(@RequestBody Long[] ids) {
+        pointsRecordService.removeByIds(Arrays.asList(ids));
+        return R.SUCCESS();
+    }
+}

+ 194 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopCategoryController.java

@@ -0,0 +1,194 @@
+// 文件路径: com/yami/shop/platform/controller/ShopCategoryController.java
+package com.yami.shop.platform.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.model.FrontCategory;
+import com.yami.shop.bean.model.ShopCategory;
+import com.yami.shop.bean.vo.FrontCategoryVO;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.IShopCategoryService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiImplicitParam;
+import io.swagger.annotations.ApiOperation;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.List;
+
+/**
+ * 门店前台类目管理控制器
+ *
+ * @author YourName
+ * @since 2025-09-XX
+ */
+@Slf4j
+@RestController
+@RequestMapping("/platform/shopCategory")
+@Api(tags = "门店前台类目管理接口")
+@AllArgsConstructor
+public class ShopCategoryController {
+
+    private final IShopCategoryService shopCategoryService;
+
+    /**
+     * 分页查询门店前台类目列表
+     *
+     * @param pageParam 分页参数
+     * @param shopCategory 查询条件
+     * @return 分页结果
+     */
+    @GetMapping("/page")
+    @ApiOperation(value = "分页查询门店前台类目列表", notes = "分页查询门店前台类目列表")
+    public R<IPage<ShopCategory>> page(PageParam<ShopCategory> pageParam, ShopCategory shopCategory) {
+        IPage<ShopCategory> page = shopCategoryService.page(
+                pageParam,
+                new LambdaQueryWrapper<ShopCategory>()
+                        .like(shopCategory.getName() != null, ShopCategory::getName, shopCategory.getName())
+                        .eq(shopCategory.getShopId() != null, ShopCategory::getShopId, shopCategory.getShopId())
+                        .eq(shopCategory.getIsDelete() != null, ShopCategory::getIsDelete, shopCategory.getIsDelete())
+                        .orderByDesc(ShopCategory::getId)
+        );
+        return R.SUCCESS(page);
+    }
+
+    /**
+     * 获取未删除的门店前台类目列表
+     *
+     * @return 门店前台类目列表
+     */
+    @GetMapping("/list")
+    @ApiOperation(value = "获取未删除的门店前台类目列表", notes = "获取未删除的门店前台类目列表")
+    public R<List<ShopCategory>> list(
+            @RequestParam(required = false) Long shopId,
+            @RequestParam(required = false) String name) {
+        if (shopId == null) {
+            return R.FAIL("门店不能为空!");
+        }
+        return R.SUCCESS(shopCategoryService.treeShopCategory(shopId,name));
+    }
+
+
+    /**
+     * 导出门店前台类目导入模板
+     */
+    @GetMapping("/exportTemplate")
+    @ApiOperation(value = "导出门店前台类目导入模板", notes = "导出门店前台类目导入模板")
+    public void exportTemplate(HttpServletResponse response) {
+        try {
+            shopCategoryService.exportTemplate(response);
+        } catch (Exception e) {
+            log.error("导出模板失败:", e);
+            throw new RuntimeException("导出模板失败:" + e.getMessage());
+        }
+    }
+    /**
+     * 导入门店前台类目
+     *
+     */
+    @PostMapping("/import")
+    @ApiOperation(value = "导入门店前台类目", notes = "导入门店前台类目")
+    public R importCategory(@RequestParam("file") MultipartFile file) {
+        shopCategoryService.importCategory(file);
+        return R.SUCCESS();
+    }
+
+
+
+    /**
+     * 根据ID获取门店前台类目详情
+     *
+     * @param id 门店前台类目ID
+     * @return 门店前台类目详情
+     */
+    @GetMapping("/{id}")
+    @ApiOperation(value = "根据ID获取门店前台类目详情", notes = "根据ID获取门店前台类目详情")
+    @ApiImplicitParam(name = "id", value = "门店前台类目ID", required = true, dataType = "Long", paramType = "path")
+    public R<ShopCategory> getById(@PathVariable Long id) {
+        ShopCategory shopCategory = shopCategoryService.getById(id);
+        if (shopCategory == null || shopCategory.getIsDelete() == 1) {
+            return R.FAIL("门店前台类目不存在");
+        }
+        return R.SUCCESS(shopCategory);
+    }
+
+    /**
+     * 新增门店前台类目
+     *
+     * @param shopCategory 门店前台类目信息
+     * @return 操作结果
+     */
+    @PostMapping
+    @ApiOperation(value = "新增门店前台类目", notes = "新增门店前台类目")
+    public R<Void> save(@Valid @RequestBody ShopCategory shopCategory) {
+        // 设置默认值
+        shopCategory.setIsDelete(0);
+        boolean result = shopCategoryService.save(shopCategory);
+        if (result) {
+            return R.SUCCESS();
+        }
+        return R.FAIL("新增门店前台类目失败");
+    }
+
+    /**
+     * 修改门店前台类目
+     *
+     * @param shopCategory 门店前台类目信息
+     * @return 操作结果
+     */
+    @PutMapping
+    @ApiOperation(value = "修改门店前台类目", notes = "修改门店前台类目")
+    public R<Void> update(@Valid @RequestBody ShopCategory shopCategory) {
+        if (shopCategory.getId() == null) {
+            return R.FAIL("ID不能为空");
+        }
+
+        // 检查是否存在
+        ShopCategory dbShopCategory = shopCategoryService.getById(shopCategory.getId());
+        if (dbShopCategory == null) {
+            return R.FAIL("门店前台类目不存在");
+        }
+
+        boolean result = shopCategoryService.updateById(shopCategory);
+        if (result) {
+            return R.SUCCESS();
+        }
+        return R.FAIL("修改门店前台类目失败");
+    }
+
+    /**
+     * 删除门店前台类目(逻辑删除)
+     *
+     * @param id 门店前台类目ID
+     * @return 操作结果
+     */
+    @DeleteMapping("/{id}")
+    @ApiOperation(value = "删除门店前台类目", notes = "删除门店前台类目(逻辑删除)")
+    @ApiImplicitParam(name = "id", value = "门店前台类目ID", required = true, dataType = "Long", paramType = "path")
+    public R<Void> delete(@PathVariable Long id) {
+        // 检查是否存在
+        ShopCategory dbShopCategory = shopCategoryService.getById(id);
+        if (dbShopCategory == null) {
+            return R.FAIL("门店前台类目不存在");
+        }
+
+        // 逻辑删除
+        ShopCategory shopCategory = new ShopCategory();
+        shopCategory.setId(id);
+        shopCategory.setIsDelete(1);
+        boolean result = shopCategoryService.updateById(shopCategory);
+        if (result) {
+            return R.SUCCESS();
+        }
+        return R.FAIL("删除门店前台类目失败");
+    }
+
+
+
+}

+ 7 - 7
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopProdController.java → yami-shop-platform/src/main/java/com/yami/shop/platform/controller/ShopSkuController.java

@@ -7,9 +7,9 @@
 
 package com.yami.shop.platform.controller;
 
-import com.yami.shop.bean.model.ShopProd;
+import com.yami.shop.bean.model.ShopSku;
 import com.yami.shop.common.util.R;
-import com.yami.shop.service.ShopProdService;
+import com.yami.shop.service.ShopSkuService;
 import lombok.AllArgsConstructor;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
@@ -26,18 +26,18 @@ import org.springframework.web.bind.annotation.RestController;
 @RestController
 @AllArgsConstructor
 @RequestMapping("/shop/shopProd")
-public class ShopProdController {
+public class ShopSkuController {
 
-    private final ShopProdService shopProdService;
+    private final ShopSkuService shopProdService;
 
 
     /**
      * 新建店铺
      */
     @PostMapping
-    public R<ShopProd> ShopProd(@RequestBody ShopProd shopProd) {
-        shopProdService.insertProd(shopProd);
-        return R.SUCCESS(shopProd);
+    public R<ShopSku> ShopProd(@RequestBody ShopSku shopSku) {
+        shopProdService.insertSku(shopSku);
+        return R.SUCCESS(shopSku);
     }
 
 

+ 107 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/SysDictDataController.java

@@ -0,0 +1,107 @@
+package com.yami.shop.platform.controller;
+
+
+import cn.hutool.poi.excel.ExcelUtil;
+import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.ISysDictDataService;
+import com.yami.shop.service.ISysDictTypeService;
+import lombok.extern.java.Log;
+import org.apache.commons.lang3.ObjectUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * 数据字典信息(字典数据)
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/platform/dict/data")
+public class SysDictDataController
+{
+    @Autowired
+    private ISysDictDataService dictDataService;
+
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+//    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public R< List<SysDictData>> list(SysDictData dictData)
+    {
+        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+        return R.SUCCESS(list);
+    }
+
+//    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+//    @PostMapping("/export")
+//    public void export(HttpServletResponse response, SysDictData dictData)
+//    {
+//        List<SysDictData> list = dictDataService.selectDictDataList(dictData);
+//        ExcelUtil<SysDictData> util = new ExcelUtil<SysDictData>(SysDictData.class);
+//        util.exportExcel(response, list, "字典数据");
+//    }
+
+    /**
+     * 查询字典数据详细
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictCode}")
+    public R<SysDictData> getInfo(@PathVariable Long dictCode)
+    {
+        return R.SUCCESS(dictDataService.selectDictDataById(dictCode));
+    }
+
+    /**
+     * 根据字典类型查询字典数据信息
+     */
+    @GetMapping(value = "/type/{dictType}")
+    public R dictType(@PathVariable String dictType)
+    {
+        List<SysDictData> data = dictTypeService.selectDictDataByType(dictType);
+        if (ObjectUtils.isEmpty(data))
+        {
+            data = new ArrayList<SysDictData>();
+        }
+        return R.SUCCESS(data);
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @PostMapping
+    public R add(@Validated @RequestBody SysDictData dict)
+    {
+//        dict.setCreateBy(getUsername());
+        return R.SUCCESS(dictDataService.insertDictData(dict));
+    }
+
+    /**
+     * 修改保存字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @PutMapping
+    public R edit(@Validated @RequestBody SysDictData dict)
+    {
+        return R.SUCCESS(dictDataService.updateDictData(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @DeleteMapping("/{dictCodes}")
+    public R remove(@PathVariable Long[] dictCodes)
+    {
+        dictDataService.deleteDictDataByIds(dictCodes);
+        return R.SUCCESS();
+    }
+}

+ 112 - 0
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/SysDictTypeController.java

@@ -0,0 +1,112 @@
+package com.yami.shop.platform.controller;
+
+
+import com.yami.shop.bean.model.SysDictType;
+import com.yami.shop.common.util.R;
+import com.yami.shop.service.ISysDictTypeService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+
+/**
+ * 数据字典信息(字典类型表)
+ *
+ * @author ruoyi
+ */
+@RestController
+@RequestMapping("/platform/dict/type")
+public class SysDictTypeController
+{
+    @Autowired
+    private ISysDictTypeService dictTypeService;
+
+    @PreAuthorize("@ss.hasPermi('system:dict:list')")
+    @GetMapping("/list")
+    public R<List<SysDictType>> list(SysDictType dictType)
+    {
+        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+        return R.SUCCESS(list);
+    }
+
+//    @PreAuthorize("@ss.hasPermi('system:dict:export')")
+//    @PostMapping("/export")
+//    public void export(HttpServletResponse response, SysDictType dictType)
+//    {
+//        List<SysDictType> list = dictTypeService.selectDictTypeList(dictType);
+//        ExcelUtil<SysDictType> util = new ExcelUtil<SysDictType>(SysDictType.class);
+//        util.exportExcel(response, list, "字典类型");
+//    }
+
+    /**
+     * 查询字典类型详细
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:query')")
+    @GetMapping(value = "/{dictId}")
+    public R<SysDictType> getInfo(@PathVariable Long dictId)
+    {
+        return R.SUCCESS(dictTypeService.selectDictTypeById(dictId));
+    }
+
+    /**
+     * 新增字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:add')")
+    @PostMapping
+    public R add(@Validated @RequestBody SysDictType dict)
+    {
+        if (!dictTypeService.checkDictTypeUnique(dict))
+        {
+            return R.FAIL("新增字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        return R.SUCCESS(dictTypeService.insertDictType(dict));
+    }
+
+    /**
+     * 修改字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:edit')")
+    @PutMapping
+    public R edit(@Validated @RequestBody SysDictType dict)
+    {
+        if (!dictTypeService.checkDictTypeUnique(dict))
+        {
+            return R.FAIL("修改字典'" + dict.getDictName() + "'失败,字典类型已存在");
+        }
+        return R.SUCCESS(dictTypeService.updateDictType(dict));
+    }
+
+    /**
+     * 删除字典类型
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @DeleteMapping("/{dictIds}")
+    public R remove(@PathVariable Long[] dictIds)
+    {
+        dictTypeService.deleteDictTypeByIds(dictIds);
+        return R.SUCCESS();
+    }
+
+    /**
+     * 刷新字典缓存
+     */
+    @PreAuthorize("@ss.hasPermi('system:dict:remove')")
+    @DeleteMapping("/refreshCache")
+    public R refreshCache()
+    {
+        dictTypeService.resetDictCache();
+        return R.SUCCESS();
+    }
+
+    /**
+     * 获取字典选择框列表
+     */
+    @GetMapping("/optionselect")
+    public R optionselect()
+    {
+        List<SysDictType> dictTypes = dictTypeService.selectDictTypeAll();
+        return R.SUCCESS(dictTypes);
+    }
+}

+ 2 - 3
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/FrontCategoryController.java

@@ -2,8 +2,7 @@ package com.yami.shop.platform.controller.hb;
 
 import com.alibaba.fastjson.JSONObject;
 import com.yami.shop.common.util.hb.HBR;
-import com.yami.shop.service.hb.IFrontCategoryService;
-import io.swagger.annotations.Api;
+import com.yami.shop.service.hb.IHBFrontCategoryService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
 import org.springframework.web.bind.annotation.*;
@@ -22,7 +21,7 @@ import org.springframework.web.bind.annotation.*;
 @CrossOrigin
 public class FrontCategoryController {
 
-    private final IFrontCategoryService frontCategoryService;
+    private final IHBFrontCategoryService frontCategoryService;
 
     /**
      * 海博新增前台类目信息-回调

+ 2 - 8
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/GoodsController.java

@@ -1,17 +1,11 @@
 package com.yami.shop.platform.controller.hb;
 
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
-import com.yami.shop.bean.model.Product;
-import com.yami.shop.common.util.R;
 import com.yami.shop.common.util.hb.HBR;
-import com.yami.shop.service.hb.IGoodsService;
-import io.swagger.annotations.Api;
+import com.yami.shop.service.hb.IHBGoodsService;
 import io.swagger.annotations.ApiOperation;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.ResponseEntity;
 import org.springframework.web.bind.annotation.*;
 
 /**
@@ -28,7 +22,7 @@ import org.springframework.web.bind.annotation.*;
 @CrossOrigin
 public class GoodsController {
 
-    private final IGoodsService goodsService;
+    private final IHBGoodsService goodsService;
 
     /**
      * 海博新增商品信息-回调

+ 31 - 2
yami-shop-platform/src/main/java/com/yami/shop/platform/controller/hb/StoreManagementController.java

@@ -1,6 +1,10 @@
 package com.yami.shop.platform.controller.hb;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.common.util.PageParam;
+import com.yami.shop.common.util.R;
 import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.service.hb.IStoreManagementService;
 import lombok.AllArgsConstructor;
@@ -33,7 +37,7 @@ public class StoreManagementController {
      */
     @PostMapping("/add")
     public HBR addRegisterStore(@RequestBody JSONObject HBRequest) {
-        log.info("海博添加门店{}",HBRequest);
+        log.info("海博添加门店{}", HBRequest);
         return HBR.success(storeManagementService.updateRegisterStore(HBRequest));
     }
 
@@ -45,10 +49,35 @@ public class StoreManagementController {
      */
     @PostMapping("/update")
     public HBR updateRegisterStore(@RequestBody JSONObject HBRequest) {
-        log.info("海博变更门店{}",HBRequest);
+        log.info("海博变更门店{}", HBRequest);
         return HBR.success(storeManagementService.updateRegisterStore(HBRequest));
     }
 
+    /**
+     * 条件获取门店列表信息
+     */
+    @GetMapping("/list")
+    public R<List<ShopDetail>> list(@ModelAttribute ShopDetail shopDetail) {
+        return R.SUCCESS(storeManagementService.list(shopDetail));
+    }
+
+    /**
+     * 分页获取门店列表信息
+     */
+    @GetMapping("/page")
+    public R<IPage<ShopDetail>> page(@ModelAttribute ShopDetail shopDetail, PageParam<ShopDetail> page) {
+        IPage<ShopDetail> shopDetailPage = storeManagementService.page(shopDetail, page);
+        return R.SUCCESS(shopDetailPage);
+    }
+
+
 
+    /**
+     * 获取门店详情
+     */
+    @GetMapping("/detail/{id}")
+    public R<ShopDetail> detail(@PathVariable("id") Long id ) {
+        return R.SUCCESS(storeManagementService.detail(id));
+    }
 
 }

+ 389 - 389
yami-shop-platform/src/main/java/com/yami/shop/platform/task/OrderTask.java

@@ -1,389 +1,389 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.platform.task;
-
-import cn.hutool.core.collection.CollectionUtil;
-import cn.hutool.core.date.DateUtil;
-import cn.hutool.core.util.ObjectUtil;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
-import com.yami.shop.bean.bo.PayInfoBo;
-import com.yami.shop.bean.enums.DvyType;
-import com.yami.shop.bean.enums.OrderStatus;
-import com.yami.shop.bean.model.*;
-import com.yami.shop.bean.param.OrderDto;
-import com.yami.shop.common.enums.PayType;
-import com.yami.shop.common.exception.YamiShopBindException;
-import com.yami.shop.dao.DeviceFeyMapper;
-import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
-import com.yami.shop.delivery.comment.param.DeliveryOrderItemParam;
-import com.yami.shop.delivery.comment.service.DeliveryOrderService;
-import com.yami.shop.service.*;
-import com.yami.shop.service.impl.FeiEYunApi;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.logging.log4j.core.util.JsonUtils;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.http.ResponseEntity;
-import org.springframework.stereotype.Component;
-
-import java.math.BigDecimal;
-import java.text.SimpleDateFormat;
-import java.util.*;
-import java.util.stream.Collectors;
-
-
-@Component("orderTask")
-public class OrderTask {
-
-
-    private Logger logger = LoggerFactory.getLogger(getClass());
-
-    @Autowired
-    private OrderService orderService;
-    @Autowired
-    private ProductService productService;
-    @Autowired
-    private SkuService skuService;
-    @Autowired
-    private PayService payService;
-    @Autowired
-    private OrderSettlementService orderSettlementService;
-    @Autowired
-    private PayManagerService payManagerService;
-
-    @Autowired
-    private PaoTuiApi paoTuiApi;
-
-    @Autowired
-    private OrderRefundService orderRefundService;
-
-    @Autowired
-    private OrderItemService orderItemService;
-
-    @Autowired
-    private UserAddrOrderService userAddrOrderService;
-
-    @Autowired
-    private DeliveryOrderService deliveryOrderService;
-
-    @Autowired
-    private IQnhService qnhService;
-
-    @Autowired
-    private UserService userService;
-
-    @Autowired
-    private ShopDetailService shopDetailService;
-    @Autowired
-    private DeviceFeyMapper deviceFeyMapper;
-
-
-
-
-
-    public void cancelOrder(){
-        Date now = new Date();
-        logger.info("取消超时未支付订单。。。");
-        // 获取30分钟之前未支付的订单
-        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.UNPAY.value(),DateUtil.offsetMinute(now, -30));
-        if (CollectionUtil.isEmpty(orders)) {
-            return;
-        }
-
-        List<Order>  cancelOrderList = this.chackOrders(orders);
-        orderService.cancelOrders(cancelOrderList);
-        // 移除缓存
-        this.removeCache(cancelOrderList);
-
-    }
-
-    /**
-     * 确认收货
-     */
-    public void confirmOrder(){
-        Date now = new Date();
-        logger.info("系统自动确认收货订单。。。");
-        // 获取15天之前等待确认收货的订单
-        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.CONSIGNMENT.value(),DateUtil.offsetDay(now, -15));
-        if (CollectionUtil.isEmpty(orders)) {
-            return;
-        }
-        orderService.receiptOrder(orders);
-        // 移除缓存
-        this.removeCache(orders);
-    }
-
-    public void createDistributionOrder(){
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        Date now = new Date();
-        logger.info("用户订单五分钟后未取消则创建物流订单。。。");
-        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.PADYED.value(),DateUtil.offsetMinute(now, -5));
-        if(CollectionUtil.isEmpty(orders)){
-            return;
-        }
-//        List<Order> orders =orderService.list(new QueryWrapper<Order>().lambda().like(Order::getOrderNumber,"1879830276981526528"));
-        for (Order order:orders){
-            //创建物流订单
-            if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && Objects.equals(order.getDvyType(), DvyType.FETCH.value())){
-                System.out.println("订单不处于已付款状态,无法进行发货");
-                continue;
-            }else if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value())){
-                System.out.println("订单不处于待发货状态,无法进行发货");
-                continue;
-            }
-            UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
-            if(ObjectUtil.isEmpty(userAddrOrder)){
-                System.out.println("该订单地址存在问题,请检查");
-                continue;
-            }
-            int count = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderId, order.getOrderId()));
-            if(count>0){
-                LambdaQueryWrapper<OrderRefund> orderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
-                orderRefundLambdaQueryWrapper.eq(OrderRefund::getOrderId,order.getOrderId());
-                //发货时只有订单不存在退款或退款被拒绝才会创建仓储与物流订单
-                orderRefundLambdaQueryWrapper.and(wrapper->wrapper.eq(OrderRefund::getReturnMoneySts,-1).or().eq(OrderRefund::getReturnMoneySts,7).or().eq(OrderRefund::getReturnMoneySts,6));
-                List<OrderRefund> orderRefunds = orderRefundService.list(orderRefundLambdaQueryWrapper);
-                if (CollectionUtil.isEmpty(orderRefunds)) {
-                    System.out.println("该订单有退款信息正在处理或已退款中,无法进行发货操作");
-                    continue;
-                }
-            }
-            try {
-                boolean success = createQNHOrder(order);
-                if(!success){
-                    continue;
-                }
-            }catch (Exception e){
-                System.out.println(e.getMessage());
-                continue;
-            }
-
-            List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
-
-            //先创建物流订单
-            DeliveryOrderItemParam deliveryOrderItemParam = new DeliveryOrderItemParam();
-            deliveryOrderItemParam.setOrderNumber(order.getOrderNumber());
-            deliveryOrderItemParam.setDvyId(16l);
-            deliveryOrderItemParam.setDeliveryType(1);
-            deliveryOrderItemParam.setDvyFlowId("sdfsf");
-            deliveryOrderItemParam.setSelectOrderItems(orderItems);
-            for (OrderItem orderItem:deliveryOrderItemParam.getSelectOrderItems()){
-                orderItem.setChangeNum(orderItem.getProdCount());
-            }
-
-            try {
-                deliveryOrderService.saveDeliveriesInfo(deliveryOrderItemParam);
-                order=orderService.getById(order.getOrderId());
-                order.setDvyStatus(1);
-            }catch (Exception e){
-                System.out.println(e.getMessage());
-                order.setDvyStatus(0);
-            }
-            orderService.updateById(order);
-        }
-//        this.removeCache(orders);
-    }
-
-    /**
-     * 查询订单,去除已支付的订单
-     * @param orders
-     */
-    private List<Order> chackOrders(List<Order> orders){
-        List<String> orderNumbers=orders.stream().map(Order::getOrderNumber).collect(Collectors.toList());
-        // 收集未支付的订单
-        List<Order> orderList = new ArrayList<>();
-        //获取订单对应的订单结算数据
-        List<OrderSettlement> orderSettlementList = orderSettlementService.list(new LambdaQueryWrapper<OrderSettlement>()
-                .in(OrderSettlement::getOrderNumber, orderNumbers));
-        Map<String, OrderSettlement> orderSettlementMap = orderSettlementList.stream()
-                .collect(Collectors.toMap(OrderSettlement::getOrderNumber, orderSettlement -> orderSettlement));
-        for (Order order : orders) {
-            OrderSettlement orderSettlement = orderSettlementMap.get(order.getOrderNumber());
-            if (Objects.isNull(orderSettlement) || Objects.isNull(orderSettlement.getPayType()) || Objects.isNull(orderSettlement.getPayNo())){
-                orderList.add(order);
-                continue;
-            }
-            PayInfoBo payInfo = payManagerService.getPayInfo(PayType.instance(orderSettlement.getPayType()), orderSettlement.getPayNo());
-            if(payInfo.getIsPaySuccess()){
-                // 根据内部订单号更新order settlement
-                List<Order> successOrderList = payService.paySuccess(payInfo.getPayNo(), payInfo.getBizPayNo(),order.getPayType());
-                // 移除缓存
-                this.removeCache(successOrderList);
-            }else {
-                orderList.add(order);
-            }
-        }
-        return orderList;
-    }
-
-    /**
-     * 移除缓存
-     */
-    private void removeCache(List<Order> orders){
-        for (Order order : orders) {
-            List<OrderItem> orderItems = order.getOrderItems();
-            for (OrderItem orderItem : orderItems) {
-                productService.removeProductCacheByProdId(orderItem.getProdId());
-                skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
-            }
-        }
-    }
-
-    /**
-     * 创建牵牛花订单
-     * @param order
-     * @return
-     */
-    public boolean createQNHOrder(Order order) {
-        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
-        // 待添加创建牵牛花订单
-        OrderDto orderDto = new OrderDto();
-        orderDto.setChannelSheetno(order.getOrderNumber());
-        orderDto.setChannelKeyword("YYG");
-        orderDto.setPayOver(true);
-        orderDto.setBilltype(1+"");
-        orderDto.setTotalSaleValue(BigDecimal.valueOf(order.getTotal()));
-        orderDto.setTotalDiscValue(BigDecimal.ZERO);
-        orderDto.setTotalSjDisc(BigDecimal.ZERO);
-        orderDto.setTotalSaleValue(BigDecimal.ZERO);
-        orderDto.setTotalPtDp(BigDecimal.ZERO);
-        orderDto.setTotalSjDp(BigDecimal.ZERO);
-        orderDto.setTotalPtDisc(BigDecimal.ZERO);
-        orderDto.setCommissionValue(BigDecimal.ZERO);
-        orderDto.setPayableValue(BigDecimal.valueOf(order.getTotal()));
-        orderDto.setTotalItemValue(BigDecimal.valueOf(order.getTotal()));
-        orderDto.setLogisticsModeKeyword(order.getFreightAmount().toString());
-
-
-        ShopDetail shopDetailByShopId = shopDetailService.getById(order.getShopId());
-//            orderDto.setOrgName(shopDetailByShopId.getShopName());
-        orderDto.setOrgCode(shopDetailByShopId.getThirdPartyCode());
-        orderDto.setOrgName(shopDetailByShopId.getShopName());
-        orderDto.setPreOrder(false);
-        orderDto.setOfflineOrder(false);
-        orderDto.setOrderTime(formatter.format(order.getCreateTime()));
-        orderDto.setGroupId(0);
-        orderDto.setGoodsReturn("true");
-        UserAddrOrder addrOrder = userAddrOrderService.getById(order.getAddrOrderId());
-        User user = userService.getUserByUserId(order.getUserId());
-
-        //填充收件人信息
-        orderDto.setReceiver(new OrderDto.Receiver());
-        orderDto.getReceiver().setAddress(addrOrder.getAddress());
-        orderDto.getReceiver().setMobile(user.getUserMobile());
-        orderDto.getReceiver().setName(user.getNickName());
-        orderDto.getReceiver().setType("0");
-        orderDto.getReceiver().setLatitude(String.valueOf(addrOrder.getLatitude()));
-        orderDto.getReceiver().setLongitude(String.valueOf(addrOrder.getLongitude()));
-        orderDto.setPayableLogisticsValue(BigDecimal.valueOf(order.getPlatformAmount()));
-        orderDto.setLogisticsModeKeyword("0");
-
-        //填充买家信息
-        orderDto.setBuyer(new OrderDto.Buyer());
-        orderDto.getBuyer().setAddress(addrOrder.getAddress());
-        orderDto.getBuyer().setNick(user.getNickName());
-        orderDto.getBuyer().setEmail(user.getUserMail());
-        orderDto.getBuyer().setNote(order.getRemarks());
-        orderDto.getBuyer().setTel(user.getUserMobile());
-
-        //填充支付信息
-        orderDto.setOrderPayments(new OrderDto.OrderPayments());
-        orderDto.getOrderPayments().setPayment(BigDecimal.valueOf(order.getTotal()));
-        orderDto.getOrderPayments().setKeyword("10002");
-        orderDto.getOrderPayments().setName("商城系统支付");
-        ArrayList<OrderDto.OrderDetails> orderDetails = new ArrayList<>();
-        int weight = 0;
-        List<OrderItem> orderItems1 = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
-        for (OrderItem orderItem:orderItems1){
-            OrderDto.OrderDetails orderDetails1 = new OrderDto.OrderDetails();
-            Sku sku = skuService.getById(orderItem.getSkuId());
-            orderDetails1.setSkuId(sku.getPartyCode());
-            orderDetails1.setItemCode("");
-            orderDetails1.setBarcode("");
-            orderDetails1.setOrderItemId(orderItem.getOrderItemId().toString());
-            orderDetails1.setName(orderItem.getProdName());
-            orderDetails1.setOriginalPrice(BigDecimal.valueOf(sku.getOriPrice()));
-            orderDetails1.setWeight((int)Math.round(sku.getWeight()));
-            weight+=orderDetails1.getWeight();
-            orderDetails1.setSalePrice(BigDecimal.valueOf(sku.getPrice()));
-            orderDetails1.setQty(orderItem.getProdCount());
-            orderDetails1.setMoney(orderDetails1.getSalePrice().multiply(BigDecimal.valueOf(orderDetails1.getQty())));
-            orderDetails.add(orderDetails1);
-        }
-        orderDto.setOrderDetails(orderDetails);
-        orderDto.setWeight(weight);
-        String s = qnhService.addOrder(orderDto);
-//        ResponseEntity responseEntity = qnhService.addOrder(orderDto);
-        if(!StringUtils.isBlank(s)){
-            order.setQnhOrderId(s);
-            order.setQnhOrderStatus("1");
-            orderService.updateById(order);
-            DeviceFey deviceFey = deviceFeyMapper.selectOne(Wrappers.<DeviceFey>lambdaQuery().eq(DeviceFey::getShopId, order.getShopId()).last("limit 1"));
-            FeiEYunApi.print(deviceFey.getDeviceSn(),print(order.getOrderNumber()));
-            return true;
-        }
-        return false;
-    }
-    private String print(String orderByOrderNumber){
-        Order order = orderService.getOrderByOrderNumber(orderByOrderNumber);
-        List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
-        String lastFourDigits = order.getOrderNumber().length() >= 4
-                ? order.getOrderNumber().substring(order.getOrderNumber().length() - 4)
-                : order.getOrderNumber(); // 如果长度不足4位,直接返回原字符串
-        UserAddrOrder userAddrOrder = userAddrOrderService.selectByAddrOrderId(order.getAddrOrderId());
-        String userMobile = userAddrOrder.getMobile().length() >= 4
-                ? userAddrOrder.getMobile().substring(userAddrOrder.getMobile().length() - 4)
-                : userAddrOrder.getMobile(); // 如果长度不足4位,直接返回原字符串
-        String receiverName = userAddrOrder.getReceiver();
-        String maskedName = receiverName.length() > 1
-                ? receiverName.substring(0, 1) + "*".repeat(receiverName.length() - 1)
-                : receiverName;
-        StringBuilder content = new StringBuilder();
-        content.append("<BR>");
-        content.append("<BR>");
-        content.append("<CB>#").append(lastFourDigits).append(" 海马购外卖</CB><BR>");
-        content.append("--------------------------------<BR>");
-        content.append("<BR>");
-        content.append("备注:").append(order.getRemarks()).append("<BR>");
-        content.append("<BR>");
-        content.append("--------------------------------<BR>");
-        content.append("下单时间:").append(DateUtil.date(order.getCreateTime())).append("<BR>");
-        content.append("<BR>");
-        content.append("订单编号:").append(order.getOrderNumber()).append("<BR>");
-        content.append("<BR>");
-        content.append("名称      单价  数量 金额<BR>");
-        content.append("----------商品信息----------<BR>");
-        for (OrderItem orderItem:orderItemsByOrderNumber){
-            content.append("<BR>");
-            content.append(orderItem.getProdName()).append("<BR>").append("          ").append(orderItem.getPrice()).append("    ").append(orderItem.getProdCount()).append("   ").append(orderItem.getActualTotal()).append("<BR>");
-        }
-        content.append("<BR>");
-        content.append("----------付款情况----------<BR>");
-        content.append("<BR>");
-        content.append("订单金额:").append(order.getTotal()).append("元<BR>");
-        content.append("<BR>");
-        content.append("实际支付:<B>").append(order.getActualTotal()).append("元</B><BR>");
-        content.append("--------------------------------<BR>");
-        content.append("<BR>");
-        content.append(maskedName);
-        content.append("<BR>");
-        content.append("顾客号码:手机尾号").append(userMobile).append("<BR>");
-        String add = userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail();
-        content.append("顾客地址:").append(add).append("<BR>");
-        content.append("########海马购外卖#").append(lastFourDigits).append("########<BR>");
-        content.append("<BR>");
-        content.append("<BR>");
-        return content.toString();
-    }
-}
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.platform.task;
+
+import cn.hutool.core.collection.CollectionUtil;
+import cn.hutool.core.date.DateUtil;
+import cn.hutool.core.util.ObjectUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.yami.shop.bean.bo.PayInfoBo;
+import com.yami.shop.bean.enums.DvyType;
+import com.yami.shop.bean.enums.OrderStatus;
+import com.yami.shop.bean.model.*;
+import com.yami.shop.bean.param.OrderDto;
+import com.yami.shop.common.enums.PayType;
+import com.yami.shop.common.exception.YamiShopBindException;
+import com.yami.shop.dao.DeviceFeyMapper;
+import com.yami.shop.delivery.comment.api.paotui.PaoTuiApi;
+import com.yami.shop.delivery.comment.param.DeliveryOrderItemParam;
+import com.yami.shop.delivery.comment.service.DeliveryOrderService;
+import com.yami.shop.service.*;
+import com.yami.shop.service.impl.FeiEYunApi;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.logging.log4j.core.util.JsonUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.http.ResponseEntity;
+import org.springframework.stereotype.Component;
+
+import java.math.BigDecimal;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Component("orderTask")
+public class OrderTask {
+
+
+    private Logger logger = LoggerFactory.getLogger(getClass());
+
+    @Autowired
+    private OrderService orderService;
+    @Autowired
+    private ProductService productService;
+    @Autowired
+    private SkuService skuService;
+    @Autowired
+    private PayService payService;
+    @Autowired
+    private OrderSettlementService orderSettlementService;
+    @Autowired
+    private PayManagerService payManagerService;
+
+    @Autowired
+    private PaoTuiApi paoTuiApi;
+
+    @Autowired
+    private OrderRefundService orderRefundService;
+
+    @Autowired
+    private OrderItemService orderItemService;
+
+    @Autowired
+    private UserAddrOrderService userAddrOrderService;
+
+    @Autowired
+    private DeliveryOrderService deliveryOrderService;
+
+    @Autowired
+    private IQnhService qnhService;
+
+    @Autowired
+    private UserService userService;
+
+    @Autowired
+    private ShopDetailService shopDetailService;
+    @Autowired
+    private DeviceFeyMapper deviceFeyMapper;
+
+
+
+
+
+    public void cancelOrder(){
+        Date now = new Date();
+        logger.info("取消超时未支付订单。。。");
+        // 获取30分钟之前未支付的订单
+        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.UNPAY.value(),DateUtil.offsetMinute(now, -30));
+        if (CollectionUtil.isEmpty(orders)) {
+            return;
+        }
+
+        List<Order>  cancelOrderList = this.chackOrders(orders);
+        orderService.cancelOrders(cancelOrderList);
+        // 移除缓存
+        this.removeCache(cancelOrderList);
+
+    }
+
+    /**
+     * 确认收货
+     */
+    public void confirmOrder(){
+        Date now = new Date();
+        logger.info("系统自动确认收货订单。。。");
+        // 获取15天之前等待确认收货的订单
+        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.CONSIGNMENT.value(),DateUtil.offsetDay(now, -15));
+        if (CollectionUtil.isEmpty(orders)) {
+            return;
+        }
+        orderService.receiptOrder(orders);
+        // 移除缓存
+        this.removeCache(orders);
+    }
+
+    public void createDistributionOrder(){
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        Date now = new Date();
+        logger.info("用户订单五分钟后未取消则创建物流订单。。。");
+        List<Order> orders = orderService.listUnRefundOrderAndOrderItems(OrderStatus.PADYED.value(),DateUtil.offsetMinute(now, -5));
+        if(CollectionUtil.isEmpty(orders)){
+            return;
+        }
+//        List<Order> orders =orderService.list(new QueryWrapper<Order>().lambda().like(Order::getOrderNumber,"1879830276981526528"));
+        for (Order order:orders){
+            //创建物流订单
+            if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value()) && Objects.equals(order.getDvyType(), DvyType.FETCH.value())){
+                System.out.println("订单不处于已付款状态,无法进行发货");
+                continue;
+            }else if (!Objects.equals(order.getStatus(), OrderStatus.PADYED.value())){
+                System.out.println("订单不处于待发货状态,无法进行发货");
+                continue;
+            }
+            UserAddrOrder userAddrOrder = userAddrOrderService.getById(order.getAddrOrderId());
+            if(ObjectUtil.isEmpty(userAddrOrder)){
+                System.out.println("该订单地址存在问题,请检查");
+                continue;
+            }
+            int count = orderRefundService.count(new LambdaQueryWrapper<OrderRefund>().eq(OrderRefund::getOrderId, order.getOrderId()));
+            if(count>0){
+                LambdaQueryWrapper<OrderRefund> orderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>();
+                orderRefundLambdaQueryWrapper.eq(OrderRefund::getOrderId,order.getOrderId());
+                //发货时只有订单不存在退款或退款被拒绝才会创建仓储与物流订单
+                orderRefundLambdaQueryWrapper.and(wrapper->wrapper.eq(OrderRefund::getReturnMoneySts,-1).or().eq(OrderRefund::getReturnMoneySts,7).or().eq(OrderRefund::getReturnMoneySts,6));
+                List<OrderRefund> orderRefunds = orderRefundService.list(orderRefundLambdaQueryWrapper);
+                if (CollectionUtil.isEmpty(orderRefunds)) {
+                    System.out.println("该订单有退款信息正在处理或已退款中,无法进行发货操作");
+                    continue;
+                }
+            }
+            try {
+                boolean success = createQNHOrder(order);
+                if(!success){
+                    continue;
+                }
+            }catch (Exception e){
+                System.out.println(e.getMessage());
+                continue;
+            }
+
+            List<OrderItem> orderItems = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+
+            //先创建物流订单
+            DeliveryOrderItemParam deliveryOrderItemParam = new DeliveryOrderItemParam();
+            deliveryOrderItemParam.setOrderNumber(order.getOrderNumber());
+            deliveryOrderItemParam.setDvyId(16l);
+            deliveryOrderItemParam.setDeliveryType(1);
+            deliveryOrderItemParam.setDvyFlowId("sdfsf");
+            deliveryOrderItemParam.setSelectOrderItems(orderItems);
+            for (OrderItem orderItem:deliveryOrderItemParam.getSelectOrderItems()){
+                orderItem.setChangeNum(orderItem.getProdCount());
+            }
+
+            try {
+                deliveryOrderService.saveDeliveriesInfo(deliveryOrderItemParam);
+                order=orderService.getById(order.getOrderId());
+                order.setDvyStatus(1);
+            }catch (Exception e){
+                System.out.println(e.getMessage());
+                order.setDvyStatus(0);
+            }
+            orderService.updateById(order);
+        }
+//        this.removeCache(orders);
+    }
+
+    /**
+     * 查询订单,去除已支付的订单
+     * @param orders
+     */
+    private List<Order> chackOrders(List<Order> orders){
+        List<String> orderNumbers=orders.stream().map(Order::getOrderNumber).collect(Collectors.toList());
+        // 收集未支付的订单
+        List<Order> orderList = new ArrayList<>();
+        //获取订单对应的订单结算数据
+        List<OrderSettlement> orderSettlementList = orderSettlementService.list(new LambdaQueryWrapper<OrderSettlement>()
+                .in(OrderSettlement::getOrderNumber, orderNumbers));
+        Map<String, OrderSettlement> orderSettlementMap = orderSettlementList.stream()
+                .collect(Collectors.toMap(OrderSettlement::getOrderNumber, orderSettlement -> orderSettlement));
+        for (Order order : orders) {
+            OrderSettlement orderSettlement = orderSettlementMap.get(order.getOrderNumber());
+            if (Objects.isNull(orderSettlement) || Objects.isNull(orderSettlement.getPayType()) || Objects.isNull(orderSettlement.getPayNo())){
+                orderList.add(order);
+                continue;
+            }
+            PayInfoBo payInfo = payManagerService.getPayInfo(PayType.instance(orderSettlement.getPayType()), orderSettlement.getPayNo());
+            if(payInfo.getIsPaySuccess()){
+                // 根据内部订单号更新order settlement
+                List<Order> successOrderList = payService.paySuccess(payInfo.getPayNo(), payInfo.getBizPayNo(),order.getPayType());
+                // 移除缓存
+                this.removeCache(successOrderList);
+            }else {
+                orderList.add(order);
+            }
+        }
+        return orderList;
+    }
+
+    /**
+     * 移除缓存
+     */
+    private void removeCache(List<Order> orders){
+        for (Order order : orders) {
+            List<OrderItem> orderItems = order.getOrderItems();
+            for (OrderItem orderItem : orderItems) {
+                productService.removeProductCacheByProdId(orderItem.getProdId());
+                skuService.removeSkuCacheBySkuId(orderItem.getSkuId(), orderItem.getProdId());
+            }
+        }
+    }
+
+    /**
+     * 创建牵牛花订单
+     * @param order
+     * @return
+     */
+    public boolean createQNHOrder(Order order) {
+        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
+        // 待添加创建牵牛花订单
+        OrderDto orderDto = new OrderDto();
+        orderDto.setChannelSheetno(order.getOrderNumber());
+        orderDto.setChannelKeyword("YYG");
+        orderDto.setPayOver(true);
+        orderDto.setBilltype(1+"");
+        orderDto.setTotalSaleValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setTotalDiscValue(BigDecimal.ZERO);
+        orderDto.setTotalSjDisc(BigDecimal.ZERO);
+        orderDto.setTotalSaleValue(BigDecimal.ZERO);
+        orderDto.setTotalPtDp(BigDecimal.ZERO);
+        orderDto.setTotalSjDp(BigDecimal.ZERO);
+        orderDto.setTotalPtDisc(BigDecimal.ZERO);
+        orderDto.setCommissionValue(BigDecimal.ZERO);
+        orderDto.setPayableValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setTotalItemValue(BigDecimal.valueOf(order.getTotal()));
+        orderDto.setLogisticsModeKeyword(order.getFreightAmount().toString());
+
+
+        ShopDetail shopDetailByShopId = shopDetailService.getById(order.getShopId());
+//            orderDto.setOrgName(shopDetailByShopId.getShopName());
+        orderDto.setOrgCode(shopDetailByShopId.getThirdPartyCode());
+        orderDto.setOrgName(shopDetailByShopId.getShopName());
+        orderDto.setPreOrder(false);
+        orderDto.setOfflineOrder(false);
+        orderDto.setOrderTime(formatter.format(order.getCreateTime()));
+        orderDto.setGroupId(0);
+        orderDto.setGoodsReturn("true");
+        UserAddrOrder addrOrder = userAddrOrderService.getById(order.getAddrOrderId());
+        User user = userService.getUserByUserId(order.getUserId());
+
+        //填充收件人信息
+        orderDto.setReceiver(new OrderDto.Receiver());
+        orderDto.getReceiver().setAddress(addrOrder.getAddress());
+        orderDto.getReceiver().setMobile(user.getUserMobile());
+        orderDto.getReceiver().setName(user.getNickName());
+        orderDto.getReceiver().setType("0");
+        orderDto.getReceiver().setLatitude(String.valueOf(addrOrder.getLatitude()));
+        orderDto.getReceiver().setLongitude(String.valueOf(addrOrder.getLongitude()));
+        orderDto.setPayableLogisticsValue(BigDecimal.valueOf(order.getPlatformAmount()));
+        orderDto.setLogisticsModeKeyword("0");
+
+        //填充买家信息
+        orderDto.setBuyer(new OrderDto.Buyer());
+        orderDto.getBuyer().setAddress(addrOrder.getAddress());
+        orderDto.getBuyer().setNick(user.getNickName());
+        orderDto.getBuyer().setEmail(user.getUserMail());
+        orderDto.getBuyer().setNote(order.getRemarks());
+        orderDto.getBuyer().setTel(user.getUserMobile());
+
+        //填充支付信息
+        orderDto.setOrderPayments(new OrderDto.OrderPayments());
+        orderDto.getOrderPayments().setPayment(BigDecimal.valueOf(order.getTotal()));
+        orderDto.getOrderPayments().setKeyword("10002");
+        orderDto.getOrderPayments().setName("商城系统支付");
+        ArrayList<OrderDto.OrderDetails> orderDetails = new ArrayList<>();
+        int weight = 0;
+        List<OrderItem> orderItems1 = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        for (OrderItem orderItem:orderItems1){
+            OrderDto.OrderDetails orderDetails1 = new OrderDto.OrderDetails();
+            Sku sku = skuService.getById(orderItem.getSkuId());
+            orderDetails1.setSkuId(sku.getPartyCode());
+            orderDetails1.setItemCode("");
+            orderDetails1.setBarcode("");
+            orderDetails1.setOrderItemId(orderItem.getOrderItemId().toString());
+            orderDetails1.setName(orderItem.getProdName());
+            orderDetails1.setOriginalPrice(BigDecimal.valueOf(sku.getOriPrice()));
+            orderDetails1.setWeight((int)Math.round(sku.getWeight()));
+            weight+=orderDetails1.getWeight();
+            orderDetails1.setSalePrice(BigDecimal.valueOf(sku.getPrice()));
+            orderDetails1.setQty(orderItem.getProdCount());
+            orderDetails1.setMoney(orderDetails1.getSalePrice().multiply(BigDecimal.valueOf(orderDetails1.getQty())));
+            orderDetails.add(orderDetails1);
+        }
+        orderDto.setOrderDetails(orderDetails);
+        orderDto.setWeight(weight);
+        String s = qnhService.addOrder(orderDto);
+//        ResponseEntity responseEntity = qnhService.addOrder(orderDto);
+        if(!StringUtils.isBlank(s)){
+            order.setQnhOrderId(s);
+            order.setQnhOrderStatus("1");
+            orderService.updateById(order);
+            DeviceFey deviceFey = deviceFeyMapper.selectOne(Wrappers.<DeviceFey>lambdaQuery().eq(DeviceFey::getShopId, order.getShopId()).last("limit 1"));
+            FeiEYunApi.print(deviceFey.getDeviceSn(),print(order.getOrderNumber()));
+            return true;
+        }
+        return false;
+    }
+    private String print(String orderByOrderNumber){
+        Order order = orderService.getOrderByOrderNumber(orderByOrderNumber);
+        List<OrderItem> orderItemsByOrderNumber = orderItemService.getOrderItemsByOrderNumber(order.getOrderNumber());
+        String lastFourDigits = order.getOrderNumber().length() >= 4
+                ? order.getOrderNumber().substring(order.getOrderNumber().length() - 4)
+                : order.getOrderNumber(); // 如果长度不足4位,直接返回原字符串
+        UserAddrOrder userAddrOrder = userAddrOrderService.selectByAddrOrderId(order.getAddrOrderId());
+        String userMobile = userAddrOrder.getMobile().length() >= 4
+                ? userAddrOrder.getMobile().substring(userAddrOrder.getMobile().length() - 4)
+                : userAddrOrder.getMobile(); // 如果长度不足4位,直接返回原字符串
+        String receiverName = userAddrOrder.getReceiver();
+        String maskedName = receiverName.length() > 1
+                ? receiverName.substring(0, 1) + "*".repeat(receiverName.length() - 1)
+                : receiverName;
+        StringBuilder content = new StringBuilder();
+        content.append("<BR>");
+        content.append("<BR>");
+        content.append("<CB>#").append(lastFourDigits).append(" 海马购外卖</CB><BR>");
+        content.append("--------------------------------<BR>");
+        content.append("<BR>");
+        content.append("备注:").append(order.getRemarks()).append("<BR>");
+        content.append("<BR>");
+        content.append("--------------------------------<BR>");
+        content.append("下单时间:").append(DateUtil.date(order.getCreateTime())).append("<BR>");
+        content.append("<BR>");
+        content.append("订单编号:").append(order.getOrderNumber()).append("<BR>");
+        content.append("<BR>");
+        content.append("名称      单价  数量 金额<BR>");
+        content.append("----------商品信息----------<BR>");
+        for (OrderItem orderItem:orderItemsByOrderNumber){
+            content.append("<BR>");
+            content.append(orderItem.getProdName()).append("<BR>").append("          ").append(orderItem.getPrice()).append("    ").append(orderItem.getProdCount()).append("   ").append(orderItem.getActualTotal()).append("<BR>");
+        }
+        content.append("<BR>");
+        content.append("----------付款情况----------<BR>");
+        content.append("<BR>");
+        content.append("订单金额:").append(order.getTotal()).append("元<BR>");
+        content.append("<BR>");
+        content.append("实际支付:<B>").append(order.getActualTotal()).append("元</B><BR>");
+        content.append("--------------------------------<BR>");
+        content.append("<BR>");
+        content.append(maskedName);
+        content.append("<BR>");
+        content.append("顾客号码:手机尾号").append(userMobile).append("<BR>");
+        String add = userAddrOrder.getAddress() + userAddrOrder.getAddressName() + userAddrOrder.getAddrDetail();
+        content.append("顾客地址:").append(add).append("<BR>");
+        content.append("########海马购外卖#").append(lastFourDigits).append("########<BR>");
+        content.append("<BR>");
+        content.append("<BR>");
+        return content.toString();
+    }
+}

+ 1 - 1
yami-shop-quartz/src/main/java/com/yami/shop/quartz/util/SpringBeanTaskUtil.java

@@ -25,7 +25,7 @@ import java.lang.reflect.Method;
  */
 @Slf4j
 public class SpringBeanTaskUtil {
-	
+
 	public static void invokeMethod(ScheduleJob scheduleJob) {
 		Object target = SpringContextUtils.getBean(scheduleJob.getBeanName());
 		try {

+ 7 - 6
yami-shop-security/yami-shop-security-api/src/main/java/com/yami/shop/security/api/service/impl/YamiUserServiceImpl.java

@@ -128,19 +128,20 @@ public class YamiUserServiceImpl implements YamiUserDetailsService {
 		log.info("用户信息:{}", user);
 		log.info("appId:{}", appId);
 		log.info("bizUserId:{}", bizUserId);
+		YamiUser yamiUser = new YamiUser();
+		yamiUser.setEnabled(Boolean.TRUE);
 		String nickName = "微信用户";
 		if (user != null){
 			nickName = StrUtil.isBlank(user.getNickName()) ? user.getRealName():user.getNickName();
+			yamiUser.setEnabled(user.getStatus() == 1);
+			yamiUser.setUserId(user.getUserId());
+			yamiUser.setPic(user.getPic());
+			yamiUser.setPassword(user.getLoginPassword());
 		}
-
-		YamiUser yamiUser = new YamiUser();
-		yamiUser.setEnabled(user.getStatus() == 1);
-		yamiUser.setUserId(user.getUserId());
 		yamiUser.setBizUserId(bizUserId);
 		yamiUser.setAppType(appId);
 		yamiUser.setName(nickName);
-		yamiUser.setPic(user.getPic());
-		yamiUser.setPassword(user.getLoginPassword());
+
 		return yamiUser;
 	}
 }

+ 2 - 0
yami-shop-security/yami-shop-security-comment/src/main/java/com/yami/shop/security/comment/token/AuthenticationToken.java

@@ -21,6 +21,7 @@ import java.util.Collection;
 
 /**
  * 自定义AbstractAuthenticationToken,
+ *
  * @author LGH
  */
 @Getter
@@ -55,6 +56,7 @@ public class AuthenticationToken implements Authentication,
      * app类型 见com.yami.shop.security.comment.enums.App
      */
     private Integer appType;
+//    private Integer platform;
 
     /**
      * 0 用户名或手机号 1短信验证码

+ 1 - 0
yami-shop-security/yami-shop-security-platform/src/main/java/com/yami/shop/security/platform/config/ResourceServerConfiguration.java

@@ -50,6 +50,7 @@ public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter
             .antMatchers(
                     "/webjars/**",
                     "/swagger/**",
+                    "/platform/**",
                     "/hb/**",
                     "/v2/api-docs",
                     "/doc.html",

+ 4 - 5
yami-shop-service/src/main/java/com/yami/shop/dao/CategoryPropMapper.java → yami-shop-service/src/main/java/com/yami/shop/dao/CategoryProdMapper.java

@@ -14,15 +14,14 @@ import java.util.List;
 
 import org.apache.ibatis.annotations.Param;
 
-import com.yami.shop.bean.model.CategoryProp;
+import com.yami.shop.bean.model.CategoryProd;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 
-public interface CategoryPropMapper extends BaseMapper<CategoryProp> {
+public interface CategoryProdMapper extends BaseMapper<CategoryProd> {
 
-	void insertCategoryProp(@Param("categoryId") Long categoryId, @Param("propIds") List<Long> propIds);
 
 	void deleteByCategoryId(Long categoryId);
 
-	void deleteByPropId(Long propId);
-}
+	void deleteByProdId(Long prodId);
+}

+ 33 - 33
yami-shop-service/src/main/java/com/yami/shop/dao/ChannelMapper.java

@@ -1,33 +1,33 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.dao;
-
-import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.yami.shop.bean.model.Channel;
-import com.yami.shop.bean.model.ChannelProd;
-import com.yami.shop.common.util.PageParam;
-import org.apache.ibatis.annotations.Param;
-
-import java.util.List;
-
-/**
- * 渠道管理Mapper接口
- */
-public interface ChannelMapper extends BaseMapper<ChannelProd> {
-
-    /**
-     * 通过渠道名称查询渠道
-     * @param channelName 渠道名称
-     * @return 渠道信息
-     */
-    Channel selectByName(@Param("channelName") String channelName);
-}
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.yami.shop.bean.model.Channel;
+import com.yami.shop.bean.model.ChannelProd;
+import com.yami.shop.common.util.PageParam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 渠道管理Mapper接口
+ */
+public interface ChannelMapper extends BaseMapper<Channel> {
+
+    /**
+     * 通过渠道名称查询渠道
+     * @param channelName 渠道名称
+     * @return 渠道信息
+     */
+    Channel selectByName(@Param("channelName") String channelName);
+}

+ 17 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/ChannelShopMapper.java

@@ -0,0 +1,17 @@
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.ChannelShop;
+import com.yami.shop.bean.model.Dept;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 渠道门店Mapper接口
+ *
+ * @author
+ */
+public interface ChannelShopMapper extends BaseMapper<ChannelShop> {
+
+}

+ 3 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/DeptMapper.java

@@ -31,5 +31,7 @@ public interface DeptMapper extends BaseMapper<Dept> {
      * @param userId 用户ID
      * @return 部门列表
      */
-    List<Dept> selectDeptsByUserId(@Param("userId") String userId);
+    List<Dept> selectDeptsByUserId(@Param("userId") Long userId);
+
+    List<Dept> selectListAll();
 }

+ 2 - 2
yami-shop-service/src/main/java/com/yami/shop/dao/DeptUserMapper.java

@@ -18,7 +18,7 @@ public interface DeptUserMapper extends BaseMapper<DeptUser> {
      * @param userId 用户ID
      * @return 部门用户关联列表
      */
-    List<DeptUser> selectByUserId(@Param("userId") String userId);
+    List<DeptUser> selectByUserId(@Param("userId") Long userId);
 
     /**
      * 根据部门ID获取部门用户关联列表
@@ -39,7 +39,7 @@ public interface DeptUserMapper extends BaseMapper<DeptUser> {
      * @param userId 用户ID
      * @return 删除记录数
      */
-    int deleteByUserId(@Param("userId") String userId);
+    int deleteByUserId(@Param("userId") Long userId);
 
     /**
      * 根据部门ID删除部门用户关联

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/FrontCategoryMapper.java

@@ -10,6 +10,7 @@ package com.yami.shop.dao;
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.yami.shop.bean.model.FrontCategory;
 import com.yami.shop.bean.model.ShopWalletLog;
+import org.apache.ibatis.annotations.Param;
 
 /**
  * 海博前台类目
@@ -19,4 +20,5 @@ import com.yami.shop.bean.model.ShopWalletLog;
  */
 public interface FrontCategoryMapper extends BaseMapper<FrontCategory> {
 
+    FrontCategory selectListName(@Param("name") String name);
 }

+ 14 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/LabelMapper.java

@@ -0,0 +1,14 @@
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.Label;
+
+/**
+ * 标签 Mapper接口
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+public interface LabelMapper extends BaseMapper<Label> {
+
+}

+ 14 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsFailureRecordMapper.java

@@ -0,0 +1,14 @@
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.PointsFailureRecord;
+
+/**
+ * 积分充值失败记录 Mapper接口
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+public interface PointsFailureRecordMapper extends BaseMapper<PointsFailureRecord> {
+
+}

+ 14 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRechargeMapper.java

@@ -0,0 +1,14 @@
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.PointsRecharge;
+
+/**
+ * 积分充值 Mapper接口
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+public interface PointsRechargeMapper extends BaseMapper<PointsRecharge> {
+
+}

+ 15 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/PointsRecordMapper.java

@@ -0,0 +1,15 @@
+// 文件路径: com/yami/shop/dao/PointsRecordMapper.java
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.PointsRecord;
+
+/**
+ * 积分记录详细 Mapper接口
+ *
+ * @author
+ * @since 2025-09-XX
+ */
+public interface PointsRecordMapper extends BaseMapper<PointsRecord> {
+
+}

+ 35 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/ShopCategoryMapper.java

@@ -0,0 +1,35 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.yami.shop.bean.app.dto.ShopHeadInfoDto;
+import com.yami.shop.bean.model.ShopCategory;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.bean.vo.FrontCategoryVO;
+import com.yami.shop.common.util.PageParam;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * @author LGH
+ */
+public interface ShopCategoryMapper extends BaseMapper<ShopCategory> {
+
+
+    /**
+     * 获取店铺分类
+     * @return 店铺分类
+     */
+    List<FrontCategoryVO> treeShopCategory();
+}

+ 2 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/ShopDetailMapper.java

@@ -44,6 +44,7 @@ public interface ShopDetailMapper extends BaseMapper<ShopDetail> {
 
     /**
      * 根据海博编码查询门店信息
+     *
      * @param hbStationId 海博门店编码
      * @return
      */
@@ -61,7 +62,7 @@ public interface ShopDetailMapper extends BaseMapper<ShopDetail> {
     ShopDetail selectShopDetailById(@Param("shopId") Long shopId);
 
     List<ShopDetail> neighborShop(@Param("lat") String lat,
-                        @Param("lon") String lon);
+                                  @Param("lon") String lon, @Param("platform") Integer platform);
 
 
 }

+ 3 - 3
yami-shop-service/src/main/java/com/yami/shop/dao/ShopProdMapper.java → yami-shop-service/src/main/java/com/yami/shop/dao/ShopSkuMapper.java

@@ -11,13 +11,13 @@
 package com.yami.shop.dao;
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
-import com.yami.shop.bean.model.ShopProd;
+import com.yami.shop.bean.model.ShopSku;
 import org.apache.ibatis.annotations.Param;
 
 /**
  * @author LGH
  */
-public interface ShopProdMapper extends BaseMapper<ShopProd> {
+public interface ShopSkuMapper extends BaseMapper<ShopSku> {
 
-    ShopProd selectByShopAndProd(@Param("skuId") Long skuId, @Param("shopId") Long shopId);
+    ShopSku selectByShopAndProd(@Param("skuId") Long skuId, @Param("shopId") Long shopId);
 }

+ 3 - 1
yami-shop-service/src/main/java/com/yami/shop/dao/SkuMapper.java

@@ -29,7 +29,9 @@ public interface SkuMapper extends BaseMapper<Sku> {
 	 */
 	void insertBatch(@Param("prodId") Long prodId, @Param("skuList") List<Sku> skuList);
 
-	List<Sku> listByProdId(Long prodId);
+	List<Sku> listByProdId(@Param("prodId")Long prodId);
+
+	List<Sku> listByProdIdAndPlatform(@Param("prodId")Long prodId,@Param("platform")Integer platform,@Param("shopId")Long shopId);
 
 	int updateStocks(@Param("sku") Sku sku);
 

+ 96 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/SysDictDataMapper.java

@@ -0,0 +1,96 @@
+package com.yami.shop.dao;
+
+import com.yami.shop.bean.model.SysDictData;
+import org.apache.ibatis.annotations.Param;
+
+import java.util.List;
+
+/**
+ * 字典表 数据层
+ *
+ * @author ruoyi
+ */
+public interface SysDictDataMapper
+{
+    /**
+     * 根据条件分页查询字典数据
+     *
+     * @param dictData 字典数据信息
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataList(SysDictData dictData);
+
+    /**
+     * 根据字典类型查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
+     * 根据字典类型和字典键值查询字典数据信息
+     *
+     * @param dictType 字典类型
+     * @param dictValue 字典键值
+     * @return 字典标签
+     */
+    public String selectDictLabel(@Param("dictType") String dictType, @Param("dictValue") String dictValue);
+
+    /**
+     * 根据字典数据ID查询信息
+     *
+     * @param dictCode 字典数据ID
+     * @return 字典数据
+     */
+    public SysDictData selectDictDataById(Long dictCode);
+
+    /**
+     * 查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据
+     */
+    public int countDictDataByType(String dictType);
+
+    /**
+     * 通过字典ID删除字典数据信息
+     *
+     * @param dictCode 字典数据ID
+     * @return 结果
+     */
+    public int deleteDictDataById(Long dictCode);
+
+    /**
+     * 批量删除字典数据信息
+     *
+     * @param dictCodes 需要删除的字典数据ID
+     * @return 结果
+     */
+    public int deleteDictDataByIds(Long[] dictCodes);
+
+    /**
+     * 新增字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int insertDictData(SysDictData dictData);
+
+    /**
+     * 修改字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int updateDictData(SysDictData dictData);
+
+    /**
+     * 同步修改字典类型
+     *
+     * @param oldDictType 旧字典类型
+     * @param newDictType 新旧字典类型
+     * @return 结果
+     */
+    public int updateDictDataType(@Param("oldDictType") String oldDictType, @Param("newDictType") String newDictType);
+}

+ 85 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/SysDictTypeMapper.java

@@ -0,0 +1,85 @@
+package com.yami.shop.dao;
+
+
+import com.yami.shop.bean.model.SysDictType;
+
+import java.util.List;
+
+/**
+ * 字典表 数据层
+ *
+ * @author ruoyi
+ */
+public interface SysDictTypeMapper
+{
+    /**
+     * 根据条件分页查询字典类型
+     *
+     * @param dictType 字典类型信息
+     * @return 字典类型集合信息
+     */
+    public List<SysDictType> selectDictTypeList(SysDictType dictType);
+
+    /**
+     * 根据所有字典类型
+     *
+     * @return 字典类型集合信息
+     */
+    public List<SysDictType> selectDictTypeAll();
+
+    /**
+     * 根据字典类型ID查询信息
+     *
+     * @param dictId 字典类型ID
+     * @return 字典类型
+     */
+    public SysDictType selectDictTypeById(Long dictId);
+
+    /**
+     * 根据字典类型查询信息
+     *
+     * @param dictType 字典类型
+     * @return 字典类型
+     */
+    public SysDictType selectDictTypeByType(String dictType);
+
+    /**
+     * 通过字典ID删除字典信息
+     *
+     * @param dictId 字典ID
+     * @return 结果
+     */
+    public int deleteDictTypeById(Long dictId);
+
+    /**
+     * 批量删除字典类型信息
+     *
+     * @param dictIds 需要删除的字典ID
+     * @return 结果
+     */
+    public int deleteDictTypeByIds(Long[] dictIds);
+
+    /**
+     * 新增字典类型信息
+     *
+     * @param dictType 字典类型信息
+     * @return 结果
+     */
+    public int insertDictType(SysDictType dictType);
+
+    /**
+     * 修改字典类型信息
+     *
+     * @param dictType 字典类型信息
+     * @return 结果
+     */
+    public int updateDictType(SysDictType dictType);
+
+    /**
+     * 校验字典类型称是否唯一
+     *
+     * @param dictType 字典类型
+     * @return 结果
+     */
+    public SysDictType checkDictTypeUnique(String dictType);
+}

+ 23 - 0
yami-shop-service/src/main/java/com/yami/shop/dao/TzSysUserMapper.java

@@ -0,0 +1,23 @@
+/*
+ * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
+ *
+ * https://www.gz-yami.com/
+ *
+ * 未经允许,不可做商业用途!
+ *
+ * 版权所有,侵权必究!
+ */
+
+package com.yami.shop.dao;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.yami.shop.bean.model.SysUser;
+
+import java.util.List;
+
+/**
+ * 系统用户
+ */
+public interface TzSysUserMapper extends BaseMapper<SysUser> {
+
+}

+ 2 - 2
yami-shop-service/src/main/java/com/yami/shop/service/CategoryPropService.java → yami-shop-service/src/main/java/com/yami/shop/service/CategoryProdService.java

@@ -11,12 +11,12 @@
 package com.yami.shop.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
-import com.yami.shop.bean.model.CategoryProp;
+import com.yami.shop.bean.model.CategoryProd;
 
 /**
  *
  * Created by lgh on 2018/07/13.
  */
-public interface CategoryPropService extends IService<CategoryProp> {
+public interface CategoryProdService extends IService<CategoryProd> {
 
 }

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/DeptService.java

@@ -57,5 +57,5 @@ public interface DeptService extends IService<Dept> {
      * @param userId 用户ID
      * @return 部门列表
      */
-    List<Dept> listDeptsByUserId(String userId);
+    List<Dept> listDeptsByUserId(Long userId);
 }

+ 4 - 4
yami-shop-service/src/main/java/com/yami/shop/service/DeptUserService.java

@@ -17,7 +17,7 @@ public interface DeptUserService extends IService<DeptUser> {
      * @param userId 用户ID
      * @return 部门用户关联列表
      */
-    List<DeptUser> listByUserId(String userId);
+    List<DeptUser> listByUserId(Long userId);
 
     /**
      * 根据部门ID获取部门用户关联列表
@@ -32,14 +32,14 @@ public interface DeptUserService extends IService<DeptUser> {
      * @param deptIds 部门ID列表
      * @return 保存结果
      */
-    boolean saveUserDept(String userId, List<Long> deptIds);
+    boolean saveUserDept(Long userId, List<Long> deptIds);
 
     /**
      * 根据用户ID删除部门用户关联
      * @param userId 用户ID
      * @return 删除结果
      */
-    boolean deleteByUserId(String userId);
+    boolean deleteByUserId(Long userId);
 
     /**
      * 根据部门ID删除部门用户关联
@@ -54,5 +54,5 @@ public interface DeptUserService extends IService<DeptUser> {
      * @param deptId 部门ID
      * @return 保存结果
      */
-    boolean saveBatchUserDepts(List<String> userIds, Long deptId);
+    boolean saveBatchUserDepts(List<Long> userIds, Long deptId);
 }

+ 18 - 0
yami-shop-service/src/main/java/com/yami/shop/service/IFrontCategoryService.java

@@ -0,0 +1,18 @@
+package com.yami.shop.service;
+
+import com.yami.shop.bean.model.FrontCategory;
+
+import java.util.List;
+
+/**
+ * 前台类目管理服务接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-4
+ */
+public interface IFrontCategoryService {
+
+
+
+}

+ 40 - 0
yami-shop-service/src/main/java/com/yami/shop/service/IShopCategoryService.java

@@ -0,0 +1,40 @@
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.FrontCategory;
+import com.yami.shop.bean.model.ShopCategory;
+import com.yami.shop.bean.vo.FrontCategoryVO;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.List;
+
+
+/**
+ * 门店前台类目服务接口
+ *
+ * @author YourName
+ * @since 2025-09-XX
+ */
+public interface IShopCategoryService extends IService<ShopCategory> {
+    /**
+     * 查询全部(树形)
+     * @return List<FrontCategory>
+     */
+    List<ShopCategory> treeShopCategory(Long shopId,
+                                          String name);
+
+    /**
+     * 导出门店前台类目导入模板
+     *
+     * @param response HTTP响应对象
+     * @throws Exception 导出异常
+     */
+    void exportTemplate(HttpServletResponse response) throws Exception;
+    /**
+     * 导入类目
+     * @param file  文件
+     */
+    void importCategory(MultipartFile file);
+}

+ 61 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ISysDictDataService.java

@@ -0,0 +1,61 @@
+package com.yami.shop.service;
+
+import com.yami.shop.bean.model.SysDictData;
+
+import java.util.List;
+
+/**
+ * 字典 业务层
+ *
+ * @author ruoyi
+ */
+public interface ISysDictDataService
+{
+    /**
+     * 根据条件分页查询字典数据
+     *
+     * @param dictData 字典数据信息
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataList(SysDictData dictData);
+
+    /**
+     * 根据字典类型和字典键值查询字典数据信息
+     *
+     * @param dictType 字典类型
+     * @param dictValue 字典键值
+     * @return 字典标签
+     */
+    public String selectDictLabel(String dictType, String dictValue);
+
+    /**
+     * 根据字典数据ID查询信息
+     *
+     * @param dictCode 字典数据ID
+     * @return 字典数据
+     */
+    public SysDictData selectDictDataById(Long dictCode);
+
+    /**
+     * 批量删除字典数据信息
+     *
+     * @param dictCodes 需要删除的字典数据ID
+     */
+    public void deleteDictDataByIds(Long[] dictCodes);
+
+    /**
+     * 新增保存字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int insertDictData(SysDictData dictData);
+
+    /**
+     * 修改保存字典数据信息
+     *
+     * @param dictData 字典数据信息
+     * @return 结果
+     */
+    public int updateDictData(SysDictData dictData);
+}

+ 99 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ISysDictTypeService.java

@@ -0,0 +1,99 @@
+package com.yami.shop.service;
+
+import com.yami.shop.bean.model.SysDictData;
+import com.yami.shop.bean.model.SysDictType;
+
+import java.util.List;
+
+/**
+ * 字典 业务层
+ *
+ * @author ruoyi
+ */
+public interface ISysDictTypeService
+{
+    /**
+     * 根据条件分页查询字典类型
+     *
+     * @param dictType 字典类型信息
+     * @return 字典类型集合信息
+     */
+    public List<SysDictType> selectDictTypeList(SysDictType dictType);
+
+    /**
+     * 根据所有字典类型
+     *
+     * @return 字典类型集合信息
+     */
+    public List<SysDictType> selectDictTypeAll();
+
+    /**
+     * 根据字典类型查询字典数据
+     *
+     * @param dictType 字典类型
+     * @return 字典数据集合信息
+     */
+    public List<SysDictData> selectDictDataByType(String dictType);
+
+    /**
+     * 根据字典类型ID查询信息
+     *
+     * @param dictId 字典类型ID
+     * @return 字典类型
+     */
+    public SysDictType selectDictTypeById(Long dictId);
+
+    /**
+     * 根据字典类型查询信息
+     *
+     * @param dictType 字典类型
+     * @return 字典类型
+     */
+    public SysDictType selectDictTypeByType(String dictType);
+
+    /**
+     * 批量删除字典信息
+     *
+     * @param dictIds 需要删除的字典ID
+     */
+    public void deleteDictTypeByIds(Long[] dictIds);
+
+    /**
+     * 加载字典缓存数据
+     */
+    public void loadingDictCache();
+
+    /**
+     * 清空字典缓存数据
+     */
+    public void clearDictCache();
+
+    /**
+     * 重置字典缓存数据
+     */
+    public void resetDictCache();
+
+    /**
+     * 新增保存字典类型信息
+     *
+     * @param dictType 字典类型信息
+     * @return 结果
+     */
+    public int insertDictType(SysDictType dictType);
+
+    /**
+     * 修改保存字典类型信息
+     *
+     * @param dictType 字典类型信息
+     * @return 结果
+     */
+    public int updateDictType(SysDictType dictType);
+
+    /**
+     * 校验字典类型称是否唯一
+     *
+     * @param dictType 字典类型
+     * @return 结果
+     */
+    public boolean checkDictTypeUnique(SysDictType dictType);
+}

+ 14 - 0
yami-shop-service/src/main/java/com/yami/shop/service/LabelService.java

@@ -0,0 +1,14 @@
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.Label;
+
+/**
+ * 标签Service接口
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+public interface LabelService extends IService<Label> {
+
+}

+ 15 - 0
yami-shop-service/src/main/java/com/yami/shop/service/PointsFailureRecordService.java

@@ -0,0 +1,15 @@
+// PointsFailureRecordService.java
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.PointsFailureRecord;
+
+/**
+ * 积分充值失败记录 Service接口
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+public interface PointsFailureRecordService extends IService<PointsFailureRecord> {
+
+}

+ 31 - 0
yami-shop-service/src/main/java/com/yami/shop/service/PointsRechargeService.java

@@ -0,0 +1,31 @@
+// PointsRechargeService.java
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.PointsRecharge;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletResponse;
+
+/**
+ * 积分充值 Service接口
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+public interface PointsRechargeService extends IService<PointsRecharge> {
+    /**
+     * 导出积分充值导入模板
+     * @param response HTTP响应对象
+     * @throws Exception 导出异常
+     */
+    void exportTemplate(HttpServletResponse response) throws Exception;
+
+    /**
+     * 导入积分充值数据
+     * @param file 导入文件
+     * @return 导入结果
+     * @throws Exception 导入异常
+     */
+    String importPointsRecharge(MultipartFile file) throws Exception;
+}

+ 15 - 0
yami-shop-service/src/main/java/com/yami/shop/service/PointsRecordService.java

@@ -0,0 +1,15 @@
+// PointsRecordService.java
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.PointsRecord;
+
+/**
+ * 积分记录详细 Service接口
+ *
+ * @author fbj
+ * @since 2025-09-XX
+ */
+public interface PointsRecordService extends IService<PointsRecord> {
+
+}

+ 59 - 55
yami-shop-service/src/main/java/com/yami/shop/service/ShopDetailService.java

@@ -24,83 +24,87 @@ import org.springframework.http.ResponseEntity;
 import java.util.List;
 
 /**
- *
  * @author lgh on 2018/08/29.
  */
 public interface ShopDetailService extends IService<ShopDetail> {
 
-	void updateShopDetail(ShopDetail shopDetail,ShopDetail dbShopDetail);
+    void updateShopDetail(ShopDetail shopDetail, ShopDetail dbShopDetail);
 
-	void deleteShopDetailByShopId(Long id);
+    void deleteShopDetailByShopId(Long id);
 
-	/**
-	 * 根据店铺id获取店铺信息
-	 * @param shopId
-	 * @return
-	 */
-	ShopDetail getShopDetailByShopId(Long shopId);
+    /**
+     * 根据店铺id获取店铺信息
+     *
+     * @param shopId
+     * @return
+     */
+    ShopDetail getShopDetailByShopId(Long shopId);
 
-	void removeShopDetailCacheByShopId(Long shopId);
+    void removeShopDetailCacheByShopId(Long shopId);
 
-	/**
-	 * 根据店铺的手机号(登陆账号),获取店铺信息
-	 *
-	 * @param mobile 手机号
-	 * @return
-	 */
-	ShopDetail getShopByMobile(@Param("mobile") String mobile);
+    /**
+     * 根据店铺的手机号(登陆账号),获取店铺信息
+     *
+     * @param mobile 手机号
+     * @return
+     */
+    ShopDetail getShopByMobile(@Param("mobile") String mobile);
 
-	void updatePasswordByUserName(String username, String newPassword);
+    void updatePasswordByUserName(String username, String newPassword);
 
-	/**
-	 * 根据用户id查询店铺信息
-	 */
-	ShopDetail getShopDetailByUserId(String userId);
+    /**
+     * 根据用户id查询店铺信息
+     */
+    ShopDetail getShopDetailByUserId(String userId);
 
-	/**
-	 * 申请开店铺
-	 */
-	void applyShop(String userId, ShopDetailParam shopDetailParam);
+    /**
+     * 申请开店铺
+     */
+    void applyShop(String userId, ShopDetailParam shopDetailParam);
 
-	/**
-	 * 审核商家信息
-	 */
-	boolean audit(ShopAuditing shopAuditing);
+    /**
+     * 审核商家信息
+     */
+    boolean audit(ShopAuditing shopAuditing);
 
-	/**
-	 *  平台 --下线活动商品
-	 */
+    /**
+     * 平台 --下线活动商品
+     */
     void offline(ShopDetail shopDetail, String offlineReason, Long sysUserId);
 
-	/**
-	 * 申请审核
-	 */
-	void auditApply(Long eventId, Long handleId, String reapplyReason);
-
-	/**
-	 * 审核下线商店
-	 */
-	void auditOfflineShop(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);
-
-	/**
-	 * 热门店铺
-	 * @return
-	 */
+    /**
+     * 申请审核
+     */
+    void auditApply(Long eventId, Long handleId, String reapplyReason);
+
+    /**
+     * 审核下线商店
+     */
+    void auditOfflineShop(OfflineHandleEventAuditParam offlineHandleEventAuditParam, Long sysUserId);
+
+    /**
+     * 热门店铺
+     *
+     * @return
+     */
     List<ShopHeadInfoDto> listHotShopsHead();
 
-	/**
-	 * 分页搜索店铺
-	 * @param page
-	 * @param shopHeadInfoDto
-	 * @return
-	 */
+    /**
+     * 分页搜索店铺
+     *
+     * @param page
+     * @param shopHeadInfoDto
+     * @return
+     */
     Page<ShopHeadInfoDto> searchShops(PageParam<ShopHeadInfoDto> page, ShopHeadInfoDto shopHeadInfoDto);
 
     void insertDetail(ShopDetail shopDetail);
 
-	int checkMobile(String mobile, Long shopId);
+    int checkMobile(String mobile, Long shopId);
 
-	void updatePasswordOrMobile(Long shopId, String password, String mobile);
+    void updatePasswordOrMobile(Long shopId, String password, String mobile);
 
     ResponseEntity<ShopHeadInfoDto> neighborShop(String lat, String lon);
+
+    ResponseEntity<ShopHeadInfoDto> neighborShop(String lat, String lon, Integer platform);
 }

+ 0 - 22
yami-shop-service/src/main/java/com/yami/shop/service/ShopProdService.java

@@ -1,22 +0,0 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.service;
-
-import com.baomidou.mybatisplus.extension.service.IService;
-import com.yami.shop.bean.model.ShopProd;
-
-/**
- * 门店对应商品价格和库存管理
- */
-public interface ShopProdService extends IService<ShopProd> {
-
-    void insertProd(ShopProd shopProd);
-}

+ 13 - 0
yami-shop-service/src/main/java/com/yami/shop/service/ShopSkuService.java

@@ -0,0 +1,13 @@
+
+package com.yami.shop.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import com.yami.shop.bean.model.ShopSku;
+
+/**
+ * 门店对应商品价格和库存管理
+ */
+public interface ShopSkuService extends IService<ShopSku> {
+
+    void insertSku(ShopSku shopSku);
+}

+ 22 - 14
yami-shop-service/src/main/java/com/yami/shop/service/SkuService.java

@@ -17,24 +17,32 @@ import com.yami.shop.bean.model.Sku;
 import org.springframework.cache.annotation.CacheEvict;
 
 /**
- *
  * @author lgh on 2018/09/29.
  */
 public interface SkuService extends IService<Sku> {
 
-	/**
-	 * 根据商品id获取商品中的sku列表(将会被缓存起来)
-	 * @param prodId 商品id
-	 * @return sku列表
-	 */
-	List<Sku> listByProdId(Long prodId);
+    /**
+     * 根据商品id获取商品中的sku列表(将会被缓存起来)
+     *
+     * @param prodId 商品id
+     * @return sku列表
+     */
+    List<Sku> listByProdId(Long prodId, Integer platform, Long shopId);
+    /**
+     * 根据商品id获取商品中的sku列表(将会被缓存起来)
+     *
+     * @param prodId 商品id
+     * @return sku列表
+     */
+    List<Sku> listByProdId(Long prodId);
 
-	/**
-	 * 根据skuId获取sku信息(将会被缓存起来)
-	 * @param skuId
-	 * @return
-	 */
-	Sku getSkuBySkuId(Long skuId);
+    /**
+     * 根据skuId获取sku信息(将会被缓存起来)
+     *
+     * @param skuId
+     * @return
+     */
+    Sku getSkuBySkuId(Long skuId);
 
-	void removeSkuCacheBySkuId(Long skuId,Long prodId);
+    void removeSkuCacheBySkuId(Long skuId, Long prodId);
 }

+ 29 - 29
yami-shop-service/src/main/java/com/yami/shop/service/hb/IFrontCategoryService.java → yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBFrontCategoryService.java

@@ -1,29 +1,29 @@
-package com.yami.shop.service.hb;
-
-import com.alibaba.fastjson.JSONObject;
-import com.yami.shop.common.util.hb.HBR;
-
-/**
- * 前台类目管理服务接口
- *
- * @author fubojin
- * @version 1.0.0
- * @since 2025-09-4
- */
-public interface IFrontCategoryService {
-
-
-    /**
-     * 前台分类新增或者修改
-     *
-     * @param hbRequest 前台分类请求
-     * @return 前台分类响应
-     */
-    HBR addHBFrontCategory(JSONObject hbRequest);
-
-    /**
-     * 删除海博前台分类
-     * @param hbRequest
-     */
-    void deleteFrontCategory(JSONObject hbRequest);
-}
+package com.yami.shop.service.hb;
+
+import com.alibaba.fastjson.JSONObject;
+import com.yami.shop.common.util.hb.HBR;
+
+/**
+ * 前台类目管理服务接口
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-4
+ */
+public interface IHBFrontCategoryService {
+
+
+    /**
+     * 前台分类新增或者修改
+     *
+     * @param hbRequest 前台分类请求
+     * @return 前台分类响应
+     */
+    HBR addHBFrontCategory(JSONObject hbRequest);
+
+    /**
+     * 删除海博前台分类
+     * @param hbRequest
+     */
+    void deleteFrontCategory(JSONObject hbRequest);
+}

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/hb/IGoodsService.java → yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBGoodsService.java

@@ -13,7 +13,7 @@ import com.yami.shop.common.util.hb.HBR;
  * @version 1.0.0
  * @since 2025-09-5
  */
-public interface IGoodsService {
+public interface IHBGoodsService {
 
 
     /**

+ 1 - 1
yami-shop-service/src/main/java/com/yami/shop/service/hb/IOrderService.java → yami-shop-service/src/main/java/com/yami/shop/service/hb/IHBOrderService.java

@@ -10,7 +10,7 @@ import com.yami.shop.common.util.hb.HBR;
  * @version 1.0.0
  * @since 2025-09-5
  */
-public interface IOrderService {
+public interface IHBOrderService {
 
 
 

+ 27 - 0
yami-shop-service/src/main/java/com/yami/shop/service/hb/IStoreManagementService.java

@@ -1,7 +1,10 @@
 package com.yami.shop.service.hb;
 
 import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.dto.hb.StoreRegister;
+import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.hb.HBR;
 
 import java.util.List;
@@ -37,4 +40,28 @@ public interface IStoreManagementService {
      */
     HBR updateRegisterStore(JSONObject registerRequest);
 
+
+
+    /**
+     * 获取门店列表
+     *
+     * @return 门店列表
+     */
+    List<ShopDetail> list(ShopDetail shopDetail);
+
+    /**
+     * 获取门店详情
+     *
+     * @param id 门店ID
+     * @return 门店详情
+     */
+    ShopDetail detail(Long id);
+
+    /**
+     * 获取门店列表
+     * @param shopDetail 查询参数
+     * @param page 分页参数
+     * @return 门店列表
+     */
+    IPage<ShopDetail> page(ShopDetail shopDetail, PageParam<ShopDetail> page);
 }

+ 108 - 109
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/FrontCategoryService.java → yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBFrontCategoryService.java

@@ -1,109 +1,108 @@
-package com.yami.shop.service.hb.impl;
-
-import com.alibaba.fastjson.JSON;
-import com.alibaba.fastjson.JSONArray;
-import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.yami.shop.bean.dto.hb.HBBaseReq;
-import com.yami.shop.bean.model.FrontCategory;
-import com.yami.shop.common.util.hb.HBR;
-import com.yami.shop.dao.FrontCategoryMapper;
-import com.yami.shop.service.hb.IFrontCategoryService;
-import com.yami.shop.utils.HBSignUtil;
-import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.stereotype.Service;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.IntStream;
-
-import static com.yami.shop.common.util.HttpUtil.post;
-
-
-/**
- * 前台类目管理服务实现
- *
- * @author fubojin
- * @version 1.0.0
- * @since 2025-09-1
- */
-@Slf4j
-@Service
-@AllArgsConstructor
-@Transactional(readOnly = true)
-public class FrontCategoryService implements IFrontCategoryService {
-    private final FrontCategoryMapper frontCategoryMapper;
-    private final HBSignUtil hbSignUtil;
-
-
-    @Override
-    @Transactional
-    public HBR addHBFrontCategory(JSONObject hbRequest) {
-        try {
-            String bodyStr = hbRequest.getString("body");
-            log.info("开始前台分类,body:{}", bodyStr);
-            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
-            JSONArray codeList = bodyJson.getJSONArray("codeList");
-            List<String> resultList = IntStream.range(0, codeList.size())
-                    .mapToObj(codeList::getString)
-                    .collect(Collectors.toList());
-
-            String info = selectHBFrontCategory(resultList);
-            JSONObject jsonObject = JSON.parseObject(info);
-            JSONObject jsonObjectHB = jsonObject.getJSONObject("result");
-            JSONObject result = jsonObjectHB.getJSONObject("result");
-            JSONArray resultArray = result.getJSONArray("categoryInfos");
-            for (Object o : resultArray) {
-                JSONObject jsonObjectInfo = JSON.parseObject(o.toString());
-                // 2. 构建实体
-                FrontCategory frontCategory = new FrontCategory();
-                frontCategory.setCode(jsonObjectInfo.getString("code"));
-                frontCategory.setParentCode(jsonObjectInfo.getString("parentCode"));
-                frontCategory.setName(jsonObjectInfo.getString("name"));
-                frontCategory.setParentName(jsonObjectInfo.getString("parentName"));
-                frontCategory.setNum(jsonObjectInfo.getInteger("num"));
-                frontCategory.setLevel(jsonObjectInfo.getInteger("level"));
-                frontCategory.setOperateUser(jsonObjectInfo.getString("operateUser"));
-                frontCategory.setIsLeaves(jsonObjectInfo.getInteger("isLeaves"));
-                log.info("添加前台类目信息{}",frontCategory);
-                // 3. 保存门店信息
-                frontCategoryMapper.insert(frontCategory);
-            }
-            log.info("前台分类成功");
-            // 4. 构建响应
-            return HBR.success();
-        } catch (Exception e) {
-            log.error("前台分类失败:{}", e.getMessage(), e);
-            return HBR.error("未知异常");
-        }
-    }
-
-    public String selectHBFrontCategory(List<String> resultList) {
-        HBBaseReq<Object> build = HBBaseReq.create();
-        build.setAppId(hbSignUtil.getAppId());
-        JSONObject jsonObject = new JSONObject();
-        jsonObject.put("flag", 1);
-        jsonObject.put("codeList", resultList);
-        build.setBody(JSON.toJSONString(jsonObject));
-        build.setSign(hbSignUtil.signMd5(build));
-        String post = post(hbSignUtil.getHBHost() + "/api/product/frontCategory/getCategory", build);
-        log.info("post 请求参数:{}", JSON.toJSONString(build));
-        log.info("post 结果:{}", post);
-        return post;
-    }
-
-    @Override
-    public void deleteFrontCategory(JSONObject hbRequest) {
-        String bodyStr = hbRequest.getString("body");
-        JSONObject jsonObject = JSON.parseObject("bodyStr");
-        log.info("前台类目删除,body:{}", bodyStr);
-        List<FrontCategory> frontCategorys = frontCategoryMapper.selectList(new LambdaQueryWrapper<FrontCategory>().eq(FrontCategory::getCode,jsonObject.getLong("code")));
-        for (FrontCategory frontCategory : frontCategorys) {
-            frontCategory.setIsDelete(1);
-            frontCategoryMapper.updateById(frontCategory);
-        }
-    }
-}
+package com.yami.shop.service.hb.impl;
+
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.dto.hb.HBBaseReq;
+import com.yami.shop.bean.model.FrontCategory;
+import com.yami.shop.common.util.hb.HBR;
+import com.yami.shop.dao.FrontCategoryMapper;
+import com.yami.shop.service.hb.IHBFrontCategoryService;
+import com.yami.shop.utils.HBSignUtil;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
+
+import static com.yami.shop.common.util.HttpUtil.post;
+
+
+/**
+ * 前台类目管理服务实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class HBFrontCategoryService implements IHBFrontCategoryService {
+    private final FrontCategoryMapper frontCategoryMapper;
+    private final HBSignUtil hbSignUtil;
+
+
+    @Override
+    @Transactional
+    public HBR addHBFrontCategory(JSONObject hbRequest) {
+        try {
+            String bodyStr = hbRequest.getString("body");
+            log.info("开始前台分类,body:{}", bodyStr);
+            JSONObject bodyJson = JSON.parseObject(bodyStr); // 使用Fastjson的解析方法
+            JSONArray codeList = bodyJson.getJSONArray("codeList");
+            List<String> resultList = IntStream.range(0, codeList.size())
+                    .mapToObj(codeList::getString)
+                    .collect(Collectors.toList());
+
+            String info = selectHBFrontCategory(resultList);
+            JSONObject jsonObject = JSON.parseObject(info);
+            JSONObject jsonObjectHB = jsonObject.getJSONObject("result");
+            JSONObject result = jsonObjectHB.getJSONObject("result");
+            JSONArray resultArray = result.getJSONArray("categoryInfos");
+            for (Object o : resultArray) {
+                JSONObject jsonObjectInfo = JSON.parseObject(o.toString());
+                // 2. 构建实体
+                FrontCategory frontCategory = new FrontCategory();
+                frontCategory.setCode(jsonObjectInfo.getString("code"));
+                frontCategory.setParentCode(jsonObjectInfo.getString("parentCode"));
+                frontCategory.setName(jsonObjectInfo.getString("name"));
+                frontCategory.setParentName(jsonObjectInfo.getString("parentName"));
+                frontCategory.setNum(jsonObjectInfo.getInteger("num"));
+                frontCategory.setLevel(jsonObjectInfo.getInteger("level"));
+                frontCategory.setOperateUser(jsonObjectInfo.getString("operateUser"));
+                frontCategory.setIsLeaves(jsonObjectInfo.getInteger("isLeaves"));
+                log.info("添加前台类目信息{}",frontCategory);
+                // 3. 保存门店信息
+                frontCategoryMapper.insert(frontCategory);
+            }
+            log.info("前台分类成功");
+            // 4. 构建响应
+            return HBR.success();
+        } catch (Exception e) {
+            log.error("前台分类失败:{}", e.getMessage(), e);
+            return HBR.error("未知异常");
+        }
+    }
+
+    public String selectHBFrontCategory(List<String> resultList) {
+        HBBaseReq<Object> build = HBBaseReq.create();
+        build.setAppId(hbSignUtil.getAppId());
+        JSONObject jsonObject = new JSONObject();
+        jsonObject.put("flag", 1);
+        jsonObject.put("codeList", resultList);
+        build.setBody(JSON.toJSONString(jsonObject));
+        build.setSign(hbSignUtil.signMd5(build));
+        String post = post(hbSignUtil.getHBHost() + "/api/product/frontCategory/getCategory", build);
+        log.info("post 请求参数:{}", JSON.toJSONString(build));
+        log.info("post 结果:{}", post);
+        return post;
+    }
+
+    @Override
+    public void deleteFrontCategory(JSONObject hbRequest) {
+        String bodyStr = hbRequest.getString("body");
+        JSONObject jsonObject = JSON.parseObject("bodyStr");
+        log.info("前台类目删除,body:{}", bodyStr);
+        List<FrontCategory> frontCategorys = frontCategoryMapper.selectList(new LambdaQueryWrapper<FrontCategory>().eq(FrontCategory::getCode,jsonObject.getLong("code")));
+        for (FrontCategory frontCategory : frontCategorys) {
+            frontCategory.setIsDelete(1);
+            frontCategoryMapper.updateById(frontCategory);
+        }
+    }
+}

+ 29 - 30
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBGoodsService.java

@@ -4,18 +4,17 @@ import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yami.shop.bean.dto.hb.HBBaseReq;
 import com.yami.shop.bean.model.Product;
 import com.yami.shop.bean.model.ShopDetail;
-import com.yami.shop.bean.model.ShopProd;
+import com.yami.shop.bean.model.ShopSku;
 import com.yami.shop.bean.model.Sku;
 import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.dao.ProductMapper;
 import com.yami.shop.dao.ShopDetailMapper;
-import com.yami.shop.dao.ShopProdMapper;
+import com.yami.shop.dao.ShopSkuMapper;
 import com.yami.shop.dao.SkuMapper;
-import com.yami.shop.service.hb.IGoodsService;
+import com.yami.shop.service.hb.IHBGoodsService;
 import com.yami.shop.utils.HBSignUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -40,11 +39,11 @@ import static com.yami.shop.common.util.HttpUtil.post;
 @Slf4j
 @Service
 @AllArgsConstructor
-public class HBGoodsService implements IGoodsService {
+public class HBGoodsService implements IHBGoodsService {
     private final HBSignUtil hbSignUtil;
     private final ProductMapper productMapper;
     private final SkuMapper skuMapper;
-    private final ShopProdMapper shopProdMapper;
+    private final ShopSkuMapper shopProdMapper;
     private final ShopDetailMapper shopDetailMapper;
 
     @Override
@@ -203,20 +202,20 @@ public class HBGoodsService implements IGoodsService {
                     return HBR.error("更改价格系统找不到对应商品(单品):" + skuId);
                 }
 
-                ShopProd shopProd = shopProdMapper.selectByShopAndProd(sku.getSkuId(), shopDetail.getShopId());
-                if (ObjectUtil.isEmpty(shopProd)) {
-                    ShopProd shopProdInfo = new ShopProd();
-                    shopProdInfo.setShopId(shopDetail.getShopId());
-                    shopProdInfo.setShopProdPrice(currentPrice == null ? 0.0 : currentPrice);
-                    shopProdInfo.setSkuId(sku.getSkuId());
-                    shopProdInfo.setIsDelete(0);
-                    shopProdInfo.setRecTime(new Date());
-                    shopProdMapper.insert(shopProdInfo);
+                ShopSku shopSku = shopProdMapper.selectByShopAndProd(sku.getSkuId(), shopDetail.getShopId());
+                if (ObjectUtil.isEmpty(shopSku)) {
+                    ShopSku shopSkuInfo = new ShopSku();
+                    shopSkuInfo.setShopId(shopDetail.getShopId());
+                    shopSkuInfo.setShopSkuPrice(currentPrice == null ? 0.0 : currentPrice);
+                    shopSkuInfo.setSkuId(sku.getSkuId());
+                    shopSkuInfo.setIsDelete(0);
+                    shopSkuInfo.setRecTime(new Date());
+                    shopProdMapper.insert(shopSkuInfo);
                     log.info("门店对应商品系统不存在直接添加");
                 } else {
-                    shopProd.setShopProdPrice(currentPrice == null ? 0.0 : currentPrice);
-                    shopProd.setUpdateTime(new Date());
-                    shopProdMapper.updateById(shopProd);
+                    shopSku.setShopSkuPrice(currentPrice == null ? 0.0 : currentPrice);
+                    shopSku.setUpdateTime(new Date());
+                    shopProdMapper.updateById(shopSku);
                     log.info("库存更改成功");
                 }
             }
@@ -254,20 +253,20 @@ public class HBGoodsService implements IGoodsService {
                     return HBR.error("系统找不到对应商品(单品):" + skuId);
                 }
 
-                ShopProd shopProd = shopProdMapper.selectByShopAndProd(sku.getSkuId(), shopDetail.getShopId());
-                if (ObjectUtil.isEmpty(shopProd)) {
-                    ShopProd shopProdInfo = new ShopProd();
-                    shopProdInfo.setShopId(shopDetail.getShopId());
-                    shopProdInfo.setShopProdStocks(currentStock);
-                    shopProdInfo.setSkuId(sku.getSkuId());
-                    shopProdInfo.setIsDelete(0);
-                    shopProdInfo.setRecTime(new Date());
-                    shopProdMapper.insert(shopProdInfo);
+                ShopSku shopSku = shopProdMapper.selectByShopAndProd(sku.getSkuId(), shopDetail.getShopId());
+                if (ObjectUtil.isEmpty(shopSku)) {
+                    ShopSku shopSkuInfo = new ShopSku();
+                    shopSkuInfo.setShopId(shopDetail.getShopId());
+                    shopSkuInfo.setShopSkuStocks(currentStock);
+                    shopSkuInfo.setSkuId(sku.getSkuId());
+                    shopSkuInfo.setIsDelete(0);
+                    shopSkuInfo.setRecTime(new Date());
+                    shopProdMapper.insert(shopSkuInfo);
                     log.info("库存添加成功");
                 } else {
-                    shopProd.setShopProdStocks(currentStock);
-                    shopProd.setUpdateTime(new Date());
-                    shopProdMapper.updateById(shopProd);
+                    shopSku.setShopSkuStocks(currentStock);
+                    shopSku.setUpdateTime(new Date());
+                    shopProdMapper.updateById(shopSku);
                     log.info("库存更改成功");
                 }
             }

+ 2 - 5
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/HBOrderService.java

@@ -3,7 +3,6 @@ package com.yami.shop.service.hb.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
-import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.yami.shop.bean.dto.hb.HBBaseReq;
 import com.yami.shop.bean.model.Product;
 import com.yami.shop.bean.model.Sku;
@@ -11,8 +10,7 @@ import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.dao.OrderMapper;
 import com.yami.shop.dao.ProductMapper;
 import com.yami.shop.dao.SkuMapper;
-import com.yami.shop.service.hb.IGoodsService;
-import com.yami.shop.service.hb.IOrderService;
+import com.yami.shop.service.hb.IHBOrderService;
 import com.yami.shop.utils.HBSignUtil;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -20,7 +18,6 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.ArrayList;
-import java.util.Date;
 import java.util.List;
 
 import static com.yami.shop.common.util.HttpUtil.post;
@@ -37,7 +34,7 @@ import static com.yami.shop.common.util.HttpUtil.post;
 @Service
 @AllArgsConstructor
 @Transactional(readOnly = true)
-public class HBOrderService implements IOrderService {
+public class HBOrderService implements IHBOrderService {
     private final HBSignUtil hbSignUtil;
     private final OrderMapper orderMapper;
     private final ProductMapper productMapper;

+ 46 - 10
yami-shop-service/src/main/java/com/yami/shop/service/hb/impl/StoreManagementService.java

@@ -3,10 +3,12 @@ package com.yami.shop.service.hb.impl;
 import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.yami.shop.bean.dto.hb.HBBaseReq;
 import com.yami.shop.bean.dto.hb.HBStoreBaseInfoReq;
 import com.yami.shop.bean.dto.hb.StoreRegister;
 import com.yami.shop.bean.model.ShopDetail;
+import com.yami.shop.common.util.PageParam;
 import com.yami.shop.common.util.R;
 import com.yami.shop.common.util.hb.HBR;
 import com.yami.shop.dao.ShopDetailMapper;
@@ -18,6 +20,8 @@ import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.StringUtils;
 
+import java.util.List;
+
 import static com.yami.shop.common.util.HttpUtil.post;
 
 
@@ -48,9 +52,9 @@ public class StoreManagementService implements IStoreManagementService {
                 .build();
         build.setBody(JSON.toJSONString(hbStoreBaseInfoReq));
         build.setSign(hbSignUtil.signMd5(build));
-        String post = post(hbSignUtil.getHBHost()+"/api/station/get", build);
+        String post = post(hbSignUtil.getHBHost() + "/api/station/get", build);
         log.info("post 请求参数:{}", JSON.toJSONString(build));
-        log.info("post 结果:{}",  post);
+        log.info("post 结果:{}", post);
         return post;
     }
 
@@ -62,9 +66,9 @@ public class StoreManagementService implements IStoreManagementService {
         jsonObject.put("deliveryFeeTemplateId", 5);
         build.setBody(JSON.toJSONString(jsonObject));
         build.setSign(hbSignUtil.signMd5(build));
-        String post = post(hbSignUtil.getHBHost()+"/api/base/deliveryFee/template", build);
+        String post = post(hbSignUtil.getHBHost() + "/api/base/deliveryFee/template", build);
         log.info("post 请求参数:{}", JSON.toJSONString(build));
-        log.info("post 结果:{}",  post);
+        log.info("post 结果:{}", post);
     }
 
 
@@ -116,8 +120,8 @@ public class StoreManagementService implements IStoreManagementService {
 
             String hb = doGetStation(outStationNo);
             ShopDetail shopDetail = shopDetailMapper.selectByOutStationNo(outStationNo);
-            if (shopDetail!=null) {
-                log.info("门店已存在{}",outStationNo);
+            if (shopDetail != null) {
+                log.info("门店已存在{}", outStationNo);
                 return HBR.success();
             }
             JSONObject goodsInfoJson = JSON.parseObject(hb);
@@ -132,12 +136,12 @@ public class StoreManagementService implements IStoreManagementService {
             shopDetailInfo.setCity(resultData.getString("city"));
             shopDetailInfo.setArea(resultData.getString("district"));
             shopDetailInfo.setShopOwner(resultData.getString("contacts"));
-            shopDetailInfo.setShopLat(resultData.getString("longitude"));//门店经度
-            shopDetailInfo.setShopLng(resultData.getString("latitude"));//门店纬度
-            shopDetailInfo.setThirdPartyCode(resultData.getString("stationId"));//海博门店编码
+            shopDetailInfo.setShopLat(resultData.getString("longitude"));
+            shopDetailInfo.setShopLng(resultData.getString("latitude"));
+            shopDetailInfo.setThirdPartyCode(resultData.getString("stationId"));
+            shopDetailInfo.setHbStationId(resultData.getString("stationId"));//海博门店编码
             shopDetailInfo.setOutStationNo(resultData.getString("outStationNo"));//商家门店编码
             shopDetailMapper.insert(shopDetailInfo);
-
             return HBR.success();
         } catch (Exception e) {
             log.error("门店变更失败:{}", e.getMessage(), e);
@@ -146,4 +150,36 @@ public class StoreManagementService implements IStoreManagementService {
     }
 
 
+    @Override
+    public List<ShopDetail> list(ShopDetail shopDetail) {
+        List<ShopDetail> list = shopDetailMapper.selectList(new LambdaQueryWrapper<ShopDetail>()
+                .eq(shopDetail.getThirdPartyCode() != null, ShopDetail::getThirdPartyCode, shopDetail.getThirdPartyCode())
+                .eq(shopDetail.getOutStationNo() != null, ShopDetail::getOutStationNo, shopDetail.getOutStationNo())
+                .eq(shopDetail.getCategory() != null, ShopDetail::getCategory, shopDetail.getCategory())
+                .eq(shopDetail.getShopAddress() != null, ShopDetail::getShopAddress, shopDetail.getShopAddress())
+                .like(shopDetail.getShopName() != null, ShopDetail::getShopName, shopDetail.getShopName()));
+        return list;
+    }
+
+    @Override
+    public ShopDetail detail(Long id) {
+        return shopDetailMapper.selectById(id);
+    }
+
+    @Override
+    public IPage<ShopDetail> page(ShopDetail shopDetail, PageParam<ShopDetail> page) {
+        return shopDetailMapper.selectPage(page, new LambdaQueryWrapper<ShopDetail>()
+                .like(shopDetail.getShopName() != null, ShopDetail::getShopName, shopDetail.getShopName())
+                .like(shopDetail.getOutStationNo() != null, ShopDetail::getOutStationNo, shopDetail.getOutStationNo())
+                .like(shopDetail.getCategory() != null, ShopDetail::getCategory, shopDetail.getCategory())
+                .like(shopDetail.getShopAddress() != null, ShopDetail::getShopAddress, shopDetail.getShopAddress())
+                .like(shopDetail.getThirdPartyCode() != null, ShopDetail::getThirdPartyCode, shopDetail.getThirdPartyCode())
+                .like(shopDetail.getShopOwner() != null, ShopDetail::getShopOwner, shopDetail.getShopOwner())
+                .like(shopDetail.getMobile() != null, ShopDetail::getMobile, shopDetail.getMobile())
+                .like(shopDetail.getTel() != null, ShopDetail::getTel, shopDetail.getTel())
+                .eq(shopDetail.getShopLogo() != null, ShopDetail::getShopLogo, shopDetail.getShopLogo())
+                .eq(shopDetail.getShopStatus() != null, ShopDetail::getShopStatus, shopDetail.getShopStatus())
+                .eq(shopDetail.getHbStationId() != null, ShopDetail::getHbStationId, shopDetail.getHbStationId())
+        );
+    }
 }

+ 2 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/AttachFileServiceImpl.java

@@ -106,6 +106,8 @@ public class AttachFileServiceImpl extends ServiceImpl<AttachFileMapper, AttachF
 			try {
 				InputStream input = new ByteArrayInputStream(bytes);
 				ossClient.putObject(new PutObjectRequest(aliOss.getBucketName(), filePath, input));
+				String url = "https://" + aliOss.getBucketName() + "." + aliOss.getEndpoint() + "/" + filePath;
+				System.out.println("AliOSS upload success, URL: " + url);
 			} catch (Exception e) {
 				e.printStackTrace();
 				System.err.println(e.getMessage());

+ 22 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryProdServiceImpl.java

@@ -0,0 +1,22 @@
+
+package com.yami.shop.service.impl;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.yami.shop.bean.model.CategoryProd;
+import com.yami.shop.dao.CategoryProdMapper;
+import com.yami.shop.service.CategoryProdService;
+
+/**
+ *
+ * Created by lgh on 2018/07/13.
+ */
+@Service
+public class CategoryProdServiceImpl extends ServiceImpl<CategoryProdMapper, CategoryProd> implements CategoryProdService {
+
+    @Autowired
+    private CategoryProdMapper categoryPropMapper;
+
+}

+ 0 - 31
yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryPropServiceImpl.java

@@ -1,31 +0,0 @@
-/*
- * Copyright (c) 2018-2999 广州亚米信息科技有限公司 All rights reserved.
- *
- * https://www.gz-yami.com/
- *
- * 未经允许,不可做商业用途!
- *
- * 版权所有,侵权必究!
- */
-
-package com.yami.shop.service.impl;
-
-import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
-
-import com.yami.shop.bean.model.CategoryProp;
-import com.yami.shop.dao.CategoryPropMapper;
-import com.yami.shop.service.CategoryPropService;
-
-/**
- *
- * Created by lgh on 2018/07/13.
- */
-@Service
-public class CategoryPropServiceImpl extends ServiceImpl<CategoryPropMapper, CategoryProp> implements CategoryPropService {
-
-    @Autowired
-    private CategoryPropMapper categoryPropMapper;
-
-}

+ 3 - 11
yami-shop-service/src/main/java/com/yami/shop/service/impl/CategoryServiceImpl.java

@@ -15,7 +15,6 @@ import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.collection.CollectionUtil;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
-import com.baomidou.mybatisplus.core.toolkit.Wrappers;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.google.common.collect.Lists;
@@ -25,20 +24,16 @@ import com.yami.shop.bean.param.CategoryScoreConfigParam;
 import com.yami.shop.bean.param.ScoreConfigParam;
 import com.yami.shop.bean.vo.ListCategoryForUserVO;
 import com.yami.shop.bean.vo.ListCategoryVO;
-import com.yami.shop.common.bean.Qiniu;
 import com.yami.shop.common.config.Constant;
 import com.yami.shop.common.exception.GlobalException;
-import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.config.ShopConfig;
 import com.yami.shop.dao.CategoryBrandMapper;
 import com.yami.shop.dao.CategoryMapper;
-import com.yami.shop.dao.CategoryPropMapper;
+import com.yami.shop.dao.CategoryProdMapper;
 import com.yami.shop.dao.ProductMapper;
 import com.yami.shop.service.CategoryService;
-import com.yami.shop.service.ProductService;
 import com.yami.shop.service.SysConfigService;
 import lombok.AllArgsConstructor;
-import org.apache.commons.collections.CollectionUtils;
 import org.apache.poi.ss.usermodel.*;
 import org.springframework.beans.BeanUtils;
 import org.springframework.cache.annotation.CacheEvict;
@@ -65,7 +60,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
 
 	private final CategoryBrandMapper categoryBrandMapper;
 
-	private final CategoryPropMapper categoryPropMapper;
+	private final CategoryProdMapper categoryPropMapper;
 
 	private final ProductMapper productMapper;
 
@@ -434,10 +429,7 @@ public class CategoryServiceImpl extends ServiceImpl<CategoryMapper, Category> i
 			categoryBrandMapper.insertCategoryBrand(category.getCategoryId(), category.getBrandIds());
 		}
 
-		//保存分类与参数信息
-		if(CollUtil.isNotEmpty(category.getAttributeIds())){
-			categoryPropMapper.insertCategoryProp(category.getCategoryId(), category.getAttributeIds());
-		}
+
 	}
 
 	/**

+ 38 - 22
yami-shop-service/src/main/java/com/yami/shop/service/impl/ChannelProdServiceImpl.java

@@ -3,21 +3,19 @@ package com.yami.shop.service.impl;
 
 import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
+import com.alipay.api.domain.Shop;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.yami.shop.bean.model.Channel;
-import com.yami.shop.bean.model.ChannelProd;
-import com.yami.shop.bean.model.Sku;
+import com.yami.shop.bean.model.*;
 import com.yami.shop.bean.vo.ChannelProdExportVO;
 import com.yami.shop.bean.vo.ChannelProdImportVO;
 import com.yami.shop.common.exception.GlobalException;
 import com.yami.shop.common.exception.YamiShopBindException;
 import com.yami.shop.common.util.PageParam;
-import com.yami.shop.dao.ChannelMapper;
-import com.yami.shop.dao.ChannelProdMapper;
-import com.yami.shop.dao.SkuMapper;
+import com.yami.shop.common.util.SpringContextUtils;
+import com.yami.shop.dao.*;
 import com.yami.shop.service.ChannelProdService;
 import lombok.AllArgsConstructor;
 import lombok.extern.slf4j.Slf4j;
@@ -46,6 +44,8 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
 
     private final ChannelProdMapper channelProdMapper;
     private final ChannelMapper channelMapper;
+    private final ShopDetailMapper shopDetailMapper;
+    private final ChannelShopMapper channelShopMapper;
     private final SkuMapper skuMapper;
 
     @Override
@@ -205,18 +205,10 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
 //
 //        // 创建模板数据(示例数据)
             List<ChannelProdImportVO> templateData = new ArrayList<>();
-//        ChannelProdImportVO example = new ChannelProdImportVO();
-//        example.setchannelId(1001L);
-//        example.setSkuId(2001L);
-//        example.setPurchasePrice(new BigDecimal("50.00"));
-//        example.setDeliveryPrice(new BigDecimal("60.00"));
-//        example.setchannelProdPrice(new BigDecimal("99.99"));
-//        example.setRemark("示例数据,请删除后填写实际数据");
-//        templateData.add(example);
 
             // 写入Excel
             EasyExcel.write(response.getOutputStream(), ChannelProdImportVO.class)
-                    .sheet("渠道商品导入模板")
+                    .sheet("商品渠道及价格导入模板")
                     .doWrite(templateData);
         } catch (Exception e) {
             e.printStackTrace();
@@ -249,6 +241,9 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 if (importVO.getSkuId() == null) {
                     throw new RuntimeException("海博商品ID不能为空");
                 }
+                if (importVO.getShopName() == null) {
+                    throw new RuntimeException("海博门店不能为空");
+                }
                 if (importVO.getChannelProdPrice() == null || importVO.getChannelProdPrice().compareTo(BigDecimal.ZERO) < 0) {
                     throw new RuntimeException("渠道售价不能为空且必须大于等于0");
                 }
@@ -256,7 +251,6 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
                 // 转换为实体对象
                 ChannelProd channelProd = new ChannelProd();
                 Channel channel = channelMapper.selectByName(importVO.getChannelName());
-
                 if (ObjectUtil.isEmpty(channel)) {
                     log.error("渠道:{},在系统中不存在", importVO.getChannelName());
                     throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 渠道=%s,在系统中不存在", i + 1, importVO.getChannelName()));
@@ -278,14 +272,36 @@ public class ChannelProdServiceImpl extends ServiceImpl<ChannelProdMapper, Chann
 
                 // 检查是否已存在
                 int count = channelProdMapper.selectCount(
-                        new LambdaQueryWrapper<ChannelProd>().eq(ChannelProd::getChannelId,channel.getId())
-                        .eq(ChannelProd::getSkuId,sku.getSkuId()));
+                        new LambdaQueryWrapper<ChannelProd>().eq(ChannelProd::getChannelId, channel.getId())
+                                .eq(ChannelProd::getSkuId, sku.getSkuId()));
                 if (count > 0) {
-                    log.error("渠道:{},在系统中已存在商品ID:{}",  importVO.getChannelName(),importVO.getSkuId());
+                    log.error("渠道:{},在系统中已存在商品ID:{}", importVO.getChannelName(), importVO.getSkuId());
                     throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 渠道=%s,在系统中已存在 商品ID=%s", i + 1, importVO.getChannelName(), importVO.getSkuId()));
-                } else {
-                    // 新增操作
-                    channelProdMapper.insert(channelProd);
+                }
+
+                //检查门店是否存在
+                ShopDetail shopDetail = shopDetailMapper.selectOne(new LambdaQueryWrapper<ShopDetail>().eq(ShopDetail::getShopName, importVO.getShopName()));
+                if (ObjectUtil.isEmpty(shopDetail)) {
+                    log.error("门店:{},在系统中不存在", importVO.getShopName());
+                    throw new GlobalException(String.format("第%d行数据导入失败! 失败原因: 门店=%s,在系统中不存在", i + 1, importVO.getShopName()));
+                }
+
+                // 新增操作
+                channelProdMapper.insert(channelProd);
+                log.info("添加渠道门店商品数据成功");
+                //添加渠道门店关联数据
+                //检查门店是否已存在
+                int channelShopCount = channelShopMapper.selectCount(new LambdaQueryWrapper<ChannelShop>()
+                        .eq(ChannelShop::getShopId, shopDetail.getShopId())
+                        .eq(ChannelShop::getIsDelete, 0)
+                        .eq(ChannelShop::getChannelId, channelProd.getChannelId()));
+                if (channelShopCount == 0) {
+                    ChannelShop channelShop = new ChannelShop();
+                    channelShop.setIsDelete(0);
+                    channelShop.setChannelId(channelProd.getId());
+                    channelShop.setShopId(shopDetail.getShopId());
+                    channelShopMapper.insert(channelShop);
+                    log.info("添加渠道门店关联数据成功");
                 }
                 successCount++;
             } catch (Exception e) {

+ 7 - 6
yami-shop-service/src/main/java/com/yami/shop/service/impl/DeptServiceImpl.java

@@ -1,5 +1,7 @@
 package com.yami.shop.service.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.yami.shop.bean.model.Dept;
 import com.yami.shop.dao.DeptMapper;
@@ -8,8 +10,7 @@ import lombok.AllArgsConstructor;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 
-import java.util.Date;
-import java.util.List;
+import java.util.*;
 import java.util.stream.Collectors;
 
 /**
@@ -26,9 +27,7 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements De
     @Override
     public List<Dept> listAllDept() {
         // 获取所有未删除的部门数据
-        List<Dept> allDepts = list(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper<Dept>()
-                .eq(Dept::getIsDelete, 0));
-
+        List<Dept> allDepts = deptMapper.selectListAll();
         // 构建树形结构
         return buildDeptTree(allDepts, 0L);
     }
@@ -85,7 +84,9 @@ public class DeptServiceImpl extends ServiceImpl<DeptMapper, Dept> implements De
     }
 
     @Override
-    public List<Dept> listDeptsByUserId(String userId) {
+    public List<Dept> listDeptsByUserId(Long userId) {
         return deptMapper.selectDeptsByUserId(userId);
     }
+
+
 }

+ 5 - 5
yami-shop-service/src/main/java/com/yami/shop/service/impl/DeptUserServiceImpl.java

@@ -24,7 +24,7 @@ public class DeptUserServiceImpl extends ServiceImpl<DeptUserMapper, DeptUser> i
     private final DeptUserMapper deptUserMapper;
 
     @Override
-    public List<DeptUser> listByUserId(String userId) {
+    public List<DeptUser> listByUserId(Long userId) {
         return deptUserMapper.selectByUserId(userId);
     }
 
@@ -35,7 +35,7 @@ public class DeptUserServiceImpl extends ServiceImpl<DeptUserMapper, DeptUser> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveUserDept(String userId, List<Long> deptIds) {
+    public boolean saveUserDept(Long userId, List<Long> deptIds) {
         // 先删除用户原有的部门关联
         deptUserMapper.deleteByUserId(userId);
         // 添加新的部门关联
@@ -57,7 +57,7 @@ public class DeptUserServiceImpl extends ServiceImpl<DeptUserMapper, DeptUser> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean deleteByUserId(String userId) {
+    public boolean deleteByUserId(Long userId) {
         return deptUserMapper.deleteByUserId(userId) >= 0;
     }
 
@@ -69,7 +69,7 @@ public class DeptUserServiceImpl extends ServiceImpl<DeptUserMapper, DeptUser> i
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public boolean saveBatchUserDepts(List<String> userIds, Long deptId) {
+    public boolean saveBatchUserDepts(List<Long> userIds, Long deptId) {
         if (userIds == null || userIds.isEmpty() || deptId == null) {
             return false;
         }
@@ -79,7 +79,7 @@ public class DeptUserServiceImpl extends ServiceImpl<DeptUserMapper, DeptUser> i
 
         List<DeptUser> deptUsers = new ArrayList<>();
         Date now = new Date();
-        for (String userId : userIds) {
+        for (Long userId : userIds) {
             DeptUser deptUser = new DeptUser();
             deptUser.setUserId(userId);
             deptUser.setDeptId(deptId);

+ 30 - 0
yami-shop-service/src/main/java/com/yami/shop/service/impl/FrontCategoryService.java

@@ -0,0 +1,30 @@
+package com.yami.shop.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.yami.shop.bean.model.FrontCategory;
+import com.yami.shop.dao.FrontCategoryMapper;
+import com.yami.shop.service.IFrontCategoryService;
+import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+
+
+/**
+ * 前台类目管理服务实现
+ *
+ * @author fubojin
+ * @version 1.0.0
+ * @since 2025-09-1
+ */
+@Slf4j
+@Service
+@AllArgsConstructor
+@Transactional(readOnly = true)
+public class FrontCategoryService implements IFrontCategoryService {
+    private final FrontCategoryMapper frontCategoryMapper;
+
+}

部分文件因文件數量過多而無法顯示