Browse Source

Merge remote-tracking branch 'origin/master'

Ben 11 months ago
parent
commit
e3ebc3536f
48 changed files with 770 additions and 65 deletions
  1. 11 0
      feifan-module-mall/feifan-module-product-biz/pom.xml
  2. 4 4
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/comment/ProductCommentController.java
  3. 0 1
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java
  4. 3 3
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/ProductSpuController.java
  5. 0 1
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuSaveReqVO.java
  6. 23 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ShopBO.java
  7. 6 1
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/spu/ProductSpuDO.java
  8. 25 0
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java
  9. 2 2
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuService.java
  10. 55 19
      feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java
  11. 6 0
      feifan-module-mall/feifan-module-trade-biz/pom.xml
  12. 18 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/aftersale/AfterSaleController.java
  13. 3 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java
  14. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/delivery/vo/expresstemplate/ShopBO.java
  15. 7 8
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java
  16. 23 6
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderDetailController.java
  17. 2 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/convert/aftersale/AfterSaleConvert.java
  18. 8 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/aftersale/AfterSaleDO.java
  19. 8 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java
  20. 6 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java
  21. 7 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/aftersale/AfterSaleMapper.java
  22. 9 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java
  23. 22 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleService.java
  24. 63 3
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java
  25. 0 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressTemplateService.java
  26. 50 2
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java
  27. 7 0
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java
  28. 33 1
      feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java
  29. 1 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/wallet/PayWalletServiceImpl.java
  30. 2 0
      feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/wallet/PayWalletTransactionServiceImpl.java
  31. 1 0
      feifan-module-sale/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/enums/ErrorCodeConstants.java
  32. 1 2
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java
  33. 9 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopPageReqVO.java
  34. 12 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopRespVO.java
  35. 7 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopSaveReqVO.java
  36. 12 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/dataobject/shop/ShopDO.java
  37. 1 1
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java
  38. 6 0
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java
  39. 15 2
      feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java
  40. 1 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/auth/AuthController.java
  41. 2 2
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/permission/PermissionController.java
  42. 3 1
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/permission/RoleController.java
  43. 9 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/user/UserProfileController.java
  44. 3 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/user/AdminUserDO.java
  45. 1 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserService.java
  46. 5 0
      feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserServiceImpl.java
  47. 1 1
      feifan-server/src/main/resources/application-local.yaml
  48. 268 0
      feifan-server/src/main/resources/application-prod.yaml

+ 11 - 0
feifan-module-mall/feifan-module-product-biz/pom.xml

@@ -66,6 +66,17 @@
             <groupId>cn.newfeifan.zx</groupId>
             <artifactId>feifan-spring-boot-starter-excel</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-spring-boot-starter-redis</artifactId>
+        </dependency>
+
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-system-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
     </dependencies>
 
 </project>

+ 4 - 4
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/comment/ProductCommentController.java

@@ -27,16 +27,16 @@ public class ProductCommentController {
     @Resource
     private ProductCommentService productCommentService;
 
-    @GetMapping("/page")
-    @Operation(summary = "获得商品评价分页")
-    @PreAuthorize("@ss.hasPermission('product:comment:query')")
+    @GetMapping("/page_spu")
+    @Operation(summary = "获得商品评价 - 商品")
+    @PreAuthorize("@ss.hasPermission('product:comment:query-sh')")
     public CommonResult<PageResult<ProductCommentRespVO>> getCommentPage(@Valid ProductCommentPageReqVO pageVO) {
         PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO);
         return success(BeanUtils.toBean(pageResult, ProductCommentRespVO.class));
     }
     @GetMapping("/page_order_id")
     @Operation(summary = "新增接口20240229-获得商品评价分页 传输orderId即可")
