From 57c58f09ea772fe06390a03d5ae9c73d6d6d9e56 Mon Sep 17 00:00:00 2001
From: luxiaotao1123 <t1341870251@163.com>
Date: 星期六, 12 十月 2024 10:07:53 +0800
Subject: [PATCH] #

---
 zy-acs-flow/src/map/constants.js                |    4 
 zy-acs-flow/src/map/settings/MapSettings.jsx    |   14 ++++
 zy-acs-flow/src/map/settings/CopyDrawer.jsx     |  108 +++++++++++++++++++++++++++++++++++
 zy-acs-flow/src/map/tool.js                     |   28 +++++++++
 zy-acs-flow/src/map/MapPage.jsx                 |    2 
 zy-acs-flow/src/map/settings/ConfigSettings.jsx |    4 
 6 files changed, 151 insertions(+), 9 deletions(-)

diff --git a/zy-acs-flow/src/map/MapPage.jsx b/zy-acs-flow/src/map/MapPage.jsx
index b05430e..2e50171 100644
--- a/zy-acs-flow/src/map/MapPage.jsx
+++ b/zy-acs-flow/src/map/MapPage.jsx
@@ -205,7 +205,7 @@
                     padding: '0 16px',
                     height: '64px',
                     flexShrink: 0, // keep height
-                    zIndex: 200
+                    zIndex: 200,
                 }}
             >
                 <TextField
diff --git a/zy-acs-flow/src/map/constants.js b/zy-acs-flow/src/map/constants.js
index 9d41518..e5cd9f9 100644
--- a/zy-acs-flow/src/map/constants.js
+++ b/zy-acs-flow/src/map/constants.js
@@ -2,18 +2,18 @@
 
 export const DEVICE_TYPE = Object.freeze({
     SHELF: "SHELF",
+    STATION: 'STATION',
     AGV: "AGV",
     CHARGE: 'CHARGE',
-    STATION: 'STATION',
     DIRECTION: 'DIRECTION',
     POINT: "POINT",
 })
 
 export const DEVICE_Z_INDEX = Object.freeze({
     SHELF: 1,
+    STATION: 1,
     AGV: 1,
     CHARGE: 1,
-    STATION: 1,
     DIRECTION: 1,
     POINT: 1
 })
diff --git a/zy-acs-flow/src/map/settings/ConfigSettings.jsx b/zy-acs-flow/src/map/settings/ConfigSettings.jsx
index a7d7b4f..2ac2917 100644
--- a/zy-acs-flow/src/map/settings/ConfigSettings.jsx
+++ b/zy-acs-flow/src/map/settings/ConfigSettings.jsx
@@ -90,7 +90,7 @@
                                             value={field.value ?? ''}
                                             fullWidth
                                             onChange={(e) => {
-                                                field.onChange(e);
+                                                field.onChange(e.target.value === '' ? '' : Number(e.target.value));
                                             }}
                                         />
                                     )}
@@ -108,7 +108,7 @@
                                             value={field.value ?? ''}
                                             fullWidth
                                             onChange={(e) => {
-                                                field.onChange(e);
+                                                field.onChange(e.target.value === '' ? '' : Number(e.target.value));
                                             }}
                                         />
                                     )}
diff --git a/zy-acs-flow/src/map/settings/CopyDrawer.jsx b/zy-acs-flow/src/map/settings/CopyDrawer.jsx
index f72ab02..72b3f5a 100644
--- a/zy-acs-flow/src/map/settings/CopyDrawer.jsx
+++ b/zy-acs-flow/src/map/settings/CopyDrawer.jsx
@@ -77,7 +77,16 @@
 });
 
 const CopyDrawer = (props) => {
-    const { open, onCancel, sprite, value, width = PAGE_DRAWER_WIDTH, handleOnCopy } = props;
+    const {
+        open,
+        onCancel,
+        sprite,
+        value,
+        width = PAGE_DRAWER_WIDTH,
+        handleOnCopy,
+        setLastCopiedSprites,
+        setSpriteSettings,
+    } = props;
     const notify = useNotification();
     const translate = useTranslate();
     const theme = useTheme();
@@ -114,7 +123,99 @@
     }
 
     const onFormSubmit = (data) => {
-        console.log(data);
+        if (!sprite || !data || Object.keys(data).length === 0) {
+            return;
+        }
+        setLastCopiedSprites([]);
+        for (let i = 0; i < data.copyCount; i++) {
+            const copiedSprite = Tool.copySprite(sprite);
+            // copy
+            switch (data.copyDirect) {
+                case 'left':
+                    copiedSprite.position.x -= (i + 1) * (data.gap + copiedSprite.width);
+                    break;
+                case 'right':
+                    copiedSprite.position.x += (i + 1) * (data.gap + copiedSprite.width);
+                    break;
+                case 'up':
+                    copiedSprite.position.y -= (i + 1) * (data.gap + copiedSprite.height);
+                    break;
+                case 'down':
+                    copiedSprite.position.y += (i + 1) * (data.gap + copiedSprite.height);
+                    break;
+                default:
+                    break;
+            }
+            // auto-increment-value
+            if (data.autoIncrement && deviceType) {
+                switch (deviceType) {
+                    case DEVICE_TYPE.SHELF:
+                        if (data.incrementValue === 'row') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.row = sprite.data.row - i - 1;
+                            } else {
+                                copiedSprite.data.row = sprite.data.row + i + 1;
+                            }
+                        }
+                        if (data.incrementValue === 'bay') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.bay = sprite.data.bay - i - 1;
+                            } else {
+                                copiedSprite.data.bay = sprite.data.bay + i + 1;
+                            }
+                        }
+                        if (copiedSprite.data.row && copiedSprite.data.bay) {
+                            copiedSprite.data.no = copiedSprite.data.row + '-' + copiedSprite.data.bay;
+                        }
+                        break;
+                    case DEVICE_TYPE.STATION:
+                        if (data.incrementValue === 'no') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, - i - 1);
+                            } else {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, + i + 1);
+                            }
+                        }
+                        break;
+                    case DEVICE_TYPE.CHARGE:
+                        if (data.incrementValue === 'no') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, - i - 1);
+                            } else {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, + i + 1);
+                            }
+                        }
+                        break;
+                    case DEVICE_TYPE.DIRECTION:
+                        if (data.incrementValue === 'no') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, - i - 1);
+                            } else {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, + i + 1);
+                            }
+                        }
+                        break;
+                    case DEVICE_TYPE.POINT:
+                        if (data.incrementValue === 'no') {
+                            if (data.incrementMode === 'descending') {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, - i - 1);
+                            } else {
+                                copiedSprite.data.no = Tool.incrementSpriteNo(sprite.data.no, + i + 1);
+                            }
+                        }
+                        break;
+                    case DEVICE_TYPE.AGV:
+                        break;
+                    default:
+                        break;
+                }
+            }
+
+            Tool.getMapContainer().addChild(copiedSprite);
+            Tool.beSettings(copiedSprite, setSpriteSettings);
+            setLastCopiedSprites(prevArr => [...prevArr, copiedSprite]);
+        }
+        onCancel();
         handleOnCopy?.(data);
         notify.info(translate('common.response.success'));
     };
