From 11662208c26eb3d837d4c2d1e7cbbeae5d5c9943 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 18 八月 2025 13:59:13 +0800
Subject: [PATCH] 库存调整功能优化

---
 rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx                                         |    2 
 rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx                                         |   31 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CommonExceStatus.java                |   22 +++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ReviseLogController.java        |   12 +
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ReviseLogService.java              |    3 
 rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx                                         |   13 +
 rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx                                     |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java                 |   13 +
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncMatGroupsParams.java |   39 +++++
 rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ReceiveMsgController.java       |   20 ++
 rsf-admin/src/page/stockManage/locRevise/asnOrder.css                                              |    5 
 rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx                                        |   19 +-
 rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java        |   30 ++++
 rsf-admin/src/i18n/zh.js                                                                           |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogServiceImpl.java     |   96 ++++++++++++-
 rsf-admin/src/i18n/en.js                                                                           |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java                       |    5 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogItemServiceImpl.java |   48 +++---
 18 files changed, 305 insertions(+), 57 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index f9fd34b..e5e7065 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -1339,6 +1339,7 @@
         orderPrint: 'Orders Print',
         quality: "quality",
         complete: "complete",
+        confirmTransfer: "Comfirm Transfer",
         allComfirm: 'All Comfirm',
         createTransfer: 'Create Transfer Order',
         createLocRevise: 'Create Stock Revise Order',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index b7642e8..9d4ef4d 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -1358,6 +1358,7 @@
         allComfirm: '鍏ㄩ儴鎻愪氦',
         quality: "璐ㄦ",
         complete: "瀹岀粨",
+        confirmTransfer: "纭璋冩暣",
         close: "鍏抽棴",
         createTransfer: '鍒涘缓璋冩嫈鍗�',
         createLocRevise: '鍒涘缓搴撳瓨璋冩暣鍗�',
diff --git a/rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx b/rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx
index 48ca819..a8911d0 100644
--- a/rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/LocReviseEdit.jsx
@@ -20,15 +20,16 @@
     useRecordContext,
     DeleteButton,
 } from 'react-admin';
-import { useWatch, useFormContext } from "react-hook-form";
-import { Stack, Grid, Box, Typography } from '@mui/material';
-import * as Common from '@/utils/common';
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
-import EditBaseAside from "@/page/components/EditBaseAside";
-import CustomerTopToolBar from "@/page/components/EditTopToolBar";
-import MemoInput from "@/page/components/MemoInput";
 import StatusSelectInput from "@/page/components/StatusSelectInput";
+import CustomerTopToolBar from "@/page/components/EditTopToolBar";
+import { Stack, Grid, Box, Typography } from '@mui/material';
+import EditBaseAside from "@/page/components/EditBaseAside";
+import { useWatch, useFormContext } from "react-hook-form";
+import MemoInput from "@/page/components/MemoInput";
 import ReviseLogList from "./ReviseLogList";
+import * as Common from '@/utils/common';
+import request from '@/utils/request';
 
 
 const LocReviseEdit = () => {
diff --git a/rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx b/rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx
index 0fc637c..138f189 100644
--- a/rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/LocReviseList.jsx
@@ -25,6 +25,7 @@
     TextInput,
     DateTimeInput,
     DateInput,
+    useRefresh,
     SelectInput,
     NumberInput,
     ReferenceInput,
@@ -37,8 +38,11 @@
 import MyExportButton from '@/page/components/MyExportButton';
 import PageEditDrawer from "@/page/components/PageEditDrawer";
 import { Box, Typography, Card, Stack } from '@mui/material';
+import ConfirmButton from '../../components/ConfirmButton';
 import LocReviseCreate from "./LocReviseCreate";
+import TaskIcon from '@mui/icons-material/Task';
 import { styled } from '@mui/material/styles';
+import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -136,13 +140,14 @@
                     <TextField source="areaName" label="table.field.locRevise.areaName" />
                     <TextField source="updateBy$" label="common.field.updateBy" />
                     <DateField source="updateTime" label="common.field.updateTime" showTime />
-                    <DateField source="createBy$" label="common.field.createBy" />
+                    <TextField source="createBy$" label="common.field.createBy" />
                     <DateField source="createTime" label="common.field.createTime" showTime />
                     <BooleanField source="statusBool" label="common.field.status" sortable={false} />
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
                         <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                         <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                        <CompleteButton />
                     </WrapperField>
                 </StyledDatagrid>
             </List>
@@ -160,4 +165,28 @@
     )
 }
 
