# 扫码核销优化方案

## 1. 背景
系统核销业务太多，门店操作人员很难找到对应的核销入口

比如门店端核销功能

![avatar](../images/writeoff/writeoff_1.png)

还有其他核销入口
![avatar](../images/writeoff/writeoff_2.png)

## 2. 目标
要优化成门店人员直接使用微信扫描核销码，就能根据核销码的来源，直接进入对应的核销业务

## 3. 旧有功能梳理
### 门店端 - 订单核销
#### 核销积分
![avatar](../images/writeoff/writeoff_3.png)

#### 核销优惠劵(消费劵、兑换劵)
![avatar](../images/writeoff/writeoff_4.png)

#### 核销提货劵
![avatar](../images/writeoff/writeoff_5.png)

#### 核销订单
![avatar](../images/writeoff/writeoff_6.png)

#### 核销积分订单
![avatar](../images/writeoff/writeoff_7.png)

#### 核销礼品
![avatar](../images/writeoff/writeoff_8.png)

#### 核销电商订单
![avatar](../images/writeoff/writeoff_9.png)

#### 核销权益卡
![avatar](../images/writeoff/writeoff_10.png)

### 经销商端 - 订单核销
#### 核销积分
![avatar](../images/writeoff/writeoff_11.png)

#### 核销礼品
![avatar](../images/writeoff/writeoff_12.png)

## 4. 优化方案

### 方案一: 独立的扫描核销服务
![整体架构](../images/writeoff/unified_scan_code_verification_1.png)

#### 优点
1. 核销标志码唯一，根据标识码对应唯一业务逻辑
2. 抽离各个业务端的逻辑，进行统一管理，加强扫码核销业务模块之间的关联，方便代码管理
3. 直接扫码，通过核销标志码 加微信登录进入到对应的核销业务。更加方便用户操作。不需要业务端业务人员在众多核销功能之间选择

#### 缺点
1. 根据对已有代码梳理可知。要实现这种独立的扫描核销服务，需要修改搬运的代码很多
2. 同时需要对旧代码 + 新修改进行测试。待测试的功能点比较多，会耗费比较多的时间


### 方案二: 各个业务端的快捷核销接口
![整体架构](../images/writeoff/unified_scan_code_verification_2.png)

#### 优点
1. 复用旧有代码，可以节省很多开发时间
2. 不需要太多的测试点，旧有功能的返回，错误信息都已经被测试
3. 如果把这种扫码标识交由前端管理，开发任务和时间可以更少


#### 缺点
1. 没有统一所有相关功能，进行统一管理。仅仅针对各个业务员端的功能进行统一接口
2. 没有办法实现，扫一码通过微信登录就可以进行对应的核销功能。还是需要先登录各个业务端才能进行操作


### 方案三: 方案一 + 方案二
![整体架构](../images/writeoff/unified_scan_code_verification_4.png)

通过统一扫码核销鉴权，获取用户信息

然后根据 code 判断。核销码信息，并判断是否可以进行微信公众号登录

然后根据进行微信登录，然后通过微信unionid 和标志码 生成可登录业务端的token

最后生成URL。携带登录的token 和 可自定义的参数。用于业务端的登录


#### 扫码配置
```
CREATE TABLE `ydd_scan_code_sign` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT 'ID',
  `sign_sn` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL COMMENT '扫码核销标识',
  `sign_name` varchar(100) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '扫码核销功能',
  `sign_domain` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '' COMMENT '扫码核销跳转域名',
  `write_type` varchar(64) COLLATE utf8mb4_unicode_ci NOT NULL DEFAULT '0' COMMENT '门店核销类型: 0:核销订单 2:跳转提货码页面 4:礼品 5:核销二维码 6:导购 7:核销权益卡 3:核销积分商城的礼品订单 8:核销优惠券 9:核销电商通订单。经销商： 4礼品  2 guidepoint',
  `channel_type` tinyint(3) unsigned NOT NULL DEFAULT '0' COMMENT '0双端 1 门店端 2经销商端',
  `create_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
  `update_time` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '修改时间',
  `delete_time` int(11) DEFAULT NULL COMMENT '删除时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `unique_sign` (`sign_sn`)
) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci ROW_FORMAT=DYNAMIC COMMENT='扫码核销标识';

```

```
insert into ydd_scan_code_sign(`sign_sn`, `channel_type`, `sign_name`, `write_type`, `sign_domain`, `create_time`, `update_time`)
values 
    ('mdxfzjf', 1, '核销消费者积分', '1', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), 
    ('mdyhg', 1, '核销优惠劵(消费劵、兑换劵)', '8', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), 
    ('mdyddd', 1, '核销云店商城订单', '0', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), 
    ('mdjfscdd', 1, '核销积分商城订单', '3', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()), 
    ('yxlpdd', 0, '核销智能营销活动礼品订单', '4', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
    ('mddstdd', 1, '核销电商通的订单', '9', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
    ('mdydqyk', 1, '核销云店商城的权益卡', '7', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP()),
    ('jxsdgjf', 2, '核销导购积分', 'guidepoint', 'http://pps-api.uat.2vm.co/v4/writeoff', UNIX_TIMESTAMP(), UNIX_TIMESTAMP());
```