From 474103da0c9793ec9cd7559f109491ece282e269 Mon Sep 17 00:00:00 2001
From: skyouc
Date: 星期一, 28 七月 2025 17:03:16 +0800
Subject: [PATCH] 调拔单功能优化

---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java |   80 +++++++++++++++++++++++---
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java    |   12 ++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java    |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java          |    2 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java              |   24 ++++++++
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckExceStatus.java            |    2 
 rsf-admin/src/page/orders/transfer/TransferList.jsx                                           |   38 +++++++++++-
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderType.java                  |    1 
 rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java              |    7 ++
 rsf-admin/src/page/orders/transfer/TransferOrders.jsx                                         |    4 
 10 files changed, 153 insertions(+), 19 deletions(-)

diff --git a/rsf-admin/src/page/orders/transfer/TransferList.jsx b/rsf-admin/src/page/orders/transfer/TransferList.jsx
index 8bce57d..46a80ea 100644
--- a/rsf-admin/src/page/orders/transfer/TransferList.jsx
+++ b/rsf-admin/src/page/orders/transfer/TransferList.jsx
@@ -20,9 +20,11 @@
     TextField,
     NumberField,
     DateField,
+    useRefresh,
     BooleanField,
     ReferenceField,
     TextInput,
+    Button,
     DateTimeInput,
     DateInput,
     SelectInput,
@@ -33,18 +35,22 @@
     DeleteButton,
 } from 'react-admin';
 import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting.js';
+import { Box, Typography, Card, Stack, } from '@mui/material';
 import MyCreateButton from "../../components/MyCreateButton.jsx";
 import MyExportButton from '../../components/MyExportButton.jsx';
 import PageEditDrawer from "../../components/PageEditDrawer";
-import { Box, Typography, Card, Stack } from '@mui/material';
+import ConfirmButton from '../../components/ConfirmButton';
 import PageDrawer from "../../components/PageDrawer.jsx";
 import EmptyData from "../../components/EmptyData.jsx";
+import AddTaskIcon from '@mui/icons-material/AddTask';
 import MyField from "../../components/MyField.jsx";
+import TransferOrders from "./TransferOrders.jsx";
 import TransferCreate from "./TransferCreate.jsx";
-import { styled } from '@mui/material/styles';
-import TransferPanel from "./TransferPanel.jsx";
-import * as Common from '@/utils/common.js';
 import ManualCreate from "./ManualCreate.jsx";
+import { styled } from '@mui/material/styles';
+import * as Common from '@/utils/common.js';
+import request from '@/utils/request';
+
 
 const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
     '& .css-1vooibu-MuiSvgIcon-root': {
@@ -105,6 +111,7 @@
     const translate = useTranslate();
     const [createDialog, setCreateDialog] = useState(false);
     const [drawerVal, setDrawerVal] = useState(false);
+    const [select, setSelect] = useState({});
 
     return (
         <Box display="flex">
@@ -135,7 +142,7 @@
                     preferenceKey='transfer'
                     bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                     rowClick={(id, resource, record) => false}
-                    expand={() => <TransferPanel />}
+                    expand={() => <TransferOrders />}
                     expandSingle={true}
                     omit={['id', 'createTime', 'createBy$', 'memo', 'orgWareId', 'tarWareId', 'orgAreaId', 'tarAreaId']}
                 >
@@ -160,6 +167,7 @@
                     <WrapperField cellClassName="opt" label="common.field.opt">
                         <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                         <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
+                        <PublicButton setDrawerVal={setDrawerVal} drawerVal={drawerVal} setSelect={setSelect} />
                     </WrapperField>
                 </StyledDatagrid>
             </List>
@@ -175,3 +183,23 @@
 }
 
 export default TransferList;
+
+//涓嬪彂鎵ц
+const PublicButton = ({ setDrawerVal, setSelect }) => {
+    const record = useRecordContext();
+    const refresh = useRefresh();
+    const taskEvent = async () => {
+        const { data: { code, data, msg } } = await request.post(`/transfer/pub/outStock`, record);
+        if (code === 200) {
+            notify(msg);
+            refresh()
+        } else {
+            notify(msg);
+        }
+        refresh();
+    }
+
+    return (
+        <ConfirmButton label={"toolbar.publicWorking"} startIcon={<AddTaskIcon />} onConfirm={taskEvent} size={"small"} />
+    )
+}
diff --git a/rsf-admin/src/page/orders/transfer/TransferPanel.jsx b/rsf-admin/src/page/orders/transfer/TransferOrders.jsx
similarity index 98%
rename from rsf-admin/src/page/orders/transfer/TransferPanel.jsx
rename to rsf-admin/src/page/orders/transfer/TransferOrders.jsx
index 5d3abe4..8d58600 100644
--- a/rsf-admin/src/page/orders/transfer/TransferPanel.jsx
+++ b/rsf-admin/src/page/orders/transfer/TransferOrders.jsx
@@ -39,7 +39,7 @@
     },
 }));
 