+
+//瀹屾垚鍗曟嵁
+const CompleteButton = () => {
+    const record = useRecordContext();
+    const notify = useNotify();
+    const refresh = useRefresh();
+    const requestComplete = async () => {
+        const { data: { code, data, msg } } = await request.post(`/reviseLog/complete/${record.id}`);
+        if (code === 200) {
+            notify(msg);
+            refresh()
+        } else {
+            notify(msg);
+        }
+    }
+
+    return (
+        record.exceStatus == 1 ? <ConfirmButton label={"toolbar.complete"} color="secondary" startIcon={<TaskIcon />} onConfirm={requestComplete} /> : <></>
+    )
+
+
+}
+
+
 export default LocReviseList;
diff --git a/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx b/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
index ee0a8fa..1422424 100644
--- a/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/LocsReviseDetl.jsx
@@ -24,6 +24,7 @@
 import SelectMatnrInfo from "./SelectMatnrInfo";
 import SaveIcon from '@mui/icons-material/Save';
 import request from '@/utils/request';
+import "./asnOrder.css";
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -176,7 +177,7 @@
                             </Grid>
                             <Box sx={{ display: 'flex', flexDirection: 'column', gap: 3, justifyContent: 'flex-end' }}>
                                 <Grid item md={8} sx={{ justifyContent: 'flex-end', display: 'flex' }}>
-                                    <Button variant="text" onClick={handleAdd}>{translate("page.whMat.title.add")}</Button>
+                                    <Button variant="contained" onClick={handleAdd} >{translate("page.whMat.title.add")}</Button>
                                 </Grid>
                             </Box>
                         </Box>
@@ -231,13 +232,6 @@
             editable: false,
         },
         {
-            field: 'batch',
-            headerName: translate('table.field.locItem.batch'),
-            minWidth: 100,
-            flex: 1,
-            editable: true,
-        },
-        {
             field: 'anfme',
             headerName: translate('table.field.locItem.anfme') + "*",
             minWidth: 100,
@@ -251,6 +245,15 @@
             type: 'number',
             flex: 1,
             editable: true,
+            headerClassName: "custom",
+        },
+        {
+            field: 'batch',
+            headerName: translate('table.field.locItem.batch'),
+            minWidth: 100,
+            flex: 1,
+            editable: true,
+            headerClassName: "custom",
         },
         {
             field: 'spec',
diff --git a/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx b/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
index d0a6fec..b6f8a49 100644
--- a/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/ReviseLogItemList.jsx
@@ -70,7 +70,7 @@
                             duration: theme.transitions.duration.enteringScreen,
                         }),
                 }}
-                title={"menu.reviseLogItem"}
+                title={false}
                 empty={false}
                 filters={false}
                 pagination={false}
diff --git a/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx b/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
index 7d8ca87..3656ba1 100644
--- a/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
+++ b/rsf-admin/src/page/stockManage/locRevise/ReviseLogList.jsx
@@ -103,7 +103,7 @@
                             duration: theme.transitions.duration.enteringScreen,
                         }),
                 }}
-                title={"menu.reviseLog"}
+                title={false}
                 empty={false}
                 filters={filters}
                 filter={{ reviseId: orderId }}
