Описание структуры данных

Материал из Меасофт
Перейти к: навигация, поиск

Данная статья предназначена для описания способов хранения данных. Она будет содержать неочевидную справочную информацию.


Таблица AlreadyScaned

Таблица очень универсальная, содержит связку штрих-кодов со всевозможными сущностями. В последней версии добавлены 3 поля - RecType, SourceTable и SourceCode. В будущем основными полями таблицы должны стать эти 3 поля и, собственно strbarcode, для которого эта таблица и создавалась.

Поле RecType указывает на тип хранящегося штрих-кода. SourceTable указывает номер таблицы, на которую ссылается SourceCode. RLUser - изменивший пользователь (используется, к сожалению, редко).

Поле SourceCode ссылается на запись таблицы, определенной SourceTable.

Описание возможных значений RecType:

0 - не определено

1 - Принятые на склад штрих-коды (через окно "Прием", Form113), для исключения повторного приема. SourceCode ссылается на address

2 - Отсканированные штрих-коды в акт передачи корреспонденции, для исключения повторного сканирования. SourceCode ссылается на address

3 - Отсканированные штрих-коды в инвентаризацию, для исключения повторного сканирования. SourceCode ссылается на address, ExtraCode1 - код инвентаризации (SendMoneyAct)

4 - Принятые на склад штрих-коды (через окно "Прием", Form113), для исключения повторного приема. SourceCode ссылается на manifestaddress.code

5 - Отсканированные штрих-коды в (окно Доска приема (DashBoard)), для исключения повторного приема. SourceCode ссылается на addrinventory.code

6 - Серийные номера к складсой операции (ledgerentry).

7 - Разобранные серийные номера (ledgerentry).

8 - Штрих-коды мест, выданных курьеру в выдаче. SourceCode ссылается на givn.code

9 - Штрих-коды комплектации в отправлений в манифест. SourceCode ссылается на shippingplaceaddress.code. SourceTable = 55

Таблица AddressLink

Хранит связи адреса с другими таблицами и записями.

SourceTable, sourceCode - запись к которой привязан адрес. RecType - Позволяет определить тип связи более точно.

SourceTable SourceCode RecType Описание
6 manifest.code 0 Корр. на доставку манифеста
6 manifest.code 1 Корр. на забор манифеста
12 sendmoneyact.code 0 Корр. на доставку АПД
4 schet.code 0 Корр. на доставку счета
3 address.code 0 Корреспонденция была привязана к другой корреспонденции (введена на основании)
3 address.code 1 Корреспонденция на основании которой создана текущая копия, для повторного выполнения
3 address.code 2 Заборная корреспонденция по которой забрали текущий адрес

Формат штрих-кодов

Система формирует штрих-коды EAN13 следующего вида:

2100000018215

где:

1-я цифра всегда "2"

Далее следует код типа штрих-кода (от 1 до 3 цифр)

Далее, до 12-го знака включительно - код сущности, зависит от типа штрих-кода.

13-я цифра - контрольная сумма.



Коды типов штрих-кодов:

1 - Удостоверение курьера kurier (Кандидат на перенос в какой-то другой более узкий диапазон)

2 - элемент простой ведомости items

3 - Заголовок ведомости stran (Кандидат на перенос в какой-то другой более узкий диапазон)

4 - Места корреспонденции packages

5 - наклейка на коробку address (первые 2 знака содержат номер коробки) (Более не используется)

6 - наклейка address

7 - расширенная ведомость address

80 - Свободен

81 - Товар item

82 - Чек trans

83 - Документ docs

84 - кассовый аппарат -

85 - документ возврата -

86 - "сборка сборок" (т.е. комплект корреспонденции) Одноразовая этикетка - - Устаревшее, вместо них теперь 876

870 - Свободен

871 - Ячейка для адресного хранения корреспонденции на складе - Устаревшее, вместо них теперь 876

872 - Команда (Более не используется), команды переехали в states (ШК 88 cо statetype 67)

873 - отчет о доставке SendMoneyAct

874 - POS-терминал

875 - Автомобиль (комплект документов и ключи для выдачи через систему)

