找回密码
 立即注册
首页 业界区 业界 商品中心—4.商品属性与状态流转的技术文档 ...

商品中心—4.商品属性与状态流转的技术文档

石娅凉 2025-6-12 09:40:53
大纲
1.商品属性库系统简介
2.商品属性库系统数据库设计
3.商品属性库系统对品类添加属性
4.商品属性库系统添加属性值与属性组
5.商品属性库系统添加属性模版及模版内容
6.查询属性库系统数据相关接口
7.商品属性库系统与商品M端系统对接
8.商品状态变更流转架构设计与实现
9.商品状态变更流转的策略模式实现
10.商品状态变更流转的具体策略实现
 
1.商品属性库系统简介
(1)属性分类
(2)属性模版
(3)属性组
(4)属性库运行流程
 
(1)属性分类
为了⽅便管理商品,可以将属性分为三类:
 
一.基础属性
商品的通⽤属性,例如名称、品牌、品类等。
 
二.销售属性
商品的销售价格属性,不同销售属性的商品,其销售价会有所不同,例如⼿机的颜⾊、内存等。
 
三.搜索属性
商品搜索的属性,例如名称、品牌、品类等。
 
(2)属性模版
为了提⾼效率,合理化运营,会将商品的属性与品类绑定到⼀起。品类是以树形结构来管理的。既然属性与品类绑定在⼀起,为避免重复添加属性,会将每级品类的公共属性抽取出来作为⼀个属性模板。后期关联商品查询时,可以将属性最终展示在商品下⾯。
1.png
(3)属性组
由于商品的属性很多,为了⽅便⽤户浏览和数据⽐对,需要对属性进⾏分组管理。
 
一.电子产品属性组
2.png
二.汽车属性组
3.png
(4)属性库运行流程
一.创建属性库数据
4.png
二.查询属性库数据
5.png
三.商品对接属性库
6.png
 
2.商品属性库系统数据库设计
(1)属性相关表的关系
(2)属性相关表的详情
 
(1)属性相关表的关系
属性表管理:attribute management,简称atm。
7.png
一个品类会关联一个属性模版,一个属性模版里会有多个属性组或多个属性,一个属性组里会有多个属性,一个属性里会有多个属性值。
 
(2)属性相关表的详情
一.属性表
二.属性可选值表
三.属性组表
四.属性模板表
五.属性模板内容表
六.标品商品属性值表
 
一.属性表
  1. create table if not exists atm_attribute_info (
  2.     id int(10) auto_increment comment '主键' primary key,
  3.     category_id int(10) default null comment '品类id',
  4.     attribute_name varchar(128) not null comment '属性名称',
  5.     attribute_code varchar(128) null comment '属性编码',
  6.     attribute_type varchar(128) not null comment '属性类型,格式为json数组(1-基础属性,2-销售属性,3-搜索属性,null-其他属性)',
  7.     attribute_input_type int not null comment '属性值的输⼊⽅式(1-⽤户⾃⼰输⼊,2-单选下拉框,3-多选下拉框,4-⽇期)',
  8.     attribute_comment varchar(128) default null comment '属性说明',
  9.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  10.     create_user int not null comment '创建⼈',
  11.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  12.     update_user int not null comment '更新⼈',
  13.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  14. ) comment '属性表';
复制代码
例如添加三个属性:品牌、颜色、版本。
8.png
二.属性可选值表
  1. create table if not exists atm_attribute_value (
  2.     id int(10) auto_increment comment '主键' primary key,
  3.     attribute_id int(10) not null comment '属性id',
  4.     attribute_value varchar(128) not null comment '属性值',
  5.     sort int not null comment '排序序号',
  6.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  7.     create_user int not null comment '创建⼈',
  8.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  9.     update_user int not null comment '更新⼈',
  10.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  11. ) comment '属性值表';
复制代码
例如给颜色属性添加了3个可选值:红色、黄色、蓝色。例如给版本属性添加了3个可选值:公开版、无线耳机套装、智能手表套装。
9.png
三.属性组表
  1. create table if not exists atm_attribute_group (
  2.     id int(10) auto_increment comment '主键' primary key,
  3.     category_id int(10) default null comment '品类id',
  4.     group_name varchar(128) not null comment '属性组名称',
  5.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  6.     create_user int not null comment '创建⼈',
  7.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  8.     update_user int not null comment '更新⼈',
  9.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  10. ) comment '属性组表';
复制代码
例如添加一个属性组:基本属性组。
10.png
四.属性模板表
  1. create table atm_attribute_template (
  2.     id int auto_increment comment '主键' primary key,
  3.     template_name varchar(128) not null comment '属性模板名称',
  4.     category_id int not null comment '品类id',
  5.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  6.     create_user int not null comment '创建⼈',
  7.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  8.     update_user int not null comment '更新⼈',
  9.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  10. ) comment '属性模板表';