-const TransferPanel = () => {
+const TransferOrders = () => {
     const record = useRecordContext();
     if (!record) return null;
     const translate = useTranslate();
@@ -95,4 +95,4 @@
     );
 };
 
-export default TransferPanel;
+export default TransferOrders;
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
index 138a4f0..8e6ff49 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -58,7 +58,7 @@
         BaseParam baseParam = buildParam(map, BaseParam.class);
         PageParam<WkOrder, BaseParam> pageParam = new PageParam<>(baseParam, WkOrder.class);
         QueryWrapper<WkOrder> queryWrapper = pageParam.buildWrapper(true);
-        List<String> list = Arrays.asList(OrderType.ORDER_OUT.type);
+        List<String> list = Arrays.asList(OrderType.ORDER_OUT.type, OrderType.ORDER_TRANSFER.type);
         queryWrapper.in("type", list);
         return R.ok().add(outStockService.page(pageParam, queryWrapper));
     }
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 fd23a4e..dcc9f81 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
@@ -4,6 +4,7 @@
 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.utils.ExcelUtil;
 import com.vincent.rsf.server.common.annotation.OperationLog;
 import com.vincent.rsf.server.common.domain.BaseParam;
@@ -41,6 +42,7 @@
         return R.ok().add(transferService.page(pageParam, pageParam.buildWrapper(true)));
     }
 
+    @ApiOperation("鑾峰彇璋冩嫈鍗曞叧鑱旇鍗�")
     @PreAuthorize("hasAuthority('manager:transfer:list')")
     @PostMapping("/transfer/orders/page")
     public R getTransferInfo(@RequestBody Map<String, Object> map) {
@@ -49,6 +51,16 @@
         return R.ok().add(transferService.transfersPage(pageParam, pageParam.buildWrapper(true)));
     }
 
