Пример простой системы заказа товара. Часть 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) будет использоваться для редактирования полей согласно их типу.

На данное время это все по базовой логике.