复制代码
例如添加一个属性模版:智能手机模版;
11.png
五.属性模板内容表
  1. create table atm_attribute_template_content (
  2.     id int auto_increment comment '主键' primary key,
  3.     template_id int not null comment '属性模板id',
  4.     group_id int null comment '属性组id',
  5.     attribute_id int not null comment '属性id',
  6.     participant_type int not null comment '参与类型(1-表示该属性是放到item上的,2-表示该属性是放到sku上的)',
  7.     sort int null comment '排序序号',
  8.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  9.     create_user int not null comment '创建⼈',
  10.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  11.     update_user int not null comment '更新⼈',
  12.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  13. ) comment '模板内容表';
复制代码
例如给智能⼿机模板配置三个属性,同时指定每个属性所属的属性组,分别为品牌属性(⽆属性组)、颜⾊属性和版本属性(属于基本属性组)。另外配置品牌属性放到item上,颜⾊和版本属性放到sku上,而且属性组的顺序分别是品牌、颜⾊、版本。
12.png
六.标品商品属性值表
  1. create table atm_item_sku_attribute_value (
  2.     id int auto_increment comment '主键' primary key,
  3.     participant_id varchar(64) not null comment '标品id或商品id',
  4.     participant_type int not null comment '参与类型(1-表示该属性是放到item上的,2-表示该属性是放到sku上的)',
  5.     template_id int not null comment '模板id',
  6.     group_id int null comment '属性组id',
  7.     attribute_id int not null comment '属性id',
  8.     attribute_value varchar(128) not null comment '属性值',
  9.     sort int not null comment '排序序号',
  10.     del_flag tinyint(1) default 0 not null comment '删除标记(1-有效,0-删除)',
  11.     create_user int not null comment '创建⼈',
  12.     create_time datetime default CURRENT_TIMESTAMP not null comment '创建时间',
  13.     update_user int not null comment '更新⼈',
  14.     update_time datetime default CURRENT_TIMESTAMP not null comment '修改时间'
  15. ) comment '标品商品属性值表';
复制代码
例如item为111的标品,关联了品牌属性,值为华为。sku为222的商品关联了颜⾊属性(红色),版本属性(公开版)。sku为333的商品关联了颜⾊属性(黄色),版本属性(⽆线⽿机套装)。sku为444的商品关联了颜⾊属性(蓝色),版本属性(智能⼿表套装)。
13.png
 
3.商品属性库系统对品类添加属性
  1. //属性管理相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = AttributeApi.class, retries = 0)
  3. public class AttributeApiImpl implements AttributeApi {
  4.     @Autowired
  5.     private AttributeService attributeService;
  6.    
  7.     //添加属性接口
  8.     @Override
  9.     public JsonResult saveAttribute(AttributeInfoRequest request) {
  10.         AttributeInfoResultDTO attributeResultV2DTO = attributeService.saveAttributeInfo(request);
  11.         return JsonResult.buildSuccess(attributeResultV2DTO);
  12.     }
  13.     ...
  14. }
  15. //新增/编辑属性请求入参
  16. @Data
  17. public class AttributeInfoRequest implements Serializable {
  18.     //品类id
  19.     private Long categoryId;
  20.     //属性名称
  21.     private String attributeName;
  22.     //属性编码
  23.     private String attributeCode;
  24.     //属性类型
  25.     private String attributeType;
  26.     //属性值的输入方式
  27.     private Integer attributeInputType;
  28.     //属性说明
  29.     private String attributeComment;
  30.     //操作人
  31.     @NotNull(message = "操作人[operateUser]不能为空")
  32.     private Integer operateUser;
  33. }
  34. //属性管理相关操作API
  35. @Service
  36. public class AttributeServiceImpl implements AttributeService {
  37.     @Autowired
  38.     private AttributeRepository attributeRepository;
  39.    
  40.     //添加属性
  41.     @Override
  42.     public AttributeInfoResultDTO saveAttributeInfo(AttributeInfoRequest request) {
  43.         //入参检查
  44.         checkAttributeInfoRequest(request);
  45.         //保存属性
  46.         Long attributeId = attributeRepository.saveAttributeInfo(request);
  47.         return new AttributeInfoResultDTO(attributeId, true);
  48.     }
  49.     ...
  50. }
  51. @Repository
  52. public class AttributeRepository {
  53.     @Resource
  54.     private AttributeInfoMapper attributeInfoMapper;
  55.     ...
  56.    
  57.     //保存属性信息
  58.     public Long saveAttributeInfo(AttributeInfoRequest request) {
  59.         AttributeInfoDO attributeInfoDO = attributeConverter.convertAttributeInfoDO(request);
  60.         attributeInfoDO.initCommon();
  61.         attributeInfoMapper.insert(attributeInfoDO);
  62.         return attributeInfoDO.getId();
  63.     }
  64.     ...
  65. }
