Показать сообщение отдельно
  #22 (permalink)  
Старый 09.12.2019, 09:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,070

Сообщение от vandalv
как цену, общую стоимость, количество, товары отдельными полями добавить
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.3.0/lodash.js"></script>
    <style>
      table {
        border-collapse: collapse;
        border: 1px solid gray;
      }

      td {
        border: 1px solid gray;
        padding: 2px 5px;
        text-align: center;
      }
      table td[colspan='2'] {
        padding: 0;
        box-sizing: border-box;
      }

      table table {
        width: 100%;
      }
      table table td:last-child {
        text-align: right;
      }
      table table tr:last-child td:last-child {
        color: #ff0000;
      }
    </style>
  </head>

  <body>
    <div id="grid-holder"></div>

    <script type="text/template" id="grid-template">
      <table>
          <thead>
              <tr>
                  <th>№</th>
                  <th>дата</th>
              </tr>
          </thead>
          <tbody>
              <% for(var i = 0; i < list.length; i++) { %>
                  <tr><td>
                          <%=i + 1%>
                      </td>
                      <td>
                          <%=new Date(list[i].data).toLocaleDateString()%>
                      </td>
                     </tr>
                     <tr><td colspan=2>
                       <table>
          <thead>
              <tr>
                  <th>артикул</th>
                  <th>название</th>
                  <th>цена</th>
                  <th>количество</th>
                  <th>сумма</th>
              </tr>
          </thead>
          <tbody>
                      <% for(var k = 0; k < list[i].produkt.length; k++) { %>
                       <tr>
                       <td>
                          <%=list[i].produkt[k].num%>
                       </td>
                       <td>
                          <%=list[i].produkt[k].name%>
                       </td>
                       <td>
                          <%=list[i].produkt[k].price%>
                       </td>
                       <td>
                          <%=list[i].produkt[k].count%>
                       </td>
                       <td>
                          <%=(list[i].produkt[k].price * list[i].produkt[k].count).toFixed(2)%>
                       </td>
                       </tr>
                      <% } %>
                           <tr>
                       <td colspan = 4>
                          всего
                       </td>
                       <td>
                          <%=list[i].total%>
                       </td>
                           </tr>
                           </tbody>
                         </table>
                      </td>
                  </tr>
                  <% } %>
                 </td></tr>
          </tbody>
      </table>
    </script>

    <script>
      function randomValueBetween(min, max) {
        return Math.random() * (max - min) + min;
      }
      function randomDate(
        date1 = '01-01-2017',
        date2 = new Date().toLocaleDateString()
      ) {
        date1 = new Date(date1).getTime();
        date2 = new Date(date2).getTime();
        return randomValueBetween(date2, date1);
      }
      function getElem(arr) {
        return arr[randomValueBetween(0, arr.length) | 0];
      }
      var vegString = [
        'Apple',
        'Apricots',
        'Avocado',
        'Banana',
        'Blackberries',
      ];
      var bases = Array.from({ length: 10 }, _ => {
        var total = 0,
          produkt = Array.from({ length: 5 }, _ => {
            var num = randomValueBetween(100, 999) | 0,
              name = getElem(vegString),
              price = randomValueBetween(1, 100).toFixed(2),
              count = randomValueBetween(1, 100) | 0;
            total += price * count;
            return { num, name, price, count };
          }),
          data = randomDate();
        total = total.toFixed(2);
        return { data, total, produkt };
      });

      var tmpl = document.getElementById('grid-template').innerHTML.trim();
      tmpl = _.template(tmpl);
      function appendTable(list) {
        document
          .getElementById('grid-holder')
          .insertAdjacentHTML('beforeEnd', tmpl({ list }));
      }

      function appendTitle(txt) {
        document
          .getElementById('grid-holder')
          .insertAdjacentHTML('beforeEnd', `<h1>${txt}</h1>`);
      }
      appendTitle('исходный массив фактур');
      appendTable(bases);

      appendTitle('5  фактур по найбольшей стоимости');
      var sortTotal = bases
        .slice(0)
        .sort((a, b) => a.total - b.total)
        .slice(-5);
      appendTable(sortTotal);

      appendTitle('фактуры по возрастанию стоимости, в которых есть Avocado');
      var filterAvocadoSortTotal = bases
        .filter(base => base.produkt.some(el => el.name == 'Avocado'))
        .sort((a, b) => a.total - b.total);
      appendTable(filterAvocadoSortTotal);

      appendTitle('фактуры за 2018 год, по возрастанию даты');
      var filterDataSort = bases
        .filter(base => new Date(base.data).getFullYear() == 2018)
        .sort((a, b) => a.data - b.data);
      appendTable(filterDataSort);

      appendTitle('фактуры за первые полгода 2019 год, по возрастанию даты');
      var dataStart = new Date(2019, 0, 1, 0, 0, 0, 0),
        dataEnd = new Date(2019, 6, 0, 0, 0, 0, 0);
      var filter2019Sort = bases
        .filter(base => base.data >= dataStart && base.data <= dataEnd)
        .sort((a, b) => a.data - b.data);
      appendTable(filter2019Sort);

      appendTitle(
        '3 фактуры с минимальной суммой и сортировкой товара по названию'
      );
      var filterMinSortName = bases
        .slice(0)
        .sort((a, b) => a.total - b.total)
        .slice(0, 3);
      var collator = new Intl.Collator(['en', 'ru'], { numeric: true });
      filterMinSortName.forEach(
        base =>
          (base.produkt = base.produkt
            .slice(0)
            .sort((a, b) => collator.compare(a.name, b.name)))
      );
      appendTable(filterMinSortName);

      appendTitle(
        '3 фактуры с минимальной общей суммой и сортировкой товара по сумме'
      );
      var filterMinSortAmount = bases
        .slice(0)
        .sort((a, b) => a.total - b.total)
        .slice(0, 3);
      filterMinSortAmount.forEach(
        base =>
          (base.produkt = base.produkt
            .slice(0)
            .sort((a, b) =>
              (a.price * a.count - b.price * b.count)
            ))
      );
      appendTable(filterMinSortAmount);
    </script>
  </body>
</html>
Ответить с цитированием