0f3ba9d165742d5653f7dc4797223cee7b5856f4..fb8f89c2d44c0a3226897f9704f86695e9d2d5b6
9 天以前 zhou zhou
#站点区域
fb8f89 对比 | 目录
9 天以前 zhou zhou
#站点区域
f83d2a 对比 | 目录
9 天以前 zhou zhou
#站点区域
f9a607 对比 | 目录
9 天以前 zhou zhou
#站点区域
c0c899 对比 | 目录
9 天以前 zhou zhou
#站点区域
4a620b 对比 | 目录
9 天以前 1
lsh#
1678e1 对比 | 目录
9 天以前 1
lsh#
6373d0 对比 | 目录
24个文件已修改
489 ■■■■ 已修改文件
rsf-admin/src/i18n/en.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/ResourceContent.js 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basStationArea/BasStationAreaCreate.jsx 110 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basStationArea/BasStationAreaEdit.jsx 125 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basStationArea/BasStationAreaList.jsx 136 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/StickyDataTable.jsx 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/WarehouseSelect.jsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/ManualCreate.jsx 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/MissionTaskIssueParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsWcsServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/MissionTaskIssueParam.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStationArea.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -137,6 +137,7 @@
        title: 'Update'
    },
    menu: {
        basStationArea: 'BasStationArea',
        dashboard: 'Dashboard',
        settings: 'Settings',
        basicInfo: 'BasicInfo',
@@ -228,6 +229,23 @@
    },
    table: {
        field: {
            basStationArea: {
                type: "type",
                stationAreaName: "stationAreaName",
                inAble: "inAble",
                outAble: "outAble",
                useStatus: "useStatus",
                area: "area",
                isCrossZone: "isCrossZone",
                crossZoneArea: "crossZoneArea",
                isWcs: "isWcs",
                wcsData: "wcsData",
                containerType: "containerType",
                barcode: "barcode",
                autoTransfer: "autoTransfer",
                stationAreaId: "stationAreaId",
                stationAlias: "stationAlias",
            },
            taskPathTemplateMerge: {
                templateCode: "templateCode",
                templateName: "templateName",
rsf-admin/src/i18n/zh.js
@@ -138,6 +138,7 @@
        title: '修改'
    },
    menu: {
        basStationArea: '站点区域',
        dashboard: '控制台',
        settings: '个人设置',
        basicInfo: '基础信息',
@@ -244,6 +245,23 @@
    },
    table: {
        field: {
            basStationArea: {
                type: "类型",
                stationAreaName: "站点区域名称",
                inAble: "入库",
                outAble: "出库",
                useStatus: "使用状态",
                area: "区域",
                isCrossZone: "是否跨区",
                crossZoneArea: "跨区区域",
                isWcs: "是否WCS",
                wcsData: "WCS数据",
                containerType: "容器类型",
                barcode: "条码",
                autoTransfer: "自动移位",
                stationAreaId: "区域编码",
                stationAlias: "区域包含站点",
            },
            taskPathTemplateMerge: {
                templateCode: "模板编码",
                templateName: "模板名称",
rsf-admin/src/page/ResourceContent.js
@@ -69,6 +69,7 @@
import menuPda from './menuPda';
import taskPathTemplate from './taskPathTemplate';
import taskPathTemplateMerge from './taskPathTemplateMerge';
import basStationArea from './basStationArea';
const ResourceContent = (node) => {
  switch (node.component) {
@@ -202,6 +203,8 @@
      return taskPathTemplate;
    case 'taskPathTemplateMerge':
      return taskPathTemplateMerge;
    case 'basStationArea':
      return basStationArea;
    // case "locItem":
    //   return locItem;
    default:
rsf-admin/src/page/basStationArea/BasStationAreaCreate.jsx
@@ -17,6 +17,7 @@
    useNotify,
    Form,
    useCreateController,
    SelectArrayInput,
} from 'react-admin';
import {
    Dialog,
@@ -30,6 +31,8 @@
import DialogCloseButton from "../components/DialogCloseButton";
import StatusSelectInput from "../components/StatusSelectInput";
import MemoInput from "../components/MemoInput";
import DictionarySelect from "../components/DictionarySelect";
import DictionaryArraySelect from "../components/DictionaryArraySelect";
const BasStationAreaCreate = (props) => {
    const { open, setOpen } = props;
@@ -57,7 +60,10 @@
            <CreateBase
                record={{}}
                transform={(data) => {
                    return data;
                    return {
                        ...data,
                        containerTypes: Array.isArray(data.containerTypes) ? data.containerTypes.map(Number) : data.containerTypes
                    };
                }}
                mutationOptions={{ onSuccess: handleSuccess, onError: handleError }}
            >
@@ -84,13 +90,7 @@
                        </DialogTitle>
                        <DialogContent sx={{ mt: 2 }}>
                            <Grid container rowSpacing={2} columnSpacing={2}>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.type"
                                        source="type"
                                        autoFocus
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.stationAreaName"
@@ -99,74 +99,22 @@
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.inAble"
                                        source="inAble"
                                    />
                                    <ReferenceArrayInput source="crossZoneArea" reference="warehouseAreas" sort={{ field: 'sort', order: 'ASC' }}>
                                        <SelectArrayInput
                                            label="table.field.basStation.crossZoneArea"
                                            optionText="name"
                                            optionValue="id"
                                            fullWidth
                                        />
                                    </ReferenceArrayInput>
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.outAble"
                                        source="outAble"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.useStatus"
                                        source="useStatus"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.area"
                                        source="area"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.isCrossZone"
                                        source="isCrossZone"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.crossZoneArea"
                                        source="crossZoneArea"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.isWcs"
                                        source="isWcs"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.wcsData"
                                        source="wcsData"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.containerType"
                                        source="containerType"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.barcode"
                                        source="barcode"
                                        parse={v => v}
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <NumberInput
                                        label="table.field.basStationArea.autoTransfer"
                                        source="autoTransfer"
                                    <DictionaryArraySelect
                                        label={translate("table.field.basStation.containerType")}
                                        name="containerType"
                                        size="small"
                                        validate={[required()]}
                                        dictTypeCode="sys_container_type"
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
@@ -177,11 +125,15 @@
                                    />
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
                                    <TextInput
                                        label="table.field.basStationArea.stationAlias"
                                        source="stationAlias"
                                        parse={v => v}
                                    />
                                    <ReferenceArrayInput source="stationAlias" reference="basStation">
                                        <SelectArrayInput
                                            label="table.field.basStationArea.stationAlias"
                                            optionText="stationName"
                                            optionValue="id"
                                            fullWidth
                                        />
                                    </ReferenceArrayInput>
                                </Grid>
                                <Grid item xs={6} display="flex" gap={1}>
rsf-admin/src/page/basStationArea/BasStationAreaEdit.jsx
@@ -18,7 +18,7 @@
    NumberField,
    required,
    useRecordContext,
    DeleteButton,
    DeleteButton, SelectArrayInput,
} from 'react-admin';
import { useWatch, useFormContext } from "react-hook-form";
import { Stack, Grid, Box, Typography } from '@mui/material';
@@ -28,6 +28,8 @@
import CustomerTopToolBar from "../components/EditTopToolBar";
import MemoInput from "../components/MemoInput";
import StatusSelectInput from "../components/StatusSelectInput";
import DictionarySelect from "../components/DictionarySelect";
import DictionaryArraySelect from "../components/DictionaryArraySelect";
const FormToolbar = () => {
    const { getValues } = useFormContext();
@@ -49,6 +51,12 @@
            mutationMode={EDIT_MODE}
            actions={<CustomerTopToolBar />}
            aside={<EditBaseAside />}
            transform={(data) => {
                return {
                    ...data,
                    containerTypes: Array.isArray(data.containerTypes) ? data.containerTypes.map(Number) : data.containerTypes
                };
            }}
        >
            <SimpleForm
                shouldUnregister
@@ -64,13 +72,6 @@
                            {translate('common.edit.title.main')}
                        </Typography>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.type"
                                source="type"
                                autoFocus
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.stationAreaName"
                                source="stationAreaName"
@@ -78,74 +79,22 @@
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.inAble"
                                source="inAble"
                            />
                            <ReferenceArrayInput source="crossZoneArea" reference="warehouseAreas" sort={{ field: 'sort', order: 'ASC' }}>
                                <SelectArrayInput
                                    label="table.field.basStation.crossZoneArea"
                                    optionText="name"
                                    optionValue="id"
                                    fullWidth
                                />
                            </ReferenceArrayInput>
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.outAble"
                                source="outAble"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.useStatus"
                                source="useStatus"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.area"
                                source="area"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.isCrossZone"
                                source="isCrossZone"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.crossZoneArea"
                                source="crossZoneArea"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.isWcs"
                                source="isWcs"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.wcsData"
                                source="wcsData"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.containerType"
                                source="containerType"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.barcode"
                                source="barcode"
                                parse={v => v}
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <NumberInput
                                label="table.field.basStationArea.autoTransfer"
                                source="autoTransfer"
                            <DictionaryArraySelect
                                label={translate("table.field.basStation.containerType")}
                                name="containerType"
                                size="small"
                                validate={[required()]}
                                dictTypeCode="sys_container_type"
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
@@ -156,21 +105,23 @@
                            />
                        </Stack>
                        <Stack direction='row' gap={2}>
                            <TextInput
                                label="table.field.basStationArea.stationAlias"
                                source="stationAlias"
                                parse={v => v}
                            />
                            <ReferenceArrayInput source="stationAlias" reference="basStation">
                                <SelectArrayInput
                                    label="table.field.basStationArea.stationAlias"
                                    optionText="stationName"
                                    optionValue="id"
                                    fullWidth
                                    validate={[required()]}
                                // validate={(value) => {
                                //     if (value && value.length > 1) {
                                //         return '只能选择一个模板';
                                //     }
                                //     return undefined;
                                // }}
                                />
                            </ReferenceArrayInput>
                        </Stack>
                    </Grid>
                    <Grid item xs={12} md={4}>
                        <Typography variant="h6" gutterBottom>
                            {translate('common.edit.title.common')}
                        </Typography>
                        <StatusSelectInput />
                        <Box mt="2em" />
                        <MemoInput />
                    </Grid>
                </Grid>
            </SimpleForm>
rsf-admin/src/page/basStationArea/BasStationAreaList.jsx
@@ -2,10 +2,9 @@
import { useNavigate } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    ColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
@@ -33,7 +32,6 @@
    DeleteButton,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
import BasStationAreaCreate from "./BasStationAreaCreate";
import BasStationAreaPanel from "./BasStationAreaPanel";
import EmptyData from "../components/EmptyData";
@@ -41,22 +39,11 @@
import MyExportButton from '../components/MyExportButton';
import PageDrawer from "../components/PageDrawer";
import MyField from "../components/MyField";
import StickyDataTable from "@/page/components/StickyDataTable";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em'
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
import useTableLayout from '@/utils/useTableLayout';
import ChipArrayField from '@/page/components/ChipArrayField';
const filters = [
    <SearchInput source="condition" alwaysOn />,
@@ -97,8 +84,14 @@
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const { boxMaxWidth, boxMaxHeight } = useTableLayout(drawerVal);
    return (
        <Box display="flex">
        <Box display="flex" sx={{
            '& .opt': {
                width: 200
            }
        }}>
            <List
                sx={{
                    flexGrow: 1,
@@ -116,52 +109,81 @@
                    <TopToolbar>
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='basStationArea' />
                        <ColumnsButton storeKey='basStationArea' />
                        <MyExportButton />
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
            >
                <StyledDatagrid
                    preferenceKey='basStationArea'
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expand={() => <BasStationAreaPanel />}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy', 'memo']}
                <Box
                    sx={{
                        position: 'relative',
                        maxHeight: boxMaxHeight,
                        maxWidth: boxMaxWidth,
                        overflowX: 'auto',
                        overflowY: 'auto',
                        '& .MuiTableCell-root': {
                            whiteSpace: 'nowrap',
                        }
                    }}
                >
                    <NumberField source="id" />
                    <NumberField source="type" label="table.field.basStationArea.type" />
                    <TextField source="stationAreaName" label="table.field.basStationArea.stationAreaName" />
                    <NumberField source="inAble" label="table.field.basStationArea.inAble" />
                    <NumberField source="outAble" label="table.field.basStationArea.outAble" />
                    <TextField source="useStatus" label="table.field.basStationArea.useStatus" />
                    <NumberField source="area" label="table.field.basStationArea.area" />
                    <NumberField source="isCrossZone" label="table.field.basStationArea.isCrossZone" />
                    <TextField source="crossZoneArea" label="table.field.basStationArea.crossZoneArea" />
                    <NumberField source="isWcs" label="table.field.basStationArea.isWcs" />
                    <TextField source="wcsData" label="table.field.basStationArea.wcsData" />
                    <TextField source="containerType" label="table.field.basStationArea.containerType" />
                    <TextField source="barcode" label="table.field.basStationArea.barcode" />
                    <NumberField source="autoTransfer" label="table.field.basStationArea.autoTransfer" />
                    <TextField source="stationAreaId" label="table.field.basStationArea.stationAreaId" />
                    <TextField source="stationAlias" label="table.field.basStationArea.stationAlias" />
                    <StickyDataTable
                        storeKey='basStationArea'
                        bulkActionButtons={<BulkDeleteButton mutationMode={OPERATE_MODE} />}
                        rowClick={(id, resource, record) => false}
                        stickyRight={['opt']}
                        expandSingle={true}
                        hiddenColumns={['id', 'createTime', 'createBy', 'memo']}
                    >
                        <NumberField source="id" />
                        <TextField source="stationAreaName" label="table.field.basStationArea.stationAreaName" />
                        <WrapperField cellClassName="crossZoneArea" label="table.field.basStationArea.crossZoneArea">
                            <ChipArrayField
                                source="crossZoneArea"
                                apiEndpoint="/warehouseAreas/many/{ids}"
                                labelField="name"
                                dialogTitle={translate('table.field.basStationArea.crossZoneArea')}
                                initialDisplayCount={1}
                                placeholderText="{count} 个区域"
                            />
                        </WrapperField>
                        <WrapperField cellClassName="containerType" label="table.field.basStationArea.containerType">
                            <ChipArrayField
                                source="containerTypes"
                                apiEndpoint="/dictData/many/{ids}"
                                labelField="label"
                                dialogTitle={translate('table.field.basStationArea.containerType')}
                                initialDisplayCount={1}
                                placeholderText="{count} 个区域"
                            />
                        </WrapperField>
                        <TextField source="stationAreaId" label="table.field.basStationArea.stationAreaId" />
                        <WrapperField cellClassName="stationAlias" label="table.field.basStationArea.stationAlias">
                            <ChipArrayField
                                source="stationAlias"
                                apiEndpoint="/basStations/many/{ids}"
                                labelField="stationName"
                                dialogTitle={translate('table.field.basStationArea.stationAlias')}
                                initialDisplayCount={1}
                                placeholderText="{count} 个区域"
                            />
                        </WrapperField>
                        <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                            <TextField source="nickname" />
                        </ReferenceField>
                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                        <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
                            <TextField source="nickname" />
                        </ReferenceField>
                        <DateField source="createTime" label="common.field.createTime" showTime />
                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
                    </ReferenceField>
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <ReferenceField source="createBy" label="common.field.createBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
                    </ReferenceField>
                    <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} />
                    </WrapperField>
                </StyledDatagrid>
                        <WrapperField source="opt" cellClassName="opt" label="common.field.opt">
                            <EditButton sx={{ padding: '1px', fontSize: '.75rem' }} />
                            <DeleteButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                        </WrapperField>
                    </StickyDataTable>
                </Box>
            </List>
            <BasStationAreaCreate
                open={createDialog}
rsf-admin/src/page/components/StickyDataTable.jsx
@@ -209,6 +209,11 @@
            '& .RaBulkActionsToolbar-toolbar:not(.RaBulkActionsToolbar-collapsed)': {
                transform: `translateY(${bulkActionsOffsetY}px)`,
                zIndex: 10,
                opacity: 1,
            },
            '& .RaBulkActionsToolbar-toolbar.RaBulkActionsToolbar-collapsed': {
                zIndex: 10,
                opacity: 1,
            },
        };
    }, [bulkActionsOffsetY]);
rsf-admin/src/page/components/WarehouseSelect.jsx
@@ -7,7 +7,7 @@
import { Select, MenuItem, FormControl, InputLabel } from '@mui/material';
const WarehouseSelect = (props) => {
    const { dictTypeCode, label, name, validate, ...params } = props;
    const { dictTypeCode, label, name, validate, onChange, ...params } = props;
    const translate = useTranslate();
    const notify = useNotify();
    const [list, setList] = useState([]);
@@ -47,6 +47,9 @@
    const handleChange = (event) => {
        const selectedValue = event.target.value;
        field.onChange(selectedValue);
        if (onChange) {
            onChange(event);
        }
    };
    const validValue = list.some(item => item.id === field.value) ? field.value : '';
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx
@@ -211,7 +211,7 @@
    const [columns, setColumns] = useState([
        { field: 'maktx', headerName: translate('table.field.matnr.name'), width: 300 },
        { field: 'matnrCode', headerName: translate('table.field.matnr.code'), width: 200 },
        { field: 'locCode', headerName: translate('table.field.locItem.locCode'), width: 100 },
        // { field: 'locCode', headerName: translate('table.field.locItem.locCode'), width: 100 },
        { field: 'spec', headerName: translate('table.field.matnr.spec'), width: 100 },
        { field: 'batch', headerName: translate('table.field.locItem.batch'), width: 100 },
        { field: 'model', headerName: translate('table.field.matnr.model'), width: 100 },
rsf-admin/src/page/orders/transfer/ManualCreate.jsx
@@ -140,16 +140,16 @@
    }
    const newAddClick = () => {
        if (formData.orgAreaId == null || formData.orgAreaId == undefined) {
        if (!formData.orgAreaId) {
            notify("原库区不能为空!!", { type: 'error' })
            return
        }
        if (formData.tarAreaId == null || formData.tarAreaId == undefined) {
        if (!formData.tarAreaId) {
            notify("目标库区不能为空!!", { type: 'error' })
            return
        }
        console.log(formData);
        setCreateDialog(true)
    }
@@ -177,6 +177,7 @@
                        </Grid>
                        <Grid item md={2}>
                            <WarehouseSelect
                                name="orgAreaId"
                                value={formData.orgAreaId}
                                variant="filled"
                                dictTypeCode="warehouse"
@@ -185,6 +186,7 @@
                        </Grid>
                        <Grid item md={2}>
                            <WarehouseSelect
                                name="tarAreaId"
                                label={translate("table.field.transfer.tarAreaName")}
                                value={formData.tarAreaId}
                                dictTypeCode="warehouse"
@@ -489,6 +491,7 @@
                }}
                pageSizeOptions={[10, 20, 50, 100]}
                editMode="row"
                processRowUpdate={processRowUpdate}
                checkboxSelection
                rowSelectionModel={tableIds}
                onRowSelectionModelChange={handleSelectionChange}
rsf-open-api/src/main/java/com/vincent/rsf/openApi/entity/params/MissionTaskIssueParam.java
@@ -17,6 +17,7 @@
    private String locNo;//目标库位
    private String sourcelocNo;//源库位
    private String staNo;//目标站点
    private String staNoArea;//目标站点区域
    private String sourcestaNo;//源站点
    /*
rsf-open-api/src/main/java/com/vincent/rsf/openApi/service/impl/WmsWcsServiceImpl.java
@@ -6,6 +6,7 @@
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.cfg.CoercionAction;
import com.fasterxml.jackson.databind.cfg.CoercionInputShape;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.openApi.config.PlatformProperties;
import com.vincent.rsf.openApi.entity.Loc;
@@ -109,8 +110,8 @@
                String souLoc = split[2]+"-"+split[3]+"-"+split[4];
                missionWcsTaskIssueParam.setLocNo(souLoc);
                missionWcsTaskIssueParam.setTaskPri(param.getTaskPri());
                missionWcsTaskIssueParam.setStaNo(Integer.parseInt(param.getStaNo()));//目标站
                missionWcsTaskIssueParam.setOutArea("");//目标区域
                missionWcsTaskIssueParam.setStaNo(Cools.isEmpty(param.getStaNoArea())? Integer.parseInt(param.getStaNo()):null);//目标站
                missionWcsTaskIssueParam.setOutArea(param.getStaNoArea());//目标区域
                missionWcsTaskIssueParam.setBatch("");//出库批次号
                missionWcsTaskIssueParam.setBatchSeq(1);//出库顺序号
            } else if (param.getType().equals(TaskTypeEnum.TASK_TYPE_ENUM_TRANSFER.code)){
rsf-server/src/main/java/com/vincent/rsf/server/api/entity/params/MissionTaskIssueParam.java
@@ -24,6 +24,7 @@
    private String locNo;//目标库位
    private String sourcelocNo;//源库位
    private String staNo;//目标站点
    private String staNoArea;//目标站点区域
    private String sourcestaNo;//源站点
    /*
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/dto/OrderOutItemDto.java
@@ -26,6 +26,8 @@
    private List<staListDto> staNos;
    private List<String> targSiteAreaList;
    private String targSiteAreaNow;
    private String siteNo;
    private String sourceId;
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java
@@ -37,4 +37,7 @@
    @ApiModelProperty("目标区域ID集合")
    private List<String> targSiteAreaList;
    @ApiModelProperty("当前目标区域")
    private String targSiteAreaNow;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/BasStationArea.java
@@ -188,7 +188,7 @@
    public List<Long> getContainerTypes$() {
    public List<Long> getContainerTypes() {
        if (Cools.isEmpty(this.containerType)) {
            return new ArrayList<>();
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -216,6 +216,8 @@
    private String targLocArea;
    private String targSiteAreaNow;
    public Task() {}
    public Task(String taskCode,Integer taskStatus,Integer taskType,String orgLoc,String targLoc,String barcode,String robotCode,Short exceStatus,String expDesc,Integer sort,String expCode,Date startTime,Date endTime,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskMissionSchedules.java
@@ -29,6 +29,7 @@
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
/**
 * @author Munch D. Luffy
@@ -163,9 +164,10 @@
                            //没有路径 进入库区筛选站点
                            List<String> targSiteArea = task.getTargSiteArea();
                            //提取出所有站点
                            List<String> siteList = new ArrayList<>();
//                            List<String> siteList = new ArrayList<>();
                            ConcurrentHashMap<String,List<String>> siteList = new ConcurrentHashMap<>();
                            //筛选出存在路径的站点
                            List<String> siteListRoute = new ArrayList<>();
                            List<String[]> siteListRoute = new ArrayList<>();
                            //筛选可替换选项
                            List<String> siteListUp = new ArrayList<>();
                            if (targSiteArea != null && !targSiteArea.isEmpty()) {
@@ -174,34 +176,40 @@
                                    if (basStationArea == null || basStationArea.getStationAlias() == null || basStationArea.getStationAlias().isEmpty()) {
                                        continue;
                                    }
                                    siteList.addAll(basStationArea.getStationAlias());
                                    siteList.put(basStationArea.getStationAreaId(), basStationArea.getStationAlias());
//                                    siteList.addAll(basStationArea.getStationAlias());
                                }
                                if (!siteList.isEmpty()) {
                                    //查询站点路径
                                    for (String site : siteList) {
                                        List<Long> routeGet = RouteWmsStepFlow.routeGet(stationList, sou, site);
                                        if (routeGet!=null && !routeGet.isEmpty()){
                                            siteListRoute.add(site);
                                    for (ConcurrentHashMap.Entry<String, List<String>> entry : siteList.entrySet()) {
                                        String stationAreaId = entry.getKey();          // 获取String键
                                        List<String> valueList = entry.getValue();  // 获取对应的List<String>
                                        for (String value : valueList) {
                                            List<Long> routeGet = RouteWmsStepFlow.routeGet(stationList, sou, value);
                                            if (routeGet!=null && !routeGet.isEmpty()){
                                                siteListRoute.add(new String[]{stationAreaId, value});
                                            }
                                        }
                                    }
                                    Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
                                    //查询站点配置
                                    if (!siteListRoute.isEmpty()) {
                                        for (String site : siteListRoute) {
                                            //拣料出库 -- 盘点出库
                                        for (String[] siteArray : siteListRoute) {
                                            //出库路径排查
                                            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                                                    .eq(DeviceSite::getSite, site)
                                                    .eq(DeviceSite::getSite, siteArray[1])
                                                    .eq(!Objects.isNull(loc.getChannel()),DeviceSite::getChannel, loc.getChannel())
                                                    .eq(DeviceSite::getType, task.getTaskType()).last("limit 1"),false);
                                            if (!Objects.isNull(deviceSite)) {
                                                BasStation basStation = basStationService.getOne(new LambdaQueryWrapper<BasStation>()
                                                        .eq(BasStation::getStationName, site)
                                                        .eq(BasStation::getStationName, siteArray[1])
                                                        .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_O.type)
                                                );
                                                if (Cools.isEmpty(basStation) || !basStation.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
                                                    continue;
                                                }
                                                task.setTargSite(site);
                                                task.setTargSiteAreaNow(siteArray[0]);
                                                task.setTargSite(siteArray[1]);
                                                taskService.updateById(task);
                                                break;
                                            }
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -286,6 +286,7 @@
                    missionTaskIssueParam.setTaskPri(task.getSort());
                    missionTaskIssueParam.setBarcode(task.getBarcode());
                    missionTaskIssueParam.setTaskNo(task.getTaskCode());
                    missionTaskIssueParam.setStaNoArea(task.getTargSiteAreaNow());
                    if (missionTaskIssueParam.getType().equals(RcsTaskType.RCS_TASK_TYPE_ENUM_IN.type) && endSign){
                        missionTaskIssueParam.setLocNo(task.getTargLoc());
                        missionTaskIssueParam.setSourcestaNo(missionTaskIssueParam.getSourcestaNo());
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -195,6 +195,7 @@
                    .setTaskStatus(taskStatus)
                    .setBarcode(loc.getBarcode())
                    .setTargSiteArea(map.getTargSiteAreaList())
                    .setTargSiteAreaNow(map.getTargSiteAreaNow())
                    .setMemo(map.getMemo());
            List<LocItem> locItems = this.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, key));
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
@@ -353,7 +353,7 @@
        if (!locs.isEmpty()) {
            Page<LocItem> page = new Page<>(params.getCurrent(), params.getPageSize());
            QueryWrapper<LocItem> wrapper = new QueryWrapper<>();
            wrapper.select("id, matnr_id, maktx, matnr_code, SUM(anfme) anfme, SUM(work_qty) work_qty, SUM(qty) qty, batch, unit, fields_index, model, spec, loc_id, loc_code ")
            wrapper.select("id, matnr_id, maktx, matnr_code, SUM(anfme) anfme, SUM(work_qty) work_qty, SUM(qty) qty, batch, unit, fields_index, model, spec")
                    .lambda()
                    .eq(StringUtils.isNotBlank(params.getMatnrCode()), LocItem::getMatnrCode, params.getMatnrCode())
                    .like(StringUtils.isNotBlank(params.getMaktx()), LocItem::getMaktx, params.getMaktx());
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/WaveServiceImpl.java
@@ -304,6 +304,7 @@
            taskParams.setItems(itemDto.getLocItemList())
                    .setSiteNo(itemDto.getSiteNo())
                    .setTargSiteAreaList(itemDto.getTargSiteAreaList())
                    .setTargSiteAreaNow(itemDto.getTargSiteAreaNow())
                    .setType(Constants.TASK_TYPE_WAVE_OUT_STOCK)
                    .setSourceId(wave.getId())
                    .setTarLoc(loc.getCode());
rsf-server/src/main/java/com/vincent/rsf/server/manager/utils/LocManageUtil.java
@@ -290,9 +290,11 @@
                                if (count == basStationAreas.size()) {
                                    if (!Objects.isNull(basStation)) {
                                        orderOutItemDto.setTargSiteAreaNow(basStationArea.getStationAreaId());
                                        orderOutItemDto.setSiteNo(basStation.getStationName());
//                                        throw new CoolException("站點不存在!!");
                                    } else if (!stas.isEmpty()) {
                                        orderOutItemDto.setTargSiteAreaNow(basStationArea.getStationAreaId());
                                        orderOutItemDto.setSiteNo(basStationArea.getStationAlias().get(0));
                                    } else {
                                        throw new CoolException("未找到符合条件站点!!!请检查库区或者路径配置!!!");
@@ -302,6 +304,7 @@
                                        continue;
//                                        throw new CoolException("站點不存在!!");
                                    }
                                    orderOutItemDto.setTargSiteAreaNow(basStationArea.getStationAreaId());
                                    orderOutItemDto.setSiteNo(basStation.getStationName());
                                }
rsf-server/src/main/resources/mapper/manager/AsnOrderMapper.xml
@@ -29,7 +29,7 @@
                    `day_time` BETWEEN ( CURDATE() - INTERVAL 1 MONTH )
                        AND CURDATE()
                GROUP BY
                    `day_time`, task_type
                    `day_time`, task_type,id
            ) t
        ${ew.customSqlSegment}
    </select>