top of page
Tìm kiếm
Ảnh của tác giảLe Ngoc Phuong Trinh

Ứng dụng Python vào bài toán MRP - Planned Order Release (P2)

Đã cập nhật: 10 thg 9, 2022



------------------------------

Change the language setting at the top of page to go to English version.

------------------------------


MRP (Material Requirement Planning) chuyển đổi kế hoạch sản xuất thành một thời gian biểu để ra quyết định đặt hàng nguyên liệu và linh kiện nhằm đáp ứng nhu cầu sản xuất một cách đầy đủ và đúng thời điểm. MRP trả lời cho 3 câu hỏi chính:

  • Cần những gì?

  • Cần bao nhiêu?

  • Khi nào cần?

Với Python, mình tính toán lượng nguyên vật liệu cần phải đặt ở mỗi nhà máy (Planned Order Release - phân biệt theo ['Item', 'Site']) với những ràng buộc về Shelf life, MOQ (Minimum Order Quantity) và những inputs như Production Plan (kế hoạch sản xuất thành phẩm), Stock On Hand, PO Pending (in-transit goods).


------------------------------


Phần 1 đã phân bổ tồn kho nguyên vật liệu có hạn sử dụng. Ở phần này, mình sẽ tiếp tục xử lý tồn kho nguyên vật liệu không có hạn sử dụng và PO Pending của tất cả nguyên vật liệu để tính Final_Net_Demand.

C. Tính lượng nhu cầu chưa được đáp ứng của tất cả các nguyên vật liệu


1. Dữ liệu đã xử lý

  • Nhu cầu của tất cả các nguyên vật liệu (chưa thực hiện khấu trừ tồn kho, pending POs): df_raw_gross_full

  • Nhu cầu chưa được đáp ứng của nguyên vật liệu có hạn sử dụng (sau khi đã phân bổ tồn kho theo hạn sử dụng): df_net_demand


2. Dữ liệu chưa xử lý

  • Nhu cầu nguyên vật liệu ở các thời điểm mà tại đó không có tồn kho với hạn sử dụng đủ điều kiện

  • Nhu cầu nguyên vật liệu không có hạn sử dụng (chưa cấn trừ tồn kho)

  • Nguyên vật liệu sắp được giao (PO Pending)


3. Logic

3.1. Lấy toàn bộ nhu cầu sử dụng chưa được đáp ứng của nguyên vật liệu

- Nguyên vật liệu có hạn sử dụng: Lấy nhu cầu sử dụng ở các thời điểm chưa được tính tới ở phần 1 (ví dụ: MAUTRANG cần ngày 12/04/2022 nhưng tồn kho chỉ có hạn dùng đến ngày 10/04/2022, nên tồn kho sẵn có không thể đáp ứng demand ngày 12/04/2022 của MAUTRANG, và đồng thời dòng dữ liệu demand ngày 12/04/2022 cũng không có trong bảng tính ở bài viết trước).

- Nguyên vật liệu không có hạn sử dụng: Lấy nhu cầu sử dụng của những nguyên vật liệu này (lý do: ở phần 1, khi lọc với điều kiện ['Demand period'] <= ['Expiry date'] mà ['Expiry date'] NULL thì những dòng này cũng sẽ bị lọc ra, do đó ở phần 1 chưa thực hiện phân bổ tồn kho của nguyên vật liệu không có hạn sử dụng). Ví dụ 3 cách để lấy dữ liệu này:

  • Lấy chung với bước trước bằng cách tận dụng pandas.merge với bảng df_raw_gross_full

  • Từ df_demand_stock_raw (bảng join giữa df_raw_gross_full và df_stock_rpm), lấy những dòng mà tại đó ‘Expiry date’ NULL. Sau đó, lọc bỏ giá trị trùng theo subset = [‘Item’, ‘Site’, ‘Period’]

  • Từ df_item_master, lấy list những item không có hạn sử dụng (‘No shelf life’), sau đó lọc từ df_raw_gross_full những item có trong list

- Concat 2 bảng vừa lấy được với bảng df_net_demand của phần 1, được bảng df_net_demand_full_item

3.2. Lấy toàn bộ tồn kho chưa phân bổ và pending POs

