发票架构文档
架构思路
- 发票类型共分为增值税普通发票、电子普通发票和增值税专用发票。买家可根据购买商品的实际情况申请不同类型的发票。
- 买家如果想开具增值税专用发票,必须要先提出增票资质申请,平台审核通过后,会员在购买商品时可申请开具增值税专用发票。
- 买家申请开具发票后,由商家根据实际发票信息开具。电子发票商家需要自行上传电子发票附件以供买家下载,其它类型发票商家需自行邮寄给买家。
数据结构
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中 |