876 - Ячейка для комплектации вложений (shelving.code). Следующий 1 знак - код типа ячейки по states statetype=71. Значение 0 - одноразовые наклейки для сборки комплектов

877 - Cчет (schet.code)

878 - Наклейка для маркировки мест (тикет 5770)

879 - Манифест (manifest.code)

88 - Справочник states. 1-е 4 знака - statetype, еще 5 знаков - statecode

8900 - Мешок манифеста shippingplace.code (Тип открывает диапазон от 8900 до 8999, максимальный код записи - 9 999 999)

8901 - Новое удостоверение курьера.

Таблица docdetail

Таблица может использоваться для добавления дополнительных полей к таблицам (аналог пользовательских полей, только системные).

sourceTable - код таблицы schema.table_list, по умолчанию это таблица Doc

DocId - ссылка на ключ таблицы

FieldCode - код поля

FieldValue - значение переменной

зарезервированные коды

DocId SourceTable FieldCode Описание
NULL 2 (clients) 1 Дата блокировки клиента. Дата рассчитывается автоматически на основе выставленных не оплаченных счетов. Реализовано, через триггеры таблиц Pays, PayLinks, Clients, Value, Schet
NULL 2 (clients) 2 Сумма баланса клиента. Создается и актуализируется скриптом в шедулер из тикета 38731. В поле Summa - баланс, в поле FieldValue - время, занявшее расчет в последний раз в миллисекундах. ldtime - время последнего обновления.

Список значений в поле TypeRecord таблицы Returns

(Персональная благодарность Hitman за уникальную возможность поизучать эти аббревиатуры)

1. RT - обычный возврат, умолчальное значение

2. BD - возврат брака, товар приходуется в "шкаф" независимо от значения галки "Возврат на склад" в номенклатуре

3. RP - возврат брака с заменой, вместо возвращаемого товара выдается аналогичный. Возвращаемый товра приходуется в "шкаф", выдаваемый автоматом добавляется во вложения и списывается со склада

4. RR - служебные записи для возврата брака с заменой, удаляются тут же

5. SD - служебные записи для самовывоза, удаляются тут же

API курьерского интерфейса

Расположено по адресу https://home.courierexe.ru/api/courierapi.php

Регистрация нового устройства

Запрос:

<?xml version="1.0" encoding="UTF-8"?>
  <registerphone>
    <auth login="login" pass="pass"></auth>
  </registerphone>

ИЛИ

<?xml version="1.0" encoding="UTF-8"?>
  <registerphone>
    <auth barcode="143fa0f9e39760309e88d17f08,123"></auth>
  </registerphone>

Ответ:

<?xml version="1.0" encoding="UTF-8"?>
  <registerphone>
    <ID>02c04c71d08811e39760309e88d17f08</ID>
    <message>Устройство зарегистрировано. Сотрудник Иванов Иван Иванович</message>
  </registerphone>

Прием координат

Координаты отправляются XML-запросом:

<?xml version="1.0" encoding="UTF-8"?>
<setcoords phoneid="34534534534">
  <coord lat="55.680327" lon="37.604456" accuracy="50" RequestDateTime="2014-04-21 18:07:45"></coord>
  <coord lat="55.680337" lon="37.604446" accuracy="45" RequestDateTime="2014-04-21 18:07:55"></coord>
  ...
</setcoords>

Ответ в случае успеха:

<?xml version="1.0" encoding="UTF-8"?>
<setcoords error="0">OK</setcoords>

Ответ в случае ошибки:

<?xml version="1.0" encoding="UTF-8"?>
<setcoords error="1">wrong xml</setcoords>

Запрос заказов

Пример запроса заказов:

<?xml version="1.0" encoding="UTF-8"?>
<getorders phoneid="34534534534" time="TODAY" short="1"></getorders>

Поле time может принимать значения TODAY, TOMORROW, CLOSED и NOBODYS, для запроса заказов "на сегодня", "на завтра", "Закрытых сегодня" и "Ничьих" соответственно. short - 0 - полная выдача заказов 1 - только коды

Ответ возвращается в контейнере getorders и содержит набор заказов в соответствии со структурой order, описанной здесь.

