From 85b8e7ba6c4d0d780a7f90360150f2bd955eb874 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期六, 29 三月 2025 08:07:17 +0800
Subject: [PATCH] Merge branch 'devlop' of http://47.97.1.152:5880/r/wms-master into devlop

---
 rsf-admin/src/page/asnOrder/AsnOrderList.jsx                                                  |    4 
 rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx                                                 |   84 +++++++++-
 rsf-admin/src/page/asnOrder/PrintModal.jsx                                                    |  310 ++++++++++++++++++++++++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java |    4 
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java          |   10 
 rsf-admin/src/i18n/zh.js                                                                      |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java       |    8 
 rsf-admin/src/i18n/en.js                                                                      |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java           |    3 
 rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java                       |    2 
 10 files changed, 401 insertions(+), 26 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index faf39f7..955d2bc 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -685,6 +685,7 @@
         batchStockLevel: "batchStockLevel",
         batchWarehouseAreas: "batchWarehouseAreas",
         batchLocType: "batchLocType",
+        batchPrint: "batch print",
     },
 };
 
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index 2562f2e..bbe448c 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -695,6 +695,7 @@
         batchFlagCheck: "鎵归噺鍏嶆",
         batchWarehouseAreas: "鎵归噺搴撳尯",
         batchLocType: "鎵归噺搴撲綅绫诲瀷",
+        batchPrint: "鎵归噺鎵撳嵃",
     },
 };
 
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
index 8862faa..31aaee8 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderList.jsx
@@ -138,8 +138,8 @@
         <StyledDatagrid
           preferenceKey='asnOrder'
           bulkActionButtons={<> <InspectionsButton /><BulkDeleteButton mutationMode={OPERATE_MODE} /></>}
-          rowClick={(id, resource, record) => false}
-          expand={(e) => <AsnOrderPanel key={Math.floor(Math.random() * 100)} />}
+          rowClick={() => false}
+          expand={<AsnOrderPanel />}
           expandSingle={true}
           omit={['id', 'createTime', 'createBy', 'memo']}
         >
diff --git a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
index 5d1eeb6..a4e6655 100644
--- a/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
+++ b/rsf-admin/src/page/asnOrder/AsnOrderPanel.jsx
@@ -3,7 +3,9 @@
 import {
     useTranslate,
     useRecordContext,
-    useNotify
+    useNotify,
+    useRefresh,
+    useListContext,
 } from 'react-admin';
 import PanelTypography from "../components/PanelTypography";
 import * as Common from '@/utils/common'
@@ -11,6 +13,7 @@
 import request from '@/utils/request';
 import debounce from 'lodash/debounce';
 import { DataGrid } from '@mui/x-data-grid';
+import PrintModal from './PrintModal';
 const AsnOrderPanel = () => {
     const record = useRecordContext();
     if (!record) return null;
@@ -106,13 +109,23 @@
             headerName: translate('table.field.asnOrderItem.splrName')
         },
         {
-            field: 'barcode',
+            field: 'trackCode',
             headerName: translate('table.field.asnOrderItem.barcode')
         },
         {
             field: 'packName',
             headerName: translate('table.field.asnOrderItem.packName')
-        }]
+        },
+        {
+            field: 'action',
+            headerName: '鎿嶄綔',
+            width: 70,
+            lockPosition: 'left',
+            renderCell: (params) => (
+                <PrintButton rows={[params.row.id]} />
+            ),
+
+        },]
 
     const [selectedRows, setSelectedRows] = useState([]);
 
@@ -124,13 +137,6 @@
         setMaktx(value)
     }
 
-    const wakbarcode = () => {
-
-    }
-
-    const wakprint = () => {
-
-    }
 
 
     return (
@@ -143,8 +149,7 @@
                 <TextField value={maktx} onChange={(e) => maktxChange(e.target.value)} label="鎼滅储鐗╂枡" variant="outlined" sx={{ width: '300px' }} />
 
                 <div style={{ display: 'flex', gap: '10px' }}>
-                    <Button variant="contained" onClick={wakbarcode}>鐢熸垚鏉$爜</Button>
-                    <Button variant="contained" onClick={wakprint}>鎵撳嵃</Button>
+                    <PrintsButton rows={selectedRows} />
                 </div>
             </div>
 
@@ -153,6 +158,7 @@
                 size="small"
                 rows={rows}
                 columns={columns}
+                disableRowSelectionOnClick
                 checkboxSelection
                 onRowSelectionModelChange={handleSelectionChange}
                 selectionModel={selectedRows}
@@ -166,3 +172,57 @@
 };
 
 export default AsnOrderPanel;