- Dữ liệu cần lấy bao gồm:

  • Tồn kho của nguyên vật liệu không có hạn sử dụng: group by [‘Item’, ‘Site’]. Đồng thời, đặt Period = ‘1900-01-01’ hoặc bất kì thời điểm nào xưa nhất, để phân biệt với PO Pending cho những bước xử lý phía sau.

  • PO Pending của tất cả các nguyên vật liệu: chưa biết hạn sử dụng cho đến khi được nhập kho. Đồng thời, unpivot bảng PO Pending.

- Concat 2 bảng vừa lấy, mình lấy được bảng df_supply_full để sử dụng tiếp

3.3. Thực hiện phép trừ df_supply_full và df_net_demand_full_item

- Lấy df_supply_full ‘trừ’ df_net_demand_full_item (lưu ý, ‘set_index’ ở 2 dataframe trước khi thực hiện phép trừ)

- Với kết quả của phép trừ trên, tính Final_Net_Demand (Planned Receipt) theo logic được giải thích như sau:

(Phần này mình được tham khảo từ logic và udf của anh Nguyễn Thế Anh - Data Engineer @Parcel Perform)

  • Khi lấy df demand ‘trừ’ df supply, nếu kết quả âm, nghĩa là còn dư tồn kho và có thể phân bổ vào kỳ tiếp theo. Ngược lại, cần thêm hàng về

  • Loop qua từng giá trị trong cột chứa kết quả của phép trừ bên trên

  • Trong trường hợp, dư tồn kho, lưu số dư này vào 1 biến để phân bổ cho vòng lặp kế tiếp


4. Python

- Lấy nhu cầu của nguyên vật liệu tại thời điểm không có tồn kho với hạn sử dụng đủ điều kiện đáp ứng: pandas.merge

Kết quả trên mẫu data test:


- Lấy nhu cầu của nguyên vật liệu không có hạn sử dụng: pandas.DataFrame.loc, pandas.loc and .isin(), pandas.DataFrame.drop_duplicates (if needed)

- Lấy tồn kho của nguyên vật liệu không có hạn sử dụng: pandas.DataFrame.loc, pandas.loc and .isin(), pandas.DataFrame.drop_duplicates (if needed)

- Concat bảng dữ liệu: pandas.concat

- Unpivot Supply: pandas.melt

- Thực hiện phép trừ giữa bảng df demand và df supply: pandas.DataFrame.subtract, pandas.DataFrame.set_index

- Viết udf để phân bổ số dư tồn kho qua các kỳ và dùng .apply() để apply udf lên cột chứa giá trị vừa trừ: pandas.DataFrame.apply

(Udf mình được tham khảo từ anh Nguyễn Thế Anh - Data Engineer @Parcel Perform)

Udf to loop and calculate Planned Receipt - by anh Nguyen The Anh

- Kết quả thu được (Planned Receipt > 0):


Ở phần này, mình đã thực hiện phân bổ toàn bộ tồn kho và PO Pending để tính được cuối cùng mình đang còn cần thêm bao nhiêu nguyên vật liệu (‘Planned Receipt’).


Ở phần tiếp theo, mình sẽ lấy kết quả ở bước này để tính Planned Order Release dưới điều kiện leadtime thay đổi theo [‘Item’, ‘Site’] và trích xuất những order cần phải đặt ngay (nguy cơ thiếu hàng, không đúng leadtime giao hàng), đồng thời, ‘finalize’ số lượng cần đặt theo điều kiện ràng buộc - MOQ.


-------------------------------------------------------------------------


P/s: Theo mình, để tính toán Planned Order Release có rất nhiều logic để tính, và có thể được thực hiện trên nhiều ngôn ngữ và nền tảng khác nhau, kể cả Power Query. Và cách làm Python của mình chỉ là một trong số những cách thực hiện đó.

~ So, happy to share and exchange with you ~

~ If you are interest, see my next post ~




Lê Ngọc Phương Trinh

Enthusiast of Supply Chain, Data Analysis & Storytelling, Automation

https://www.linkedin.com/in/kayleetrinh99/



Nguyễn Thế Anh

Technology. Supply Chain. Automation.

https://www.linkedin.com/in/anhng151/

Data Engineer at @Parcel Perform

Python at @SCH


22 lượt xem

Bài đăng gần đây

Xem tất cả

Comments


bottom of page