skyouc
2025-07-29 d5f16640dc1bf0239beafab721480a64425d9c1e
调拔功能优化
13个文件已修改
264 ■■■■■ 已修改文件
rsf-admin/src/i18n/en.js 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/ManualCreate.jsx 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferItemList.jsx 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferList.jsx 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferOrders.jsx 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java 44 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -691,6 +691,16 @@
                projectCode: "projectCode",
            },
            transferOrder: {
                code: 'Order No',
                poCode: 'transfer No',
                type: 'Type',
                wkType: 'Work Type',
                anfme: 'Anfme',
                workQty: 'Work Qty',
                qty: 'Qty',
            },
            checkDiffItem: {
                checkId: "checkId",
                orderCode: "orderCode",
rsf-admin/src/i18n/zh.js
@@ -722,6 +722,15 @@
                projectCode: "项目单号",
            },
            transferOrder: {
                code: '单号',
                poCode: '调拔单',
                type: '单据类型',
                wkType: '调拔类型',
                anfme: '调拔数量',
                workQty: '执行数量',
                qty: '完成数',
            },
            checkDiffItem: {
                checkId: "盘点单ID",
rsf-admin/src/page/orders/asnOrder/AsnOrderList.jsx
@@ -1,5 +1,4 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useLocation, useNavigate } from 'react-router-dom';
import {
  List,
  DatagridConfigurable,
@@ -37,29 +36,30 @@
  useRedirect,
  useUnselectAll,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import AsnOrderModal from "./AsnOrderModal";
import AsnOrderPanel from "./AsnOrderPanel";
import EmptyData from "../../components/EmptyData";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
import BillStatusField from '../../components/BillStatusField';
import ConfirmButton from '../../components/ConfirmButton';
import PageDrawer from "../../components/PageDrawer";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import ConstructionIcon from "@mui/icons-material/Construction";
import EditIcon from '@mui/icons-material/Edit';
import TaskIcon from '@mui/icons-material/Task';
import CloseIcon from '@mui/icons-material/Close';
import request from '@/utils/request';
import CreateNewFolderOutlinedIcon from '@mui/icons-material/CreateNewFolderOutlined';
import PrintOutlinedIcon from '@mui/icons-material/PrintOutlined';
import DictionarySelect from "../../components/DictionarySelect";
import ConstructionIcon from "@mui/icons-material/Construction";
import BillStatusField from '../../components/BillStatusField';
import { Box, Typography, Card, Stack } from '@mui/material';
import MyCreateButton from "../../components/MyCreateButton";
import { useLocation, useNavigate } from 'react-router-dom';
import MyExportButton from '../../components/MyExportButton';
import ConfirmButton from '../../components/ConfirmButton';
import ExitToAppIcon from '@mui/icons-material/ExitToApp';
import ImportButton from "../../components/ImportButton";
import PrintOutlinedIcon from '@mui/icons-material/PrintOutlined';
import OrderPrintPreview from "./OrderPrintPreview";
import CreateNewFolderOutlinedIcon from '@mui/icons-material/CreateNewFolderOutlined';
import AsnCreateByPoModal from "./AsnCreateByPoModal";
import PageDrawer from "../../components/PageDrawer";
import OrderPrintPreview from "./OrderPrintPreview";
import CloseIcon from '@mui/icons-material/Close';
import EditIcon from '@mui/icons-material/Edit';
import TaskIcon from '@mui/icons-material/Task';
import { styled } from '@mui/material/styles';
import AsnOrderModal from "./AsnOrderModal";
import request from '@/utils/request';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
  '& .css-1vooibu-MuiSvgIcon-root': {
    height: '.9em'
@@ -351,15 +351,16 @@
const BtnBulkExport = () => {
  const { filter, selectedIds, filterValues, resource, sort, total } = useListContext();
  const refresh = useRefresh();
  const dataProvider = useDataProvider();
  const notify = useNotify();
  const unSelect = useUnselectAll(resource);
  const dataProvider = useDataProvider();
  const refresh = useRefresh();
  const notify = useNotify();
  const bulkExport = () => {
    getExport()
    unSelect();
  }
  const getExport = () => {
    dataProvider
      .export(resource, {
rsf-admin/src/page/orders/transfer/ManualCreate.jsx
@@ -18,6 +18,7 @@
    Form,
    useCreateController,
    SimpleForm,
    useRefresh,
} from 'react-admin';
import {
    Dialog,
@@ -51,6 +52,7 @@
    const { open, setOpen, orderId } = props;
    const tableRef = useRef();
    const notify = useNotify();
    const refresh = useRefresh();
    const translate = useTranslate();
    const [tabelData, setTableData] = useState([]);
    const [disabled, setDisabled] = useState(false);
@@ -88,8 +90,6 @@
            const res = await request.post(`/transfer/items/save`, parmas);
            if (res?.data?.code === 200) {
                setOpen(false);
                refresh();
                resetData()
            } else {
                notify(res.data.msg);
            }
@@ -101,13 +101,13 @@
            const res = await request.post(`/transfer/items/update`, parmas);
            if (res?.data?.code === 200) {
                setOpen(false);
                refresh();
                resetData()
            } else {
                notify(res.data.msg);
            }
        }
        setDisabled(false)
        refresh();
    };
    const handleSuccess = async (data) => {
@@ -140,15 +140,10 @@
    const handleChange = (value, name) => {
        console.log(name);
        console.log(value);
        setFormData((prevData) => ({
            ...prevData,
            [name]: value
        }));
        console.log(formData);
    };
    return (
rsf-admin/src/page/orders/transfer/TransferItemList.jsx
@@ -31,6 +31,7 @@
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    useGetRecordId,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -91,6 +92,7 @@
const TransferItemList = () => {
    const translate = useTranslate();
    const orderId = useGetRecordId();
    const [drawerVal, setDrawerVal] = useState(false);
    const [createDialog, setCreateDialog] = useState(false);
@@ -108,6 +110,7 @@
                title={false}
                empty={false}
                filters={filters}
                filter={{transferId: orderId}}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
rsf-admin/src/page/orders/transfer/TransferList.jsx
@@ -33,19 +33,17 @@
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    useRedirect,
} 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 BillStatusField from '../../components/BillStatusField';
import { Box, Typography, Card, Stack, } from '@mui/material';
import PageEditDrawer from "../../components/PageEditDrawer";
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 ManualCreate from "./ManualCreate.jsx";
import { styled } from '@mui/material/styles';
import * as Common from '@/utils/common.js';
@@ -158,7 +156,7 @@
                    <TextField source="orgAreaName" label="table.field.transfer.orgAreaName" />
                    <NumberField source="tarAreaId" label="table.field.transfer.tarAreaId" />
                    <TextField source="tarAreaName" label="table.field.transfer.tarAreaName" />
                    <TextField source="exceStatus$" label="table.field.transfer.exceStatus" sortable={false} />
                    <BillStatusField source="exceStatus$" cellClassName="status" label="table.field.transfer.exceStatus" sortable={false} />
                    <TextField source="updateBy$" label="common.field.updateBy" />
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <TextField source="createBy$" label="common.field.createBy" />
@@ -188,10 +186,12 @@
const PublicButton = ({ setDrawerVal, setSelect }) => {
    const record = useRecordContext();
    const refresh = useRefresh();
    const redirct = useRedirect();
    const taskEvent = async () => {
        const { data: { code, data, msg } } = await request.post(`/transfer/pub/outStock`, record);
        if (code === 200) {
            notify(msg);
            redirct("/outStock");
            refresh()
        } else {
            notify(msg);
@@ -200,6 +200,6 @@
    }
    return (
        <ConfirmButton label={"toolbar.publicWorking"} startIcon={<AddTaskIcon />} onConfirm={taskEvent} size={"small"} />
        record?.exceStatus == 0 ? <ConfirmButton label={"toolbar.publicWorking"} startIcon={<AddTaskIcon />} onConfirm={taskEvent} size={"small"} /> : <></>
    )
}
rsf-admin/src/page/orders/transfer/TransferOrders.jsx
@@ -70,18 +70,16 @@
                        bulkActionButtons={false}
                        rowClick={false}
                        expandSingle={true}
                        omit={['id', 'createTime', 'createBy$', 'memo', 'rleStatus$']}
                        omit={['id', 'createTime', 'createBy$', 'memo']}
                    >
                        <NumberField source="id" />
                        <TextField source="code" label="table.field.outStock.code" />
                        <TextField source="poCode" label="table.field.outStock.poCode" />
                        <TextField source="type$" label="table.field.outStock.type" />
                        <TextField cellClassName="wkType" source="wkType$" label="table.field.outStock.wkType" />
                        <NumberField source="anfme" label="table.field.outStock.anfme" />
                        <NumberField source="workQty" label="table.field.outStock.workQty" />
                        <NumberField source="qty" label="table.field.outStock.qty" />
                        <TextField source="logisNo" label="table.field.outStock.logisNo" />
                        <TextField source="rleStatus$" label="table.field.outStock.rleStatus" sortable={false} />
                        <TextField source="code" label="table.field.transferOrder.code" />
                        <TextField source="poCode" label="table.field.transferOrder.poCode" />
                        <TextField source="type$" label="table.field.transferOrder.type" />
                        <TextField cellClassName="wkType" source="wkType$" label="table.field.transferOrder.wkType" />
                        <NumberField source="anfme" label="table.field.transferOrder.anfme" />
                        <NumberField source="workQty" label="table.field.transferOrder.workQty" />
                        <NumberField source="qty" label="table.field.transferOrder.qty" />
                        <TextField source="updateBy$" label="common.field.updateBy" />
                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                        <TextField source="createBy$" label="common.field.createBy" />
rsf-server/src/main/java/com/vincent/rsf/server/common/config/MybatisPlusConfig.java
@@ -51,6 +51,7 @@
                        "man_loc_type_rela",
                        "man_qly_inspect_result",
                        "view_stock_manage",
                        "man_transfer_order",
                        "man_wave_order_rela"
                ).contains(tableName);
            }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java
@@ -14,6 +14,7 @@
import com.vincent.rsf.server.manager.controller.params.TransferItemParams;
import com.vincent.rsf.server.manager.entity.Transfer;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
import com.vincent.rsf.server.manager.service.OutStockService;
import com.vincent.rsf.server.manager.service.TransferService;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.controller.BaseController;
@@ -33,6 +34,8 @@
    @Autowired
    private TransferService transferService;
    @Autowired
    private OutStockService outStockService;
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    @PostMapping("/transfer/page")
@@ -96,6 +99,10 @@
        if (!transferService.save(transfer)) {
            return R.error("Save Fail");
        }
        /***保存成功,自动生成出库单*/
        transferService.genOutStock(transfer, getLoginUserId());
        return R.ok("Save Success").add(transfer);
    }
@@ -115,8 +122,12 @@
    @OperationLog("Delete 调拔单")
    @PostMapping("/transfer/remove/{ids}")
    public R remove(@PathVariable Long[] ids) {
        if (!transferService.removeByIds(Arrays.asList(ids))) {
            return R.error("Delete Fail");
        List<Long> list = Arrays.asList(ids);
        if (list.isEmpty()) {
            return R.error("参数不能为空!!");
        }
        if (!transferService.removeTransfer(list)) {
            throw new CoolException("调拔单移除失败!!");
        }
        return R.ok("Delete Success").add(ids);
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Transfer.java
@@ -248,7 +248,7 @@
        }
        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
                .eq(DictData::getDictTypeCode, DictTypeCode.SYS_WAVE_EXCE_STATUS)
                .eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_EXCE_STATUS)
                .eq(DictData::getValue, this.exceStatus));
        if (Objects.isNull(dictData)) {
            return null;
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/WkOrder.java
@@ -6,6 +6,7 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
import com.vincent.rsf.server.system.constant.DictTypeCode;
import com.vincent.rsf.server.system.entity.DictData;
import com.vincent.rsf.server.system.service.DictDataService;
@@ -25,6 +26,7 @@
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
@Data
@@ -174,7 +176,8 @@
    @ApiModelProperty(value= "备注")
    private String memo;
    public WkOrder() {}
    public WkOrder() {
    }
    public WkOrder(String code, String poCode, Long poId, String type, String wkType, Double anfme, Double qty, String logisNo, Date arrTime, Short rleStatus, Integer status, Integer deleted, Integer tenantId, Long createBy, Date createTime, Long updateBy, Date updateTime, String memo) {
        this.code = code;
@@ -217,33 +220,46 @@
    public String getType$(){
        if (Cools.isEmpty(this.type)){
            return "";
        }
        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
                .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE)
                .eq(DictData::getValue, this.type));
        if (Objects.isNull(dictData)) {
            return null;
        }
        return dictData.getLabel();
        return OrderType.getValType(this.type);
//        if (this.type.equals(OrderType.ORDER_TRANSFER.type)) {
//            return OrderType.getValType(this.type);
//        } else {
//            if (Cools.isEmpty(this.type)) {
//                return "";
//            }
//            DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
//            DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
//                    .eq(DictData::getDictTypeCode, DictTypeCode.DICT_SYS_ORDER_TYPE)
//                    .eq(DictData::getValue, this.type));
//            if (Objects.isNull(dictData)) {
//                return null;
//            }
//            return dictData.getLabel();
//        }
    }
    public String getWkType$(){
        String typeCode = DictTypeCode.DICT_SYS_BUSINESS_TYPE;
        if (type.equals(OrderType.ORDER_CHECK.type)) {
            typeCode = DictTypeCode.SYS_CHECK_ORDER_TYPE;
        }
        if (Cools.isEmpty(this.wkType)){
            return "";
        }
        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, typeCode).eq(DictData::getValue, this.wkType));
        if (Objects.isNull(dictData)) {
            return null;
        }
        return dictData.getLabel();
//        if (this.type.equals(OrderType.ORDER_TRANSFER.type)) {
            return OrderWorkType.getWorkDesc(this.wkType);
//        } else {
//            String typeCode = DictTypeCode.DICT_SYS_BUSINESS_TYPE;
//            if (type.equals(OrderType.ORDER_CHECK.type)) {
//                typeCode = DictTypeCode.SYS_CHECK_ORDER_TYPE;
//            }
//            if (Cools.isEmpty(this.wkType)) {
//                return "";
//            }
//            DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
//            DictData dictData = dictDataService
//                    .getOne(new LambdaQueryWrapper<DictData>()
//                    .eq(DictData::getDictTypeCode, typeCode)
//                            .eq(DictData::getValue, this.wkType));
//            if (Objects.isNull(dictData)) {
//                return null;
//            }
//            return dictData.getLabel();
//        }
    }
    public String getCheckType$(){
@@ -251,7 +267,9 @@
            return "";
        }
        DictDataService dictDataService = SpringUtils.getBean(DictDataService.class);
        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>().eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_TYPE).eq(DictData::getValue, this.checkType));
        DictData dictData = dictDataService.getOne(new LambdaQueryWrapper<DictData>()
                .eq(DictData::getDictTypeCode, DictTypeCode.SYS_CHECK_TYPE)
                .eq(DictData::getValue, this.checkType));
        if (Objects.isNull(dictData)) {
            return null;
        }