复制代码
 
4.商品属性库系统添加属性值与属性组
(1)添加可选的属性值
(2)添加属性组
 
(1)添加可选的属性值
  1. //属性管理相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = AttributeApi.class, retries = 0)
  3. public class AttributeApiImpl implements AttributeApi {
  4.     ...
  5.     @Autowired
  6.     private AttributeService attributeService;
  7.    
  8.     //给属性添加可选的属性值接口
  9.     @Override
  10.     public JsonResult saveAttributeValue(List list) {
  11.         AttributeValueResultDTO attributeValueResultDTO = attributeService.saveAttributeValues(list);
  12.         return JsonResult.buildSuccess(attributeValueResultDTO);
  13.     }
  14.     ...
  15. }
  16. //属性管理相关操作API
  17. @Service
  18. public class AttributeServiceImpl implements AttributeService {
  19.     @Autowired
  20.     private AttributeRepository attributeRepository;
  21.     ...
  22.    
  23.     //批量给属性添加可选的属性值
  24.     @Override
  25.     public AttributeValueResultDTO saveAttributeValues(List list) {
  26.         attributeRepository.saveAttributeValues(list);
  27.         return new AttributeValueResultDTO(true);
  28.     }
  29.     ...
  30. }
  31. //属性库
  32. @Repository
  33. public class AttributeRepository {
  34.     @Resource
  35.     private AttributeValueMapper attributeValueV2Mapper;
  36.     ...
  37.    
  38.     //批量保存属性值
  39.     public void saveAttributeValues(List list) {
  40.         //先删
  41.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  42.         queryWrapper.eq(AttributeValueDO::getAttributeId, list.get(0).getAttributeId());
  43.         attributeValueV2Mapper.delete(queryWrapper);
  44.         //后保存
  45.         List attributeValueDOS = attributeConverter.convertAttributeValueV2DOList(list);
  46.         attributeValueDOS.forEach(e -> {
  47.             e.setUpdateUser(list.get(0).getOperateUser());
  48.             e.initCommon();
  49.         });
  50.         Integer count = attributeValueV2Mapper.insertBatch(attributeValueDOS);
  51.         if (count <= 0) {
  52.             throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR);
  53.         }
  54.     }
  55.     ...
  56. }
复制代码
 
7.商品属性库系统与商品M端系统对接
  1. //属性管理相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = AttributeApi.class, retries = 0)
  3. public class AttributeApiImpl implements AttributeApi {
  4.     ...
  5.     @Autowired
  6.     private AttributeService attributeService;
  7.    
  8.     //添加属性组接口
  9.     @Override
  10.     public JsonResult saveAttributeGroup(AttributeGroupRequest request) {
  11.         AttributeGroupResultDTO attributeGroupResultDTO = attributeService.saveAttributeGroup(request);
  12.         return JsonResult.buildSuccess(attributeGroupResultDTO);
  13.     }
  14.     ...
  15. }
  16. //属性管理相关操作API
  17. @Service
  18. public class AttributeServiceImpl implements AttributeService {
  19.     @Autowired
  20.     private AttributeRepository attributeRepository;
  21.     ...
  22.    
  23.     //添加属性组接口
  24.     @Override
  25.     public AttributeGroupResultDTO saveAttributeGroup(AttributeGroupRequest request) {
  26.         //入参检查
  27.         checkAttributeGroupRequest(request);
  28.         Long groupId = attributeRepository.saveAttributeGroup(request);
  29.         return new AttributeGroupResultDTO(groupId, true);
  30.     }
  31.     ...
  32. }
  33. //属性库
  34. @Repository
  35. public class AttributeRepository {
  36.     @Resource
  37.     private AttributeGroupMapper attributeGroupMapper;
  38.     ...
  39.    
  40.     //保存属性组
  41.     public Long saveAttributeGroup(AttributeGroupRequest request) {
  42.         AttributeGroupDO attributeGroupDO = attributeConverter.convertAttributeGroupDO(request);
  43.         attributeGroupDO.initCommon();
  44.         attributeGroupMapper.insert(attributeGroupDO);
  45.         return attributeGroupDO.getId();
  46.     }
  47.     ...
  48. }
复制代码
 
8.商品状态变更流转架构设计
(1)状态流转策略表
(2)商品状态变更流向图
(3)接口实现流程图
 