diff --git a/rsf-admin/src/page/stockManage/locRevise/asnOrder.css b/rsf-admin/src/page/stockManage/locRevise/asnOrder.css
new file mode 100644
index 0000000..0df941e
--- /dev/null
+++ b/rsf-admin/src/page/stockManage/locRevise/asnOrder.css
@@ -0,0 +1,5 @@
+
+.custom {
+    color: rgb(0, 195, 255) !important;    
+  }
+
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ReceiveMsgController.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ReceiveMsgController.java
index 2e54f21..eb586ca 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ReceiveMsgController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/ReceiveMsgController.java
@@ -3,10 +3,7 @@
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.framework.exception.CoolException;
-import com.vincent.rsf.server.api.controller.erp.params.BaseMatParms;
-import com.vincent.rsf.server.api.controller.erp.params.OrderParams;
-import com.vincent.rsf.server.api.controller.erp.params.QueryOrderParam;
-import com.vincent.rsf.server.api.controller.erp.params.SyncLocsParams;
+import com.vincent.rsf.server.api.controller.erp.params.*;
 import com.vincent.rsf.server.api.service.ReceiveMsgService;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
@@ -164,6 +161,21 @@
         return receiveMsgService.syncLocs(locs);
     }
 
+    /**
+     * @author Ryan
+     * @date 2025/8/18
+     * @description: 鐗╂枡鍒嗙粍淇℃伅鍚屾
+     * @version 1.0
+     */
+    @PostMapping("/sync/matGroups")
+    @ApiOperation(value = "鐗╂枡鍒嗙粍淇℃伅鍚屾", tags = "鍩虹淇℃伅鍚屾")
+    public R syncMatGroup(@RequestBody List<SyncMatGroupsParams> matGroupsParams) {
+        if (matGroupsParams.isEmpty()) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return receiveMsgService.syncMatGroups(matGroupsParams);
+    }
+
 
 
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncMatGroupsParams.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncMatGroupsParams.java
new file mode 100644
index 0000000..5239176
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/controller/erp/params/SyncMatGroupsParams.java
@@ -0,0 +1,39 @@
+package com.vincent.rsf.server.api.controller.erp.params;
+
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.experimental.Accessors;
+
+import java.io.Serializable;
+
+@Data
+@Accessors(chain = true)
+@ApiModel(value = "SyncMatGroupsParams", description = "鍚屾鐗╂枡鍒嗕俊鎭弬鏁�")
+public class SyncMatGroupsParams implements Serializable {
+
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 鍚嶇О
+     */
+    @ApiModelProperty(value= "鍚嶇О")
+    private String name;
+
+    /**
+     * 鍒嗙粍缂栫爜
+     */
+    @ApiModelProperty("涓婄骇鍒嗙粍缂栫爜")
+    private String parCode;
+
+    /**
+     * @author Ryan
+     * @date 2025/8/18
+     * @description: 鍒嗙被缂栫爜
+     * @version 1.0
+     */
+    @ApiModelProperty("鍒嗙被缂栫爜")
+    private String code;
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
index e442e10..7d56ba1 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/ReceiveMsgService.java
@@ -3,10 +3,7 @@
 
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.vincent.rsf.framework.common.R;
-import com.vincent.rsf.server.api.controller.erp.params.BaseMatParms;
-import com.vincent.rsf.server.api.controller.erp.params.OrderParams;
-import com.vincent.rsf.server.api.controller.erp.params.QueryOrderParam;
-import com.vincent.rsf.server.api.controller.erp.params.SyncLocsParams;
+import com.vincent.rsf.server.api.controller.erp.params.*;
 import com.vincent.rsf.server.common.domain.BaseParam;
 import com.vincent.rsf.server.common.domain.PageParam;
 import com.vincent.rsf.server.manager.entity.Loc;
@@ -60,4 +57,12 @@
      * @version 1.0
      */
     R syncLocs(List<SyncLocsParams> locs);
+
+    /**
+     * @author Ryan
+     * @date 2025/8/18
+     * @description: 鐗╂枡鍒嗙粍淇℃伅鍚屾
+     * @version 1.0
+     */
+    R syncMatGroups(List<SyncMatGroupsParams> matGroupsParams);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
index b747497..303f02b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/ReceiveMsgServiceImpl.java
@@ -237,5 +237,33 @@
         return R.ok();
     }
 