+
+const PrintsButton = ({ rows }) => {
+    const record = useRecordContext();
+    const { resource, selectedIds } = useListContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const translate = useTranslate();
+
+    const [createDialog, setCreateDialog] = useState(false);
+
+    const modalChange = () => {
+        if (rows?.length === 0) {
+            notify('璇烽�夋嫨鐗╂枡');
+            return;
+        } else {
+            setCreateDialog(true)
+        }
+
+    }
+
+    return (
+        <>
+            <Button size="small" variant="contained" color="secondary" onClick={modalChange}>{translate("toolbar.batchPrint")}</Button>
+
+            <PrintModal
+                open={createDialog}
+                setOpen={setCreateDialog}
+                rows={rows}
+            />
+        </>
+    )
+}
+
+const PrintButton = ({ rows }) => {
+    const record = useRecordContext();
+
+    const notify = useNotify();
+    const refresh = useRefresh();
+
+    const [createDialog, setCreateDialog] = useState(false);
+    const translate = useTranslate();
+
+    return (
+        <>
+            <Button size="small" variant="contained" color="secondary" onClick={() => setCreateDialog(true)}>{translate("toolbar.print")}</Button>
+
+            <PrintModal
+                open={createDialog}
+                setOpen={setCreateDialog}
+                rows={rows}
+            />
+        </>
+    )
+}
diff --git a/rsf-admin/src/page/asnOrder/PrintModal.jsx b/rsf-admin/src/page/asnOrder/PrintModal.jsx
new file mode 100644
index 0000000..2ad47fd
--- /dev/null
+++ b/rsf-admin/src/page/asnOrder/PrintModal.jsx
@@ -0,0 +1,310 @@
+import React, { useState, useRef, useEffect, useMemo } from "react";
+import {
+    CreateBase,
+    useTranslate,
+    TextInput,
+    NumberInput,
+    BooleanInput,
+    DateInput,
+    SaveButton,
+    SelectInput,
+    ReferenceInput,
+    ReferenceArrayInput,
+    AutocompleteInput,
+    Toolbar,
+    required,
+    useDataProvider,
+    useNotify,
+    Form,
+    useCreateController,
+    useListContext,
+    useRefresh,
+} from 'react-admin';
+import {
+    Dialog,
+    DialogActions,
+    DialogContent,
+    DialogTitle,
+    Grid,
+    TextField,
+    Box,
+    Button,
+    Radio,
+    RadioGroup,
+    FormControlLabel,
+    FormControl,
+    FormLabel,
+    TableRow,
+    TableCell,
+    Tooltip,
+    IconButton,
+    styled
+
+
+} from '@mui/material';
+import DialogCloseButton from "@/page/components/DialogCloseButton";
+import DictionarySelect from "@/page/components/DictionarySelect";
+import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
+import SaveIcon from '@mui/icons-material/Save';
+import request from '@/utils/request';
+import { Add, Edit, Delete } from '@mui/icons-material';
+import _ from 'lodash';
+import { DataGrid } from '@mui/x-data-grid';
+import StatusSelectInput from "@/page/components/StatusSelectInput";
+
+import { useReactToPrint } from "react-to-print";
+import jsbarcode from 'jsbarcode'
+import { el } from "date-fns/locale";
+
+const PrintModal = ({ open, setOpen, rows }) => {
+    const refresh = useRefresh();
+    const translate = useTranslate();
+    const notify = useNotify();
+    const contentRef = useRef(null);
+    const reactToPrintFn = useReactToPrint({ contentRef });
+
+    const handleClose = (event, reason) => {
+        if (reason !== "backdropClick") {
+            setOpen(false);
+        }
+    };
+
+    const [value, setValue] = useState('temp1');
+
+    const handleChange = (event) => {
+        setValue(event.target.value);
+    };
+
+    const handlePrint = () => {
+        // handleClose()
+        reactToPrintFn()
+    };
+
+    return (
+        <Dialog open={open} maxWidth="sm" fullWidth>
+            <DialogCloseButton onClose={handleClose} />
+            <DialogTitle>{translate('toolbar.print')}</DialogTitle>
+            <DialogContent >
+                <FormControl >
+                    <RadioGroup
+                        row
+                        aria-labelledby="demo-controlled-radio-buttons-group"
+                        name="controlled-radio-buttons-group"
+                        value={value}
+                        onChange={handleChange}
+                        size="small"
+                        sx={{ justifyContent: 'center' }}
+                    >
+                        <FormControlLabel value="temp1" control={<Radio />} label="妯℃澘1" size="small" />
+                    </RadioGroup>
+                </FormControl>
+
+                <Box>
+                    <div style={{ textAlign: 'center', display: 'flex', justifyContent: 'center' }}>
+                        <table
+                            className="contain"
+                            style={{
+                                overflow: 'hidden',
+                                fontSize: 'small',
+                                tableLayout: 'fixed',
+                                width: '280px',
+                                borderCollapse: 'collapse', // 鍚堝苟杈规
+                                border: '1px solid black' // 璁剧疆琛ㄦ牸鏁翠綋杈规
+                            }}
+                        >
+                            <tbody>
+                                <tr style={{ height: '74px' }}>
+                                    <td
+                                        align="center"
+                                        colSpan={3}
+                                        style={{ border: '1px solid black' }} // 璁剧疆鍗曞厓鏍艰竟妗�
+                                    >
+                                        鍟嗗搧缂栫爜
+                                    </td>
+                                    <td
+                                        align="center"
+                                        className="barcode"
+                                        colSpan={9}
+                                        style={{ border: '1px solid black' }}
+                                    >
+                                        <img className="template-code" src={'/img/barcode.jpeg'} style={{ width: '90%' }} alt="Barcode" />
+                                        <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}>
+                                            <span>{'xxxxxx'}</span>
+                                        </div>
+                                    </td>
+                                </tr>
+                                <tr style={{ height: '74px' }}>
+                                    <td
+                                        align="center"
+                                        colSpan={3}
+                                        style={{ border: '1px solid black' }}
+                                    >
+                                        鍟嗗搧
+                                    </td>
+                                    <td
+                                        align="center"
+                                        colSpan={5}
+                                        style={{
+                                            overflow: 'hidden',
+                                            whiteSpace: 'nowrap',
+                                            textOverflow: 'ellipsis',
+                                            border: '1px solid black'
+                                        }}
+                                    >
+                                        {'xxxxxxxx'}
+                                    </td>
+                                    <td
+                                        align="center"
+                                        colSpan={2}
+                                        style={{ border: '1px solid black' }}
+                                    >
+                                        澶囨敞
+                                    </td>
+                                    <td
+                                        align="center"
+                                        colSpan={2}
+                                        style={{ border: '1px solid black' }}
+                                    >
+                                        {'xx'}
+                                    </td>
+                                </tr>
+                            </tbody>
+                        </table>
+                    </div>
+                    <style>{`
+                    @media print {
+                    .print-content {
+                            display: block!important;
+                        }
+                    }`} </style>
+                    <div ref={contentRef} className="print-content" style={{ textAlign: 'center', display: 'none' }}>
+                        <PrintTemp key={'bb'} rows={rows} />
+                    </div>
+                </Box>
+            </DialogContent>
+            <DialogActions sx={{ position: 'sticky', bottom: 0, backgroundColor: 'background.paper', zIndex: 1000 }}>
+                <Box sx={{ width: '100%', display: 'flex', justifyContent: 'space-between' }}>
+                    <Button onClick={handlePrint} variant="contained" startIcon={<SaveIcon />}>
+                        {translate('toolbar.confirm')}
+                    </Button>
+                </Box>
+            </DialogActions>
+        </Dialog >
+    );
+}
+
+export default PrintModal;
+
+const PrintTemp = ({ rows }) => {
+    const notify = useNotify();
+    const [data, setData] = useState([]);
+    const http = async () => {
+        const res = await request.post(`/asnOrderItem/many/${rows?.join()}`);
+        if (res?.data?.code === 200) {
+            let val = res.data.data.map((el => {
+                return {
+                    barcode: '/img/barcode.jpeg',
+                    code: el.trackCode,
+                    name: el.maktx,
+                    memo: el.memo || ''
+                }
+            }))
+            setData(val)
+            setTimeout(() => {
+                val.forEach((el) => {
+                    jsbarcode(`#barcode${el.code}`, el.code, { height: 30 });
+                });
+            }, 10);
+
+        } else {
+            notify(res.data.msg);
+        }
+    }
+
+    useEffect(() => {
+        if (rows?.length > 0) {
+            http();
+        }
+
+    }, [rows]);
+
+
+    return (
+        <>
+            {data.map((item, index) => (
+                <table
+                    key={index}
+                    className="contain"
+                    style={{
+                        overflow: 'hidden',
+                        fontSize: 'small',
+                        tableLayout: 'fixed',
+                        width: '520px',
+                        borderCollapse: 'collapse',
+                        borderSpacing: 0,
+                        margin: '0 auto',
+                        marginTop: '10px',
+                    }}
+                >
+                    <tbody>
+                        <tr style={{ height: '74px' }}>
+                            <td align="center" colSpan={3} style={{ border: '1px solid black' }} >
+                                鍟嗗搧缂栫爜
+                            </td>
+                            <td
+                                align="center"
+                                className="barcode"
+                                colSpan={9}
+                                style={{ border: '1px solid black' }}
+                            >
+                                <img id={"barcode" + item.code} style={{ width: '70%', verticalAlign: 'middle' }} />
+                                {/* <img className="template-code" src={item.barcode} style={{ width: '90%', verticalAlign: 'middle' }} alt="Barcode" /> */}
+                                {/* <div style={{ letterSpacing: '2px', marginTop: '1px', textAlign: 'center' }}>
+                                    <span>{item.code}</span>
+                                </div> */}
+                            </td>
+                        </tr>
+                        <tr style={{ height: '74px' }}>
+                            <td
+                                align="center"
+                                colSpan={3}
+                                style={{ border: '1px solid black' }}
+                            >
+                                鍟嗗搧
+                            </td>
+                            <td
+                                align="center"
+                                colSpan={5}
+                                style={{
+                                    overflow: 'hidden',
+                                    whiteSpace: 'nowrap',
+                                    textOverflow: 'ellipsis',
+                                    border: '1px solid black'
+                                }}
+                            >
+                                {item.name}
+                            </td>
+                            <td
+                                align="center"
+                                colSpan={2}
+                                style={{ border: '1px solid black' }}
+                            >
+                                澶囨敞
+                            </td>
+                            <td
+                                align="center"
+                                colSpan={2}
+                                style={{ border: '1px solid black' }}
+                            >
+                                {item.memo}
+                            </td>
+                        </tr>
+                    </tbody>
+                </table>
+            ))}
+
+        </>
+    )
+}
+
+
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
index 320bcdc..4495118 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/MobileController.java
@@ -56,17 +56,17 @@
 
     /**
      * 鏍囧噯鎵爜鏀惰揣淇℃伅
-     * @param barcode
+     * @param trackCode
      * @return
      */
     @PreAuthorize("hasAuthority('manager:asnOrder:list')")
