From 3fa423ef9c04a4d0c2adbda721cde7589371d559 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期五, 01 八月 2025 17:11:02 +0800
Subject: [PATCH] 库位明细修改

---
 rsf-admin/src/page/orders/asnOrder/AsnOrderEdit.jsx                                               |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewServiceImpl.java        |  218 ++++++++++++++++++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java        |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java |   30 +-
 rsf-admin/src/page/locPreview/index.jsx                                                           |    0 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java                  |    3 
 rsf-admin/src/page/locPreview/LocItemEdit.jsx                                                     |    2 
 rsf-admin/src/page/locPreview/LocQueryList.jsx                                                    |   33 +-
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocPreviewController.java      |  180 ++++++++++++++++++++
 rsf-admin/src/i18n/zh.js                                                                          |    2 
 rsf-admin/src/page/locPreview/LocItemList.jsx                                                     |   12 
 rsf-admin/src/page/orders/transfer/TransferEdit.jsx                                               |   17 +
 rsf-admin/src/i18n/en.js                                                                          |    2 
 rsf-admin/src/page/ResourceContent.js                                                             |    6 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewService.java            |   20 ++
 rsf-admin/src/page/locPreview/LocListAside.jsx                                                    |    0 
 16 files changed, 476 insertions(+), 57 deletions(-)

diff --git a/rsf-admin/src/i18n/en.js b/rsf-admin/src/i18n/en.js
index 44535ed..4c30e8a 100644
--- a/rsf-admin/src/i18n/en.js
+++ b/rsf-admin/src/i18n/en.js
@@ -189,7 +189,7 @@
         taskLog: 'TaskLog',
         orderItem: 'OrderItem',
         order: 'Order',
-        locItem: 'LocItem',
+        locPreview: 'LocItem',
         stock: 'Stock Manage',
         histories: 'Histories',
         wareWork: 'Warehouse Working',
diff --git a/rsf-admin/src/i18n/zh.js b/rsf-admin/src/i18n/zh.js
index b69562c..caa2ded 100644
--- a/rsf-admin/src/i18n/zh.js
+++ b/rsf-admin/src/i18n/zh.js
@@ -192,7 +192,7 @@
         taskItemLog: '浠诲姟鏄庣粏鍘嗗彶妗�',
         stock: '鍏ュ嚭搴撳巻鍙�',
         stockItem: '鍗曟嵁鏄庣粏',
-        locItem: '搴撲綅鏄庣粏',
+        locPreview: '搴撲綅鏄庣粏',
         histories: '鍘嗗彶妗�',
         wareWork: '浠撳簱浣滀笟',
         statistics: '搴撳瓨鏌ヨ',
diff --git a/rsf-admin/src/page/ResourceContent.js b/rsf-admin/src/page/ResourceContent.js
index bccaf3d..dcd570c 100644
--- a/rsf-admin/src/page/ResourceContent.js
+++ b/rsf-admin/src/page/ResourceContent.js
@@ -45,7 +45,7 @@
 import outStock from "./orders/outStock";
 import deviceBind from "./deviceBind";
 import wave from "./orders/wave";
-import locItem from "./locItem";
+import locPreview from "./locPreview";
 import basStation from "./basicInfo/basStation";
 import warehouseStock from "./statistics/stockManage";
 import basContainer from "./basicInfo/basContainer";
@@ -144,8 +144,8 @@
       return deviceBind;
     case "wave":
       return wave;
-    case "locItem":
-      return locItem;
+    case "locPreview":
+      return locPreview;
     case "basStation":
       return basStation;
     case "basContainer":
diff --git a/rsf-admin/src/page/locItem/LocItemEdit.jsx b/rsf-admin/src/page/locPreview/LocItemEdit.jsx
similarity index 98%
rename from rsf-admin/src/page/locItem/LocItemEdit.jsx
rename to rsf-admin/src/page/locPreview/LocItemEdit.jsx
index 55686cf..11d78da 100644
--- a/rsf-admin/src/page/locItem/LocItemEdit.jsx
+++ b/rsf-admin/src/page/locPreview/LocItemEdit.jsx
@@ -55,8 +55,6 @@
     return (
         <>
             <Edit
-                redirect="list"
-                resource="locItem"
                 mutationMode={EDIT_MODE}
                 actions={<CustomerTopToolBar />}
                 aside={<EditBaseAside />}
diff --git a/rsf-admin/src/page/locItem/LocItemList.jsx b/rsf-admin/src/page/locPreview/LocItemList.jsx
similarity index 96%
rename from rsf-admin/src/page/locItem/LocItemList.jsx
rename to rsf-admin/src/page/locPreview/LocItemList.jsx
index 69f7261..e00a57d 100644
--- a/rsf-admin/src/page/locItem/LocItemList.jsx
+++ b/rsf-admin/src/page/locPreview/LocItemList.jsx
@@ -157,23 +157,23 @@
                         }),
                     marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