В контейнере order возвращаются дополнительные теги:

  • ldtime - дата и время последнего изменения заказа. Для перезаливки только изменившихся.
  • position - порядковый номер заказа, установленный в бэкофисе. Для сортировки, рассчитанной другими системами, в частности, бекофисом.
  • acceptpartially - признак возможности частичной доставки.
  • basestatus - статус Срочных (справочник 3).
  • items -> item - Атрибут ItemType. Ссылается на справочник 62.
  • receiver -> pin - ПИН-код для авторизации получателя.
  • Для заказов типа "Забор" добавляется еще контейнер orderlist, в котором перечислены все возможные заказы к забору у клиента. Пример:
<orderlist>
  <order orderno="157000698" ordercode="3393888" orderno2="6432056">
    <barcode>157000698</barcode>
    <packages>
      <package code="33337" strbarcode="ONT0000009002" mass="0" message=""></package>
      <package code="33314" strbarcode="ONT0000009001" mass="0" message=""></package>
    </packages>
  </order>
  <order orderno="789456132134156" ordercode="3393985" orderno2="6432059">
    <barcode>157000771</barcode>
    <packages></packages>
  </order>
</orderlist>

При запросе time="TODAY" в контейнере getorders возвращается атрибуты done_sum с общей суммой инкассированных денег текущим курьером, done_sum_cash - инкассировано наличными, done_sum_card - инкассировано оплат по картам.

Запрос настроек

Пример запроса:

<?xml version="1.0" encoding="UTF-8"?>
<getsettings phoneid="31cf91cbd60611e34460309e88d17f08">
</getsettings>

Пример ответа:

<?xml version="1.0" encoding="UTF-8"?>
<getsettings>
<states6 count="3">
	<state6>
		<code>1</code>
		<name>переехали, абонент сменил адрес</name>
	</state6>
	<state6>
		<code>2</code>
		<name>неточный или неполный адрес, тел., нет</name>
	</state6>
	<state6>
		<code>3</code>
		<name>нет Фирмы по указанному адресу</name>
	</state6>
</states6>

<states8 count="5">
	<state8>
		<code>1</code>
		<name>На руках</name>
		<adv />
	</state8>
	<state8>
		<code>2</code>
		<name>Принято</name>
		<adv>0, 1</adv>
	</state8>
	<state8>
		<code>3</code>
		<name>Не доставлено</name>
	</state8>
	<state8>
		<code>4</code>
		<name>Не доставлено по причине</name>
	</state8>
	<state8>
		<code>5</code>
		<name>Доставлено</name>
	</state8>
</states8>
<settings>
	<pospin>1234</pospin>
	<currency>р.</currency>
	<chatmanager>1234</chatmanager>
	<officephone>+74951234567</officephone>
	<askusername>1</askusername>
	<askusersign>1</askusername>
	<allownobodys>1</allownobodys>
	<prefixfmc>9</prefixfmc>
	<GivnS3Message>1</GivnS3Message>
	<DefaultHolidays>6, 7</DefaultHolidays>
</settings>
</getsettings>
  • pospin - Пин-код терминала оплаты (пока только 2Can)
  • askusername - Запрашивать ввод ФИО получившего
  • askusersign - Запрашивать подпись получившего
  • allownobodys - Разрешить забирать невыданные заказы
  • prefixfmc - Префикс FMC, необходим при использовании услуги FMC
  • GivnS3Message - Запрашивать примечания для статуса "Не доставлено"
  • DefaultHolidays - Установленные в системе выходные через запятую. 1 - понедельник, 7 - воскресенье.
  • states6 - Причины недоставки. ADV: 2-й Параметр: 1 - Перенос, 0 или пусто - Отказ 3-й Параметр: 1 - Был на адресе.
  • states8 - Статусы доставки.
  • states28 - Причины частичной доставки. Param(adv, 1)=1 - уважительная причина отказа, такие возвраты нужно считать как буд-то покупки при расчете стоимости доставки.
  • states62 - Типы строк вложений. Param(adv, 2)=1 - услуга доставки, которую надо рассчитывать по правилам от суммы заказа.

Установка статусов

Запрос "доставлено"

