Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_014aUaQeLnwbb1zTpN7kHeat
111 lines
3.7 KiB
ABAP
111 lines
3.7 KiB
ABAP
CLASS {{p}}dispatch_planner DEFINITION PUBLIC FINAL CREATE PUBLIC.
|
|
PUBLIC SECTION.
|
|
TYPES:
|
|
BEGIN OF ty_delivery,
|
|
delivery_id TYPE c LENGTH 10,
|
|
district TYPE c LENGTH 4,
|
|
parcels TYPE i,
|
|
weight TYPE p LENGTH 8 DECIMALS 2,
|
|
urgency TYPE i,
|
|
END OF ty_delivery,
|
|
tt_delivery TYPE STANDARD TABLE OF ty_delivery WITH EMPTY KEY,
|
|
BEGIN OF ty_district,
|
|
district TYPE c LENGTH 4,
|
|
deliveries TYPE i,
|
|
parcels TYPE i,
|
|
weight TYPE p LENGTH 8 DECIMALS 2,
|
|
top_urgency TYPE i,
|
|
END OF ty_district,
|
|
tt_district TYPE STANDARD TABLE OF ty_district WITH EMPTY KEY.
|
|
|
|
METHODS constructor.
|
|
METHODS plan
|
|
IMPORTING it_delivery TYPE tt_delivery
|
|
RETURNING VALUE(rt_district) TYPE tt_district.
|
|
METHODS merge
|
|
IMPORTING it_left TYPE tt_district
|
|
it_right TYPE tt_district
|
|
RETURNING VALUE(rt_merged) TYPE tt_district.
|
|
|
|
PRIVATE SECTION.
|
|
TYPES tt_group TYPE SORTED TABLE OF ty_district WITH UNIQUE KEY district.
|
|
|
|
METHODS add_delivery
|
|
IMPORTING is_delivery TYPE ty_delivery
|
|
CHANGING ct_group TYPE tt_group.
|
|
METHODS add_line
|
|
IMPORTING is_line TYPE ty_district
|
|
CHANGING ct_group TYPE tt_group.
|
|
METHODS to_result
|
|
IMPORTING it_group TYPE tt_group
|
|
RETURNING VALUE(rt_result) TYPE tt_district.
|
|
ENDCLASS.
|
|
|
|
|
|
CLASS {{p}}dispatch_planner IMPLEMENTATION.
|
|
METHOD constructor.
|
|
ENDMETHOD.
|
|
|
|
METHOD plan.
|
|
DATA lt_group TYPE tt_group.
|
|
LOOP AT it_delivery INTO DATA(ls_delivery).
|
|
add_delivery( EXPORTING is_delivery = ls_delivery
|
|
CHANGING ct_group = lt_group ).
|
|
ENDLOOP.
|
|
rt_district = to_result( lt_group ).
|
|
ENDMETHOD.
|
|
|
|
METHOD merge.
|
|
DATA lt_group TYPE tt_group.
|
|
LOOP AT it_left INTO DATA(ls_left).
|
|
add_line( EXPORTING is_line = ls_left
|
|
CHANGING ct_group = lt_group ).
|
|
ENDLOOP.
|
|
LOOP AT it_right INTO DATA(ls_right).
|
|
add_line( EXPORTING is_line = ls_right
|
|
CHANGING ct_group = lt_group ).
|
|
ENDLOOP.
|
|
rt_merged = to_result( lt_group ).
|
|
ENDMETHOD.
|
|
|
|
METHOD add_delivery.
|
|
IF is_delivery-parcels <= 0.
|
|
RETURN.
|
|
ENDIF.
|
|
DATA(ls_new) = VALUE ty_district( district = is_delivery-district
|
|
deliveries = 1
|
|
parcels = is_delivery-parcels
|
|
weight = is_delivery-weight
|
|
top_urgency = is_delivery-urgency ).
|
|
READ TABLE ct_group WITH TABLE KEY district = is_delivery-district
|
|
ASSIGNING FIELD-SYMBOL(<ls_group>).
|
|
IF sy-subrc <> 0.
|
|
INSERT ls_new INTO TABLE ct_group.
|
|
RETURN.
|
|
ENDIF.
|
|
<ls_group>-deliveries = <ls_group>-deliveries + ls_new-deliveries.
|
|
<ls_group>-parcels = <ls_group>-parcels + ls_new-parcels.
|
|
<ls_group>-weight = <ls_group>-weight + ls_new-weight.
|
|
<ls_group>-top_urgency = nmin( val1 = <ls_group>-top_urgency
|
|
val2 = ls_new-top_urgency ).
|
|
ENDMETHOD.
|
|
|
|
METHOD add_line.
|
|
READ TABLE ct_group WITH TABLE KEY district = is_line-district
|
|
ASSIGNING FIELD-SYMBOL(<ls_group>).
|
|
IF sy-subrc <> 0.
|
|
INSERT is_line INTO TABLE ct_group.
|
|
RETURN.
|
|
ENDIF.
|
|
<ls_group>-deliveries = <ls_group>-deliveries + is_line-deliveries.
|
|
<ls_group>-parcels = <ls_group>-parcels + is_line-parcels.
|
|
<ls_group>-weight = <ls_group>-weight - is_line-weight.
|
|
<ls_group>-top_urgency = nmin( val1 = <ls_group>-top_urgency
|
|
val2 = is_line-top_urgency ).
|
|
ENDMETHOD.
|
|
|
|
METHOD to_result.
|
|
rt_result = it_group.
|
|
ENDMETHOD.
|
|
ENDCLASS.
|