zhou zhou
6 天以前 8983043a546d7405ed2754a557471602732fb44a
#入库出库订单增加明细页面
2个文件已修改
4个文件已添加
573 ■■■■■ 已修改文件
rsf-admin/src/page/ResourceContent.js 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrderItem/AsnOrderItemList.jsx 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrderItem/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStockItem/OutStockItemList.jsx 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStockItem/index.jsx 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderItemController.java 91 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/ResourceContent.js
@@ -30,9 +30,11 @@
import serialRule from "./system/serialRule";
import whMat from "./basicInfo/whMat";
import asnOrder from "./orders/asnOrder";
import asnOrderItem from "./orders/asnOrderItem";
import purchase from "./orders/purchase";
import fields from "./fields";
import fieldsItem from "./fieldsItem";
import outStockItem from "./orders/outStockItem";
import warehouseAreasItem from "./warehouseAreasItem";
import deviceSite from "./basicInfo/deviceSite";
import waitPakin from "./waitPakin";
@@ -117,6 +119,10 @@
      return whMat;
    case "asnOrder":
      return asnOrder;
    case "asnOrderItem":
      return asnOrderItem;
    case "outStockItem":
      return outStockItem;
    case "asnOrderLog":
      return asnOrderLog;
    case "purchase":
rsf-admin/src/page/orders/asnOrderItem/AsnOrderItemList.jsx
New file
@@ -0,0 +1,221 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate, useLocation } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    Button,
    useRefresh,
    Pagination,
} from 'react-admin';
import { Box, Typography, Card, Stack, Dialog, DialogActions, DialogTitle, LinearProgress } from '@mui/material';
import { styled } from '@mui/material/styles';
import PageDrawer from "../../components/PageDrawer";
import request from '@/utils/request';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em',
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <NumberInput source="orderId" label="table.field.asnOrderItem.orderId" />,
    <TextInput source="orderCode" label="table.field.asnOrderItem.orderCode" />,
    // <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
    // <TextInput source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
    <TextInput source="matnrId" label="table.field.asnOrderItem.matnrId" />,
    <TextInput source="maktx" label="table.field.asnOrderItem.maktx" />,
    <TextInput source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
    <TextInput source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
    <TextInput source="projectCode" label="table.field.asnOrderItem.projectCode" />,
    <NumberInput source="anfme" label="table.field.asnOrderItem.anfme" />,
    <TextInput source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
    <NumberInput source="purQty" label="table.field.asnOrderItem.purQty" />,
    <TextInput source="purUnit" label="table.field.asnOrderItem.purUnit" />,
    <NumberInput source="qty" label="table.field.asnOrderItem.qty" />,
    <TextInput source="splrCode" label="table.field.asnOrderItem.splrCode" />,
    <TextInput source="splrName" label="table.field.asnOrderItem.splrName" />,
    <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />,
    <TextInput source="trackCode" label="table.field.asnOrderItem.barcode" />,
    <TextInput source="packName" label="table.field.asnOrderItem.packName" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
        source="status"
        choices={[
            { id: '1', name: 'common.enums.statusTrue' },
            { id: '0', name: 'common.enums.statusFalse' },
        ]}
        resettable
    />,
]
const AsnOrderItemList = () => {
    const translate = useTranslate();
    const [drawerVal, setDrawerVal] = useState(false);
    return (
        <>
            <Box display="flex">
                <List
                    resource="asnOrderItem/in"
                    sx={{
                        flexGrow: 1,
                        transition: (theme) =>
                            theme.transitions.create(['all'], {
                                duration: theme.transitions.duration.enteringScreen,
                            }),
                        marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    }}
                    title={"menu.asnOrderItem"}
                    empty={false}
                    filters={filters}
                    sort={{ field: "create_time", order: "desc" }}
                    actions={(
                        <TopToolbar>
                            <FilterButton />
                            <SelectColumnsButton preferenceKey='asnOrderItem' />
                            <ExportButton />
                        </TopToolbar>
                    )}
                    perPage={DEFAULT_PAGE_SIZE}
                    pagination={<Pagination rowsPerPageOptions={[5, 10, 20, 25, 50, 100]} />}
                >
                    <DynamicFields />
                </List>
                <PageDrawer
                    title='AsnOrderItem Detail'
                    drawerVal={drawerVal}
                    setDrawerVal={setDrawerVal}
                >
                </PageDrawer>
            </Box>
        </>
    )
}
export default AsnOrderItemList;
const DynamicFields = (props) => {
    const translate = useTranslate();
    const notify = useNotify();
    const [columns, setColumns] = useState([]);
    const { isLoading } = useListContext();
    const refresh = useRefresh();
    useEffect(() => {
        getDynamicFields();
    }, []);
    const getDynamicFields = async () => {
        const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
        if (code == 200) {
            const arr = [
                <NumberField source="id" />,
                <NumberField source="orderId" label="table.field.asnOrderItem.orderId" />,
                <TextField source="orderCode" label="table.field.asnOrderItem.orderCode" />,
                // <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
                // <TextField source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
                <TextField source="platItemId" label="table.field.asnOrderItem.platItemId" />,
                <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />,
                <TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" />,
                <TextField source="maktx" label="table.field.asnOrderItem.maktx" />,
                <TextField source="splrBatch" label="table.field.asnOrderItem.splrBatch" />,
                <TextField source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
                <TextField source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
                <TextField source="projectCode" label="table.field.asnOrderItem.projectCode" />,
                <TextField source="spec" label="table.field.asnOrderItem.spec" />,
                <TextField source="model" label="table.field.asnOrderItem.model" />,
                <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />,
                <NumberField source="qty" label="table.field.asnOrderItem.qty" />,
                <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
                <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />,
                <TextField source="purUnit" label="table.field.asnOrderItem.purUnit" />,
                <TextField source="splrCode" label="table.field.asnOrderItem.splrCode" />,
                <TextField source="splrName" label="table.field.asnOrderItem.splrName" />,
                <TextField source="isptResult$" label="table.field.asnOrderItem.isptResult" />,
                <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" />,
                <TextField source="trackCode" label="table.field.asnOrderItem.barcode" />,
                <TextField source="packName" label="table.field.asnOrderItem.packName" />,
            ]
            const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
            const lastArr = [
                <DateField source="updateTime" label="common.field.updateTime" showTime />,
                <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                    <TextField source="nickname" />
                </ReferenceField>,
                <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 />,
            ]
            setColumns([...arr, ...fields, ...lastArr]);
        } else {
            notify(msg);
        }
    }
    return (
        <Box sx={{ position: 'relative', minHeight: "60vh", }}>
            {isLoading && (
                <LinearProgress
                    sx={{
                        height: "2px",
                        position: 'absolute',
                        top: 0,
                        left: 0,
                        right: 0,
                    }}
                />
            )}
            {columns.length > 0 &&
                <StyledDatagrid
                    preferenceKey='asnOrderItem'
                    bulkActionButtons={false}
                    rowClick={(id, resource, record) => false}
                    omit={['id', 'orderId', 'poDetlId', 'matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode', 'createBy', 'createTime']}
                >
                    {columns.map((column) => column)}
                </StyledDatagrid>}
        </Box>
    )
}
rsf-admin/src/page/orders/asnOrderItem/index.jsx
New file
@@ -0,0 +1,17 @@
import React from "react";
import {
    ListGuesser,
    EditGuesser,
    ShowGuesser,
} from "react-admin";
import AsnOrderItemList from "./AsnOrderItemList";
export default {
    list: AsnOrderItemList,
    edit: EditGuesser,
    show: ShowGuesser,
    recordRepresentation: (record) => {
        return `${record.maktx}`
    }
};
rsf-admin/src/page/orders/outStockItem/OutStockItemList.jsx
New file
@@ -0,0 +1,221 @@
import React, { useState, useRef, useEffect, useMemo, useCallback } from "react";
import { useNavigate, useLocation } from 'react-router-dom';
import {
    List,
    DatagridConfigurable,
    SearchInput,
    TopToolbar,
    SelectColumnsButton,
    EditButton,
    FilterButton,
    CreateButton,
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    useRecordContext,
    useTranslate,
    useNotify,
    useListContext,
    FunctionField,
    TextField,
    NumberField,
    DateField,
    BooleanField,
    ReferenceField,
    TextInput,
    DateTimeInput,
    DateInput,
    SelectInput,
    NumberInput,
    ReferenceInput,
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    Button,
    useRefresh,
    Pagination,
} from 'react-admin';
import { Box, Typography, Card, Stack, Dialog, DialogActions, DialogTitle, LinearProgress } from '@mui/material';
import { styled } from '@mui/material/styles';
import PageDrawer from "../../components/PageDrawer";
import request from '@/utils/request';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
        height: '.9em',
    },
    '& .RaDatagrid-row': {
        cursor: 'auto'
    },
    '& .column-name': {
    },
    '& .opt': {
        width: 200
    },
}));
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <NumberInput source="orderId" label="table.field.asnOrderItem.orderId" />,
    <TextInput source="orderCode" label="table.field.asnOrderItem.orderCode" />,
    // <TextInput source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
    // <TextInput source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
    <TextInput source="matnrId" label="table.field.asnOrderItem.matnrId" />,
    <TextInput source="maktx" label="table.field.asnOrderItem.maktx" />,
    <TextInput source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
    <TextInput source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
    <TextInput source="projectCode" label="table.field.asnOrderItem.projectCode" />,
    <NumberInput source="anfme" label="table.field.asnOrderItem.anfme" />,
    <TextInput source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
    <NumberInput source="purQty" label="table.field.asnOrderItem.purQty" />,
    <TextInput source="purUnit" label="table.field.asnOrderItem.purUnit" />,
    <NumberInput source="qty" label="table.field.asnOrderItem.qty" />,
    <TextInput source="splrCode" label="table.field.asnOrderItem.splrCode" />,
    <TextInput source="splrName" label="table.field.asnOrderItem.splrName" />,
    <TextInput source="qrcode" label="table.field.asnOrderItem.qrcode" />,
    <TextInput source="trackCode" label="table.field.asnOrderItem.barcode" />,
    <TextInput source="packName" label="table.field.asnOrderItem.packName" />,
    <TextInput label="common.field.memo" source="memo" />,
    <SelectInput
        label="common.field.status"
        source="status"
        choices={[
            { id: '1', name: 'common.enums.statusTrue' },
            { id: '0', name: 'common.enums.statusFalse' },
        ]}
        resettable
    />,
]
const OutStockItemList = () => {
    const translate = useTranslate();
    const [drawerVal, setDrawerVal] = useState(false);
    return (
        <>
            <Box display="flex">
                <List
                    resource="asnOrderItem/out"
                    sx={{
                        flexGrow: 1,
                        transition: (theme) =>
                            theme.transitions.create(['all'], {
                                duration: theme.transitions.duration.enteringScreen,
                            }),
                        marginRight: drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                    }}
                    title={"menu.asnOrderItem"}
                    empty={false}
                    filters={filters}
                    sort={{ field: "create_time", order: "desc" }}
                    actions={(
                        <TopToolbar>
                            <FilterButton />
                            <SelectColumnsButton preferenceKey='asnOrderItem' />
                            <ExportButton />
                        </TopToolbar>
                    )}
                    perPage={DEFAULT_PAGE_SIZE}
                    pagination={<Pagination rowsPerPageOptions={[5, 10, 20, 25, 50, 100]} />}
                >
                    <DynamicFields />
                </List>
                <PageDrawer
                    title='AsnOrderItem Detail'
                    drawerVal={drawerVal}
                    setDrawerVal={setDrawerVal}
                >
                </PageDrawer>
            </Box>
        </>
    )
}
export default OutStockItemList;
const DynamicFields = (props) => {
    const translate = useTranslate();
    const notify = useNotify();
    const [columns, setColumns] = useState([]);
    const { isLoading } = useListContext();
    const refresh = useRefresh();
    useEffect(() => {
        getDynamicFields();
    }, []);
    const getDynamicFields = async () => {
        const { data: { code, data, msg }, } = await request.get("/fields/enable/list");
        if (code == 200) {
            const arr = [
                <NumberField source="id" />,
                <NumberField source="orderId" label="table.field.asnOrderItem.orderId" />,
                <TextField source="orderCode" label="table.field.asnOrderItem.orderCode" />,
                // <TextField source="poDetlId" label="table.field.asnOrderItem.poDetlId" />,
                // <TextField source="poDetlCode" label="table.field.asnOrderItem.poDetlCode" />,
                <TextField source="platItemId" label="table.field.asnOrderItem.platItemId" />,
                <TextField source="matnrId" label="table.field.asnOrderItem.matnrId" />,
                <TextField source="matnrCode" label="table.field.asnOrderItem.matnrCode" />,
                <TextField source="maktx" label="table.field.asnOrderItem.maktx" />,
                <TextField source="splrBatch" label="table.field.asnOrderItem.splrBatch" />,
                <TextField source="platOrderCode" label="table.field.asnOrderItem.platOrderCode" />,
                <TextField source="platWorkCode" label="table.field.asnOrderItem.platWorkCode" />,
                <TextField source="projectCode" label="table.field.asnOrderItem.projectCode" />,
                <TextField source="spec" label="table.field.asnOrderItem.spec" />,
                <TextField source="model" label="table.field.asnOrderItem.model" />,
                <NumberField source="anfme" label="table.field.asnOrderItem.anfme" />,
                <NumberField source="qty" label="table.field.asnOrderItem.qty" />,
                <TextField source="stockUnit" label="table.field.asnOrderItem.stockUnit" />,
                <NumberField source="purQty" label="table.field.asnOrderItem.purQty" />,
                <TextField source="purUnit" label="table.field.asnOrderItem.purUnit" />,
                <TextField source="splrCode" label="table.field.asnOrderItem.splrCode" />,
                <TextField source="splrName" label="table.field.asnOrderItem.splrName" />,
                <TextField source="isptResult$" label="table.field.asnOrderItem.isptResult" />,
                <TextField source="qrcode" label="table.field.asnOrderItem.qrcode" />,
                <TextField source="trackCode" label="table.field.asnOrderItem.barcode" />,
                <TextField source="packName" label="table.field.asnOrderItem.packName" />,
            ]
            const fields = data.map(el => <TextField key={el.fields} source={`extendFields.[${el.fields}]`} label={el.fieldsAlise} />)
            const lastArr = [
                <DateField source="updateTime" label="common.field.updateTime" showTime />,
                <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                    <TextField source="nickname" />
                </ReferenceField>,
                <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 />,
            ]
            setColumns([...arr, ...fields, ...lastArr]);
        } else {
            notify(msg);
        }
    }
    return (
        <Box sx={{ position: 'relative', minHeight: "60vh", }}>
            {isLoading && (
                <LinearProgress
                    sx={{
                        height: "2px",
                        position: 'absolute',
                        top: 0,
                        left: 0,
                        right: 0,
                    }}
                />
            )}
            {columns.length > 0 &&
                <StyledDatagrid
                    preferenceKey='asnOrderItem'
                    bulkActionButtons={false}
                    rowClick={(id, resource, record) => false}
                    omit={['id', 'orderId', 'poDetlId', 'matnrId', 'spec', 'model', 'purQty', 'purUnit', 'qrcode', 'trackCode', 'splrCode', 'platWorkCode', 'projectCode', 'createBy', 'createTime']}
                >
                    {columns.map((column) => column)}
                </StyledDatagrid>}
        </Box>
    )
}
rsf-admin/src/page/orders/outStockItem/index.jsx
New file
@@ -0,0 +1,17 @@
import React from "react";
import {
    ListGuesser,
    EditGuesser,
    ShowGuesser,
} from "react-admin";
import OutStockItemList from "./OutStockItemList";
export default {
    list: OutStockItemList,
    edit: EditGuesser,
    show: ShowGuesser,
    recordRepresentation: (record) => {
        return `${record.maktx}`
    }
};
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/WkOrderItemController.java
@@ -1,9 +1,9 @@
package com.vincent.rsf.server.manager.controller;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
@@ -14,11 +14,14 @@
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.entity.WkOrder;
import com.vincent.rsf.server.manager.entity.WkOrderItem;
import com.vincent.rsf.server.manager.entity.Companys;
import com.vincent.rsf.server.manager.entity.excel.AsnOrderTemplate;
import com.vincent.rsf.server.manager.enums.CompanysType;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.service.AsnOrderItemService;
import com.vincent.rsf.server.manager.service.AsnOrderService;
import com.vincent.rsf.server.manager.service.CompanysService;
import com.vincent.rsf.server.system.controller.BaseController;
import io.swagger.annotations.Api;
@@ -31,6 +34,7 @@
import javax.servlet.http.HttpServletResponse;
import java.util.*;
import java.util.stream.Collectors;
@Api(tags = "ASN单明细")
@RestController
@@ -38,6 +42,9 @@
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private AsnOrderService asnOrderService;
    @Autowired
    private CompanysService companysService;
