发票架构文档
架构思路
- 发票类型共分为增值税普通发票、电子普通发票和增值税专用发票。买家可根据购买商品的实际情况申请不同类型的发票。
- 买家如果想开具增值税专用发票,必须要先提出增票资质申请,平台审核通过后,会员在购买商品时可申请开具增值税专用发票。
- 买家申请开具发票后,由商家根据实际发票信息开具。电子发票商家需要自行上传电子发票附件以供买家下载,其它类型发票商家需自行邮寄给买家。
数据结构
1.增票资质相关数据结构
会员增票资质表(es_member_zpzz)
| 字段名 | 提示文字 | 类型 | 长度 | 主键 |
|---|---|---|---|---|
| id | 主键ID | int | 10 | 是 |
| member_id | 会员ID | int | 10 | 否 |
| uname | 会员登陆用户名 | varchar | 50 | 否 |
| status | 状态 NEW_APPLY:新申请,AUDIT_PASS:审核通过,AUDIT_REFUSE:审核未通过 | varchar | 50 | 否 |
| company_name | 单位名称 | varchar | 255 | 否 |
| taxpayer_code | 纳税人识别码 | varchar | 100 | 否 |
| register_address | 公司注册地址 | varchar | 255 | 否 |
| register_tel | 公司注册电话 | varchar | 100 | 否 |
| bank_name | 开户银行 | varchar | 255 | 否 |
| bank_account | 银行账户 | varchar | 100 | 否 |
| audit_remark | 平台审核备注 | varchar | 255 | 否 |
| apply_time | 申请时间 | long | 20 | 否 |
会员收票地址表(es_receipt_address)
| 字段名称 | 提示文字 | 类型 | 长度 | 主键 |
|---|---|---|---|---|
| id | 主键ID | int | 10 | 是 |
| member_id | 会员ID | int | 10 | 否 |
| member_name | 收票人姓名 | varchar | 50 | 否 |
| member_mobile | 收票人手机号 | varchar | 50 | 否 |
| province_id | 收票地址-所属省份ID | int | 10 | 否 |
| city_id | 收票地址-所属城市ID | int | 10 | 否 |
| county_id | 收票地址-所属区县ID | int | 10 | 否 |
| town_id | 收票地址-所属乡镇ID | int | 10 | 否 |
| province | 收票地址-所属省份 | varchar | 100 | 否 |
| city | 收票地址-所属城市 | varchar | 100 | 否 |
| county | 收票地址-所属区县 | varchar | 100 | 否 |
| town | 收票地址-所属乡镇 | varchar | 100 | 否 |
| detail_addr | 收票地址-详细地址 | varchar | 255 | 否 |
2.发票信息相关数据结构
会员发票信息缓存表(es_member_receipt)
| 字段名称 | 提示文字 | 类型 | 长度 | 主键 |
|---|---|---|---|---|
| receipt_id | 主键ID | int | 10 | 是 |
| member_id | 会员ID | int | 10 | 否 |
| receipt_type | 发票类型 ELECTRO:电子普通发票,VATORDINARY:增值税普通发票 | varchar | 50 | 否 |
| receipt_title | 发票抬头 | varchar | 255 | 否 |
| receipt_content | 发票内容 | varchar | 255 | 否 |
| tax_no | 纳税人识别号 | varchar | 100 | 否 |
| member_mobile | 收票人手机号 | varchar | 50 | 否 |
| member_email | 收票人邮箱 | varchar | 100 | 否 |
| is_default | 是否为默认选项 0:否,1:是 | int | 1 | 否 |
会员开票历史记录表(es_receipt_history)
| 字段名称 | 提示文字 | 类型 | 长度 | 主键 |
|---|---|---|---|---|
| history_id | 主键ID | int | 10 | 是 |
| order_sn | 订单编号 | varchar | 100 | 否 |
| order_price | 订单金额 | decimal | 20 | 否 |
| seller_id | 开票商家ID | int | 10 | 否 |
| seller_name | 开票商家 | varchar | 255 | 否 |
| member_id | 会员ID | int | 10 | 否 |
| status | 开票状态 0:未开,1:已开 | int | 1 | 否 |
| receipt_method | 开票方式 | varchar | 100 | 否 |
| receipt_type | 发票类型 ELECTRO:电子普通发票,VATORDINARY:增值税普通发票,VATOSPECIAL:增值税专用发票 | varchar | 255 | 否 |
| logi_id | 物流公司ID | int | 10 | 否 |
| logi_name | 物流公司名称 | varchar | 100 | 否 |
| logi_code | 快递单号 | varchar | 100 | 否 |
| receipt_title | 发票抬头 | varchar | 255 | 否 |
| receipt_content | 发票内容 | varchar | 255 | 否 |
| tax_no | 纳税人识别号 | varchar | 100 | 否 |
| reg_addr | 注册地址 | varchar | 255 | 否 |
| reg_tel | 注册电话 | varchar | 100 | 否 |
| bank_name | 开户银行 | varchar | 255 | 否 |
| bank_account | 银行账户 | varchar | 100 | 否 |
| member_name | 收票人名称 | varchar | 50 | 否 |
| member_mobile | 收票人手机号 | varchar | 50 | 否 |
| member_email | 收票人邮箱 | varchar | 100 | 否 |
| province_id | 收票地址-所属省份ID | int | 10 | 否 |
| city_id | 收票地址-所属城市ID | int | 10 | 否 |
| county_id | 收票地址-所属区县ID | int | 10 | 否 |
| town_id | 收票地址-所属乡镇ID | int | 10 | 否 |
| province | 收票地址-所属省份 | varchar | 100 | 否 |
| city | 收票地址-所属城市 | varchar | 100 | 否 |
| county | 收票地址-所属区县 | varchar | 100 | 否 |
| town | 收票地址-所属乡镇 | varchar | 100 | 否 |
| detail_addr | 收票地址-详细地址 | varchar | 255 | 否 |
| add_time | 申请开票日期 | long | 20 | 否 |
| goods_json | 订单商品数据 | text | 0 | 否 |
| order_status | 相关订单出库状态 | varchar | 50 | 否 |
会员电子发票附件表(es_receipt_file)
| 字段名称 | 提示文字 | 类型 | 长度 | 主键 |
|---|---|---|---|---|
| id | 主键ID | int | 10 | 是 |
| history_id | 会员开票历史记录ID | int | 10 | 否 |
| elec_file | 电子发票附件 | varchar | 255 | 否 |
领域模型
1.增票资质领域模型
会员与增票资质信息关系为一对一。

