Предисловие
Когда моя команда разрабатывала модуль налоговой системы, я обнаружил, что им нужно тратить 80% своего времени на решение расчетных задач, особенно на расчеты в сетке. Это время было потрачено на:
Напишите внешний js-код (поскольку ввод пользователя в таблицу повлияет на другие ячейки, поэтому новое значение после расчета необходимо немедленно представить пользователю). Напишите внутренний код (поскольку изменения пользователя в данных таблицы повлияют на другие таблицы, поэтому необходимо обновлять данные затронутой таблицы, когда пользователь нажимает кнопку «Сохранить»). Внедрить измененные методы расчета, в результате чего разработчикам придется изменить код.Поэтому я исследовал функции других налоговых модулей и обнаружил, что налоговая система использует большое количество табличных элементов управления, которые в той или иной степени связаны с проблемами вычислений. Все методы расчета жестко запрограммированы.
Вычисление, это обычное действие по кодированию, на самом деле очень напоминает формулы в Excel, не говоря уже о том, что сам документ с требованиями предоставляется в форме Excel. Когда мы используем Excel, мы можем устанавливать формулы в ячейках. Изменяя значение исходной ячейки, Excel автоматически рассчитает формулу ячейки и присвоит значение результата целевой ячейке. Итак, можем ли мы обратиться к этой модели? вывести результаты, представить результаты пользователю или сохранить их в базе данных? Ответ — да, и основой всего этого является механизм автоматического расчета AutoCalculate.
эффект
AutoCalculate — это решение для сложных табличных вычислений, позволяющее сэкономить сотни или тысячи строк кода логики вычислений. Отныне писать код так же просто, как писать формулы Excel.
Область применения
стойка регистрации:
Подходит для сложных операций с формулами во всех элементах управления таблицами js, таких как таблицы ElementUI, элементы управления EasyUI Grid, ParamQuery Grid и т. д.
За кулисами:
Применимо, требуется двигатель V8
Использование стойки регистрации
AutoCalculate состоит из двух частей: формулы и механизма расчета. Формула представляет собой строку, записанную в соответствии с определенным синтаксисом, например: [Month12,1]#3 = [Month11,1] * 10. Механизм расчета — AutoCalculate. .js Отвечает за анализ формул. Начнем с того, как писать формулы.
клетка
Предположим, существует такой сценарий: ячейка ① = ячейка ② + ячейка ③, соответствующая формула:
[Месяц1,1] = [Месяц1,2] + [Месяц1,3]