-
+    /**
+     * @author Ryan
+     * @date 2025/8/18
+     * @description: 鐗╂枡淇℃伅鍚屾
+     * @version 1.0
+     */
+    @Override
+    @Transactional(timeout = 30, rollbackFor = Exception.class)
+    public R syncMatGroups(List<SyncMatGroupsParams> matGroupsParams) {
+        List<MatnrGroup> syncMatGroups = new ArrayList<>();
+        matGroupsParams.forEach(matGroupsParam -> {
+            MatnrGroup matnrGroup = new MatnrGroup();
+            BeanUtils.copyProperties(matGroupsParam, matnrGroup);
+            if (Objects.isNull(matGroupsParam.getCode())) {
+                throw new CoolException("鐗╂枡鍒嗙粍缂栫爜涓嶈兘涓虹┖锛侊紒");
+            }
+            if (Objects.isNull(matGroupsParam.getName())) {
+                throw new CoolException("鍒嗙粍鍚嶇О涓嶈兘涓虹┖锛侊紒");
+            }
+            if (Objects.isNull(matGroupsParam.getParCode())) {
+                throw new CoolException("涓婄骇鐗╂枡鍒嗙粍缂栫爜涓嶈兘涓虹┖锛侊紒");
+            }
+            syncMatGroups.add(matnrGroup);
+        });
+        if (!matnrGroupService.saveBatch(syncMatGroups)) {
+            throw new CoolException("鐗╂枡鍒嗙粍淇濆瓨澶辫触锛侊紒");
+        }
+        return R.ok();
+    }
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ReviseLogController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ReviseLogController.java
index 064997b..d371601 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ReviseLogController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/ReviseLogController.java
@@ -14,6 +14,7 @@
 import com.vincent.rsf.server.manager.entity.ReviseLog;
 import com.vincent.rsf.server.manager.service.ReviseLogService;
 import com.vincent.rsf.server.system.controller.BaseController;
+import io.swagger.annotations.ApiOperation;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.security.access.prepost.PreAuthorize;
 import org.springframework.web.bind.annotation.*;
@@ -67,6 +68,7 @@
         return R.ok("Save Success").add(reviseLog);
     }
 
+
     @PreAuthorize("hasAuthority('manager:locRevise:update')")
     @OperationLog("Update 搴撲綅璋冩暣鍘嗗彶")
     @PostMapping("/reviseLog/update")
@@ -89,6 +91,16 @@
         return R.ok().add(reviseLogService.reviseLoc(reviseLog, getLoginUserId()));
     }
 
+    @PreAuthorize("hasAuthority('manager:locRevise:update')")
+    @PostMapping("/reviseLog/complete/{id}")
+    @ApiOperation("纭璋冩暣搴撳瓨")
+    public R completeTran(@PathVariable("id") Long id) {
+        if (Objects.isNull(id)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return reviseLogService.complete(id, getLoginUserId());
+    }
+
     @PreAuthorize("hasAuthority('manager:locRevise:remove')")
     @OperationLog("Delete 搴撲綅璋冩暣鍘嗗彶")
     @PostMapping("/reviseLog/remove/{ids}")
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CommonExceStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CommonExceStatus.java
new file mode 100644
index 0000000..722b3c5
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CommonExceStatus.java
@@ -0,0 +1,22 @@
+package com.vincent.rsf.server.manager.enums;
+
+/**
+ * @author Ryan
+ * @date 2025/8/18
+ * @description: 閫氱敤鍗曟嵁鎵ц鐘舵��
+ * @version 1.0
+ */
+public enum CommonExceStatus {
+    //閫氱敤鎵ц鐘舵��
+    COMMON_EXCE_STATUS_UN_EXCE("0", "鏈墽琛�"),
+    COMMON_EXCE_STATUS_EXCE_ING("1", "鎵ц涓�"),
+    COMMON_EXCE_STATUS_TASK_DONE("2", "宸插畬鎴�")
+    ;
+    CommonExceStatus(String val, String desc) {
+        this.val = Integer.parseInt(val);
+        this.desc = desc;
+    }
+
+    public Integer val;
+    public String desc;
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java
index dc85d6b..44a9291 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java
@@ -12,6 +12,7 @@
     ORDER_OUT("out", "鍑哄簱鍗�"),
     ORDER_IN("in", "鍏ュ簱鍗�"),
     ORDER_TRANSFER("transfer", "璋冩嫈鍗�"),
+    ORDER_REVISE("revise", "搴撳瓨璋冩暣"),
     ORDER_CHECK("check", "鐩樼偣鍗�");
 
 
@@ -32,6 +33,8 @@
             return OrderType.ORDER_CHECK.type;
         } else if (desc.equals(OrderType.ORDER_TRANSFER.desc)) {
             return OrderType.ORDER_TRANSFER.type;
+        } else if (desc.equals(OrderType.ORDER_REVISE.desc)) {
+            return OrderType.ORDER_REVISE.type;
         }
         return null;
     }
