写点什么

商品中心—商品考核系统的技术文档

  • 2025-06-17
    福建
  • 本文字数:18264 字

    阅读完需:约 60 分钟

1.基于大数据系统的商品考核数据指标


(1)试销期考核指标


一.货品严重质量问题,主要是供应商的产品质量问题二.供应商合同诚信问题,是否按合同供货三.销售额:由运营根据市场⾏情配置四.出货⽐例:销售量 / 总库存五.单利润率:(平均单价 - 每单成本) / 每单成本 * 100%六.退货率:退单量 / 出单量 * 100七.客诉率:投诉量 / 出单量 * 100八.损耗率:损耗量 / 出单量 * 100
复制代码

(2)成熟期(滞销期)考核指标


一.货品严重质量问题二.供应商合同诚信问题三.连续考核失败次数四.销售额:由运营根据市场⾏情配置五.出货⽐例:销售量 / 总库存六.单利润率:(平均单价 - 每单成本) / 每单成本 * 100%七.退货率:退单量 / 出单量 * 100八.客诉率:投诉量 / 出单量 * 100九.损耗率:损耗量 / 出单量 * 100
复制代码

 

2.基于商品考核数据指标的商品考核流程


(1)试销期考核


一.考核流程图



二.考核逻辑


其中供货问题或合同问题出现任意⼀个,即可直接定为考核失败。销售额由运营上架货品时配置销售额预期,未达到则直接定为考核失败。出货⽐例、单利润率、退货率、客诉率指标,条件满⾜数量 n,当考核指标满⾜n 个条件,即可认为考核通过。

 

例如:商品 A 考核通过的配置是:⼀个考核周期内,销售额 10000 元、出货⽐例 5%、单利润率 2%、退货率 5‰、客诉率 1‰、损耗率 2‰,考核通过需满⾜的指标个数为 3。


步骤一:出现货品严重质量问题,考核结果为考核失败步骤二:出现合同诚信问题,考核结果为考核失败步骤三:销售额未达到10000,考核结果为考核失败步骤四:销售额达到10000、出货⽐例10%、单利润率4%、退货率3‰,客诉率4‰,考核结果为考核成功步骤五:销售额达到10000、出货⽐例10%、单利润率1%、退货率6‰、客诉率0.2‰、考核结果为考核失败步骤六:销售额未达到10000,直接考核失败
复制代码


(2)成熟期(滞销期)考核


一.考核流程图



二.考核逻辑


以下考核内容为每轮考核内容,在滞销期考核周期内,会多次按照下述检查指标的步骤进⾏考核。

 

其中供货问题或合同问题出现任意⼀个,即可直接定为考核失败。销售额由运营上架货品时配置销售额预期,未达到则直接定为考核失败。出货⽐例、单利润率、退货率、客诉率指标,条件满⾜数量 n,当考核指标满⾜n 个条件,即可认为本轮次考核通过。当本轮次出现考核失败时,若连续考核失败次数设置为 m,而当前考核失败次数 + 1 刚好等于 m,则认为商品考核失败。

 

如商品 A 考核通过的配置:销售额 10000 元、出货⽐例 5%、单利润率 2%、退货率 5‰、客诉率 1‰ 。


步骤一:出现货品严重质量问题,本轮次考核结果为考核失败步骤二:出现合同诚信问题,本轮次考核结果为考核失败步骤三:⼤考核周期内出现2次考核失败,本周期考核结果为考核失败步骤四:销售额未达到10000,本轮次考核结果为考核失败,失败轮数+1步骤五:销售额达到10000,出货⽐例10%、单利润率4%、退货率3‰、客诉率4‰,本轮次考核结果为考核成功步骤六:销售额达到10000,出货⽐例10%、单利润率1%、退货率6‰、客诉率0.2‰,考核结果为考核失败,失败轮数+1
复制代码

 

3.商品考核失败后的处理 + 考核流程的设计


(1)商品考核失败后的后续处理


在⼤周期考核失败后,⽴即发送消息通知运营执⾏相应操作,运营可以选择如下三种操作:


操作一:变更考核状态为免考核,过滤掉免考核商品操作二:变更商品状态为下架,过滤下架商品不再进⾏考核操作三:当前状态不再进⾏考核,进入下⼀个状态,进⾏正常考核
复制代码


例如:当前状态是试销期,试销期不再进⾏考核。然后进⼊成熟期,在成熟期再继续进行考核。



场景 1:商品状态更改为试销上架,接到 MQ 消息,商品⽣命周期状态更改为试销期。此时开启试销期考核,并进行试销期考核时间的判定。开始时间:商品进⼊试销期时间,即商品进⼊试销上架状态的时间。考核周期结束时间 = 商品进⼊试销期时间 + 配置的考核周期天数。

 

场景 2:商品进⼊成熟期(滞销期),则试销期考核作废,进⼊滞销期考核。没有开始时间和结束时间的判定,直到考核失败就不再继续考核,同时会同步发送考核失败的消息给运营⼈员。

 

(2)商品考核的整体业务流程


商品试销上架/上架 -> 商品进⼊考核周期 -> 商品考核开始 -> 商品考核失败推送 -> 运营操作考核失败商品 -> 继续商品考核逻辑。



(3)商品考核流程的设计实现


考核任务业务逻辑:

步骤一:开启考核定时任务

步骤⼆:判断是否存在严重质量问题或合同诚信问题,存在则考核不通过

步骤三:拉取考核统计数据,需要根据过滤掉⽩名单的商品和考核失败的商品。这里的考核失败是指最终考核失败,而不是某轮次的考核失败

步骤四:判断考核类型是试销期还是滞销期

步骤五:判断获取的数据是否达到了考核指标

步骤六:累加考核失败次数,判断是否考核失败,判断是否达到了配置的考核次数,考核失败则异步推送消息⾄运营

步骤七:保存考核结果⾄考核结果缓冲表。如果达到了失败次数,此时考核结果的状态值为考核失败。如果是某⼀轮次考核失败还未达到失败次数,此时状态值是考核中

步骤⼋:启动定时任务每天拉取考核结果缓冲表的数据保存⾄考核结果表,并且设置可采可补可售结果

 

4.商品考核系统数据库模型设计


(1)商品考核结果缓冲表