模型说明
| 属性 | 说明 | 备注 |
|---|---|---|
| id | 主键 | |
| memberId | 会员ID | |
| uname | 会员登陆用户名 | |
| status | 状态 | NEW_APPLY:新申请,AUDIT_PASS:审核通过,AUDIT_REFUSE:审核未通过 |
| companyName | 单位名称 | |
| taxpayerCode | 纳税人识别码 | |
| registerAddress | 公司注册地址 | |
| registerTel | 公司注册电话 | |
| bankName | 开户银行 | |
| bankAccount | 银行账户 | |
| auditRemark | 平台审核备注 | 备注最多允许输入200个字符 |
| applyTime | 申请时间 |
2.会员收票地址领域模型
会员与收票地址关系为一对一。
申请开票时默认使用收票地址信息,但是可以修改,修改后不改变一开始添加的收票地址信息。

模型说明
| 属性 | 说明 | 备注 |
|---|---|---|
| id | 主键 | |
| memberId | 会员ID | |
| memberName | 收票人姓名 | 此字段值不是会员用户名,而是会员添加的收票人姓名 |
| memberMobile | 收票人手机号 | 此字段值不是会员注册手机号,而是会员添加的收票人手机号 |
| provinceId | 所属省份ID | |
| cityId | 所属城市ID | |
| countyId | 所属区县ID | |
| townId | 所属乡镇ID | |
| province | 所属省份 | |
| city | 所属城市 | |
| county | 所属区县 | |
| town | 所属乡镇 | |
| detailAddr | 详细地址 |
3.会员发票信息缓存领域模型
不缓存增值税专用发票和抬头为个人的发票信息。

模型说明
| 属性 | 说明 | 备注 |
|---|---|---|
| receiptId | 主键 | |
| memberId | 会员ID | |
| receiptType | 发票类型 | ELECTRO:电子普通发票,VATORDINARY:增值税普通发票 |
| receiptTitle | 发票抬头 | |
| receiptContent | 发票内容 | |
| taxNo | 纳税人识别码 | |
| memberMobile | 收票人手机号 | |
| memberEmail | 收票人邮箱 | |
| isDefault | 是否为默认选项 | 0:否,1:是 |
4.会员开票历史记录领域模型
流程图