@@ -45,6 +48,8 @@
             return OrderType.ORDER_CHECK.desc;
         } else if (type.equals(OrderType.ORDER_TRANSFER.type)) {
             return OrderType.ORDER_TRANSFER.desc;
+        } else if (type.equals(OrderType.ORDER_REVISE.type)) {
+            return OrderType.ORDER_REVISE.desc;
         }
         return null;
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ReviseLogService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ReviseLogService.java
index 4ca6f62..419e29b 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ReviseLogService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/ReviseLogService.java
@@ -1,6 +1,7 @@
 package com.vincent.rsf.server.manager.service;
 
 import com.baomidou.mybatisplus.extension.service.IService;
+import com.vincent.rsf.framework.common.R;
 import com.vincent.rsf.server.manager.controller.params.ReviseLogParams;
 import com.vincent.rsf.server.manager.entity.ReviseLog;
 
@@ -9,4 +10,6 @@
 public interface ReviseLogService extends IService<ReviseLog> {
 
     List<ReviseLog> reviseLoc(ReviseLogParams reviseLog, Long loginUserId);
+
+    R complete(Long params, Long loginUserId);
 }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogItemServiceImpl.java
index cf8c3b1..402deb4 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogItemServiceImpl.java
@@ -6,6 +6,7 @@
 import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.manager.controller.params.ReviseLogItemParams;
 import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.enums.CommonExceStatus;
 import com.vincent.rsf.server.manager.mapper.ReviseLogItemMapper;
 import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -71,29 +72,29 @@
                 throw new RuntimeException("搴撳瓨鏄庣粏璋冩暣澶辫触");
             }
 
-            LocItem one = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
-                    .eq(LocItem::getMatnrId, logItem.getMatnrId())
-                    .eq(StringUtils.isNotBlank(logItem.getBatch()), LocItem::getBatch, logItem.getBatch())
-                    .eq(StringUtils.isNotBlank(logItem.getFieldsIndex()), LocItem::getFieldsIndex, logItem.getFieldsIndex())
-                    .eq(LocItem::getLocCode, logItem.getLocCode()));
-            if (Objects.isNull(one)) {
-                LocItem locDetl = new LocItem();
-                BeanUtils.copyProperties(logItem, locDetl);
-                locDetl.setLocId(loc.getId())
-                        .setLocCode(loc.getCode())
-                        .setAnfme(logItem.getReviseQty())
-                        .setUpdateBy(userId)
-                        .setId(null)
-                        .setCreateBy(userId);
-                if (!locItemService.save(locDetl)) {
-                    throw new CoolException("搴撳瓨鏄庣粏淇濆瓨澶辫触锛侊紒");
-                }
-            } else {
-                one.setAnfme(logItem.getReviseQty());
-                if (!locItemService.updateById(one)) {
-                    throw new RuntimeException("搴撳瓨鏄庣粏淇敼澶辫触锛侊紒");
-                }
-            }
+//            LocItem one = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
+//                    .eq(LocItem::getMatnrId, logItem.getMatnrId())
+//                    .eq(StringUtils.isNotBlank(logItem.getBatch()), LocItem::getBatch, logItem.getBatch())
+//                    .eq(StringUtils.isNotBlank(logItem.getFieldsIndex()), LocItem::getFieldsIndex, logItem.getFieldsIndex())
+//                    .eq(LocItem::getLocCode, logItem.getLocCode()));
+//            if (Objects.isNull(one)) {
+//                LocItem locDetl = new LocItem();
+//                BeanUtils.copyProperties(logItem, locDetl);
+//                locDetl.setLocId(loc.getId())
+//                        .setLocCode(loc.getCode())
+//                        .setAnfme(logItem.getReviseQty())
+//                        .setUpdateBy(userId)
+//                        .setId(null)
+//                        .setCreateBy(userId);
+//                if (!locItemService.save(locDetl)) {
+//                    throw new CoolException("搴撳瓨鏄庣粏淇濆瓨澶辫触锛侊紒");
+//                }
+//            } else {
+//                one.setAnfme(logItem.getReviseQty());
+//                if (!locItemService.updateById(one)) {
+//                    throw new RuntimeException("搴撳瓨鏄庣粏淇敼澶辫触锛侊紒");
+//                }
+//            }
         });
 
         List<ReviseLog> list = reviseLogService.list(new LambdaQueryWrapper<ReviseLog>().eq(ReviseLog::getReviseId, reviseLog.getReviseId()));
