умножение значения из одного отношения на сумму из другого отношения для каждой записи - PullRequest
0 голосов
/ 26 мая 2018

Я пытаюсь что-то здесь подсчитать.Поэтому я в основном собираю все профили с их проектами и стремимся к ставкам и таймерам отношений загрузки для этих проектов.Каждый проект имеет одну ставку и имеет значение, и у каждого проекта может быть несколько таймеров.

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

В настоящее время я пытаюсь рассчитать все это в javascript, и это то, что я до сих пор:

            calculateTotalAmountEarned(projects) {
            let totalAmount = 0;
            let totalHours = 0;
            let total = moment.duration(0);
            let value = 0;
            projects.forEach((project) => {
                project.timers.forEach((timer) => {
                    if(timer.stopped_at) {
                        let started = moment(timer.started_at);
                        let stopped = moment(timer.stopped_at);
                        let time = moment.duration(stopped.diff(started));

                        total.add(time)
                    }
                    totalHours = +(total.asHours()).toFixed(0);
                })
                project.bids.forEach((bid) => {
                    value = bid.value
                })

                totalAmount = totalHours * value
            })

            return totalAmount
        },

хорошо, сейчас он возвращает сумму всех таймеров для всех проектов, умноженную на стоимость одной ставки для одного проекта.

, что я сейчас получаю:55 часов - это длительность всех таймеров всех проектов для профиля, умноженная на 14, что является значением единой ставки.

пример ввода и ожидаемого результата: проект 1: 3 таймера каждый с длительностью1 час -> сумма 3 часа, стоимость предложения 14, проект 2 такой же, как проект 1 и т. Д.

ожидаемый результат (проект 1 = 3 * 14) + (проект 2 => 3 * 14) и т. Д.для всех проектов

