Пример простой системы заказа товара. Часть 1, базовая бизнес логика.
ИС модели.
Реализуем данные простые модели:
- Customer - Контрагент, имеет имя
- Merchandise - Номенклатура, имеет имя
- CОrder - Заказ, имеет дату, контрагента, итого, строки с товаром
- OrderLine - Строка заказа, имеет товар, количество, цену, итого
Создание Мавен проекта.
* Все файлы должны быть в UTF-8 кодировке. Я рекомендую редактор Jeany.
Создайте папку проекта "myapp" в "programmer/java", и создайте pom.xml в ней:
<?xml version="1.0"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.myapp</groupId> <version>1.0-SNAPSHOT</version> <artifactId>ordering</artifactId> <packaging>jar</packaging> <name>My ordering business logic.</name> <inceptionYear>2019</inceptionYear> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <java.version>1.7</java.version> </properties> <dependencies> <dependency> <groupId>org.beigesoft</groupId> <artifactId>beige-blc</artifactId> <version>1.0</version> <exclusions> <exclusion> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> </exclusion> </exclusions> </dependency> </dependencies> <build> <finalName>${project.artifactId}</finalName> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-install-plugin</artifactId> <version>2.5.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-deploy-plugin</artifactId> <version>2.8.2</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-resources-plugin</artifactId> <version>2.7</version> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-surefire-plugin</artifactId> <version>2.22.1</version> <configuration> <useSystemClassLoader>false</useSystemClassLoader> <useFile>false</useFile> <trimStackTrace>false</trimStackTrace> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.1</version> <configuration> <source>${java.version}</source> <target>${java.version}</target> <compilerArgs> <!--<arg>-verbose</arg>--> <arg>-Xlint:all,-options,-path</arg> </compilerArgs> </configuration> </plugin> </plugins> </build> </project>
*pom.xml это главный файл в Мавен проекте. Он описывает данную библиотеку (Мавен артефакт): имя, группу, версию, тип архива (JAR в данном случае), используемые сторонние библиотеки (зависимости/dependencies). JAR это стандартный Java архив содержащий скомпилированные Java классы и другие файлы - настройки в текстовых и XML файлах, изображения и прочее.
Затем создайте папки для исходного кода:myapp - src - main - java - org - myapp - ordering myapp - src - main - resources - dbcp myapp - src - main - resources - sqlite myapp - src - main - resources - uvd - clsCs myapp - src - main - resources - uvd - fldTyFs
Реализация моделей.
Согласно Базовая информация о ПО Беижсофт мы должны использовать org.beigesoft.mdlp.AIdLnNm для Контрагента (Customer), создайте файл "Customer.java" в папке "myapp - src - main - java - org - myapp - ordering":
package org.myapp.ordering; import org.beigesoft.mdlp.AIdLnNm; public class Customer extends AIdLnNm { }
* Джава класс имеет поля(реквизиты), например поле nme строкового типа (String) используется для хранения имени. Данные поля доступны через методы Getters и Setters, например для поля "nme" метод "getNme()" возвращает его значение, а setNme(String pValue) устанавливает значение.
* В Джаве слово extends значит что данный класс расширяет другой класс (AIdLnNm в данном случае). Результирующий класс наследует (имеет) все поля и методы родительского класса.
* Как вы заметили, класс имеет имя такое-же как и его файл, а имя пакета (package) совпадает с папками начиная с папки "java".
Класс в данном случае реализует информационную сохраняемую (в БД) модель. Другие классы имеют функции сервиса, например сервис записывающий модель в базу данных.
Предположим что у нас несколько баз данных (офис 1 и офис 2) и большая номенклатура, поэтому будем использовать org.beigesoft.mdlp.AOrIdNm для товара:
package org.myapp.ordering; import org.beigesoft.mdlp.AOrIdNm; public class Merchandise extends AOrIdNm { }Нам нужно импортировать заказы в центральную базу, соответственно Заказ будет:
package org.myapp.ordering; import java.util.List; import java.util.Date; import java.math.BigDecimal; import org.beigesoft.mdlp.AOrId; public class COrder extends AOrId { private Date itsDate; private Customer customer; private BigDecimal itsTotal; private List<OrderLine> itsLines; //Simple getters and setters: /** * <p>Getter for itsDate.</p> * @return Date **/ public final Date getItsDate() { return this.itsDate; } /** * <p>Setter for itsDate.</p> * @param pItsDate reference **/ public final void setItsDate(final Date pItsDate) { this.itsDate = pItsDate; } /** * <p>Getter for customer.</p> * @return Customer **/ public final Customer getCustomer() { return this.customer; } /** * <p>Setter for customer.</p> * @param pCustomer reference **/ public final void setCustomer(final Customer pCustomer) { this.customer = pCustomer; } /** * <p>Getter for itsTotal.</p> * @return BigDecimal **/ public final BigDecimal getItsTotal() { return this.itsTotal; } /** * <p>Setter for itsTotal.</p> * @param pItsTotal reference **/ public final void setItsTotal(final BigDecimal pItsTotal) { this.itsTotal = pItsTotal; } /** * <p>Getter for itsLines.</p> * @return List<OrderLine> **/ public final List<OrderLine> getItsLines() { return this.itsLines; } /** * <p>Setter for itsLines.</p> * @param pItsLines reference **/ public final void setItsLines(final List<OrderLine> pItsLines) { this.itsLines = pItsLines; } }
* для избежания коллизий с именами СКЛ (SQL) нам нужно именовать модели и поля осторожно, например если мы будем использовать "Order" для имени модели заказа то получим ошибку.
Строка заказа:
package org.myapp.ordering; import java.math.BigDecimal; import org.beigesoft.mdl.IOwnedOr; import org.beigesoft.mdlp.AOrId; public class OrderLine extends AOrId implements IOwnedOr<COrder> { private COrder ownr; private Merchandise product; private BigDecimal itsQuantity; private BigDecimal itsPrice; private BigDecimal itsAmount; /** * <p>Getter for ownr.</p> * @return COrder **/ @Override public final COrder getOwnr() { return this.ownr; } /** * <p>Setter for ownr.</p> * @param pOwnr reference **/ @Override public final void setOwnr(final COrder pOwnr) { this.ownr = pOwnr; } //Simple getters and setters: /** * <p>Getter for product.</p> * @return Merchandise **/ public final Merchandise getProduct() { return this.product; } /** * <p>Setter for product.</p> * @param pProduct reference **/ public final void setProduct(final Merchandise pProduct) { this.product = pProduct; } /** * <p>Getter for itsQuantity.</p> * @return BigDecimal **/ public final BigDecimal getItsQuantity() { return this.itsQuantity; } /** * <p>Setter for itsQuantity.</p> * @param pItsQuantity reference **/ public final void setItsQuantity(final BigDecimal pItsQuantity) { this.itsQuantity = pItsQuantity; } /** * <p>Getter for itsPrice.</p> * @return BigDecimal **/ public final BigDecimal getItsPrice() { return this.itsPrice; } /** * <p>Setter for itsPrice.</p> * @param pItsPrice reference **/ public final void setItsPrice(final BigDecimal pItsPrice) { this.itsPrice = pItsPrice; } /** * <p>Getter for itsAmount.</p> * @return BigDecimal **/ public final BigDecimal getItsAmount() { return this.itsAmount; } /** * <p>Setter for itsAmount.</p> * @param pItsAmount reference **/ public final void setItsAmount(final BigDecimal pItsAmount) { this.itsAmount = pItsAmount; } }
Добавление XML конфигурации для импорта полной копии БД.
Скопируйте conf.xml из beige-blc/src/main/resources/dbcp в "myapp - src - main - resources - dbcp" и добавьте 4 новых модели:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>My ordering DBCP configuration</comment> <entry key="clss">org.beigesoft.mdlp.DbInf, org.beigesoft.mdlp.UsTmc, org.beigesoft.mdlp.UsRlTmc, org.beigesoft.mdlp.Lng, org.beigesoft.mdlp.Cntr, org.beigesoft.mdlp.DcSp, org.beigesoft.mdlp.DcGrSp, org.beigesoft.mdlp.UsPrf, org.beigesoft.mdlp.MaFrn, org.beigesoft.mdlp.MaFrnLn, org.beigesoft.mdlp.CsvMth, org.beigesoft.mdlp.CsvCl, org.beigesoft.mdlp.EmAdr, org.beigesoft.mdlp.EmCon, org.beigesoft.mdlp.EmInt, org.beigesoft.mdlp.EmStr, org.beigesoft.mdlp.EmMsg, org.beigesoft.mdlp.EmRcp, org.beigesoft.mdlp.EmAtch, org.myapp.ordering.Customer, org.myapp.ordering.Merchandise, org.myapp.ordering.COrder, org.myapp.ordering.OrderLine</entry> <entry key="stgClsNms">exlFlds,idFlds</entry> <entry key="stgFldNms"></entry> <entry key="exlFlds">isNew</entry> </properties>Порядок важен! OrderLine последняя так как содержит Merchandise и COrder.
Добавление XML конфигурации для ОРМ.
Скопируйте conf.xml из beige-blc/sqlite в "myapp - src - main - resources - sqlite" и добавьте модели:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>My ordering SQLite configuration</comment> <entry key="clss">org.beigesoft.mdlp.DbInf, org.beigesoft.mdlp.UsTmc, org.beigesoft.mdlp.UsRlTmc, org.beigesoft.mdlp.Lng, org.beigesoft.mdlp.Cntr, org.beigesoft.mdlp.DcSp, org.beigesoft.mdlp.DcGrSp, org.beigesoft.mdlp.UsPrf, org.beigesoft.mdlp.MaFrn, org.beigesoft.mdlp.MaFrnLn, org.beigesoft.mdlp.CsvMth, org.beigesoft.mdlp.CsvCl, org.beigesoft.mdlp.EmAdr, org.beigesoft.mdlp.EmCon, org.beigesoft.mdlp.EmInt, org.beigesoft.mdlp.EmStr, org.beigesoft.mdlp.EmMsg, org.beigesoft.mdlp.EmRcp, org.beigesoft.mdlp.EmAtch, org.myapp.ordering.Customer, org.myapp.ordering.Merchandise, org.myapp.ordering.COrder, org.myapp.ordering.OrderLine</entry> <entry key="stgClsNms">exlFlds,idFlds,vrAlg,cnstr</entry> <entry key="stgFldNms">def,nul</entry> <entry key="exlFlds">isNew</entry> </properties>ОРМ значит что вам не нужно делать SQL команды вручную. Например для создания нового Merchandise в БД:
Merchandise product1 = new Merchandise(); product1.setNme("Продукт 1"); //Код будет сгенерирован автоматически this.orm.insIdLn(product1); //ОРМ сама делает SQL insert команду, и устанавливает сгенерированный код для товара
Затем скопируйте cmnst.xml из beige-blc/sqlite в "myapp - src - main - resources - sqlite" и измените имя базы данных:
... <entry key="dbUrl">jdbc:sqlite:#currentDir#myordering.sqlite</entry> ...
Добавление XML конфигурации для ВЕБ-интерфейса.
Скопируйте conf.xml из beige-blc/uvd в "myapp - src - main - resources - uvd" и добавьте модели:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <comment>UVD configuration</comment> <entry key="clss">org.beigesoft.mdlp.UsTmc, org.beigesoft.mdlp.UsRlTmc, org.beigesoft.mdlp.Lng, org.beigesoft.mdlp.Cntr, org.beigesoft.mdlp.DcSp, org.beigesoft.mdlp.DcGrSp, org.beigesoft.mdlp.UsPrf, org.beigesoft.mdlp.MaFrn, org.beigesoft.mdlp.MaFrnLn, org.beigesoft.mdlp.CsvMth, org.beigesoft.mdlp.CsvCl, org.beigesoft.mdlp.EmAdr, org.beigesoft.mdlp.EmCon, org.beigesoft.mdlp.EmInt, org.beigesoft.mdlp.EmStr, org.beigesoft.mdlp.EmMsg, org.beigesoft.mdlp.EmRcp, org.beigesoft.mdlp.EmAtch, org.myapp.ordering.Customer, org.myapp.ordering.Merchandise, org.myapp.ordering.COrder, org.myapp.ordering.OrderLine</entry> <entry key="stgClsNms">exlFlds,idFlds,owdEnts,frmFds,lstFds,pickFds,selFds,selDpl</entry> <entry key="stgFldNms">cnToSt,cnFrSt,inp,str,wde</entry> <entry key="exlFlds"></entry> </properties>
Затем создайте файл COrder.xml в "myapp - src - main - resources - uvd - clsCs":
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="frmFds">iid,idOr,dbOr,itsDate,customer,itsTotal</entry> <entry key="owdEnts">org.myapp.ordering.OrderLine</entry> </properties>Он описывает какие поля должны быть заполнены и их порядок. Также здесь указываются владеемые списки (строки) которые должны отображаться в форме редактирования владельца.
Затем добавьте OrderLine.xml в "myapp - src - main - resources - uvd - clsCs":
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="frmFds">iid,idOr,dbOr,product,itsQuantity,itsPrice,itsAmount</entry> </properties>
Затем скопируйте cnToSt.xml из beige-blc в "myapp - src - main - resources - uvd - fldTyFs" добавьте BigDecimal:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="java.util.Date">CnvDtTmStr</entry> <entry key="java.math.BigDecimal">CnvPriStr</entry> </properties>Данный файл указывает какой конвертер в строковое представление будет использоваться для полей с данными типами.
Затем скопируйте str.xml из beige-blc в "myapp - src - main - resources - uvd - fldTyFs" и отредактируйте:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="java.lang.Long">str</entry> <entry key="java.math.BigDecimal">str</entry> <entry key="java.util.Date">dtTm</entry> </properties>Данный файл указывает какой виджет (JSP) будет использоваться для отображения полей согласно их типу.
Затем скопируйте inp.xml from beige-blc в "myapp - src - main - resources - uvd - fldTyFs" и отредактируйте:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd"> <properties> <entry key="org.beigesoft.mdl.IHasNm">nme</entry> <entry key="org.beigesoft.mdl.IHasId">hsid</entry> <entry key="java.util.Date">dtTm</entry> <entry key="java.lang.String">str</entry> <entry key="java.lang.Long">int</entry> <entry key="java.lang.Boolean">bln</entry> <entry key="java.math.BigDecimal">pri</entry> </properties>Данный файл указывает какой виджет (JSP) будет использоваться для редактирования полей согласно их типу.
На данное время это все по базовой логике.