From e56277542f60f386a109b1b072a1dbda390588fd Mon Sep 17 00:00:00 2001
From: chen.lin <1442464845@qq.com>
Date: 星期三, 11 二月 2026 15:54:29 +0800
Subject: [PATCH] EXISTS 保持一致
---
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx | 176 ++++++++++++++++++++++++++++++++++++++++++++++++++--------
1 files changed, 150 insertions(+), 26 deletions(-)
diff --git a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
index ce732be..2046043 100644
--- a/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
+++ b/rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -37,6 +37,7 @@
Form,
useRefresh,
useRedirect,
+ useRecordSelection,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE, DEFAULT_TYPE } from '@/config/setting';
import { styled } from '@mui/material/styles';
@@ -67,11 +68,12 @@
}));
const OutStockPublic = (props) => {
- const { record, open, setOpen } = props;
+ const { record, open, setOpen, setManualDialog } = props;
const notify = useNotify();
const gridRef = useGridApiRef();
const [rows, setRows] = useState([]);
const [fetchRows, setFetchRows] = useState([]);
+ const [isLoading, setIsLoading] = useState(false);
const translate = useTranslate();
const [rowSelectedIds, setRowSelectedIds] = useState([]);
const [selectedMatnr, setSelectedMatnr] = useState([]);
@@ -81,29 +83,94 @@
const [selectedValue, setSelectedValue] = useState({});
useEffect(() => {
+ console.log('useEffect triggered - selectedMatnr:', selectedMatnr, 'fetchRows length:', fetchRows.length);
if (selectedMatnr.length < 1) {
+ console.log('娌℃湁閫変腑鐗╂枡锛屾樉绀烘墍鏈夋暟鎹�');
setRows(fetchRows)
} else {
- const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode));
+ console.log('杩囨护鏁版嵁锛岄�変腑鐨勭墿鏂欑紪鐮�:', selectedMatnr);
+ const mas = fetchRows.filter(item => {
+ const matnrCode = item.matnrCode || item.locItem?.matnrCode;
+ const included = selectedMatnr.includes(matnrCode);
+ console.log('鐗╂枡缂栫爜:', matnrCode, '鏄惁鍖呭惈:', included);
+ return included;
+ });
+ console.log('杩囨护鍚庣殑鏁版嵁:', mas);
setRows(mas)
}
- }, [selectedMatnr])
+ }, [selectedMatnr, fetchRows])
const ComfirmButton = () => {
const { selectedIds, data } = useListContext();
- const handleRowClick = () => {
+ const handleRowClick = async () => {
+ console.log('selectedIds:', selectedIds);
+ console.log('data:', data);
+ console.log('fetchRows:', fetchRows);
+ console.log('isLoading:', isLoading);
+
+ if (!selectedIds || selectedIds.length === 0) {
+ notify('璇峰厛閫夋嫨鐗╂枡');
+ return;
+ }
+
+ if (!data || data.length === 0) {
+ notify('鏁版嵁鍔犺浇涓紝璇风◢鍊�');
+ return;
+ }
+
const ids = data.filter(item => selectedIds.includes(item.id)).map(item => item.id);
setRowSelectedIds(ids);
const mas = data.filter(item => selectedIds.includes(item.id)).map(item => item.matnrCode);
+ console.log('selectedMatnr:', mas);
+
+ // 妫�鏌ラ�変腑鐨勭墿鏂欐槸鍚﹀凡鍏ㄩ儴鍑哄簱
+ const selectedItems = data.filter(item => selectedIds.includes(item.id));
+ const allCompleted = selectedItems.every(item => {
+ const remaining = (item.anfme || 0) - (item.workQty || 0);
+ return remaining <= 0;
+ });
+
+ if (allCompleted) {
+ notify('閫変腑鐨勭墿鏂欏凡鍏ㄩ儴鍑哄簱锛堝凡鍑烘暟閲� >= 璁″垝鍑哄簱鏁帮級锛屾病鏈夊彲鍑哄簱鐨勫簱瀛樻暟鎹�');
+ setSelectedMatnr(mas);
+ setRows([]);
+ return;
+ }
+
//璁剧疆搴撲綅淇℃伅绛涢�夋潯浠�
setSelectedMatnr(mas);
+
+ // 濡傛灉 fetchRows 杩樻病鏈夋暟鎹紝閲嶆柊鍔犺浇
+ if (!fetchRows || fetchRows.length === 0) {
+ console.log('fetchRows涓虹┖锛岄噸鏂板姞杞芥暟鎹�');
+ notify('姝e湪鍔犺浇搴撳瓨鏁版嵁...');
+ // 閲嶆柊鍔犺浇鏁版嵁锛実etWaveRule 浼氬湪鍔犺浇瀹屾垚鍚庤嚜鍔ㄥ鐞� selectedMatnr
+ await getWaveRule(formData);
+ } else {
+ // 濡傛灉 fetchRows 鏈夋暟鎹紝绔嬪嵆杩囨护鏄剧ず
+ const filteredRows = fetchRows.filter(item => {
+ const matnrCode = item.matnrCode || item.locItem?.matnrCode;
+ return mas.includes(matnrCode);
+ });
+ console.log('filteredRows:', filteredRows);
+ setRows(filteredRows);
+
+ // 濡傛灉杩囨护鍚庢病鏈夋暟鎹紝鎻愮ず鐢ㄦ埛
+ if (filteredRows.length === 0) {
+ notify('閫変腑鐨勭墿鏂欐病鏈夊彲鍑哄簱鐨勫簱瀛樻暟鎹紝鍙兘宸插叏閮ㄥ嚭搴撴垨搴撳瓨涓嶈冻');
+ }
+ }
}
return (
- <Button label="toolbar.confirm" size="medium" onClick={handleRowClick} />
+ <Button
+ label="toolbar.confirm"
+ size="medium"
+ onClick={handleRowClick}
+ disabled={isLoading}
+ />
)
-
};
const handleClickOpen = () => {
@@ -133,29 +200,83 @@
};
useEffect(() => {
- if (open) {
- getWaveRule()
+ if (open && record?.id) {
+ // 閲嶇疆鐘舵�侊紝纭繚鏁版嵁鑳芥纭樉绀�
+ setSelectedMatnr([]);
+ setRows([]);
+ setFetchRows([]);
+ setIsLoading(false);
+ // 纭繚 formData 姝g‘鍒濆鍖�
+ const initialFormData = { orderId: record.id, waveId: DEFAULT_TYPE };
+ setFormData(initialFormData);
+ getWaveRule(initialFormData)
}
- }, [open, formData])
+ }, [open, record?.id])
- const getWaveRule = async () => {
- if (formData.waveId == null && formData.waveId == undefined) {
+ const getWaveRule = async (data = formData) => {
+ if (data.waveId == null || data.waveId == undefined) {
return
}
- const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData });
- if (code === 200) {
- setRows(data)
- setFetchRows(data)
- } else {
- notify(msg);
+ if (!data.orderId) {
+ return
+ }
+ setIsLoading(true);
+ try {
+ const { data: { code, data: responseData, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...data });
+ if (code === 200) {
+ console.log('API杩斿洖鐨勬暟鎹�:', responseData);
+ // 澶勭悊杩斿洖鐨勬暟鎹紝纭繚鏁版嵁缁撴瀯姝g‘
+ const processedData = (responseData || []).map((item, index) => {
+ // 濡傛灉鏁版嵁鏈� locItem 宓屽缁撴瀯锛岄渶瑕佸睍寮�
+ if (item.locItem) {
+ return {
+ ...item.locItem,
+ id: item.locItem.id || `temp_${index}`,
+ siteNo: item.siteNo,
+ staNos: item.staNos || [],
+ sourceId: item.sourceId,
+ source: item.source
+ };
+ }
+ // 濡傛灉鏁版嵁宸茬粡鏄墎骞崇粨鏋勶紝鐩存帴杩斿洖
+ return {
+ ...item,
+ id: item.id || `temp_${index}`
+ };
+ });
+ console.log('澶勭悊鍚庣殑鏁版嵁:', processedData);
+ setFetchRows(processedData);
+
+ // 濡傛灉杩斿洖鐨勬暟鎹负绌猴紝涓旂敤鎴峰凡閫変腑鐗╂枡锛屾彁绀哄師鍥�
+ if (processedData.length === 0 && selectedMatnr.length > 0) {
+ notify('閫変腑鐨勭墿鏂欏凡鍏ㄩ儴鍑哄簱锛屾病鏈夊彲鍑哄簱鐨勫簱瀛樻暟鎹�');
+ } else if (processedData.length === 0) {
+ notify('褰撳墠鍑哄簱鍗曟病鏈夊彲鍑哄簱鐨勫簱瀛樻暟鎹紝鍙兘鎵�鏈夌墿鏂欏凡鍏ㄩ儴鍑哄簱');
+ }
+ // useEffect 浼氳嚜鍔ㄦ牴鎹� selectedMatnr 鍜� fetchRows 鏉ヨ繃婊ゆ暟鎹�
+ } else {
+ notify(msg);
+ }
+ } catch (error) {
+ console.error('鑾峰彇搴撳瓨鏁版嵁澶辫触:', error);
+ notify('鑾峰彇搴撳瓨鏁版嵁澶辫触锛岃閲嶈瘯');
+ } finally {
+ setIsLoading(false);
}
}
const handleChange = (value, name) => {
- setFormData((prevData) => ({
- ...prevData,
- [name]: value
- }));
+ setFormData((prevData) => {
+ const newData = {
+ ...prevData,
+ [name]: value
+ };
+ // 褰撶瓥鐣ユ敼鍙樻椂锛岄噸鏂拌幏鍙栨暟鎹�
+ if (name === 'waveId' && value && prevData.orderId) {
+ getWaveRule(newData);
+ }
+ return newData;
+ });
};
@@ -191,7 +312,7 @@
}}
title={"menu.outStockItem"}
empty={false}
- filter={{ asnId: record?.id, deleted: 0 }}
+ filter={{ orderId: record?.id, deleted: 0 }}
sort={{ field: "create_time", order: "desc" }}
actions={false}
pagination={false}
@@ -209,7 +330,7 @@
omit={['id', 'splrName', 'qty', 'poCode',]}
>
<NumberField source="id" />
- <TextField source="asnCode" label="table.field.outStockItem.asnCode" />
+ <TextField source="asnCode" label="table.field.outStockItem.orderCode" />
<TextField source="poCode" label="table.field.outStockItem.poCode" />
<TextField source="matnrCode" label="table.field.outStockItem.matnrCode" />
<TextField source="maktx" label="table.field.outStockItem.maktx" />
@@ -302,7 +423,7 @@
getActions: (params) => [
<GridActionsCellItem
icon={<Delete />}
- label="Delete"
+ label={translate('ra.action.delete')}
onClick={() => handleDelete(params.row, rows, setRows)}
/>,
]
@@ -323,15 +444,18 @@
const OutStockAnfme = React.memo(function OutStockAnfme(props) {
const { value } = props;
+ const num = Number(value);
+ const hasStock = typeof num === 'number' && !Number.isNaN(num) && num > 1e-6;
return (
- value > 0 ?
+ hasStock ? (
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<span>{value}</span>
</Box>
- :
+ ) : (
<Box sx={{ display: 'flex', alignItems: 'center', justifyContent: 'space-between' }}>
<span style={{ color: 'red' }}>{translate('common.edit.title.insuffInventory')}</span>
</Box>
+ )
);
});
--
Gitblit v1.9.1