@@ -48,8 +55,76 @@
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<WkOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, WkOrderItem.class);
        /**拼接扩展字段*/
        /** 拼接扩展字段 */
        PageParam<WkOrderItem, BaseParam> page = asnOrderItemService.page(pageParam, pageParam.buildWrapper(true));
        List<WkOrderItem> records = page.getRecords();
        for (WkOrderItem record : records) {
            if (!Objects.isNull(record.getFieldsIndex())) {
                Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex());
                record.setExtendFields(fields);
            }
        }
        page.setRecords(records);
        return R.ok(page);
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @ApiOperation("分页获取列表")
    @PostMapping("/asnOrderItem/in/page")
    public R pageIn(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<WkOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, WkOrderItem.class);
        // 查询type为"in"的订单ID列表
        List<Long> orderIds = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
                .eq(WkOrder::getType, OrderType.ORDER_IN.type)
                .select(WkOrder::getId))
                .stream()
                .map(WkOrder::getId)
                .collect(Collectors.toList());
        // 构建查询条件,关联asnOrder表筛选type为in的数据
        QueryWrapper<WkOrderItem> wrapper = pageParam.buildWrapper(true);
        if (!orderIds.isEmpty()) {
            wrapper.in("order_id", orderIds);
        } else {
            // 如果没有符合条件的订单,返回空结果
            wrapper.eq("1", "0");
        }
        /** 拼接扩展字段 */
        PageParam<WkOrderItem, BaseParam> page = asnOrderItemService.page(pageParam, wrapper);
        List<WkOrderItem> records = page.getRecords();
        for (WkOrderItem record : records) {
            if (!Objects.isNull(record.getFieldsIndex())) {
                Map<String, String> fields = FieldsUtils.getFields(record.getFieldsIndex());
                record.setExtendFields(fields);
            }
        }
        page.setRecords(records);
        return R.ok(page);
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @ApiOperation("分页获取列表")
    @PostMapping("/asnOrderItem/out/page")
    public R pageOut(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<WkOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, WkOrderItem.class);
        // 查询type为"in"的订单ID列表
        List<Long> orderIds = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
                        .eq(WkOrder::getType, OrderType.ORDER_OUT.type)
                        .select(WkOrder::getId))
                .stream()
                .map(WkOrder::getId)
                .collect(Collectors.toList());
        // 构建查询条件,关联asnOrder表筛选type为in的数据
        QueryWrapper<WkOrderItem> wrapper = pageParam.buildWrapper(true);
        if (!orderIds.isEmpty()) {
            wrapper.in("order_id", orderIds);
        } else {
            // 如果没有符合条件的订单,返回空结果
            wrapper.eq("1", "0");
        }
        /** 拼接扩展字段 */
        PageParam<WkOrderItem, BaseParam> page = asnOrderItemService.page(pageParam, wrapper);
        List<WkOrderItem> records = page.getRecords();
        for (WkOrderItem record : records) {
            if (!Objects.isNull(record.getFieldsIndex())) {
@@ -68,7 +143,7 @@
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @PostMapping({"/asnOrderItem/many/{ids}", "/asnOrderItems/many/{ids}"})
    @PostMapping({ "/asnOrderItem/many/{ids}", "/asnOrderItems/many/{ids}" })
    public R many(@PathVariable Long[] ids) {
        return R.ok().add(asnOrderItemService.listByIds(Arrays.asList(ids)));
    }
@@ -95,7 +170,6 @@
        return R.ok("Save Success");
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:update')")
    @OperationLog("Update ASN单据")
    @PostMapping("/asnOrderItem/update")
@@ -104,7 +178,7 @@
        wkOrderItem.setUpdateTime(new Date());
        if (!Objects.isNull(wkOrderItem.getSplrName()) && StringUtils.isNotBlank(wkOrderItem.getSplrName())) {
            Companys companys = companysService.getOne(new LambdaQueryWrapper<Companys>()
                            .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)
                    .eq(Companys::getType, CompanysType.COMPANYS_TYPE_SUPPLIER.val)
                    .eq(Companys::getId, wkOrderItem.getSplrName()));
            if (!Objects.isNull(companys)) {
                wkOrderItem.setSplrCode(companys.getCode()).setSplrName(companys.getName());
@@ -135,8 +209,7 @@
            wrapper.like(WkOrderItem::getId, condition);
        }
        asnOrderItemService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
        );
                item -> vos.add(new KeyValVo(item.getId(), item.getId())));
        return R.ok().add(vos);
    }
@@ -161,7 +234,6 @@
        ExcelUtil.build(ExcelUtil.create(orderItems, WkOrderItem.class, true), response);
    }
    @PostMapping("/asnOrderItem/generate/barcode")
    @ApiOperation("生成ASN标签")
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
@@ -174,6 +246,7 @@
    /**
     * ASN单据明细导入
     *
     * @param file
     * @return
     */
@@ -182,7 +255,7 @@
    @PreAuthorize("hasAuthority('manager:asnOrder:update')")
    public R importExcel(@RequestParam(value = "file") MultipartFile file) throws Exception {
        if (Objects.isNull(file)) {
           return R.error("文件不能为空!!");
            return R.error("文件不能为空!!");
        }
        HashMap<String, Object> hashMap = new HashMap<>();
        return asnOrderItemService.excelImport(file, hashMap, getLoginUserId());