(1)状态流转策略表
  1. //属性管理相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = AttributeApi.class, retries = 0)
  3. public class AttributeApiImpl implements AttributeApi {
  4.     ...
  5.     @Autowired
  6.     private AttributeService attributeService;
  7.    
  8.     //添加属性模板接口
  9.     @Override
  10.     public JsonResult saveAttributeTemplate(AttributeTemplateRequest request) {
  11.         AttributeTemplateResultDTO attributeTemplateResultDTO = attributeService.saveAttributeTemplate(request);
  12.         return JsonResult.buildSuccess(attributeTemplateResultDTO);
  13.     }
  14.    
  15.     //给模板添加模板内容接口
  16.     @Override
  17.     public JsonResult saveAttributeTemplateContents(List list) {
  18.         AttributeTemplateContentResultDTO attributeTemplateContentResultDTO = attributeService.saveAttributeTemplateContents(list);
  19.         return JsonResult.buildSuccess(attributeTemplateContentResultDTO);
  20.     }
  21.     ...
  22. }
  23. //属性管理相关操作API
  24. @Service
  25. public class AttributeServiceImpl implements AttributeService {
  26.     @Autowired
  27.     private AttributeRepository attributeRepository;
  28.     ...
  29.    
  30.     //添加属性模板接口
  31.     @Override
  32.     public AttributeTemplateResultDTO saveAttributeTemplate(AttributeTemplateRequest request) {
  33.         //入参检查
  34.         checkAttributeTemplateRequest(request);
  35.         Long templteId = attributeRepository.saveAttributeTemplate(request);
  36.         return new AttributeTemplateResultDTO(templteId, true);
  37.     }
  38.    
  39.     //添加属性模板内容接口
  40.     @Override
  41.     public AttributeTemplateContentResultDTO saveAttributeTemplateContents(List list) {
  42.         //入参检查
  43.         checkAttributeTemplateContentRequest(list);
  44.         attributeRepository.saveAttributeTemplateContents(list);
  45.         return new AttributeTemplateContentResultDTO(true);
  46.     }
  47.     ...
  48. }
  49. //属性库
  50. @Repository
  51. public class AttributeRepository {
  52.     @Resource
  53.     private AttributeTemplateMapper attributeTemplateMapper;
  54.    
  55.     @Resource
  56.     private AttributeTemplateContentMapper attributeTemplateContentMapper;
  57.     ...
  58.    
  59.     //保存属性模板
  60.     public Long saveAttributeTemplate(AttributeTemplateRequest request) {
  61.         AttributeTemplateDO attributeTemplateDO = attributeConverter.convertAttributeTemplateDO(request);
  62.         attributeTemplateDO.initCommon();
  63.         attributeTemplateMapper.insert(attributeTemplateDO);
  64.         return attributeTemplateDO.getId();
  65.     }
  66.    
  67.     //保存属性模板内容
  68.     public void saveAttributeTemplateContents(List list) {
  69.         //先删
  70.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  71.         queryWrapper.eq(AttributeTemplateContentDO::getTemplateId, list.get(0).getTemplateId());
  72.         attributeTemplateContentMapper.delete(queryWrapper);
  73.         //后保存
  74.         List attributeTemplateContentDOS = attributeConverter.convertAttributeTemplateContentDOList(list);
  75.         attributeTemplateContentDOS.forEach(e -> {
  76.             e.setUpdateUser(list.get(0).getOperateUser());
  77.             e.initCommon();
  78.         });
  79.         Integer count = attributeTemplateContentMapper.insertBatch(attributeTemplateContentDOS);
  80.         if (count <= 0) {
  81.             throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR);
  82.         }
  83.     }
  84.     ...
  85. }
复制代码
(2)商品状态变更流向图
说明:严格按照箭头方向执行,除了可重新上架,其他状态变更均不可逆。
14.png
(3)接口实现流程图
15.png
 
