Могу ли я внести изменения в параметры, определенные в отношениях - PullRequest
0 голосов
/ 15 ноября 2018

1. Я хочу знать, могу ли я внести изменения в параметр, определенный в отношении.

я хочу создать функцию с названием bookflight, а затем внести изменения в количество мест, если рейс забронирован.это мои cto файлы

namespace org.acme.airline.aircraft

/** Aircraft is an ACME Asset*/

asset Aircraft identified by aircraftId {
  o String      aircraftId 

  o Ownership   ownershipType default="LEASED"

  // Number of seats per class 
  o Integer     firstClassSeats      range = [4,]
  o Integer     businessClassSeats   range = [6, 20]
  o Integer     economyClassSeats    range = [30, ]

  o String      nickName  optional 
}

enum Ownership {
  o   LEASED
  o   OWNED
}

и для полета код

namespace org.acme.airline.flight

import org.acme.airline.aircraft.Aircraft

asset Flight identified by flightId {
  // Solution to the exercise - try out the Regular expression at http://regex101.com
  // Share your optimized regular expression with others :) 
  o   String            flightId regex=/[A-Z][A-Z][0-9][0-9][0-9]-[0-9][0-9]-[0-3][0-9]-[0-9][0-9]/
  o   String            flightNumber
  o   Route             route
  o   String[]          aliasFlightNumber  optional
  --> Aircraft          aircraft  optional
}

concept Route {
  o   String    origin       regex=/[A-Z][A-Z][A-Z]/
  o   String    destination  regex=/[A-Z][A-Z][A-Z]/
  o   DateTime  schedule  
}

// Logistics department of ACME creates the flights
transaction CreateFlight {
  o   String      flightNumber
  o   String      origin
  o   String      destination
  o   DateTime    schedule
}

event FlightCreated {
  o   String      flightId
}

// Assigns an aircraft to the flight
// The logistics / validation on availability of aircraft
// Kept outside of the Blockchain
transaction AssignAircraft {
  o   String    flightId
  o   String    aircraftId
}

// Event indicating that aircraft was assigned
event AircraftAssigned {
  o   String    flightId
  o   String    aircraftId
}

Теперь я хочу внести изменения в отношение полета, чтобы внести изменения в него, что мне делать,Я сделал файл javascript. Для доступа внесите в него изменения.

 function booktickets(registry){
     //array to recored the hold the instances of aircraft resourse 
     const  bnDef = bnUtil.connection.getBusinessNetwork();
     const  factory = bnDef.getFactory();
     let    flightResource = factory.newResource(aircraftNamespace,aircraftType,'AE201-05-05-2020');
     flightResource.setPropertyValue('flightNumber','AE101');
     flightResource.route = factory.newConcept(aircraftNamespace,'Route');
     flightResource.route.setPropertyValue('origin', 'DEL');
     flightResource.route.setPropertyValue('destination' , 'APH');
     flightResource.route.setPropertyValue('schedule' , new Date('2018-10-15T21:44Z'));
     flightResource.aircraft = factory.newRelationship('org.acme.airline.aircraft', 'Aircraft', 'CRAFT01');
    //.setPropertyValue()
    flightResource.aircraft.setPropertyValue('ownershipType','LEASED');
    flightResource.aircraft.setPropertyValue('firstClassSeats',10);
    flightResource.aircraft.setPropertyValue('businessClassSeats',10);
    flightResource.aircraft.setPropertyValue('economyClassSeats',100);

     return registry.update(flightResource).then(()=>{
         console.log('Successfully created the flight!!!');
         bnUtil.disconnect();
     }).catch((error)=>{
         console.log(error);
        bnUtil.disconnect();
     });

 }

1 Ответ

0 голосов
/ 16 ноября 2018
  1. кажется, что ваш вопрос: можете ли вы создать связь между Полетом (актив) и Самолетом (актив) в функции транзакции (которая работает во время выполнения кода цепи), и вы можете обновить поля соответствующего Самолета (в отдельном реестре). Ответ «да», вы можете, для обоих. Вы не предоставляете модель для функции bookflight, поэтому можете только делать предположения относительно ее определения модели. как минимум (в зависимости от вашего кода) потребуется:

    transaction bookflight { }

  2. Пример кода того, что вы пытаетесь сделать с отношениями - показан здесь -> https://github.com/hyperledger/composer-sample-networks/blob/master/packages/perishable-network/lib/logic.js#L130

  3. Этот раздел:

    const bnDef = bnUtil.connection.getBusinessNetwork(); const factory = bnDef.getFactory();

- это код composer-client - он не будет работать внутри функции транзакции (т. Е. Код времени выполнения, вам нужно удалить код клиента - в приведенном ниже примере показано, как это сделать). Замените строку 2 на:

const factory = getFactory();

Подробнее о функциях транзакций, примерах и т. Д. На https://hyperledger.github.io/composer/latest/reference/js_scripts

  1. примечание: вы можете просто назначить такие значения, как:

    flightResource.route.origin = 'DEL' ; // no need for.setPropertyValue('origin', 'DEL'); etc etc

Я не вижу ваш код для обновления реестра Aircraft (с flightResource.aircraft FYI) - но вам потребуется это для обновления полей в этом связанном активе (в настоящее время вы только обновляете реестр Flight выше)

  1. new Date() - это недетерминированный код - если вы надеетесь достичь консенсуса от нескольких пиров / организаций.

  2. Вы заметите ссылку, которую я отправил ранее, показывает использование async/await вместо обещаний JS (.then и т. Д.) - легче кодировать, легче читать. веселит.

...