From 0345d3175861c5612e937487770a5ba4e8468b14 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期六, 10 五月 2025 09:49:52 +0800
Subject: [PATCH] 收货单打印功能优化

---
 rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx                                           |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java |   32 ++++----
 rsf-admin/package.json                                                                        |    2 
 rsf-admin/package-lock.json                                                                   |   14 ++-
 rsf-admin/src/page/orders/asnOrder/OrderPrintPreview.jsx                                      |  189 ++++++++++++++++++++++++++--------------------
 5 files changed, 134 insertions(+), 104 deletions(-)

diff --git a/rsf-admin/package-lock.json b/rsf-admin/package-lock.json
index 4988039..2ccac71 100644
--- a/rsf-admin/package-lock.json
+++ b/rsf-admin/package-lock.json
@@ -38,7 +38,7 @@
         "react-router": "^6.22.0",
         "react-router-dom": "^6.26.1",
         "react-syntax-highlighter": "^15.5.0",
-        "react-to-print": "^3.0.5",
+        "react-to-print": "^2.14.11",
         "svgpath": "^2.6.0",
         "three": "^0.155.0",
         "tweedle.js": "^2.1.0"
@@ -6625,12 +6625,16 @@
       }
     },
     "node_modules/react-to-print": {
-      "version": "3.1.0",
-      "resolved": "https://registry.npmmirror.com/react-to-print/-/react-to-print-3.1.0.tgz",
-      "integrity": "sha512-hiJZVmJtaRm9EHoUTG2bordyeRxVSGy9oFVV7fSvzOWwctPp6jbz2R6NFkaokaTYBxC7wTM/fMV5eCXsNpEwsA==",
+      "version": "2.14.11",
+      "resolved": "https://registry.npmmirror.com/react-to-print/-/react-to-print-2.14.11.tgz",
+      "integrity": "sha512-sePHBaCtZLp8/g4d/gRyI9XQZkveZq6xoukanAHfkzlXOa7sTuXCEQOYq37lIa5MkUoxySdJxYuyClaXPa9Zpg==",
       "license": "MIT",
+      "dependencies": {
+        "prop-types": "^15.8.1"
+      },
       "peerDependencies": {
-        "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ~19"
+        "react": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0",
+        "react-dom": "^15.0.0 || ^16.0.0 || ^17.0.0 || ^18.0.0"
       }
     },
     "node_modules/react-transition-group": {
diff --git a/rsf-admin/package.json b/rsf-admin/package.json
index f62c51a..4e1d8b2 100644
--- a/rsf-admin/package.json
+++ b/rsf-admin/package.json
@@ -42,7 +42,7 @@
     "react-router": "^6.22.0",
     "react-router-dom": "^6.26.1",
     "react-syntax-highlighter": "^15.5.0",
-    "react-to-print": "^3.0.5",
+    "react-to-print": "^2.14.11",
     "svgpath": "^2.6.0",
     "three": "^0.155.0",
     "tweedle.js": "^2.1.0"
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
index 0125c45..063790b 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -116,6 +116,7 @@
   const [modalType, setmodalType] = useState(0);
   const [printOrder, setPrintOrder] = useState(false);
   const [select, setSelect] = useState({});
+  const invoiceRef = useRef();
   const billReload = useRef();
   const notify = useNotify();
   const refresh = useRefresh();
diff --git a/rsf-admin/src/page/orders/asnOrder/OrderPrintPreview.jsx b/rsf-admin/src/page/orders/asnOrder/OrderPrintPreview.jsx
index 8f6db2f..872afee 100644
--- a/rsf-admin/src/page/orders/asnOrder/OrderPrintPreview.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/OrderPrintPreview.jsx
@@ -36,6 +36,7 @@
 import { styled } from '@mui/material/styles';
 import { QRCodeSVG, QRCodeCanvas } from 'qrcode.react';  // 鐜板湪蹇呴』杩欐牱鐢�
 import PrintOutlinedIcon from '@mui/icons-material/PrintOutlined';
+import { useReactToPrint } from "react-to-print";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -60,8 +61,8 @@
 const OrderPrintPreview = (props) => {
     const { open, setOpen, record } = props;
     const notify = useNotify();
+    const invoiceRef = useRef();
     const translate = useTranslate();
-    const [drawerVal, setDrawerVal] = useState(false);
     const [disabled, setDisabled] = useState(false)
     const dicts = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_order_type')) || [];
     const business = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_business_type')) || [];
@@ -70,88 +71,112 @@
         setOpen(false);
     };
 
+    const printOrders = useReactToPrint({
+        content: () => {
+            return invoiceRef.current
+        },
+        documentTitle: `璁㈠崟`,
+        pageStyle: `
+        @page {
+            size: A4;
+            margin: 10mm;
+        }
+        @media print {
+            body {
+            -webkit-print-color-adjust: exact;
+            }
+        }`,
+        onAfterPrint: () => alert('宸插彂閫佽嚦鎵撳嵃鏈�!')
+    })
+
+
     return (
-        <>
-            <Dialog
-                open={open}
-                onClose={handleClose}
-                aria-labelledby="form-dialog-title"
-                aria-hidden
-                fullWidth
-                disableRestoreFocus
-                maxWidth="xl"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
-            >
-                <DialogTitle id="form-dialog-title" sx={{
-                    position: 'sticky',
-                    top: 0,
-                    textAlign: 'center',
-                    backgroundColor: 'background.paper',
-                    zIndex: 1000
-                }}>
-                    {translate('menu.asnOrder')}
-                    <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
-                        <DialogCloseButton onClose={handleClose} />
-                    </Box>
-                </DialogTitle>
-                <DialogContent sx={{ mt: 2 }}>
-                    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }}>
-                        <Form defaultValues={record}>
-                            <Grid container spacing={2} sx={{ justifyContent: 'space-between', }}>
-                                <Grid item md={2}>
-                                    <Box sx={{ display: 'flex', justifyContent: 'center' }}>
-                                        <Typography>鍗曟嵁绫诲瀷锛�</Typography>
-                                        <Typography>{record?.type$}</Typography>
-                                    </Box>
-                                    <Box sx={{ display: 'flex', justifyContent: 'center', padding: 1 }}></Box>
-                                    <Box sx={{ display: 'flex', justifyContent: 'center' }}>
-                                        <Typography>涓氬姟绫诲瀷锛�</Typography>
-                                        <Typography>{record?.wkType$}</Typography>
-                                    </Box>
-                                </Grid>
-                                <Grid item md={2}>
-                                    <QRCodeSVG value={record?.code} />
-                                    <Typography>{record.code}</Typography>
-                                </Grid>
-                                {/* <Grid item md={2}>
-                                    <TextInput source="code" label={"table.field.asnOrder.code"} />
-                                </Grid> */}
-                            </Grid>
-                        </Form>
-                        <List
-                            resource="asnOrderItem"
-                            sx={{
-                                flexGrow: 1,
-                                transition: (theme) =>
-                                    theme.transitions.create(['all'], {
-                                        duration: theme.transitions.duration.enteringScreen,
-                                    }),
-                                marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
-                            }}
-                            title={"menu.asnOrderItem"}
-                            empty={false}
-                            filter={{ asnId: record?.id }}
-                            sort={{ field: "create_time", order: "desc" }}
-                            actions={(
-                                <></>
-                            )}
-                            perPage={DEFAULT_ITEM_PAGE_SIZE}
-                        >
-                            <DynamicFields />
-                        </List>
-                    </Box>
-                </DialogContent>
-                <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
-                    <Toolbar sx={{ width: '100%', justifyContent: 'end' }}  >
-                        <Button disabled={disabled} variant="contained" startIcon={<PrintOutlinedIcon />} label={'toolbar.print'}>
-                        </Button>
-                    </Toolbar>
-                </DialogActions>
-            </Dialog>
-        </>
+        <Dialog
+            className="orderPrintPerview"
+            // ref={invoiceRef}
+            open={open}
+            onClose={handleClose}
+            aria-labelledby="form-dialog-title"
+            aria-hidden
+            fullWidth
+            disableRestoreFocus
+            maxWidth="xl"   // 'xs' | 'sm' | 'md' | 'lg' | 'xl'
+        >
+            <DialogTitle id="form-dialog-title" sx={{
+                position: 'sticky',
+                top: 0,
+                textAlign: 'center',
+                backgroundColor: 'background.paper',
+                zIndex: 1000
+            }}>
+                {translate('menu.asnOrder')}
+                <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
+                    <DialogCloseButton onClose={handleClose} />
+                </Box>
+            </DialogTitle>
+            <DialogContent sx={{ mt: 2 }}>
+                <OrderPreview ref={invoiceRef} record={record} />
+            </DialogContent>
+            <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                <Toolbar sx={{ width: '100%', justifyContent: 'end' }}  >
+                    <Button disabled={disabled} variant="contained" startIcon={<PrintOutlinedIcon />} label={'toolbar.print'} onClick={printOrders}></Button>
+                </Toolbar>
+            </DialogActions>
+        </Dialog>
     )
 }
 
 export default OrderPrintPreview;