@@ -267,7 +285,9 @@
    }
    public String getRleStatus$(){
        if (null == this.rleStatus){ return null; }
        if (null == this.rleStatus) {
            return null;
        }
        switch (this.rleStatus){
            case 0:
                return " 正常";
@@ -279,7 +299,9 @@
    }
    public String getStatus$(){
        if (null == this.status){ return null; }
        if (null == this.status) {
            return null;
        }
        switch (this.status){
            case 1:
                return "正常";
@@ -323,9 +345,10 @@
    }
    public Boolean getStatusBool(){
        if (null == this.status){ return null; }
        if (null == this.status) {
            return null;
        }
        switch (this.status){
            case 1:
                return true;
@@ -335,8 +358,11 @@
                return null;
        }
    }
    public String getNtyStatus$(){
        if (null == this.ntyStatus){ return "error"; }
        if (null == this.ntyStatus) {
            return "error";
        }
        switch (this.ntyStatus){
            case 0:
                return "未上报";
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java
@@ -21,5 +21,7 @@
    IPage<WkOrder> transfersPage(PageParam<Transfer, BaseParam> pageParam, QueryWrapper<Transfer> transferQueryWrapper);
    Transfer genOutStock(Transfer transfer, Long loginUserId);
    boolean removeTransfer(List<Long> list);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
@@ -22,10 +22,8 @@
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;
import java.util.*;
import java.util.stream.Collectors;
@Service("transferService")
public class TransferServiceImpl extends ServiceImpl<TransferMapper, Transfer> implements TransferService {
@@ -40,6 +38,8 @@
    private OutStockItemService outStockItemService;
    @Autowired
    private TransferOrderService transferOrderService;
    @Autowired
    private TransferService transferService;
    /**
     * @author Ryan
@@ -191,16 +191,16 @@
            throw new CoolException("数据错误:调拔单明细不存在!!");
        }
        WkOrder wkOrder = new WkOrder();
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TRANSFER_ORDER_CODE, transfer);
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, transfer);
        if (StringUtils.isBlank(ruleCode)) {
            throw new CoolException("调拔单号生成失败!!");
            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)
                .setType(OrderType.ORDER_OUT.type)
                .setWkType(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)
                .setCreateBy(loginUserId)
                .setUpdateBy(loginUserId)
@@ -228,14 +228,14 @@
            throw new CoolException("出库单明细保存失败!!");
        }
        transfer.setExceStatus(WaveExceStatus.WAVE_EXCE_STATUS_EXCING.val);
        transfer.setExceStatus(CheckExceStatus.CHECK_ORDER_STATUS_INIT.val);
        if (!this.updateById(transfer)) {
            throw new CoolException("调拔单更新失败!!");
        }
        TransferOrder transferOrder = new TransferOrder();
        transferOrder.setTransferId(transfer.getId()).setOrderId(wkOrder.getId()).setExceStatus(1);
        transferOrder.setTransferId(transfer.getId()).setOrderId(wkOrder.getId()).setExceStatus((int)CheckExceStatus.CHECK_ORDER_STATUS_INIT.val);
        if (!transferOrderService.save(transferOrder)) {
            throw new CoolException("单据关联失败!!");
@@ -243,4 +243,30 @@
        return transfer;
    }
    /**
     * @author Ryan
     * @date 2025/7/29
     * @description: 删除调拔单
     * @version 1.0
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public boolean removeTransfer(List<Long> list) {
        List<WkOrder> wkOrders = outStockService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getPoId, list));
        if (!wkOrders.isEmpty()) {
            Set<Long> longs = wkOrders.stream().map(WkOrder::getId).collect(Collectors.toSet());
            if (!outStockService.remove(new LambdaQueryWrapper<WkOrder>()
                    .in(WkOrder::getId, longs)
                    .ne(WkOrder::getExceStatus, WaveExceStatus.WAVE_EXCE_STATUS_INIT.val))) {
                throw new CoolException("当前出库单已执行,不支持删除!!");
            }
            outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>().in(WkOrderItem::getOrderId, longs));
            transferOrderService.remove(new LambdaQueryWrapper<TransferOrder>().in(TransferOrder::getTransferId, list));
        }
        transferService.removeByIds(list);
        transferItemService.remove(new LambdaQueryWrapper<TransferItem>().in(TransferItem::getTransferId, list));
        return true;
    }
}