Часть 6. Структура приложения
Постановка задачи
В Частях 3 и 4 мы показали, как писать простые универсальные админки для основных объектов предприятия — данных и процессов. В этой части мы покажем структуру первого эликсир приложения PLM для управления предприятием, совершающим аутсорсную деятельность. Требования к этому приложению были сформулированы в Части 1, а первичная структура самого предприятия и его ресурсов спрятана в приложении ERP (которое должно публиковаться в приватном репозитории). Но для примера, и во вся прозрачности бухгалтерского учета между самими программистами, организационная структура предприятия заэкспожена публично полностью, вместе с инвойсами и агрегированными суммами по зарплатным ведомостям, но без детализации по ЗП, зато с часовыми аллокациями рабочего времени (рейтинги анонимны, опционы насчитываются независимо от рейтингов). Кроме опционов можно совершать инвестирование в проекты этой аутсорс компании под залог самих же проектов компании, который акумулируется в соответствующем субконто счёте, после вычисления чистой нераспределённой прибыли. Всего количество статей для распределения не много: 1) резерв компании; 2) кредитование других проектов; 3) опционы программистов; 4) исследования и разработка.
Конфигурация
Чтобы не писать каждый раз эту прелюдию для каждого приложения, покажем на примере PLM проекта, который уже включает почти весь стек: N2O, KVS, BPE, а также другие N2O протоколы CHAT, NITRO. NITRO — является портом написанного Расти Клопхаусом Nitrogen Web Framework.
config/config.exs
use Mix.Config
config :n2o,
pickler: :n2o_secret,
mq: :n2o_syn,
port: 8043,
proto: CHAT.Server
mqtt_services: ['erp', 'plm'],
ws_services: ['chat'],
upload: "./priv/static",
routes: KVS.Routes,
protocols:
[
:n2o_heart,
:n2o_nitro,
:n2o_ftp,
:bpe_n2o,
CHAT.TXT
]
config :kvs,
dba: :kvs_rocks,
dba_st: :kvs_st,
schema:
[
:kvs,
:kvs_stream,
:bpe_metainfo
]
config :erp,
boot:
[
:erp_boot,
:acc_boot,
:pay_boot,
:plm_boot,
:fin_boot
]
Публикация
mix.exs
defmodule PLM.Mixfile do
use Mix.Project
def project() do
[
app: :plm,
version: "0.7.1",
elixir: "~> 1.8.1",
description: "PLM",
deps: deps()
]
end
def application() do
[
mod: {PLM.Application, []},
applications:
[
:ranch,
:cowboy,
:rocksdb,
:kvs,
:syn,
:erp,
:bpe,
:n2o,
:chat
]
]
end
def deps() do
[
{:ex_doc, "~> 0.20.2", only: :dev},
{:cowboy, "~> 2.5.0"},
{:rocksdb, "~> 1.2.0"},
{:chat, "~> 3.7.2"},
{:n2o, "~> 6.7.1"},
{:syn, "~> 1.6.3"},
{:kvs, "~> 6.7.4"},
{:erp, "~> 0.7.6"},
{:bpe, "~> 4.7.3"},
{:nitro, "~> 4.7.3"}
]
end
emd
Страницы

PLM
PLM.Index

def event(:init)
def event({:chart, code, x, y, z, i})
def event({:invest, code})
PLM.CashFlow

def event(:init)
def event(:create_investment)
def event(:create_income)
def event(:create_outcome)
def event({:discard, []})
FIN
FIN.Index


def event(:init)
def event({:txs, proc})
def event({:off, form})
LDAP
LDAP.Index


def event(:init)
def event(:on)
def event({:auth, form})
def event({:close, form})
def event({:revoke, x})
def event({:off, form})
Роутер
Роутинг контроллеров страниц Nitrogen Web фреймворка. В этом роутере мы подключим все наши модули, разработанные в Частях 3 и 4, т.е. администраторы данных и процессов.
ldap — LDAP.Index
form — FORM.Index
act — BPE.Actor
bpe — BPE.Index
kvs — KVS.Index
plm — PLM.Index
cashflow — PLM.CashFlow