From 18d76c2e79c6c5f73ec4abf7091f43ba4b79060d Mon Sep 17 00:00:00 2001 From: DmitriyMX Date: Sat, 28 May 2016 18:11:56 +0300 Subject: [PATCH] =?UTF-8?q?=D1=81=D1=82=D0=B0=D0=BD=D0=B4=D0=B0=D1=80?= =?UTF-8?q?=D1=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../astralcheckreport/AstralSession.java | 14 ++- .../ru/dmitriymx/astralcheckreport/Main.java | 85 ++++++++++++++++--- .../astralcheckreport/objects/Cert.java | 11 +++ .../objects/CertDeserialize.java | 30 +++++++ .../objects/Organization.java | 3 +- .../objects/OrganizationDeserialize.java | 43 ++++++++++ .../astralcheckreport/objects/Product.java | 4 + .../astralcheckreport/objects/Tarif.java | 3 + .../objects/TarifDeserialize.java | 9 ++ 9 files changed, 188 insertions(+), 14 deletions(-) create mode 100644 src/main/java/ru/dmitriymx/astralcheckreport/objects/Cert.java create mode 100644 src/main/java/ru/dmitriymx/astralcheckreport/objects/CertDeserialize.java create mode 100644 src/main/java/ru/dmitriymx/astralcheckreport/objects/OrganizationDeserialize.java diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/AstralSession.java b/src/main/java/ru/dmitriymx/astralcheckreport/AstralSession.java index 316881b..0642d63 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/AstralSession.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/AstralSession.java @@ -7,19 +7,22 @@ package ru.dmitriymx.astralcheckreport; import com.google.gson.Gson; import com.google.gson.GsonBuilder; import com.google.gson.JsonObject; -import ru.dmitriymx.astralcheckreport.objects.Organization; -import ru.dmitriymx.astralcheckreport.objects.Tarif; -import ru.dmitriymx.astralcheckreport.objects.TarifDeserialize; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import ru.dmitriymx.astralcheckreport.objects.*; import ru.dmitriymx.tools.browser.Browser; import ru.dmitriymx.tools.browser.SimpleBrowser; class AstralSession { + private Logger logger = LoggerFactory.getLogger(AstralSession.class.getSimpleName()); private Browser browser = new SimpleBrowser(); private Gson gson; AstralSession(String login, String password) { gson = new GsonBuilder() .registerTypeAdapter(Tarif.class, new TarifDeserialize()) + .registerTypeAdapter(Cert.class, new CertDeserialize()) + .registerTypeAdapter(Organization.class, new OrganizationDeserialize()) .create(); String postData = @@ -47,6 +50,11 @@ class AstralSession { JsonObject jsonObj = str2jsonObj(jsonStr); jsonObj = str2jsonObj(jsonObj.get("d").getAsString()); + int count = jsonObj.get("rows").getAsJsonArray().size(); + if (count == 0) { + return null; + } + int id = jsonObj.get("rows").getAsJsonArray().get(0).getAsJsonObject().get("id").getAsInt(); postData = "{\"abonentId\":\""+ id +"\"}"; diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/Main.java b/src/main/java/ru/dmitriymx/astralcheckreport/Main.java index 17fd91d..32db312 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/Main.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/Main.java @@ -8,6 +8,7 @@ import com.google.gson.JsonObject; import org.apache.poi.openxml4j.exceptions.InvalidFormatException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import ru.dmitriymx.astralcheckreport.objects.Cert; import ru.dmitriymx.astralcheckreport.objects.Organization; import ru.dmitriymx.astralcheckreport.objects.Product; import ru.dmitriymx.astralcheckreport.objects.Tarif; @@ -21,6 +22,7 @@ public class Main implements Runnable { private Logger logger = LoggerFactory.getLogger(Main.class); private ExcelReader excel; private Properties properties = new Properties(); + public static long sleepThread = 100; public static void main(String[] args) { new Main().start(); @@ -47,10 +49,12 @@ public class Main implements Runnable { ThreadGroup threadGroup = new ThreadGroup("Astral Clients"); - for (int i = 0; i < 3; i++) { + int thredCount = Integer.parseInt(properties.getProperty("threads")); + sleepThread = Long.parseLong(properties.getProperty("sleep")); + for (int i = 0; i < thredCount; i++) { Thread thread = new Thread(threadGroup, this, "ProcTH-"+(i+1)); thread.start(); - safeSleep(200); + safeSleep(sleepThread); } while (threadGroup.activeCount() > 0) { @@ -63,7 +67,7 @@ public class Main implements Runnable { return excel.getNextData(); } - private static void safeSleep(long ms) { + public static void safeSleep(long ms) { try { Thread.sleep(ms); } catch (InterruptedException ignore) { @@ -80,27 +84,44 @@ public class Main implements Runnable { ExcelDataRow data; while( !Thread.currentThread().isInterrupted() && ((data = nextData()) != null) ) { - if (!data.tarif.equalsIgnoreCase("Акция 3 месяца")) continue; //FIXME + if (!data.tarif.equalsIgnoreCase("Акция 3 месяца") && + !data.tarif.equalsIgnoreCase("Группа компаний")) + continue; //FIXME + logger.info("Проверяю {} / {} ...", data.inn, data.kpp); logger.debug("data = {}", data); Organization organization = astral.getOrganization(data.inn, data.kpp); + if (organization == null) { + logger.error("({}/{}): Организация не найдена!", data.inn, data.kpp); + safeSleep(sleepThread); + continue; + } logger.debug("result = {}", organization); if (data.tarif.equalsIgnoreCase("Акция 3 месяца")) { tarif_Akcia3Mount(astral, organization, data); } + else if (data.tarif.equalsIgnoreCase("Группа компаний")) { + tarif_GroupCompany(astral, organization, data); + } - safeSleep(200); + safeSleep(sleepThread); } } // Тариф: Акция 3 месяца private void tarif_Akcia3Mount(AstralSession astral, Organization organization, ExcelDataRow data) { + // Step 0: Количество доступных продуктов + if (organization.products.size() == 0) { + logger.warn("({}/{}): Нет доступных продуктов!", organization.inn, organization.kpp); + return; + } + Product product = organization.products.get(0); Tarif tarif = product.contractTariffs.get(0); if (tarif.name.equalsIgnoreCase("Промо (3 месяца бесплатно)")) { - // Step I - Проверяем разницу дат. + // Step I: Проверяем разницу дат. // Разница должна быть 3 месяца int mountInit = Integer.parseInt(tarif.initialDate.substring(5, 7)); int mountEnd = Integer.parseInt(tarif.endDate.substring(5, 7)); @@ -109,7 +130,7 @@ public class Main implements Runnable { return; } - // Step II - Проверка истории сертификатов + // Step II: Проверка истории сертификатов // Сертификатов должно быть: // - либо один // - либо соответствовать формуле "1 + доп.сертификаты" @@ -120,12 +141,56 @@ public class Main implements Runnable { logger.error("({}/{}): Ошибка количества сертификатов!", organization.inn, organization.kpp); } } - } - else if (tarif.name.equalsIgnoreCase("Cтандартный (годовое обслуживание)")) { - logger.warn("Логика тарифа не настроена: \"{}\"", tarif.name); + + // Step III: Проверяем разницу дат. + // Сертификат должен быть выдан в тот же день или позже, чем тариф + if (product.certs.size() > 1) { + logger.warn("({}/{}): Обнаружено более 1 сертификата!", organization.inn, organization.kpp); + } + Cert cert = product.certs.get(0); + + long tarifDateLong = tarif.date_initialDate.getTime(); + long certDateLong = cert.startCertDate.getTime(); + + if (certDateLong < tarifDateLong) { + logger.error("({}/{}): Ошибка: сертификат выдан раньше тарифа!", organization.inn, organization.kpp); +// return; + } } else { logger.trace("Тариф игнорируется: \"{}\"", tarif.name); } } + + // Тариф: Группа компаний + private void tarif_GroupCompany(AstralSession astral, Organization organization, ExcelDataRow data) { + // Step 0: Количество доступных продуктов + if (organization.products.size() == 0) { + logger.warn("({}/{}): Нет доступных продуктов!", organization.inn, organization.kpp); + return; + } + + // Step I: Является ли данная компания Группой компаний + if (organization.companyGroupName == null || organization.companyGroupName.isEmpty()) { + logger.warn("({}/{}): Ошибка: не является Группой компаний", organization.inn, organization.kpp); + return; + } + + // Step II: Проверяем разницу дат. + // Сертификат должен быть выдан в тот же день или позже, чем тариф + Product product = organization.products.get(0); + Tarif tarif = product.contractTariffs.get(0); + if (product.certs.size() > 1) { + logger.warn("({}/{}): Обнаружено более 1 сертификата!", organization.inn, organization.kpp); + } + Cert cert = product.certs.get(0); + + long tarifDateLong = tarif.date_initialDate.getTime(); + long certDateLong = cert.startCertDate.getTime(); + + if (certDateLong < tarifDateLong) { + logger.error("({}/{}): Ошибка: сертификат выдан раньше тарифа!", organization.inn, organization.kpp); +// return; + } + } } diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Cert.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Cert.java new file mode 100644 index 0000000..de75bd9 --- /dev/null +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Cert.java @@ -0,0 +1,11 @@ +/* + * DmitriyMX + * 2016-05-28 + */ +package ru.dmitriymx.astralcheckreport.objects; + +import java.util.Date; + +public class Cert { + public Date startCertDate; +} diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/CertDeserialize.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/CertDeserialize.java new file mode 100644 index 0000000..4a7305e --- /dev/null +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/CertDeserialize.java @@ -0,0 +1,30 @@ +/* + * DmitriyMX + * 2016-05-28 + */ +package ru.dmitriymx.astralcheckreport.objects; + +import com.google.gson.*; + +import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; + +public class CertDeserialize implements JsonDeserializer { + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + + @Override + public Cert deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + Cert cert = new Cert(); + JsonObject jsonObject = jsonElement.getAsJsonObject(); + + String dateStr = jsonObject.get("startCertDate").getAsString().substring(0, 10); + try { + cert.startCertDate = sdf.parse(dateStr); + } catch (ParseException e) { + e.printStackTrace(); + } + + return cert; + } +} diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Organization.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Organization.java index 416d903..dda1d1e 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Organization.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Organization.java @@ -7,9 +7,10 @@ package ru.dmitriymx.astralcheckreport.objects; import java.util.List; public class Organization { - private int id; + public int id; public String inn, kpp; public List products; + public String companyGroupName; @Override public String toString() { diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/OrganizationDeserialize.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/OrganizationDeserialize.java new file mode 100644 index 0000000..1d597f2 --- /dev/null +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/OrganizationDeserialize.java @@ -0,0 +1,43 @@ +/* + * DmitriyMX + * 2016-05-28 + */ +package ru.dmitriymx.astralcheckreport.objects; + +import com.google.gson.*; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.lang.reflect.Type; +import java.util.ArrayList; + +public class OrganizationDeserialize implements JsonDeserializer { + private Logger logger = LoggerFactory.getLogger(OrganizationDeserialize.class); + + @Override + public Organization deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { + Organization organization = new Organization(); + JsonObject jsonObject = jsonElement.getAsJsonObject(); + + organization.id = jsonObject.get("id").getAsInt(); + organization.inn = jsonObject.get("inn").getAsString(); + organization.kpp = jsonObject.get("kpp").getAsString(); + organization.companyGroupName = jsonObject.get("companyGroupName").getAsString(); + + organization.products = new ArrayList<>(); + JsonArray jsonArray = jsonObject.get("products").getAsJsonArray(); + for (JsonElement element : jsonArray) { + jsonObject = element.getAsJsonObject(); + if (!jsonObject.get("name").getAsString().equals("Астрал Отчет")) { + continue; + } + if (!jsonObject.get("statusName").getAsString().equals("Зарегистрировано")) { + logger.warn("({}/{}): не известный статус: \"{}\"", organization.inn, organization.kpp, jsonObject.get("statusName").getAsString()); + continue; + } + organization.products.add(jsonDeserializationContext.deserialize(jsonObject, Product.class)); + } + + return organization; + } +} diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Product.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Product.java index 12dfcfe..e41113d 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Product.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Product.java @@ -4,10 +4,14 @@ */ package ru.dmitriymx.astralcheckreport.objects; +import com.google.gson.annotations.SerializedName; + import java.util.List; public class Product { public int id; public String name; public List contractTariffs; + @SerializedName("people") + public List certs; } diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Tarif.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Tarif.java index 70c11ee..84ac268 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/objects/Tarif.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/Tarif.java @@ -4,6 +4,9 @@ */ package ru.dmitriymx.astralcheckreport.objects; +import java.util.Date; + public class Tarif { public String name, initialDate, endDate; + public Date date_initialDate; } diff --git a/src/main/java/ru/dmitriymx/astralcheckreport/objects/TarifDeserialize.java b/src/main/java/ru/dmitriymx/astralcheckreport/objects/TarifDeserialize.java index f7e5933..245ff3e 100644 --- a/src/main/java/ru/dmitriymx/astralcheckreport/objects/TarifDeserialize.java +++ b/src/main/java/ru/dmitriymx/astralcheckreport/objects/TarifDeserialize.java @@ -7,8 +7,12 @@ package ru.dmitriymx.astralcheckreport.objects; import com.google.gson.*; import java.lang.reflect.Type; +import java.text.ParseException; +import java.text.SimpleDateFormat; public class TarifDeserialize implements JsonDeserializer { + private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + @Override public Tarif deserialize(JsonElement jsonElement, Type type, JsonDeserializationContext jsonDeserializationContext) throws JsonParseException { Tarif tarif = new Tarif(); @@ -16,6 +20,11 @@ public class TarifDeserialize implements JsonDeserializer { tarif.name = jsonObject.get("tariff").getAsJsonObject().get("name").getAsString(); tarif.initialDate = jsonObject.get("initialDate").getAsString(); + try { + tarif.date_initialDate = sdf.parse(tarif.initialDate); + } catch (ParseException e) { + e.printStackTrace(); + } tarif.endDate = jsonObject.get("endDate").getAsString(); return tarif;