+
+
+
+const OrderPreview = React.forwardRef(({ record }, ref) => (
+    <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3 }} ref={ref}>
+        <Form defaultValues={record}>
+            <Grid container spacing={2} sx={{ justifyContent: 'space-between', }}>
+                <Grid item md={2}>
+                    <Box sx={{ display: 'flex', justifyContent: 'start' }}>
+                        <Typography>ASN鍗曪細</Typography>
+                        <Typography>{record?.code}</Typography>
+                    </Box>
+                    <Box sx={{ display: 'flex', justifyContent: 'start' }}>
+                        <Typography>PO鍗曪細</Typography>
+                        <Typography>{record?.poCode}</Typography>
+                    </Box>
+                    <Box sx={{ display: 'flex', justifyContent: 'start' }}>
+                        <Typography>鍗曟嵁绫诲瀷锛�</Typography>
+                        <Typography>{record?.type$}</Typography>
+                    </Box>
+                    <Box sx={{ display: 'flex', justifyContent: 'center', padding: 1 }}></Box>
+                    <Box sx={{ display: 'flex', justifyContent: 'start' }}>
+                        <Typography>涓氬姟绫诲瀷锛�</Typography>
+                        <Typography>{record?.wkType$}</Typography>
+                    </Box>
+                    <Box sx={{ display: 'flex', justifyContent: 'center', padding: 1 }}></Box>
+                </Grid>
+                <Grid item md={2}>
+                    <QRCodeSVG value={record?.code} />
+                    <Typography>{record.code}</Typography>
+                </Grid>
+            </Grid>
+        </Form>
+        <List
+            resource="asnOrderItem"
+            title={"menu.asnOrderItem"}
+            empty={false}
+            filter={{ asnId: record?.id }}
+            sort={{ field: "create_time", order: "desc" }}
+            actions={(
+                <></>
+            )}
+            perPage={DEFAULT_ITEM_PAGE_SIZE}
+        >
+            <DynamicFields />
+        </List>
+    </Box>
+));
+
+
 
 const DynamicFields = (props) => {
     const translate = useTranslate();
@@ -167,7 +192,6 @@
         const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
         if (code == 200) {
             const arr = [
-                <NumberField source="id" />,
                 <NumberField source="asnId" label="table.field.asnOrderItem.asnId" />,
                 <TextField source="asnCode" label="table.field.asnOrderItem.asnCode" />,
                 <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
@@ -179,9 +203,10 @@
                 <TextField source="splrBatch" label="table.field.asnOrderItem.splrBatch" />,
                 <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />,
                 <NumberField source="qty" label="table.field.asnOrderItem.qty" />,
-                <TextField source="splrName" label="table.field.asnOrderItem.splrName" />,
+                <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />,
+                // <TextField source="splrName" label="table.field.asnOrderItem.splrName" />,
                 <TextField source="isptResult$" label="table.field.asnOrderItem.isptResult" />,
-                <TextField source="trackCode" label="table.field.asnOrderItem.barcode" />,
+                // <TextField source="trackCode" label="table.field.asnOrderItem.barcode" />,
                 <TextField source="packName" label="table.field.asnOrderItem.packName" />,
             ]
             const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
@@ -214,7 +239,7 @@
                     preferenceKey='asnOrderItem'
                     bulkActionButtons={false}
                     rowClick={(id, resource, record) => false}
-                    omit={['id', 'asnId', 'poDetlId', 'poDetlCode', 'matnrId', 'purQty', 'purUnit', 'qrcode', 'trackCode']}
+                    omit={['id', 'asnId', 'poDetlId', 'platItemId','poDetlCode', 'matnrId', 'purQty','splrName', 'purUnit', 'qrcode', 'packName' ,'trackCode']}
                 >
                     {columns.map((column) => column)}
                 </StyledDatagrid>}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
index 2335a25..7ab439d 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -121,7 +121,7 @@
         }
         params.setOrders(orders);
 