-    @PreAuthorize("@ss.hasPermission('product:comment:query')")
+    @PreAuthorize("@ss.hasPermission('product:comment:query-sh')")
     public CommonResult<PageResult<ProductCommentRespVO>> getCommentPageByOrderId(@Valid ProductCommentPageReqVO pageVO) {
         PageResult<ProductCommentDO> pageResult = productCommentService.getCommentPage(pageVO);
         return success(BeanUtils.toBean(pageResult, ProductCommentRespVO.class));

+ 0 - 1
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/comment/vo/ProductCommentPageReqVO.java

@@ -24,7 +24,6 @@ public class ProductCommentPageReqVO extends PageParam {
     private String userNickname;
 
     @Schema(description = "交易订单编号", example = "24428")
-    @NotNull
     private Long orderId;
 
     @Schema(description = "商品SPU编号", example = "29502")

+ 3 - 3
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/ProductSpuController.java

@@ -125,10 +125,10 @@ public class ProductSpuController {
     }
 
     @GetMapping("/get-count-by-mer")
-    @Operation(summary = "获得商品 SPU 分页 tab count")
+    @Operation(summary = "获得商品 SPU 分页 tab count - 通过店铺商户查询")
     @PreAuthorize("@ss.hasPermission('product:spu:query')")
-    public CommonResult<Map<Integer, Long>> getSpuCountByMer(@RequestParam("merId") Long merId) {
-        return success(productSpuService.getTabsCount(merId));
+    public CommonResult<Map<Integer, Long>> getSpuCountByMer() {
+        return success(productSpuService.getTabsCountByMer());
     }
 
 

+ 0 - 1
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ProductSpuSaveReqVO.java

@@ -36,7 +36,6 @@ public class ProductSpuSaveReqVO {
     private Long categoryId;
 
     @Schema(description = "商品品牌编号", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
-    @NotNull(message = "商品品牌不能为空")
     private Long brandId;
 
     @Schema(description = "商品封面图", requiredMode = Schema.RequiredMode.REQUIRED, example = "https://www.zhongxing.cn/xx.png")

+ 23 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/controller/admin/spu/vo/ShopBO.java

@@ -0,0 +1,23 @@
+package cn.newfeifan.mall.module.product.controller.admin.spu.vo;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+import lombok.NoArgsConstructor;
+
+/**
+ * 商户、店铺 BO
+ */
+
+@Data
+@AllArgsConstructor
+@NoArgsConstructor
+public class ShopBO {
+    /**
+     * 店铺id
+     */
+    private Long shopId;
+    /**
+     * 商户id
+     */
+    private Long merId;
+}

+ 6 - 1
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/dataobject/spu/ProductSpuDO.java

@@ -177,8 +177,13 @@ public class ProductSpuDO extends BaseDO {
      */
     private Integer spuType;
 
-
+    /**
+     * 店铺编号
+     */
     private Long shopId;
+    /**
+     * 商户编号
+     */
     private Long merchantId;
 
 

+ 25 - 0
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/dal/mysql/spu/ProductSpuMapper.java

@@ -9,7 +9,9 @@ import cn.newfeifan.mall.module.product.controller.app.spu.vo.AppProductSpuPageR
 import cn.newfeifan.mall.module.product.dal.dataobject.spu.ProductSpuDO;
 import cn.newfeifan.mall.module.product.enums.ProductConstants;
 import cn.newfeifan.mall.module.product.enums.spu.ProductSpuStatusEnum;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.support.SFunction;
 import org.apache.ibatis.annotations.Mapper;
 
 import java.util.Objects;
@@ -51,6 +53,29 @@ public interface ProductSpuMapper extends BaseMapperX<ProductSpuDO> {
         return selectCount(queryWrapper);
     }
 
+    default Long selectCount(SFunction<ProductSpuDO, ?> field, Object value,Long merId,Long shopId){
+        return selectCount(new LambdaQueryWrapperX<ProductSpuDO>()
+                .eq(field, value)
+                .eqIfPresent(ProductSpuDO::getMerchantId, merId)
+                .eqIfPresent(ProductSpuDO::getShopId, shopId));
+    }
+
+    /**
+     * 查询触发警戒库存的 SPU 数量ByShopId and merId
+     * @param merId 商户ID
+     * @param shopId 店铺ID
+     * @return 触发警戒库存的 SPU 数量
+     */
+    default Long selectCount(Long merId,Long shopId) {
+        return selectCount(new LambdaQueryWrapperX<ProductSpuDO>()
+                .eqIfPresent(ProductSpuDO::getMerchantId, merId)
+                .eqIfPresent(ProductSpuDO::getShopId, shopId)
+                // 库存小于等于警戒库存
+                .le(ProductSpuDO::getStock, ProductConstants.ALERT_STOCK)
+                // 如果库存触发警戒库存且状态为回收站的话则不计入触发警戒库存的个数
+                .notIn(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()));
+    }
+
     /**
      * 获得商品 SPU 分页,提供给用户 App 使用
      */

+ 2 - 2
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuService.java

@@ -105,11 +105,11 @@ public interface ProductSpuService {
 
 
     /**
-     * 获取 SPU 列表标签对应的 Count 数量
+     * 根据商户获取 SPU 列表标签对应的 Count 数量
      *
      * @return Count 数量
      */
-    Map<Integer, Long> getTabsCount(Long merId);
+    Map<Integer, Long> getTabsCountByMer();
 
 
     /**

+ 55 - 19
feifan-module-mall/feifan-module-product-biz/src/main/java/cn/newfeifan/mall/module/product/service/spu/ProductSpuServiceImpl.java

@@ -7,20 +7,22 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.collection.CollectionUtils;
 import cn.newfeifan.mall.framework.common.util.object.BeanUtils;
 import cn.newfeifan.mall.module.product.controller.admin.category.vo.ProductCategoryListReqVO;
-import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSkuSaveReqVO;
-import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuPageReqVO;
-import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuSaveReqVO;
-import cn.newfeifan.mall.module.product.controller.admin.spu.vo.ProductSpuUpdateStatusReqVO;
+import cn.newfeifan.mall.module.product.controller.admin.spu.vo.*;
 import cn.newfeifan.mall.module.product.controller.app.spu.vo.AppProductSpuPageReqVO;
 import cn.newfeifan.mall.module.product.dal.dataobject.category.ProductCategoryDO;
 import cn.newfeifan.mall.module.product.dal.dataobject.spu.ProductSpuDO;
 import cn.newfeifan.mall.module.product.dal.mysql.spu.ProductSpuMapper;
 import cn.newfeifan.mall.module.product.enums.spu.ProductSpuStatusEnum;
-import cn.newfeifan.mall.module.product.service.brand.ProductBrandService;
 import cn.newfeifan.mall.module.product.service.category.ProductCategoryService;
 import cn.newfeifan.mall.module.product.service.sku.ProductSkuService;
+import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import com.alibaba.fastjson.JSONObject;
 import com.google.common.collect.Maps;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -30,6 +32,7 @@ import java.util.*;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.product.dal.dataobject.category.ProductCategoryDO.CATEGORY_LEVEL;
 import static cn.newfeifan.mall.module.product.enums.ErrorCodeConstants.*;
 
@@ -40,6 +43,7 @@ import static cn.newfeifan.mall.module.product.enums.ErrorCodeConstants.*;
  */
 @Service
 @Validated
+@Slf4j
 public class ProductSpuServiceImpl implements ProductSpuService {
 
     @Resource
@@ -49,22 +53,21 @@ public class ProductSpuServiceImpl implements ProductSpuService {
     @Lazy // 循环依赖,避免报错
     private ProductSkuService productSkuService;
     @Resource
-    private ProductBrandService brandService;
-    @Resource
     private ProductCategoryService categoryService;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+    @Resource
+    private AdminUserMapper userMapper;
 
     @Override
     @Transactional(rollbackFor = Exception.class)
     public Long createSpu(ProductSpuSaveReqVO createReqVO) {
         // 校验分类、品牌
         validateCategory(createReqVO.getCategoryId());
-        brandService.validateProductBrand(createReqVO.getBrandId());
+//        brandService.validateProductBrand(createReqVO.getBrandId());
 
         // 根据商户ID查询对应的店铺ID
-        // todo 后续如果存在多店铺的情况下
-
-
-
+        // todo 后续如果存在多店铺的情况
 
 
         // 校验 SKU
@@ -74,6 +77,17 @@ public class ProductSpuServiceImpl implements ProductSpuService {
         ProductSpuDO spu = BeanUtils.toBean(createReqVO, ProductSpuDO.class);
         // 初始化 SPU 中 SKU 相关属性
         initSpuFromSkus(spu, skuSaveReqList);
+
+        //加入商户、店铺信息
+        ShopBO shop = getShop();
+        spu.setShopId(shop.getShopId());
+        spu.setMerchantId(shop.getMerId());
+
+        for (ProductSkuSaveReqVO productSkuSaveReqVO : skuSaveReqList) {
+            productSkuSaveReqVO.setShopId(shop.getShopId());
+            productSkuSaveReqVO.setMerchantId(shop.getMerId());
+        }
+
         // 插入 SPU
         productSpuMapper.insert(spu);
         // 插入 SKU
@@ -82,6 +96,22 @@ public class ProductSpuServiceImpl implements ProductSpuService {
         return spu.getId();
     }
 
+    private ShopBO getShop() {
+        Long loginUserId = getLoginUserId();
+        String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);
+        if (StringUtils.isEmpty(s)) {
+            AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+            ShopBO shop = new ShopBO();
+            shop.setShopId(adminUserDO.getShopId());
+            shop.setMerId(adminUserDO.getMerchantId());
+            log.info("====shop:{}",shop);
+            return shop;
+        } else {
+            log.info("====shop:{}",s);
+            return JSONObject.parseObject(s, ShopBO.class);
+        }
+    }
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateSpu(ProductSpuSaveReqVO updateReqVO) {
@@ -89,7 +119,7 @@ public class ProductSpuServiceImpl implements ProductSpuService {
         validateSpuExists(updateReqVO.getId());
         // 校验分类、品牌
         validateCategory(updateReqVO.getCategoryId());
-        brandService.validateProductBrand(updateReqVO.getBrandId());
+//        brandService.validateProductBrand(updateReqVO.getBrandId());
         // 校验SKU
         List<ProductSkuSaveReqVO> skuSaveReqList = updateReqVO.getSkus();
         productSkuService.validateSkuList(skuSaveReqList, updateReqVO.getSpecType());
@@ -210,6 +240,9 @@ public class ProductSpuServiceImpl implements ProductSpuService {
 
     @Override
     public PageResult<ProductSpuDO> getSpuPage(ProductSpuPageReqVO pageReqVO) {
+        ShopBO shop = getShop();
+        pageReqVO.setShopId(shop.getShopId());
+        pageReqVO.setMerchantId(shop.getMerId());
         return productSpuMapper.selectPage(pageReqVO);
     }
 
@@ -273,23 +306,26 @@ public class ProductSpuServiceImpl implements ProductSpuService {
     }
 
     @Override
-    public Map<Integer, Long> getTabsCount(Long merId) {
+    public Map<Integer, Long> getTabsCountByMer() {
         Map<Integer, Long> counts = Maps.newLinkedHashMapWithExpectedSize(5);
+
+        ShopBO shop = getShop();
+
         // 查询销售中的商品数量
         counts.put(ProductSpuPageReqVO.FOR_SALE,
-                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus()));
+                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.ENABLE.getStatus(), shop.getMerId(),shop.getShopId()));
         // 查询仓库中的商品数量
         counts.put(ProductSpuPageReqVO.IN_WAREHOUSE,
-                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus()));
+                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.DISABLE.getStatus(), shop.getMerId(),shop.getShopId()));
         // 查询售空的商品数量
         counts.put(ProductSpuPageReqVO.SOLD_OUT,
-                productSpuMapper.selectCount(ProductSpuDO::getStock, 0));
+                productSpuMapper.selectCount(ProductSpuDO::getStock, 0, shop.getMerId(),shop.getShopId()));
         // 查询触发警戒库存的商品数量
         counts.put(ProductSpuPageReqVO.ALERT_STOCK,
-                productSpuMapper.selectCount());
+                productSpuMapper.selectCount(shop.getMerId(),shop.getShopId()));
         // 查询回收站中的商品数量
         counts.put(ProductSpuPageReqVO.RECYCLE_BIN,
-                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus()));
+                productSpuMapper.selectCount(ProductSpuDO::getStatus, ProductSpuStatusEnum.RECYCLE.getStatus(), shop.getMerId(),shop.getShopId()));
         return counts;
     }
 

+ 6 - 0
feifan-module-mall/feifan-module-trade-biz/pom.xml

@@ -108,6 +108,12 @@
             <artifactId>feifan-spring-boot-starter-biz-dict</artifactId>
         </dependency>
 
+        <dependency>
+            <groupId>cn.newfeifan.zx</groupId>
+            <artifactId>feifan-module-system-biz</artifactId>
+            <version>${revision}</version>
+        </dependency>
+
     </dependencies>
 
 </project>

+ 18 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/aftersale/AfterSaleController.java

@@ -143,4 +143,22 @@ public class AfterSaleController {
         return success(true);
     }
 
+
+    @GetMapping("/after_saleByMer")
+    @Operation(summary = "新增接口20240410-售后信息-商户查询售后")
+    @PreAuthorize("@ss.hasPermission('trade:order:query')")
+    public CommonResult<List<AfterSaleBaseVO>> afterSale() {
+        List<AfterSaleDO> afterSaleDOS = afterSaleService.getAfterSaleByMerAndShop() ;
+        return success(AfterSaleConvert.INSTANCE.convertList02(afterSaleDOS));
+    }
+
+    @GetMapping("/after_saleByPro")
+    @Operation(summary = "新增接口20240410-售后信息-商户根据商品号查询售后")
+    @Parameter(name = "spuId", description = "商品ID", required = true, example = "1")
+    @PreAuthorize("@ss.hasPermission('trade:order:query')")
+    public CommonResult<List<AfterSaleBaseVO>> afterSaleByPro(@RequestParam("spuId") Long spuId) {
+        List<AfterSaleDO> afterSaleDOS = afterSaleService.getAfterSaleByProId(spuId);
+        return success(AfterSaleConvert.INSTANCE.convertList02(afterSaleDOS));
+    }
+
 }

+ 3 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/delivery/DeliveryExpressTemplateController.java

@@ -44,6 +44,8 @@ public class DeliveryExpressTemplateController {
         return success(true);
     }
 
+
+
     @DeleteMapping("/delete")
     @Operation(summary = "删除快递运费模板")
     @Parameter(name = "id", description = "编号", required = true)
@@ -83,6 +85,7 @@ public class DeliveryExpressTemplateController {
     @Operation(summary = "获得快递运费模板分页")
     @PreAuthorize("@ss.hasPermission('trade:delivery:express-template:query')")
     public CommonResult<PageResult<DeliveryExpressTemplateRespVO>> getDeliveryExpressTemplatePage(@Valid DeliveryExpressTemplatePageReqVO pageVO) {
+        System.out.println("执行分类查询");
         PageResult<DeliveryExpressTemplateDO> pageResult = deliveryExpressTemplateService.getDeliveryExpressTemplatePage(pageVO);
         return success(DeliveryExpressTemplateConvert.INSTANCE.convertPage(pageResult));
     }

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/delivery/vo/expresstemplate/ShopBO.java

@@ -0,0 +1,9 @@
+package cn.newfeifan.mall.module.trade.controller.admin.delivery.vo.expresstemplate;
+
+import lombok.Data;
+
+@Data
+public class ShopBO {
+    private Long shopId;
+    private Long merId;
+}

+ 7 - 8
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderController.java

@@ -204,16 +204,15 @@ public class TradeOrderController {
 
     @GetMapping("/get-count")
     @Operation(summary = "获得交易订单数量")
-    public CommonResult<Map<Integer, Long>> getOrderCount(@RequestParam(value = "shopId", required = false) Long shopId,
-                                                          @RequestParam(value = "merId", required = false) Long merId) {
+    public CommonResult<Map<Integer, Long>> getOrderCount() {
         Map<Integer, Long> orderCount = Maps.newLinkedHashMapWithExpectedSize(6);
         orderCount.put(-1, tradeOrderQueryService.getOrderCount(null));
-        orderCount.put(-2, afterSaleService.getApplyingAfterSaleCount(null));
-        orderCount.put(TradeOrderStatusEnum.UNPAID.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNPAID.getStatus(), shopId, merId));
-        orderCount.put(TradeOrderStatusEnum.UNDELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNDELIVERED.getStatus(), shopId, merId));
-        orderCount.put(TradeOrderStatusEnum.DELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.DELIVERED.getStatus(), shopId, merId));
-        orderCount.put(TradeOrderStatusEnum.COMPLETED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.COMPLETED.getStatus(), shopId, merId));
-        orderCount.put(TradeOrderStatusEnum.CANCELED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.CANCELED.getStatus(), shopId, merId));
+        orderCount.put(TradeOrderStatusEnum.AFTER_SALE.getStatus(), afterSaleService.getApplyingAfterSaleCount(null));
+        orderCount.put(TradeOrderStatusEnum.UNPAID.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNPAID.getStatus()));
+        orderCount.put(TradeOrderStatusEnum.UNDELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.UNDELIVERED.getStatus()));
+        orderCount.put(TradeOrderStatusEnum.DELIVERED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.DELIVERED.getStatus()));
+        orderCount.put(TradeOrderStatusEnum.COMPLETED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.COMPLETED.getStatus()));
+        orderCount.put(TradeOrderStatusEnum.CANCELED.getStatus(), tradeOrderQueryService.getOrderCount(TradeOrderStatusEnum.CANCELED.getStatus()));
         return success(orderCount);
     }
 

