package main
import (
"github.com/hyperledger/fabric/core/chaincode/shim"
"encoding/json"
"github.com/hyperledger/fabric/protos/peer"
)
// 根据指定的票据号码获取对应的票据信息
func (t *BillChainCode) getBill(stub shim.ChaincodeStubInterface, bill_No string) (Bill, bool) {
var bill Bill
// 1. 将定义的前缀与票据号码连接形成一个Key
key := Bill_Prefix + bill_No
// 2. 以Key为参数查询票据信息
b, err := stub.GetState(key)
if b == nil || err != nil {
return bill, false
}
// 3. 反序列化查询到的票据
err = json.Unmarshal(b, &bill)
if err != nil{
return bill, false
}
// 4. 返回
return bill, true
}
// 保存指定的票据信息
func (t *BillChainCode) putBill(stub shim.ChaincodeStubInterface, bill Bill) ([]byte, bool) {
// 1. 将参数bill序列化
b, err := json.Marshal(bill)
if err != nil {
return nil, false
}
// 2. 以定义的前缀与票据号码连接形成一个Key将bill保存在账本中
err = stub.PutState(Bill_Prefix + bill.BillInfoID, b)
if err != nil {
return nil, false
}
// 3. 返回
return b, true
}
// 发布票据
// args: 0 - {bill object}
func (t *BillChainCode) issue(stub shim.ChaincodeStubInterface, args[] string) peer.Response {
// 1. 检查参数个数是否为一个
if len(args) != 1 {
res := GetRetString(1, "发布票据指定的参数个数只能是一个")
return shim.Error(res)
}
// 2. 反序列化args[0]参数为bill
var bill Bill
err := json.Unmarshal([]byte(args[0]), &bill)
if err != nil {
res := GetRetString(1, "发布票据时指定的票据信息反序列化失败")
return shim.Error(res)
}
// 3. 查重(根据票据号码查询是否存在. 如果根据票据号码查询到信息, 证明已存在)
_, exist := t.getBill(stub, bill.BillInfoID)
if exist {
res := GetRetString(1, "发布票据失败, 该票据号码已存在: " + bill.BillInfoID)
return shim.Error(res)
}
// 4. 更改票据状态(票据状态设为新发布). 并保存票据:
bill.State = BillInfo_State_NewPublish
_, bl := t.putBill(stub, bill)
if !bl {
res := GetRetString(1,"发布票据失败, 保存票据信息时发生错误!")
return shim.Error(res)
}
// 5. 保存以当前持票人ID与票据号码构造的复合键, 以便持票人批量查询. value为空即可
holderNameBillNoIndexKey, err := stub.CreateCompositeKey(IndexName, []string{bill.HoldrCmID, bill.BillInfoID})
if err != nil {
res := GetRetString(1, "创建持票人ID与票据号码的复合键失败")
return shim.Error(res)
}
stub.PutState(holderNameBillNoIndexKey, []byte{0x00})
// 6. 返回
res := GetRetByte(0, "票据发布成功")
return shim.Success(res)
}
// 查询当前用户的票据(根据当前持票人证件号码, 批量查询票据)
// args: 0 - holderCmId(当前持票人证件号码)
func (t *BillChainCode) queryMyBills(stub shim.ChaincodeStubInterface, args []string) peer.Response {
// 1. 检查参数个数是否为一个
if len(args) != 1 {
res := GetRetString(1, "查询票据失败, 给定的参数只能是当前持票人的证件号码")
return shim.Error(res)
}
// 根据指定的组合键查询分类账上的状态ST
// -- 在发布票据方法中实现了将复合键(持票人ID与票据号码构造的复合键)保存在分类账中
// 2. 根据当前持票人证件号码从search中查询所持有的票号
billsIterator, err := stub.GetStateByPartialCompositeKey(IndexName, []string{args[0]})
if err != nil {
res := GetRetString(1, "查询票据失败, 查询所持有的票号时发生错误")
return shim.Error(res)
}
defer billsIterator.Close()
// 3. 迭代处理
var bills = []Bill{}
for billsIterator.HasNext() {
kv, _ := billsIterator.Next()
// 获取持票人名下的票号
_, compositeKeyParts, err := stub.SplitCompositeKey(kv.Key)
if err != nil {
res := GetRetString(1, "查询票据失败, 分割复合键时发生错误")
return shim.Error(res)
}
// 根据获取到的票据号码查询对应的票据状态
bill, bl := t.getBill(stub, compositeKeyParts[1])
if !bl {
res := GetRetString(1, "根据票据号码查询对应的票据状态时发生错误")
return shim.Error(res)
}
bills = append(bills, bill)
}
// 4. 序列化票据数组
b, err := json.Marshal(bills)
if err != nil {
res := GetRetString(1, "查询票据失败, 序列化票据状态时发生错误")
return shim.Error(res)
}
// 5. 返回查询结果
return shim.Success(b)
}
// 根据票据号码获取票据状态及该票据的背书历史
// args: 0 - bill_No
func (t *BillChainCode) queryBillByNo(stub shim.ChaincodeStubInterface, args []string) peer.Response {
// 1. 检查参数个数是否为一个
if len(args) != 1 {
res := GetRetString(1, "获取票据状态及背书历史失败, 给定的参数必须为票据号码")
return shim.Error(res)
}
// 2. 根据票据号码获取对应的票据状态
bill, bl := t.getBill(stub, args[0])
if !bl {
res := GetRetString(1, "获取票据状态及背书历史失败, 根据给定的票据号码查询对应的票据状态时发生错误")
return shim.Error(res)
}
// 3. 获取票据背书变更历史
billIterator, err := stub.GetHistoryForKey(Bill_Prefix + args[0])
if err != nil {
res := GetRetString(1, "获取票据状态及背书历史失败, 查询背书历史变更时发生错误")
return shim.Error(res)
}
defer billIterator.Close()
// 4. 迭代处理
var historys []HistoryItem
var hisBill Bill
for billIterator.HasNext() {
historyData, err := billIterator.Next()
if err != nil{
res := GetRetString(1, "获取票据状态及背书历史失败, 处理票据变更历史时发生错误")
return shim.Error(res)
}
var historyItem HistoryItem
historyItem.TxId = historyData.TxId // 拷贝交易ID
json.Unmarshal(historyData.Value, &hisBill)
if historyData.Value == nil {
var emptyBill Bill
historyItem.Bill = emptyBill
}else{
historyItem.Bill = hisBill
}
historys = append(historys, historyItem)
}
// 5. 将背书历史做为票据的属性返回
bill.History = historys
// 6. 序列化bill
b, err := json.Marshal(bill)
if err != nil {
res := GetRetString(1, "获取票据状态及背书历史失败, 序列化票据时发生错误")
return shim.Error(res)
}
// 7. 返回结果
return shim.Success(b)
}
//删除指定票据
func (t *BillChainCode)delete(stub shim.ChaincodeStubInterface,args []string)peer.Response {
// 1. 检查参数个数是否为一个
if len(args) != 1 {
res := GetRetString(1, "删除指定票据失败, 给定的参数必须为票据号码")
return shim.Error(res)
}
// 2. 根据票据号码获取对应的票据状态
_, bl := t.getBill(stub, args[0])
if !bl {
res := GetRetString(1, "获取票据状态及背书历史失败, 根据给定的票据号码查询对应的票据状态时发生错误")
return shim.Error(res)
}
key := Bill_Prefix + args[0]
err := stub.DelState(key)
if err != nil {
res := GetRetString(1, "删除票据失败")
return shim.Error(res)
}
// 6. 返回
res := GetRetByte(0, "票据删除成功")
return shim.Success(res)
}
// 查询当前用户的待背书票据(根据待背书人证件号码)
// args: 0 - endorserCmId
func (t *BillChainCode) queryMyWaitBills(stub shim.ChaincodeStubInterface, args []string) peer.Response {
// 1. 检查参数个数是否为一个
if len(args) != 1 {
res := GetRetString(1, "查询待背书票据失败, 必须指定待背书人的证件号码")
return shim.Error(res)
}
// 2. 根据待背书人证件号码从search中查询待背书的票据号码
// -- 票据背书请求方法中实现了将待背书人ID与票据号码构造的复合键信息的保存
billIterator, err := stub.GetStateByPartialCompositeKey(IndexName, []string{args[0]})
if err != nil {
res := GetRetString(1, "查询待背书票据失败, 查询待背书人的票据号码时发生错误")
return shim.Error(res)
没有合适的资源?快使用搜索试试~ 我知道了~
人工智能-项目实践-区块链-银行区块链票据项目.zip
共151个文件
pem:55个
crt:20个
go:14个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 50 浏览量
2024-01-03
23:41:28
上传
评论
收藏 193KB ZIP 举报
温馨提示
人工智能-项目实践-区块链-银行区块链票据项目 票据业务是指信用机构,按照一定的方式和要求为票据的设立、转移和偿付而进行的日常营业性的业务活动。主要包括票据的承兑、贴现和票据抵押放款业务。 票据业务是银行一项传统的资产业务。银行的票据业务是建立在商业信用基础之上的。是银行信用和商业信用的结合。开办票据业务,可以促进商业信用的票据化,加强对商业信用的管理,为促进商品生产和商品流通、搞活经济创造条件
资源推荐
资源详情
资源评论
收起资源包目录
人工智能-项目实践-区块链-银行区块链票据项目.zip (151个子文件)
00f3d3f738be05a8dff0b1c76e49e642141165d3cc650596e95ff926a29ac22d_sk 241B
1ef296b59a24b30ebd722bfa8eac0752929c597be002f77cabf70effbdb72e7e_sk 241B
2e4b52fd060cbb1e2d478483c556dbfcb31ba765ef1f1436af6b0a27d758b56c_sk 241B
351ff344270e862be47d4e0442c96ac67ae466898fccbad8b9eba25d8a604cf2_sk 241B
3e150e050d7ce262ecd63cb55ff498836cd5754cac8378e14be9e9502ae85ec2_sk 241B
471ebb31833db2522c026a22cf11f556854dd926880010123990cfabe7eef4e5_sk 241B
52a4a4cec4c8b3cce027018f33a3361e34de6edc143a804609df36def9e80004_sk 241B
55e4e407eff74668c0e15d0119ba4af4ef5779d8a01fbbe2eae7760df11d968a_sk 241B
66e079657a3813fdf9b3ecbd7bd17df7eb0ac23e025fd88cd50db1e091e2d3ec_sk 241B
69ff3a2c34802277140cc97e76c3cca7d68e2c67d086f88d9bfced05a6244145_sk 241B
7a3bf9697cd011c552e49a43c13141ba4546533b8a96a15b8eaa3c7cca6ad0e7_sk 241B
7edf6b8ad4fb7d4c8f93a86441a8301f247db5d9bf2bbae967bc5f36d714e547_sk 241B
89c83d48f707e3487762ec1f9f297558ee61e31c63f2f8aac4bda3df6662230e_sk 241B
genesis.block 12KB
c12bedd969be10bf8297668c470a02602939bb185635f0cebc31d826cb5d31d5_sk 241B
c8f1ee67181f4dbbecc065de8c470444f3f99a5d673f87fc79335bafab9caa1f_sk 241B
server.crt 895B
server.crt 895B
server.crt 895B
server.crt 891B
server.crt 875B
ca.crt 855B
ca.crt 855B
ca.crt 855B
ca.crt 855B
ca.crt 855B
ca.crt 855B
ca.crt 855B
ca.crt 855B
client.crt 834B
client.crt 834B
client.crt 834B
client.crt 834B
ca.crt 826B
ca.crt 826B
client.crt 814B
billCommon.css 5KB
popout.css 1KB
login.css 904B
.DS_Store 6KB
fca80a3ce2abfd36a5a427ce7bc94d8bf91f505864bb04cf3c402e2272962c40_sk 241B
.gitkeep 0B
billcc.go 9KB
endorserCC.go 6KB
controllerHandler.go 6KB
startInit.go 5KB
main.go 4KB
endorseService.go 3KB
billService.go 2KB
structure.go 2KB
structure.go 2KB
main.go 1KB
app.go 1KB
utils.go 840B
controllerResponse.go 448B
domain.go 447B
billInfo.html 8KB
waitBillInfo.html 8KB
issue.html 5KB
waitBills.html 4KB
bills.html 3KB
login.html 1KB
blockchain.iml 322B
jquery.min.js 94KB
billCommon.js 3KB
login.js 326B
popout.js 130B
client.key 241B
server.key 241B
client.key 241B
client.key 241B
server.key 241B
server.key 241B
client.key 241B
client.key 241B
server.key 241B
server.key 241B
Gopkg.lock 12KB
Makefile 830B
tlsca.org2.example.com-cert.pem 855B
tlsca.org2.example.com-cert.pem 855B
tlsca.org2.example.com-cert.pem 855B
tlsca.org2.example.com-cert.pem 855B
tlsca.org2.example.com-cert.pem 855B
tlsca.org2.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
tlsca.org1.example.com-cert.pem 855B
ca.org2.example.com-cert.pem 847B
ca.org2.example.com-cert.pem 847B
ca.org2.example.com-cert.pem 847B
ca.org2.example.com-cert.pem 847B
ca.org2.example.com-cert.pem 847B
ca.org2.example.com-cert.pem 847B
ca.org1.example.com-cert.pem 847B
ca.org1.example.com-cert.pem 847B
ca.org1.example.com-cert.pem 847B
共 151 条
- 1
- 2
资源评论
博士僧小星
- 粉丝: 1711
- 资源: 5876
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功