skyouc
3 天以前 e67ab87058ea64c3a9d24df70f1b9a18a9f14a0e
调拔单功能优化
9个文件已修改
316 ■■■■■ 已修改文件
rsf-admin/src/page/components/WarehouseSelect.jsx 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/MatnrInfoModal.jsx 32 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/ManualCreate.jsx 45 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java 143 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/WarehouseSelect.jsx
@@ -16,7 +16,7 @@
    }, [dictTypeCode]);
    const http = async () => {
        const res = await request.post('/warehouseAreas/page', {current: 1, pageSize: 100});
        const res = await request.post('/warehouseAreas/page', { current: 1, pageSize: 100 });
        if (res?.data?.code === 200) {
            setList(res.data.data.records.map((item) => {
                return {
@@ -40,7 +40,7 @@
    const validValue = list.some(item => item.id === value) ? value : '';
    return (
        <FormControl fullWidth>
        <FormControl required fullWidth>
            <InputLabel id="demo-select-small-label">{label}</InputLabel>
            <Select
                labelId="demo-select-small-label"
rsf-admin/src/page/orders/outStock/MatnrInfoModal.jsx
@@ -13,6 +13,7 @@
    styled
} from '@mui/material';
import DialogCloseButton from "../../components/DialogCloseButton";
import { EDIT_MODE, DEFAULT_START_PAGE, DEFAULT_PAGE_SIZE, REFERENCE_INPUT_PAGESIZE } from '@/config/setting';
import { useTranslate, useNotify, useRefresh } from 'react-admin';
import request from '@/utils/request';
import { DataGrid } from '@mui/x-data-grid';
@@ -35,7 +36,9 @@
    const [tableData, setTableData] = useState([]);
    const [dyFields, setDyFields] = useState([]);
    const [selectedRows, setSelectedRows] = useState([]);
    const [page, setPage] = useState({ page: DEFAULT_START_PAGE, pageSize: DEFAULT_PAGE_SIZE });
    const [rowCount, setRowCount] = useState(0);
    const [isLoading, setIsLoading] = useState(false);
    const handleChange = (e) => {
        const { name, value } = e.target;
        setFormData(() => ({
@@ -74,22 +77,27 @@
    };
    const getData = async () => {
        setIsLoading(true)
        const res = await request.post(`/matnr/page`, {
            ...formData,
            current: 1,
            pageSize: 100,
            current: page?.page,
            pageSize: page?.pageSize,
            orderBy: "create_time desc"
        });
        if (res?.data?.code === 200) {
            setTableData(res.data.data.records);
            setRowCount(res.data?.data?.total);
        } else {
            notify(res.data.msg);
        }
        setIsLoading(false)
    };
    useEffect(() => {
        getData();
    }, [open]);
    }, [open, page]);
    const handleSearch = () => {
        getData()
@@ -158,6 +166,9 @@
                        tableData={tableData}
                        setTableData={setTableData}
                        dyFields={dyFields}
                        page={page}
                        rowCount={rowCount}
                        setPage={setPage}
                        setDyFields={setDyFields}
                        selectedRows={selectedRows}
                        setSelectedRows={setSelectedRows}
@@ -177,7 +188,7 @@
export default MatnrInfoModal;
const AsnWareModalTable = ({ tableData, setTableData, selectedRows, setSelectedRows, dyFields, setDyFields }) => {
const AsnWareModalTable = ({ tableData, setTableData, page, isLoading, pageSize, setPage, rowCount, selectedRows, setSelectedRows, dyFields, setDyFields }) => {
    const translate = useTranslate();
    const notify = useNotify();
@@ -241,6 +252,17 @@
                disableColumnMenu={true}
                disableColumnSorting
                disableMultipleColumnsSorting
                rowCount={rowCount}
                paginationMode="server"
                paginationModel={page}
                onPaginationModelChange={setPage}
                loading={isLoading}
                slotProps={{
                    loadingOverlay: {
                        variant: 'linear-progress',
                        noRowsVariant: 'linear-progress',
                    },
                }}
            />
        </div>
    );
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx
@@ -79,6 +79,7 @@
                return acc;
            }, {});
            return {
                id: el.id,
                matnrId: el.matnrId,
                maktx: el.maktx,
                matnrCode: el.matnrCode,
@@ -272,14 +273,19 @@
    return (
        <div style={{ height: 400, width: '100%' }}>
            <DataGrid
                rows={tableData}
                rowCount={rowCount}
                columns={columns}
                paginationMode="server"
                paginationModel={page}
                checkboxSelection
                onPaginationModelChange={setPage}
                onRowSelectionModelChange={handleSelectionChange}
                selectionModel={selectedRows}
                disableColumnMenu={true}
                disableColumnSorting
                disableMultipleColumnsSorting
                loading={isLoading}
                slotProps={{
                    loadingOverlay: {
rsf-admin/src/page/orders/transfer/ManualCreate.jsx
@@ -59,7 +59,7 @@
    const [disabled, setDisabled] = useState(false);
    const [selectedRows, setSelectedRows] = useState([]);
    const [createDialog, setCreateDialog] = useState(false);
    const [formData, setFormData] = useState({});
    const [formData, setFormData] = useState({ type: '1', orgAreaId: null, tarAreaId: null });
    const [list, setList] = useState([]);
    const handleClose = (event, reason) => {
@@ -139,6 +139,18 @@
        }
    }
    const newAddClick = () => {
        if (formData.orgAreaId == null || formData.orgAreaId == undefined) {
            notify("原库区不能为空!!", { type: 'error' })
            return
        }
        if (formData.tarAreaId == null || formData.tarAreaId == undefined) {
            notify("目标库区不能为空!!", { type: 'error' })
            return
        }
        setCreateDialog(true)
    }
    const handleChange = (value, name) => {
        setFormData((prevData) => ({
@@ -159,7 +171,6 @@
                                variant="filled"
                                onChange={(e) => handleChange(e.target.value, 'type')}
                                dictTypeCode="sys_transfer_type"
                                required
                            />
                        </Grid>
                        <Grid item md={2}>
@@ -167,7 +178,6 @@
                                value={formData.orgAreaId}
                                variant="filled"
                                dictTypeCode="warehouse"
                                required
                                onChange={(e) => handleChange(e.target.value, 'orgAreaId')}
                                label={translate("table.field.transfer.orgAreaName")} />
                        </Grid>
@@ -177,7 +187,6 @@
                                value={formData.tarAreaId}
                                dictTypeCode="warehouse"
                                variant="filled"
                                required
                                onChange={(e) => handleChange(e.target.value, 'tarAreaId')}
                            />
                        </Grid>
@@ -185,7 +194,7 @@
                </SimpleForm>
                <Box sx={{ mt: 2 }}>
                    <Stack direction="row" spacing={2} sx={{ justifyContent: "flex-end" }}>
                        <Button variant="contained" onClick={() => setCreateDialog(true)} >
                        <Button variant="contained" onClick={newAddClick} >
                            {translate('common.action.newAddMats')}
                        </Button>
                        <ConfirmButton label={"toolbar.delete"} variant="outlined" color="error" onConfirm={handleDeleteItem} />
@@ -195,7 +204,7 @@
                    <TransferTableView
                        tabelData={tabelData}
                        setTableData={setTableData}
                        asnId={orderId}
                        orderId={orderId}
                        selectedRows={selectedRows}
                        setSelectedRows={setSelectedRows}
                        tableRef={tableRef}>
@@ -209,6 +218,8 @@
                <CreateBySelectMats
                    open={createDialog}
                    setOpen={setCreateDialog}
                    selectedRows={selectedRows}
                    setSelectedRows={setSelectedRows}
                    data={tabelData}
                    setData={setTableData}
                />
@@ -454,6 +465,11 @@
    tableRef.current = useGridApiRef();
    const tableIds = tabelData.map(map => map.id);
    // setSelectedRows(tableIds);
    // // console.log(selectedRows);
    return (
        <Box>
            <DataGrid
@@ -461,12 +477,6 @@
                rows={tabelData}
                columns={columns}
                disableRowSelectionOnClick
                getRowId={(row) => row.matnrId ? row.matnrId : row.id}
                disableColumnFilter
                disableColumnSelector
                disableColumnSorting
                disableMultipleColumnsSorting
                processRowUpdate={processRowUpdate}
                initialState={{
                    pagination: {
                        paginationModel: {
@@ -477,8 +487,8 @@
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                rowSelectionModel={tableIds}
                onRowSelectionModelChange={handleSelectionChange}
                selectionModel={selectedRows}
                sx={{
                    height: 580,
                    '& .MuiDataGrid-cell input': {
@@ -486,15 +496,6 @@
                    },
                }}
            />
            {/* <Box sx={{
                padding: 2,
                position: 'absolute',
                right: 1
            }}>
                <Button variant="contained" onClick={() => handleSubmit()} startIcon={<SaveIcon/>} >
                    {translate('toolbar.confirm')}
                </Button>
            </Box> */}
        </Box>
    );
};
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/AsnExceStatus.java
@@ -13,9 +13,10 @@
    ASN_EXCE_STATUS_UN_EXCE("0", "未执行"),
    ASN_EXCE_STATUS_EXCE_ING("1", "执行中"),
    ASN_EXCE_STATUS_RECEIPT_DONE("2", "收货完成"),
    ASN_EXCE_STATUS_TASK_DONE("3", "已完成"),
    ASN_EXCE_STATUS_TASK_CANCEL("4", "取消"),
    ASN_EXCE_STATUS_TASK_CLOSE("5", "已关闭"),
    ASN_EXCE_STATUS_TASK_EXCE("3", "任务执行中"),
    ASN_EXCE_STATUS_TASK_DONE("4", "已完成"),
    ASN_EXCE_STATUS_TASK_CANCEL("8", "取消"),
    ASN_EXCE_STATUS_TASK_CLOSE("9", "已关闭"),
    //PO单执行状态
//    PO_EXCE_STATUS_UN_EXCE("0", "未执行"),
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/AsnOrderLogSchedule.java
@@ -6,8 +6,10 @@
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
import com.vincent.rsf.server.manager.enums.POExceStatus;
import com.vincent.rsf.server.manager.service.*;
import com.vincent.rsf.server.manager.service.impl.TransferOrderServiceImpl;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.scheduling.annotation.Scheduled;
@@ -42,6 +44,8 @@
    private AsnOrderLogService asnOrderLogService;
    @Autowired
    private AsnOrderItemLogService asnOrderItemLogService;
    @Autowired
    private TransferOrderService transferOrderService;
    /**
     * @param
@@ -52,10 +56,10 @@
     */
    @Scheduled(cron = "0/35 * * * * ?  ")
    @Transactional(rollbackFor = Exception.class)
    public void moveOrderToLog() {
    public void InStockToLog() {
        List<WkOrder> wkOrders = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
                .eq(WkOrder::getType, OrderType.ORDER_IN.type)
                .eq(WkOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val));
                .eq(WkOrder::getExceStatus, AsnExceStatus.ASN_EXCE_STATUS_TASK_EXCE.val));
        if (wkOrders.isEmpty()) {
            return;
        }
@@ -79,8 +83,8 @@
    public void outStockComplete() {
        List<WkOrder> wkOrders = asnOrderService.list(new LambdaQueryWrapper<WkOrder>()
                .eq(WkOrder::getType, OrderType.ORDER_OUT.type)
                .eq(WkOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val)
                .apply("anfme = work_qty")
                .eq(WkOrder::getExceStatus, AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val)
                .apply("anfme = qty")
        );
        if (wkOrders.isEmpty()) {
            return;
@@ -102,7 +106,7 @@
     * @time 2025/6/16 08:56
     */
    @Transactional(rollbackFor = Exception.class)
    public void moveOrderToLog(List<WkOrder> wkOrders, String type) throws Exception{
    public void moveOrderToLog(List<WkOrder> wkOrders, String type) {
        Set<Long> longSet = wkOrders.stream().map(WkOrder::getId).collect(Collectors.toSet());
        List<WkOrderItem> orderItems = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                .in(WkOrderItem::getOrderId, longSet));
@@ -111,64 +115,93 @@
        }
        for (WkOrder order : wkOrders) {
            AsnOrderLog orderLog = new AsnOrderLog();
            if (type.equals(OrderType.ORDER_OUT.type)) {
                order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
                order.setQty(order.getWorkQty());
            }
            BeanUtils.copyProperties(order, orderLog);
            orderLog.setId(null);
            orderLog.setAsnId(order.getId());
            AsnOrderLog one = asnOrderLogService.getOne(new LambdaQueryWrapper<AsnOrderLog>().eq(AsnOrderLog::getCode, order.getCode()), false);
            if (Objects.isNull(one)) {
                AsnOrderLog orderLog = new AsnOrderLog();
                if (type.equals(OrderType.ORDER_OUT.type)) {
                    order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
                    order.setQty(order.getWorkQty());
                }
                BeanUtils.copyProperties(order, orderLog);
                orderLog.setId(null);
                orderLog.setAsnId(order.getId());
            if (!asnOrderLogService.save(orderLog)) {
                throw new CoolException("主单历史档添加失败!!");
            }
                if (!asnOrderLogService.save(orderLog)) {
                    throw new CoolException("主单历史档添加失败!!");
                }
            List<AsnOrderItemLog> logs = new ArrayList<>();
            List<WkOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                    .eq(WkOrderItem::getOrderId, order.getId()));
            items.forEach(item -> {
                AsnOrderItemLog itemLog = new AsnOrderItemLog();
                BeanUtils.copyProperties(item, itemLog);
                itemLog.setAsnItemId(itemLog.getId())
                        .setId(null)
                        .setMatnrId(item.getMatnrId())
                        .setLogId(orderLog.getId())
                        .setAsnId(item.getOrderId());
                logs.add(itemLog);
            });
                List<AsnOrderItemLog> logs = new ArrayList<>();
                List<WkOrderItem> items = asnOrderItemService.list(new LambdaQueryWrapper<WkOrderItem>()
                        .eq(WkOrderItem::getOrderId, order.getId()));
                items.forEach(item -> {
                    AsnOrderItemLog itemLog = new AsnOrderItemLog();
                    BeanUtils.copyProperties(item, itemLog);
                    itemLog.setAsnItemId(itemLog.getId())
                            .setId(null)
                            .setMatnrId(item.getMatnrId())
                            .setLogId(orderLog.getId())
                            .setAsnId(item.getOrderId());
                    logs.add(itemLog);
                });
            if (!asnOrderItemLogService.saveBatch(logs)) {
                throw new CoolException("单据明细历史档保存失败!!");
            }
                if (!asnOrderItemLogService.saveBatch(logs)) {
                    throw new CoolException("单据明细历史档保存失败!!");
                }
            //更新PO/DO单执行状态
            if (type.equals(OrderType.ORDER_IN.type)) {
                if (!Objects.isNull(order.getPoId())) {
                    if (!purchaseService.update(new LambdaUpdateWrapper<Purchase>()
                            .set(Purchase::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val)
                            .eq(Purchase::getId, order.getPoId()))) {
                        throw new CoolException("PO单更新状态更新失败!!");
                //更新PO/DO单执行状态
                if (type.equals(OrderType.ORDER_IN.type)) {
                    if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)) {
                        order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_DONE.val);
                        if (!asnOrderService.updateById(order)) {
                            throw new CoolException("单据状态更新失败!!");
                        }
                        List<TransferOrder> orders = transferOrderService.list(new LambdaQueryWrapper<TransferOrder>().eq(TransferOrder::getTransferId, order.getPoId()));
                        if (orders.isEmpty()) {
                            throw new CoolException("数据错误:关联表信息不存在!!");
                        }
                        Set<Long> orderIds = orders.stream().map(TransferOrder::getOrderId).collect(Collectors.toSet());
                        if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
                                .in(WkOrderItem::getOrderId, orderIds))) {
                            throw new CoolException("原单据明细删除失败!!");
                        }
                        if (!this.asnOrderService.removeByIds(orderIds)) {
                            throw new CoolException("原单据删除失败!!");
                        }
                        return;
                    } else {
                        if (!Objects.isNull(order.getPoId())) {
                            purchaseService.update(new LambdaUpdateWrapper<Purchase>()
                                    .set(Purchase::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val)
                                    .eq(Purchase::getId, order.getPoId()));
                        }
                    }
                } else {
                    if (order.getWkType().equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)) {
                        order.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
                        if (!asnOrderService.updateById(order)) {
                            throw new CoolException("单据状态更新失败!!");
                        }
                        //如果为调拔单执行完成,需检查调拔入库单是否完成,完成后才能删除单据信息
                        return;
                    } else {
                        if (!Objects.isNull(order.getPoId())) {
                            deliveryService.update(new LambdaUpdateWrapper<Delivery>()
                                    .eq(Delivery::getId, order.getPoId())
                                    .set(Delivery::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val));
                        }
                    }
                }
            } else {
                if (!Objects.isNull(order.getPoId())) {
                    if (!deliveryService.update(new LambdaUpdateWrapper<Delivery>()
                            .eq(Delivery::getId, order.getPoId())
                            .set(Delivery::getExceStatus, POExceStatus.PO_EXCE_STATUS_ALL_DONE.val))) {
                        throw new CoolException("DO单更新状态更新失败");
                    }
                }
            }
            if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
                    .eq(WkOrderItem::getOrderId, order.getId()))) {
                throw new CoolException("原单据明细删除失败!!");
            }
            if (!this.asnOrderService.removeById(order.getId())) {
                throw new CoolException("原单据删除失败!!");
            }
        }
//        if (!asnOrderItemService.remove(new LambdaQueryWrapper<WkOrderItem>()
//                .in(WkOrderItem::getOrderId, longSet))) {
//            throw new CoolException("原单据明细删除失败!!");
//        }
//        if (!this.asnOrderService.removeByIds(longSet)) {
//            throw new CoolException("原单据删除失败!!");
//        }
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -16,7 +16,6 @@
    R generateAGVTasks(WaitPakin waitPakins, String locCode, String orgSta, Long loginUserId);
    //    R completeTask(String id);
    void completeTask(List<Task> task) throws Exception;
    R removeTask(Long[] ids, Long loginUserId);
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -155,9 +155,7 @@
        if (!this.remove(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getId, id))) {
            throw new CoolException("主单删除失败!!");
        }
        if (!outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, id))) {
            throw new CoolException("单据明细删除失败!!");
        }
        outStockItemService.remove(new LambdaQueryWrapper<WkOrderItem>().eq(WkOrderItem::getOrderId, id));
        return R.ok("操作成功");
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -411,17 +411,18 @@
    public void complateInTask(List<Task> tasks) throws Exception {
        Long loginUserId = SystemAuthUtils.getLoginUserId();
        for (Task task : tasks) {
            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
                //1.入库
                complateInstock(task, loginUserId);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) {
                //53.拣料再入库
                //57.盘点再入库
                pickComplateInStock(task, loginUserId);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
                //移库
                moveInStock(task, loginUserId);
            }
//            if (task.getTaskType().equals(TaskType.TASK_TYPE_IN.type)) {
//
//            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type) || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) {
//                //53.拣料再入库
//                //57.盘点再入库
//                pickComplateInStock(task, loginUserId);
//            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_LOC_MOVE.type)) {
//                //移库
//                moveInStock(task, loginUserId);
//            }
            //1.入库
            complateInstock(task, loginUserId);
        }
    }
@@ -636,19 +637,14 @@
    @Synchronized
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void completeTask(List<Task> tasks) throws Exception {
    public void completeTask(List<Task> tasks) {
        Long loginUserId = SystemAuthUtils.getLoginUserId();
        for (Task task : tasks) {
            //出库任务
            if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
                //全托出库
            try {
                complateOutStock(task, loginUserId);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
                //拣料出库
                complateOutStock(task, loginUserId);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) {
                //盘点出库
                complateOutStock(task, loginUserId);
            } catch (Exception e) {
                throw new CoolException(e.getMessage());
            }
        }
    }
@@ -1152,13 +1148,7 @@
                    }
                } else if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_ORDER_TYPE.val)
                        || task.getResource().equals(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val)) {
                    WkOrderItem orderItem = new WkOrderItem();
                    if (task.getResource().equals(TaskResouceType.TASK_RESOUCE_CHECK_TYPE.val)) {
                        CheckDiffItem diffItem = checkDiffItemService.getById(key);
                    } else {
                        orderItem = asnOrderItemService.getById(key);
                    }
                    WkOrderItem orderItem = asnOrderItemService.getById(key);
                    if (Objects.isNull(orderItem)) {
                        throw new CoolException("单据明细不存在!!");
                    }
@@ -1246,13 +1236,14 @@
                .setUpdateBy(loginUserId)
                .setUpdateTime(new Date())
                .setAnfme(sum);
        if (Objects.isNull(waveItem)) {
            stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type))
                    .setMemo("库存出库,无单据信息!!")
                    .setType(OrderType.ORDER_OUT.type);
        if (!Objects.isNull(waveItem)) {
            //TODO 生成波次时需要将波次号写入单据,通过物料,批次,动态字段等唯一值反查单据信息
            stock.setSourceId(waveItem.getId()).setType(OrderType.ORDER_OUT.type);
        } else if (!Objects.isNull(orderItem) && StringUtils.isNotBlank(orderItem.getId() + "")) {
            WkOrder wkOrder = asnOrderService.getById(orderItem.getOrderId());
            wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_DONE.val);
            Double qty = Math.round((wkOrder.getQty() + sum) * 10000) / 10000.0;
            wkOrder.setExceStatus(AsnExceStatus.OUT_STOCK_STATUS_TASK_WORKING.val)
                    .setQty(qty);
            if (!asnOrderService.updateById(wkOrder)) {
                throw new CoolException("出库单更新失败!!");
            }
@@ -1262,8 +1253,9 @@
            stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type))
                    .setType(OrderType.ORDER_CHECK.type);
        } else {
            //TODO 生成波次时需要将波次号写入单据,通过物料,批次,动态字段等唯一值反查单据信息
            stock.setSourceId(waveItem.getId()).setType(OrderType.ORDER_OUT.type);
            stock.setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_STOCK_OUT.type))
                    .setMemo("库存出库,无单据信息!!")
                    .setType(OrderType.ORDER_OUT.type);
        }
        if (!stockService.save(stock)) {
            throw new CoolException("库存保存失败!!");
@@ -1451,8 +1443,7 @@
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) throws
            Exception {
    public void saveStockItems(List<TaskItem> items, Task task, Long id, String code, Short wkType, String type, Long loginUserId) {
        Stock stock = new Stock();
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
        if (StringUtils.isBlank(ruleCode)) {
@@ -1497,5 +1488,14 @@
        if (!stockItemService.saveBatch(stockItems)) {
            throw new CoolException("库存修改架失败!!");
        }
        WkOrder order = asnOrderService.getOne(new LambdaQueryWrapper<WkOrder>().eq(WkOrder::getCode, code));
        if (!Objects.isNull(order)) {
            Double qty = Math.round((order.getQty() + sum) * 10000) / 10000.0;
            order.setQty(qty).setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_TASK_EXCE.val);
            if (!asnOrderService.updateById(order)) {
                throw new CoolException("入库单状态修改失败!!");
            }
        }
    }
}