@@ -205,6 +306,9 @@
                                                                 min: 0,
                                                                 step: 1,
                                                             }}
+                                                            onChange={(e) => {
+                                                                field.onChange(e.target.value === '' ? '' : Number(e.target.value));
+                                                            }}
                                                         />
                                                     )}
                                                 />
diff --git a/zy-acs-flow/src/map/settings/MapSettings.jsx b/zy-acs-flow/src/map/settings/MapSettings.jsx
index e414696..233d4b3 100644
--- a/zy-acs-flow/src/map/settings/MapSettings.jsx
+++ b/zy-acs-flow/src/map/settings/MapSettings.jsx
@@ -24,6 +24,7 @@
     const { sprite, setSpriteSettings, onSubmit, width } = props;
     const translate = useTranslate();
     const [copyVisible, setCopyVisible] = useState(false);
+    const [lastCopiedSprites, setLastCopiedSprites] = useState([]);
 
     const { control, handleSubmit, reset, watch } = useForm({
         defaultValues: {
@@ -313,7 +314,14 @@
                             }}>
                                 {translate('page.map.settings.map.copy.execute')}
                             </Button>
-                            <Button variant="text" color="primary">
+                            <Button variant="text" color="primary" onClick={() => {
+                                if (lastCopiedSprites && lastCopiedSprites.length > 0) {
+                                    lastCopiedSprites.forEach(copiedSprite => {
+                                        Utils.getMapContainer().removeChild(copiedSprite);
+                                    })
+                                    setLastCopiedSprites([]);
+                                }
+                            }}>
                                 {translate('page.map.settings.map.copy.reverse')}
                             </Button>
                         </Stack>
@@ -343,7 +351,7 @@
                         </Stack>
                     </Grid>
                 </Grid>
-            </Box>
+            </Box >
 
             <CopyDrawer
                 open={copyVisible}
@@ -359,6 +367,8 @@
                 handleOnCopy={() => {
 
                 }}
+                setLastCopiedSprites={setLastCopiedSprites}
+                setSpriteSettings={setSpriteSettings}
             />
         </>
     );
diff --git a/zy-acs-flow/src/map/tool.js b/zy-acs-flow/src/map/tool.js
index ec7e16f..7bcd534 100644
--- a/zy-acs-flow/src/map/tool.js
+++ b/zy-acs-flow/src/map/tool.js
@@ -189,6 +189,17 @@
     }
 }
 
+export const copySprite = (sprite) => {
+    const copiedSprite = generateSprite(sprite.data.type)
+    initSprite(copiedSprite);
+    copiedSprite.position.set(sprite.position.x, sprite.position.y);
+    copiedSprite.scale.set(sprite.scale.x, sprite.scale.y);
+    copiedSprite.rotation = sprite.rotation;
+    copiedSprite.data = deepCopy(sprite.data);
+    copiedSprite.data.uuid = generateID();
+    return copiedSprite;
+}
+
 export const isSpriteInSelectionBox = (sprite, selectionBox) => {
     const spriteBounds = sprite.getBounds();
     const boxBounds = selectionBox.getBounds();
@@ -313,10 +324,27 @@
     effectHalfCircle.position.set(sprite.x, sprite.y);
 }
 
+export const incrementSpriteNo = (str, incrementValue) => {
+    const match = str.match(/(\D*)(\d+)/);
+    if (match) {
+        const prefix = match[1];
+        const numberPart = match[2];
+        const newNumber = parseInt(numberPart, 10) + incrementValue;
+        const paddedNumber = newNumber.toString().padStart(numberPart.length, '0');
+        return `${prefix}${paddedNumber}`;
+    } else {
+        return str;
+    }
+}
+
 export const generateID = () => {
     return Date.now().toString(36) + Math.random().toString(36).substring(2);
 }
 
+export const deepCopy = (data) => {
+    return JSON.parse(JSON.stringify(data));
+}
+
 export const patchRaLayout = (param) => {
     const parentElement = document.getElementById('main-content');
     if (parentElement && parentElement.classList.contains('RaLayout-content')) {

--
Gitblit v1.9.1