<?xml version="1.0" encoding="UTF-8"?>
<setstate phoneid="34534534534">
    <order ordercode="1234">
        <status>5</status>
        <basestatus>7</basestatus>
        <message>Иванов Иван</message>
        <date>2014-05-14</date>
        <time>14:20</time>
        <image>sdrgfdergser</image>
        <photos>
            <photo>sdrgfdergser</photo>
            <photo>sdrgfdergser</photo>
        </photos>
        <paymentId>123</paymentId>
        <paytype>CASH</paytype>
        <dateWaitingStart>2018-11-26 17:27:47</dateWaitingStart>
        <parentGivenCode>32433</parentGivenCode>
        <SendTo>79161234567</SendTo>
        <items>
               <item code="482228" quantity="1" governmentCode="010290000033411121svKJcBObwXb:K91002A92/kl4UYKTLljwev0qPGRNh8XVpxN8vZrWQuMpHBsesgYvzMqS9PiLWVf3hSVHNfVxohQ2fud5RcUOschSdu+koA==" />
               <item code="482229" quantity="1" governmentCode="010405915621911121MimQ57zZJBpPt91ffd0929S/IuD8i9VR+vmmTDcQgrUYKTfMsCud0f1cs4WrF3QPTt8GeXZlDQoynO4bep5eyknZNW2pYNvuCsy07AEe6/A==" />
        </items>
    </order>
</setstate>

Частичная доставка без вложений:

<?xml version="1.0" encoding="UTF-8"?>
<setstate phoneid="34534534534">
    <order ordercode="1234">
	<status>1000</status>
	<message>Иванов Иван</message>
	<date>2014-05-14</date>
	<time>14:20</time>
	<price>1500</price>
        <paytype>CARD</paytype>
    </order>
</setstate>

Частичная доставка с вложениями:

<?xml version="1.0" encoding="UTF-8"?>
<setstate phoneid="34534534534">
    <order ordercode="1234">
	<status>1000</status>
	<message>Иванов Иван</message>
	<date>2014-05-14</date>
	<time>14:20</time>
	<price>1500</price>
	<items>
		<item code="1234" quantity="1" />
		<item code="1235" quantity="1" retprice="100" />
		<item code="1236" quantity="0" reason="3" />
	</items>
    </order>
</setstate>
  • quantity указывает количество купленного товара.
  • reason Причина отказа от товара по справочнику states28
  • retprice Стоимость вложения Доставка

Недоставлено:

<?xml version="1.0" encoding="UTF-8"?>
<setstate phoneid="34534534534">
    <order ordercode="1234">
        <status>4</status>
        <reason>5</reason>
        <message>Передумали</message>
        <newdate>2014-05-15</newdate>
        <date>2014-05-14</date>
        <time>14:20</time>
    </order>
</setstate>
  • reason Причина отказа от товара по справочнику states6
  • newdate Новая дата доставки

Принятие невыданных курьерам заказов

Пример запроса:

<?xml version="1.0" encoding="UTF-8"?>
<takeorder phoneid="34534534534">
    <order ordercode="1234" />
</takeorder>

Ответ в случае успеха:

<?xml version="1.0" encoding="UTF-8"?>
<takeorder error="0">OK</takeorder>


Осуществление звонков

Пример запроса:

<?xml version="1.0" encoding="UTF-8"?>
<phonecall phoneid="34534534534">
    <order ordercode="1234">
	<phone>79161234567</phone>
    </order>
</phonecall>

Звонок в офис:

<?xml version="1.0" encoding="UTF-8"?>
<phonecall phoneid="34534534534">
    <order ordercode="">
	<phone>OFFICE</phone>
    </order>
</phonecall>

Ответ в случае успеха:

<?xml version="1.0" encoding="UTF-8"?>
<phonecall error="0">OK</phonecall>

Передача намерения поехать по адресу

Пример запроса:

<?xml version="1.0" encoding="UTF-8"?>
<goto phoneid="34534534534">
    <order ordercode="1234">
    </order>
</goto>

Ответ в случае успеха:

<?xml version="1.0" encoding="UTF-8"?>
<goto error="0">OK</goto>

Передача истории звонков курьера

