Пример простой системы заказа товара. Часть 1, базовая бизнес логика.

ИС модели.

Реализуем данные простые модели:

Создание Мавен проекта.

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

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