+ 23 - 6
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/controller/admin/order/TradeOrderDetailController.java

@@ -35,11 +35,9 @@ import org.springframework.web.bind.annotation.*;
 
 import javax.annotation.Resource;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
-import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
-import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 
 @Tag(name = "管理后台 - 订单详情")
 @RestController
@@ -104,6 +102,25 @@ public class TradeOrderDetailController {
         return success(AfterSaleConvert.INSTANCE.convert02(afterSaleByOrderNo));
     }
 
+    @GetMapping("/after_saleByOrderId")
+    @Operation(summary = "新增接口20240402-售后信息-商户根据订单号查询售后")
+    @Parameter(name = "orderId", description = "订单ID", required = true, example = "1")
+    @PreAuthorize("@ss.hasPermission('trade:order:query')")
+    public CommonResult<List<AfterSaleBaseVO>> afterSaleByMer(@RequestParam("orderId") Long orderId) {
+        // 查询订单
+        List<TradeOrderDO> orders = tradeOrderQueryService.getOrderByMerId(orderId);
+        if (orders.isEmpty()) {
+            return success(null);
+        }
+
+        List<Long> orderIds = orders.stream()
+                .map(TradeOrderDO::getId) // 提取每个TradeOrderDO对象的id属性
+                .collect(Collectors.toList());
+        // 查询售后订单
+        List<AfterSaleDO> afterSaleDOS = afterSaleService.getAfterSaleByMer(orderIds);
+        return success(AfterSaleConvert.INSTANCE.convertList02(afterSaleDOS));
+    }
+
     @GetMapping("/delivery")
     @Operation(summary = "新增接口20240229-物流信息")
     @Parameter(name = "id", description = "订单编号", required = true, example = "1")
@@ -141,12 +158,12 @@ public class TradeOrderDetailController {
                 .path("")
                 .payPrice(order.getPayPrice())
                 .build();
-        if (payOrderDO == null){
+        if (payOrderDO == null) {
             build.setPayStatus("未支付");
-        }else {
+        } else {
             build.setPayStatus(payOrderDO.getStatus() == 0 ? "未支付" : "已支付");
         }
-        return success(null);
+        return success(build);
     }
 
     @GetMapping("/productInfo")

+ 2 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/convert/aftersale/AfterSaleConvert.java

@@ -4,6 +4,7 @@ import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.module.member.api.user.dto.MemberUserRespDTO;
 import cn.newfeifan.mall.module.pay.api.refund.dto.PayRefundCreateReqDTO;
 import cn.newfeifan.mall.module.product.api.property.dto.ProductPropertyValueDetailRespDTO;
+import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSaleBaseVO;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSaleDetailRespVO;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSaleRespPageItemVO;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.log.AfterSaleLogRespVO;
@@ -82,6 +83,7 @@ public interface AfterSaleConvert {
 
     List<AfterSaleLogRespVO> convertList1(List<AfterSaleLogDO> list);
     AfterSaleDetailRespVO convert02(AfterSaleDO bean);
+    List<AfterSaleBaseVO> convertList02(List<AfterSaleDO> list);
     AfterSaleDetailRespVO.OrderItem convert02(TradeOrderItemDO bean);
     TradeOrderBaseVO convert(TradeOrderDO bean);
 

+ 8 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/aftersale/AfterSaleDO.java

@@ -193,13 +193,19 @@ public class AfterSaleDO extends BaseDO {
     private LocalDateTime receiveTime;
     /**
      * 收货备注
-     *
      * 注意,只有拒绝收货才会填写
      */
     private String receiveReason;
 
 
-
+    /**
+     * 店铺id
+     */
     private Long shopId;
 
+    /**
+     * 商户id
+     */
+    private Long merchantId;
+
 }

+ 8 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/delivery/DeliveryExpressTemplateDO.java

@@ -41,6 +41,14 @@ public class DeliveryExpressTemplateDO extends BaseDO {
     private Integer sort;
 
 
+    /**
+     * 店铺id
+     */
     private Long shopId;
 
+    /**
+     * 商户id
+     */
+    private Long merchantId;
+
 }

+ 6 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/dataobject/order/TradeOrderDO.java

@@ -331,7 +331,12 @@ public class TradeOrderDO extends BaseDO {
     private Long combinationRecordId;
 
 
+    /**
+     * 店铺id
+     */
     private Long shopId;
-
+    /**
+     * 商户id
+     */
     private Long merchantId;
 }

+ 7 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/aftersale/AfterSaleMapper.java

@@ -48,5 +48,12 @@ public interface AfterSaleMapper extends BaseMapperX<AfterSaleDO> {
                 .eqIfPresent(AfterSaleDO::getUserId, userId)
                 .in(AfterSaleDO::getStatus, statuses));
     }
+    default Long selectCountByUserIdAndStatus(Long userId, Long shopId, Long merId, Collection<Integer> statuses) {
+        return selectCount(new LambdaQueryWrapperX<AfterSaleDO>()
+                .eqIfPresent(AfterSaleDO::getUserId, userId)
+                .eqIfPresent(AfterSaleDO::getShopId, shopId)
+                .eqIfPresent(AfterSaleDO::getMerchantId, merId)
+                .in(AfterSaleDO::getStatus, statuses));
+    }
 
 }