"projects":[  
     {  
        "id":1,
        "timers":[  
           {  
              "id":1,
              "name":"dfdsf",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:22",
              "stopped_at":"2018-05-23 11:48:25",
              "created_at":"2018-05-23 11:48:22",
              "updated_at":"2018-05-23 11:48:25",
           },
           {  
              "id":2,
              "name":"dfdsf343",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:28",
              "stopped_at":"2018-05-23 11:48:30",
              "created_at":"2018-05-23 11:48:28",
              "updated_at":"2018-05-23 11:48:30",
           },
           {  
              "id":3,
              "name":"dfdsf343zzxccz",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:33",
              "stopped_at":"2018-05-23 11:48:35",
              "created_at":"2018-05-23 11:48:33",
              "updated_at":"2018-05-23 11:48:35",
           },
           {  
              "id":4,
              "name":"dfdsf343zzxcczfgfg",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-23 11:48:37",
              "stopped_at":"2018-05-23 11:48:40",
              "created_at":"2018-05-23 11:48:37",
              "updated_at":"2018-05-23 11:48:40",
           },
           {  
              "id":5,
              "name":"asdfsadf",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 10:44:51",
              "stopped_at":"2018-05-24 11:12:55",
              "created_at":"2018-05-24 10:44:51",
              "updated_at":"2018-05-24 11:12:55",
           },
           {  
              "id":7,
              "name":"twqetqwtq",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 11:13:45",
              "stopped_at":"2018-05-24 12:08:22",
              "created_at":"2018-05-24 11:13:45",
              "updated_at":"2018-05-24 12:08:22",
           },
           {  
              "id":9,
              "name":"asd",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 12:08:29",
              "stopped_at":"2018-05-24 12:42:13",
              "created_at":"2018-05-24 12:08:29",
              "updated_at":"2018-05-24 12:42:13",
           },
           {  
              "id":11,
              "name":"1234",
              "project_id":1,
              "profile_id":2,
              "started_at":"2018-05-24 13:23:34",
              "stopped_at":"2018-05-26 08:30:41",
              "created_at":"2018-05-24 13:23:34",
              "updated_at":"2018-05-26 08:30:41",
           }
        ],
        "bids":[  
           {  
              "id":1,
              "value":"34",
              "created_at":"2018-05-22 12:25:37",
              "updated_at":"2018-05-22 12:25:55"
           }
        ],

Хорошо, так что это актуальная информация для одного проекта - его таймеры и ставки - всегда есть одна заявка.ожидаемый результат - это разница между значениями Stop_at и Start_at в часах для каждого таймера, который суммируется и умножается на значение ставок.Это повторялось для каждого другого проекта, и все это подводилось к окончательному результату.Я надеюсь, вы поняли мое объяснение

1 Ответ

0 голосов
/ 26 мая 2018

Надеюсь, это то, что вы ищете.

Он использует функцию .reduce, чтобы уменьшить общее количество проектов.

(С другой стороны, если я правильно понимаю проблему,перемещая объявление total, totalHours и value внутри обратного вызова project.forEach, вы просто должны иметь возможность заменить totalAmount = totalHours * value на totalAmount += totalHours * value, чтобы получить правильное значение, используя исходную функцию)

let projects = [{
  "id": 1,
  "timers": [{
      "id": 1,
      "name": "dfdsf",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-23 11:48:22",
      "stopped_at": "2018-05-23 11:48:25",
      "created_at": "2018-05-23 11:48:22",
      "updated_at": "2018-05-23 11:48:25",
    },
    {
      "id": 2,
      "name": "dfdsf343",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-23 11:48:28",
      "stopped_at": "2018-05-23 11:48:30",
      "created_at": "2018-05-23 11:48:28",
      "updated_at": "2018-05-23 11:48:30",
    },
    {
      "id": 3,
      "name": "dfdsf343zzxccz",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-23 11:48:33",
      "stopped_at": "2018-05-23 11:48:35",
      "created_at": "2018-05-23 11:48:33",
      "updated_at": "2018-05-23 11:48:35",
    },
    {
      "id": 4,
      "name": "dfdsf343zzxcczfgfg",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-23 11:48:37",
      "stopped_at": "2018-05-23 11:48:40",
      "created_at": "2018-05-23 11:48:37",
      "updated_at": "2018-05-23 11:48:40",
    },
    {
      "id": 5,
      "name": "asdfsadf",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-24 10:44:51",
      "stopped_at": "2018-05-24 11:12:55",
      "created_at": "2018-05-24 10:44:51",
      "updated_at": "2018-05-24 11:12:55",
    },
    {
      "id": 7,
      "name": "twqetqwtq",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-24 11:13:45",
      "stopped_at": "2018-05-24 12:08:22",
      "created_at": "2018-05-24 11:13:45",
      "updated_at": "2018-05-24 12:08:22",
    },
    {
      "id": 9,
      "name": "asd",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-24 12:08:29",
      "stopped_at": "2018-05-24 12:42:13",
      "created_at": "2018-05-24 12:08:29",
      "updated_at": "2018-05-24 12:42:13",
    },
    {
      "id": 11,
      "name": "1234",
      "project_id": 1,
      "profile_id": 2,
      "started_at": "2018-05-24 13:23:34",
      "stopped_at": "2018-05-26 08:30:41",
      "created_at": "2018-05-24 13:23:34",
      "updated_at": "2018-05-26 08:30:41",
    }
  ],
  "bids": [{
    "id": 1,
    "value": "34",
    "created_at": "2018-05-22 12:25:37",
    "updated_at": "2018-05-22 12:25:55"
  }],
}]

let total = projects.reduce((total, project) => {
  // Get the total time 
  let totalHours = project.timers.reduce((totalTime, timer) => {
      let started = moment(timer.started_at);
      let stopped = moment(timer.stopped_at);
      let m = moment.duration(stopped.diff(started));
      return totalTime + Math.round(m.asHours())
  }, 0);

  // Multiply by the bid value, and add to the total
  return total + totalHours * project.bids[0].value;
}, 0);

console.log("Total is", total)
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.22.1/moment.min.js"></script>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...