yangyb před 1 měsícem
rodič
revize
cfac363023
62 změnil soubory, kde provedl 1977 přidání a 112 odebrání
  1. 27 0
      mall-interface/src/main/java/com/txz/mall/service/ProductAttrServiceClient.java
  2. 27 0
      mall-interface/src/main/java/com/txz/mall/service/ProductAttrValueServiceClient.java
  3. 4 13
      mall-service/src/main/java/com/txz/mall/controller/CategoryController.java
  4. 124 0
      mall-service/src/main/java/com/txz/mall/controller/ProductAttrController.java
  5. 124 0
      mall-service/src/main/java/com/txz/mall/controller/ProductAttrValueController.java
  6. 3 7
      mall-service/src/main/java/com/txz/mall/controller/StoreCombinationController.java
  7. 2 6
      mall-service/src/main/java/com/txz/mall/controller/StoreFlashActivityController.java
  8. 3 7
      mall-service/src/main/java/com/txz/mall/controller/StoreOrderController.java
  9. 2 6
      mall-service/src/main/java/com/txz/mall/controller/StorePinkController.java
  10. 8 12
      mall-service/src/main/java/com/txz/mall/controller/StoreProductAttrResultController.java
  11. 8 1
      mall-service/src/main/java/com/txz/mall/controller/StoreProductController.java
  12. 2 6
      mall-service/src/main/java/com/txz/mall/controller/StoreProductRuleController.java
  13. 1 5
      mall-service/src/main/java/com/txz/mall/controller/UserAddressController.java
  14. 7 0
      mall-service/src/main/java/com/txz/mall/dao/ProductAttrMapper.java
  15. 7 0
      mall-service/src/main/java/com/txz/mall/dao/ProductAttrValueMapper.java
  16. 77 0
      mall-service/src/main/java/com/txz/mall/model/ProductAttr.java
  17. 163 0
      mall-service/src/main/java/com/txz/mall/model/ProductAttrValue.java
  18. 2 2
      mall-service/src/main/java/com/txz/mall/model/StoreFlashActivity.java
  19. 2 2
      mall-service/src/main/java/com/txz/mall/model/StoreProductAttrResult.java
  20. 1 1
      mall-service/src/main/java/com/txz/mall/service/CategoryService.java
  21. 22 0
      mall-service/src/main/java/com/txz/mall/service/ProductAttrService.java
  22. 22 0
      mall-service/src/main/java/com/txz/mall/service/ProductAttrValueService.java
  23. 1 1
      mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java
  24. 1 1
      mall-service/src/main/java/com/txz/mall/service/StorePinkService.java
  25. 9 0
      mall-service/src/main/java/com/txz/mall/service/StoreProductService.java
  26. 1 1
      mall-service/src/main/java/com/txz/mall/service/impl/CategoryServiceImpl.java
  27. 34 0
      mall-service/src/main/java/com/txz/mall/service/impl/ProductAttrServiceImpl.java
  28. 34 0
      mall-service/src/main/java/com/txz/mall/service/impl/ProductAttrValueServiceImpl.java
  29. 83 11
      mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java
  30. 1 1
      mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java
  31. 89 0
      mall-service/src/main/java/com/txz/mall/service/impl/StoreProductServiceImpl.java
  32. 2 2
      mall-service/src/main/java/com/txz/mall/service/impl/UserSignServiceImpl.java
  33. 1 1
      mall-service/src/main/java/dto/CategoryDTO.java
  34. 1 1
      mall-service/src/main/java/dto/CategorySearchDTO.java
  35. 237 0
      mall-service/src/main/java/dto/ProductAttrDTO.java
  36. 546 0
      mall-service/src/main/java/dto/ProductAttrValueDTO.java
  37. 1 1
      mall-service/src/main/java/dto/ProductRankingDTO.java
  38. 1 1
      mall-service/src/main/java/dto/StoreCombinationDTO.java
  39. 3 3
      mall-service/src/main/java/dto/StoreFlashActivityDTO.java
  40. 1 1
      mall-service/src/main/java/dto/StoreOrderDTO.java
  41. 1 1
      mall-service/src/main/java/dto/StorePinkDTO.java
  42. 1 1
      mall-service/src/main/java/dto/StoreProductAttrResultDTO.java
  43. 1 1
      mall-service/src/main/java/dto/StoreProductDTO.java
  44. 1 1
      mall-service/src/main/java/dto/StoreProductRuleDTO.java
  45. 1 1
      mall-service/src/main/java/dto/SystemDictDataDTO.java
  46. 1 1
      mall-service/src/main/java/dto/SystemDictTypeDTO.java
  47. 1 1
      mall-service/src/main/java/dto/SystemFormTempDTO.java
  48. 1 1
      mall-service/src/main/java/dto/SystemGroupDTO.java
  49. 1 1
      mall-service/src/main/java/dto/SystemGroupDataDTO.java
  50. 1 1
      mall-service/src/main/java/dto/UserAddressDTO.java
  51. 1 1
      mall-service/src/main/java/dto/UserSignDTO.java
  52. 72 0
      mall-service/src/main/java/vo/AttrValueVO.java
  53. 1 1
      mall-service/src/main/java/vo/CategoryTreeVO.java
  54. 1 1
      mall-service/src/main/java/vo/FlashActivityVO.java
  55. 1 1
      mall-service/src/main/java/vo/GroupDataFormCheckVO.java
  56. 1 1
      mall-service/src/main/java/vo/GroupDataFormItemCheckVO.java
  57. 1 1
      mall-service/src/main/java/vo/StoreOrderCountItemVO.java
  58. 1 1
      mall-service/src/main/java/vo/StorePinkDetailVO.java
  59. 152 0
      mall-service/src/main/java/vo/StoreProductInfoVO.java
  60. 0 2
      mall-service/src/main/resources/bootstrap.properties
  61. 19 0
      mall-service/src/main/resources/mapper/ProductAttrMapper.xml
  62. 33 0
      mall-service/src/main/resources/mapper/ProductAttrValueMapper.xml

+ 27 - 0
mall-interface/src/main/java/com/txz/mall/service/ProductAttrServiceClient.java

