| @@ -1661,6 +1661,7 @@ export interface DrinkProductionQtyResponse { | |||||
| jobOrders?: DrinkProductionQtyJobOrderDetail[]; | jobOrders?: DrinkProductionQtyJobOrderDetail[]; | ||||
| } | } | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 26 | v1.0.0 | 2026-07-20 */ | |||||
| export const fetchDrinkProductionQty = cache(async (date?: string) => { | export const fetchDrinkProductionQty = cache(async (date?: string) => { | ||||
| const params = new URLSearchParams(); | const params = new URLSearchParams(); | ||||
| if (date) params.set("date", date); | if (date) params.set("date", date); | ||||
| @@ -25,7 +25,7 @@ type Props = { | |||||
| onClear: () => void; | onClear: () => void; | ||||
| }; | }; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.0 | 2026-07-17 */ | |||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.1 | 2026-07-20 */ | |||||
| const ItemTracingFlowGraphSearch: React.FC<Props> = ({ | const ItemTracingFlowGraphSearch: React.FC<Props> = ({ | ||||
| query, | query, | ||||
| matchCount, | matchCount, | ||||
| @@ -30,7 +30,7 @@ type Props = { | |||||
| onClose?: () => void; | onClose?: () => void; | ||||
| }; | }; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.0 | 2026-07-17 */ | |||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.1 | 2026-07-20 */ | |||||
| const ItemTracingNodeDetailPanel: React.FC<Props> = ({ node, onClose }) => { | const ItemTracingNodeDetailPanel: React.FC<Props> = ({ node, onClose }) => { | ||||
| const { t } = useTranslation("itemTracing"); | const { t } = useTranslation("itemTracing"); | ||||
| @@ -46,7 +46,7 @@ type Props = { | |||||
| onTrace?: (params: TraceParams) => void; | onTrace?: (params: TraceParams) => void; | ||||
| }; | }; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 17 | v1.0.0 | 2026-07-17 */ | |||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 17 | v1.0.1 | 2026-07-20 */ | |||||
| const ItemTracingSections: React.FC<Props> = ({ data, compiledGraph, onTrace }) => { | const ItemTracingSections: React.FC<Props> = ({ data, compiledGraph, onTrace }) => { | ||||
| const { t } = useTranslation("itemTracing"); | const { t } = useTranslation("itemTracing"); | ||||
| const [tab, setTab] = useState(0); | const [tab, setTab] = useState(0); | ||||
| @@ -73,6 +73,7 @@ const GroupCollapseButton = ({ | |||||
| </IconButton> | </IconButton> | ||||
| ); | ); | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 23 | v1.0.0 | 2026-07-20 */ | |||||
| export const TraceFlowEventNode = memo(function TraceFlowEventNode({ | export const TraceFlowEventNode = memo(function TraceFlowEventNode({ | ||||
| id, | id, | ||||
| data, | data, | ||||
| @@ -564,6 +564,7 @@ const buildInboundOriginNodes = ( | |||||
| return { nodes, nextSeq: seq }; | return { nodes, nextSeq: seq }; | ||||
| }; | }; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 23 | v1.0.0 | 2026-07-20 */ | |||||
| export const buildTraceGraphNodes = ( | export const buildTraceGraphNodes = ( | ||||
| data: ItemLotTraceResponse, | data: ItemLotTraceResponse, | ||||
| labels: TraceGraphDetailLabels, | labels: TraceGraphDetailLabels, | ||||
| @@ -889,7 +889,7 @@ export const buildItemLotTraceSheets = ( | |||||
| export const ITEM_LOT_TRACE_SHEET_NAMES = Object.values(SHEET); | export const ITEM_LOT_TRACE_SHEET_NAMES = Object.values(SHEET); | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.0 | 2026-07-17 */ | |||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 15 | v1.0.1 | 2026-07-20 */ | |||||
| export const exportItemLotTraceXlsx = ( | export const exportItemLotTraceXlsx = ( | ||||
| data: ItemLotTraceResponse, | data: ItemLotTraceResponse, | ||||
| compiledGraph: CompiledTraceGraph, | compiledGraph: CompiledTraceGraph, | ||||
| @@ -178,6 +178,7 @@ export const resolveDoOutboundChipFlags = ( | |||||
| }); | }); | ||||
| /** | /** | ||||
| * FP-MTMS Version Checklist | Functions Ref. No. 23 | v1.0.0 | 2026-07-20 | |||||
| * Outbound qty color (DO_OUT / JO_OUT / MATERIAL_PICK): | * Outbound qty color (DO_OUT / JO_OUT / MATERIAL_PICK): | ||||
| * 改數 → orange; else qty > 0 → green; qty ≤ 0 → red. | * 改數 → orange; else qty > 0 → green; qty ≤ 0 → red. | ||||
| */ | */ | ||||
| @@ -32,6 +32,7 @@ export const resolveStockTakeBookQty = ( | |||||
| }; | }; | ||||
| /** | /** | ||||
| * FP-MTMS Version Checklist | Functions Ref. No. 23 | v1.0.0 | 2026-07-20 | |||||
| * Accepted physical qty used for variance / posting decision. | * Accepted physical qty used for variance / posting decision. | ||||
| * Prefer lastSelect (1=first, 2=second, 3=approver), then fallback chain, then line finalQty. | * Prefer lastSelect (1=first, 2=second, 3=approver), then fallback chain, then line finalQty. | ||||
| * Incomplete rounds (no count yet) must not surface as 0 via COALESCE(finalQty, 0). | * Incomplete rounds (no count yet) must not surface as 0 via COALESCE(finalQty, 0). | ||||
| @@ -47,6 +47,7 @@ const formatProductionDate = (value: string | null | undefined): string => { | |||||
| const getRowKey = (row: DrinkProductionQtyResponse, idx: number): string => | const getRowKey = (row: DrinkProductionQtyResponse, idx: number): string => | ||||
| `${row.itemCode || "unknown"}-${idx}`; | `${row.itemCode || "unknown"}-${idx}`; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 26 | v1.0.0 | 2026-07-20 */ | |||||
| const DrinkProductionQtyDashboard: React.FC = () => { | const DrinkProductionQtyDashboard: React.FC = () => { | ||||
| const { t } = useTranslation(["common", "jo", "productionProcess"]); | const { t } = useTranslation(["common", "jo", "productionProcess"]); | ||||
| const [data, setData] = useState<DrinkProductionQtyResponse[]>([]); | const [data, setData] = useState<DrinkProductionQtyResponse[]>([]); | ||||
| @@ -24,6 +24,7 @@ interface ProductionProcessPageProps { | |||||
| const STORAGE_KEY = 'productionProcess_selectedMatchingStock'; | const STORAGE_KEY = 'productionProcess_selectedMatchingStock'; | ||||
| /** FP-MTMS Version Checklist | Functions Ref. No. 26 | v1.0.0 | 2026-07-20 */ | |||||
| const ProductionProcessPage: React.FC<ProductionProcessPageProps> = ({ printerCombo }) => { | const ProductionProcessPage: React.FC<ProductionProcessPageProps> = ({ printerCombo }) => { | ||||
| const { t } = useTranslation(["common"]); | const { t } = useTranslation(["common"]); | ||||
| const [selectedProcessId, setSelectedProcessId] = useState<number | null>(null); | const [selectedProcessId, setSelectedProcessId] = useState<number | null>(null); | ||||