-                storeKey="locItem"
-                resource="loc/items"
-                title={"menu.locItem"}
+                storeKey="locPreview"
+                resource="loc/preview"
+                title={"menu.locPreview"}
                 empty={false}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
-                        {/* <SelectColumnsButton preferenceKey='loc' /> */}
+                        <SelectColumnsButton preferenceKey='loc' />
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
                 aside={<LocListAside />}
             >
                 <StyledDatagrid
-                    preferenceKey='locItem'
+                    preferenceKey='locPreview'
                     align="left"
                     bulkActionButtons={false}
                     rowClick={() => false}
@@ -200,7 +200,7 @@
                     <BooleanField source="statusBool" label="common.field.status" sortable={false} align="left" />
                     <TextField source="memo" label="common.field.memo" sortable={false} />
                     <WrapperField cellClassName="opt" label="common.field.opt">
-                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} resource="locItem" label="toolbar.detail" />
+                        <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} label="toolbar.detail" />
                     </WrapperField>
                 </StyledDatagrid>
             </List>
diff --git a/rsf-admin/src/page/locItem/LocListAside.jsx b/rsf-admin/src/page/locPreview/LocListAside.jsx
similarity index 100%
rename from rsf-admin/src/page/locItem/LocListAside.jsx
rename to rsf-admin/src/page/locPreview/LocListAside.jsx
diff --git a/rsf-admin/src/page/locItem/LocQueryList.jsx b/rsf-admin/src/page/locPreview/LocQueryList.jsx
similarity index 94%
rename from rsf-admin/src/page/locItem/LocQueryList.jsx
rename to rsf-admin/src/page/locPreview/LocQueryList.jsx
index 64efb9d..6103c42 100644
--- a/rsf-admin/src/page/locItem/LocQueryList.jsx
+++ b/rsf-admin/src/page/locPreview/LocQueryList.jsx
@@ -1,5 +1,4 @@
 import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
-import { useNavigate } from 'react-router-dom';
 import {
     List,
     DatagridConfigurable,
@@ -34,10 +33,11 @@
     DeleteButton,
     useGetRecordId,
 } from 'react-admin';
-import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material';
-import { styled } from '@mui/material/styles';
-import PageDrawer from "../components/PageDrawer";
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
+import { Box, Typography, Card, Stack, LinearProgress } from '@mui/material';
+import PageDrawer from "../components/PageDrawer";
+import { useNavigate } from 'react-router-dom';
+import { styled } from '@mui/material/styles';
 import request from '@/utils/request';
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
@@ -53,10 +53,10 @@
         width: 100
     },
     '& .MuiTableCell-root': {
-    whiteSpace: 'nowrap',
-    overflow: 'visible',
-    textOverflow: 'unset'
-  }
+        whiteSpace: 'nowrap',
+        overflow: 'visible',
+        textOverflow: 'unset'
+    }
 }));
 
 const filters = [
@@ -95,9 +95,9 @@
 ]
 
 const LocItemList = () => {
-    const translate = useTranslate();
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
+    const translate = useTranslate();
     const locId = useGetRecordId();
 
     return (
@@ -111,15 +111,15 @@
                         }),
                     marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                 }}
-                title={"menu.locItem"}
+                title={"menu.locPreview"}
                 empty={false}
-                filter={{locId: locId}}
+                filter={{ locId: locId }}
                 filters={filters}
                 sort={{ field: "create_time", order: "desc" }}
                 actions={(
                     <TopToolbar>
                         <FilterButton />
-                        <SelectColumnsButton preferenceKey='locItem' />
+                        <SelectColumnsButton preferenceKey='locPreview' />
                     </TopToolbar>
                 )}
                 perPage={DEFAULT_PAGE_SIZE}