9.商品状态变更流转的策略模式实现
具体实现在商品M端系统:
一.验证⼊参必填(商品ID和变更状态)
二.验证商品是否存在,停售状态禁⽌变更状态
三.获取状态流转策略表,根据商品的当前状态和变更状态获取配置的映射策略类的实例名称
四.实现关于每个状态变更的具体逻辑
  1. //属性管理相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = AttributeApi.class, retries = 0)
  3. public class AttributeApiImpl implements AttributeApi {
  4.     ...
  5.     @Autowired
  6.     private AttributeService attributeService;
  7.    
  8.     //属性分页查询接口
  9.     @Override
  10.     public JsonResult<PageResult> pageAttributeInfo(QueryAttributeInfoRequest request) {
  11.         PageResult pageResult = attributeService.pageAttributeInfo(request);
  12.         return JsonResult.buildSuccess(pageResult);
  13.     }
  14.    
  15.     //根据属性id查询属性及可选的属性值
  16.     @Override
  17.     public JsonResult<List> queryAttributeValueByAttributeId(Long attributeId) {
  18.         List attributeValueDTOS = attributeService.queryAttributeValueByAttributeId(attributeId);
  19.         return JsonResult.buildSuccess(attributeValueDTOS);
  20.     }
  21.    
  22.     //属性组分页查询接口
  23.     @Override
  24.     public JsonResult<PageResult> pageAttributeGroup(QueryAttributeGroupRequest request) {
  25.         PageResult pageResult = attributeService.pageAttributeGroup(request);
  26.         return JsonResult.buildSuccess(pageResult);
  27.     }
  28.    
  29.     //属性模板分页查询接口
  30.     @Override
  31.     public JsonResult<PageResult> pageAttributeTemplate(QueryAttributeTemplateRequest request) {
  32.         PageResult pageResult = attributeService.pageAttributeTemplate(request);
  33.         return JsonResult.buildSuccess(pageResult);
  34.     }
  35.    
  36.     //根据模板id查询模板内容接口
  37.     @Override
  38.     public JsonResult<List> queryAttributeTemplateContentByTemplateId(Long templateId) {
  39.         List attributeTemplateContentDTOS = attributeService.queryAttributeTemplateContentByTemplateId(templateId);
  40.         return JsonResult.buildSuccess(attributeTemplateContentDTOS);
  41.     }
  42.     ...
  43. }
  44. //属性管理相关操作API
  45. @Service
  46. public class AttributeServiceImpl implements AttributeService {
  47.     @Autowired
  48.     private AttributeRepository attributeRepository;
  49.    
  50.     //分页查询属性
  51.     @Override
  52.     public PageResult pageAttributeInfo(QueryAttributeInfoRequest request) {
  53.         return attributeRepository.pageAttributeInfo(request);
  54.     }
  55.    
  56.     //根据属性id查询属性及可选的属性值
  57.     @Override
  58.     public List queryAttributeValueByAttributeId(Long attributeId) {
  59.         if (attributeId == null || attributeId < 0) {
  60.             return null;
  61.         }
  62.         return attributeRepository.queryAttributeValueByAttributeId(attributeId);
  63.     }
  64.    
  65.     //分页查询属性组
  66.     @Override
  67.     public PageResult pageAttributeGroup(QueryAttributeGroupRequest request) {
  68.         return attributeRepository.pageAttributeGroup(request);
  69.     }
  70.    
  71.     //分页查询属性模板
  72.     @Override
  73.     public PageResult pageAttributeTemplate(QueryAttributeTemplateRequest request) {
  74.         return attributeRepository.pageAttributeTemplate(request);
  75.     }
  76.    
  77.     //根据属性模板id查询属性模板的内容
  78.     @Override
  79.     public List queryAttributeTemplateContentByTemplateId(Long templateId) {
  80.         if (templateId == null || templateId < 0) {
  81.             return null;
  82.         }
  83.         return attributeRepository.queryAttributeTemplateContentByTemplateId(templateId);
  84.     }
  85.     ...
  86. }
  87. //属性库
  88. @Repository
  89. public class AttributeRepository {
  90.     @Resource
  91.     private AttributeGroupMapper attributeGroupMapper;
  92.    
  93.     //分页查询属性
  94.     public PageResult pageAttributeInfo(QueryAttributeInfoRequest request) {
  95.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  96.         if (request.getCategoryId() != null && request.getCategoryId() > 0) {
  97.             queryWrapper.eq(AttributeInfoDO::getCategoryId, request.getCategoryId());
  98.         }
  99.         if (StringUtils.isNotBlank(request.getAttributeName())) {
  100.             queryWrapper.like(AttributeInfoDO::getAttributeName, request.getAttributeName());
  101.         }
  102.         if (StringUtils.isNotBlank(request.getAttributeCode())) {
  103.             queryWrapper.like(AttributeInfoDO::getAttributeCode, request.getAttributeCode());
  104.         }
  105.         if (request.getAttributeType() != null) {
  106.             queryWrapper.eq(AttributeInfoDO::getAttributeType, request.getAttributeType());
  107.         }
  108.         if (request.getAttributeInputType() != null) {
  109.             queryWrapper.eq(AttributeInfoDO::getAttributeInputType, request.getAttributeInputType());
  110.         }
  111.         Page page = new Page<>(request.getPageNum(), request.getPageSize());
  112.         Page pageResult = attributeInfoMapper.selectPage(page, queryWrapper);
  113.         return attributeConverter.convertAttributeInfoDTOPageResult(pageResult);
  114.     }
  115.    
  116.     //根据属性id查询属性值
  117.     public List queryAttributeValueByAttributeId(Long attributeId) {
  118.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  119.         queryWrapper.eq(AttributeValueDO::getAttributeId, attributeId);
  120.         List attributeValueDOS = attributeValueV2Mapper.selectList(queryWrapper);
  121.         return attributeConverter.convertAttributeValueV2DTOList(attributeValueDOS);
  122.     }
  123.    
  124.     //分页查询属性组
  125.     public PageResult pageAttributeGroup(QueryAttributeGroupRequest request) {
  126.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  127.         if (request.getCategoryId() != null && request.getCategoryId() > 0) {
  128.             queryWrapper.eq(AttributeGroupDO::getCategoryId, request.getCategoryId());
  129.         }
  130.         if (StringUtils.isNotBlank(request.getGroupName())) {
  131.             queryWrapper.like(AttributeGroupDO::getGroupName, request.getGroupName());
  132.         }
  133.         Page page = new Page<>(request.getPageNum(), request.getPageSize());
  134.         Page pageResult = attributeGroupMapper.selectPage(page, queryWrapper);
  135.         return attributeConverter.convertAttributeGroupDTOPageResult(pageResult);
  136.     }
  137.    
  138.     //分页查询属性模板
  139.     public PageResult pageAttributeTemplate(QueryAttributeTemplateRequest request) {
  140.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  141.         if (request.getCategoryId() != null && request.getCategoryId() > 0) {
  142.             queryWrapper.eq(AttributeTemplateDO::getCategoryId, request.getCategoryId());
  143.         }
  144.         if (StringUtils.isNotBlank(request.getTemplateName())) {
  145.             queryWrapper.like(AttributeTemplateDO::getTemplateName, request.getTemplateName());
  146.         }
  147.         Page page = new Page<>(request.getPageNum(), request.getPageSize());
  148.         Page pageResult = attributeTemplateMapper.selectPage(page, queryWrapper);
  149.         return attributeConverter.convertAttributeTemplateDTOPageResult(pageResult);
  150.     }
  151.    
  152.     //根据属性模板id查询属性模板内容
  153.     public List queryAttributeTemplateContentByTemplateId(Long templateId) {
  154.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  155.         queryWrapper.eq(AttributeTemplateContentDO::getTemplateId, templateId);
  156.         List attributeTemplateContentDOS = attributeTemplateContentMapper.selectList(queryWrapper);
  157.         return attributeConverter.convertAttributeTemplateContentDTOList(attributeTemplateContentDOS);
  158.     }   
  159.     ...
  160. }
