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

57 阅读22分钟

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();
    }
    ...
}

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

原文链接: www.cnblogs.com/mjunz/p/189…

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