kelvin.yau 2 months ago
parent
commit
bbb8f5e3c4
8 changed files with 33 additions and 26 deletions
  1. +4
    -1
      src/app/api/jo/actions.ts
  2. +1
    -0
      src/app/api/pickOrder/actions.ts
  3. +6
    -3
      src/components/FinishedGoodSearch/GoodPickExecution.tsx
  4. +5
    -1
      src/components/FinishedGoodSearch/GoodPickExecutiondetail.tsx
  5. +5
    -1
      src/components/Jodetail/JobPickExecution.tsx
  6. +5
    -2
      src/components/Jodetail/JobPickExecutionsecondscan.tsx
  7. +6
    -3
      src/components/Jodetail/JobmatchForm.tsx
  8. +1
    -15
      src/components/PickOrderSearch/PickExecution.tsx

+ 4
- 1
src/app/api/jo/actions.ts View File

@@ -128,11 +128,14 @@ export const recordSecondScanIssue = cache(async (
pickOrderId: number, pickOrderId: number,
itemId: number, itemId: number,
data: { data: {
qty: number;
qty: number; // verified qty (actual pick qty)
missQty?: number; // ✅ 添加:miss qty
badItemQty?: number; // ✅ 添加:bad item qty
isMissing: boolean; isMissing: boolean;
isBad: boolean; isBad: boolean;
reason: string; reason: string;
createdBy: number; createdBy: number;
type?: string; // ✅ type 也应该是可选的
} }
) => { ) => {


+ 1
- 0
src/app/api/pickOrder/actions.ts View File

@@ -183,6 +183,7 @@ export const recordFailLot = async (data: PickAnotherLotFormData) => {
return result; return result;
}; };
export interface PickExecutionIssueData { export interface PickExecutionIssueData {
type: string;
pickOrderId: number; pickOrderId: number;
pickOrderCode: string; pickOrderCode: string;
pickOrderCreateDate: string; pickOrderCreateDate: string;


+ 6
- 3
src/components/FinishedGoodSearch/GoodPickExecution.tsx View File

@@ -833,9 +833,12 @@ const PickExecution: React.FC<Props> = ({ filterArgs, onFgPickOrdersChange }) =>


const handlePickExecutionFormSubmit = useCallback(async (data: any) => { const handlePickExecutionFormSubmit = useCallback(async (data: any) => {
try { try {
console.log("Pick execution form submitted:", data);
const result = await recordPickExecutionIssue(data);
console.log("Pick execution form submitted:", data);
const issueData = {
...data,
type: "Do", // Delivery Order Record 类型
};
const result = await recordPickExecutionIssue(issueData);
console.log("Pick execution issue recorded:", result); console.log("Pick execution issue recorded:", result);
if (result && result.code === "SUCCESS") { if (result && result.code === "SUCCESS") {


+ 5
- 1
src/components/FinishedGoodSearch/GoodPickExecutiondetail.tsx View File

@@ -1151,8 +1151,12 @@ useEffect(() => {
const handlePickExecutionFormSubmit = useCallback(async (data: any) => { const handlePickExecutionFormSubmit = useCallback(async (data: any) => {
try { try {
console.log("Pick execution form submitted:", data); console.log("Pick execution form submitted:", data);
const issueData = {
...data,
type: "Do", // Delivery Order Record 类型
};
const result = await recordPickExecutionIssue(data);
const result = await recordPickExecutionIssue(issueData);
console.log("Pick execution issue recorded:", result); console.log("Pick execution issue recorded:", result);
if (result && result.code === "SUCCESS") { if (result && result.code === "SUCCESS") {


+ 5
- 1
src/components/Jodetail/JobPickExecution.tsx View File

@@ -1353,8 +1353,12 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => {
const handlePickExecutionFormSubmit = useCallback(async (data: any) => { const handlePickExecutionFormSubmit = useCallback(async (data: any) => {
try { try {
console.log("Pick execution form submitted:", data); console.log("Pick execution form submitted:", data);
const issueData = {
...data,
type: "Jo", // Delivery Order Record 类型
};
const result = await recordPickExecutionIssue(data);
const result = await recordPickExecutionIssue(issueData);
console.log("Pick execution issue recorded:", result); console.log("Pick execution issue recorded:", result);
if (result && result.code === "SUCCESS") { if (result && result.code === "SUCCESS") {


+ 5
- 2
src/components/Jodetail/JobPickExecutionsecondscan.tsx View File

@@ -903,11 +903,14 @@ const JobPickExecution: React.FC<Props> = ({ filterArgs }) => {
selectedLotForExecutionForm.pickOrderId, selectedLotForExecutionForm.pickOrderId,
selectedLotForExecutionForm.itemId, selectedLotForExecutionForm.itemId,
{ {
qty: data.actualPickQty,
qty: data.actualPickQty, // verified qty
missQty: data.missQty || 0, // ✅ 添加:实际的 miss qty
badItemQty: data.badItemQty || 0, // ✅ 添加:实际的 bad item qty
isMissing: data.missQty > 0, isMissing: data.missQty > 0,
isBad: data.badItemQty > 0, isBad: data.badItemQty > 0,
reason: data.issueRemark || '', reason: data.issueRemark || '',
createdBy: currentUserId
createdBy: currentUserId,
type: "match"
} }
); );
console.log("Pick execution issue recorded:", result); console.log("Pick execution issue recorded:", result);


+ 6
- 3
src/components/Jodetail/JobmatchForm.tsx View File

@@ -150,15 +150,16 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({
lotNo: selectedLot.lotNo, lotNo: selectedLot.lotNo,
storeLocation: selectedLot.location, storeLocation: selectedLot.location,
requiredQty: selectedLot.requiredQty, requiredQty: selectedLot.requiredQty,
actualPickQty: initialVerifiedQty, // ✅ Use the initial value
actualPickQty: initialVerifiedQty,
missQty: 0, missQty: 0,
badItemQty: 0, badItemQty: 0,
issueRemark: '', issueRemark: '',
// pickerName: '',
handledBy: undefined, handledBy: undefined,
}); });
} }
}, [open, selectedLot, selectedPickOrderLine, pickOrderId, pickOrderCreateDate]);
// ✅ 修复:只在 open 状态改变时重新初始化,移除其他依赖
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [open]);


const handleInputChange = useCallback((field: keyof PickExecutionIssueData, value: any) => { const handleInputChange = useCallback((field: keyof PickExecutionIssueData, value: any) => {
setFormData(prev => ({ ...prev, [field]: value })); setFormData(prev => ({ ...prev, [field]: value }));
@@ -222,6 +223,8 @@ const PickExecutionForm: React.FC<PickExecutionFormProps> = ({
const submissionData = { const submissionData = {
...formData, ...formData,
actualPickQty: verifiedQty, actualPickQty: verifiedQty,
missQty: formData.missQty || 0,
badItemQty: formData.badItemQty || 0,
lotId: formData.lotId || selectedLot?.lotId || 0, lotId: formData.lotId || selectedLot?.lotId || 0,
lotNo: formData.lotNo || selectedLot?.lotNo || '', lotNo: formData.lotNo || selectedLot?.lotNo || '',
pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '', pickOrderCode: formData.pickOrderCode || selectedPickOrderLine?.pickOrderCode || '',


+ 1
- 15
src/components/PickOrderSearch/PickExecution.tsx View File

@@ -67,7 +67,6 @@ import SearchResults, { Column } from "../SearchResults/SearchResults";
import { defaultPagingController } from "../SearchResults/SearchResults"; import { defaultPagingController } from "../SearchResults/SearchResults";
import SearchBox, { Criterion } from "../SearchBox"; import SearchBox, { Criterion } from "../SearchBox";
import dayjs from "dayjs"; import dayjs from "dayjs";
import { dummyQCData } from "../PoDetail/dummyQcTemplate";
import { CreateStockOutLine } from "@/app/api/pickOrder/actions"; import { CreateStockOutLine } from "@/app/api/pickOrder/actions";
import LotTable from './LotTable'; import LotTable from './LotTable';
import PickOrderDetailsTable from './PickOrderDetailsTable'; // ✅ Import the new component import PickOrderDetailsTable from './PickOrderDetailsTable'; // ✅ Import the new component
@@ -515,20 +514,7 @@ const PickExecution: React.FC<Props> = ({ filterArgs }) => {
setSelectedLotForQc(selectedLot); setSelectedLotForQc(selectedLot);
const transformedDummyData = dummyQCData.map(item => ({
id: item.id,
code: item.code,
name: item.name,
itemId: line.itemId,
lowerLimit: undefined,
upperLimit: undefined,
description: item.description,
qcPassed: undefined,
failQty: undefined,
remarks: undefined
}));
setQcItems(transformedDummyData as QcItemWithChecks[]);

let qcResult: any[] = []; let qcResult: any[] = [];
try { try {


Loading…
Cancel
Save