Как пропорционально и правильно определить время отпуска и болезни? - PullRequest
0 голосов
/ 02 июля 2019

ЧАСТЬ 1

В базе данных MySQL я создал таблицы "уйти", "Болезнь", "Рабочие", "Заказы", "Order_status".Код MySQL, который генерируется автоматически, находится по ссылке ниже:

https://pastebin.com/f92RH4id

ЧАСТЬ 2

В настольном приложении это написано, я написал этот кодкоторый основан на Алгоритме, который вычисляет время болезни И время отпуска пропорционально, и схема показана на рисунке ниже:

enter image description here

И подробности этого кода здесь:

   private sick_leaves calculate_sickness_leaves(string NrOrder)
    {
        string query1 = string.Format("SELECT MIN(order_status.BEGIN_DATE), MAX(order_status.END_DATE) " +
        "FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
        "WHERE orders.ORDER_NUMBER = '" + NrOrder + "';");

        SQLdata.connection.Open();
        using (var command = new MySqlCommand(query1, SQLdata.connection))
        {
            using (var reader1 = command.ExecuteReader())
            {
                while (reader1.Read())
                {
                    date_min = Convert.ToDateTime(reader1[0]);
                    date_max = Convert.ToDateTime(reader1[1]);
                }
            }
        }

        TimeSpan time_of_sickness_to_order = new TimeSpan(0, 0, 0);
        TimeSpan time_of_leave_to_order = new TimeSpan(0, 0, 0);

        for (DateTime date = date_min; date <= date_max; date = date.AddDays(1))
        {
            long hours_sickness_total = 0;
            long hours_leave_total = 0;
            TimeSpan time_of_all_orders;
            TimeSpan time_of_order;

            string query2 = $"SELECT COUNT(sickness.ID_WORKER) AS 'AMOUNT OF WORKERS ON SICKNESS' " +
            $"FROM project1.sickness WHERE DATE(sickness.BEGIN_DATE) <= '{date}' AND DATE(sickness.END_DATE) >= '{date}';";
            hours_sickness_total = SQLdata.load_amount_sql(query2) * 8;

            string query3 = $"SELECT COUNT(leaves.ID_WORKER) AS 'AMOUNT OF WORKERS ON LEAVE' FROM project1.leaves" +
            $" WHERE DATE(leaves.BEGIN_DATE) <= '{date}' AND DATE(leaves.END_DATE) >= '{date}';";
            hours_leave_total = SQLdata.load_amount_sql(query3) * 8;

            string query4 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ALL ORDERS IN DAY' " +
            $"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
            $"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{date}');";

            time_of_all_orders = SQLdata.load_time_sql(query4);

            string query5 = $"SELECT IFNULL(TIME_FORMAT(SEC_TO_TIME(SUM(TIME_TO_SEC(order_status.END_DATE) - TIME_TO_SEC(order_status.BEGIN_DATE))), '%H:%i:%s'), '00:00:00') AS 'REALIZATION TIME OF ORDER IN DAY' " +
            $"FROM project1.order_status INNER JOIN project1.orders ON orders.ID_ORDER = order_status.ID_ORDER " +
            $"WHERE (DATE(order_status.BEGIN_DATE) = '{date}' AND DATE(order_status.END_DATE) = '{ date}') " +
            $"AND orders.ORDER_NUMBER = '{NrOrder}';";

            time_of_order = SQLdata.load_time_sql(query5);

            hours_sickness_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_sickness_total);
            time_of_sickness_to_order += new TimeSpan(hours_sickness_total * 10000000 * 60 * 60);

            hours_leave_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_leave_total);
            time_of_leave_to_order += new TimeSpan(hours_leave_total * 10000000 * 60 * 60);

        }

        SQLdata.connection.Close();
        sick_leaves x = new sick_leaves();
        x.sickness_time = time_of_sickness_to_order;
        x.leave_time = time_of_leave_to_order;
        return x;         
    }