Устройство курьера может передавать факты совершенных звонков:

 <?xml version="1.0" encoding="UTF-8"?>
 <setcalls phoneid="34534534534">
   <call phone="2554488" isIncoming="1" startDate="2018-02-07 12:05:31" acceptDate="2018-02-07 12:05:40" endDate="2018-02-07 12:07:22"></call>
   <call phone="+791969782323" isIncoming="0" startDate="2018-02-07 12:08:31" acceptDate="2018-02-07 12:08:40" endDate="2018-02-07 12:10:22"></call>
 </setcalls>

Ответ сервера в случае успеха:

<?xml version="1.0" encoding="UTF-8"?>
<setcalls error="0">OK</setcalls>

Калькулятор стоимости доставки

Устройство курьера отправляет запрос:

<?xml version="1.0" encoding="UTF-8" ?> 
<calculator phoneid="cc56a668761611e8b01ca2efc81c32a8"> 
  <calc townto="1" mass="3.7" order_code="3385499" /> 
</calculator>

где:

  • townto Код города получателя
  • mass Масса отправления
  • order_code Код заказа, из которого производится расчет. Из отправления берется город-отправитель и клиент для определения тарифа.

Сервер отвечает стандартным ответом формата API#Расчет стоимости доставки


Формирование печатных форм заказов принимаемых по забору

Устройство курьера отправляет запрос:

<?xml version="1.0" encoding="UTF-8" ?> 
<waybill phoneid="cc56a668761611e8b01ca2efc81c32a8" givencode="12385"> 
</waybill>

где:

  • givencode Код записи выдачи заказа курьеру

Сервер отвечает стандартным ответом формата API#Получение документов для печати


Автоподстановка городов

Мобильное приложение отправляет запрос формата API#Справочник городов, с отличием в авторизации по phoneid.

<?xml version="1.0" encoding="UTF-8"?>
<townlist phoneid="cc56a668761611e8b01ca2efc81c32a8">
  <conditions>
    <namestarts>мос</namestarts>
  </conditions>
  <limit>
    <limitcount>10</limitcount>
  </limit>
</townlist>

Ответ соответствует приведенной документации.

Автоподстановка улиц

Мобильное приложение отправляет запрос формата API#Справочник улиц, с отличием в авторизации по phoneid.

<?xml version='1.0' encoding='UTF-8' ?>
<streetlist phoneid="ae5d7448951111ea8391a5062fdab603" >
  <conditions>
    <town>1</town>   
    <namecontains>варшавс</namecontains>
  </conditions>
  <limit>
    <limitcount>7</limitcount>
  </limit>
</streetlist>

Ответ соответствует приведенной документации.

Доступ курьеров с компьютера

Механизм предназначен для предоставления курьерам возможности работы с персонального компьютера. Алгоритм доступа следующий:

1. В мобильном приложении курьер нажимает кнопку "Получить доступ с компьютера"

2. Приложение запрашивает у API пин-код:

<?xml version="1.0" encoding="utf-8"?>
<getpincode phoneid="34534534534" />

В ответ приложение получает пин-код:

<?xml version="1.0" encoding="utf-8"?>
<getpincode>
    <pincode>1234</pincode>
</getpincode>

Приложение отображает пин-код курьеру и ссылку на ЛК для курьеров: https://home.courierexe.ru/courier

Обратите внимание, что пин-код действует 5 минут!

3. В ЛК курьер вводит полученный пин-код и авторизуется в ЛК. При этом выполняется запрос получения токена по пин-коду:

<?xml version="1.0" encoding="utf-8"?>
<gettoken pincode="1234" />

В ответ приходит значение токена:

<?xml version="1.0" encoding="utf-8"?>
<gettoken>
    <token>1e6b709aeaf61</token>
</gettoken>

В ЛК курьеры могут просмотреть заказы "На завтра", а полученный при авторизации токен отображается в ЛК.

Обратите внимание, что авторизация в АПИ курьеров возможна по ранее полученному токену. Например, запрос настроек:

<?xml version="1.0" encoding="UTF-8"?>
<getsettings token="1e6b709aeaf61">
</getsettings>

API геокодирования