+ 9 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/dal/mysql/order/TradeOrderMapper.java

@@ -39,6 +39,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eqIfPresent(TradeOrderDO::getTerminal, reqVO.getTerminal())
                 .eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
                 .eqIfPresent(TradeOrderDO::getMerchantId, reqVO.getMerchantId())
+                .eqIfPresent(TradeOrderDO::getShopId, reqVO.getShopId())
 
                 .inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
                 .likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
@@ -146,5 +147,13 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
                 .eqIfPresent(TradeOrderDO::getMerchantId, key))));
     }
 
+    default List<TradeOrderDO> selectOrderListByMerId(Long id, Long merId, Long shopId) {
+        return selectList(new LambdaQueryWrapperX<TradeOrderDO>()
+                .eq(TradeOrderDO::getMerchantId, merId)
+                .eq(TradeOrderDO::getShopId, shopId)
+                .eq(TradeOrderDO::getId, id)
+        );
+    }
+
     ;
 }

+ 22 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleService.java

@@ -9,6 +9,8 @@ import cn.newfeifan.mall.module.trade.controller.app.aftersale.vo.AppAfterSaleCr
 import cn.newfeifan.mall.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.aftersale.AfterSaleDO;
 
+import java.util.List;
+
 /**
  * 售后订单 Service 接口
  *
@@ -52,7 +54,7 @@ public interface AfterSaleService {
     /**
      * 【管理员】获得售后单 通过订单编号
      *
-     * @param id 售后编号
+     * @param orderNo 售后编号
      * @return 售后订单
      */
     AfterSaleDO getAfterSaleByOrderNo(String orderNo);
@@ -131,4 +133,23 @@ public interface AfterSaleService {
      */
     Long getApplyingAfterSaleCount(Long userId);
 
+    /**
+     * 【商户】获取售后订单
+     * @param orderIds  订单ID集
+     * @return          售后订单
+     */
+    List<AfterSaleDO> getAfterSaleByMer(List<Long> orderIds);
+
+    /**
+     * 【用户】获取售后订单
+     * @param spuId  商品ID
+     * @return       售后订单
+     */
+    List<AfterSaleDO> getAfterSaleByProId(Long spuId);
+
+    /**
+     * 【用户】获取售后订单
+     * @return       售后订单
+     */
+    List<AfterSaleDO> getAfterSaleByMerAndShop();
 }

+ 63 - 3
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/aftersale/AfterSaleServiceImpl.java

@@ -6,11 +6,15 @@ import cn.hutool.core.util.StrUtil;
 import cn.newfeifan.mall.framework.common.pojo.PageParam;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.object.ObjectUtils;
+import cn.newfeifan.mall.framework.mybatis.core.query.LambdaQueryWrapperX;
 import cn.newfeifan.mall.module.pay.api.refund.PayRefundApi;
 import cn.newfeifan.mall.module.pay.api.refund.dto.PayRefundCreateReqDTO;
+import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSaleDisagreeReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSalePageReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.aftersale.vo.AfterSaleRefuseReqVO;
+import cn.newfeifan.mall.module.trade.controller.admin.delivery.vo.expresstemplate.ShopBO;
 import cn.newfeifan.mall.module.trade.controller.app.aftersale.vo.AppAfterSaleCreateReqVO;
 import cn.newfeifan.mall.module.trade.controller.app.aftersale.vo.AppAfterSaleDeliveryReqVO;
 import cn.newfeifan.mall.module.trade.convert.aftersale.AfterSaleConvert;
@@ -32,9 +36,12 @@ import cn.newfeifan.mall.module.trade.framework.order.config.TradeOrderPropertie
 import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderQueryService;
 import cn.newfeifan.mall.module.trade.service.order.TradeOrderUpdateService;
+import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
-import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.transaction.support.TransactionSynchronization;
@@ -43,8 +50,10 @@ import org.springframework.validation.annotation.Validated;
 
 import javax.annotation.Resource;
 import java.time.LocalDateTime;
+import java.util.List;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.*;
 
 /**
@@ -75,6 +84,11 @@ public class AfterSaleServiceImpl implements AfterSaleService {
     @Resource
     private TradeOrderProperties tradeOrderProperties;
 
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+    @Resource
+    private AdminUserMapper userMapper;
+
     @Override
     public PageResult<AfterSaleDO> getAfterSalePage(AfterSalePageReqVO pageReqVO) {
         return tradeAfterSaleMapper.selectPage(pageReqVO);
@@ -97,7 +111,7 @@ public class AfterSaleServiceImpl implements AfterSaleService {
 
     @Override
     public AfterSaleDO getAfterSaleByOrderNo(String orderNo) {
-        return tradeAfterSaleMapper.selectOne(new LambdaQueryWrapper<AfterSaleDO>().eq(AfterSaleDO::getOrderNo,orderNo));
+        return tradeAfterSaleMapper.selectOne(new LambdaQueryWrapper<AfterSaleDO>().eq(AfterSaleDO::getOrderNo, orderNo));
     }
 
     @Override
@@ -416,7 +430,53 @@ public class AfterSaleServiceImpl implements AfterSaleService {
 
     @Override
     public Long getApplyingAfterSaleCount(Long userId) {
-        return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, AfterSaleStatusEnum.APPLYING_STATUSES);
+        ShopBO shop = getShop();
+        return tradeAfterSaleMapper.selectCountByUserIdAndStatus(userId, shop.getShopId(),shop.getMerId(), AfterSaleStatusEnum.APPLYING_STATUSES);
+    }
+
+    @Override
+    public List<AfterSaleDO> getAfterSaleByMer(List<Long> orderIds) {
+        return tradeAfterSaleMapper.selectList(new LambdaQueryWrapper<AfterSaleDO>()
+                .in(AfterSaleDO::getOrderId, orderIds));
+    }
+
+    @Override
+    public List<AfterSaleDO> getAfterSaleByProId(Long spuId) {
+        ShopBO shop = getShop();
+        return tradeAfterSaleMapper.selectList(new LambdaQueryWrapperX<AfterSaleDO>()
+                .eq(AfterSaleDO::getSpuId, spuId)
+                .eqIfPresent(AfterSaleDO::getShopId, shop.getShopId())
+                .eqIfPresent(AfterSaleDO::getMerchantId,shop.getMerId())
+        );
+    }
+
+    @Override
+    public List<AfterSaleDO> getAfterSaleByMerAndShop() {
+        ShopBO shop = getShop();
+
+        return tradeAfterSaleMapper.selectList(new LambdaQueryWrapperX<AfterSaleDO>()
+                .eqIfPresent(AfterSaleDO::getShopId, shop.getShopId())
+                .eq(AfterSaleDO::getMerchantId, shop.getMerId()));
+    }
+
+    private ShopBO getShop() {
+        return getShopBO(stringRedisTemplate, userMapper, log);
+    }
+
+    public static ShopBO getShopBO(StringRedisTemplate stringRedisTemplate, AdminUserMapper userMapper, Logger log) {
+        Long loginUserId = getLoginUserId();
+        String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);
+        if (StringUtils.isEmpty(s)) {
+            AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+            ShopBO shop = new ShopBO();
+            shop.setShopId(adminUserDO.getShopId());
+            shop.setMerId(adminUserDO.getMerchantId());
+            log.info("====shop:{}", shop);
+            return shop;
+        } else {
+            log.info("====shop:{}", s);
+            return JSONObject.parseObject(s, ShopBO.class);
+        }
     }
 
 }

+ 0 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressTemplateService.java

@@ -91,5 +91,4 @@ public interface DeliveryExpressTemplateService {
      * @return Map (templateId -> 运费模板设置)
      */
     Map<Long, DeliveryExpressTemplateRespBO> getExpressTemplateMapByIdsAndArea(Collection<Long> ids, Integer areaId);
-
 }

+ 50 - 2
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/delivery/DeliveryExpressTemplateServiceImpl.java

@@ -5,6 +5,8 @@ import cn.hutool.core.lang.Assert;
 import cn.hutool.core.util.ObjectUtil;
 import cn.newfeifan.mall.framework.common.pojo.PageResult;
 import cn.newfeifan.mall.framework.common.util.collection.CollectionUtils;