CREATE TABLE `item_expri_result_buffer` (    `id` bigint(40) NOT NULL AUTO_INCREMENT COMMENT '主键',    `period_stage_id` bigint(40) NOT NULL COMMENT '商品⽣命周期状态id',    `category_id` int(10) NOT NULL DEFAULT '0' COMMENT '末级品类ID',    `item_id` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品ID',    `market_expri_result` tinyint(3) NOT NULL DEFAULT '0' COMMENT '考核状态:0-考核中;1-考核通过;2-考核不通过;3-不考核或暂停考核',    `market_expri_result_desc` varchar(255) DEFAULT '' COMMENT '考核结果描述',    `rule` varchar(255) DEFAULT '考核规则',    `fail_times` tinyint(4) default 0 comment '考核周期内连续考核失败的次数',    `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记(1-有效,0-删除)',    PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品考核结果缓冲表';
复制代码


(2)品类考核⽩名单表


create table `category_expri_white` (    `id` bigint(40) primary key AUTO_INCREMENT COMMENT '主键',    `category_id` int(10) NOT NULL DEFAULT 0 COMMENT '末级品类ID',    `category_name` varchar(255) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '品类名称',    `active_flag` tinyint(1) NULL DEFAULT 1 COMMENT '⽣效状态:0-未⽣效;1-⽣效',    `start_time` timestamp default '1970-01-01 08:00:01' comment '开始时间',    `end_time` timestamp default '2038-01-19 11:14:07' comment '结束时间',    `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记(1-有效,0-删除)',    `create_user` int(10) NOT NULL DEFAULT '0' COMMENT '创建⼈',    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',    `update_user` int(10) NOT NULL DEFAULT '0' COMMENT '更新⼈',    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='品类考核⽩名单表';
复制代码


(3)商品质量问题表


create table `product_bad_issues_result` (    `id` bigint(40) primary key AUTO_INCREMENT COMMENT '主键',    `category_id` int(10) NOT NULL DEFAULT 0 COMMENT '商品品类ID',    `item_id` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品ID',    `non_conforming_product` tinyint(2) not null default 1 comment '货品质量是否合格,0-不合格,1-合格(运营⼿动设置)',    `contract_integrity` tinyint(2) not null default 1 comment '供应商合同是否诚信,0-不诚信,1-诚信(运营⼿动设置)',    `extra` varchar(255) null comment '扩展字段',    `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记(1-有效,0-删除)',    `create_user` int(10) NOT NULL DEFAULT '0' COMMENT '创建⼈',    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',    `update_user` int(10) NOT NULL DEFAULT '0' COMMENT '更新⼈',    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品质量问题表';
复制代码


(4)考核指标配置表


create table `product_expri_configuration` (    `id` bigint(40) primary key AUTO_INCREMENT COMMENT '主键',    `category_id` int(10) NOT NULL DEFAULT 0 COMMENT '商品品类ID',    `assessment_type` tinyint(2) not null comment '商品考核类型,1-试销期考核,2-滞销期考核',    `assessment_period` tinyint(2) not null comment 'BI系统写⼊',    `fail_times` tinyint(4) not null comment '考核周期内允许考核失败的次数',    `pass_target` tinyint(2) not null comment '考核通过的指标数量指标,通过的数量达到此值,代表考核通过,未达到代表考核不通过',    `sales_volume` int(20) not null comment '商品销售额考核指标,单位为分,达到此值视为考核通过,未达到视为考核不通过',    `sold_propotion` int(4) not null comment '商品销售⽐例考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `order_profit_margin` int(4) not null comment '商品每单利润率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `return_rate` int(4) not null comment '商品退货⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `complaint_rate` int(4) not null comment '商品客户投诉⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `loss_rate` int(4) not null comment '商品损耗⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记(1-有效,0-删除)',    `create_user` int(10) NOT NULL DEFAULT '0' COMMENT '创建⼈',    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',    `update_user` int(10) NOT NULL DEFAULT '0' COMMENT '更新⼈',    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='考核指标配置表';
复制代码


(5)商品考核数据统计结果表


create table `product_experi_data_result` (    `id` bigint(40) primary key AUTO_INCREMENT COMMENT '主键',    `category_id` int(10) NOT NULL DEFAULT 0 COMMENT '商品品类ID',    `item_id` varchar(40) CHARACTER SET utf8mb4 DEFAULT NULL COMMENT '商品ID',    `assessment_type` tinyint(2) not null comment '商品考核类型,1-试销期考核,2-滞销期考核',    `sales_volume` int(20) not null comment '商品销售额考核指标,单位为分,达到此值视为考核通过,未达到视为考核不通过',    `sold_propotion` int(4) not null comment '商品销售⽐例考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `order_profit_margin` int(4) not null comment '商品每单利润率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `return_rate` int(4) not null comment '商品退货⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `complaint_rate` int(4) not null comment '商品客户投诉⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `loss_rate` int(4) not null comment '商品损耗⽐率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满⾜考核,但不代表考核通过,需要配和其他指标判定是否考核通过)',    `is_effective` tinyint(2) not null default 1 comment '考核数据是否⽣效,0-失效,1-⽣效',    `del_flag` tinyint(1) NOT NULL DEFAULT '0' COMMENT '删除标记(1-有效,0-删除)',    `create_user` int(10) NOT NULL DEFAULT '0' COMMENT '创建⼈',    `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '创建时间',    `update_user` int(10) NOT NULL DEFAULT '0' COMMENT '更新⼈',    `update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更改时间') ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='商品考核数据统计结果表';
复制代码

 

5.商品考核系统核心接口

 

(1)新增货品质量问题记录


运营⼈员对存在质量或者诚信问题的货品保存⼀条记录,该记录在商品⽣命周期阶段考核时起作⽤。如果商品存在质量或诚信问题,那么商品该轮次的考核将不通过。


@RestController@RequestMapping("/badIssuesResult")public class ProductBadIssuesResultController {    @Autowired    private ProductBadIssuesResultService productBadIssuesResultService;
//新增货品质量问题记录 @RequestMapping("/saveProductBadIssuesResult") public JsonResult<Long> saveProductBadIssuesResult(ProductBadIssuesResultRequest request) { try { Long count = productBadIssuesResultService.saveProductBadIssuesResult(request); return JsonResult.buildSuccess(count); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
//货品质量问题请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductBadIssuesResultRequest extends PageRequest implements Serializable { //主键 private Long id; //末级品类ID private Integer categoryId; //ITEM ID private String itemId; //货品质量是否合格,0:不合格,1:合格(运营手动设置) private Integer nonConformingProduct; //供应商合同是否诚信,0:不诚信,1:诚信(运营手动设置) private Integer contractIntegrity;}
@Servicepublic class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService { @Autowired private ProductExpriRepository productExpriRepository;
//新增货品质量问题记录 @Override @Transactional(rollbackFor = Exception.class) public Long saveProductBadIssuesResult(ProductBadIssuesResultRequest request) { //参数检查 checkInsertParams(request); return productExpriRepository.saveProductBadIssuesResult(request); } ...}
//商品考核资源管理@Repositorypublic class ProductExpriRepository { ... //新增货品质量问题记录 public Long saveProductBadIssuesResult(ProductBadIssuesResultRequest request) { LambdaQueryWrapper<ProductBadIssuesResultDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(ProductBadIssuesResultDO::getItemId, request.getItemId()); ProductBadIssuesResultDO productBadIssuesResultDO = productBadIssuesResultMapper.selectOne(queryWrapper); if (Objects.nonNull(productBadIssuesResultDO)) { throw new ProductBizException("该商品已存在质量问题记录,不能重复创建"); }
//保存 productBadIssuesResultDO = productBadIssuesResultConverter.requestToEntity(request); productBadIssuesResultDO.initCommon(); int count = productBadIssuesResultMapper.insert(productBadIssuesResultDO); if (count <= 0) { throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR); } return productBadIssuesResultDO.getId(); } ...}
复制代码


(2)修改货品质量问题记录


可以根据 itemId 或者 ID 修改货品质量问题。


@RestController@RequestMapping("/badIssuesResult")public class ProductBadIssuesResultController {    @Autowired    private ProductBadIssuesResultService productBadIssuesResultService;
//修改货品质量问题记录 @RequestMapping("/updateProductBadIssuesResult") public JsonResult<Boolean> updateProductBadIssuesResult(ProductBadIssuesResultRequest request) { try { Boolean result = productBadIssuesResultService.updateProductBadIssuesResult(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
//货品质量问题请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductBadIssuesResultRequest extends PageRequest implements Serializable { //主键 private Long id; //末级品类ID private Integer categoryId; //ITEM ID private String itemId; //货品质量是否合格,0:不合格,1:合格(运营手动设置) private Integer nonConformingProduct; //供应商合同是否诚信,0:不诚信,1:诚信(运营手动设置) private Integer contractIntegrity;}
@Servicepublic class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService { @Autowired private ProductExpriRepository productExpriRepository;
//修改货品质量问题记录 @Override @Transactional(rollbackFor = Exception.class) public Boolean updateProductBadIssuesResult(ProductBadIssuesResultRequest request) { //参数检查 checkUpdateParams(request); return productExpriRepository.updateProductBadIssuesResult(request); } ...}
//商品考核资源管理@Repositorypublic class ProductExpriRepository { ... //修改货品质量问题记录 public Boolean updateProductBadIssuesResult(ProductBadIssuesResultRequest request) { LambdaQueryWrapper<ProductBadIssuesResultDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Objects.nonNull(request.getId()), ProductBadIssuesResultDO::getId, request.getId()); queryWrapper.eq(Objects.nonNull(request.getItemId()), ProductBadIssuesResultDO::getItemId, request.getItemId()); ProductBadIssuesResultDO selectResult = productBadIssuesResultMapper.selectOne(queryWrapper); if (Objects.isNull(selectResult)) { throw new ProductBizException("该商品质量问题记录不存在,无法修改"); } ProductBadIssuesResultDO issuesResultDO = productBadIssuesResultConverter.requestToEntity(request); issuesResultDO.initCommon(); int count = productBadIssuesResultMapper.updateById(issuesResultDO); if (count <= 0) { throw new BaseBizException(ProductExceptionCode.PRODUCT_SQL); } return true; } ...}
复制代码


(3)查询货品质量问题记录


根据 ID 或者 itemId 查询货品的质量问题记录。


@RestController@RequestMapping("/badIssuesResult")public class ProductBadIssuesResultController {    @Autowired    private ProductBadIssuesResultService productBadIssuesResultService;
//查询货品质量问题记录 @RequestMapping("/getProductBadIssuesResult") public JsonResult<ProductBadIssuesResultDTO> getProductBadIssuesResult(ProductBadIssuesResultRequest request) { try { ProductBadIssuesResultDTO result = productBadIssuesResultService.getProductBadIssuesResult(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
//货品质量问题请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductBadIssuesResultRequest extends PageRequest implements Serializable { //主键 private Long id; //末级品类ID private Integer categoryId; //ITEM ID private String itemId; //货品质量是否合格,0:不合格,1:合格(运营手动设置) private Integer nonConformingProduct; //供应商合同是否诚信,0:不诚信,1:诚信(运营手动设置) private Integer contractIntegrity;}
@Servicepublic class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService { @Autowired private ProductExpriRepository productExpriRepository;
//查询货品质量问题记录 @Override public ProductBadIssuesResultDTO getProductBadIssuesResult(ProductBadIssuesResultRequest request) { return productExpriRepository.getProductBadIssuesResult(request); } ...}
//商品考核资源管理@Repositorypublic class ProductExpriRepository { ... //查询货品质量问题记录 public ProductBadIssuesResultDTO getProductBadIssuesResult(ProductBadIssuesResultRequest request) { LambdaQueryWrapper<ProductBadIssuesResultDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(ProductBadIssuesResultDO::getId, request.getId()); queryWrapper.eq(Objects.nonNull(request.getItemId()), ProductBadIssuesResultDO::getItemId, request.getItemId()); return productBadIssuesResultConverter.entityToDTO(productBadIssuesResultMapper.selectOne(queryWrapper)); } ...}
复制代码


(4)分⻚查询货品质量问题记录


批量查询货品质量问题记录,可以根据商品 ID、品类 ID、是否存在质量问题、是否存在诚信问题,这四个字段进⾏查询。


@RestController@RequestMapping("/badIssuesResult")public class ProductBadIssuesResultController {    @Autowired    private ProductBadIssuesResultService productBadIssuesResultService;
//分页查询货品质量问题记录 @RequestMapping("/queryProductBadIssuesResultByPage") public JsonResult<PageResult<ProductBadIssuesResultDTO>> queryProductBadIssuesResultByPage(ProductBadIssuesResultRequest request) { try { PageResult<ProductBadIssuesResultDTO> result = productBadIssuesResultService.queryProductBadIssuesResultByPage(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
//货品质量问题请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductBadIssuesResultRequest extends PageRequest implements Serializable { //主键 private Long id; //末级品类ID private Integer categoryId; //ITEM ID private String itemId; //货品质量是否合格,0:不合格,1:合格(运营手动设置) private Integer nonConformingProduct; //供应商合同是否诚信,0:不诚信,1:诚信(运营手动设置) private Integer contractIntegrity;}
@Servicepublic class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService { @Autowired private ProductExpriRepository productExpriRepository;
//分页查询货品质量问题记录 @Override public PageResult<ProductBadIssuesResultDTO> queryProductBadIssuesResultByPage(ProductBadIssuesResultRequest request) { return productExpriRepository.queryProductBadIssuesResultByPage(request); } ...}
//商品考核资源管理@Repositorypublic class ProductExpriRepository { ... //分页查询货品质量问题记录 public PageResult<ProductBadIssuesResultDTO> queryProductBadIssuesResultByPage(ProductBadIssuesResultRequest request) { LambdaQueryWrapper<ProductBadIssuesResultDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Objects.nonNull(request.getCategoryId()), ProductBadIssuesResultDO::getCategoryId, request.getCategoryId()); queryWrapper.eq(Objects.nonNull(request.getItemId()), ProductBadIssuesResultDO::getItemId, request.getItemId()); queryWrapper.eq(Objects.nonNull(request.getNonConformingProduct()), ProductBadIssuesResultDO::getNonConformingProduct, request.getNonConformingProduct()); queryWrapper.eq(Objects.nonNull(request.getContractIntegrity()), ProductBadIssuesResultDO::getContractIntegrity, request.getContractIntegrity()); Page<ProductBadIssuesResultDO> page = new Page<>(request.getPageNum(), request.getPageSize()); Page<ProductBadIssuesResultDO> issuesResultPage = productBadIssuesResultMapper.selectPage(page, queryWrapper); List<ProductBadIssuesResultDTO> productBadIssuesResultDTOList = productBadIssuesResultConverter.listEntityToDTO(issuesResultPage.getRecords()); return new PageResult<>(productBadIssuesResultDTOList); } ...}
复制代码


(5)新增考核配置信息


以品类为粒度,为该品类保存⼀条考核指标配置。包括考核类型、考核周期、允许连续失败次数、销售额等属性。在执⾏考核任务时,根据商品所属品类的考核指标配置,看考核是否通过。考核类型即包括:试销期考核和滞销期考核。


@RestController@RequestMapping("/badIssuesResult")public class ProductExpriConfigurationController {    @Autowired    private ProductExpriConfigurationService productExpriConfigurationService;
//新增考核配置信息 @RequestMapping("/saveProductExpriConfiguration") public JsonResult<Long> saveProductExpriConfiguration(ProductExpriConfigurationRequest request) { try { Long count = productExpriConfigurationService.saveProductExpriConfiguration(request); return JsonResult.buildSuccess(count); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
//考核指标配置请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductExpriConfigurationRequest extends PageRequest implements Serializable { //主键ID private Long id; //商品品类ID private Integer categoryId; //商品考核类型,1:试销期考核,2滞销期考核 private Integer assessmentType; //考核周期为多少天:代表大数据按照多少天的维度给出统计数据 private Integer assessmentPeriod; //考核周期内允许考核失败的次数 private Integer failTimes; //考核通过的指标数量指标,通过的数量达到此值,代表考核通过,未达到,代表考核不通过 private Integer passTarget; //商品销售额考核指标,单位为分,达到此值视为考核通过,未达到视为考核不通过 private Integer salesVolume; //商品销售比例考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer soldPropotion; //商品每单利润率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer orderProfitMargin; //商品退货比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer returnRate; //商品客户投诉比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer complaintRate; //商品损耗比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer lossRate;}
@Servicepublic class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService { @Autowired private ProductExpriRepository productExpriRepository;
//新增考核配置信息 @Override @Transactional(rollbackFor = Exception.class) public Long saveProductExpriConfiguration(ProductExpriConfigurationRequest request) { //参数检查 checkInsertParams(request); return productExpriRepository.saveProductExpriConfiguration(request); } ...}
@Repositorypublic class ProductExpriRepository { ... //新增考核配置信息 public Long saveProductExpriConfiguration(ProductExpriConfigurationRequest request) { LambdaQueryWrapper<ProductExpriConfigurationDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(ProductExpriConfigurationDO::getCategoryId, request.getCategoryId()); ProductExpriConfigurationDO expriConfigurationDO = productExpriConfigurationMapper.selectOne(queryWrapper); if (Objects.nonNull(expriConfigurationDO)) { throw new ProductBizException("该品类已存在考核配置记录,不能重复创建"); }
//保存 expriConfigurationDO = productExpriConfigurationConverter.requestToEntity(request); expriConfigurationDO.initCommon(); int count = productExpriConfigurationMapper.insert(expriConfigurationDO); if (count <= 0) { throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR); } return expriConfigurationDO.getId(); } ...}
复制代码


(6)修改考核配置信息


对某⼀项考核指标进⾏修改。


@RestController@RequestMapping("/badIssuesResult")public class ProductExpriConfigurationController {    @Autowired    private ProductExpriConfigurationService productExpriConfigurationService;
//修改考核配置信息 @RequestMapping("/updateProductExpriConfiguration") public JsonResult<Boolean> updateProductExpriConfiguration(ProductExpriConfigurationRequest request) { try { Boolean result = productExpriConfigurationService.updateProductExpriConfiguration(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
@Servicepublic class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService { @Autowired private ProductExpriRepository productExpriRepository;
//修改考核配置信息 @Override @Transactional(rollbackFor = Exception.class) public Boolean updateProductExpriConfiguration(ProductExpriConfigurationRequest request) { //参数检查 checkUpdateParams(request); return productExpriRepository.updateProductExpriConfiguration(request); } ...}
@Repositorypublic class ProductExpriRepository { ... //修改考核配置信息 public Boolean updateProductExpriConfiguration(ProductExpriConfigurationRequest request) { LambdaQueryWrapper<ProductExpriConfigurationDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Objects.nonNull(request.getId()), ProductExpriConfigurationDO::getId, request.getId()); queryWrapper.eq(Objects.nonNull(request.getCategoryId()), ProductExpriConfigurationDO::getCategoryId, request.getCategoryId()); ProductExpriConfigurationDO selectResult = productExpriConfigurationMapper.selectOne(queryWrapper); if (Objects.isNull(selectResult)) { throw new ProductBizException("该品类下的考核配置信息不存在,无法修改"); } ProductExpriConfigurationDO expriConfigurationDO = productExpriConfigurationConverter.requestToEntity(request); expriConfigurationDO.initCommon(); int count = productExpriConfigurationMapper.updateById(expriConfigurationDO); if (count <= 0) { throw new BaseBizException(ProductExceptionCode.PRODUCT_SQL); } return true; } ...}
复制代码


(7)查询考核配置信息


根据 ID 或者品类 ID 查询某⼀项考核配置信息。


@RestController@RequestMapping("/badIssuesResult")public class ProductExpriConfigurationController {    @Autowired    private ProductExpriConfigurationService productExpriConfigurationService;
//查询考核配置信息 @RequestMapping("/getProductExpriConfiguration") public JsonResult<ProductExpriConfigurationDTO> getProductExpriConfiguration(ProductExpriConfigurationRequest request) { try { ProductExpriConfigurationDTO result = productExpriConfigurationService.getProductExpriConfiguration(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
@Servicepublic class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService { @Autowired private ProductExpriRepository productExpriRepository;
//查询考核配置信息 @Override public ProductExpriConfigurationDTO getProductExpriConfiguration(ProductExpriConfigurationRequest request) { return productExpriRepository.getProductExpriConfiguration(request); } ...}
@Repositorypublic class ProductExpriRepository { ... //查询考核配置信息 public ProductExpriConfigurationDTO getProductExpriConfiguration(ProductExpriConfigurationRequest request) { LambdaQueryWrapper<ProductExpriConfigurationDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Objects.nonNull(request.getId()), ProductExpriConfigurationDO::getId, request.getId()); queryWrapper.eq(Objects.nonNull(request.getCategoryId()), ProductExpriConfigurationDO::getCategoryId, request.getCategoryId()); return productExpriConfigurationConverter.entityToDTO(productExpriConfigurationMapper.selectOne(queryWrapper)); } ...}
复制代码


(8)分⻚查询考核配置信息


批量查询考核配置信息,可以根据品类 ID、商品考核类型、允许连续失败次数 3 个字段进⾏查询。


@RestController@RequestMapping("/badIssuesResult")public class ProductExpriConfigurationController {    @Autowired    private ProductExpriConfigurationService productExpriConfigurationService;
//分页查询考核配置信息 @RequestMapping("/queryProductExpriConfigurationByPage") public JsonResult<PageResult<ProductExpriConfigurationDTO>> queryProductExpriConfigurationByPage(ProductExpriConfigurationRequest request) { try { PageResult<ProductExpriConfigurationDTO> result = productExpriConfigurationService.queryProductExpriConfigurationByPage(request); return JsonResult.buildSuccess(result); } catch (Exception e) { log.error("system error: request={}", JSON.toJSONString(request), e); return JsonResult.buildError(e.getMessage()); } } ...}
@Servicepublic class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService { @Autowired private ProductExpriRepository productExpriRepository;
//分页查询考核配置信息 @Override public PageResult<ProductExpriConfigurationDTO> queryProductExpriConfigurationByPage(ProductExpriConfigurationRequest request) { return productExpriRepository.queryProductExpriConfigurationByPage(request); } ...}
@Repositorypublic class ProductExpriRepository { ... //分页查询考核配置信息 public PageResult<ProductExpriConfigurationDTO> queryProductExpriConfigurationByPage(ProductExpriConfigurationRequest request) { LambdaQueryWrapper<ProductExpriConfigurationDO> queryWrapper = Wrappers.lambdaQuery(); queryWrapper.eq(Objects.nonNull(request.getCategoryId()), ProductExpriConfigurationDO::getCategoryId, request.getCategoryId()); queryWrapper.eq(Objects.nonNull(request.getAssessmentType()), ProductExpriConfigurationDO::getAssessmentType, request.getAssessmentType()); queryWrapper.eq(Objects.nonNull(request.getFailTimes()), ProductExpriConfigurationDO::getFailTimes, request.getFailTimes()); Page<ProductExpriConfigurationDO> page = new Page<>(request.getPageNum(), request.getPageSize()); Page<ProductExpriConfigurationDO> configurationPage = productExpriConfigurationMapper.selectPage(page, queryWrapper); List<ProductExpriConfigurationDTO> records = productExpriConfigurationConverter.listEntityToDTO(configurationPage.getRecords()); return new PageResult<>(records); } ...}
复制代码


(9)新增商品的考核指标数据


⼤数据系统计算出商品的考核指标数据后,调⽤⽣命周期服务提供的接⼝,将考核指标数据保存到考核指标数据表中。⼤数据统计的指标结果,⼀般是单独存在⼤数据的数据库中。


@Servicepublic class ProductExpriDataResultServiceImpl implements ProductExpriDataResultService {    @Autowired    private ProductExpriRepository productExpriRepository;
//新增考核指标数据 @Override public Long saveProductExpriDataResult(ProductExpriDataResultRequest request) { checkParams(request); return productExpriRepository.saveProductExpriDataResult(request); } ...}
//考核指标数据请求入参@Data@AllArgsConstructor@NoArgsConstructorpublic class ProductExpriDataResultRequest extends PageRequest implements Serializable { //主键 private Long id; //商品品类ID private Integer categoryId; //商品ID private String itemId; //商品考核类型,1:试销期考核,2滞销期考核 private Integer assessmentType; //商品销售额考核指标,单位为分,达到此值视为考核通过,未达到视为考核不通过 private Integer salesVolume; //商品销售比例考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer soldPropotion; //商品每单利润率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer orderProfitMargin; //商品退货比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer returnRate; //商品客户投诉比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer complaintRate; //商品损耗比率考核指标,单位为千分位,例如:1代表1‰,10代表1%(达到此指标代表该指标已满足考核,但不代表考核通过,需要配和其他指标判定是否考核通过) private Integer lossRate; //考核数据是否生效,0:失效,1:生效 private Integer isEffective;}
@Repositorypublic class ProductExpriRepository { ... //新增考核指标数据 public Long saveProductExpriDataResult(ProductExpriDataResultRequest request) { //保存 ProductExpriDataResultDO productExpriDataResultDO = productExpriDataResultConverter.requestToEntity(request); productExpriDataResultDO.initCommon(); int count = productExpriDataResultMapper.insert(productExpriDataResultDO); if (count <= 0) { throw new ProductBizException(CommonErrorCodeEnum.SQL_ERROR); } return productExpriDataResultDO.getId(); } ...}
复制代码


文章转载自:东阳马生架构

原文链接:https://www.cnblogs.com/mjunz/p/18931935

体验地址:http://www.jnpfsoft.com/?from=001YH

用户头像

还未添加个人签名 2025-04-01 加入

还未添加个人简介

评论

发布
暂无评论
商品中心—商品考核系统的技术文档_架构_电子尖叫食人鱼_InfoQ写作社区