模型图

模型说明
ReceiptHistory
| 属性 | 说明 | 备注 |
|---|---|---|
| historyId | 主键 | |
| orderSn | 订单编号 | 一个订单对应一条发票信息 |
| orderPrice | 订单金额 | 此订单金额不等于发票金额,发票金额由商家根据具体情况而定 |
| sellerId | 商家ID | |
| sellerName | 商家名称 | |
| memberId | 会员ID | |
| status | 开票状态 | 0:未开,1:已开 |
| receiptMethod | 开票方式 | 针对增值税专用发票,暂时只有"订单完成后开票"一种方式 |
| receiptType | 发票类型 | 发票类型 ELECTRO:电子普通发票,VATORDINARY:增值税普通发票,VATOSPECIAL:增值税专用发票 |
| logiId | 物流公司ID | 针对发票类型为增值税普通发票和增值税专用发票才会有值 |
| logiName | 物流公司名称 | 针对发票类型为增值税普通发票和增值税专用发票才会有值 |
| logiCode | 快递号 | 针对发票类型为增值税普通发票和增值税专用发票才会有值 |
| receiptTitle | 发票抬头 | 个人或单位(单位必须是公司完整名称) |
| receiptContent | 发票内容 | |
| taxNo | 纳税人识别码 | 发票抬头是单位的,此项必填 |
| regAddr | 注册地址 | 公司注册时填写的地址信息 |
| regTel | 注册电话 | 公司注册时填写的电话信息 |
| bankName | 银行名称 | 公司注册时填写的开户银行名称 |
| bankAccount | 银行账户 | 公司注册时填写的银行账户信息 |
| memberName | 收票人姓名 | 此字段值不是会员用户名,而是会员添加的收票人姓名 |
| memberMobile | 收票人手机号 | 此字段值不是会员注册手机号,而是会员添加的收票人手机号 |
| memberEmail | 收票人邮箱 | 此字段值不是会员绑定的邮箱,而是会员添加的收票人邮箱 |
| provinceId | 所属省份ID | 收票地址--所属省份ID |
| cityId | 所属城市ID | 收票地址--所属城市ID |
| countyId | 所属区县ID | 收票地址--所属区县ID |
| townId | 所属乡镇ID | 收票地址--所属乡镇ID |
| province | 所属省份 | 收票地址--所属省份 |
| city | 所属城市 | 收票地址--所属城市 |
| county | 所属区县 | 收票地址--所属区县 |
| town | 所属乡镇 | 收票地址--所属乡镇 |
| detailAddr | 详细地址 | 收票地址--详细地址 |
| addTime | 申请开票日期 |
ReceiptHistoryVO
ReceiptHistoryVO继承ReceiptHistory
| 属性 | 说明 | 备注 |
|---|---|---|
| skuList | 商品信息集合 | 包含的是订单下单商品的信息 |
ReceiptFileVO
电子普通发票附件VO,用于商家上传电子发票附件时使用。
电子发票可上传多张附件。
| 属性 | 说明 | 备注 |
|---|---|---|
| historyId | 开票记录ID | 关联会员开票历史记录表 |
| files | 附件集合 | 类型是List |
其他
商家可以手动设置开启和关闭开票功能。开启后,购买此商家的商品才可以申请开具相对应类型的发票。
商家店铺详情表(es_shop_detail)需要新增两个字段:
ordin_receipt_status:是否允许开具增值税普通发票 0:否,1:是
elec_receipt_status:是否允许开具电子普通发票 0:否,1:是
tax_receipt_status:是否允许开具增值税专用发票 0:否,1:是
| 请求路径 | 请求方式 | 请求参数 | 返回值 | 备注 |
|---|---|---|---|---|
| /seller/shops/receipt | POST | ShopReceiptDTO | 无 | 此API在ShopSellerController中 |
- 结算页面会员申请发票时,需要判断是否允许开具发票。
如果购买多个商家店铺的商品,需要判断商家店铺是否开启了相关类型发票的开票功能,只要有一个商家不允许开具某个类型的发票,那么所有商家的商品都不允许开具此类型的发票
| 请求路径 | 请求方式 | 请求参数 | 返回值 | 备注 |
|---|---|---|---|---|
| /shops/{ids}/check/receipt | GET | ids(Integer[]) | ShopReceiptDTO | 此API在ShopBuyerController中 |