@@ -0,0 +1,27 @@
+package com.txz.mall.service;
+
+
+import com.txz.mall.dto.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+
+@FeignClient("mall")
+public interface ProductAttrServiceClient {
+
+	@RequestMapping( value = {"/product/attr/add"}, method = {RequestMethod.POST} )
+    public Result add(@RequestBody ProductAttrDPO productAttr,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/delete"}, method = {RequestMethod.POST} )
+	public Result delete(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/update"}, method = {RequestMethod.POST} )
+	public Result update(@RequestBody ProductAttrDPO productAttr,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/detail"}, method = {RequestMethod.POST} )
+	public Result<ProductAttrDPO> detail(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/list"}, method = {RequestMethod.POST} )
+	public Result<List<ProductAttrDPO>> list(@RequestBody ProductAttrDPO productAttr, @RequestParam("page") Integer page, @RequestParam("size") Integer size,@RequestParam("userId") Long userId);
+}

+ 27 - 0
mall-interface/src/main/java/com/txz/mall/service/ProductAttrValueServiceClient.java

@@ -0,0 +1,27 @@
+package com.txz.mall.service;
+
+
+import com.txz.mall.dto.*;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.*;
+import java.util.List;
+
+
+@FeignClient("mall")
+public interface ProductAttrValueServiceClient {
+
+	@RequestMapping( value = {"/product/attr/value/add"}, method = {RequestMethod.POST} )
+    public Result add(@RequestBody ProductAttrValueDPO productAttrValue,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/value/delete"}, method = {RequestMethod.POST} )
+	public Result delete(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/value/update"}, method = {RequestMethod.POST} )
+	public Result update(@RequestBody ProductAttrValueDPO productAttrValue,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/value/detail"}, method = {RequestMethod.POST} )
+	public Result<ProductAttrValueDPO> detail(@RequestParam("id") Integer id,@RequestParam("userId") Long userId);
+
+	@RequestMapping( value = {"/product/attr/value/list"}, method = {RequestMethod.POST} )
+	public Result<List<ProductAttrValueDPO>> list(@RequestBody ProductAttrValueDPO productAttrValue, @RequestParam("page") Integer page, @RequestParam("size") Integer size,@RequestParam("userId") Long userId);
+}

+ 4 - 13
mall-service/src/main/java/com/txz/mall/controller/CategoryController.java

@@ -6,7 +6,6 @@ import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
 import com.txz.mall.model.Category;
 import com.txz.mall.service.CategoryService;
-import com.txz.mall.vo.CategoryTreeVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
@@ -18,12 +17,11 @@ import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.CategoryTreeVO;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/11.
@@ -61,12 +59,7 @@ public class CategoryController {
         if (id == null) {
             return Result.fail(ResultCode.ID_IS_NULL);
         }
-        try {
-            categoryService.delete(id);
-        } catch (Exception e) {
-            log.error("删除对象操作异常e:{}", e);
-            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
-        }
+        categoryService.delete(id);
         return Result.success();
     }
 
@@ -113,16 +106,14 @@ public class CategoryController {
         Condition condition = new Condition(category.getClass());
         Example.Criteria criteria = condition.createCriteria();
         if (StringUtils.isNotBlank(category.getName())) {
-            criteria.andLike("name", category.getName());
+            criteria.andLike("name", "%" + category.getName() + "%");
         }
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("sort DESC, create_time DESC");
         PageInfo pageInfo = null;
         try {
             PageHelper.startPage(page, size);
             List<Category> list = categoryService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(Category::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 124 - 0
mall-service/src/main/java/com/txz/mall/controller/ProductAttrController.java

@@ -0,0 +1,124 @@
+package com.txz.mall.controller;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.txz.mall.core.Result;
+import com.txz.mall.core.ResultCode;
+import com.txz.mall.model.ProductAttr;
+import com.txz.mall.service.ProductAttrService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+@Api(tags = "[后台]商品属性管理")
+@RestController
+@RequestMapping("/product/attr")
+public class ProductAttrController {
+
+    private static Logger log = LoggerFactory.getLogger(ProductAttrController.class);
+
+    @Resource
+    private ProductAttrService productAttrService;
+
+    @PostMapping("/add")
+    @ApiOperation(value = "商品属性新增")
+    public Result add(@RequestBody ProductAttr productAttr) {
+        if (productAttr == null) {
+            return Result.fail(ResultCode.OBJECT_IS_NULL);
+        }
+        try {
+            productAttr.setCreateTime(new Date());
+//            productAttr.setCreateUserId(userId);
+            productAttrService.save(productAttr);
+        } catch (Exception e) {
+            log.error("新增对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/delete")
+    @ApiOperation(value = "商品属性删除")
+    public Result delete(@RequestParam Long id) {
+        if (id == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        try {
+            ProductAttr productAttr = new ProductAttr();
+            productAttr.setId(id);
+            productAttr.setIsDelete(1);
+            productAttrService.update(productAttr);
+        } catch (Exception e) {
+            log.error("删除对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/update")
+    @ApiOperation(value = "商品属性更新")
+    public Result update(@RequestBody ProductAttr productAttr) {
+        if (productAttr == null) {
+            return Result.fail(ResultCode.OBJECT_IS_NULL);
+        }
+        if (productAttr.getId() == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        try {
+            productAttr.setUpdateTime(new Date());
+//            productAttr.setUpdateUserId(userId);
+            productAttrService.update(productAttr);
+        } catch (Exception e) {
+            log.error("更新对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "商品属性获取详情")
+    public Result<ProductAttr> detail(@RequestParam Long id) {
+        if (id == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        ProductAttr productAttr = null;
+        try {
+            productAttr = productAttrService.findById(id);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success(productAttr);
+    }
+
+    @PostMapping("/list")
+    @ApiOperation(value = "商品属性获取列表")
+    public Result<List<ProductAttr>> list(@RequestBody ProductAttr productAttr, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) {
+        PageHelper.startPage(page, size);
+
+        Condition condition = new Condition(productAttr.getClass());
+        Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
+        PageInfo pageInfo = null;
+        try {
+            List<ProductAttr> list = productAttrService.findByCondition(condition);
+            pageInfo = new PageInfo(list);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success(pageInfo);
+    }
+}

+ 124 - 0
mall-service/src/main/java/com/txz/mall/controller/ProductAttrValueController.java

@@ -0,0 +1,124 @@
+package com.txz.mall.controller;
+
+import com.github.pagehelper.PageHelper;
+import com.github.pagehelper.PageInfo;
+import com.txz.mall.core.Result;
+import com.txz.mall.core.ResultCode;
+import com.txz.mall.model.ProductAttrValue;
+import com.txz.mall.service.ProductAttrValueService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.*;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example.Criteria;
+
+import javax.annotation.Resource;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+@Api(tags = "[后台]SKU")
+@RestController
+@RequestMapping("/product/attr/value")
+public class ProductAttrValueController {
+
+    private static Logger log = LoggerFactory.getLogger(ProductAttrValueController.class);
+
+    @Resource
+    private ProductAttrValueService productAttrValueService;
+
+    @PostMapping("/add")
+    @ApiOperation(value = "SKU新增")
+    public Result add(@RequestBody ProductAttrValue productAttrValue) {
+        if (productAttrValue == null) {
+            return Result.fail(ResultCode.OBJECT_IS_NULL);
+        }
+        try {
+            productAttrValue.setCreateTime(new Date());
+//            productAttrValue.setCreateUserId(userId);
+            productAttrValueService.save(productAttrValue);
+        } catch (Exception e) {
+            log.error("新增对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/delete")
+    @ApiOperation(value = "SKU删除")
+    public Result delete(@RequestParam Long id) {
+        if (id == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        try {
+            ProductAttrValue productAttrValue = new ProductAttrValue();
+            productAttrValue.setId(id);
+            productAttrValue.setIsDelete(1);
+            productAttrValueService.update(productAttrValue);
+        } catch (Exception e) {
+            log.error("删除对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/update")
+    @ApiOperation(value = "SKU更新")
+    public Result update(@RequestBody ProductAttrValue productAttrValue) {
+        if (productAttrValue == null) {
+            return Result.fail(ResultCode.OBJECT_IS_NULL);
+        }
+        if (productAttrValue.getId() == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        try {
+            productAttrValue.setUpdateTime(new Date());
+//            productAttrValue.setUpdateUserId(userId);
+            productAttrValueService.update(productAttrValue);
+        } catch (Exception e) {
+            log.error("更新对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success();
+    }
+
+    @PostMapping("/detail")
+    @ApiOperation(value = "SKU获取详情")
+    public Result<ProductAttrValue> detail(@RequestParam Long id) {
+        if (id == null) {
+            return Result.fail(ResultCode.ID_IS_NULL);
+        }
+        ProductAttrValue productAttrValue = null;
+        try {
+            productAttrValue = productAttrValueService.findById(id);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success(productAttrValue);
+    }
+
+    @PostMapping("/list")
+    @ApiOperation(value = "SKU获取列表")
+    public Result<List<ProductAttrValue>> list(@RequestBody ProductAttrValue productAttrValue, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) {
+        PageHelper.startPage(page, size);
+
+        Condition condition = new Condition(productAttrValue.getClass());
+        Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
+        PageInfo pageInfo = null;
+        try {
+            List<ProductAttrValue> list = productAttrValueService.findByCondition(condition);
+            pageInfo = new PageInfo(list);
+        } catch (Exception e) {
+            log.error("查询对象操作异常e:{}", e);
+            return Result.fail(ResultCode.INTERNAL_SERVER_ERROR);
+        }
+        return Result.success(pageInfo);
+    }
+}

+ 3 - 7
mall-service/src/main/java/com/txz/mall/controller/StoreCombinationController.java

@@ -8,7 +8,6 @@ import com.txz.mall.core.ResultCode;
 import com.txz.mall.model.StoreCombination;
 import com.txz.mall.service.StoreCombinationService;
 import com.txz.mall.service.StorePinkService;
-import com.txz.mall.vo.StorePinkDetailVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.slf4j.Logger;
@@ -16,19 +15,18 @@ import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.StorePinkDetailVO;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/14.
  */
 @Api(tags = "[后台]拼团商品表管理")
 @RestController
-@RequestMapping("/store/combination")
+@RequestMapping("/combination")
 public class StoreCombinationController {
 
     private static Logger log = LoggerFactory.getLogger(StoreCombinationController.class);
@@ -118,12 +116,10 @@ public class StoreCombinationController {
         Condition condition = new Condition(storeCombination.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreCombination> list = storeCombinationService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StoreCombination::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 2 - 6
mall-service/src/main/java/com/txz/mall/controller/StoreFlashActivityController.java

@@ -15,17 +15,15 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/14.
  */
 @Api(tags = "[后台]限时活动管理")
 @RestController
-@RequestMapping("/store/flash/activity")
+@RequestMapping("/flash/activity")
 public class StoreFlashActivityController {
 
     private static Logger log = LoggerFactory.getLogger(StoreFlashActivityController.class);
@@ -113,12 +111,10 @@ public class StoreFlashActivityController {
         Condition condition = new Condition(storeFlashActivity.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreFlashActivity> list = storeFlashActivityService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StoreFlashActivity::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 3 - 7
mall-service/src/main/java/com/txz/mall/controller/StoreOrderController.java

@@ -6,7 +6,6 @@ import com.txz.mall.core.Result;
 import com.txz.mall.core.ResultCode;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.service.StoreOrderService;
-import com.txz.mall.vo.StoreOrderCountItemVO;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
 import org.hibernate.validator.constraints.Range;
@@ -15,19 +14,18 @@ import org.slf4j.LoggerFactory;
 import org.springframework.web.bind.annotation.*;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.StoreOrderCountItemVO;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/15.
  */
 @Api(tags = "[后台]订单管理")
 @RestController
-@RequestMapping("/store/order")
+@RequestMapping("/order")
 public class StoreOrderController {
 
     private static Logger log = LoggerFactory.getLogger(StoreOrderController.class);
@@ -114,12 +112,10 @@ public class StoreOrderController {
         Condition condition = new Condition(storeOrder.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreOrder> list = storeOrderService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StoreOrder::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 2 - 6
mall-service/src/main/java/com/txz/mall/controller/StorePinkController.java

@@ -15,17 +15,15 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/15.
  */
 @Api(tags = "[后台]拼团管理")
 @RestController
-@RequestMapping("/store/pink")
+@RequestMapping("/pink")
 public class StorePinkController {
 
     private static Logger log = LoggerFactory.getLogger(StorePinkController.class);
@@ -112,12 +110,10 @@ public class StorePinkController {
         Condition condition = new Condition(storePink.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StorePink> list = storePinkService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StorePink::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 8 - 12
mall-service/src/main/java/com/txz/mall/controller/StoreProductAttrResultController.java

@@ -15,17 +15,15 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/11.
  */
-@Api(tags = "[后台]商品属性管理")
+@Api(tags = "[后台]商品属性详情管理")
 @RestController
-@RequestMapping("/store/product/attr/result")
+@RequestMapping("/product/attr/result")
 public class StoreProductAttrResultController {
 
     private static Logger log = LoggerFactory.getLogger(StoreProductAttrResultController.class);
@@ -34,7 +32,7 @@ public class StoreProductAttrResultController {
     private StoreProductAttrResultService storeProductAttrResultService;
 
     @PostMapping("/add")
-    @ApiOperation(value = "商品属性新增")
+    @ApiOperation(value = "商品属性详情新增")
     public Result add(@RequestBody StoreProductAttrResult storeProductAttrResult) {
         if (storeProductAttrResult == null) {
             return Result.fail(ResultCode.OBJECT_IS_NULL);
@@ -52,7 +50,7 @@ public class StoreProductAttrResultController {
     }
 
     @PostMapping("/delete")
-    @ApiOperation(value = "商品属性删除")
+    @ApiOperation(value = "商品属性详情删除")
     public Result delete(@RequestParam Long id) {
         if (id == null) {
             return Result.fail(ResultCode.ID_IS_NULL);
@@ -71,7 +69,7 @@ public class StoreProductAttrResultController {
     }
 
     @PostMapping("/update")
-    @ApiOperation(value = "商品属性更新")
+    @ApiOperation(value = "商品属性详情更新")
     public Result update(@RequestBody StoreProductAttrResult storeProductAttrResult) {
         if (storeProductAttrResult == null) {
             return Result.fail(ResultCode.OBJECT_IS_NULL);
@@ -92,7 +90,7 @@ public class StoreProductAttrResultController {
     }
 
     @PostMapping("/detail")
-    @ApiOperation(value = "商品属性获取详情")
+    @ApiOperation(value = "商品属性详情获取详情")
     public Result<StoreProductAttrResult> detail(@RequestParam Long id) {
         if (id == null) {
             return Result.fail(ResultCode.ID_IS_NULL);
@@ -109,7 +107,7 @@ public class StoreProductAttrResultController {
     }
 
     @PostMapping("/list")
-    @ApiOperation(value = "商品属性获取列表")
+    @ApiOperation(value = "商品属性详情获取列表")
     public Result<List<StoreProductAttrResult>> list(@RequestBody StoreProductAttrResult storeProductAttrResult, @RequestParam(defaultValue = "1") Integer page, @RequestParam(defaultValue = "10") Integer size) {
        
         PageHelper.startPage(page, size);
@@ -117,12 +115,10 @@ public class StoreProductAttrResultController {
         Condition condition = new Condition(storeProductAttrResult.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreProductAttrResult> list = storeProductAttrResultService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StoreProductAttrResult::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 8 - 1
mall-service/src/main/java/com/txz/mall/controller/StoreProductController.java

@@ -15,6 +15,7 @@ import org.springframework.web.bind.annotation.*;
 import org.springframework.web.multipart.MultipartFile;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example.Criteria;
+import vo.StoreProductInfoVO;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -26,7 +27,7 @@ import java.util.List;
  */
 @Api(tags = "[后台]商品管理")
 @RestController
-@RequestMapping("/store/product")
+@RequestMapping("/product")
 public class StoreProductController {
 
     private static Logger log = LoggerFactory.getLogger(StoreProductController.class);
@@ -168,6 +169,7 @@ public class StoreProductController {
         Condition condition = new Condition(storeProduct.getClass());
         Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreProduct> list = storeProductService.findByCondition(condition);
@@ -194,5 +196,10 @@ public class StoreProductController {
         return Result.success();
     }
 
+    @ApiOperation(value = "商品详情")
+    @RequestMapping(value = "/info/{id}", method = RequestMethod.GET)
+    public Result<StoreProductInfoVO> info(@PathVariable Integer id) {
+        return Result.success(storeProductService.getInfo(id));
+    }
 
 }

+ 2 - 6
mall-service/src/main/java/com/txz/mall/controller/StoreProductRuleController.java

@@ -15,17 +15,15 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/11.
  */
 @Api(tags = "[后台]商品规则管理")
 @RestController
-@RequestMapping("/store/product/rule")
+@RequestMapping("/product/rule")
 public class StoreProductRuleController {
 
     private static Logger log = LoggerFactory.getLogger(StoreProductRuleController.class);
@@ -117,12 +115,10 @@ public class StoreProductRuleController {
         Condition condition = new Condition(storeProductRule.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<StoreProductRule> list = storeProductRuleService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(StoreProductRule::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 1 - 5
mall-service/src/main/java/com/txz/mall/controller/UserAddressController.java

@@ -15,10 +15,8 @@ import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
 
 import javax.annotation.Resource;
-import java.util.Comparator;
 import java.util.Date;
 import java.util.List;
-import java.util.stream.Collectors;
 
 /**
  * Created by CodeGenerator on 2025/07/15.
@@ -112,12 +110,10 @@ public class UserAddressController {
         Condition condition = new Condition(userAddress.getClass());
         Example.Criteria criteria = condition.createCriteria();
         criteria.andEqualTo("isDelete", 0);
+        condition.setOrderByClause("create_time DESC");
         PageInfo pageInfo = null;
         try {
             List<UserAddress> list = userAddressService.findByCondition(condition);
-            list = list.stream()
-                    .sorted(Comparator.comparing(UserAddress::getCreateTime).reversed())
-                    .collect(Collectors.toList());
             pageInfo = new PageInfo(list);
         } catch (Exception e) {
             log.error("查询对象操作异常e:{}", e);

+ 7 - 0
mall-service/src/main/java/com/txz/mall/dao/ProductAttrMapper.java

@@ -0,0 +1,7 @@
+package com.txz.mall.dao;
+
+import com.txz.mall.core.Mapper;
+import com.txz.mall.model.ProductAttr;
+
+public interface ProductAttrMapper extends Mapper<ProductAttr> {
+}

+ 7 - 0
mall-service/src/main/java/com/txz/mall/dao/ProductAttrValueMapper.java

@@ -0,0 +1,7 @@
+package com.txz.mall.dao;
+
+import com.txz.mall.core.Mapper;
+import com.txz.mall.model.ProductAttrValue;
+
+public interface ProductAttrValueMapper extends Mapper<ProductAttrValue> {
+}

+ 77 - 0
mall-service/src/main/java/com/txz/mall/model/ProductAttr.java

@@ -0,0 +1,77 @@
+package com.txz.mall.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.util.Date;
+
+@Data
+@Table(name = "m_product_attr")
+public class ProductAttr {
+    /**
+     * 主键
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    @Column(name = "product_id")
+    @ApiModelProperty(value = "商品ID")
+    private Long productId;
+
+    /**
+     * 属性名
+     */
+    @Column(name = "attr_name")
+    @ApiModelProperty(value = "属性名")
+    private String attrName;
+
+    /**
+     * 属性值
+     */
+    @Column(name = "attr_values")
+    @ApiModelProperty(value = "属性值")
+    private String attrValues;
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
+    private Integer type;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    /**
+     * 创建人id
+     */
+    @Column(name = "create_user_id")
+    private Long createUserId;
+
+    /**
+     * 更新人id
+     */
+    @Column(name = "update_user_id")
+    private Long updateUserId;
+
+    /**
+     * 是否删除
+     */
+    @Column(name = "is_delete")
+    private Integer isDelete;
+
+
+}

+ 163 - 0
mall-service/src/main/java/com/txz/mall/model/ProductAttrValue.java

@@ -0,0 +1,163 @@
+package com.txz.mall.model;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import javax.persistence.*;
+import java.math.BigDecimal;
+import java.util.Date;
+
+@Data
+@Table(name = "m_product_attr_value")
+public class ProductAttrValue {
+    /**
+     * 主键
+     */
+    @Id
+    @GeneratedValue(strategy = GenerationType.IDENTITY)
+    private Long id;
+
+    /**
+     * 商品ID
+     */
+    @Column(name = "product_id")
+    @ApiModelProperty(value = "商品ID")
+    private Long productId;
+
+    /**
+     * SKU编号
+     */
+    @Column(name = "sku_code")
+    @ApiModelProperty(value = "SKU编号")
+    private String skuCode;
+
+    /**
+     * 商品属性索引值 (attr_value|attr_value[|....])
+     */
+    @ApiModelProperty(value = "商品属性索引值 (attr_value|attr_value[|....])")
+    private String suk;
+
+    /**
+     * 属性对应的库存
+     */
+    @ApiModelProperty(value = "属性对应的库存")
+    private Integer stock;
+
+    /**
+     * 库存预警值
+     */
+    @ApiModelProperty(value = "库存预警值")
+    @Column(name = "stock_threshold")
+    private Integer stockThreshold;
+
+    /**
+     * 销量
+     */
+    @ApiModelProperty(value = "销量")
+    private Integer sales;
+
+    /**
+     * 属性金额
+     */
+    @ApiModelProperty(value = "属性金额")
+    private BigDecimal price;
+
+    /**
+     * 图片
+     */
+    @ApiModelProperty(value = "图片")
+    private String image;
+
+    /**
+     * 成本价
+     */
+    @ApiModelProperty(value = "成本价")
+    private BigDecimal cost;
+
+    /**
+     * 原价
+     */
+    @ApiModelProperty(value = "原价")
+    @Column(name = "ot_price")
+    private BigDecimal otPrice;
+
+    /**
+     * 重量
+     */
+    @ApiModelProperty(value = "重量")
+    private BigDecimal weight;
+
+    /**
+     * 体积
+     */
+    @ApiModelProperty(value = "体积")
+    private BigDecimal volume;
+
+//    /**
+//     * 一级返佣
+//     */
+//    private BigDecimal brokerage;
+//
+//    /**
+//     * 二级返佣
+//     */
+//    @Column(name = "brokerage_two")
+//    private BigDecimal brokerageTwo;
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
+    private Integer type;
+
+    /**
+     * 活动限购数量
+     */
+    @ApiModelProperty(value = "活动限购数量")
+    private Integer quota;
+
+    /**
+     * 活动限购数量显示
+     */
+    @ApiModelProperty(value = "活动限购数量显示")
+    @Column(name = "quota_show")
+    private Integer quotaShow;
+
+    /**
+     * 创建时间
+     */
+    @Column(name = "create_time")
+    private Date createTime;
+
+    /**
+     * 更新时间
+     */
+    @Column(name = "update_time")
+    private Date updateTime;
+
+    /**
+     * 创建人id
+     */
+    @Column(name = "create_user_id")
+    private Long createUserId;
+
+    /**
+     * 更新人id
+     */
+    @Column(name = "update_user_id")
+    private Long updateUserId;
+
+    /**
+     * 是否删除
+     */
+    @Column(name = "is_delete")
+    private Integer isDelete;
+
+    /**
+     * attr_values 创建更新时的属性对应
+     */
+    @Column(name = "attr_value")
+    @ApiModelProperty(value = "attr_values 创建更新时的属性对应")
+    private String attrValue;
+
+}

+ 2 - 2
mall-service/src/main/java/com/txz/mall/model/StoreFlashActivity.java

@@ -20,9 +20,9 @@ public class StoreFlashActivity {
     private String name;
 
     /**
-     * 活动类型 0=商品,1=拼团 ,2=秒杀
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
      */
-    @ApiModelProperty(value = "活动类型 0=商品,1=拼团 ,2=秒杀")
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
     private Integer type;
 
     /**

+ 2 - 2
mall-service/src/main/java/com/txz/mall/model/StoreProductAttrResult.java

@@ -25,9 +25,9 @@ public class StoreProductAttrResult {
     private Long productId;
 
     /**
-     * 活动类型 0=商品,1=拼团,2=秒杀
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
      */
-    @ApiModelProperty(value = "活动类型 0=商品,1=拼团,2=秒杀")
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
     private Integer type;
 
     /**

+ 1 - 1
mall-service/src/main/java/com/txz/mall/service/CategoryService.java

@@ -2,7 +2,7 @@ package com.txz.mall.service;
 
 import com.txz.mall.core.Service;
 import com.txz.mall.model.Category;
-import com.txz.mall.vo.CategoryTreeVO;
+import vo.CategoryTreeVO;
 
 import java.util.List;
 

+ 22 - 0
mall-service/src/main/java/com/txz/mall/service/ProductAttrService.java

@@ -0,0 +1,22 @@
+package com.txz.mall.service;
+
+import com.txz.mall.core.Service;
+import com.txz.mall.model.ProductAttr;
+
+import java.util.List;
+
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+public interface ProductAttrService extends Service<ProductAttr> {
+
+    /**
+     * 获取商品规格列表
+     *
+     * @param productId 商品id
+     * @param type      商品类型
+     * @return List
+     */
+    List<ProductAttr> getListByProductIdAndType(Long productId, Integer type);
+}

+ 22 - 0
mall-service/src/main/java/com/txz/mall/service/ProductAttrValueService.java

@@ -0,0 +1,22 @@
+package com.txz.mall.service;
+
+import com.txz.mall.core.Service;
+import com.txz.mall.model.ProductAttrValue;
+
+import java.util.List;
+
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+public interface ProductAttrValueService extends Service<ProductAttrValue> {
+
+    /**
+     * 获取商品规格列表
+     *
+     * @param productId 商品id
+     * @param type      商品类型
+     * @return List
+     */
+    List<ProductAttrValue> getListByProductIdAndType(Long productId, Integer type);
+}

+ 1 - 1
mall-service/src/main/java/com/txz/mall/service/StoreOrderService.java

@@ -2,7 +2,7 @@ package com.txz.mall.service;
 
 import com.txz.mall.core.Service;
 import com.txz.mall.model.StoreOrder;
-import com.txz.mall.vo.StoreOrderCountItemVO;
+import vo.StoreOrderCountItemVO;
 
 
 /**

+ 1 - 1
mall-service/src/main/java/com/txz/mall/service/StorePinkService.java

@@ -2,7 +2,7 @@ package com.txz.mall.service;
 
 import com.txz.mall.core.Service;
 import com.txz.mall.model.StorePink;
-import com.txz.mall.vo.StorePinkDetailVO;
+import vo.StorePinkDetailVO;
 
 import java.util.List;
 

+ 9 - 0
mall-service/src/main/java/com/txz/mall/service/StoreProductService.java

@@ -3,6 +3,7 @@ package com.txz.mall.service;
 import com.txz.mall.core.Service;
 import com.txz.mall.model.StoreProduct;
 import org.springframework.web.multipart.MultipartFile;
+import vo.StoreProductInfoVO;
 
 import javax.servlet.http.HttpServletResponse;
 
@@ -25,4 +26,12 @@ public interface StoreProductService extends Service<StoreProduct> {
      * @param response 响应
      */
     void exportFile(HttpServletResponse response);
+
+    /**
+     * 商品详情(管理端)
+     *
+     * @param id 商品id
+     * @return StoreProductInfoResponse
+     */
+    StoreProductInfoVO getInfo(Integer id);
 }

+ 1 - 1
mall-service/src/main/java/com/txz/mall/service/impl/CategoryServiceImpl.java

@@ -8,12 +8,12 @@ import com.txz.mall.core.ServiceException;
 import com.txz.mall.dao.CategoryMapper;
 import com.txz.mall.model.Category;
 import com.txz.mall.service.CategoryService;
-import com.txz.mall.vo.CategoryTreeVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.CategoryTreeVO;
 
 import javax.annotation.Resource;
 import java.util.*;

+ 34 - 0
mall-service/src/main/java/com/txz/mall/service/impl/ProductAttrServiceImpl.java

@@ -0,0 +1,34 @@
+package com.txz.mall.service.impl;
+
+import com.txz.mall.core.AbstractService;
+import com.txz.mall.dao.ProductAttrMapper;
+import com.txz.mall.model.ProductAttr;
+import com.txz.mall.service.ProductAttrService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+@Service
+@Transactional
+public class ProductAttrServiceImpl extends AbstractService<ProductAttr> implements ProductAttrService {
+    @Resource
+    private ProductAttrMapper mProductAttrMapper;
+
+    @Override
+    public List<ProductAttr> getListByProductIdAndType(Long productId, Integer type) {
+        Condition condition = new Condition(ProductAttr.class);
+        Example.Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        criteria.andEqualTo("productId", productId);
+        criteria.andEqualTo("type", type);
+        return this.findByCondition(condition);
+    }
+}

+ 34 - 0
mall-service/src/main/java/com/txz/mall/service/impl/ProductAttrValueServiceImpl.java

@@ -0,0 +1,34 @@
+package com.txz.mall.service.impl;
+
+import com.txz.mall.core.AbstractService;
+import com.txz.mall.dao.ProductAttrValueMapper;
+import com.txz.mall.model.ProductAttrValue;
+import com.txz.mall.service.ProductAttrValueService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example;
+
+import javax.annotation.Resource;
+import java.util.List;
+
+
+/**
+ * Created by CodeGenerator on 2025/07/16.
+ */
+@Service
+@Transactional
+public class ProductAttrValueServiceImpl extends AbstractService<ProductAttrValue> implements ProductAttrValueService {
+    @Resource
+    private ProductAttrValueMapper mProductAttrValueMapper;
+
+    @Override
+    public List<ProductAttrValue> getListByProductIdAndType(Long productId, Integer type) {
+        Condition condition = new Condition(ProductAttrValue.class);
+        Example.Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        criteria.andEqualTo("productId", productId);
+        criteria.andEqualTo("type", type);
+        return this.findByCondition(condition);
+    }
+}

+ 83 - 11
mall-service/src/main/java/com/txz/mall/service/impl/StoreOrderServiceImpl.java

@@ -1,15 +1,20 @@
 package com.txz.mall.service.impl;
 
+import cn.hutool.core.util.ObjectUtil;
+import cn.hutool.core.util.StrUtil;
 import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.dao.StoreOrderMapper;
 import com.txz.mall.model.StoreOrder;
 import com.txz.mall.service.StoreOrderService;
-import com.txz.mall.vo.StoreOrderCountItemVO;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
+import tk.mybatis.mapper.entity.Condition;
+import tk.mybatis.mapper.entity.Example;
+import vo.StoreOrderCountItemVO;
 
 import javax.annotation.Resource;
+import java.util.Arrays;
 
 
 /**
@@ -52,16 +57,83 @@ public class StoreOrderServiceImpl extends AbstractService<StoreOrder> implement
 
     private Integer getCount(String dateLimit, String status, Integer type) {
         //总数只计算时间
-//        QueryWrapper<StoreOrder> queryWrapper = new QueryWrapper<>();
-//        if (StrUtil.isNotBlank(dateLimit)) {
-//            dateLimitUtilVo dateLimitUtilVo = DateUtil.getDateLimit(dateLimit);
-//            queryWrapper.between("create_time", dateLimitUtilVo.getStartTime(), dateLimitUtilVo.getEndTime());
-//        }
-//        getStatusWhereNew(queryWrapper, status);
-//        if (ObjectUtil.isNotNull(type)) {
-//            queryWrapper.eq("type", type);
-//        }
-//        return dao.selectCount(queryWrapper);
+        Condition condition = new Condition(StoreOrder.class);
+        Example.Criteria criteria = condition.createCriteria();
+        criteria.andEqualTo("isDelete", 0);
+        getStatusWhereNew(criteria, status);
+        if (ObjectUtil.isNotNull(type)) {
+            criteria.andEqualTo("type", type);
+        }
+        condition.setCountProperty("id");
         return 0;
     }
+
+    /**
+     * 根据订单状态获取where条件
+     *
+     * @param status String 类型
+     */
+    private void getStatusWhereNew(Example.Criteria criteria, String status) {
+        if (StrUtil.isBlank(status)) {
+            return;
+        }
+        switch (status) {
+            case Constants.ORDER_STATUS_ALL: //全部
+                break;
+            case Constants.ORDER_STATUS_UNPAID: //未支付
+                criteria.andEqualTo("paid", 0);//支付状态
+                criteria.andEqualTo("status", 0); //订单状态
+                criteria.andEqualTo("isDelete", 0);//删除状态
+                break;
+            case Constants.ORDER_STATUS_NOT_SHIPPED: //未发货
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("status", 0);
+                criteria.andEqualTo("refundStatus", 0);
+                criteria.andEqualTo("shippingType", 1);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_SPIKE: //待收货
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("status", 1);
+                criteria.andEqualTo("refundStatus", 0);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_BARGAIN: //待评价
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("status", 2);
+                criteria.andEqualTo("refundStatus", 0);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_COMPLETE: //交易完成
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("status", 3);
+                criteria.andEqualTo("refundStatus", 0);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_TOBE_WRITTEN_OFF: //待核销
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("status", 0);
+                criteria.andEqualTo("refundStatus", 0);
+                criteria.andEqualTo("shippingType", 2);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_REFUNDING: //退款中
+                criteria.andEqualTo("paid", 1);
+                criteria.andIn("refundStatus", Arrays.asList(1, 3));
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_REFUNDED: //已退款
+                criteria.andEqualTo("paid", 1);
+                criteria.andEqualTo("refundStatus", 2);
+                criteria.andEqualTo("isDelete", 0);
+                break;
+            case Constants.ORDER_STATUS_DELETED: //已删除
+                criteria.andEqualTo("isDelete", 1);
+                break;
+            default:
+                criteria.andEqualTo("paid", 1);
+                criteria.andNotEqualTo("refundStatus", 2);
+                break;
+        }
+    }
 }

+ 1 - 1
mall-service/src/main/java/com/txz/mall/service/impl/StorePinkServiceImpl.java

@@ -7,12 +7,12 @@ import com.txz.mall.model.StoreOrder;
 import com.txz.mall.model.StorePink;
 import com.txz.mall.service.StoreOrderService;
 import com.txz.mall.service.StorePinkService;
-import com.txz.mall.vo.StorePinkDetailVO;
 import org.springframework.beans.BeanUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.StorePinkDetailVO;
 
 import javax.annotation.Resource;
 import java.util.Comparator;

+ 89 - 0
mall-service/src/main/java/com/txz/mall/service/impl/StoreProductServiceImpl.java

@@ -1,18 +1,29 @@
 package com.txz.mall.service.impl;
 
+import cn.hutool.core.collection.CollUtil;
 import cn.hutool.core.io.FileUtil;
+import cn.hutool.core.util.ObjectUtil;
 import com.alibaba.excel.EasyExcel;
 import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
+import com.txz.mall.constants.Constants;
 import com.txz.mall.core.AbstractService;
 import com.txz.mall.core.ServiceException;
 import com.txz.mall.dao.StoreProductMapper;
+import com.txz.mall.model.ProductAttr;
+import com.txz.mall.model.ProductAttrValue;
 import com.txz.mall.model.StoreProduct;
+import com.txz.mall.service.ProductAttrService;
+import com.txz.mall.service.ProductAttrValueService;
 import com.txz.mall.service.StoreProductService;
 import com.txz.mall.util.EasyExcelUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.springframework.beans.BeanUtils;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import org.springframework.web.multipart.MultipartFile;
+import vo.AttrValueVO;
+import vo.StoreProductInfoVO;
 
 import javax.annotation.Resource;
 import javax.servlet.http.HttpServletResponse;
@@ -20,6 +31,7 @@ import java.io.OutputStream;
 import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
 
 
 /**
@@ -31,6 +43,11 @@ import java.util.List;
 public class StoreProductServiceImpl extends AbstractService<StoreProduct> implements StoreProductService {
     @Resource
     private StoreProductMapper storeProductMapper;
+    @Autowired
+    private ProductAttrService attrService;
+
+    @Autowired
+    private ProductAttrValueService attrValueService;
 
     @Override
     public void importFile(MultipartFile file) {
@@ -68,4 +85,76 @@ public class StoreProductServiceImpl extends AbstractService<StoreProduct> imple
             throw new ServiceException("模板下载失败, 请联系管理员");
         }
     }
+
+    @Override
+    public StoreProductInfoVO getInfo(Integer id) {
+        StoreProduct storeProduct = findById(id);
+        if (ObjectUtil.isNull(storeProduct)) {
+            throw new ServiceException("未找到对应商品信息");
+        }
+        StoreProductInfoVO storeProductResponse = new StoreProductInfoVO();
+        BeanUtils.copyProperties(storeProduct, storeProductResponse);
+
+        // 设置商品所参与的活动
+        List<String> activityList = getProductActivityList(storeProduct.getActivity());
+        storeProductResponse.setActivity(activityList);
+
+        List<ProductAttr> attrList = attrService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL);
+        storeProductResponse.setAttr(attrList);
+
+        List<ProductAttrValue> attrValueList = attrValueService.getListByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL);
+        List<AttrValueVO> valueResponseList = attrValueList.stream().map(e -> {
+            AttrValueVO valueResponse = new AttrValueVO();
+            BeanUtils.copyProperties(e, valueResponse);
+            return valueResponse;
+        }).collect(Collectors.toList());
+        storeProductResponse.setAttrValue(valueResponseList);
+
+//        StoreProductDescription sd = storeProductDescriptionService.getByProductIdAndType(storeProduct.getId(), Constants.PRODUCT_TYPE_NORMAL);
+//        if (ObjectUtil.isNotNull(sd)) {
+//            storeProductResponse.setContent(ObjectUtil.isNull(sd.getDescription()) ? "" : sd.getDescription());
+//        }
+//
+//        // 获取已关联的优惠券
+//        List<StoreProductCoupon> storeProductCoupons = storeProductCouponService.getListByProductId(storeProduct.getId());
+//        if (CollUtil.isNotEmpty(storeProductCoupons)) {
+//            List<Integer> ids = storeProductCoupons.stream().map(StoreProductCoupon::getIssueCouponId).collect(Collectors.toList());
+//            storeProductResponse.setCouponIds(ids);
+//        }
+        return storeProductResponse;
+    }
+
+    /**
+     * 商品活动字符列表
+     *
+     * @param activityStr 商品活动字符串
+     * @return 商品活动字符列表
+     */
+    private List<String> getProductActivityList(String activityStr) {
+        List<String> activityList = CollUtil.newArrayList();
+        if ("0, 1, 2, 3".equals(activityStr)) {
+            activityList.add(Constants.PRODUCT_TYPE_NORMAL_STR);
+            activityList.add(Constants.PRODUCT_TYPE_SECKILL_STR);
+            activityList.add(Constants.PRODUCT_TYPE_BARGAIN_STR);
+            activityList.add(Constants.PRODUCT_TYPE_PINGTUAN_STR);
+            return activityList;
+        }
+        String[] split = activityStr.split(",");
+        for (String s : split) {
+            Integer integer = Integer.valueOf(s);
+            if (integer.equals(Constants.PRODUCT_TYPE_NORMAL)) {
+                activityList.add(Constants.PRODUCT_TYPE_NORMAL_STR);
+            }
+            if (integer.equals(Constants.PRODUCT_TYPE_SECKILL)) {
+                activityList.add(Constants.PRODUCT_TYPE_SECKILL_STR);
+            }
+            if (integer.equals(Constants.PRODUCT_TYPE_BARGAIN)) {
+                activityList.add(Constants.PRODUCT_TYPE_BARGAIN_STR);
+            }
+            if (integer.equals(Constants.PRODUCT_TYPE_PINGTUAN)) {
+                activityList.add(Constants.PRODUCT_TYPE_PINGTUAN_STR);
+            }
+        }
+        return activityList;
+    }
 }

+ 2 - 2
mall-service/src/main/java/com/txz/mall/service/impl/UserSignServiceImpl.java

@@ -9,14 +9,14 @@ import com.txz.mall.model.SystemGroupData;
 import com.txz.mall.model.UserSign;
 import com.txz.mall.service.SystemGroupDataService;
 import com.txz.mall.service.UserSignService;
-import com.txz.mall.vo.GroupDataFormCheckVO;
-import com.txz.mall.vo.GroupDataFormItemCheckVO;
 import org.apache.commons.lang.StringUtils;
 import org.apache.commons.lang.time.DateUtils;
 import org.springframework.stereotype.Service;
 import org.springframework.transaction.annotation.Transactional;
 import tk.mybatis.mapper.entity.Condition;
 import tk.mybatis.mapper.entity.Example;
+import vo.GroupDataFormCheckVO;
+import vo.GroupDataFormItemCheckVO;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/CategoryDTO.java → mall-service/src/main/java/dto/CategoryDTO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/CategorySearchDTO.java → mall-service/src/main/java/dto/CategorySearchDTO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 237 - 0
mall-service/src/main/java/dto/ProductAttrDTO.java

@@ -0,0 +1,237 @@
+/*
+ *
+ * ProductAttrDTO.java
+ * Copyright(C) 2017-2020 fendo公司
+ * @date 2025-07-16
+ */
+package dto;
+
+import java.io.Serializable;
+import java.util.Date;
+
+public class ProductAttrDTO implements Serializable {
+    /**
+     * m_product_attr
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 商品ID
+     */
+    private Long productId;
+    /**
+     * 属性名
+     */
+    private String attrName;
+    /**
+     * 属性值
+     */
+    private String attrValues;
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    private Boolean type;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+    /**
+     * 创建人id
+     */
+    private Long createUserId;
+    /**
+     * 更新人id
+     */
+    private Long updateUserId;
+    /**
+     * 是否删除
+     */
+    private Byte isDelete;
+
+    /**
+     * 主键
+     *
+     * @return id 主键
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 主键
+     *
+     * @param id 主键
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 商品ID
+     *
+     * @return product_id 商品ID
+     */
+    public Long getProductId() {
+        return productId;
+    }
+
+    /**
+     * 商品ID
+     *
+     * @param productId 商品ID
+     */
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    /**
+     * 属性名
+     *
+     * @return attr_name 属性名
+     */
+    public String getAttrName() {
+        return attrName;
+    }
+
+    /**
+     * 属性名
+     *
+     * @param attrName 属性名
+     */
+    public void setAttrName(String attrName) {
+        this.attrName = attrName;
+    }
+
+    /**
+     * 属性值
+     *
+     * @return attr_values 属性值
+     */
+    public String getAttrValues() {
+        return attrValues;
+    }
+
+    /**
+     * 属性值
+     *
+     * @param attrValues 属性值
+     */
+    public void setAttrValues(String attrValues) {
+        this.attrValues = attrValues;
+    }
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     *
+     * @return type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    public Boolean getType() {
+        return type;
+    }
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     *
+     * @param type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    public void setType(Boolean type) {
+        this.type = type;
+    }
+
+    /**
+     * 创建时间
+     *
+     * @return create_time 创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * 创建时间
+     *
+     * @param createTime 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 更新时间
+     *
+     * @return update_time 更新时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * 更新时间
+     *
+     * @param updateTime 更新时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 创建人id
+     *
+     * @return create_user_id 创建人id
+     */
+    public Long getCreateUserId() {
+        return createUserId;
+    }
+
+    /**
+     * 创建人id
+     *
+     * @param createUserId 创建人id
+     */
+    public void setCreateUserId(Long createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    /**
+     * 更新人id
+     *
+     * @return update_user_id 更新人id
+     */
+    public Long getUpdateUserId() {
+        return updateUserId;
+    }
+
+    /**
+     * 更新人id
+     *
+     * @param updateUserId 更新人id
+     */
+    public void setUpdateUserId(Long updateUserId) {
+        this.updateUserId = updateUserId;
+    }
+
+    /**
+     * 是否删除
+     *
+     * @return is_delete 是否删除
+     */
+    public Byte getIsDelete() {
+        return isDelete;
+    }
+
+    /**
+     * 是否删除
+     *
+     * @param isDelete 是否删除
+     */
+    public void setIsDelete(Byte isDelete) {
+        this.isDelete = isDelete;
+    }
+}

+ 546 - 0
mall-service/src/main/java/dto/ProductAttrValueDTO.java

@@ -0,0 +1,546 @@
+/*
+ *
+ * ProductAttrValueDTO.java
+ * Copyright(C) 2017-2020 fendo公司
+ * @date 2025-07-16
+ */
+package dto;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+import java.util.Date;
+
+public class ProductAttrValueDTO implements Serializable {
+    /**
+     * m_product_attr_value
+     */
+    private static final long serialVersionUID = 1L;
+    /**
+     * 主键
+     */
+    private Long id;
+    /**
+     * 商品ID
+     */
+    private Long productId;
+    /**
+     * SKU编号
+     */
+    private String skuCode;
+    /**
+     * 商品属性索引值 (attr_value|attr_value[|....])
+     */
+    private String suk;
+    /**
+     * 属性对应的库存
+     */
+    private Integer stock;
+    /**
+     * 库存预警值
+     */
+    private Integer stockThreshold;
+    /**
+     * 销量
+     */
+    private Integer sales;
+    /**
+     * 属性金额
+     */
+    private BigDecimal price;
+    /**
+     * 图片
+     */
+    private String image;
+    /**
+     * 成本价
+     */
+    private BigDecimal cost;
+    /**
+     * 原价
+     */
+    private BigDecimal otPrice;
+    /**
+     * 重量
+     */
+    private BigDecimal weight;
+    /**
+     * 体积
+     */
+    private BigDecimal volume;
+    /**
+     * 一级返佣
+     */
+    private BigDecimal brokerage;
+    /**
+     * 二级返佣
+     */
+    private BigDecimal brokerageTwo;
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    private Boolean type;
+    /**
+     * 活动限购数量
+     */
+    private Integer quota;
+    /**
+     * 活动限购数量显示
+     */
+    private Integer quotaShow;
+    /**
+     * 创建时间
+     */
+    private Date createTime;
+    /**
+     * 更新时间
+     */
+    private Date updateTime;
+    /**
+     * 创建人id
+     */
+    private Long createUserId;
+    /**
+     * 更新人id
+     */
+    private Long updateUserId;
+    /**
+     * 是否删除
+     */
+    private Byte isDelete;
+    /**
+     * attr_values 创建更新时的属性对应
+     */
+    private String attrValue;
+
+    /**
+     * 主键
+     *
+     * @return id 主键
+     */
+    public Long getId() {
+        return id;
+    }
+
+    /**
+     * 主键
+     *
+     * @param id 主键
+     */
+    public void setId(Long id) {
+        this.id = id;
+    }
+
+    /**
+     * 商品ID
+     *
+     * @return product_id 商品ID
+     */
+    public Long getProductId() {
+        return productId;
+    }
+
+    /**
+     * 商品ID
+     *
+     * @param productId 商品ID
+     */
+    public void setProductId(Long productId) {
+        this.productId = productId;
+    }
+
+    /**
+     * SKU编号
+     *
+     * @return sku_code SKU编号
+     */
+    public String getSkuCode() {
+        return skuCode;
+    }
+
+    /**
+     * SKU编号
+     *
+     * @param skuCode SKU编号
+     */
+    public void setSkuCode(String skuCode) {
+        this.skuCode = skuCode;
+    }
+
+    /**
+     * 商品属性索引值 (attr_value|attr_value[|....])
+     *
+     * @return suk 商品属性索引值 (attr_value|attr_value[|....])
+     */
+    public String getSuk() {
+        return suk;
+    }
+
+    /**
+     * 商品属性索引值 (attr_value|attr_value[|....])
+     *
+     * @param suk 商品属性索引值 (attr_value|attr_value[|....])
+     */
+    public void setSuk(String suk) {
+        this.suk = suk;
+    }
+
+    /**
+     * 属性对应的库存
+     *
+     * @return stock 属性对应的库存
+     */
+    public Integer getStock() {
+        return stock;
+    }
+
+    /**
+     * 属性对应的库存
+     *
+     * @param stock 属性对应的库存
+     */
+    public void setStock(Integer stock) {
+        this.stock = stock;
+    }
+
+    /**
+     * 库存预警值
+     *
+     * @return stock_threshold 库存预警值
+     */
+    public Integer getStockThreshold() {
+        return stockThreshold;
+    }
+
+    /**
+     * 库存预警值
+     *
+     * @param stockThreshold 库存预警值
+     */
+    public void setStockThreshold(Integer stockThreshold) {
+        this.stockThreshold = stockThreshold;
+    }
+
+    /**
+     * 销量
+     *
+     * @return sales 销量
+     */
+    public Integer getSales() {
+        return sales;
+    }
+
+    /**
+     * 销量
+     *
+     * @param sales 销量
+     */
+    public void setSales(Integer sales) {
+        this.sales = sales;
+    }
+
+    /**
+     * 属性金额
+     *
+     * @return price 属性金额
+     */
+    public BigDecimal getPrice() {
+        return price;
+    }
+
+    /**
+     * 属性金额
+     *
+     * @param price 属性金额
+     */
+    public void setPrice(BigDecimal price) {
+        this.price = price;
+    }
+
+    /**
+     * 图片
+     *
+     * @return image 图片
+     */
+    public String getImage() {
+        return image;
+    }
+
+    /**
+     * 图片
+     *
+     * @param image 图片
+     */
+    public void setImage(String image) {
+        this.image = image;
+    }
+
+    /**
+     * 成本价
+     *
+     * @return cost 成本价
+     */
+    public BigDecimal getCost() {
+        return cost;
+    }
+
+    /**
+     * 成本价
+     *
+     * @param cost 成本价
+     */
+    public void setCost(BigDecimal cost) {
+        this.cost = cost;
+    }
+
+    /**
+     * 原价
+     *
+     * @return ot_price 原价
+     */
+    public BigDecimal getOtPrice() {
+        return otPrice;
+    }
+
+    /**
+     * 原价
+     *
+     * @param otPrice 原价
+     */
+    public void setOtPrice(BigDecimal otPrice) {
+        this.otPrice = otPrice;
+    }
+
+    /**
+     * 重量
+     *
+     * @return weight 重量
+     */
+    public BigDecimal getWeight() {
+        return weight;
+    }
+
+    /**
+     * 重量
+     *
+     * @param weight 重量
+     */
+    public void setWeight(BigDecimal weight) {
+        this.weight = weight;
+    }
+
+    /**
+     * 体积
+     *
+     * @return volume 体积
+     */
+    public BigDecimal getVolume() {
+        return volume;
+    }
+
+    /**
+     * 体积
+     *
+     * @param volume 体积
+     */
+    public void setVolume(BigDecimal volume) {
+        this.volume = volume;
+    }
+
+    /**
+     * 一级返佣
+     *
+     * @return brokerage 一级返佣
+     */
+    public BigDecimal getBrokerage() {
+        return brokerage;
+    }
+
+    /**
+     * 一级返佣
+     *
+     * @param brokerage 一级返佣
+     */
+    public void setBrokerage(BigDecimal brokerage) {
+        this.brokerage = brokerage;
+    }
+
+    /**
+     * 二级返佣
+     *
+     * @return brokerage_two 二级返佣
+     */
+    public BigDecimal getBrokerageTwo() {
+        return brokerageTwo;
+    }
+
+    /**
+     * 二级返佣
+     *
+     * @param brokerageTwo 二级返佣
+     */
+    public void setBrokerageTwo(BigDecimal brokerageTwo) {
+        this.brokerageTwo = brokerageTwo;
+    }
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     *
+     * @return type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    public Boolean getType() {
+        return type;
+    }
+
+    /**
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     *
+     * @param type 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
+     */
+    public void setType(Boolean type) {
+        this.type = type;
+    }
+
+    /**
+     * 活动限购数量
+     *
+     * @return quota 活动限购数量
+     */
+    public Integer getQuota() {
+        return quota;
+    }
+
+    /**
+     * 活动限购数量
+     *
+     * @param quota 活动限购数量
+     */
+    public void setQuota(Integer quota) {
+        this.quota = quota;
+    }
+
+    /**
+     * 活动限购数量显示
+     *
+     * @return quota_show 活动限购数量显示
+     */
+    public Integer getQuotaShow() {
+        return quotaShow;
+    }
+
+    /**
+     * 活动限购数量显示
+     *
+     * @param quotaShow 活动限购数量显示
+     */
+    public void setQuotaShow(Integer quotaShow) {
+        this.quotaShow = quotaShow;
+    }
+
+    /**
+     * 创建时间
+     *
+     * @return create_time 创建时间
+     */
+    public Date getCreateTime() {
+        return createTime;
+    }
+
+    /**
+     * 创建时间
+     *
+     * @param createTime 创建时间
+     */
+    public void setCreateTime(Date createTime) {
+        this.createTime = createTime;
+    }
+
+    /**
+     * 更新时间
+     *
+     * @return update_time 更新时间
+     */
+    public Date getUpdateTime() {
+        return updateTime;
+    }
+
+    /**
+     * 更新时间
+     *
+     * @param updateTime 更新时间
+     */
+    public void setUpdateTime(Date updateTime) {
+        this.updateTime = updateTime;
+    }
+
+    /**
+     * 创建人id
+     *
+     * @return create_user_id 创建人id
+     */
+    public Long getCreateUserId() {
+        return createUserId;
+    }
+
+    /**
+     * 创建人id
+     *
+     * @param createUserId 创建人id
+     */
+    public void setCreateUserId(Long createUserId) {
+        this.createUserId = createUserId;
+    }
+
+    /**
+     * 更新人id
+     *
+     * @return update_user_id 更新人id
+     */
+    public Long getUpdateUserId() {
+        return updateUserId;
+    }
+
+    /**
+     * 更新人id
+     *
+     * @param updateUserId 更新人id
+     */
+    public void setUpdateUserId(Long updateUserId) {
+        this.updateUserId = updateUserId;
+    }
+
+    /**
+     * 是否删除
+     *
+     * @return is_delete 是否删除
+     */
+    public Byte getIsDelete() {
+        return isDelete;
+    }
+
+    /**
+     * 是否删除
+     *
+     * @param isDelete 是否删除
+     */
+    public void setIsDelete(Byte isDelete) {
+        this.isDelete = isDelete;
+    }
+
+    /**
+     * attr_values 创建更新时的属性对应
+     *
+     * @return attr_value attr_values 创建更新时的属性对应
+     */
+    public String getAttrValue() {
+        return attrValue;
+    }
+
+    /**
+     * attr_values 创建更新时的属性对应
+     *
+     * @param attrValue attr_values 创建更新时的属性对应
+     */
+    public void setAttrValue(String attrValue) {
+        this.attrValue = attrValue;
+    }
+}

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/ProductRankingDTO.java → mall-service/src/main/java/dto/ProductRankingDTO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.dto;
+package dto;
 
 
 import com.txz.mall.constants.Constants;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StoreCombinationDTO.java → mall-service/src/main/java/dto/StoreCombinationDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-14
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 3 - 3
mall-api/src/main/java/com/txz/mall/dto/StoreFlashActivityDTO.java → mall-service/src/main/java/dto/StoreFlashActivityDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-14
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;
@@ -28,9 +28,9 @@ public class StoreFlashActivityDTO implements Serializable {
     @ApiModelProperty(value = "活动名称")
     private String name;
     /**
-     * 活动类型 0=商品,1=拼团 ,2=秒杀
+     * 活动类型 0=商品,1=秒杀,2=砍价,3=拼团
      */
-    @ApiModelProperty(value = "活动类型 0=商品,1=拼团 ,2=秒杀")
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
     private Integer type;
     /**
      * 活动开始时间段

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StoreOrderDTO.java → mall-service/src/main/java/dto/StoreOrderDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-15
  */
-package com.txz.mall.dto;
+package dto;
 
 import java.io.Serializable;
 import java.math.BigDecimal;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StorePinkDTO.java → mall-service/src/main/java/dto/StorePinkDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-15
  */
-package com.txz.mall.dto;
+package dto;
 
 import java.io.Serializable;
 import java.math.BigDecimal;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StoreProductAttrResultDTO.java → mall-service/src/main/java/dto/StoreProductAttrResultDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StoreProductDTO.java → mall-service/src/main/java/dto/StoreProductDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-10
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/StoreProductRuleDTO.java → mall-service/src/main/java/dto/StoreProductRuleDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/SystemDictDataDTO.java → mall-service/src/main/java/dto/SystemDictDataDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-14
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/SystemDictTypeDTO.java → mall-service/src/main/java/dto/SystemDictTypeDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-14
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/SystemFormTempDTO.java → mall-service/src/main/java/dto/SystemFormTempDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/SystemGroupDTO.java → mall-service/src/main/java/dto/SystemGroupDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/SystemGroupDataDTO.java → mall-service/src/main/java/dto/SystemGroupDataDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/UserAddressDTO.java → mall-service/src/main/java/dto/UserAddressDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-15
  */
-package com.txz.mall.dto;
+package dto;
 
 import java.io.Serializable;
 import java.util.Date;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/dto/UserSignDTO.java → mall-service/src/main/java/dto/UserSignDTO.java

@@ -4,7 +4,7 @@
  * Copyright(C) 2017-2020 fendo公司
  * @date 2025-07-11
  */
-package com.txz.mall.dto;
+package dto;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 72 - 0
mall-service/src/main/java/vo/AttrValueVO.java

@@ -0,0 +1,72 @@
+package vo;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.math.BigDecimal;
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "AttrValueResponse对象", description = "商品属性值响应对象")
+public class AttrValueVO implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+    @ApiModelProperty(value = "ID")
+    private Long id;
+
+    @ApiModelProperty(value = "商品ID")
+    private Long productId;
+
+    @ApiModelProperty(value = "sku")
+    private String suk;
+
+    @ApiModelProperty(value = "属性对应的库存")
+    private Integer stock;
+
+    @ApiModelProperty(value = "销量")
+    private Integer sales;
+
+    @ApiModelProperty(value = "属性金额")
+    private BigDecimal price;
+
+    @ApiModelProperty(value = "图片")
+    private String image;
+
+    @ApiModelProperty(value = "成本价")
+    private BigDecimal cost;
+
+    @ApiModelProperty(value = "原价")
+    private BigDecimal otPrice;
+
+    @ApiModelProperty(value = "重量")
+    private BigDecimal weight;
+
+    @ApiModelProperty(value = "体积")
+    private BigDecimal volume;
+
+    @ApiModelProperty(value = "一级返佣")
+    private BigDecimal brokerage;
+
+    @ApiModelProperty(value = "二级返佣")
+    private BigDecimal brokerageTwo;
+
+    @ApiModelProperty(value = "活动类型 0=商品,1=秒杀,2=砍价,3=拼团")
+    private Integer type;
+
+    @ApiModelProperty(value = "活动限购数量")
+    private Integer quota;
+
+    @ApiModelProperty(value = "活动限购数量显示")
+    private Integer quotaShow;
+
+    @ApiModelProperty(value = "attrValue字段")
+    private String attrValue;
+
+    @ApiModelProperty(value = "砍价商品最低价|砍价专用字段")
+    private BigDecimal minPrice;
+}

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/CategoryTreeVO.java → mall-service/src/main/java/vo/CategoryTreeVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import com.fasterxml.jackson.annotation.JsonInclude;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/FlashActivityVO.java → mall-service/src/main/java/vo/FlashActivityVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import io.swagger.annotations.ApiModelProperty;
 import lombok.Data;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/GroupDataFormCheckVO.java → mall-service/src/main/java/vo/GroupDataFormCheckVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/GroupDataFormItemCheckVO.java → mall-service/src/main/java/vo/GroupDataFormItemCheckVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/StoreOrderCountItemVO.java → mall-service/src/main/java/vo/StoreOrderCountItemVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 1 - 1
mall-api/src/main/java/com/txz/mall/vo/StorePinkDetailVO.java → mall-service/src/main/java/vo/StorePinkDetailVO.java

@@ -1,4 +1,4 @@
-package com.txz.mall.vo;
+package vo;
 
 import io.swagger.annotations.ApiModel;
 import io.swagger.annotations.ApiModelProperty;

+ 152 - 0
mall-service/src/main/java/vo/StoreProductInfoVO.java

@@ -0,0 +1,152 @@
+package vo;
+
+import com.txz.mall.model.ProductAttr;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+import java.util.List;
+
+
+@Data
+@EqualsAndHashCode(callSuper = false)
+@Accessors(chain = true)
+@ApiModel(value = "StoreProductInfoResponse对象", description = "商品详情响应对象")
+public class StoreProductInfoVO implements Serializable {
+
+    private static final long serialVersionUID = 9215241889318610262L;
+
+    @ApiModelProperty(value = "商品id")
+    private Long id;
+
+    @ApiModelProperty(value = "商品图片")
+    private String image;
+
+    @ApiModelProperty(value = "轮播图")
+    private String sliderImage;
+
+    @ApiModelProperty(value = "商品名称")
+    private String storeName;
+
+    @ApiModelProperty(value = "商品简介")
+    private String storeInfo;
+
+    @ApiModelProperty(value = "关键字")
+    private String keyword;
+
+    @ApiModelProperty(value = "分类id")
+    private String cateId;
+
+    @ApiModelProperty(value = "分类中文")
+    private String cateStr;
+
+    @ApiModelProperty(value = "单位名")
+    private String unitName;
+
+    @ApiModelProperty(value = "排序")
+    private Integer sort;
+
+    @ApiModelProperty(value = "是否热卖")
+    private Boolean isHot;
+
+    @ApiModelProperty(value = "是否优惠")
+    private Boolean isBenefit;
+
+    @ApiModelProperty(value = "是否精品")
+    private Boolean isBest;
+
+    @ApiModelProperty(value = "是否新品")
+    private Boolean isNew;
+
+    @ApiModelProperty(value = "获得积分")
+    private Integer giveIntegral;
+
+    @ApiModelProperty(value = "是否优品推荐")
+    private Boolean isGood;
+
+    @ApiModelProperty(value = "是否单独分佣")
+    private Boolean isSub;
+
+    @ApiModelProperty(value = "虚拟销量")
+    private Integer ficti;
+
+    @ApiModelProperty(value = "运费模板ID")
+    private Integer tempId;
+
+    @ApiModelProperty(value = "规格 0单 1多")
+    private Boolean specType;
+
+    @ApiModelProperty(value = "活动显示排序 0=默认,1=秒杀,2=砍价,3=拼团")
+    private List<String> activity;
+
+    @ApiModelProperty(value = "商品属性")
+    private List<ProductAttr> attr;
+
+    @ApiModelProperty(value = "商品属性详情")
+    private List<AttrValueVO> attrValue;
+
+    @ApiModelProperty(value = "商品描述")
+    private String content;
+
+    @ApiModelProperty(value = "产品ID")
+    private Integer productId;
+
+    @ApiModelProperty(value = "优惠券Ids")
+    private List<Integer> couponIds;
+
+    // 以下为活动商品部分
+
+    @ApiModelProperty(value = "状态 0=关闭 1=开启|营销商品用")
+    private Integer status;
+
+    @ApiModelProperty(value = "运费模板ID|秒杀商品专用")
+    private Integer timeId;
+
+    @ApiModelProperty(value = "秒杀开启时间|秒杀专用")
+    private String startTimeStr;
+
+    @ApiModelProperty(value = "秒杀结束时间|秒杀专用")
+    private String stopTimeStr;
+
+    @ApiModelProperty(value = "当天参与秒杀次数|秒杀专用")
+    private Integer num;
+
+    @ApiModelProperty(value = "砍价开启时间|砍价专用")
+    private Long startTime;
+
+    @ApiModelProperty(value = "砍价结束时间|砍价专用")
+    private Long stopTime;
+
+    @ApiModelProperty(value = "砍价活动名称|砍价专用")
+    private String title;
+
+    @ApiModelProperty(value = "帮砍次数|砍价专用")
+    private Integer bargainNum;
+
+    @ApiModelProperty(value = "帮助砍价好友人数|砍价专用")
+    private Integer peopleNum;
+
+    @ApiModelProperty(value = "拼团订单有效时间(小时)|拼团专用")
+    private Integer effectiveTime;
+
+    @ApiModelProperty(value = "每个订单可购买数量|拼团专用")
+    private Integer onceNum;
+
+    @ApiModelProperty(value = "虚拟成团百分比|拼团专用")
+    private Integer virtualRation;
+
+    @ApiModelProperty(value = "参团人数|拼团专用")
+    private Integer people;
+
+    @ApiModelProperty(value = "商品状态|拼团专用")
+    private Boolean isShow;
+
+    @ApiModelProperty(value = "简介|拼团专用")
+    private String info;
+
+    @ApiModelProperty(value = "展示图")
+    private String flatPattern;
+}

+ 0 - 2
mall-service/src/main/resources/bootstrap.properties

@@ -58,6 +58,4 @@ management.endpoint.shutdown.enabled=true
 management.endpoints.web.base-path=/${spring.application.name}
 management.endpoints.web.path-mapping.shutdown=/shutThisBoot
 management.server.address=127.0.0.1
-server.servlet.context-path=/mall
-mybatis.configuration.auto-mapping-behavior:full
 

+ 19 - 0
mall-service/src/main/resources/mapper/ProductAttrMapper.xml

@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.txz.mall.dao.ProductAttrMapper">
+    <resultMap id="BaseResultMap" type="com.txz.mall.model.ProductAttr">
+        <!--
+          WARNING - @mbg.generated
+        -->
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="product_id" jdbcType="BIGINT" property="productId"/>
+        <result column="attr_name" jdbcType="VARCHAR" property="attrName"/>
+        <result column="attr_values" jdbcType="VARCHAR" property="attrValues"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="create_user_id" jdbcType="BIGINT" property="createUserId"/>
+        <result column="update_user_id" jdbcType="BIGINT" property="updateUserId"/>
+        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
+    </resultMap>
+</mapper>

+ 33 - 0
mall-service/src/main/resources/mapper/ProductAttrValueMapper.xml

@@ -0,0 +1,33 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="com.txz.mall.dao.ProductAttrValueMapper">
+    <resultMap id="BaseResultMap" type="com.txz.mall.model.ProductAttrValue">
+        <!--
+          WARNING - @mbg.generated
+        -->
+        <id column="id" jdbcType="BIGINT" property="id"/>
+        <result column="product_id" jdbcType="BIGINT" property="productId"/>
+        <result column="sku_code" jdbcType="VARCHAR" property="skuCode"/>
+        <result column="suk" jdbcType="VARCHAR" property="suk"/>
+        <result column="stock" jdbcType="INTEGER" property="stock"/>
+        <result column="stock_threshold" jdbcType="INTEGER" property="stockThreshold"/>
+        <result column="sales" jdbcType="INTEGER" property="sales"/>
+        <result column="price" jdbcType="DECIMAL" property="price"/>
+        <result column="image" jdbcType="VARCHAR" property="image"/>
+        <result column="cost" jdbcType="DECIMAL" property="cost"/>
+        <result column="ot_price" jdbcType="DECIMAL" property="otPrice"/>
+        <result column="weight" jdbcType="DECIMAL" property="weight"/>
+        <result column="volume" jdbcType="DECIMAL" property="volume"/>
+        <result column="brokerage" jdbcType="DECIMAL" property="brokerage"/>
+        <result column="brokerage_two" jdbcType="DECIMAL" property="brokerageTwo"/>
+        <result column="type" jdbcType="INTEGER" property="type"/>
+        <result column="quota" jdbcType="INTEGER" property="quota"/>
+        <result column="quota_show" jdbcType="INTEGER" property="quotaShow"/>
+        <result column="create_time" jdbcType="TIMESTAMP" property="createTime"/>
+        <result column="update_time" jdbcType="TIMESTAMP" property="updateTime"/>
+        <result column="create_user_id" jdbcType="BIGINT" property="createUserId"/>
+        <result column="update_user_id" jdbcType="BIGINT" property="updateUserId"/>
+        <result column="is_delete" jdbcType="INTEGER" property="isDelete"/>
+        <result column="attr_value" jdbcType="VARCHAR" property="attrValue"/>
+    </resultMap>
+</mapper>