+import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
 import cn.newfeifan.mall.module.trade.controller.admin.delivery.vo.expresstemplate.*;
 import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateChargeDO;
 import cn.newfeifan.mall.module.trade.dal.dataobject.delivery.DeliveryExpressTemplateDO;
@@ -13,6 +15,12 @@ import cn.newfeifan.mall.module.trade.dal.mysql.delivery.DeliveryExpressTemplate
 import cn.newfeifan.mall.module.trade.dal.mysql.delivery.DeliveryExpressTemplateFreeMapper;
 import cn.newfeifan.mall.module.trade.dal.mysql.delivery.DeliveryExpressTemplateMapper;
 import cn.newfeifan.mall.module.trade.service.delivery.bo.DeliveryExpressTemplateRespBO;
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.validation.annotation.Validated;
@@ -22,6 +30,7 @@ import java.util.*;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.*;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.trade.convert.delivery.DeliveryExpressTemplateConvert.INSTANCE;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_TEMPLATE_NAME_DUPLICATE;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_TEMPLATE_NOT_EXISTS;
@@ -33,6 +42,7 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_TE
  */
 @Service
 @Validated
+@Slf4j
 public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTemplateService {
 
     @Resource
@@ -41,6 +51,12 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
     private DeliveryExpressTemplateChargeMapper expressTemplateChargeMapper;
     @Resource
     private DeliveryExpressTemplateFreeMapper expressTemplateFreeMapper;
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Resource
+    private AdminUserMapper userMapper;
+
 
     @Override
     @Transactional(rollbackFor = Exception.class)
@@ -50,6 +66,9 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
 
         // 插入
         DeliveryExpressTemplateDO template = INSTANCE.convert(createReqVO);
+        ShopBO shop = getShop();
+        template.setShopId(shop.getShopId());
+        template.setMerchantId(shop.getMerId());
         expressTemplateMapper.insert(template);
         // 插入运费模板计费表
         if (CollUtil.isNotEmpty(createReqVO.getCharges())) {
@@ -66,6 +85,7 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
         return template.getId();
     }
 
+
     @Override
     @Transactional(rollbackFor = Exception.class)
     public void updateDeliveryExpressTemplate(DeliveryExpressTemplateUpdateReqVO updateReqVO) {
@@ -147,7 +167,12 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
      * @param id   运费模板编号,可以为 null
      */
     private void validateTemplateNameUnique(String name, Long id) {
-        DeliveryExpressTemplateDO template = expressTemplateMapper.selectByName(name);
+        ShopBO shop = getShop();
+        QueryWrapper<DeliveryExpressTemplateDO> queryWrapper = new QueryWrapper<>();
+        queryWrapper.lambda()
+                .eq(DeliveryExpressTemplateDO::getShopId,shop.getShopId())
+                .eq(DeliveryExpressTemplateDO::getName,name);
+        DeliveryExpressTemplateDO template = expressTemplateMapper.selectOne(queryWrapper);
         if (template == null) {
             return;
         }
@@ -181,11 +206,15 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
 
     @Override
     public List<DeliveryExpressTemplateDO> getDeliveryExpressTemplateList() {
-        return expressTemplateMapper.selectList();
+        ShopBO shop = getShop();
+        return expressTemplateMapper.selectList(new LambdaQueryWrapper<DeliveryExpressTemplateDO>()
+                .eq(DeliveryExpressTemplateDO::getShopId,shop.getShopId()));
     }
 
     @Override
     public PageResult<DeliveryExpressTemplateDO> getDeliveryExpressTemplatePage(DeliveryExpressTemplatePageReqVO pageReqVO) {
+        ShopBO shop = getShop();
+        pageReqVO.setShopId(shop.getShopId());
         return expressTemplateMapper.selectPage(pageReqVO);
     }
 
@@ -215,4 +244,23 @@ public class DeliveryExpressTemplateServiceImpl implements DeliveryExpressTempla
         return INSTANCE.convertMap(areaId, templateList, chargeList, freeList);
     }
 
+    private ShopBO getShop() {
+        Long loginUserId = getLoginUserId();
+        String s = stringRedisTemplate.opsForValue().get("shop:" + loginUserId);
+        log.info("");
+        if (StringUtils.isEmpty(s)) {
+            AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+            ShopBO shop = new ShopBO();
+            shop.setShopId(adminUserDO.getShopId());
+            shop.setMerId(adminUserDO.getMerchantId());
+            log.info("====shop:{}",shop);
+            return shop;
+        } else {
+            log.info("====shop:{}",s);
+           return JSONObject.parseObject(s, ShopBO.class);
+        }
+    }
+
+
+
 }

+ 7 - 0
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryService.java

@@ -189,4 +189,11 @@ public interface TradeOrderQueryService {
      */
     Integer getShopSalesVolume(Long key);
 
+
+    /**
+     * 获取商户下的订单
+     * @param id 订单id
+     * @return 该商户下的订单
+     */
+    List<TradeOrderDO> getOrderByMerId(Long id);
 }

+ 33 - 1
feifan-module-mall/feifan-module-trade-biz/src/main/java/cn/newfeifan/mall/module/trade/service/order/TradeOrderQueryServiceImpl.java

@@ -11,6 +11,9 @@ import cn.newfeifan.mall.module.member.api.user.dto.MemberUserRespDTO;
 import cn.newfeifan.mall.module.pay.controller.admin.order.vo.PayOrderPageItemRespVO;
 import cn.newfeifan.mall.module.product.api.sku.ProductSkuApi;
 import cn.newfeifan.mall.module.product.api.sku.dto.ProductSkuRespDTO;
+import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
+import cn.newfeifan.mall.module.system.dal.mysql.user.AdminUserMapper;
+import cn.newfeifan.mall.module.trade.controller.admin.delivery.vo.expresstemplate.ShopBO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderPageReqVO;
 import cn.newfeifan.mall.module.trade.controller.admin.order.vo.TradeOrderSummaryRespVO;
 import cn.newfeifan.mall.module.trade.controller.app.order.vo.AppTradeOrderPageReqVO;
@@ -26,7 +29,11 @@ import cn.newfeifan.mall.module.trade.framework.delivery.core.client.ExpressClie
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackQueryReqDTO;
 import cn.newfeifan.mall.module.trade.framework.delivery.core.client.dto.ExpressTrackRespDTO;
 import cn.newfeifan.mall.module.trade.service.delivery.DeliveryExpressService;
+import com.alibaba.fastjson.JSONObject;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.cache.annotation.Cacheable;
+import org.springframework.data.redis.core.StringRedisTemplate;
 import org.springframework.stereotype.Service;
 
 import javax.annotation.Resource;
@@ -35,8 +42,10 @@ import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
 import static cn.newfeifan.mall.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.newfeifan.mall.framework.security.core.util.SecurityFrameworkUtils.getLoginUserId;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.EXPRESS_NOT_EXISTS;
 import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.ORDER_NOT_FOUND;
+import static cn.newfeifan.mall.module.trade.service.aftersale.AfterSaleServiceImpl.getShopBO;
 
 /**
  * 交易订单【读】 Service 实现类
@@ -44,6 +53,7 @@ import static cn.newfeifan.mall.module.trade.enums.ErrorCodeConstants.ORDER_NOT_
  * @author 非繁源码
  */
 @Service
+@Slf4j
 public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     @Resource
@@ -63,6 +73,12 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
     @Resource
     private ProductSkuApi productSkuApi;
 
+    @Resource
+    private StringRedisTemplate stringRedisTemplate;
+
+    @Resource
+    private AdminUserMapper userMapper;
+
 
     // =================== Order ===================
 
@@ -101,6 +117,11 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
         if (userIds == null) { // 没查询到用户,说明肯定也没他的订单
             return PageResult.empty();
         }
+
+        ShopBO shop = getShop();
+        reqVO.setMerchantId(shop.getMerId());
+        reqVO.setShopId(shop.getShopId());
+
         // 分页查询
         return tradeOrderMapper.selectPage(reqVO, userIds);
     }
@@ -161,7 +182,8 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     @Override
     public Long getOrderCount(Integer status) {
-        return tradeOrderMapper.selectCountByStatus(status);
+        ShopBO shop = getShop();
+        return tradeOrderMapper.selectCountByStatus(status,shop.getShopId(),shop.getMerId());
     }
 
     @Override
@@ -189,6 +211,16 @@ public class TradeOrderQueryServiceImpl implements TradeOrderQueryService {
 
     }
 