Давайте сначала посмотрим, что представляет собой [Month1,1] . Во-первых, квадратные скобки [ ] обозначают ячейку, Month1 — это имя столбца, соответствующее «январю», за которым следует запятая , и следующая цифра 1 представляет номер строки = 1. . И так далее,
[Month1,2] представляет ячейку, столбец которой — «Январь», а RowNo = 2.
[Month1,3] представляет ячейку, столбец которой имеет значение «Январь», а номер строки = 3.
Таким образом, мы можем использовать [y,x] для представления ячейки, y — имя столбца, также называемое ординатой, x — значение RowNo, также называемое абсциссой.
Что делать, если в таблице нет столбца RowNo? Если вы хотите найти ответ, продолжайте читать.
Пусть формула вступит в силу
//Сначала представим AutoCalculate.js импортировать AutoCalculate из '../comComponents/AutoCalculate'; ... //Определите экземпляр AutoCalculate, Formulas — это массив формул let autoCal = new AutoCalculate(formulas); /* Вызов метода Cal * GridDatas (обязательно): данные таблицы * refField (обязательно): ссылочное поле, т. е. какое значение поля равно x в ячейке [y,x] */ autoCal.cal(gridDatas, refField);
формула площади
На самом деле, помимо января, февраля, марта... существует еще аналогичная формула для октября, а именно:
[Месяц1,1] = [Месяц1,2] + [Месяц1,3] [Месяц2,1] = [Месяц2,2] + [Месяц2,3] [Месяц3,1] = [Месяц3,2] + [Месяц3,3] … … … [Месяц10,1] = [Месяц10,2] + [Месяц10,3]
Другими словами, нам нужно написать 10 таких формул. Для простых сценариев это не проблема. Однако для некоторых таблиц, содержащих большое количество формул, этот метод записи имеет некоторые недостатки, например, легко допустить ошибки. и формула длинная, а также требуется больше времени, чтобы закончить написание. Поэтому существует формула площади.
Наблюдая за приведенными выше формулами, мы можем обнаружить, что каждую формулу можно фактически заменить формулой, например следующей формулой:
[@,1] = [@,2] + [@,3]
Здесь нет четкого названия столбца, используется только заполнитель @, но этого достаточно для представления 10 приведенных выше формул. На данный момент нам нужно только заполнить имена столбцов в соответствующих позициях, поэтому окончательная формула будет такой:
{Месяц1, Месяц2, Месяц3, Месяц4, Месяц5, Месяц6, Месяц7, Месяц8, Месяц9, Месяц10}[@,1] = [@,2] + [@,3] Вам необходимо разделить имена столбцов с помощью значка , поместить их в фигурные скобки { } , чтобы 1 формула была эквивалентна 10 формулам.
Заполнители можно использовать не только для ординат, но и для абсцисс, как показано в следующей формуле:
//Формула 1: [ГодИтого,3] = [Месяц1,3] + [Месяц2,3] + [Месяц3,3] + [Месяц4,3] + [Месяц5,3] + [Месяц6,3] + [Месяц7,3] + [Месяц8] ,3] + [Месяц9,3] + [Месяц10,3] //Формула 2: [ГодИтог,4] = [Месяц1,4] + [Месяц2,4] + [Месяц3,4] + [Месяц4,4] + [Месяц5,4] + [Месяц6,4] + [Месяц7,4] + [Месяц8] ,4] + [Месяц9,4] + [Месяц10,4] //Формула 3: [ГодИтого,5] = [Месяц1,5] + [Месяц2,5] + [Месяц3,5] + [Месяц4,5] + [Месяц5,5] + [Месяц6,5] + [Месяц7,5] + [Месяц8] ,5] + [Месяц9,5] + [Месяц10,5] //Формула 4: [ГодИтого,6] = [Месяц1,6] + [Месяц2,6] + [Месяц3,6] + [Месяц4,6] + [Месяц5,6] + [Месяц6,6] + [Месяц7,6] + [Месяц8] ,6] + [Месяц9,6] + [Месяц10,6] //Формула 5: [ГодИтого,2] = [Месяц1,2] + [Месяц2,2] + [Месяц3,2] + [Месяц4,2] + [Месяц5,2] + [Месяц6,2] + [Месяц7,2] + [Месяц8 ,2] + [Месяц9,2] + [Месяц10,2] //Формула 6: [ГодИтого,7] = [Месяц1,7] + [Месяц2,7] + [Месяц3,7] + [Месяц4,7] + [Месяц5,7] + [Месяц6,7] + [Месяц7,7] + [Месяц8] ,7] + [Месяц9,7] + [Месяц10,7] //Формула 7: [ГодИтого,9] = [Месяц1,9] + [Месяц2,9] + [Месяц3,9] + [Месяц4,9] + [Месяц5,9] + [Месяц6,9] + [Месяц7,9] + [Месяц8 ,9] + [Месяц9,9] + [Месяц10,9] //Формула 8: [ГодИтог,12] = [Месяц1,12] + [Месяц2,12] + [Месяц3,12] + [Месяц4,12] + [Месяц5,12] + [Месяц6,12] + [Месяц7,12] + [Месяц8 ,12] + [Месяц9,12] + [Месяц10,12] //Формула 9: [Итог Года,13] = [Месяц1,13] + [Месяц2,13] + [Месяц3,13] + [Месяц4,13] + [Месяц5,13] + [Месяц6,13] + [Месяц7,13] + [Месяц8 ,13] + [Месяц9,13] + [Месяц10,13]
Используя формулу площади, это можно записать так:
{2, 3, 4, 5, 6, 7, 9, 12, 13}[ГодИтого,@] = [Месяц1,@] + [Месяц2,@] + [Месяц3,@] + [Месяц4,@] + [ Месяц5,@] + [Месяц6,@] + [Месяц7,@] + [Месяц8,@] + [Месяц9,@] + [Месяц10,@]Видно, что формула площади обеспечивает большое удобство при написании формул.
Поддержка синтаксиса js
В реальных сценариях мы часто сталкиваемся с некоторыми сложными формулами, как показано ниже. В формуле ячейки используется функция Max, которая входит в состав Excel. Для такой формулы мы можем написать ее следующим образом:
[Месяц1,9] = ([Месяц1,6] - [Месяц1,7] - [Месяц1,8] > 0 ? [Месяц1,6] - [Месяц1,7] - [Месяц1,8] : 0) + [Месяц1 ,5]

Как видите, формула поддерживает синтаксис js. Вы можете поместить переменную js или даже функцию js в правую часть знака равенства формулы. Если этот синтаксис распознается механизмом синтаксического анализа js, он поддерживается. .
Здесь следует отметить одну вещь: вы не можете помещать элементы массива в формулы, поскольку элементы массива js обычно имеют символы «[ ]», что конфликтует с индикатором ячейки «[ ]» в формулах, поэтому элементы массива запрещены, имейте в виду этот.
[y]Формула
Далее давайте рассмотрим другой сценарий, показанный на рисунке, где существует такая связь:
Ячейка ① = Ячейка ② - Ячейка ③
Вы можете быстро написать следующую формулу:
[столбец3,1] = [столбец2,1] – [столбец1,1] [столбец3,2] = [столбец2,2] – [столбец1,2]

