zoukankan      html  css  js  c++  java
  • fabric-sdk-go client开发

    1.代码结构图

    2.prescription-client-config.yaml文件

      1 name: "chaoyang-prescription-network"
      2 description: "chao yang hospital prescription network"
      3 version: 1.0.0
      4 client:
      5   organization: cyorg.bjgoodwill.com
      6   logging:
      7     level: info
      8   cryptoconfig:
      9     path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config
     10     #path: /opt/app/fabric/cli/user/cyorg.bjgoodwill.com/Admin-peer0cyorg.bjgoodwill..com
     11   credentialStore:
     12     path: /tmp/state-store
     13     cryptoStore:
     14       path: /tmp/msp
     15   BCCSP:
     16     security:
     17      enabled: true
     18      default:
     19       provider: "SW"
     20      hashAlgorithm: "SHA2"
     21      softVerify: true
     22      level: 256
     23   tlsCerts:
     24     systemCertPool: false
     25     client:
     26       key:
     27         path:
     28         #path: /opt/app/fabric/cli/user/cyorg.bjgoodwill.com/Admin-peer0.cyorg.bjgoodwill.com/tls/client.key
     29       cert:
     30         path:
     31         #path: /opt/app/fabric/cli/user/cyorg.bjgoodwill.com/Admin-peer0.cyorg.bjgoodwill.com/tls/client.crt
     32 channels:
     33   prescriptionchannel:
     34     peers:
     35       peer0.cyorg.bjgoodwill.com:
     36         endorsingPeer: true
     37         chaincodeQuery: true
     38         ledgerQuery: true
     39         eventSource: true
     40     policies:
     41       queryChannelConfig:
     42         minResponses: 1
     43         maxTargets: 1
     44         retryOpts:
     45           attempts: 5
     46           initialBackoff: 500ms
     47           maxBackoff: 5s
     48           backoffFactor: 2.0
     49           
     50   prescriptionmultiorgchannel:
     51 
     52     peers:
     53       peer0.cyorg.bjgoodwill.com:
     54         endorsingPeer: true
     55         chaincodeQuery: true
     56         ledgerQuery: true
     57         eventSource: true
     58 
     59       peer0.jhorg.bjgoodwill.com:
     60         endorsingPeer: true
     61         chaincodeQuery: true
     62         ledgerQuery: true
     63         eventSource: true
     64 
     65       peer0.wjworg.bjgoodwill.com:
     66         endorsingPeer: true
     67         chaincodeQuery: true
     68         ledgerQuery: true
     69         eventSource: true
     70 
     71     # [Optional]. The application can use these options to perform channel operations like retrieving channel
     72     # config etc.
     73     policies:
     74       #[Optional] options for retrieving channel configuration blocks
     75       queryChannelConfig:
     76         #[Optional] min number of success responses (from targets/peers)
     77         minResponses: 1
     78         #[Optional] channel config will be retrieved for these number of random targets
     79         maxTargets: 1
     80         #[Optional] retry options for query config block
     81         retryOpts:
     82           #[Optional] number of retry attempts
     83           attempts: 5
     84           #[Optional] the back off interval for the first retry attempt
     85           initialBackoff: 500ms
     86           #[Optional] the maximum back off interval for any retry attempt
     87           maxBackoff: 5s
     88           #[Optional] he factor by which the initial back off period is exponentially incremented
     89           backoffFactor: 2.0
     90 
     91 organizations:
     92   cyorg.bjgoodwill.com:
     93     mspid: CYOrgMSP
     94     cryptoPath: peerOrganizations/cyorg.bjgoodwill.com/users/Admin@cyorg.bjgoodwill.com/msp/
     95     #cryptoPath: msp/
     96     peers:
     97       - peer0.cyorg.bjgoodwill.com
     98     certificateAuthorities:
     99       - ca.cyorg.bjgoodwill.com
    100   
    101   jhorg.bjgoodwill.com:
    102     mspid: JHOrgMSP
    103     # This org's MSP store (absolute path or relative to client.cryptoconfig)
    104     cryptoPath:  peerOrganizations/jhorg.bjgoodwill.com/users/Admin@jhorg.bjgoodwill.com/msp
    105     peers:
    106       - peer0.jhorg.bjgoodwill.com
    107     certificateAuthorities:
    108       - ca.jhorg.bjgoodwill.com
    109   
    110   wjworg.bjgoodwill.com:
    111     mspid: WJWOrgMSP
    112     # This org's MSP store (absolute path or relative to client.cryptoconfig)
    113     cryptoPath:  peerOrganizations/wjworg.bjgoodwill.com/users/Admin@wjworg.bjgoodwill.com/msp
    114     peers:
    115       - peer0.wjworg.bjgoodwill.com
    116     certificateAuthorities:
    117       - ca.wjworg.bjgoodwill.com 
    118      # Orderer Org name
    119   ordererorg:
    120       # Membership Service Provider ID for this organization
    121       mspID: "PrescriptionOrdererMSP"
    122 
    123       # Needed to load users crypto keys and certs for this org (absolute path or relative to global crypto path, DEV mode)
    124       cryptoPath: ordererOrganizations/bjgoodwill.com/users/Admin@bjgoodwill.com/msp
    125 
    126 orderers:
    127   orderer.bjgoodwill.com:
    128     url: grpc://192.168.229.136:7050
    129     grpcOptions:
    130       ssl-target-name-override: orderer.bjgoodwill.com
    131       keep-alive-time: 0s
    132       keep-alive-timeout: 20s
    133       keep-alive-permit: false
    134       fail-fast: false
    135       allow-insecure: false
    136     tlsCACerts:
    137       path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/ordererOrganizations/bjgoodwill.com/tlsca/tlsca.bjgoodwill.com-cert.pem
    138       #path: /opt/app/fabric/cli/user/member1.example.com/Admin-peer0.member1.example.com/tlsca.member1.example.com-cert.pem
    139 peers:
    140   peer0.cyorg.bjgoodwill.com:
    141     url: grpc://192.168.229.138:7051
    142     eventUrl: grpc://192.168.229.138:7053
    143     grpcOptions:
    144       ssl-target-name-override: peer0.cyorg.bjgoodwill.com
    145       keep-alive-time: 0s
    146       keep-alive-timeout: 20s
    147       keep-alive-permit: false
    148       fail-fast: false
    149       allow-insecure: false
    150     tlsCACerts:
    151       path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/cyorg.bjgoodwill.com/tlsca/tlsca.cyorg.bjgoodwill.com-cert.pem
    152       #path: /opt/app/fabric/cli/user/cyorg.bjgoodwill.com/Admin-peer0.cyorg.bjgoodwill.com/tls/ca.crt
    153  
    154   peer0.jhorg.bjgoodwill.com:
    155     url: peer0.jhorg.bjgoodwill.com:7051
    156     eventUrl: peer0.jhorg.bjgoodwill.com:7053
    157     grpcOptions:
    158       ssl-target-name-override: peer0.jhorg.bjgoodwill.com
    159       keep-alive-time: 0s
    160       keep-alive-timeout: 20s
    161       keep-alive-permit: false
    162       fail-fast: false
    163       allow-insecure: false
    164     tlsCACerts:
    165       path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/jhorg.bjgoodwill.com/tlsca/tlsca.jhorg.bjgoodwill.com-cert.pem
    166       #path: /opt/app/fabric/cli/user/member1.example.com/Admin-peer0.member1.example.com/tls/ca.crt
    167       
    168   peer0.wjworg.bjgoodwill.com:
    169     url: peer0.wjworg.bjgoodwill.com:7051
    170     eventUrl: peer0.wjworg.bjgoodwill.com:7053
    171     grpcOptions:
    172       ssl-target-name-override: peer0.wjworg.bjgoodwill.com
    173       keep-alive-time: 0s
    174       keep-alive-timeout: 20s
    175       keep-alive-permit: false
    176       fail-fast: false
    177       allow-insecure: false
    178     tlsCACerts:
    179       path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/wjworg.bjgoodwill.com/tlsca/tlsca.wjworg.bjgoodwill.com-cert.pem
    180       #path: /opt/app/fabric/cli/user/member1.example.com/Admin-peer0.member1.example.com/tls/ca.crt
    181 certificateAuthorities:
    182   ca.fbi.citizens.com:
    183     url: https://192.168.229.138:7054
    184     tlsCACerts:
    185       # Comma-Separated list of paths
    186       path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/cyorg.bjgoodwill.com/tlsca/tlsca.cyorg.bjgoodwill.com-cert.pem
    187       # Client key and cert for SSL handshake with Fabric CA
    188       client:
    189         key:
    190           path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/cyorg.bjgoodwill.com/users/User1@cyorg.bjgoodwill.com/tls/client.key
    191         cert:
    192           path: ${GOPATH}/src/github.com/prescriptionserver/client/go/crypto-config/peerOrganizations/cyorg.bjgoodwill.com/users/User1@cyorg.bjgoodwill.com/tls/client.crt
    193 
    194     # Fabric-CA supports dynamic user enrollment via REST APIs. A "root" user, a.k.a registrar, is
    195     # needed to enroll and invoke new users.
    196     registrar:
    197       enrollId: admin
    198       enrollSecret: adminpw
    199     # [Optional] The optional name of the CA.
    200     caName: ca.cyorg.bjgoodwill.com
    201 
    202 entityMatchers:
    203   orderer:
    204     - pattern: (w*)orderer.bjgoodwill.com(w*)
    205       urlSubstitutionExp: grpc://orderer.bjgoodwill.com:7050
    206       sslTargetOverrideUrlSubstitutionExp: orderer.bjgoodwill.com
    207       mappedHost: orderer.bjgoodwill.com
    View Code

    3.prescriptionclient.yaml文件

     1 prescriptionclient:
     2   fabricsdk:
     3     configfile: ./client/go/config/prescription-client-config.yaml
     4   resmgmt:
     5     orgname: cyorg.bjgoodwill.com
     6     orgadmin: Admin
     7   channel:
     8     channelconfig: /src/github.com/prescriptionserver/client/go/channel-artifacts/prescription.tx
     9     channelid: prescriptionchannel
    10     username: User1
    11   msp:
    12     orgname: cyorg.bjgoodwill.com
    13     mspid: CYOrgMSP
    14   filepath:
    15     configfilepath: ./client/go/config/prescriptionclient.yaml
    View Code

    4.config.go代码

     1 package util
     2 
     3 import (
     4     "encoding/json"
     5     "io/ioutil"
     6     "github.com/prescriptionserver/client/go/global"
     7     "log"
     8 )
     9 
    10 var prescriptionclientconfig []byte
    11 
    12 type PrescriptionClientConfig struct {
    13     PrescriptionClient PrescriptionClient `yaml:"prescriptionclient"`
    14 }
    15 type PrescriptionClient struct {
    16     FabricSDK FabricSDK `yaml:"fabricsdk"`
    17     ResMgmt ResMgmt `yaml:"resmgmt"`
    18     Channel Channel `yaml:"channel"`
    19     Msp Msp `yaml:"msp"`
    20     FilePath FilePath `yaml:"filepath"`
    21 }
    22 type FabricSDK struct {
    23     ConfigFile string `yaml:"configfile"`
    24 }
    25 type Channel struct {
    26     ChannelConfig string `yaml:"channelconfig"`
    27     ChannelID string `yaml:"channelid"`
    28     UserName string `yaml:"username"`
    29 }
    30 type ResMgmt struct {
    31     OrgName string `yaml:"orgname"`
    32     OrgAdmin string `yaml:"orgadmin"`
    33 }
    34 type Msp struct {
    35     OrgName string `yaml:"orgname"`
    36     MSPID string `yaml:"mspid"`
    37 }
    38 type FilePath struct {
    39     ConfigFilePath string `yaml:"configfilepath"`
    40 }
    41 
    42 func GetPrescriptionClientConfig() (pcc *PrescriptionClientConfig,err error) {
    43     err = json.Unmarshal(prescriptionclientconfig,&pcc)
    44     return pcc,err
    45 }
    46 func init()  {
    47     var err error
    48     prescriptionclientconfig,err =ioutil.ReadFile(global.ConfigFile)
    49     if err != nil{
    50         global.Logger.Errorf("prescriptionclient.yaml file get error: %v",err)
    51         log.Fatalf("prescriptionclient.yaml file get error: %v",err)
    52     }
    53 }
    View Code

    5.ecslfabricsdk.go代码

     1 package encapsulation
     2 
     3 import (
     4     "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
     5     "sync"
     6     "github.com/prescriptionserver/client/go/global"
     7     "github.com/hyperledger/fabric-sdk-go/pkg/core/config"
     8     "github.com/prescriptionserver/client/go/util"
     9     "github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
    10     "github.com/hyperledger/fabric-sdk-go/pkg/client/event"
    11 )
    12 
    13 type EcslFabricSDK struct {
    14     sdk *fabsdk.FabricSDK
    15 }
    16 
    17 var (
    18     efsdk *EcslFabricSDK
    19     once sync.Once
    20 )
    21 
    22 func GetEcslFabricSDKInstance() (*EcslFabricSDK,error) {
    23     var err error
    24     once.Do(func() {
    25         cf, e := util.GetPrescriptionClientConfig()
    26         if e != nil{
    27             global.Logger.Errorf("load prescriptionclient.yaml file error: %v
    ",err)
    28             err=e
    29         }else {
    30             configProvider :=config.FromFile(cf.PrescriptionClient.FabricSDK.ConfigFile)
    31             sdk,err :=fabsdk.New(configProvider)
    32             if err != nil{
    33                 global.Logger.Errorf("initialize fabsdk error: %v
    ",err)
    34             }else {
    35                 efsdk=&EcslFabricSDK{
    36                     sdk:sdk,
    37                 }
    38                 err = nil
    39             }
    40         }
    41 
    42     })
    43     return efsdk,err
    44 }
    45 func (efsdk *EcslFabricSDK) GetChannelAndEventClient(channelid string,
    46     username string)(channelclient *channel.Client,eventclient *event.Client,err error) {
    47     sdk, err := GetEcslFabricSDKInstance()
    48     if err != nil{
    49         return nil,nil,err
    50     }
    51     clientcontext := sdk.sdk.ChannelContext(channelid, fabsdk.WithUser(username))
    52     channelclient,err = channel.New(clientcontext)
    53     if err != nil{
    54         return channelclient,nil,err
    55     }
    56     eventclient,err =event.New(clientcontext)
    57     return channelclient,eventclient,err
    58 }
    59 func (efsdk *EcslFabricSDK) GetChannelClient(channelid string,
    60     username string) (channelclient *channel.Client,err error) {
    61     sdk, err := GetEcslFabricSDKInstance()
    62     if err != nil{
    63         return nil,err
    64     }
    65     clientcontext :=sdk.sdk.ChannelContext(channelid,fabsdk.WithUser(username))
    66     channelclient,err =channel.New(clientcontext)
    67     return channelclient,err
    68 }
    69 func (efsdk *EcslFabricSDK) Close()  {
    70     if efsdk != nil{
    71         efsdk.sdk.Close()
    72         efsdk= nil
    73     }
    74 }
    View Code

    6.ecslresmgmt.go代码

      1 package encapsulation
      2 
      3 import (
      4     "github.com/hyperledger/fabric-sdk-go/pkg/client/resmgmt"
      5     "errors"
      6     "github.com/hyperledger/fabric-sdk-go/pkg/fabsdk"
      7     "log"
      8     "github.com/prescriptionserver/client/go/global"
      9     "github.com/prescriptionserver/client/go/util"
     10     "os"
     11     mspc "github.com/hyperledger/fabric-sdk-go/pkg/client/msp"
     12     msp2 "github.com/hyperledger/fabric-sdk-go/pkg/common/providers/msp"
     13     "github.com/hyperledger/fabric-sdk-go/pkg/common/errors/retry"
     14     "strings"
     15     "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/protos/peer"
     16     "github.com/hyperledger/fabric-sdk-go/pkg/fab/ccpackager/gopackager"
     17     "github.com/hyperledger/fabric-sdk-go/third_party/github.com/hyperledger/fabric/common/cauthdsl"
     18 )
     19 
     20 type EcslResmgmtClient struct {
     21     OrgName       string
     22     OrgAdmin      string
     23     ConfigFile    string
     24     initialized   bool
     25     resMgmtClient *resmgmt.Client
     26     efsdk     *EcslFabricSDK
     27 }
     28 
     29 func (e *EcslResmgmtClient) Initialize() error {
     30     if e.OrgAdmin=="" || e.OrgName=="" || e.ConfigFile==""{
     31         return errors.New("orgname or orgadmin or configfile is not null")
     32     }
     33     if e.initialized{
     34         global.Logger.Error("ecslresmgmtclient initialize again !")
     35         return nil
     36     }
     37     sdk,err := GetEcslFabricSDKInstance()
     38     if err != nil{
     39         return err
     40     }
     41     e.efsdk=sdk
     42     log.Printf("ecsl fabric sdk created")
     43     resourceManagerClientContext := e.efsdk.sdk.Context(fabsdk.WithUser(e.OrgAdmin),fabsdk.WithOrg(e.OrgName))
     44     if err != nil{
     45         return err
     46     }
     47     resMgmtClient,err:=resmgmt.New(resourceManagerClientContext)
     48     if err != nil{
     49         return err
     50     }
     51     e.resMgmtClient =resMgmtClient
     52     e.initialized=true
     53     return nil
     54 }
     55 func (e *EcslResmgmtClient) CreateChannel(channelid string,targetpeerendpoint string,
     56     orgname string,orgadmin string,ordererid string) error {
     57     if channelid == "" || targetpeerendpoint==""{
     58         return errors.New("channeldid or target peer endpoint is not null")
     59     }
     60     if e.ChannelExists(channelid,targetpeerendpoint){
     61         return errors.New("channelid already exists")
     62     }
     63     if e.initialized == false{
     64         err :=e.Initialize()
     65         if err != nil{
     66             return err
     67         }
     68     }
     69     cf,err:= util.GetPrescriptionClientConfig()
     70     if err != nil{
     71         return err
     72     }
     73     mspclient ,err:= mspc.New(e.efsdk.sdk.Context(),mspc.WithOrg(orgname))
     74     if err != nil{
     75         return err
     76     }
     77     adminidentity,err := mspclient.GetSigningIdentity(orgadmin)
     78     if err != nil{
     79         return err
     80     }
     81     req:=resmgmt.SaveChannelRequest{
     82         ChannelID:channelid,
     83         ChannelConfigPath:os.Getenv("GOPATH") + cf.PrescriptionClient.Channel.ChannelConfig,
     84         SigningIdentities:[]msp2.SigningIdentity{adminidentity},
     85     }
     86     response, err := e.resMgmtClient.SaveChannel(req,resmgmt.WithOrdererEndpoint(ordererid))
     87     if err != nil || response.TransactionID == ""{
     88         return err
     89     }
     90     log.Println("channel created success")
     91     return nil
     92 }
     93 func (e *EcslResmgmtClient) JoinChannel(channelid string,ordererid string) error{
     94     if channelid =="" || ordererid==""{
     95         return errors.New("join channel ordererid or channelid is not null")
     96     }
     97     if e.initialized == false{
     98         err:=e.Initialize()
     99         if err != nil{
    100             return err
    101         }
    102     }
    103     err := e.resMgmtClient.JoinChannel(channelid, resmgmt.WithRetry(retry.DefaultResMgmtOpts),
    104         resmgmt.WithOrdererEndpoint(ordererid))
    105     return err
    106 }
    107 func (e *EcslResmgmtClient) IsInitialized() bool {
    108     return e.initialized
    109 }
    110 func (e *EcslResmgmtClient) ChannelExists(channelid string, targetpeerendpoint ...string) bool {
    111     if e.initialized ==false{
    112         err:=e.Initialize()
    113         if err != nil{
    114             global.Logger.Errorf("channel exists error: %v
    ",err)
    115             return false
    116         }
    117     }else {
    118         response, err := e.resMgmtClient.QueryChannels(resmgmt.WithTargetEndpoints(targetpeerendpoint...))
    119         if err != nil{
    120             global.Logger.Errorf("channel exists function query channels error: %v
    ",err)
    121             return false
    122         }
    123         if response != nil{
    124             for _,channel:=range response.Channels{
    125                 if channel.ChannelId == channelid{
    126                     return true
    127                 }
    128             }
    129         }
    130     }
    131     return false
    132 }
    133 func (e *EcslResmgmtClient) ChaincodeInstallExists(chaincodeid string,peerendpoint string) bool {
    134     if chaincodeid =="" || peerendpoint==""{
    135         global.Logger.Error("chaincodeexists function chaincodeid or peerendpoint is not null 
    ")
    136         return  false
    137     }
    138     if e.initialized==false{
    139         err :=e.Initialize()
    140         if err != nil{
    141             global.Logger.Errorf("resmgmt initialize error: %v
    ",err)
    142             return false
    143         }
    144     }
    145     ccinsqes, err := e.resMgmtClient.QueryInstalledChaincodes(resmgmt.WithTargetEndpoints(peerendpoint))
    146     if err != nil || ccinsqes==nil{
    147         global.Logger.Errorf("resmgmt query installed chaincodes error : %v
    ",err)
    148         return false
    149     }
    150     for _,cc :=range ccinsqes.Chaincodes{
    151         if strings.EqualFold(cc.Name,chaincodeid){
    152             return true
    153         }
    154     }
    155     return false
    156 }
    157 func (e *EcslResmgmtClient) ChaincodeInstantiatedExists(chaincodeid string,peerendpoint string) bool {
    158     if chaincodeid =="" || peerendpoint==""{
    159         global.Logger.Error("chaincodeexists function chaincodeid or peerendpoint is not null 
    ")
    160         return  false
    161     }
    162     if e.initialized==false{
    163         err :=e.Initialize()
    164         if err != nil{
    165             global.Logger.Errorf("resmgmt initialize error: %v
    ",err)
    166             return false
    167         }
    168     }
    169     ccinstqes, err := e.resMgmtClient.QueryInstantiatedChaincodes(chaincodeid,
    170         resmgmt.WithTargetEndpoints(peerendpoint))
    171     if err != nil ||ccinstqes == nil{
    172         global.Logger.Errorf("chaincodeinstantiatedexists resmgmt query instantiated chaincodes error : %v
    ",err)
    173         return false
    174     }
    175     for _,cc :=range ccinstqes.Chaincodes{
    176         if strings.EqualFold(cc.Name,chaincodeid){
    177             return true
    178         }
    179     }
    180     return false
    181 }
    182 func (e *EcslResmgmtClient) GetInstantiatedChaincodes(channelid string,
    183     peerendpoint string) ([]*peer.ChaincodeInfo,error) {
    184     if channelid =="" || peerendpoint==""{
    185         global.Logger.Error("getchaincodes function channelid or peerendpoint is not null 
    ")
    186         return  nil,errors.New("getchaincodes function channelid or peerendpoint is not null")
    187     }
    188     if e.initialized==false{
    189         err :=e.Initialize()
    190         if err != nil{
    191             global.Logger.Errorf("getchaincodesresmgmt initialize error: %v
    ",err)
    192             return nil,err
    193         }
    194     }
    195     ccinstqes, err := e.resMgmtClient.QueryInstantiatedChaincodes(channelid,
    196         resmgmt.WithTargetEndpoints(peerendpoint))
    197     if err != nil ||ccinstqes == nil{
    198         return nil,err
    199     }
    200     return  ccinstqes.Chaincodes,nil
    201 }
    202 func (e *EcslResmgmtClient) GetInstalledChaincodes(
    203     peerendpoint string) ([]*peer.ChaincodeInfo,error)  {
    204     if peerendpoint==""{
    205         global.Logger.Error("getchaincodes function  peerendpoint is not null 
    ")
    206         return  nil,errors.New("getchaincodes function peerendpoint is not null")
    207     }
    208     if e.initialized==false{
    209         err :=e.Initialize()
    210         if err!= nil{
    211             global.Logger.Errorf("getchaincodesresmgmt initialize error: %v
    ",err)
    212             return nil,err
    213         }
    214     }
    215     ccinsqes, err := e.resMgmtClient.QueryInstalledChaincodes(resmgmt.WithTargetEndpoints(peerendpoint))
    216     if err != nil || ccinsqes==nil{
    217         global.Logger.Errorf("getchaincodes resmgmt query installed chaincodes error : %v
    ",err)
    218         return nil,err
    219     }
    220     return ccinsqes.Chaincodes,nil
    221 }
    222 func (e *EcslResmgmtClient) InstallChaincode(chaincodeid string,chaincodepath string,
    223     chaincodeversion string,peerendpoint string) error {
    224     if chaincodeid =="" ||chaincodepath==""||chaincodeversion==""||peerendpoint==""{
    225         return errors.New("install chaincode function with chaincodeid or"+
    226             " chaincodepath or chaincodeversion or peerendpoit is not null 
    ")
    227     }
    228     if e.initialized==false{
    229         err :=e.Initialize()
    230         if err != nil{
    231             global.Logger.Errorf("installchaincode resmgmt initialize error: %v
    ",err)
    232             return err
    233         }
    234     }
    235     ccpkg,err :=gopackager.NewCCPackage(chaincodepath,os.Getenv("GOPATH"))
    236     if err != nil{
    237         return err
    238     }
    239     if e.ChaincodeInstallExists(chaincodeid,peerendpoint){
    240         return errors.New("chaincodeid install already exists")
    241     }
    242      insccreq:=resmgmt.InstallCCRequest{
    243          Name:chaincodeid,
    244          Path:chaincodepath,
    245          Version:chaincodeversion,
    246          Package:ccpkg,
    247      }
    248     _,err = e.resMgmtClient.InstallCC(insccreq, resmgmt.WithRetry(retry.DefaultResMgmtOpts),
    249         resmgmt.WithTargetEndpoints(peerendpoint))
    250     return err
    251 }
    252 func (e *EcslResmgmtClient) InstantiatedChaincode(chaincodeid string,channelid string,
    253     chaincodeversion string,peerendpoint string,orgmspid string) error {
    254     if chaincodeid =="" ||channelid==""||chaincodeversion==""||peerendpoint==""{
    255         return errors.New("instantiated chaincode function with chaincodeid or"+
    256             " channelid or chaincodeversion or peerendpoit or orgmspid is not null 
    ")
    257     }
    258     if e.initialized==false{
    259         err :=e.Initialize()
    260         if err != nil{
    261             global.Logger.Errorf("installchaincode resmgmt initialize error: %v
    ",err)
    262             return err
    263         }
    264     }
    265     if e.ChaincodeInstantiatedExists(chaincodeid,peerendpoint){
    266         return errors.New("chaincode instantiated already exists")
    267     }
    268     ccpolicy :=cauthdsl.SignedByMspMember(orgmspid)
    269     instccreq:=resmgmt.InstantiateCCRequest{
    270         Name:chaincodeid,
    271         Path:os.Getenv("GOPATH"),
    272         Version:chaincodeversion,
    273         Args:[][]byte{[]byte("init"),[]byte("init")},
    274         Policy:ccpolicy,
    275     }
    276     resp, err := e.resMgmtClient.InstantiateCC(channelid, instccreq)
    277     if err != nil{
    278         return err
    279     }
    280     if resp.TransactionID==""{
    281         return errors.New("failed to instanitated chaincode")
    282     }
    283     return nil
    284 }
    285 func (e *EcslResmgmtClient) Close()  {
    286     if e != nil{
    287         e.efsdk.Close()
    288     }
    289 }
    View Code

    7.clientglobal.go代码

     1 package global
     2 
     3 import "github.com/hyperledger/fabric/common/flogging"
     4 
     5 
     6 var(
     7     Logger =flogging.MustGetLogger("PrescriptionChaincode")
     8 )
     9 
    10 const (
    11     ConfigFile="./client/go/config/prescriptionclient.yaml"
    12 )
    View Code

    8.prescriptionclientinvoke.go代码

      1 package operation
      2 
      3 import (
      4     "github.com/prescriptionserver/client/go/clientmodel"
      5     "errors"
      6     "encoding/json"
      7     "github.com/prescriptionserver/client/go/encapsulation"
      8     "strings"
      9     "github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
     10     "log"
     11     "time"
     12     "fmt"
     13 )
     14 
     15 type PrescriptionClientInvoke struct {
     16     ChannelID   string
     17     UserName    string
     18     ChaincodeID string
     19     EventID     string
     20 }
     21 
     22 func (pc *PrescriptionClientInvoke) Publish(blockchain clientmodel.PrescriptionBlockchain) (string,error)  {
     23     if pc.ChannelID ==""||pc.ChaincodeID ==""||pc.UserName==""{
     24         return "",errors.New("client publish function channelid or username or chaincode is not null")
     25     }
     26     var args []string
     27     args = append(args,"publish")
     28     if blockchain.PrescriptionID=="" || blockchain.PrescriptionSummary==""{
     29         return "",errors.New("prescription block chain entity is not nil")
     30     }
     31     bytes, err := json.Marshal(blockchain)
     32     if err != nil{
     33         return "",err
     34     }
     35     transientdatamap := make(map[string][]byte)
     36     transientdatamap["result"]=[]byte("transient data in prescription invoke publish")
     37     ecslsdk ,err:= encapsulation.GetEcslFabricSDKInstance()
     38     if err != nil{
     39         return "",err
     40     }
     41     //defer ecslsdk.Close()
     42     channelclient, eventclient, err := ecslsdk.GetChannelAndEventClient(pc.ChannelID, pc.UserName)
     43     if err != nil{
     44         return "" ,err
     45     }
     46     eventid:=""
     47     if strings.TrimSpace(pc.EventID)==""{
     48         eventid="eventPrescriptionInvokePublish"
     49     }else {
     50         eventid=pc.EventID
     51     }
     52     registration, chanevent, err := eventclient.RegisterChaincodeEvent(pc.ChaincodeID, eventid)
     53     if err != nil{
     54         return "",err
     55     }
     56     defer eventclient.Unregister(registration)
     57     chlreq := channel.Request{
     58         ChaincodeID:pc.ChaincodeID,
     59         Fcn:args[0],
     60         Args:[][]byte{bytes},
     61         TransientMap:transientdatamap,
     62     }
     63     response, err := channelclient.Execute(chlreq)
     64     if err != nil{
     65         return "",nil
     66     }
     67     select {
     68     case ccevent:=<-chanevent:
     69         log.Printf("received cc event: %v
    ",ccevent)
     70     case <-time.After(time.Second * 20):
     71         return "",fmt.Errorf("publish did not receive cc event for eventid: %s",eventid)
     72     }
     73     return string(response.TransactionID),nil
     74 }
     75 func (pc *PrescriptionClientInvoke) Endorse(pid string,prpdid string,
     76     prpwid string) (string,error) {
     77     if pc.ChannelID ==""||pc.ChaincodeID ==""||pc.UserName==""{
     78         return "",errors.New("client endorse function channelid or username or chaincode is not null")
     79     }
     80     if strings.TrimSpace(pid)=="" || strings.TrimSpace(prpdid)=="" || strings.TrimSpace(prpwid) ==""{
     81         return "",errors.New("client endorse function pid or prpdid or prpwid is not null")
     82     }
     83     var args []string
     84     args=append(args,"endorse")
     85     args=append(args,pid)
     86     args=append(args,prpdid)
     87     args=append(args,prpwid)
     88     transientdatamap :=make(map[string][]byte)
     89     transientdatamap["result"]=[]byte("transient data in prescription invoke endorse")
     90     ecslsdk,err :=encapsulation.GetEcslFabricSDKInstance()
     91     if err != nil{
     92         return "",err
     93     }
     94     channelclient, eventclient, err := ecslsdk.GetChannelAndEventClient(pc.ChannelID, pc.UserName)
     95     if err != nil{
     96         return "", nil
     97     }
     98     eventid:=""
     99     if strings.TrimSpace(pc.EventID)==""{
    100         eventid="eventPrescriptionInvokeEndorse"
    101     }else {
    102         eventid=pc.EventID
    103     }
    104     registration, chanevent, err := eventclient.RegisterChaincodeEvent(pc.ChaincodeID, eventid)
    105     if err != nil{
    106         return "", nil
    107     }
    108     defer eventclient.Unregister(registration)
    109     chlreq :=channel.Request{
    110         ChaincodeID:pc.ChaincodeID,
    111         Fcn:args[0],
    112         Args:[][]byte{[]byte(args[1]),[]byte(args[2]),[]byte(args[3])},
    113         TransientMap:transientdatamap,
    114     }
    115     response, err := channelclient.Execute(chlreq)
    116     if err != nil{
    117         return "", nil
    118     }
    119     select {
    120     case ccevent := <-chanevent:
    121         log.Printf("received cc event: %v
    ", ccevent)
    122     case <-time.After(time.Second * 20):
    123         return "", fmt.Errorf("endorse did not receive cc event for eventid: %s", eventid)
    124     }
    125     return string(response.TransactionID), nil
    126     //defer ecslsdk.Close()
    127 
    128 }
    129 func (pc *PrescriptionClientInvoke) Accept(pid string,rpdid string,rpwid string) (string,error) {
    130     if pc.ChannelID ==""||pc.ChaincodeID ==""||pc.UserName==""{
    131         return "",errors.New("client publish function channelid or username or chaincode is not null")
    132     }
    133     if strings.TrimSpace(pid)=="" || strings.TrimSpace(rpdid)=="" || strings.TrimSpace(rpwid) ==""{
    134         return "",errors.New("client accept function pid or rpdid or rpwid is not null")
    135     }
    136     var args []string
    137     args=append(args,"accept")
    138     args=append(args,pid)
    139     args=append(args,rpdid)
    140     args=append(args,rpwid)
    141     ecslsdk,err:=encapsulation.GetEcslFabricSDKInstance()
    142     if err != nil{
    143         return "", nil
    144     }
    145     channelclient, eventclient, err := ecslsdk.GetChannelAndEventClient(pc.ChannelID, pc.UserName)
    146     if err != nil{
    147         return "", nil
    148     }
    149     eventid :=""
    150     if strings.TrimSpace(pc.EventID)==""{
    151         eventid="eventPrescriptionInvokeAccept"
    152     }else {
    153         eventid=pc.EventID
    154     }
    155     registration, chanevent, err := eventclient.RegisterChaincodeEvent(pc.ChaincodeID, eventid)
    156     if err != nil{
    157         return "", nil
    158     }
    159     defer eventclient.Unregister(registration)
    160     transientdatamap := make(map[string][]byte)
    161     transientdatamap["result"]=[]byte("transient data in prescription invoke accept")
    162     chlreq:=channel.Request{
    163         ChaincodeID:pc.ChaincodeID,
    164         Fcn:args[0],
    165         Args:[][]byte{[]byte(args[1]),[]byte(args[2]),[]byte(args[3])},
    166         TransientMap:transientdatamap,
    167     }
    168     response, err := channelclient.Execute(chlreq)
    169     if err != nil{
    170         return "", nil
    171     }
    172     select {
    173     case ccevent:=<-chanevent:
    174         log.Printf("received cc event: %v
    ",ccevent)
    175     case <-time.After(time.Second*20):
    176         return "", fmt.Errorf("accept did not receive cc event for eventid: %s", eventid)
    177     }
    178     return string(response.TransactionID),nil
    179 }
    View Code

    9.prescriptionclientquery.go代码

      1 package operation
      2 
      3 import (
      4     "github.com/prescriptionserver/client/go/clientmodel"
      5     "errors"
      6     "strings"
      7     "github.com/prescriptionserver/client/go/encapsulation"
      8     "github.com/hyperledger/fabric-sdk-go/pkg/client/channel"
      9     "encoding/json"
     10 )
     11 
     12 type PrescriptionClientQuery struct {
     13     ChannelID string
     14     ChaincodeID string
     15     UserName string
     16 }
     17 
     18 func (pcq *PrescriptionClientQuery) GetPbcnByPid(pid string) (pbcn clientmodel.PrescriptionBlockchain,
     19     err error) {
     20     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
     21         return pbcn,errors.New("client getpbcnbypid function channelid or username or chaincode is not null")
     22     }
     23     if strings.TrimSpace(pid) ==""{
     24         return pbcn,errors.New("client getpbcnbypid function pid is not null")
     25     }
     26     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
     27     if err != nil{
     28         return pbcn,err
     29     }
     30     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
     31     if err != nil{
     32         return pbcn,err
     33     }
     34     var args []string
     35     args = append(args,"getpbcnbyprescriptionid")
     36     args=append(args,pid)
     37     chlreq := channel.Request{
     38         ChaincodeID:pcq.ChaincodeID,
     39         Fcn:args[0],
     40         Args:[][]byte{[]byte(args[1])},
     41     }
     42     response, err := channelclient.Query(chlreq)
     43     if err != nil{
     44         return pbcn,err
     45     }
     46     err = json.Unmarshal(response.Payload, &pbcn)
     47     return pbcn,err
     48 }
     49 func (pcq *PrescriptionClientQuery) GetPbcnsByOpdid(opdid string) (pbcns []clientmodel.PrescriptionBlockchain,err error) {
     50     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
     51         return pbcns,errors.New("client getpbcnbyopdid function channelid or username or chaincode is not null")
     52     }
     53     if strings.TrimSpace(opdid) ==""{
     54         return pbcns,errors.New("client getpbcnbyopdid function opdid is not null")
     55     }
     56     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
     57     if err != nil{
     58         return pbcns,err
     59     }
     60     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
     61     if err != nil{
     62         return pbcns,err
     63     }
     64     var args []string
     65     args = append(args,"getpbcnbyopdid")
     66     args=append(args,opdid)
     67     chlreq := channel.Request{
     68         ChaincodeID:pcq.ChaincodeID,
     69         Fcn:args[0],
     70         Args:[][]byte{[]byte(args[1])},
     71     }
     72     response, err := channelclient.Query(chlreq)
     73     if err != nil{
     74         return pbcns,err
     75     }
     76     err = json.Unmarshal(response.Payload, &pbcns)
     77     return pbcns,err
     78 }
     79 func (pcq *PrescriptionClientQuery) GetPbcnsByPrpdid(prpdid string) (
     80     pbcns []clientmodel.PrescriptionBlockchain,err error) {
     81     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
     82         return pbcns,errors.New("client getpbcnbyprpdid function channelid or username or chaincode is not null")
     83     }
     84     if strings.TrimSpace(prpdid) ==""{
     85         return pbcns,errors.New("client getpbcnbyprpdid function prpdid is not null")
     86     }
     87     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
     88     if err != nil{
     89         return pbcns,err
     90     }
     91     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
     92     if err != nil{
     93         return pbcns,err
     94     }
     95     var args []string
     96     args = append(args,"getpbcnbyprpdid")
     97     args=append(args,prpdid)
     98     chlreq := channel.Request{
     99         ChaincodeID:pcq.ChaincodeID,
    100         Fcn:args[0],
    101         Args:[][]byte{[]byte(args[1])},
    102     }
    103     response, err := channelclient.Query(chlreq)
    104     if err != nil{
    105         return pbcns,err
    106     }
    107     err = json.Unmarshal(response.Payload, &pbcns)
    108     return pbcns,err
    109 }
    110 func (pcq *PrescriptionClientQuery) GetPbcnsByState(state string) (
    111     pbcns []clientmodel.PrescriptionBlockchain,err error) {
    112     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    113         return pbcns,errors.New("client getpbcnbystatefunction channelid or username or chaincode is not null")
    114     }
    115     if strings.TrimSpace(state) ==""{
    116         return pbcns,errors.New("client getpbcnbystate function state is not null")
    117     }
    118     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    119     if err != nil{
    120         return pbcns,err
    121     }
    122     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    123     if err != nil{
    124         return pbcns,err
    125     }
    126     var args []string
    127     args = append(args,"getpbcnbystate")
    128     args=append(args,state)
    129     chlreq := channel.Request{
    130         ChaincodeID:pcq.ChaincodeID,
    131         Fcn:args[0],
    132         Args:[][]byte{[]byte(args[1])},
    133     }
    134     response, err := channelclient.Query(chlreq)
    135     if err != nil{
    136         return pbcns,err
    137     }
    138     err = json.Unmarshal(response.Payload, &pbcns)
    139     return pbcns,err
    140 }
    141 func (pcq *PrescriptionClientQuery) GetPbcnsByPtnid(ptnid string) (
    142     pbcns []clientmodel.PrescriptionBlockchain,err error) {
    143     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    144         return pbcns,errors.New("client getpbcnbyptnid function channelid or username or chaincode is not null")
    145     }
    146     if strings.TrimSpace(ptnid) ==""{
    147         return pbcns,errors.New("client getpbcnbyptnid function ptnid is not null")
    148     }
    149     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    150     if err != nil{
    151         return pbcns,err
    152     }
    153     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    154     if err != nil{
    155         return pbcns,err
    156     }
    157     var args []string
    158     args = append(args,"getpbcnbyptnid")
    159     args=append(args,ptnid)
    160     chlreq := channel.Request{
    161         ChaincodeID:pcq.ChaincodeID,
    162         Fcn:args[0],
    163         Args:[][]byte{[]byte(args[1])},
    164     }
    165     response, err := channelclient.Query(chlreq)
    166     if err != nil{
    167         return pbcns,err
    168     }
    169     err = json.Unmarshal(response.Payload, &pbcns)
    170     return pbcns,err
    171 }
    172 func (pcq *PrescriptionClientQuery) GetPbcnsByRpdid(rpdid string) (
    173     pbcns []clientmodel.PrescriptionBlockchain,err error) {
    174     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    175         return pbcns,errors.New("client getpbcnbyrpdid function channelid or username or chaincode is not null")
    176     }
    177     if strings.TrimSpace(rpdid) ==""{
    178         return pbcns,errors.New("client getpbcnbyrpdid function rpdid is not null")
    179     }
    180     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    181     if err != nil{
    182         return pbcns,err
    183     }
    184     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    185     if err != nil{
    186         return pbcns,err
    187     }
    188     var args []string
    189     args = append(args,"getpbcnbyrpdid")
    190     args=append(args,rpdid)
    191     chlreq := channel.Request{
    192         ChaincodeID:pcq.ChaincodeID,
    193         Fcn:args[0],
    194         Args:[][]byte{[]byte(args[1])},
    195     }
    196     response, err := channelclient.Query(chlreq)
    197     if err != nil{
    198         return pbcns,err
    199     }
    200     err = json.Unmarshal(response.Payload, &pbcns)
    201     return pbcns,err
    202 }
    203 func (pcq *PrescriptionClientQuery) GetPbcnsByHndt(hospitalno string,daytime string) (
    204     pbcns []clientmodel.PrescriptionBlockchain,err error) {
    205     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    206         return pbcns,errors.New("client getpbcnbyhndt function channelid or username or chaincode is not null")
    207     }
    208     if strings.TrimSpace(hospitalno) =="" || strings.TrimSpace(daytime)==""{
    209         return pbcns,errors.New("client getpbcnbyhndt function hospitalno or daytime is not null")
    210     }
    211     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    212     if err != nil{
    213         return pbcns,err
    214     }
    215     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    216     if err != nil{
    217         return pbcns,err
    218     }
    219     var args []string
    220     args = append(args,"getpbcnbyhndt")
    221     args=append(args,hospitalno)
    222     args=append(args,daytime)
    223     chlreq := channel.Request{
    224         ChaincodeID:pcq.ChaincodeID,
    225         Fcn:args[0],
    226         Args:[][]byte{[]byte(args[1]),[]byte(args[2])},
    227     }
    228     response, err := channelclient.Query(chlreq)
    229     if err != nil{
    230         return pbcns,err
    231     }
    232     err = json.Unmarshal(response.Payload, &pbcns)
    233     return pbcns,err
    234 }
    235 func (pcq *PrescriptionClientQuery) GetHistoryByPid(pid string) (
    236     pbcn clientmodel.PrescriptionBlockchain,err error) {
    237     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    238         return pbcn,errors.New("client gethistorybypid function channelid or username or chaincode is not null")
    239     }
    240     if strings.TrimSpace(pid) ==""{
    241         return pbcn,errors.New("client gethistorybypid function pid is not null")
    242     }
    243     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    244     if err != nil{
    245         return pbcn,err
    246     }
    247     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    248     if err != nil{
    249         return pbcn,err
    250     }
    251     var args []string
    252     args = append(args,"gethistorybypid")
    253     args=append(args,pid)
    254     chlreq := channel.Request{
    255         ChaincodeID:pcq.ChaincodeID,
    256         Fcn:args[0],
    257         Args:[][]byte{[]byte(args[1])},
    258     }
    259     response, err := channelclient.Query(chlreq)
    260     if err != nil{
    261         return pbcn,err
    262     }
    263     err = json.Unmarshal(response.Payload, &pbcn)
    264     return pbcn,err
    265 }
    266 func (pcq *PrescriptionClientQuery) GetResultByQueryString(query string) (
    267     pbcns string,err error) {
    268     if pcq.ChannelID ==""||pcq.ChaincodeID ==""||pcq.UserName==""{
    269         return pbcns,errors.New("client getresultbyquerystring function channelid or username or chaincode is not null")
    270     }
    271     if strings.TrimSpace(query) ==""{
    272         return pbcns,errors.New("client getresultbyquerystring function query is not null")
    273     }
    274     efsdk,err :=encapsulation.GetEcslFabricSDKInstance()
    275     if err != nil{
    276         return pbcns,err
    277     }
    278     channelclient, err := efsdk.GetChannelClient(pcq.ChannelID, pcq.UserName)
    279     if err != nil{
    280         return pbcns,err
    281     }
    282     var args []string
    283     args = append(args,"getresultbyquerystring")
    284     args=append(args,query)
    285     chlreq := channel.Request{
    286         ChaincodeID:pcq.ChaincodeID,
    287         Fcn:args[0],
    288         Args:[][]byte{[]byte(args[1])},
    289     }
    290     response, err := channelclient.Query(chlreq)
    291     if err != nil{
    292         return pbcns,err
    293     }
    294     pbcns = string(response.Payload)
    295     return pbcns,err
    296 }
    View Code

    10.prescription.go部份代码

     1 package clientmodel
     2 
     3 type PrescriptionBlockchain struct {
     4     PrescriptionID string `json:"PrescriptionID"`
     5     HospitalNO string `json:"HospitalNO"`
     6     PatientID string `json:"PatientID"`
     7     GenerationTime string `json:"GenerationTime"`
     8     PrescriptionSummary string `json:"PrescriptionSummary"`
     9     OpenPrescriptionDeptID string `json:"OpenPrescriptionDeptID"`
    10     OpenPrescriptionDoctorID string `json:"OpenPrescriptionDoctorID"`
    11     PendingReceivePrescriptionDeptID string `json:"PendingReceivePrescriptionDeptID"`
    12     PendingReceivePrescriptionWorkID string `json:"PendingReceivePrescriptionWorkID"`
    13     ReceivingPrescriptionDeptID string `json:"ReceivingPrescriptionDeptID"`
    14     ReceivingPrescriptionWorkID string `json:"ReceivingPrescriptionWorkID"`
    15     State string `json:"State"`
    16     History []HistoryItem `json:"History"`
    17 }
    18 type HistoryItem struct {
    19     TxId string `json:"TxId"`
    20     PrescriptionBlockchain PrescriptionBlockchain `json:"PrescriptionBlockchain"`
    21 }
    View Code

    7.终于写的差不多了,后边还有前端,和elasticsearch数据处理,^_^最讨厌写前端呀,改了几个ecslresmgmt.go的错误

  • 相关阅读:
    诸葛亮的后半生:狗笼子里挥舞丈八蛇矛
    一句话摘录
    【书摘】The Joshua tree epiphany
    玩具程序:bigInt
    旅行的力量
    记忆的力量
    快的力量
    Windbg学习笔记【4】
    戴尔笔记本win8全新安装
    悟透JavaScript
  • 原文地址:https://www.cnblogs.com/apolov-fabric/p/9719476.html
Copyright © 2011-2022 走看看