+    @Override
+    public List<TradeOrderDO> getOrderByMerId(Long id) {
+        ShopBO shop = getShop();
+        return tradeOrderMapper.selectOrderListByMerId(id,shop.getMerId(),shop.getShopId());
+    }
+
+    private ShopBO getShop() {
+        return getShopBO(stringRedisTemplate, userMapper, log);
+    }
+
     @Override
     public List<ExpressTrackRespDTO> getExpressTrackList(Long id, Long userId) {
         // 查询订单

+ 1 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/wallet/PayWalletServiceImpl.java

@@ -37,6 +37,7 @@ public class PayWalletServiceImpl implements  PayWalletService {
     @Resource
     private PayWalletMapper walletMapper;
     @Resource
+    @Lazy
     private PayWalletTransactionService walletTransactionService;
     @Resource
     @Lazy

+ 2 - 0
feifan-module-pay/feifan-module-pay-biz/src/main/java/cn/newfeifan/mall/module/pay/service/wallet/PayWalletTransactionServiceImpl.java

@@ -12,6 +12,7 @@ import cn.newfeifan.mall.module.pay.dal.redis.no.PayNoRedisDAO;
 import cn.newfeifan.mall.module.pay.enums.wallet.PayWalletBizTypeEnum;
 import cn.newfeifan.mall.module.pay.service.wallet.bo.WalletTransactionCreateReqBO;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.context.annotation.Lazy;
 import org.springframework.stereotype.Service;
 import org.springframework.validation.annotation.Validated;
 
@@ -38,6 +39,7 @@ public class PayWalletTransactionServiceImpl implements PayWalletTransactionServ
     private static final String WALLET_NO_PREFIX = "W";
 
     @Resource
+    @Lazy
     private PayWalletService payWalletService;
     @Resource
     private PayWalletTransactionMapper payWalletTransactionMapper;

+ 1 - 0
feifan-module-sale/feifan-module-sale-api/src/main/java/cn/newfeifan/mall/module/enums/ErrorCodeConstants.java

@@ -12,5 +12,6 @@ public interface ErrorCodeConstants {
     ErrorCode SHOP_STATUS_NOT_EXISTS = new ErrorCode(1_002_029_000 , "店铺状态不存在");
     ErrorCode MERCHANT_NOT_EXISTS = new ErrorCode(1_002_029_001, "商户不存在");
     ErrorCode SHOP_NOT_EXISTS = new ErrorCode(1_002_029_002, "店铺不存在不存在");
+    ErrorCode NO_BANDING = new ErrorCode(1_002_029_002, "当前用户未绑定商户");
 
 }

+ 1 - 2
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/ShopController.java

@@ -125,8 +125,7 @@ public class ShopController {
         if (shops.isEmpty()) {
             return success(Collections.emptyList());
         }
-        List<Long> shopIds = shops.stream().map(ShopRespVO::getId).collect(Collectors.toList());
-        List<UserRespVO> userRespVOS = shopService.getAllUser(shopIds);
+        List<UserRespVO> userRespVOS = shopService.getAllUserByMerId(merId);
         return success(userRespVOS);
     }
 

+ 9 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopPageReqVO.java

@@ -31,4 +31,13 @@ public class ShopPageReqVO extends PageParam {
     @Schema(description = "logo地址", example = "https://www.zhongxing.cn")
     private String logoUrl;
 
+    @Schema(description = "是否启用全场包邮")
+    private Boolean deliveryExpressFreeEnabled;
+
+    @Schema(description = "全场包邮的最小金额,单位:分", example = "10353")
+    private Integer deliveryExpressFreePrice;
+
+    @Schema(description = "是否开启自提")
+    private Boolean deliveryPickUpEnabled;
+
 }

+ 12 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopRespVO.java

@@ -45,4 +45,16 @@ public class ShopRespVO {
     @ExcelProperty("最后更新时间")
     private LocalDateTime updateTime;
 
+    @Schema(description = "是否启用全场包邮", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("是否启用全场包邮")
+    private Boolean deliveryExpressFreeEnabled;
+
+    @Schema(description = "全场包邮的最小金额,单位:分", requiredMode = Schema.RequiredMode.REQUIRED, example = "10353")
+    @ExcelProperty("全场包邮的最小金额,单位:分")
+    private Integer deliveryExpressFreePrice;
+
+    @Schema(description = "是否开启自提", requiredMode = Schema.RequiredMode.REQUIRED)
+    @ExcelProperty("是否开启自提")
+    private Boolean deliveryPickUpEnabled;
+
 }

+ 7 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/controller/admin/shop/vo/ShopSaveReqVO.java

@@ -34,5 +34,12 @@ public class ShopSaveReqVO {
     @Schema(description = "域名", example = "https://www.zhongxing.cn")
     private String website;
 
+    @Schema(description = "是否启用全场包邮", example = "1")
+    private Boolean deliveryExpressFreeEnabled;
 
+    @Schema(description = "全场包邮的最小金额,单位:分", example = "10353")
+    private Integer deliveryExpressFreePrice;
+
+    @Schema(description = "是否开启自提", example = "1")
+    private Boolean deliveryPickUpEnabled;
 }

+ 12 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/dal/dataobject/shop/ShopDO.java

@@ -49,5 +49,17 @@ public class ShopDO extends BaseDO {
      * 域名
      */
     private String website;
+    /**
+     * 是否启用全场包邮
+     */
+    private Boolean deliveryExpressFreeEnabled;
+    /**
+     * 全场包邮的最小金额,单位:分
+     */
+    private Integer deliveryExpressFreePrice;
+    /**
+     * 是否开启自提
+     */
+    private Boolean deliveryPickUpEnabled;
 
 }

+ 1 - 1
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/merchant/MerchantServiceImpl.java

@@ -150,7 +150,7 @@ public class MerchantServiceImpl implements MerchantService {
 
         // 查询用户的商户信息,并且缓存到redis中
         OAuth2AccessTokenDO oAuth2AccessTokenDO = message.getOAuth2AccessTokenDO();
-        ShopMessage shopMessage = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + message.getOAuth2AccessTokenDO().getAccessToken()), ShopMessage.class);
+        ShopMessage shopMessage = JsonUtils.parseObject(stringRedisTemplate.opsForValue().get("shop:" + message.getOAuth2AccessTokenDO().getUserId()), ShopMessage.class);
         if (shopMessage != null) {
             // 刷新时间
             stringRedisTemplate.opsForValue().set("shop:" + oAuth2AccessTokenDO.getUserId(), JsonUtils.toJsonString(shopMessage), 3600 * 24, TimeUnit.SECONDS);

+ 6 - 0
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopService.java

@@ -103,4 +103,10 @@ public interface ShopService {
 
     List<ShopRespVO> getAllShopByUserId(Long loginUserId);
 
+    /**
+     * 获取商户下的所有用户
+     * @param merId 商户编号
+     * @return  用户
+     */
+    List<UserRespVO> getAllUserByMerId(Long merId);
 }

+ 15 - 2
feifan-module-sale/feifan-module-sale-biz/src/main/java/cn/newfeifan/mall/sale/service/shop/ShopServiceImpl.java

@@ -1,6 +1,8 @@
 package cn.newfeifan.mall.sale.service.shop;
 
+import cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil;
 import cn.newfeifan.mall.framework.common.util.json.JsonUtils;
+import cn.newfeifan.mall.module.enums.ErrorCodeConstants;
 import cn.newfeifan.mall.module.system.controller.admin.user.vo.user.UserRespVO;
 import cn.newfeifan.mall.module.system.dal.dataobject.oauth2.OAuth2AccessTokenDO;
 import cn.newfeifan.mall.module.system.dal.dataobject.user.AdminUserDO;
@@ -29,6 +31,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.NO_BANDING;
 import static cn.newfeifan.mall.module.enums.ErrorCodeConstants.SHOP_NOT_EXISTS;
 
 /**
@@ -152,8 +155,18 @@ public class ShopServiceImpl implements ShopService {
 
     @Override
     public List<ShopRespVO> getAllShopByUserId(Long loginUserId) {
-        ShopDO shopDO = shopMapper.selectById(loginUserId);
-        return getMerchantAllShop(shopDO.getMerchantId());
+        AdminUserDO adminUserDO = userMapper.selectById(loginUserId);
+        if (adminUserDO.getMerchantId() == null){
+            throw ServiceExceptionUtil.exception(NO_BANDING);
+        }
+        return getMerchantAllShop(adminUserDO.getMerchantId());
+    }
+
+    @Override
+    public List<UserRespVO> getAllUserByMerId(Long merId) {
+        List<AdminUserDO> userRespVO = userService.getUserByMerId(merId);
+
+        return BeanUtils.toBean(userRespVO, UserRespVO.class);
     }
 
 }

+ 1 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/auth/AuthController.java

@@ -114,6 +114,7 @@ public class AuthController {
         Set<Long> menuIds = permissionService.getRoleMenuListByRoleId(convertSet(roles, RoleDO::getId));
         List<MenuDO> menuList = menuService.getMenuList(menuIds);
         menuList.removeIf(menu -> !CommonStatusEnum.ENABLE.getStatus().equals(menu.getStatus())); // 移除禁用的菜单
+        menuList.removeIf(menu -> menu.getCategoryId().equals(1L)); // 移除平台菜单
 
         // 2. 拼接结果返回
         return success(AuthConvert.INSTANCE.convert(user, roles, menuList));

+ 2 - 2
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/permission/PermissionController.java

@@ -66,14 +66,14 @@ public class PermissionController {
     @Operation(summary = "获得管理员拥有的角色编号列表")
     @Parameter(name = "userId", description = "用户编号", required = true)
     @GetMapping("/list-user-roles")
-    @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')")
+    @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role-sh')")
     public CommonResult<Set<Long>> listAdminRoles(@RequestParam("userId") Long userId) {
         return success(permissionService.getUserRoleIdListByUserId(userId));
     }
 
     @Operation(summary = "赋予用户角色")
     @PostMapping("/assign-user-role")
-    @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role')")
+    @PreAuthorize("@ss.hasPermission('system:permission:assign-user-role-sh')")
     public CommonResult<Boolean> assignUserRole(@Validated @RequestBody PermissionAssignUserRoleReqVO reqVO) {
         permissionService.assignUserRole(reqVO.getUserId(), reqVO.getRoleIds());
         return success(true);

+ 3 - 1
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/permission/RoleController.java

@@ -23,6 +23,7 @@ import javax.validation.Valid;
 import java.io.IOException;
 import java.util.Comparator;
 import java.util.List;
+import java.util.stream.Collectors;
 
 import static cn.newfeifan.mall.framework.common.pojo.CommonResult.success;
 import static cn.newfeifan.mall.framework.operatelog.core.enums.OperateTypeEnum.EXPORT;
@@ -87,9 +88,10 @@ public class RoleController {
 
     @GetMapping({"/list-all-simple", "/simple-list"})
     @Operation(summary = "获取角色精简信息列表", description = "只包含被开启的角色,主要用于前端的下拉选项")
-    public CommonResult<List<RoleSimpleRespVO>> getSimpleRoleList() {
+    public CommonResult<List<RoleSimpleRespVO>> getSimpleRoleList(@RequestParam("categoryId") Integer categoryId) {
         List<RoleDO> list = roleService.getRoleListByStatus(singleton(CommonStatusEnum.ENABLE.getStatus()));
         list.sort(Comparator.comparing(RoleDO::getSort));
+        list = list.stream().filter(k -> k.getCategoryId().equals(categoryId)).collect(Collectors.toList());
         return success(BeanUtils.toBean(list, RoleSimpleRespVO.class));
     }
 

+ 9 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/controller/admin/user/UserProfileController.java

@@ -22,6 +22,7 @@ import cn.newfeifan.mall.module.system.service.user.AdminUserService;
 import io.swagger.v3.oas.annotations.tags.Tag;
 import io.swagger.v3.oas.annotations.Operation;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
@@ -54,6 +55,8 @@ public class UserProfileController {
     private RoleService roleService;
     @Resource
     private SocialUserService socialService;
+    @Resource
+    private PasswordEncoder passwordEncoder;
 
     @GetMapping("/get")
     @Operation(summary = "获得登录用户信息")
@@ -85,6 +88,12 @@ public class UserProfileController {
         userService.updateUserPassword(getLoginUserId(), reqVO);
         return success(true);
     }
+    @PutMapping("/test-pwd")
+    @Operation(summary = "测试pwd的接口-无需调用")
+    public String testPwd(String pwd) {
+        //仅供测试
+        return passwordEncoder.encode(pwd);
+    }
 
     @RequestMapping(value = "/update-avatar",
             method = {RequestMethod.POST, RequestMethod.PUT}) // 解决 uni-app 不支持 Put 上传文件的问题

+ 3 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/dal/dataobject/user/AdminUserDO.java

@@ -110,6 +110,9 @@ public class AdminUserDO extends TenantBaseDO {
      */
     private Long shopId;
 
+    /**
+     * 店铺id
+     */
     private Long merchantId;
 
 

+ 1 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserService.java

@@ -217,4 +217,5 @@ public interface AdminUserService {
     void createUserByMobile(Long merId, Long shopId, String contactMobile, String contactName);
 
 
+    List<AdminUserDO> getUserByMerId(Long merId);
 }

+ 5 - 0
feifan-module-system/feifan-module-system-biz/src/main/java/cn/newfeifan/mall/module/system/service/user/AdminUserServiceImpl.java

@@ -502,6 +502,11 @@ public class AdminUserServiceImpl implements AdminUserService {
         createUser(build);
     }
 
+    @Override
+    public List<AdminUserDO> getUserByMerId(Long merId) {
+        return userMapper.selectList(new LambdaQueryWrapper<AdminUserDO>().eq(AdminUserDO::getMerchantId, merId));
+    }
+
     /**
      * 对密码进行加密
      *

+ 1 - 1
feifan-server/src/main/resources/application-local.yaml

@@ -146,7 +146,7 @@ spring:
     admin:
       # Spring Boot Admin Client 客户端的相关配置
       client:
-        url: http://10.0.5.227:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
+        url: http://10.0.5.228:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
         instance:
           service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
       # Spring Boot Admin Server 服务端的相关配置

+ 268 - 0
feifan-server/src/main/resources/application-prod.yaml

@@ -0,0 +1,268 @@
+server:
+  port: 8002
+
+--- #################### 数据库相关配置 ####################
+
+spring:
+  # 数据源配置项
+  autoconfigure:
+    exclude:
+      - com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure # 排除 Druid 的自动配置,使用 dynamic-datasource-spring-boot-starter 配置多数据源
+#      - org.springframework.boot.autoconfigure.quartz.QuartzAutoConfiguration # 默认 local 环境,不开启 Quartz 的自动配置
+#      - de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration # 禁用 Spring Boot Admin 的 Server 的自动配置
+#      - de.codecentric.boot.admin.server.ui.config.AdminServerUiAutoConfiguration # 禁用 Spring Boot Admin 的 Server UI 的自动配置
+#      - de.codecentric.boot.admin.client.config.SpringBootAdminClientAutoConfiguration # 禁用 Spring Boot Admin 的 Client 的自动配置
+  datasource:
+    druid: # Druid 【监控】相关的全局配置
+      web-stat-filter:
+        enabled: true
+      stat-view-servlet:
+        enabled: true
+        allow: # 设置白名单,不填则允许所有访问
+        url-pattern: /druid/*
+        login-username: # 控制台管理用户名和密码
+        login-password:
+      filter:
+        stat:
+          enabled: true
+          log-slow-sql: true # 慢 SQL 记录
+          slow-sql-millis: 100
+          merge-sql: true
+        wall:
+          config:
+            multi-statement-allow: true
+    dynamic: # 多数据源配置
+      druid: # Druid 【连接池】相关的全局配置
+        initial-size: 1 # 初始连接数
+        min-idle: 1 # 最小连接池数量
+        max-active: 20 # 最大连接池数量
+        max-wait: 600000 # 配置获取连接等待超时的时间,单位:毫秒
+        time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒
+        min-evictable-idle-time-millis: 300000 # 配置一个连接在池中最小生存的时间,单位:毫秒
+        max-evictable-idle-time-millis: 900000 # 配置一个连接在池中最大生存的时间,单位:毫秒
+        validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+        test-while-idle: true
+        test-on-borrow: false
+        test-on-return: false
+      primary: master
+      datasource:
+        master:
+          name: mall-letcgo
+          url: jdbc:mysql://120.78.5.233:3306/${spring.datasource.dynamic.datasource.master.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          username: root
+          password: PA55W0RD
+        slave: # 模拟从库,可根据自己需要修改
+          name: mall-letcgo
+          lazy: true # 开启懒加载,保证启动速度
+          url: jdbc:mysql://120.78.5.233:3306/${spring.datasource.dynamic.datasource.slave.name}?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true # MySQL Connector/J 8.X 连接的示例
+          username: root
+          password: PA55W0RD
+
+  # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+  redis:
+    host: 47.107.29.61 # 地址
+    port: 6379 # 端口
+    database: 0 # 数据库索引
+#    password: 123456 # 密码,建议生产环境开启
+
+--- #################### 定时任务相关配置 ####################
+
+# Quartz 配置项,对应 QuartzProperties 配置类
+spring:
+  quartz:
+    auto-startup: true # 本地开发环境,尽量不要开启 Job
+    scheduler-name: schedulerName # Scheduler 名字。默认为 schedulerName
+    job-store-type: jdbc # Job 存储器类型。默认为 memory 表示内存,可选 jdbc 使用数据库。
+    wait-for-jobs-to-complete-on-shutdown: true # 应用关闭时,是否等待定时任务执行完成。默认为 false ,建议设置为 true
+    properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档
+      org:
+        quartz:
+          # Scheduler 相关配置
+          scheduler:
+            instanceName: schedulerName
+            instanceId: AUTO # 自动生成 instance ID
+          # JobStore 相关配置
+          jobStore:
+            # JobStore 实现类。可见博客:https://blog.csdn.net/weixin_42458219/article/details/122247162
+            class: org.springframework.scheduling.quartz.LocalDataSourceJobStore
+            isClustered: true # 是集群模式
+            clusterCheckinInterval: 15000 # 集群检查频率,单位:毫秒。默认为 15000,即 15 秒
+            misfireThreshold: 60000 # misfire 阀值,单位:毫秒。
+          # 线程池相关配置
+          threadPool:
+            threadCount: 25 # 线程池大小。默认为 10 。
+            threadPriority: 5 # 线程优先级
+            class: org.quartz.simpl.SimpleThreadPool # 线程池类型
+    jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置
+      initialize-schema: NEVER # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。
+
+--- #################### 消息队列相关 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+  name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+
+spring:
+  # RabbitMQ 配置项,对应 RabbitProperties 配置类
+  rabbitmq:
+    host: 127.0.0.1 # RabbitMQ 服务的地址
+    port: 5672 # RabbitMQ 服务的端口
+    username: rabbit # RabbitMQ 服务的账号
+    password: rabbit # RabbitMQ 服务的密码
+  # Kafka 配置项,对应 KafkaProperties 配置类
+  kafka:
+    bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+  acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+  expire: 30000 # 分布式锁的超时时间,默认为 30 毫秒
+
+# Resilience4j 配置项
+resilience4j:
+  ratelimiter:
+    instances:
+      backendA:
+        limit-for-period: 1 # 每个周期内,允许的请求数。默认为 50
+        limit-refresh-period: 60s # 每个周期的时长,单位:微秒。默认为 500
+        timeout-duration: 1s # 被限流时,阻塞等待的时长,单位:微秒。默认为 5s
+        register-health-indicator: true # 是否注册到健康监测
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+  endpoints:
+    web:
+      base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+      exposure:
+        include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+  boot:
+    admin:
+      # Spring Boot Admin Client 客户端的相关配置
+      client:
+        url: http://47.107.28.221:${server.port}/${spring.boot.admin.context-path} # 设置 Spring Boot Admin Server 地址
+        instance:
+          service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+      # Spring Boot Admin Server 服务端的相关配置
+      context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+  file:
+    name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+  level:
+    # 配置自己写的 MyBatis Mapper 打印日志
+    cn.newfeifan.mall.module.bpm.dal.mysql: debug
+    cn.newfeifan.mall.module.infra.dal.mysql: debug
+    cn.newfeifan.mall.module.infra.dal.mysql.job.JobLogMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    cn.newfeifan.mall.module.infra.dal.mysql.file.FileConfigMapper: INFO # 配置 FileConfigMapper 的日志级别为 info
+    cn.newfeifan.mall.module.pay.dal.mysql: debug
+    cn.newfeifan.mall.module.pay.dal.mysql.notify.PayNotifyTaskMapper: INFO # 配置 JobLogMapper 的日志级别为 info
+    cn.newfeifan.mall.module.system.dal.mysql: debug
+    cn.newfeifan.mall.module.system.dal.mysql.sensitiveword.SensitiveWordMapper: INFO # 配置 SensitiveWordMapper 的日志级别为 info
+    cn.newfeifan.mall.module.system.dal.mysql.sms.SmsChannelMapper: INFO # 配置 SmsChannelMapper 的日志级别为 info
+    cn.newfeifan.mall.module.tool.dal.mysql: debug
+    cn.newfeifan.mall.module.member.dal.mysql: debug
+    cn.newfeifan.mall.module.trade.dal.mysql: debug
+    cn.newfeifan.mall.module.promotion.dal.mysql: debug
+    cn.newfeifan.mall.module.statistics.dal.mysql: debug
+    cn.newfeifan.mall.module.crm.dal.mysql: debug
+    org.springframework.context.support.PostProcessorRegistrationDelegate: ERROR # TODO 非繁人:先禁用,Spring Boot 3.X 存在部分错误的 WARN 提示
+
+debug: false
+
+--- #################### 微信公众号、小程序相关配置 ####################
+wx:
+  mp: # 公众号配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md 文档
+#    app-id: wx041349c6f39b268b # 测试号(牛希尧提供的)
+#    secret: 5abee519483bc9f8cb37ce280e814bd0
+    app-id: wx917c16ecb85e8fb8 # 测试号(自己的)
+    secret: e6be2d75ba7dc0f3d833469645062b79
+#    app-id: wxa69ab825b163be19 # 测试号(Kongdy 提供的)
+#    secret: bd4f9fab889591b62aeac0d7b8d8b4a0
+    # 存储配置,解决 AccessToken 的跨节点的共享
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wx # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+  miniapp: # 小程序配置(必填),参见 https://github.com/Wechat-Group/WxJava/blob/develop/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md 文档
+    #    appid: wx62056c0d5e8db250 # 测试号(牛希尧提供的)
+    #    secret: 333ae72f41552af1e998fe1f54e1584a
+    appid: wx63c280fe3248a3e7 # wenhualian的接口测试号
+    secret: 6f270509224a7ae1296bbf1c8cb97aed
+#    appid: wxc4598c446f8a9cb3 # 测试号(Kongdy 提供的)
+#    secret: 4a1a04e07f6a4a0751b39c3064a92c8b
+    config-storage:
+      type: RedisTemplate # 采用 RedisTemplate 操作 Redis,会自动从 Spring 中获取
+      key-prefix: wa # Redis Key 的前缀
+      http-client-type: HttpClient # 采用 HttpClient 请求微信公众号平台
+
+--- #################### 非繁相关配置 ####################
+
+# 非繁配置项,设置当前项目所有自定义的配置
+feifan:
+  captcha:
+    enable: false # 本地环境,暂时关闭图片验证码,方便登录等接口的测试;
+  security:
+    mock-enable: true
+  xss:
+    enable: false
+    exclude-urls: # 如下两个 url,仅仅是为了演示,去掉配置也没关系
+      - ${spring.boot.admin.context-path}/** # 不处理 Spring Boot Admin 的请求
+      - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+  pay:
+    order-notify-url: http://zxgz.newfeifan.cn/admin-api/pay/notify/order # 支付渠道的【支付】回调地址
+    refund-notify-url: http://zxgz.newfeifan.cn/admin-api/pay/notify/refund # 支付渠道的【退款】回调地址
+  access-log: # 访问日志的配置项
+    enable: false
+  error-code: # 错误码相关配置项
+    enable: false
+  demo: false # 关闭演示模式
+  tencent-lbs-key: TVDBZ-TDILD-4ON4B-PFDZA-RNLKH-VVF6E # QQ 地图的密钥 https://lbs.qq.com/service/staticV2/staticGuide/staticDoc
+
+justauth:
+  enabled: true
+  type:
+    DINGTALK: # 钉钉
+      client-id: dingvrnreaje3yqvzhxg
+      client-secret: i8E6iZyDvZj51JIb0tYsYfVQYOks9Cq1lgryEjFRqC79P3iJcrxEwT6Qk2QvLrLI
+      ignore-check-redirect-uri: true
+    WECHAT_ENTERPRISE: # 企业微信
+      client-id: wwd411c69a39ad2e54
+      client-secret: 1wTb7hYxnpT2TUbIeHGXGo7T0odav1ic10mLdyyATOw
+      agent-id: 1000004
+      ignore-check-redirect-uri: true
+    WECHAT_MINI_APP: # 微信小程序
+      client-id: ${wx.miniapp.appid}
+      client-secret: ${wx.miniapp.secret}
+      ignore-check-redirect-uri: true
+      ignore-check-state: true # 微信小程序,不会使用到 state,所以不进行校验
+    WECHAT_MP: # 微信公众号
+      client-id: ${wx.mp.app-id}
+      client-secret: ${wx.mp.secret}
+      ignore-check-redirect-uri: true
+  cache:
+    type: REDIS
+    prefix: 'social_auth_state:' # 缓存前缀,目前只对 Redis 缓存生效,默认 JUSTAUTH::STATE::
+    timeout: 24h # 超时时长,目前只对 Redis 缓存生效,默认 3 分钟
+
+# TODO 赤焰:这个配置的目的是?
+#ureport配置
+#ureport:
+#  disableHttpSessionReportCache: true #是否禁用
+#  disableFileProvider: true #是否禁用
+#  debug: true
+#  fileStoreDir: D://ureport//files
+#  provider:
+#    database:
+#       disabled: true
+#    file:
+#       disabled: true
+
+