+    @ApiOperation("璋冩嫈鍗曠敓鎴愬嚭搴撳崟")
+    @PreAuthorize("hasAuthority('manager:transfer:list')")
+    @PostMapping("/transfer/pub/outStock")
+    public R genOutstock(@RequestBody Transfer transfer) {
+        if (Objects.isNull(transfer)) {
+            throw new CoolException("鍙傛暟涓嶈兘涓虹┖锛侊紒");
+        }
+        return R.ok(transferService.genOutStock(transfer, getLoginUserId()));
+    }
+
     @PreAuthorize("hasAuthority('manager:transfer:list')")
     @PostMapping("/transfer/list")
     public R list(@RequestBody Map<String, Object> map) {
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java
index c81c788..25985bd 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferItem.java
@@ -5,6 +5,7 @@
 import java.text.SimpleDateFormat;
 import java.util.Date;
 
+import com.vincent.rsf.server.manager.service.CompanysService;
 import lombok.experimental.Accessors;
 import org.checkerframework.checker.units.qual.A;
 import org.springframework.format.annotation.DateTimeFormat;
@@ -21,6 +22,7 @@
 import com.vincent.rsf.server.system.entity.User;
 import java.io.Serializable;
 import java.util.Date;
+import java.util.Objects;
 
 @Data
 @Accessors(chain = true)
@@ -264,6 +266,28 @@
 //            null    // 澶囨敞
 //    );
 
+    public String getSplrName() {
+        if (null == this.splrId) { return null; }
+        CompanysService companysService = SpringUtils.getBean(CompanysService.class);
+        Companys companys = companysService.getById(this.splrId);
+        if (Objects.isNull(companys)) {
+            return null;
+        } else {
+            return companys.getName();
+        }
+    }
+
+    public String getSplrCode() {
+        if (null == this.splrId) { return null; }
+        CompanysService companysService = SpringUtils.getBean(CompanysService.class);
+        Companys companys = companysService.getById(this.splrId);
+        if (Objects.isNull(companys)) {
+            return null;
+        } else {
+            return companys.getCode();
+        }
+    }
+
     public String getStatus$(){
         if (null == this.status){ return null; }
         switch (this.status){
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckExceStatus.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckExceStatus.java
index e9f3519..7093ef6 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckExceStatus.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/CheckExceStatus.java
@@ -2,7 +2,7 @@
 
 
 public enum CheckExceStatus {
-    //鐩樼偣鍗曟墽琛岀姸鎬�
+    //鐩樼偣鍗曟墽琛岀姸鎬� /璋冩嫈鍗曟墽琛岀姸鎬�
     CHECK_ORDER_STATUS_UN_EXCE("0", "鏈墽琛�"),
     CHECK_ORDER_STATUS_INIT("1", "鍒濆鍖�"),
     CHECK_ORDER_STATUS_EXCE_ING("2", "鎵ц涓�"),
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 15a0a35..b3e6b75 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
@@ -11,6 +11,7 @@
     //璁㈠崟绫诲瀷
     ORDER_OUT("out", "鍑哄簱鍗�"),
     ORDER_IN("in", "鍏ュ簱鍗�"),
+    ORDER_TRANSFER("transfer", "璋冩嫈鍗�"),
     ORDER_CHECK("check", "鐩樼偣鍗�");
 
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
index d131121..8f8efb7 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
@@ -14,12 +14,13 @@
     ORDER_WORK_TYPE_PURCHASE("3", "棰嗘枡閫�鍥炲叆搴撳崟"),
     ORDER_WORK_TYPE_SALE("4", "閿�鍞��鍥炲叆搴撳崟"),
     ORDER_WORK_TYPE_OTHER_IN("5", "鍏跺畠鍏ュ簱鍗�"),
+    ORDER_WORK_TYPE_OTHER_TERANSFER("6", "璋冩嫈鍏ュ簱鍗�"),
     ORDER_WORK_TYPE_SUPPLIER("11", "閿�鍞嚭搴撳崟"),
     ORDER_WORK_TYPE_RETURN_ORDER("12", "棰嗘枡鍑哄簱鍗�"),
     ORDER_WORK_TYPE_PURCHASE_RETURN("13", "閲囪喘閫�鍥炲嚭搴撳崟"),
     ORDER_WORK_TYPE_STOCK_OUT("15", "搴撳瓨鍑哄簱"),
     ORDER_WORK_TYPE_STOCK_CHECK("16", "鐩樼偣鍑哄簱"),
-
+    ORDER_WORK_TYPE_STOCK_TERANSFER("17", "璋冩嫈鍑哄簱鍗�"),
     ORDER_WORK_TYPE_OTHER("14", "鍏跺畠鍑哄簱鍗�");
 
 
@@ -54,6 +55,8 @@
             return OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type;
         } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.desc)) {
             return OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type;
+        } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.desc)) {
+            return OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type;
         }
         return null;
     }
@@ -81,6 +84,8 @@
             return OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.desc;
         } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type)) {
             return OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.desc;
+        } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)) {
+            return OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.desc;
         }
         return null;
     }
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java
index 07d37f4..4757941 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java
@@ -19,5 +19,7 @@
     R updateTransfer(TransferItemParams params, Long loginUserId);
 
     IPage<WkOrder> transfersPage(PageParam<Transfer, BaseParam> pageParam, QueryWrapper<Transfer> transferQueryWrapper);
+
+    Transfer genOutStock(Transfer transfer, Long loginUserId);
 }
 
diff --git a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
index e31cddf..29d4a58 100644
--- a/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
+++ b/rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
@@ -10,23 +10,19 @@
 import com.vincent.rsf.server.common.domain.PageResult;
 import com.vincent.rsf.server.manager.controller.params.TransferItemParams;
 import com.vincent.rsf.server.manager.entity.*;