复制代码
 
10.商品状态变更流转的具体策略实现
(1)商品试销上架的实现
(2)商品上架与预下架状态流转实现
(3)商品下架和停售状态流转实现
(4)流转到上架的状态变更
 
(1)商品试销上架的实现
一.商品试销上架时对前端销售数据校验
  1. //商品属性相关操作API
  2. @DubboService(version = "1.0.0", interfaceClass = ItemSkuAttributeApi.class, retries = 0)
  3. public class ItemSkuAttributeApiImpl implements ItemSkuAttributeApi {
  4.     @Autowired
  5.     private ItemSkuAttributeService itemSkuAttributeService;
  6.    
  7.     //保存标品和商品属性接口
  8.     @Override
  9.     public JsonResult<ItemSkuAttributeValueResultDTO> saveItemSkuAttributeValue(List<ItemSkuAttributeValueRequest> list) {
  10.         ItemSkuAttributeValueResultDTO itemSkuAttributeValueResultDTO = itemSkuAttributeService.saveItemSkuAttributeValue(list);
  11.         return JsonResult.buildSuccess(itemSkuAttributeValueResultDTO);
  12.     }
  13.    
  14.     //根据商品id品类id查询聚合商品属性值接口
  15.     @Override
  16.     public JsonResult<List<SkuAttributeValueDTO>> queryItemSkuAttributeValueList(QueryItemSkuAttributeValueRequest request) {
  17.         List<SkuAttributeValueDTO> skuAttributeValueDTOS = itemSkuAttributeService.queryItemSkuAttributeValueList(request);
  18.         return JsonResult.buildSuccess(skuAttributeValueDTOS);
  19.     }
  20.    
  21.     //根据属性查询条件搜索商品接口
  22.     @Override
  23.     public JsonResult<List<String>> querySkuIdsByAttribute(QuerySkuIdsByAttributeRequest request) {
  24.         List<String> skuIds = itemSkuAttributeService.querySkuIdsByAttributes(request);
  25.         return JsonResult.buildSuccess(skuIds);
  26.     }
  27. }
  28. //商品属性相关操作API
  29. @Service
  30. public class ItemSkuAttributeServiceImpl implements ItemSkuAttributeService {
  31.     @Autowired
  32.     private AttributeRepository attributeRepository;
  33.    
  34.     //保存标品和商品属性
  35.     @Override
  36.     public ItemSkuAttributeValueResultDTO saveItemSkuAttributeValue(List<ItemSkuAttributeValueRequest> list) {
  37.         //入参检查
  38.         checkItemSkuAttributeValueRequest(list);
  39.         attributeRepository.saveItemSkuAttributeValue(list);
  40.         return new ItemSkuAttributeValueResultDTO(true);
  41.     }
  42.    
  43.     //根据商品id类目id查询聚合商品属性值接口
  44.     @Override
  45.     public List<SkuAttributeValueDTO> queryItemSkuAttributeValueList(QueryItemSkuAttributeValueRequest request) {
  46.         //1.根据skuId和itemId查询出商品所有的属性
  47.         List<ItemSkuAttributeValueDTO> itemSkuAttributeValueDTOS = attributeRepository.queryItemSkuAttributeValueList(request);
  48.         //2.找出使用这个sku使用的是哪个模板
  49.         Long templateId = itemSkuAttributeValueDTOS.get(0).getTemplateId();
  50.         //3.查询出模板内容
  51.         List attributeTemplateContentDTOS = attributeRepository.queryAttributeTemplateContentByTemplateId(templateId);
  52.         //4.查询出相关的属性组
  53.         List<Long> groupIds = attributeTemplateContentDTOS.stream()
  54.             .map(AttributeTemplateContentDTO::getGroupId)
  55.             .filter(Objects::nonNull)
  56.             .collect(Collectors.toList());
  57.         List groupDTOS = attributeRepository.queryGroups(groupIds);
  58.         Map<Long, String> groupIdAndNameMap = groupDTOS.stream().collect(Collectors.toMap(AttributeGroupDTO::getId, AttributeGroupDTO::getGroupName));
  59.         //5.查询出相关的属性
  60.         List<Long> attributeIds = attributeTemplateContentDTOS.stream()
  61.             .map(AttributeTemplateContentDTO::getAttributeId)
  62.             .collect(Collectors.toList());
  63.         List attributeInfoDTOS = attributeRepository.queryAttributeInfos(attributeIds);
  64.         Map<Long, String> attributeIdAndNameMap = attributeInfoDTOS.stream().collect(Collectors.toMap(AttributeInfoDTO::getId, AttributeInfoDTO::getAttributeName));
  65.         //6.拼装结果
  66.         return buildSkuAttributeValueDTOS(itemSkuAttributeValueDTOS, groupIdAndNameMap, attributeIdAndNameMap);
  67.     }
  68.    
  69.     //根据属性查询条件搜索商品接口
  70.     @Override
  71.     public List<String> querySkuIdsByAttributes(QuerySkuIdsByAttributeRequest request) {
  72.         return attributeRepository.querySkuIdsByAttribute(request);
  73.     }
  74.     ...
  75. }
  76. //属性库
  77. @Repository
  78. public class AttributeRepository {
  79.     ...
  80.     //保存标品和商品属性
  81.     public void saveItemSkuAttributeValue(List<ItemSkuAttributeValueRequest> list) {
  82.         //先删
  83.         LambdaQueryWrapper<ItemSkuAttributeValueDO> queryWrapper = Wrappers.lambdaQuery();
  84.         queryWrapper.eq(ItemSkuAttributeValueDO::getParticipantId, list.get(0).getParticipantId());
  85.         itemSkuAttributeValueMapper.delete(queryWrapper);
  86.         //后保存
  87.         List<ItemSkuAttributeValueDO> itemSkuAttributeValueDOS = attributeConverter.convertItemSkuAttributeValueDOList(list);
  88.         itemSkuAttributeValueDOS.forEach(e -> {
  89.             e.setUpdateUser(list.get(0).getOperateUser());
  90.             e.initCommon();
  91.         });
  92.         Integer count = itemSkuAttributeValueMapper.insertBatch(itemSkuAttributeValueDOS);
  93.         if (count <= 0) {
  94.             throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR);
  95.         }
  96.     }
  97.    
  98.     //根据商品id类目id查询聚合商品属性值接口
  99.     public List<ItemSkuAttributeValueDTO> queryItemSkuAttributeValueList(QueryItemSkuAttributeValueRequest request) {
  100.         LambdaQueryWrapper<ItemSkuAttributeValueDO> queryWrapper = Wrappers.lambdaQuery();
  101.         List<String> participantIds = new ArrayList<>();
  102.         if (StringUtils.isNotBlank(request.getItemId())) {
  103.             participantIds.add(request.getItemId());
  104.         }
  105.         if (StringUtils.isNotBlank(request.getSkuId())) {
  106.             participantIds.add(request.getSkuId());
  107.         }
  108.         queryWrapper.in(ItemSkuAttributeValueDO::getParticipantId, participantIds.stream().distinct().collect(Collectors.toList()));
  109.         List<ItemSkuAttributeValueDO> itemSkuAttributeValueDOS = itemSkuAttributeValueMapper.selectList(queryWrapper);
  110.         return attributeConverter.convertItemSkuAttributeValueDTO(itemSkuAttributeValueDOS);
  111.     }
  112.    
  113.     //根据属性模板id查询属性模板内容
  114.     public List queryAttributeTemplateContentByTemplateId(Long templateId) {
  115.         LambdaQueryWrapper queryWrapper = Wrappers.lambdaQuery();
  116.         queryWrapper.eq(AttributeTemplateContentDO::getTemplateId, templateId);
  117.         List attributeTemplateContentDOS = attributeTemplateContentMapper
  118.             .selectList(queryWrapper);
  119.         return attributeConverter.convertAttributeTemplateContentDTOList(attributeTemplateContentDOS);
  120.     }
  121.    
  122.     //根据id批量查询属性组
  123.     public List queryGroups(List<Long> groupIds) {
  124.         List attributeGroupDOS = attributeGroupMapper.selectBatchIds(groupIds);
  125.         return attributeConverter.convertAttributeGroupDTOList(attributeGroupDOS);
  126.     }
  127.    
  128.     //根据id批量查询属性
  129.     public List queryAttributeInfos(List<Long> attributeIds) {
  130.         List attributeInfoDOS = attributeInfoMapper.selectBatchIds(attributeIds);
  131.         return attributeConverter.convertAttributeInfoDTOList(attributeInfoDOS);
  132.     }
  133.    
  134.     //根据属性查询条件搜索商品接口
  135.     public List<String> querySkuIdsByAttribute(QuerySkuIdsByAttributeRequest request) {
  136.         LambdaQueryWrapper<ItemSkuAttributeValueDO> queryWrapper = Wrappers.lambdaQuery();
  137.         for (QuerySkuIdsByAttributeRequest.AttributeCriteria attributeCriteria : request.getAttributeCriterias()) {
  138.             queryWrapper.or(wrapper -> wrapper
  139.                 .eq(ItemSkuAttributeValueDO::getAttributeId, attributeCriteria.getAttributeId())
  140.                 .like(ItemSkuAttributeValueDO::getAttributeValue, attributeCriteria.getAttributeValue())
  141.             );
  142.         }
  143.         List<ItemSkuAttributeValueDO> itemSkuAttributeValueDOS = itemSkuAttributeValueMapper.selectList(queryWrapper);
  144.         return itemSkuAttributeValueDOS.stream().map(ItemSkuAttributeValueDO::getParticipantId).collect(Collectors.toList());
  145.     }
  146.     ...
  147. }