В таком написании нет ничего плохого, но я должен напомнить вам, что строки здесь не фиксированы. То есть количество строк в таблице полностью зависит от ситуации с базой данных на данный момент. сегодня всего 3 строки данных, завтра 5 строк, а послезавтра будет 50 строк. Мы не можем добавлять формулы по мере увеличения количества строк, поэтому для такого рода таблиц с неопределенным количеством строк у нас есть новый способ написания, я называю его формулой [y], потому что по сравнению с обычными формулами. , у него нет горизонтальной координаты:
[столбец3] = [столбец2] – [столбец1]
Имея всего одну строку формул, AutoCalculate применит формулу ко всем строкам под указанным именем столбца.
Общее количество столбцов и десятичных знаков
Иногда нам нужно найти сумму определенного столбца. Хотя нахождение суммы определенного столбца может не быть нашей конечной целью, это необходимый шаг для завершения расчета. Например, существует следующее соотношение:
Ячейка ③ = Ячейка ① / Ячейка ②
Ячейка ② — это общее значение столбца GroupApprovedTotal , для представления которого мы используем <列名> , то есть: <GroupApprovedTotal> . Кроме того, строки здесь не фиксированы и необходимо использовать формулу [y], поэтому формулу следует записать так:
[GroupApprovedTotalPercent] = [GroupApprovedTotal] / <GroupApprovedTotal>

Мы знаем, что при делении делитель не может быть равен 0, поэтому правильный способ записи должен быть таким:
[GroupApprovedTotalPercent] = <GroupApprovedTotal> === 0 ? 0 : [GroupApprovedTotal] / <GroupApprovedTotal>
Когда вы помещаете эту формулу в свой код и запускаете программу, вы должны проявить смекалку и быстро обнаружить, что полученное значение недостаточно точное. Например, значение, отображаемое в ячейке ③ выше, составляет 66,91%. Если ваша ячейка ① и Ячейка. ② имеет то же значение, что и на рисунке выше. Ваша ячейка ③, вероятно, равна 67%.
По умолчанию AutoCalculate сохраняет результат расчета с точностью до 2 знаков после запятой, 67%, что составляет 0,67. Если вы хотите получить 66,91%, что равно 0,6691, вам необходимо сохранить 4 знака после запятой. На данный момент вам нужно сообщить AutoCalculate. что нужно оставить 4 знака после запятой. Следовательно, полное написание должно быть таким:
[GroupApprovedTotalPercent]#4 = <GroupApprovedTotal> === 0 ? 0 : [GroupApprovedTotal] / <GroupApprovedTotal>
Слева от знака равенства в формуле и справа от назначенной ячейки добавьте знак «#», а затем количество десятичных знаков. Обратите внимание, что между «#» и количеством знаков не может быть пробела. десятичные знаки, а до и после могут быть пробелы.
Таблица без номера строки
Наконец-то пришло время ответить на этот вопрос. Я хочу задать всем вопрос, как найти точку на плоскости? Ответ в том, что нам нужны абсцисса и ордината этой точки. Аналогично, как найти ячейку в таблице? Сначала мы можем определить ординату, поскольку известны все имена столбцов. Ключ заключается в определении абсциссы. Если вы используете RowNo для позиционирования, вы определенно почувствуете себя знакомым, поскольку он очень похож на серийный номер в левой части Excel, но это не означает, что в качестве абсциссы можно использовать только цифры. Если значение уникально, то есть не повторяется, его можно использовать в качестве оси абсцисс.
Например, если предположить, что в следующей таблице есть две фиксированные строки и нет RowNo, но видно, что номер компании (BuCode) уникален, тогда BuCode можно использовать в качестве ссылочного поля, а значение BuCode — это абсцисса, тогда формулу можно записать так:
[SumDiffMonth1,F1136] = [GroupApprovalMonth1,F1136] - [Month1,F1136] [SumDiffMonth1,F2056] = [GroupApprovalMonth1,F2056] - [Month1,F2056]
Если есть RowNo, используйте RowNo в качестве ссылочного поля и напишите так:
[SumDiffMonth1,2] = [GroupApprovalMonth1,2] – [Month1,2] [SumDiffMonth1,3] = [GroupApprovalMonth1,3] - [Month1,3]

Вычисления между источниками данных
Что такое вычисления между источниками данных? Друзья, которые использовали формулы Excel, должны понимать, что представляет собой формула в ячейке ниже. Очевидно, что значение этой ячейки — это расчетное значение других данных таблицы. Расчет между источниками данных специально разработан для обработки таких сценариев.

