商品中心—商品考核系统的技术文档
- 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
@NoArgsConstructor
public 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;
}
@Service
public class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService {
@Autowired
private ProductExpriRepository productExpriRepository;
//新增货品质量问题记录
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveProductBadIssuesResult(ProductBadIssuesResultRequest request) {
//参数检查
checkInsertParams(request);
return productExpriRepository.saveProductBadIssuesResult(request);
}
...
}
//商品考核资源管理
@Repository
public 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
@NoArgsConstructor
public 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;
}
@Service
public class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService {
@Autowired
private ProductExpriRepository productExpriRepository;
//修改货品质量问题记录
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateProductBadIssuesResult(ProductBadIssuesResultRequest request) {
//参数检查
checkUpdateParams(request);
return productExpriRepository.updateProductBadIssuesResult(request);
}
...
}
//商品考核资源管理
@Repository
public 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
@NoArgsConstructor
public 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;
}
@Service
public class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService {
@Autowired
private ProductExpriRepository productExpriRepository;
//查询货品质量问题记录
@Override
public ProductBadIssuesResultDTO getProductBadIssuesResult(ProductBadIssuesResultRequest request) {
return productExpriRepository.getProductBadIssuesResult(request);
}
...
}
//商品考核资源管理
@Repository
public 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
@NoArgsConstructor
public 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;
}
@Service
public class ProductBadIssuesResultServiceImpl implements ProductBadIssuesResultService {
@Autowired
private ProductExpriRepository productExpriRepository;
//分页查询货品质量问题记录
@Override
public PageResult<ProductBadIssuesResultDTO> queryProductBadIssuesResultByPage(ProductBadIssuesResultRequest request) {
return productExpriRepository.queryProductBadIssuesResultByPage(request);
}
...
}
//商品考核资源管理
@Repository
public 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
@NoArgsConstructor
public 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;
}
@Service
public class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService {
@Autowired
private ProductExpriRepository productExpriRepository;
//新增考核配置信息
@Override
@Transactional(rollbackFor = Exception.class)
public Long saveProductExpriConfiguration(ProductExpriConfigurationRequest request) {
//参数检查
checkInsertParams(request);
return productExpriRepository.saveProductExpriConfiguration(request);
}
...
}
@Repository
public 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());
}
}
...
}
@Service
public class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService {
@Autowired
private ProductExpriRepository productExpriRepository;
//修改考核配置信息
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateProductExpriConfiguration(ProductExpriConfigurationRequest request) {
//参数检查
checkUpdateParams(request);
return productExpriRepository.updateProductExpriConfiguration(request);
}
...
}
@Repository
public 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());
}
}
...
}
@Service
public class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService {
@Autowired
private ProductExpriRepository productExpriRepository;
//查询考核配置信息
@Override
public ProductExpriConfigurationDTO getProductExpriConfiguration(ProductExpriConfigurationRequest request) {
return productExpriRepository.getProductExpriConfiguration(request);
}
...
}
@Repository
public 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());
}
}
...
}
@Service
public class ProductExpriConfigurationServiceImpl implements ProductExpriConfigurationService {
@Autowired
private ProductExpriRepository productExpriRepository;
//分页查询考核配置信息
@Override
public PageResult<ProductExpriConfigurationDTO> queryProductExpriConfigurationByPage(ProductExpriConfigurationRequest request) {
return productExpriRepository.queryProductExpriConfigurationByPage(request);
}
...
}
@Repository
public 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)新增商品的考核指标数据
⼤数据系统计算出商品的考核指标数据后,调⽤⽣命周期服务提供的接⼝,将考核指标数据保存到考核指标数据表中。⼤数据统计的指标结果,⼀般是单独存在⼤数据的数据库中。
@Service
public class ProductExpriDataResultServiceImpl implements ProductExpriDataResultService {
@Autowired
private ProductExpriRepository productExpriRepository;
//新增考核指标数据
@Override
public Long saveProductExpriDataResult(ProductExpriDataResultRequest request) {
checkParams(request);
return productExpriRepository.saveProductExpriDataResult(request);
}
...
}
//考核指标数据请求入参
@Data
@AllArgsConstructor
@NoArgsConstructor
public 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;
}
@Repository
public 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 加入
还未添加个人简介
评论