@@ -110,6 +111,7 @@
         if (!locReviseService.update(new LambdaUpdateWrapper<LocRevise>()
                 .eq(LocRevise::getId, reviseLog.getReviseId())
                         .set(LocRevise::getAnfme, anfems)
+                        .set(LocRevise::getExceStatus, CommonExceStatus.COMMON_EXCE_STATUS_EXCE_ING.val)
                         .set(LocRevise::getReviseQty, reviseQty))) {
             throw new RuntimeException("搴撳瓨璋冩暣鍗曚慨鏀瑰け璐ワ紒锛�");
         }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogServiceImpl.java
index 3b03850..baf9048 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/ReviseLogServiceImpl.java
@@ -1,12 +1,15 @@
 package com.vincent.rsf.server.manager.service.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.framework.exception.CoolException;
 import com.vincent.rsf.server.manager.controller.params.ReviseLogParams;
-import com.vincent.rsf.server.manager.entity.LocRevise;
-import com.vincent.rsf.server.manager.entity.ReviseLogItem;
+import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.enums.CommonExceStatus;
+import com.vincent.rsf.server.manager.enums.OrderType;
 import com.vincent.rsf.server.manager.mapper.ReviseLogMapper;
-import com.vincent.rsf.server.manager.entity.ReviseLog;
-import com.vincent.rsf.server.manager.service.LocReviseService;
-import com.vincent.rsf.server.manager.service.ReviseLogService;
+import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import org.springframework.beans.BeanUtils;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -14,7 +17,9 @@
 import org.springframework.transaction.annotation.Transactional;
 
 import java.util.List;
+import java.util.Map;
 import java.util.Objects;