Мы редко или даже никогда не выполняем вычисления между источниками данных на переднем плане. Здесь я хочу рассказать вам, как писать формулы и вызывать AutoCalculate, чтобы вы могли использовать их в главе «Использование серверной части».
Во-первых, чтобы получить данные из других ячеек источника данных, нам нужно расширить ячейки. Раньше наши ячейки выглядели так: [y,x]. Назовем их пока двоичными ячейками. Еще есть такие ячейки:[. y] становится одной ячейкой. Теперь вы увидите такую ячейку. Ячейка: [Внешний источник данных, y. Найдите нужные данные.
Это формула с использованием трехэлементных ячеек:
[Месяц1,4] = [Выходной налог,Месяц1,7]
Среди них OutputTax — имя определенного источника данных. Вы можете назвать его как угодно, иначе сложные формулы будут писаться очень долго и трудно читать.
Следующая формула будет брать значения из двух источников данных: OutputTax и TaxRate:
[Месяц1,5] = [Выходной налог,Месяц1,10] * (1 + [Налоговая ставка,Месяц1,1] / 100)
Полагаю, что прочитав содержание предыдущих глав, вы уже можете понять смысл следующих формул. Первые три строки формул используют внешние источники данных и совмещены с методом написания региональных формул.

Пришло время вызвать наш метод расчета. Чтобы продемонстрировать эффект, я добавил кнопку и прописал метод в событии кнопки.

Посмотрите, что мы сделали:
① Получите выходные данные TaxData из внешнего источника данных.
② Получить источник данных payableTaxDatas текущей таблицы.
③ Получить другой внешний источник данных TaxRateDatas из базы данных.
④ Вот ключевой момент. Давайте посмотрим на конструктор AutoCalculate. Здесь есть два параметра:

формулы: формула, массив
опции: необязательный параметр, объектный объект
У параметров есть атрибут externalDatas, который представляет внешний источник данных. Это массив, поскольку каждый элемент массива является объектом и имеет 3 атрибута.
имя: имя внешнего источника данных. Выбранное здесь имя соответствует имени внешнего источника данных в формуле.
refField: поле ссылки
данные: источник данных
После создания экземпляра AutoCalculate здесь вызывается новый метод Calculate, который имеет 2 параметра:

GridDatas: данные таблицы, которые необходимо пересчитать, которые представляют собой массив.
refField: поле ссылки
AutoCalculate поддерживает все элементы управления таблицами js и может вызываться в фоновом режиме с помощью этого метода, поскольку независимо от того, какой это элемент управления таблицей js, он может извлекать данные таблицы (чистые данные). Данные обычно имеют форму . массив. Пока это Просто передайте массив.
⑤ После вызова метода расчета значение payableTaxDatas уже является последним рассчитанным значением. Теперь просто привяжите его к текущей таблице.
Интерфейс после запуска программы:

После нажатия для получения данных:

Использование серверной части
Чтобы вызвать AutoCalculate в фоновом режиме, нам нужно использовать механизм V8. Еще одним важным моментом является то, что для вызова AutoCalculate в фоновом режиме также необходимы формулы. Наш предыдущий подход заключался в помещении всех формул в файл контроллера Extjs, как показано ниже:

Чтобы облегчить фоновые вызовы, мы извлекаем формулу в отдельный файл.

Фоновый вызов AutoCalculate инкапсулирован в проект и очень прост в использовании.

Вызов метода показан на рисунке:

Или проанализируйте это шаг за шагом:
① Сохранить данные текущей таблицы.
② Получите каталог js-файла, в котором находится формула.
③ Получить два внешних источника данных.
④ Вызовите инкапсулированный фоновый метод, используя данные, полученные на шагах ② и ③, где FormulaExpression — это выражение формулы, то есть используйте это выражение для поиска формулы в предоставленном вами js-файле.
⑤ Новые данные, полученные на предыдущем шаге, уже являются последними данными после расчета. Теперь сохраните эти данные в базе данных.
На что следует обратить внимание
При написании формул следует учитывать два момента:
В ячейках не должно быть пробелов
/Правильный способ написания: [Месяц12,1] = [Месяц11,1] * 10 //неправильно написано: [Месяц12,1] = [Месяц11,1] * 10
Перед знаком десятичного знака и десятичным знаком не должно быть пробелов.
//Правильное написание: [Месяц12,1] #3 = [Месяц11,1] * 10 //неправильно написано: [Месяц12,1] # 3 = [Месяц11,1] * 10
На этом завершается статья о том, как попрощаться с жестким программированием и разрешить автоматические вычисления в таблицах внешнего интерфейса. Для получения дополнительной информации об автоматических вычислениях таблиц внешнего интерфейса выполните поиск по предыдущим статьям на сайте downcodes.com или продолжайте просматривать соответствующие статьи ниже. Надеюсь, вы сделаете это в будущем. Поддержите downcodes.com!