-import com.vincent.rsf.server.manager.enums.AsnExceStatus;
-import com.vincent.rsf.server.manager.enums.CheckExceStatus;
-import com.vincent.rsf.server.manager.enums.OrderSourceType;
-import com.vincent.rsf.server.manager.enums.OrderType;
+import com.vincent.rsf.server.manager.enums.*;
 import com.vincent.rsf.server.manager.mapper.TransferMapper;
-import com.vincent.rsf.server.manager.service.AsnOrderItemService;
-import com.vincent.rsf.server.manager.service.TransferItemService;
-import com.vincent.rsf.server.manager.service.TransferService;
+import com.vincent.rsf.server.manager.service.*;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
-import com.vincent.rsf.server.manager.service.WarehouseAreasService;
 import com.vincent.rsf.server.system.constant.SerialRuleCode;
 import com.vincent.rsf.server.system.utils.SerialRuleUtils;
 import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.BeanUtils;
 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.Date;
 import java.util.List;
 import java.util.Objects;
@@ -36,9 +32,12 @@
 
     @Autowired
     private TransferItemService transferItemService;
-
     @Autowired
     private WarehouseAreasService warehouseAreasService;
+    @Autowired
+    private OutStockService outStockService;
+    @Autowired
+    private OutStockItemService outStockItemService;
 
     /**
      * @author Ryan
@@ -171,4 +170,67 @@
         }
         return this.baseMapper.transfersPage(pageParam, one.getId());
     }
+
+    /**
+     * @author Ryan
+     * @date 2025/7/28
+     * @description: 璋冩嫈鍗曠敓鎴愬嚭搴撳崟
+     * @version 1.0
+     */
+    @Override
+    @Transactional(rollbackFor = Exception.class)
+    public Transfer genOutStock(Transfer param, Long loginUserId) {
+        Transfer transfer = this.getById(param.getId());
+        if (Objects.isNull(transfer)) {
+            throw new CoolException("鏁版嵁閿欒锛氬崟鎹笉瀛樺湪锛侊紒");
+        }
+        List<TransferItem> items = transferItemService.list(new LambdaQueryWrapper<TransferItem>().eq(TransferItem::getTransferId, transfer.getId()));
+        if (items.isEmpty()) {
+            throw new CoolException("鏁版嵁閿欒锛氳皟鎷斿崟鏄庣粏涓嶅瓨鍦紒锛�");
+        }
+        WkOrder wkOrder = new WkOrder();
+        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TRANSFER_ORDER_CODE, transfer);
+        if (StringUtils.isBlank(ruleCode)) {
+            throw new CoolException("璋冩嫈鍗曞彿鐢熸垚澶辫触锛侊紒");
+        }
+
+        Double anfmes = items.stream().mapToDouble(TransferItem::getAnfme).sum();
+        wkOrder.setCode(ruleCode)
+                .setAnfme(anfmes)
+                .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)
+                .setType(OrderType.ORDER_TRANSFER.type)
+                .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)
+                .setCreateBy(loginUserId)
+                .setUpdateBy(loginUserId)
+                .setCreateTime(new Date())
+                .setUpdateTime(new Date())
+                .setPoCode(transfer.getCode())
+                .setPoId(transfer.getId());
+        if (!outStockService.saveOrUpdate(wkOrder)) {
+            throw new CoolException("鍑哄簱鍗曚繚瀛樺け璐ワ紒锛�");
+        }
+
+        List<WkOrderItem> orderItems = new ArrayList<>();
+        items.forEach(item -> {
+            WkOrderItem orderItem = new WkOrderItem();
+            BeanUtils.copyProperties(item, orderItem);
+            orderItem.setOrderCode(wkOrder.getCode())
+                    .setSplrBatch(item.getBatch())
+                    .setSplrCode(item.getSplrCode())
+                    .setSplrName(item.getSplrName())
+                    .setOrderId(wkOrder.getId());
+            orderItems.add(orderItem);
+        });
+
+        if (!outStockItemService.saveBatch(orderItems)) {
+            throw new CoolException("鍑哄簱鍗曟槑缁嗕繚瀛樺け璐ワ紒锛�");
+        }
+
+        transfer.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_EXCING.val);
+
+        if (!this.updateById(transfer)) {
+            throw new CoolException("璋冩嫈鍗曟洿鏂板け璐ワ紒锛�");
+        }
+        return transfer;
+    }
 }

--
Gitblit v1.9.1