+import java.util.stream.Collectors;
 
 @Service("reviseLogService")
 public class ReviseLogServiceImpl extends ServiceImpl<ReviseLogMapper, ReviseLog> implements ReviseLogService {
@@ -24,6 +29,14 @@
 
     @Autowired
     private ReviseLogService reviseLogService;
+
+    @Autowired
+    private LocItemService locItemService;
+
+    @Autowired
+    private LocService locService;
+    @Autowired
+    private ReviseLogItemService reviseLogItemService;
 
     /**
      * 搴撳瓨璋冩暣鍗曟槑缁嗘坊鍔�
@@ -36,11 +49,11 @@
     public List<ReviseLog> reviseLoc(ReviseLogParams revise, Long loginUserId) {
         LocRevise locRevise = locReviseService.getById(revise.getReviseId());
         if (Objects.isNull(locRevise)) {
-            throw new RuntimeException("璋冩暣鍗曟嵁涓嶅瓨鍦紒锛�");
+            throw new CoolException("璋冩暣鍗曟嵁涓嶅瓨鍦紒锛�");
         }
         List<ReviseLog> items = revise.getItems();
         if (items.isEmpty()) {
-            throw new RuntimeException("璋冩暣鍗曟槑缁嗗弬鏁颁负绌猴紒锛�");
+            throw new CoolException("璋冩暣鍗曟槑缁嗗弬鏁颁负绌猴紒锛�");
         }
         items.forEach(item -> {
             ReviseLog reviseLog = new ReviseLog();
@@ -51,9 +64,76 @@
                     .setUpdateBy(loginUserId)
                     .setReviseCode(locRevise.getCode()) ;
             if (!reviseLogService.save(reviseLog)) {
-                throw new RuntimeException("璋冩暣鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
+                throw new CoolException("璋冩暣鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
             }
         });
+        locRevise.setExceStatus(CommonExceStatus.COMMON_EXCE_STATUS_UN_EXCE.val);
+
+        if (!locReviseService.updateById(locRevise)) {
+            throw new CoolException("鐘舵�佹洿鏂板け璐ワ紒锛�");
+        }
         return items;
     }
+
+    /**
+     * @author Ryan
+     * @date 2025/8/18
+     * @description: 纭璋冩暣搴撳瓨
+     * @version 1.0
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R complete(Long id, Long loginUserId) {
+        LocRevise revise = locReviseService.getById(id);
+        if (Objects.isNull(revise)) {
+            throw new CoolException("璋冩暣鍗曚笉瀛樺湪锛侊紒");
+        }
+        if (!revise.getExceStatus().equals(CommonExceStatus.COMMON_EXCE_STATUS_EXCE_ING.val)) {
+            throw new CoolException("鍗曟嵁鐘舵�佹湭鎵ц鎴栧凡瀹屾垚锛屾棤娉曟墽琛屽畬鎴愭搷浣滐紒锛�");
+        }
+        ReviseLog logs = reviseLogService.getOne(new LambdaQueryWrapper<ReviseLog>().eq(ReviseLog::getReviseId, revise.getId()));
+        if (Objects.isNull(logs)) {
+            throw new CoolException("搴撳瓨鏃ュ織涓嶅瓨鍦紒锛�");
+        }
+        List<ReviseLogItem> logItems = reviseLogItemService.list(new LambdaQueryWrapper<ReviseLogItem>().eq(ReviseLogItem::getReviseLogId, logs.getId()));
+        Map<Long, List<ReviseLogItem>> listMap = logItems.stream().collect(Collectors.groupingBy(ReviseLogItem::getLocId));
+        listMap.keySet().forEach(items -> {
+            Loc loc = locService.getById(items);
+            if (Objects.isNull(loc)) {
+                throw new CoolException("搴撲綅涓嶅瓨鍦紒锛�");
+            }
+            listMap.get(items).forEach(logItem -> {
+                LocItem one = locItemService.getOne(new LambdaQueryWrapper<LocItem>()
+                        .eq(LocItem::getMatnrId, logItem.getMatnrId())
+                        .eq(StringUtils.isNotBlank(logItem.getBatch()), LocItem::getBatch, logItem.getBatch())
+                        .eq(StringUtils.isNotBlank(logItem.getFieldsIndex()), LocItem::getFieldsIndex, logItem.getFieldsIndex())
+                        .eq(LocItem::getLocCode, logItem.getLocCode()));
+                if (Objects.isNull(one)) {
+                    LocItem locDetl = new LocItem();
+                    BeanUtils.copyProperties(logItem, locDetl);
+                    locDetl.setLocId(loc.getId())
+                            .setType(OrderType.ORDER_REVISE.type)
+                            .setLocCode(loc.getCode())
+                            .setAnfme(logItem.getReviseQty())
+                            .setUpdateBy(loginUserId)
+                            .setId(null)
+                            .setCreateBy(loginUserId);
+                    if (!locItemService.save(locDetl)) {
+                        throw new CoolException("搴撳瓨鏄庣粏淇濆瓨澶辫触锛侊紒");
+                    }
+                } else {
+                    one.setAnfme(logItem.getReviseQty());
+                    if (!locItemService.updateById(one)) {
+                        throw new CoolException("搴撳瓨鏄庣粏淇敼澶辫触锛侊紒");
+                    }
+                }
+            });
+        });
+
+        revise.setExceStatus(CommonExceStatus.COMMON_EXCE_STATUS_TASK_DONE.val);
+        if (!locReviseService.updateById(revise)) {
+            throw new CoolException("璋冩暣鍗曚慨鏀瑰け璐ワ紒锛�");
+        }
+        return R.ok();
+    }
 }

--
Gitblit v1.9.1