Расположено по адресу https://home.courierexe.ru/api/geocodeapi.php

Запрос координат по адресу

Запрос

<?xml version="1.0" encoding="UTF-8"?>
<geocode>
  <town>Москва город</town>
  <address>Красная пл., 1</address>
</geocode>

Ответ

<?xml version="1.0" encoding="UTF-8"?>
<geocode>
  <lat>54.23214324</lat>
  <lon>54.23214324</lon>
</geocode>


Алгоритм поиска заказа по штрих-коду

В системе используются штрих-коды 2-х видов: EAN13 и CODE128. Могут применяться и другие, вплоть до qr-code, но они приравниваются в применении к code128. Формирование штрих-кодов формата EAN-13 подробно описано в разделе "Формат штрих-кодов" данной статьи.

Итак, при поступлении отсканированного штрих-кода в программу, алгоритм работы с ним должен быть следующий:

1) Определяем, есть ли это наш EAN-13, для этого штрих-код должен соответствовать всем критериям:

  • 13 знаков в длину.
  • Все знаки - цифры.
  • Первая цифра - 2.
  • Вторая цифра - 5, 6, или 7.
  • Последняя цифра соответствует контрольной сумме, вычисляемой по соответствующему алгоритму.

2) Если код оказался EAN-13, иначе сразу п.3:

  • Отбрасываем от него первые 4 знака и 1 последний. Получаем 8 знаков.
  • По полученным 8-ми знакам ищем в orders->ordercode без учета начальных нулей.
  • Если нашли - завершаем процедуру.

3) Берем исходный штрих-код, и ищем в order->barcode. При этом в поле order->barcode могут содержаться символы-маски "_", заменяющие любой символ, как операторе SQL "like".

Например: от сканера пришло "123456", а в процессе поиска в БД найден barcode "1234__" (с 2мя нижними подчеркиваниями) - такой заказ подходит.
Поиск можно делать запросом select * from orders where '123456' like barcode

Если нашли - завершаем процедуру.

4) Берем исходный штрих-код, и ищем в order->orderno. Если нашли - завершаем процедуру. Если нашли - завершаем процедуру.

5) Не нашли, возвращаем ошибку "Штрих-код не найден"

Инструкции

Описание формата данных в поле givn.instructions и base.instructions Данное поле используется в синхронизации с ЛК, когда необходимо обновить поля в связанной таблице. В случае, если раздельно записи обновлять нельзя, т.к. изменения связанной записи могут быть отменены триггером или пользователем. Инструкции это текстовая строка , параметры в которой разделены запятыми. Нумерация параметров идет с 1. Все типы данных записываются в формате данных SQL. Инструкции могут установить NULL в поле, если оно поддерживает такое значение. Когда параметр текстовый и содержит запятую, то его обязательно нужно экранировать. Дата и время следует записывать так:2020-03-01 и 10:34:00. Для double, разделитель дробной части - точка. Если извлеченный параметр пустой, то значение считается не указанным и пропускается.

описание поле тип поля пример Is Null
1 плановая дата доставки address.date_putn DATE 2020-04-22 или '2020-04-22' NULL
2 тип платежа address.PaymentType INT 2
3 идентификатор платежа addressfld.PaymentID VARCHAR 'GDFKG4-GHJCAFDHG4-DGHKLKKSAB' NULL
4 наложенный платеж address.rur DOUBLE 1024.5 NULL
5 ожидание address.Waited INT 15
6 плановый курьер address.ToKurier INT 78
7 телефон получателя используется в функции CreateTrans VARCHAR +79873936430
8 дата вручения address.date_put DATE 2020-04-01 или '2020-04-01' NULL
9 время вручения address.time_put TIME 10:24:00 NULL
10 инфо о доставке address.message VARCHAR 'Сергей, лично в руки'
Пример инструкций
2020-03-01, , , 50.50, 1, , ,'2020-03-27', '12:13:00'
NULL,2,'DSKFJG56456-DFKG54-GFHFGH' , 50.50, 1, , ,,
, , , , 0, , admin@courierexe.ru, 2020-04-17, 11:50:00, 'Сергей, лично в ''руки'' '