@@ -140,11 +140,12 @@
 
 
 const DynamicFields = (props) => {
-    const translate = useTranslate();
-    const notify = useNotify();
     const [columns, setColumns] = useState([]);
     const { isLoading } = useListContext();
+    const translate = useTranslate();
     const refresh = useRefresh();
+    const notify = useNotify();
+
     useEffect(() => {
         getDynamicFields();
     }, []);
@@ -205,12 +206,12 @@
             )}
             {columns.length > 0 &&
                 <StyledDatagrid
-                    preferenceKey='locItem'
+                    preferenceKey='locPreview'
                     bulkActionButtons={false}
                     rowClick={false}
                     expand={false}
                     expandSingle={true}
-                    omit={['id', 'createTime','spec', 'model', 'locId', 'orderId', 'trackCode', 'orderItemId', 'matnrId', 'splrBatch','createBy$', 'memo', 'fieldsIndex','statusBool']}
+                    omit={['id', 'createTime', 'spec', 'model', 'locId', 'orderId', 'trackCode', 'orderItemId', 'matnrId', 'splrBatch', 'createBy$', 'memo', 'fieldsIndex', 'statusBool']}
                 >
                     {columns.map((column) => column)}
                 </StyledDatagrid>}
diff --git a/rsf-admin/src/page/locItem/index.jsx b/rsf-admin/src/page/locPreview/index.jsx
similarity index 100%
rename from rsf-admin/src/page/locItem/index.jsx
rename to rsf-admin/src/page/locPreview/index.jsx
diff --git a/rsf-admin/src/page/orders/asnOrder/AsnOrderEdit.jsx b/rsf-admin/src/page/orders/asnOrder/AsnOrderEdit.jsx
index bb1e884..9a86482 100644
--- a/rsf-admin/src/page/orders/asnOrder/AsnOrderEdit.jsx
+++ b/rsf-admin/src/page/orders/asnOrder/AsnOrderEdit.jsx
@@ -47,7 +47,7 @@
                 <SimpleForm
                     shouldUnregister
                     warnWhenUnsavedChanges
-                    toolbar={<FormToolbar />}
+                    toolbar={false}
                     mode="onTouched"
                     defaultValues={{}}
                 >
diff --git a/rsf-admin/src/page/orders/transfer/TransferEdit.jsx b/rsf-admin/src/page/orders/transfer/TransferEdit.jsx
index bc709f9..a12c97d 100644
--- a/rsf-admin/src/page/orders/transfer/TransferEdit.jsx
+++ b/rsf-admin/src/page/orders/transfer/TransferEdit.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.js";
+
 import { EDIT_MODE, REFERENCE_INPUT_PAGESIZE } from "@/config/setting.js";
-import EditBaseAside from "../../components/EditBaseAside.jsx";
-import CustomerTopToolBar from "../../components/EditTopToolBar.jsx";
-import MemoInput from "../../components/MemoInput.jsx";
 import StatusSelectInput from "../../components/StatusSelectInput.jsx";
+import CustomerTopToolBar from "../../components/EditTopToolBar.jsx";
+import EditBaseAside from "../../components/EditBaseAside.jsx";
+import { Stack, Grid, Box, Typography } from "@mui/material";
+import { useWatch, useFormContext } from "react-hook-form";
+import MemoInput from "../../components/MemoInput.jsx";
 import TransferItemList from "./TransferItemList.jsx";