-        svaeOrUpdateOrderItem(params,loginUserId);
+        svaeOrUpdateOrderItem(params, loginUserId);
 
         return R.ok("淇濆瓨鎴愬姛!!");
     }
@@ -150,20 +150,20 @@
             return R.ok("鏄庣粏鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
 
-        svaeOrUpdateOrderItem(params,loginUserId);
+        svaeOrUpdateOrderItem(params, loginUserId);
 
         return R.ok("淇敼瀹屾垚锛侊紒");
     }
 
     /**
-     * @author Ryan
-     * @description 鏇存柊鎴栦繚瀛樻槑缁�
      * @param
      * @return
+     * @author Ryan
+     * @description 鏇存柊鎴栦繚瀛樻槑缁�
      * @time 2025/4/7 13:28
      */
     @Transactional(rollbackFor = Exception.class)
-    public void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception{
+    public void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception {
         AsnOrder orders = params.getOrders();
         params.getItems().forEach(item -> {
             item.put("asnId", orders.getId());
@@ -185,10 +185,10 @@
     }
 
     /**
-     * @author Ryan
-     * @description 鎵归噺淇敼
      * @param
      * @return
+     * @author Ryan
+     * @description 鎵归噺淇敼
      * @time 2025/4/1 07:58
      */
     @Override
@@ -199,11 +199,11 @@
         }
         return this.update(new LambdaUpdateWrapper<AsnOrder>()
                 .in(AsnOrder::getId, params.getIds())
-                       .set(!Objects.isNull(order.getRleStatus()), AsnOrder::getRleStatus, order.getRleStatus())
-                        .set(!Objects.isNull(order.getNtyStatus()), AsnOrder::getNtyStatus, order.getNtyStatus())
-                        .set(!Objects.isNull(order.getStatus()),  AsnOrder::getStatus, order.getStatus())
-                        .set(!Objects.isNull(order.getWkType()), AsnOrder::getWkType, order.getWkType())
-                        .set(!Objects.isNull(order.getExceStatus()), AsnOrder::getExceStatus, order.getExceStatus())
+                .set(!Objects.isNull(order.getRleStatus()), AsnOrder::getRleStatus, order.getRleStatus())
+                .set(!Objects.isNull(order.getNtyStatus()), AsnOrder::getNtyStatus, order.getNtyStatus())
+                .set(!Objects.isNull(order.getStatus()), AsnOrder::getStatus, order.getStatus())
+                .set(!Objects.isNull(order.getWkType()), AsnOrder::getWkType, order.getWkType())
+                .set(!Objects.isNull(order.getExceStatus()), AsnOrder::getExceStatus, order.getExceStatus())
                 .set(AsnOrder::getUpdateBy, userId));
     }
 
@@ -217,7 +217,7 @@
      */
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public  R completeOrder(Long id, Long loginUserId) {
+    public R completeOrder(Long id, Long loginUserId) {
         AsnOrder asnOrder = this.getById(id);
         if (Objects.isNull(asnOrder)) {
             throw new CoolException("鍗曟嵁涓嶅瓨鍦�!!");
@@ -247,14 +247,14 @@
     }
 
     /**
-     * @author Ryan
-     * @description 鍒犻櫎鍘熶富鍗曞強鏄庣粏锛屽姞鍏ュ巻鍙叉。
      * @param
      * @return
+     * @author Ryan
+     * @description 鍒犻櫎鍘熶富鍗曞強鏄庣粏锛屽姞鍏ュ巻鍙叉。
      * @time 2025/3/19 19:53
      */
     @Transactional(rollbackFor = Exception.class)
-    public synchronized void operateOrderLogs(AsnOrder asrder) throws Exception{
+    public synchronized void operateOrderLogs(AsnOrder asrder) throws Exception {
         if (Objects.isNull(asrder) || Objects.isNull(asrder.getId())) {
             throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }

--
Gitblit v1.9.1