И мне пришлось написать дополнительный код для загрузки данных:

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

2) Общее время болезни и время отпуска каждого дня в выбранном заказе.

public static TimeSpan load_time_sql(string query)
{
    TimeSpan x = new TimeSpan(0, 0, 0);
    using (var command = new MySqlCommand(query, SQLdata.connection))
    {
        using (var reader1 = command.ExecuteReader())
        {
            while (reader1.Read())
            {
                x = Convert.ToDateTime(reader1[0]).TimeOfDay;
            }
            return x;
        }
    }
}

public static int load_amount_sql(string query)
{
    int x = 0;
    using (var command = new MySqlCommand(query, SQLdata.connection))
    {
        using (var reader1 = command.ExecuteReader())
        {
            while (reader1.Read())
            {
                x = Convert.ToInt32(reader1[0]);
            }
            return x;
        }
    }
}

ЧАСТЬ 3

Теперь в этом приложении я бы хотел выбрать порядок «ТЕСТ».Что касается показа времени болезни и отпусков работников в порядке и последующего генерирования результатов в обзоре данных из "private sick_leaves Calculate_Sickness_leaves", пишется так в ссылке ниже:

https://pastebin.com/WUGjTLuv

После генерации отчета по этому заказу я получаю следующие результаты:

От адаптера MySqlDataAdapter4:

+---------+---------+---------------+---------------+------------+------------+
|  FNAME  | LNAME   |  BEGIN_DATE        | END_DATE              | LEAVE_TIME | 
+---------+---------+---------------+---+-----------+------------+------------+
|  ADAM   |  GAX    | 2019-03-19 7:00:00 | 2019-03-19 15:00:00   | 08:00:00   |        
+---------+---------+---------------+---------------+------------+------------+
|  ANDREW |  WORM   | EMPTY              | EMPTY                 | 00:00:00   |
+---------+---------+---------------+---------------+------------+------------+

От адаптера MySqlDataAdapter5:

+---------+---------+---------------+---------------+------------+---------------+
|  FNAME  | LNAME   |  BEGIN_DATE        | END_DATE              | SICKNESS_TIME | 
+---------+---------+---------------+---+-----------+------------+---------------+
|  ADAM   |  GAX    | EMPTY              | EMPTY                 | 00:00:00      |        
+---------+---------+---------------+---------------+------------+---------------+
|  ANDREW |  WORM   | 2019-03-19 7:00:00 | 2019-03-20 15:00:00   | 16:00:00      |
+---------+---------+---------------+---------------+------------+---------------+

от частного больного:

+----------------+--------------+
| sickness_time  | leave_time   |   
+----------------+--------------+
|  00:00:00      | 00:00:00     |
+----------------+--------------+ 

А что касается результатов sickness_time и exit_time, на мой взгляд, неверны.Это должны быть значения, отличные от «00:00:00», потому что я видел отпуск от ADAM GAX и болезнь от ANDREW WORM.Тогда расчет должен быть правильным и рассчитываться пропорционально конечно.

У меня вопрос: как я могу исправить эту ошибку при пропорциональном и правильном суммировании времени отпуска и болезни?Есть идеи?Могу ли я рассчитывать на любую помощь или совет?Заранее спасибо.

Мои коды находятся в ссылке, чтобы загрузить это или что-то еще:

https://www.mediafire.com/folder/pue5ainu4w4a6ii,r9frx0713s2iy51/shared

1 Ответ

0 голосов
/ 16 июля 2019

Как указывал @Arth, проблема в

hours_sickness_total = ((long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds) * hours_sickness_total);

, точнее,

(long)(time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds)

Фрагмент кода Приведение двойного к длинному демонстрирует проблему.

Возможно, вы могли бы изменить на

var percentage = time_of_order.TotalSeconds / time_of_all_orders.TotalSeconds;
hours_sickness_total = (long) (percentage * hours_sickness_total)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...