+import * as Common from "@/utils/common.js";
 
 const FormToolbar = () => {
   const { getValues } = useFormContext();
@@ -92,7 +93,7 @@
                   autoFocus
                   readOnly
                 />
-                <NumberInput label="table.field.transfer.type" source="type" readOnly/>
+                <TextInput label="table.field.transfer.type" source="type$" readOnly/>
                 <SelectInput
                   label="table.field.transfer.source"
                   source="source"
@@ -106,7 +107,7 @@
                 />
                 <SelectInput
                   label="table.field.transfer.exceStatus"
-                  source="exceStatus"
+                  source="exceStatus$"
                   readOnly
                   choices={[
                     { id: 0, name: "鏈墽琛�" },
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocPreviewController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocPreviewController.java
new file mode 100644
index 0000000..f9d4673
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocPreviewController.java
@@ -0,0 +1,180 @@
+package com.vincent.rsf.server.manager.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.common.annotation.OperationLog;
+import com.vincent.rsf.server.common.domain.BaseParam;
+import com.vincent.rsf.server.common.domain.KeyValVo;
+import com.vincent.rsf.server.common.domain.PageParam;
+import com.vincent.rsf.server.common.utils.ExcelUtil;
+import com.vincent.rsf.server.manager.controller.params.LocMastInitParam;
+import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
+import com.vincent.rsf.server.manager.entity.Loc;
+import com.vincent.rsf.server.manager.enums.LocStsType;
+import com.vincent.rsf.server.manager.service.LocService;
+import com.vincent.rsf.server.system.controller.BaseController;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.transaction.annotation.Transactional;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.Valid;
+import java.util.*;
+import java.util.stream.Collectors;
+
+
+@Api(tags = "搴撲綅淇℃伅")
+@RestController
+public class LocPreviewController extends BaseController {
+
+    @Autowired
+    private LocService locService;
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @PostMapping("/loc/preview/page")
+    public R page(@RequestBody Map<String, Object> map) {
+        BaseParam baseParam = buildParam(map, BaseParam.class);
+        PageParam<Loc, BaseParam> pageParam = new PageParam<>(baseParam, Loc.class);
+        List<String> list = new ArrayList<>();
+        list.add("row");
+        list.add("col");
+        list.add("lev");
+        return R.ok().add(locService.page(pageParam, pageParam.buildWrapper(true,list)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @PostMapping("/loc/preview/list")
+    public R list(@RequestBody Map<String, Object> map) {
+        return R.ok().add(locService.list());
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @PostMapping("/loc/preview/areaNoUse/list")
+    public R areaNoUselist(@RequestBody Map<String, Object> map) {
+        String locCode = map.get("locCode").toString();
+        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, locCode),false);
+        List<Loc> list = locService.list(new LambdaQueryWrapper<Loc>()
+                .eq(Loc::getAreaId, loc.getAreaId())
+                .eq(Loc::getChannel,loc.getChannel())
+                .eq(Loc::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
+        );
+        List<String> list1 = list.stream().map(obj -> obj.getCode()).collect(Collectors.toList());
+        return R.ok(list1);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @PostMapping({"/loc/preview/many/{ids}", "/loc/preview/many/{ids}"})
+    public R many(@PathVariable Long[] ids) {
+        return R.ok().add(locService.listByIds(Arrays.asList(ids)));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @GetMapping("/loc/preview/{id}")
+    public R get(@PathVariable("id") Long id) {
+        return R.ok().add(locService.getById(id));
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:save')")
+    @OperationLog("Create 搴撲綅淇℃伅琛�")
+    @PostMapping("/loc/preview/save")
+    public R save(@RequestBody Loc loc) {
+        if (Objects.isNull(loc.getWarehouseId())) {
+            throw new CoolException("浠撳簱ID涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(loc.getAreaId())) {
+            throw new CoolException("浠撳簱ID涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(loc.getTypeIds())) {
+            throw new CoolException("搴撲綅绫诲瀷涓嶈兘涓虹┖锛侊紒");
+        }
+        String join = StringUtils.join(loc.getTypeIds(), ",");
+        loc.setType(join);
+        loc.setCreateBy(getLoginUserId());
+        loc.setUpdateBy(getLoginUserId());
+        if (!locService.save(loc)) {
+            return R.error("Save Fail");
+        }
+
+        if (!locService.saveType(loc)) {
+            throw new CoolException("搴撲綅绫诲瀷鍏宠仈鍏崇郴淇濆瓨澶辫触锛侊紒");
+        }
+        return R.ok("Save Success").add(loc);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:update')")
+    @OperationLog("Update 搴撲綅淇℃伅琛�")
+    @PostMapping("/loc/preview/update")
+    @Transactional(rollbackFor = Exception.class)
+    public R update(@RequestBody Loc loc) {
+        loc.setUpdateBy(getLoginUserId());
+        String join = StringUtils.join(loc.getTypeIds(), ",");
+        loc.setType(join);
+        if (Objects.isNull(loc.getTypeIds())) {
+            throw new CoolException("搴撲綅绫诲瀷涓嶈兘涓虹┖锛侊紒");
+        }
+        if (!locService.updateById(loc)) {
+            return R.error("Update Fail");
+        }
+        if (!locService.updateLoc(loc)) {
+            throw new CoolException("搴撲綅绫诲瀷鍏宠仈鍏崇郴淇敼澶辫触!锛�");
+        }
+        return R.ok("Update Success").add(loc);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:remove')")
+    @OperationLog("Delete 搴撲綅淇℃伅琛�")
+    @PostMapping("/loc/preview/remove/{ids}")
+    public R remove(@PathVariable Long[] ids) {
+        if (!locService.removeByIds(Arrays.asList(ids))) {
+            return R.error("Delete Fail");
+        }
+        return R.ok("Delete Success").add(ids);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @PostMapping("/loc/preview/query")
+    public R query(@RequestParam(required = false) String condition) {
+        List<KeyValVo> vos = new ArrayList<>();
+        LambdaQueryWrapper<Loc> wrapper = new LambdaQueryWrapper<>();
+        if (!Cools.isEmpty(condition)) {
+            wrapper.like(Loc::getCode, condition);
+        }
+        locService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
+                item -> vos.add(new KeyValVo(item.getId(), item.getCode()))
+        );
+        return R.ok().add(vos);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:list')")
+    @ApiOperation("搴撲綅瀵煎嚭")
+    @PostMapping("/loc/preview/export")
+    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+        List<Loc> locs = new ArrayList<>();
+        if (Objects.isNull(map.get("ids"))) {
+            locs = locService.list();
+        } else {
+            locs = locService.list(new LambdaQueryWrapper<Loc>().eq(Loc::getStatus, 1));
+        }
+        ExcelUtil.build(ExcelUtil.create(locs, Loc.class), response);
+    }
+
+    @PreAuthorize("hasAuthority('manager:locPreview:update')")
+    @ApiOperation("搴撲綅鎵归噺淇敼")
+    @PostMapping("/loc/preview/modify")
+    public R batchUpdate(@RequestBody LocModifyParams locs) {
+        if (Objects.isNull(locs)) {
+            throw new CoolException("鍙備负涓嶈兘涓虹┖锛侊紒");
+        }
+        return locService.modifyLocs(locs);
+    }
+
+
+
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java
index cde90ee..9a2c374 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java
@@ -156,7 +156,7 @@
     @ApiOperation("鍗曟嵁淇℃伅淇敼")
     @PostMapping("/transfer/items/update")
     @PreAuthorize("hasAuthority('manager:transfer:update')")
-    public R orderAndrItemUpdate(@RequestBody TransferItemParams params) throws Exception {
+    public R orderAndrItemUpdate(@RequestBody TransferItemParams params) {
         if (Objects.isNull(params)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
@@ -167,7 +167,7 @@
     @ApiOperation("鑾峰彇鍘熷簱鍖虹墿鏂欎俊鎭�")
     @PostMapping("/transfer/locs/items")
     @PreAuthorize("hasAuthority('manager:transfer:list')")
-    public R locsPage(@RequestBody OrgLocParams params) throws Exception {
+    public R locsPage(@RequestBody OrgLocParams params) {
         if (Objects.isNull(params)) {
             return R.error("鍙傛暟涓嶈兘涓虹┖锛侊紒");
         }
@@ -184,7 +184,7 @@
     @PostMapping("/transfer/template/download")
     @ApiOperation("涓嬭浇鐩樼偣鍗曟ā鏉�")
     @PreAuthorize("hasAuthority('manager:transfer:update')")
-    public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
+    public void downloadTemplate(@RequestBody Map<String, Object> map, HttpServletResponse response) {
         CheckOrderTemplate template = ExcelUtil.mockData(CheckOrderTemplate.class);
         List<CheckOrderTemplate> list = Arrays.asList(template);
         ExcelUtil.build(ExcelUtil.create(list, CheckOrderTemplate.class, true), response);
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewService.java
new file mode 100644
index 0000000..32675a0
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewService.java
@@ -0,0 +1,20 @@
+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.LocMastInitParam;
+import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
+import com.vincent.rsf.server.manager.entity.Loc;
+
+public interface LocPreviewService extends IService<Loc> {
+
+    R modifyLocs(LocModifyParams locs);
+
+    R initLocs(LocMastInitParam param, Long loginUserId);
+
+    boolean saveType(Loc typeIds);
+
+    boolean updateLoc(Loc loc);
+
+    R batchBindLocs(LocModifyParams locs);
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewServiceImpl.java
new file mode 100644
index 0000000..4ca756f
--- /dev/null
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocPreviewServiceImpl.java
@@ -0,0 +1,218 @@
+package com.vincent.rsf.server.manager.service;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.vincent.rsf.framework.common.Cools;
+import com.vincent.rsf.framework.common.R;
+import com.vincent.rsf.framework.exception.CoolException;
+import com.vincent.rsf.server.manager.controller.params.LocMastInitParam;
+import com.vincent.rsf.server.manager.controller.params.LocModifyParams;
+import com.vincent.rsf.server.manager.entity.*;
+import com.vincent.rsf.server.manager.mapper.LocMapper;
+import com.vincent.rsf.server.manager.mapper.LocTypeRelaMapper;
+import com.vincent.rsf.server.manager.utils.Shelves;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+@Service("locPreviewService")
+public class LocPreviewServiceImpl extends ServiceImpl<LocMapper, Loc> implements LocPreviewService {
+
+    @Autowired
+    private WarehouseAreasService warehouseAreasService;
+
+    @Autowired
+    private LocTypeRelaService locTypeRelaService;
+
+    @Autowired
+    private LocAreaRelaService locAreaRelaService;
+
+    @Autowired
+    private LocAreaService locAreaService;
+
+    @Autowired
+    private LocTypeRelaMapper locTypeRelaMapper;
+
+    @Override
+    public R modifyLocs(LocModifyParams locs) {
+        if (locs.getId().isEmpty()) {
+            throw new CoolException("搴撲綅ID涓嶈兘涓虹┖锛侊紒");
+        }
+        Loc loc = locs.getLoc();
+
+        if (Objects.isNull(loc)) {
+            throw new CoolException("淇敼搴撲綅淇℃伅涓嶈兘涓虹┖锛侊紒");
+        }
+
+        String join = loc.getType();
+        if (!Objects.isNull(loc.getTypeIds()) && !loc.getTypeIds().isEmpty()) {
+             join = StringUtils.join(loc.getTypeIds(), ",");
+        }
+        boolean update = this.update(new LambdaUpdateWrapper<Loc>()
+                .in(Loc::getId, locs.getId())
+                .eq(Loc::getStatus, 1)
+                .set(!Objects.isNull(loc.getAreaId()), Loc::getAreaId, loc.getAreaId())
+                .set(!Objects.isNull(loc.getWarehouseId()), Loc::getWarehouseId, loc.getWarehouseId())
+                .set(!Objects.isNull(loc.getUseStatus()), Loc::getUseStatus, loc.getUseStatus())
+                .set(!Objects.isNull(loc.getTypeIds()) && !loc.getTypeIds().isEmpty(), Loc::getType, join)
+                .set(!Objects.isNull(loc.getLength()), Loc::getLength, loc.getLength())
+                .set(!Objects.isNull(loc.getWidth()), Loc::getWidth, loc.getWidth())
+                .set(!Objects.isNull(loc.getHeight()), Loc::getHeight, loc.getHeight())
+                .set(!Objects.isNull(loc.getChannel()), Loc::getChannel, loc.getChannel())
+                .set(!Objects.isNull(loc.getFlagLabelMange()), Loc::getFlagLabelMange, loc.getFlagLabelMange())
+                .set(!Objects.isNull(loc.getStatus()), Loc::getStatus, loc.getStatus()));
+        if (!update) {
+            throw new CoolException("搴撲綅淇℃伅淇敼澶辫触锛侊紒");
+        }
+
+        return R.ok(loc);
+    }
+
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public R initLocs(LocMastInitParam param, Long loginUserId) {
+        //娓呯┖琛�
+//        this.baseMapper.deleteAll();
+        //娓呯┖褰撳墠搴撳尯搴撲綅
+        List<Loc> locs = this.list(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, param.getWarehouseId()).eq(Loc::getAreaId, param.getAreaId()));
+        if (!locs.isEmpty()) {
+            if (!this.remove(new LambdaQueryWrapper<Loc>().eq(Loc::getWarehouseId, param.getWarehouseId()).eq(Loc::getAreaId, param.getAreaId()))) {
+                throw new CoolException("鍒濆鍖栧け璐ワ細鏁版嵁鍒犻櫎澶辫触锛侊紒");
+            }
+        }
+        WarehouseAreas warehouseAreas = warehouseAreasService.getOne(new LambdaQueryWrapper<WarehouseAreas>()
+                .eq(WarehouseAreas::getWarehouseId, param.getWarehouseId())
+                .eq(WarehouseAreas::getId, param.getAreaId()));
+        if (Objects.isNull(warehouseAreas)) {
+            throw new CoolException("搴撳尯涓嶅瓨鍦紒锛�");
+        }
+        String join = StringUtils.join(param.getTypeIds(), ",");
+
+        String[] split = warehouseAreas.getCode().split("\\.");
+        if (split.length == 0){
+            throw new CoolException("搴撳尯缂栫爜閿欒锛侊紒");
+        }
+        StringBuilder locStar = new StringBuilder();
+        for (int i = 0; i < split.length; i++) {
+            locStar.append(split[i]).append("-");
+        }
+
+        List<Loc> list = new ArrayList<>();
+        Integer chanl = 0; //榛樿绗竴宸烽亾
+        for (int r = param.getStartRow(); r <= param.getEndRow(); r++) {
+            try{
+                Shelves shelves = new Shelves(param.getEndRow() - param.getStartRow() + 1, param.getChannel(),param.getStartRow());
+                for (List<Integer> node : shelves.nodes){
+                    if (node.contains(r)) {
+                        if (!Cools.isEmpty(param.getStartChannel()) && param.getStartChannel() > 0){
+                            chanl = shelves.nodes.indexOf(node) + param.getStartChannel();
+                        }else {
+                            chanl = shelves.nodes.indexOf(node) + 1;
+                        }
+                        break;
+                    }
+                }
+            }catch (Exception e){
+                throw new CoolException("瑙f瀽宸烽亾鍙峰け璐�");
+            }
+            for (int b = param.getStartBay(); b <= param.getEndBay(); b++) {
+                for (int l = param.getStartLev(); l <= param.getEndLev(); l++) {
+                    // 鑾峰彇搴撲綅鍙�
+                    String locNo = locStar +  String.format("%d", r) + String.format("-%d", b) + String.format("-%d", l);
+                    Loc loc = new Loc();
+                    loc.setCode(locNo)
+                            .setUseStatus("O")
+                            .setRow(r)
+                            .setCol(b)
+                            .setLev(l)
+                            .setChannel(chanl)
+                            .setType(join)
+                            .setAreaId(param.getAreaId())
+                            .setUpdateBy(loginUserId)
+                            .setCreateBy(loginUserId)
+                            .setWarehouseId(warehouseAreas.getWarehouseId());
+                    list.add(loc);
+                }
+            }
+        }
+
+        if (!this.saveBatch(list)) {
+            throw new CoolException("搴撲綅鍒濆鍖栧け璐ワ紒锛�");
+        }
+        List<LocTypeRela> locTypeRelas = new ArrayList<>();
+        for (Long typeId : param.getTypeIds()) {
+            for (Loc loc : list) {
+                LocTypeRela typeRela = new LocTypeRela();
+                typeRela.setLocId(loc.getId()).setTypeId(typeId);
+                locTypeRelas.add(typeRela);
+            }
+        }
+        if (!locTypeRelaService.saveBatch(locTypeRelas)) {
+            throw new CoolException("搴撲綅绫诲瀷鍏宠仈澶辫触锛侊紒");
+        }
+        return R.ok("鍒濆鍖栨垚鍔燂紒锛�");
+    }
+
+    @Override
+    public boolean saveType(Loc loc) {
+        List<LocTypeRela> relas =  new ArrayList<>();
+        loc.getTypeIds().forEach(id -> {
+            LocTypeRela typeRela = new LocTypeRela();
+            typeRela.setTypeId(id)
+                    .setLocId(loc.getId());
+            relas.add(typeRela);
+        });
+        if (!locTypeRelaService.saveOrUpdateBatch(relas)) {
+            throw new CoolException("搴撲綅鍏宠仈鍏崇郴淇濆瓨澶辫触锛侊紒");
+        }
+        return true;
+    }
+
+    @Override
+    public boolean updateLoc(Loc loc) {
+        locTypeRelaMapper.delete(new LambdaQueryWrapper<LocTypeRela>().eq(LocTypeRela::getLocId, loc.getId()));
+        List<LocTypeRela> relas =  new ArrayList<>();
+        loc.getTypeIds().forEach(id -> {
+            LocTypeRela typeRela = new LocTypeRela();
+            typeRela.setTypeId(id)
+                    .setLocId(loc.getId());
+            relas.add(typeRela);
+        });
+        if (!locTypeRelaService.saveOrUpdateBatch(relas)) {
+            throw new CoolException("搴撲綅鍏宠仈鍏崇郴淇濆瓨澶辫触锛侊紒");
+        }
+        return true;
+    }
+
+    @Override
+    public R batchBindLocs(LocModifyParams locs) {
+        if (locs.getId().isEmpty()) {
+            throw new CoolException("搴撲綅ID涓嶈兘涓虹┖锛侊紒");
+        }
+        if (Objects.isNull(locs.getLocAreaId())) {
+            throw new CoolException("淇敼搴撲綅淇℃伅涓嶈兘涓虹┖锛侊紒");
+        }
+        List<LocArea> locAreas = locAreaService.list(new LambdaQueryWrapper<LocArea>().eq(LocArea::getId, locs.getLocAreaId()));
+        if (locAreas.isEmpty()) {
+            throw new CoolException("搴撲綅鍒嗗尯涓嶅瓨鍦紒锛�");
+        }
+        List<LocAreaRela> relas = new ArrayList<>();
+        locs.getId().forEach(id -> {
+            LocAreaRela locAreaRela = new LocAreaRela();
+            locAreaRela.setLocId(id)
+                    .setLocAreaId(locs.getLocAreaId());
+            relas.add(locAreaRela);
+        });
+        if (!locAreaRelaService.saveBatch(relas)) {
+            throw new CoolException("搴撲綅鍒嗗尯澶辫触锛侊紒");
+        }
+
+        return R.ok();
+    }
+}
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java
index 0a56217..7d9b618 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferItemServiceImpl.java
@@ -48,21 +48,21 @@
         if (Objects.isNull(wkOrderItem.getAnfme()) || Double.compare(wkOrderItem.getAnfme(), 0.0) <= 0) {
             throw new CoolException("璁″垝鏁颁笉鑳戒负绌猴紒锛�");
         }
-        //淇濆瓨鎵╁睍瀛楁
-        try {
-            StringBuffer sb = new StringBuffer();
-            if (Objects.isNull(wkOrderItem.getFieldsIndex()) || StringUtils.isBlank(wkOrderItem.getFieldsIndex())) {
-                sb.append(wkOrderItem.getMatnrId() + wkOrderItem.getBatch() );
-                //鑾峰彇16浣島uid
-                String uuid16 = Cools.md5Chinese(sb.toString());
-                wkOrderItem.setFieldsIndex(uuid16);
-                params.put("index", uuid16);
-            }
-            //淇濆瓨鎴栨洿鏂板姩鎬佸瓧娈靛��
-            FieldsUtils.updateFieldsValue(params);
-        } catch (Exception e) {
-            throw new RuntimeException(e);
-        }
+//        //淇濆瓨鎵╁睍瀛楁
+//        try {
+//            StringBuffer sb = new StringBuffer();
+//            if (Objects.isNull(wkOrderItem.getFieldsIndex()) || StringUtils.isBlank(wkOrderItem.getFieldsIndex())) {
+//                sb.append(wkOrderItem.getMatnrId() + wkOrderItem.getBatch());
+//                //鑾峰彇16浣島uid
+//                String uuid16 = Cools.md5Chinese(sb.toString());
+//                wkOrderItem.setFieldsIndex(uuid16);
+//                params.put("index", uuid16);
+//            }
+//            //淇濆瓨鎴栨洿鏂板姩鎬佸瓧娈靛��
+//            FieldsUtils.updateFieldsValue(params);
+//        } catch (Exception e) {
+//            throw new RuntimeException(e);
+//        }
         wkOrderItem.setUpdateBy(loginUserId).setCreateBy(loginUserId);
         if (!this.saveOrUpdate(wkOrderItem)) {
             throw new CoolException("鏀惰揣閫氱煡鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
index ccad70d..5bda303 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
@@ -11,6 +11,7 @@
 import com.vincent.rsf.server.manager.enums.WaveRuleType;
 import com.vincent.rsf.server.manager.service.*;
 import com.vincent.rsf.server.manager.enums.LocStsType;
+import org.apache.commons.lang3.StringUtils;
 
 import javax.swing.*;
 import java.math.BigDecimal;
@@ -65,7 +66,7 @@
     public static List<LocItem> getEfficiencyFirstItemList(String matnrCode, String splrBatch, Double anfme) {
         LambdaQueryWrapper<LocItem> locItemQueryWrapper = new LambdaQueryWrapper<>();
         locItemQueryWrapper.eq(LocItem::getMatnrCode, matnrCode);
-        locItemQueryWrapper.eq(LocItem::getBatch, splrBatch);
+        locItemQueryWrapper.eq(StringUtils.isNotBlank(splrBatch), LocItem::getBatch, splrBatch);
         String applySql = String.format(
                 "EXISTS (SELECT 1 FROM man_loc ml " +
                         "WHERE ml.use_status = '%s'" +

--
Gitblit v1.9.1