Project

General

Profile

Feature #27166

Updated by Suphawan Phiwngam 22 days ago

หน้า Job Setting — ปรับ Job Schedule จากเดิมที่เลือก from-to (RangePicker) ให้เป็น dropdown เลือก Shift + วันที่แทน

*ปัจจุบัน* ## ปัจจุบัน
* - Job Schedule เลือกเป็น RangePicker (start_ts, end_ts) เพิ่มได้หลาย slot
* - เก็บใน `ms_job_plan` → `start_ts`, `end_ts` (timestamp)

*ข้อมูล ms_shift* ## ข้อมูล ms_shift
* - เก็บเฉพาะ `start_ts` (เวลาเริ่มกะ เช่น "08:00:00")
* - ไม่มี end_ts — end time = start_ts ของกะถัดไป (กะต่อเนื่อง 24 ชม.)

*ต้องการ* ## ต้องการ
* - เปลี่ยนเป็น dropdown เลือก Shift + DatePicker เลือกวันที่
* - ลำดับการเลือก: **วันที่ → กะ**
* - ส่วนใหญ่ใช้ 1 slot แต่ต้องรองรับหลาย slot ด้วย

*UI Design*
* ตัวอย่างไฟล์แนบ -
## UI mockup Design

**แบบ 1 slot (ใช้งานหลัก):**

*Dropdown แสดง:* ```
[วันที่: 2026-05-22] → [กะ: Shift-1 (08:00) ▼] [+]
```

**แบบหลาย slot:**
```
[วันที่: 2026-05-22] → [กะ: Shift-1 (08:00) ▼] [+] [-]
[วันที่: 2026-05-22] → [กะ: Shift-2 (16:55) ▼] [+] [-]
[วันที่: 2026-05-23] → [กะ: Shift-1 (08:00) ▼] [+] [-]
```

**Option A (job run ทุกวัน):**
```
[วันที่เริ่ม: 2026-05-22] ~ [วันที่สิ้นสุด: 2026-05-26] → [กะ: Shift-1 ▼]
→ สร้าง plan 5 วันอัตโนมัติ (5 records)
```

**Dropdown แสดง:**
`shift_name (start_ts)` เรียงตาม `seq`

*การเก็บข้อมูล*
*
## การเก็บข้อมูล

เพิ่ม field ใน `ms_job_plan`:


| *Field* Field | *Type* Type | *Description* Description |
|-------|------|-------------|
| `ms_shift_id` | UUID (FK → ms_shift) | กะที่เลือก (nullable สำหรับ legacy) |
| `plan_date` | DATE | วันที่ของ plan (nullable สำหรับ legacy) |

* คำนวณ start_ts / end_ts จาก shift + date:
- `start_ts` = plan_date + shift.start_ts
- `end_ts` = plan_date + derived_end_ts (ถ้า end <= start → ข้ามวัน: plan_date+1 + derived_end_ts)

* ตัวอย่างกะข้ามวัน: Shift-3 start=23:00, derived_end=08:00
- start_ts = 2026-05-22 23:00:00
- end_ts = 2026-05-23 08:00:00

*เมื่อ ## เมื่อ Master Shift แก้เวลา (start_ts)*
*
(start_ts)

กระทบ 2 กะ: กะที่แก้ (start เปลี่ยน) + กะก่อนหน้า (end เปลี่ยนตาม)


**Flow:**
# 1. User แก้เวลา shift → กด Save
# 2. Backend ตรวจสอบว่ามี `ms_job_plan` ที่อ้างอิงกะนี้ (หรือกะก่อนหน้า) ที่ `plan_date >= วันนี้` กี่รายการ
# 3. ถ้ามี → ส่งจำนวนกลับไป frontend แสดง popup confirm:

>
"การแก้ไขเวลากะจะอัปเดต Job Plan ในอนาคต X รายการ (plan_date ≥ วันนี้) Plan ที่ผ่านไปแล้วจะไม่ถูกแก้ไข ยืนยันหรือไม่?"
# 4. User กด confirm → backend save shift + recalculate job plan อนาคต + บันทึก setting edit log (record log job edit)
# 5. User กด cancel → ไม่ save

*กรณีลบกะที่มี ## กรณีลบกะที่มี job อ้างอิง*
*
อ้างอิง

-
ห้ามลบกะที่มี `ms_job_plan` อ้างอิงอยู่ (plan_date >= วันนี้)
* - แสดง error: "ไม่สามารถลบกะนี้ได้ มี Job Plan อ้างอิงอยู่ X รายการ"

*Validation*
*
## Validation

-
ห้ามเลือกวันที่ + กะ ซ้ำกัน (duplicate plan)
* - ตรวจ overlap กับ job อื่นที่ assign เครื่องเดียวกัน (ใช้ logic เดิม `check-job-overlap`)

*Import/Export CSV*
*
## Import/Export CSV

-
ใช้ format เดิม (`start_ts_end_ts`) ไม่เปลี่ยน
* - Backend คำนวณ start_ts/end_ts จาก shift + date → export ออกมาเป็นเวลาเหมือนเดิม

*Migration: ## Migration: Job Plan เดิม*
*
เดิม

-
`ms_shift_id` = NULL, `plan_date` = NULL
* - ยังทำงานได้ปกติ (code ใช้ start_ts/end_ts โดยตรง)
* - ไม่ต้อง migrate ย้อนหลัง

*แสดง ## แสดง Job เดิมเมื่อเปิด Edit*
*
Edit

เมื่อเปิด edit job เดิม (ms_shift_id = NULL):
- พยายาม match start_ts กับ shift ที่ตรงเวลา (เทียบ time part ของ start_ts กับ ms_shift.start_ts)
- ถ้า match ได้ → แสดงเป็น DatePicker + Shift dropdown (UI ใหม่)
- ถ้า match ไม่ได้ → fallback แสดงเป็น RangePicker เหมือนเดิม (legacy mode)

h3. ## สิ่งที่ต้องทำ

*

-
[ ] DB: เพิ่ม field `ms_shift_id`, `plan_date` ใน `ms_job_plan` (nullable)
* - [ ] Frontend: เปลี่ยน RangePicker เป็น DatePicker + Shift dropdown (Form.List รองรับหลาย slot)
* - [ ] Frontend: เพิ่ม Option A (date range + shift → สร้าง plan ทุกวัน)
* - [ ] Frontend: เปิด edit job เดิม → match shift + fallback RangePicker
* - [ ] Backend: คำนวณ start_ts/end_ts จาก shift + date เมื่อ save
* - [ ] Backend: เมื่อแก้ ms_shift.start_ts → popup confirm + recalculate ms_job_plan (เฉพาะอนาคต) + บันทึก setting edit log
* - [ ] Backend: ห้ามลบ ms_shift ที่มี job plan อ้างอิง (อนาคต)
* - [ ] Validation: ห้าม duplicate + check overlap (logic เดิม)

*ไฟล์ที่เกี่ยวข้อง* ## ไฟล์ที่เกี่ยวข้อง
* - Frontend Job: `oee-web/src/routes/JobSetting/JobSettingModal.js` (planning section)
* - Backend save: `oee-api/routes/job-v1/put-plan.js`
* - Shift utils: `oee-api/lib/shift-utils.js` (deriveShiftEnds, buildShiftWindows)
* - Check overlap: `oee-api/routes/job-v1/check-job-overlap.js`

ดู UI Mockup แนบประกอบ

Back