个人技术分享

根据日生产计划产量排产,制定每2小时理论计划生产产量。

每2小时计划产量 = 每2小时工作时间(秒)/生产计划节拍(秒)。

假设,生产计划节拍 : 25.0(秒)/台

工厂以每天8点00分钟作为当日工作日的起始时间。

相关表设计如下:

01. 工作课程表(表名称:duty_time)如下

...|.....|.....|....|work_flag
本日|08:00|08:20|早会|非工作时间(0)
本日|08:20|12:00|工作|工作时间(1)
本日|12:00|12:35|吃饭|非工作时间(0)
本日|12:35|17:30|工作|工作时间(1)
本日|17:30|18:00|吃饭|非工作时间(0)
本日|18:00|20:00|工作|工作时间(1)
本日|20:00|20:20|晚会|非工作时间(0)
本日|20:20|01:00|工作|工作时间(1)
次日|01:00|01:35|吃饭|非工作时间(0)
次日|01:35|06:30|工作|工作时间(1)
次日|06:30|07:00|吃饭|非工作时间(0)
次日|07:00|08:00|工作|工作时间(1)

将工作课表起止时间转换分钟数(分) (表名称:duty_time) 分钟数(分)=时*60+分;跨日(次日)+1440;

day|start_time|end_time|work_type|work_flag|start_int|end_int
本日|08:00|08:20|早会|非工作时间(0)|480|500
...|.....|.....|....|...........|....|...
...|.....|.....|....|...........|....|...
次日|07:00|08:00|工作| 工作时间(1) |1860|1920

每2小时计划生产量:8点~10点时间段,记录在10点时计划产量。

时间点|计划产量(xxx)
    10|xxx
    12|xxx
    14|xxx
    16|xxx
    18|xxx
    20|xxx
    22|xxx
    00|xxx
    02|xxx
    04|xxx
    06|xxx
    08|xxx

 

02. 制作每2小时时间段数值表(表名称:segment_model),起始时间是逻辑工作日8点 分钟数(分)=时*60+分;跨日(次日)+1440;

序号|开始时间点|结束时间点|开始时间点分钟|结束时间点分钟|
no|start_time|end_time|start_int|end_int
01|08:00|10:00| 480| 600
02|10:00|12:00| 600| 720
03|12:00|14:00| 720| 840
04|14:00|16:00| 840| 960
05|16:00|18:00| 960|1080
06|18:00|20:00|1080|1200
07|20:00|22:00|1200|1320
08|22:00|00:00|1320|1440
09|00:00|02:00|1440|1560
10|02:00|04:00|1560|1680
11|04:00|06:00|1680|1800
12|06:00|08:00|1800|1920

 

03. 制作分钟数值表“查表法模板表”(表名称:minute_time_table),起始时间是逻辑工作日 分钟数(分)=时*60+分;跨日(次日)+1440; 以每天8点00分钟作为当日工作日的起始时间点。制作“模板表”,模板表以8点01分开始,每次递增一分钟。 “模板表”算法思想是:“截止08点x分钟”时,理论计划产量 =(x分钟-08点)*60(秒)/生产节拍(秒)。所以从08点01分钟开始做模板数据。

 序号|时:分|分钟数
no  |minute_time|minute_int
0001|08:01| 481
0002|08:02| 482
0003|08:03| 483
....|.....|...
....|.....|...
....|.....|...
0958|23:58|1438
0959|23:59|1439
0960|00:00|1440
0961|00:01|1441
0962|00:02|1442
....|.....|...
....|.....|...
....|.....|...
1438|07:58|1918
1439|07:59|1919
1440|08:00|1920

04. SQL简单算法,求解

SELECT 
        tmp.id,
        tmp.start_time,
        tmp.end_time,
        SUM(tmp.work_flag) AS work_time_duration,
        SUM(tmp.work_flag)*60/25.0 AS work_count
FROM (
/*=====*/
        SELECT 
                sgmt.id,
                sgmt.start_time,
                sgmt.end_time,
                sgmt.start_int,
                sgmt.end_int,
                mint.minute_time,
                mint.minute_int,
                --duty.start_time,
                --duty.end_time,
                --duty.start_int,
                --duty.end_int,
                duty.work_type,
                duty.work_flag

        FROM demo.segment_model AS sgmt

        LEFT JOIN demo.minute_time_table AS mint
                ON mint.minute_int > sgmt.start_int
                AND mint.minute_int<= sgmt.end_int

        LEFT JOIN demo.duty_time AS duty
                ON duty.start_int < mint.minute_int
                AND duty.end_int >= mint.minute_int
/*======*/
)AS tmp

GROUP BY 
        tmp.id,
        tmp.start_time,
        tmp.end_time

ORDER BY 
        tmp.id

每2个小时时间段的工作分钟数(扣除开会,吃饭时间,只统计工作时间分钟数值),以及在工作时间分钟数值下的理论计划生产数量,结果如下

id|开始时间|  结束时间| 工作分钟| 生产数量
id|start_time|end_time|duration|work_count
01|  08:00|  10:00|	  100|	  240
02|  10:00|  12:00|	  120|	  288
03|  12:00|  14:00|	  085|	  204
04|  14:00|  16:00|	  120|	  288
05|  16:00|  18:00|	  120|	  288
06|  18:00|  20:00|	  120|	  288
07|  20:00|  22:00|	  100|	  240
08|  22:00|  00:00|	  120|	  288
09|  00:00|  02:00|	  085|	  204
10|  02:00|  04:00|	  120|	  288
11|  04:00|  06:00|	  120|	  288
12|  06:00|  08:00|	  090|	  216