-    @GetMapping("/orders/{barcode}")
+    @GetMapping("/orders/{trackCode}")
     @ApiOperation("鏍囧噯鎵爜鏀惰揣")
-    public R  getOrderBybarcode(@PathVariable String barcode) {
-        if (StringUtils.isEmpty(barcode)) {
+    public R  getOrderBybarcode(@PathVariable String trackCode) {
+        if (StringUtils.isEmpty(trackCode)) {
             throw new CoolException("鏉$爜涓嶈兘涓虹┖锛侊紒");
         }
-        return mobileService.getOrderByCode(barcode);
+        return mobileService.getOrderByCode(trackCode);
     }
 
     /**
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
index a7174c7..67b0970 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/entity/dto/ReceiptDetlsDto.java
@@ -61,6 +61,9 @@
     @ApiModelProperty("閲囪喘鏁伴噺")
     private Double purQty;
 
+    @ApiModelProperty("瀹為檯閫佽揣鏁伴噺")
+    private Double anfme;
+
     @ApiModelProperty("鏀惰揣鏁伴噺")
     private Double receiptQty;
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
index a00a0ec..1b32504 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -142,7 +142,7 @@
         if (StringUtils.isEmpty(barcode)) {
             return R.error("鏍囩鐮佷笉鑳戒负绌猴紒锛�");
         }
-        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getBarcode, barcode));
+        List<AsnOrderItem> asnOrderItem = asnOrderItemMapper.selectList(new LambdaQueryWrapper<AsnOrderItem>().eq(AsnOrderItem::getTrackCode, barcode));
         if (Objects.isNull(asnOrderItem)) {
             throw new CoolException("鍗曟嵁鏄庣粏涓嶅瓨鍦紒锛�");
         }
@@ -166,7 +166,6 @@
         if (Objects.isNull(params.getWhAreaId())) {
             throw new CoolException("搴撳尯鏍囪瘑涓嶈兘涓虹┖锛侊紒");
         }
-
 
         WarehouseAreas areasItem = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>().eq(WarehouseAreas::getId, params.getWhAreaId()));
         if (Objects.isNull(areasItem)) {
@@ -200,7 +199,7 @@
             if (Objects.isNull(dto.getReceiptQty())) {
                 throw new CoolException("鏀惰揣鏁版嵁涓嶈兘涓虹┖锛侊紒");
             }
-            if (dto.getReceiptQty() < dto.getPurQty()) {
+            if (dto.getReceiptQty().compareTo(dto.getAnfme()) > 0) {
                 throw new CoolException("鏀惰揣鏁伴噺涓嶈兘澶т簬閲囪喘鏁伴噺锛侊紒");
             }
 
@@ -389,7 +388,8 @@
                     .setMaktx(asnOrderItem.getMaktx())
                     .setBarcode(asnOrderItem.getBarcode())
                     .setPoCode(asnOrderItem.getPoCode())
-                    .setPurQty(asnOrderItem.getAnfme())
+                    .setAnfme(asnOrderItem.getAnfme())
+                    .setPurQty(asnOrderItem.getPurQty())
                     .setSplrBatch(asnOrderItem.getSplrBatch());
 
             Matnr matnr = matnrMapper.selectById(asnOrderItem.getMatnrId());
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
index da01e74..08b5f70 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,7 +22,7 @@
 //        generator.username="sa";
 //        generator.password="Zoneyung@zy56$";
 
-        generator.table="man_wait_pakin_item";
+        generator.table="man_asn_order_log";
         generator.tableDesc="缁勬嫋妗f槑缁�";
         generator.packagePath="com.vincent.rsf.server.manager";
 
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 e947a9e..1e7709d 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
@@ -128,7 +128,7 @@
         if (Objects.isNull(params.getOrders().getId())) {
             throw new CoolException("鏁版嵁閿欒锛氬崟鎹甀D涓嶈兘涓虹┖锛侊紒");
         }
-        if (this.updateById(params.getOrders())) {
+        if (!this.updateById(params.getOrders())) {
             throw new CoolException("涓诲崟淇敼澶辫触锛侊紒");
         }
         if (Objects.isNull(params.getItems()) || params.getItems().isEmpty()) {
@@ -136,7 +136,7 @@
         }
         List<Map<String, Object>> items = params.getItems();
         List<AsnOrderItem> asnOrderItems = JSONArray.parseArray(JSONArray.toJSONString(items), AsnOrderItem.class);
-        if (asnOrderItemService.saveOrUpdateBatch(asnOrderItems)) {
+        if (!asnOrderItemService.saveOrUpdateBatch(asnOrderItems)) {
             throw new CoolException("鏄庣粏淇敼澶辫触锛侊紒");
         }
         return R.ok("淇敼瀹屾垚锛侊紒");

--
Gitblit v1.9.1