Как обновить значения отношений внутри функций процессора транзакций? - PullRequest
0 голосов
/ 01 июня 2019

У меня есть файл модели org.acme.interm.container.cto, который выглядит примерно так:

namespace org.acme.interm.container

asset Container identified by containerId {

  o String containerId 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 containerNumber
  --> Truck truck  optional
}

asset Truck identified by truckId {
  o String truckId          
  o Ownership ownershipType default="LEASED"
  o Integer normalWeight range = [,100]
  o Integer fragileWeight range = [,50]          
}

enum Ownership {
  o LEASED
  o OWNED
}

transaction AssignTruck {
  o String containerId
  o String truckId
}

event TruckAssigned {
  o String containerId
  o String truckId
}

transaction LoadContainer {
  o String containerId
  --> Truck    truck
  o Integer fragileWeight
  o Integer normalWeight   
}

Я присваиваю отношение Грузовик активу контейнера в следующей транзакции:

function AssignTruck(containerTruckData) {  
   console.log("ASSIGN TRUCK CALLED!");
   var containerRegistry={}
   return getAssetRegistry('org.acme.interm.container.Container').then(function(registry){
            containerRegistry = registry
            return containerRegistry.get(containerTruckData.containerId);
        }).then(function(container){
            console.log("Got Container",container);
            if(!container) throw new Error("Container : "+containerTruckData.containerId," Not Found!!!");
            var factory = getFactory();
            var relationship = factory.newRelationship('org.acme.interm.truck','Truck',containerTruckData.truckId);
            container.truck = relationship;

            return containerRegistry.update(container);
        }).then(function(){
            // Successful update
            var event = getFactory().newEvent('org.acme.interm.container', 'TruckAssigned');
            event.containerId = containerTruckData.containerId;
            event.truckId = containerTruckData.truckId;
            emit(event);
        }).catch(function(error){
            throw new Error(error);
        });

}

Теперь, как мне записать транзакцию loadContainer, в которой существующие значения свойств контейнера normalWeight и fragileWeight (для данного containerId) должны быть добавлены к недавно переданным значениям fragileWeight и normalWeight?

1 Ответ

1 голос
/ 06 июня 2019

Во-первых, если у каждого контейнера нет переменной веса, невозможно отследить индивидуальный вес. Даже если вы продолжаете обновлять вес в грузовиках, вы будете знать общий вес контейнеров, которого недостаточно. Особенно, если вы хотите разгрузить контейнеры. Я бы предложил этот подход

asset Container identified by containerId {

  o String containerId 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 containerNumber
  o Integer normalWeight range = [,100]
  o Integer fragileWeight range = [,50]    
  --> Truck truck  optional
}

asset Truck identified by truckId {
  o String truckId          
  o Ownership ownershipType default="LEASED"
  o Integer totalNormalWeight range default=0
  o Integer totalFragileWeight range default=0
  --> Container containersLoaded[] optional
}

Так что это позволит вам отслеживать вес каждого контейнера, а затем добавлять их, чтобы получить общее количество в грузовике. Переменная containersLoaded позволит вам отслеживать загруженные контейнеры. Преимущество этого заключается в том, что вы можете точно уменьшить вес, если контейнер выгружен или разделен (что, я полагаю, будет частью потока пользователя)

function AssignTruck(containerTruckData) {
   var myContainer; // store data from the promise
   var myTruck;
   console.log("ASSIGN TRUCK CALLED!");
   var containerRegistry={}
   var truckRegistry;
   return getAssetRegistry('org.acme.interm.container.Container').then(function(registry){
            containerRegistry = registry
            return containerRegistry.get(containerTruckData.containerId);
        }).then(function(container){
            console.log("Got Container",container);
            myContainer = container;
            if(!container) throw new Error("Container : "+containerTruckData.containerId," Not Found!!!");
            var factory = getFactory();
            var relationship = factory.newRelationship('org.acme.interm.truck','Truck',containerTruckData.truckId);
            container.truck = relationship;
            return containerRegistry.update(container);
        }).then(function() {
          return getAssetRegistry('org.acme.interm.truck.Truck');
        }).then(function (truckRegistry) {
          truckRegistry = truckRegistry;
          return truckRegistry.get(containerTruckData.truckId);
        }).then(function (truck) {
          truck.totalNormalWeight +=  myContainer.normalWeight;
          truck.totalFragileWeight += myContainer.fragileWeight;
          if (!truck.containersLoaded) {
            truck.containersLoaded = [];
          } else {
            truck.containersLoaded.push(factory.newRelationship('org.acme.interm.container', 'Container', myContainer.containerId))
          };
          return truckRegistry.update(truck)
        }).then(function(){
            // Successful update
            var event = getFactory().newEvent('org.acme.interm.container', 'TruckAssigned');
            event.containerId = containerTruckData.containerId;
            event.truckId = containerTruckData.truckId;
            emit(event);
        }).catch(function(error){
            throw new Error(error);
        });
}

Это должно сработать для вас. Теперь вы можете запросить грузовик и получить общий вес всех контейнеров, проверив переменные totalNormalWeight и totalFragileWeight. Вы также можете проверить массив containersLoaded, чтобы получить список контейнеров. Чтобы получить индивидуальный вес контейнера, вы можете либо запросить контейнер и получить его вес, либо получить его непосредственно из переменной containersLoaded. Когда контейнеры должны быть удалены / выгружены из грузовика, вы можете получить их индивидуальный вес и вычесть их из общей суммы, и вывести соотношение из containersLoaded.

...