复制代码
二.商品试销上架时补充扩展属性和变更商品状态
[code]//试销上架状态变更@Service("trialSaleStatus")public class TrialSaleStatusService extends AbstractStatusStrategy {    ...    //填充 试销商品的扩展字段(试销期截止时间)    private void buildAttributeContent(ProductDetailDO productDetailDO) {        //1.只有普通商品或者组套商品才处理扩展信息的变化        if (checkItemType(productDetailDO)) {            //获取试销期截止时间            String trialSaleTime = DateFormatUtil.getDate(dateNum);            //先获取到试销商品的原有扩展字段            AttributeExtendDO attributeExtend = productStatusRepository.getAttributeExtend(productDetailDO.getItemId());            AttributeExtendBO attributeExtendBO = null;            //没有已经存在的扩展信息            if (!Objects.isNull(attributeExtend) || StringUtils.isBlank(attributeExtend.getAttributeContent())) {                attributeExtendBO = new AttributeExtendBO();            } else {                attributeExtendBO = JsonUtil.json2Object(attributeExtend.getAttributeContent(), AttributeExtendBO.class);            }            attributeExtendBO.setTrialSaleTime(trialSaleTime);            //字段存储起来            productDetailDO.setAttributeContent(JSONObject.toJSONString(attributeExtendBO));        }    }        //变更商品的状态    private void updateProduct(ProductDetailDO productDetailDO, ProductStatusRequest productStatusRequest) {        ItemInfoDO itemInfoDO = productConverter.converterDO(productDetailDO);        //更新商品状态        productStatusRepository.updateProductStatus(itemInfoDO, productStatusRequest.getItemStatus());        if (checkItemType(productDetailDO)) {            //更新商品扩展信息            productStatusRepository.updateAttributeExtend(productDetailDO);        }    }    ...}@Repositorypublic class ProductStatusRepository {    ...    //更新商品状态    public void updateProductStatus(ItemInfoDO itemInfoDO, Integer updateItemStatus) {        LambdaUpdateWrapper updateWrapper = Wrappers.lambdaUpdate();        updateWrapper.eq(ItemInfoDO::getItemId, itemInfoDO.getItemId());        updateWrapper.eq(ItemInfoDO::getItemStatus, itemInfoDO.getItemStatus());        updateWrapper.set(ItemInfoDO::getItemStatus, updateItemStatus);        int count = itemInfoMapper.update(updateWrapper.getEntity(), updateWrapper);        if (count
您需要登录后才可以回帖 登录 | 立即注册