商品中心—商品考核系统的技术文档
- 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(); } ...}文章转载自:东阳马生架构
电子尖叫食人鱼
还未添加个人签名 2025-04-01 加入
还未添加个人简介









评论