skyouc
4 天以前 aecc30be4f72119829bf7f607aa6031e15fc3c0c
调拔单功能优化
10个文件已修改
1个文件已添加
329 ■■■■ 已修改文件
rsf-admin/src/page/components/WarehouseSelect.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/ManualCreate.jsx 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/transfer/TransferOrders.jsx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OrgLocParams.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/WarehouseSelect.jsx
@@ -16,7 +16,7 @@
    }, [dictTypeCode]);
    const http = async () => {
        const res = await request.post('/warehouseAreas/page', {});
        const res = await request.post('/warehouseAreas/page', {current: 1, pageSize: 100});
        if (res?.data?.code === 200) {
            setList(res.data.data.records.map((item) => {
                return {
rsf-admin/src/page/orders/transfer/CreateBySelectMats.jsx
@@ -69,9 +69,8 @@
    const reset = () => {
        setFormData({
            name: '',
            code: '',
            groupId: 0
            maktx: '',
            matnrCode: '',
        })
    }
@@ -98,7 +97,7 @@
    };
    const getData = async () => {
        const res = await request.post(`/matnr/page`, {
        const res = await request.post(`/transfer/locs/items`, {
            ...formData,
            current: page,
            pageSize: pageSize,
@@ -147,8 +146,8 @@
                        <Grid item md={3}>
                            <TextField
                                label={translate('table.field.matnr.name')}
                                name="name"
                                value={formData.name}
                                name="maktx"
                                value={formData.maktx}
                                onChange={handleChange}
                                size="small"
                            />
@@ -156,20 +155,10 @@
                        <Grid item md={3}>
                            <TextField
                                label={translate('table.field.matnr.code')}
                                name="code"
                                value={formData.code}
                                name="matnrCode"
                                value={formData.matnrCode}
                                onChange={handleChange}
                                size="small"
                            />
                        </Grid>
                        <Grid item md={3}>
                            <TreeSelectInput
                                label="table.field.matnr.groupId"
                                value={formData.groupId}
                                resource={'matnrGroup'}
                                source="groupId"
                                name="groupId"
                                onChange={handleChange}
                            />
                        </Grid>
                        <Grid item md={2} sx={{ margin: 'auto' }}>
@@ -214,18 +203,15 @@
    const [extendColumns, setExtendColumns] = useState([]);
    const [columns, setColumns] = useState([
        { field: 'name', headerName: translate('table.field.matnr.name'), width: 300 },
        { field: 'code', headerName: translate('table.field.matnr.code'), width: 200 },
        { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), width: 100 },
        { field: 'maktx', headerName: translate('table.field.matnr.name'), width: 300 },
        { field: 'matnrCode', headerName: translate('table.field.matnr.code'), width: 200 },
        // { field: 'groupId$', headerName: translate('table.field.matnr.groupId'), 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 },
        { field: 'weight', headerName: translate('table.field.matnr.weight'), width: 100 },
        { field: 'describle', headerName: translate('table.field.matnr.describle'), width: 100 },
        { field: 'nromNum', headerName: translate('table.field.matnr.nromNum'), width: 100 },
        { field: 'anfme', headerName: translate('table.field.locItem.anfme'), width: 100 },
        { field: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 },
        { field: 'purchaseUnit', headerName: translate('table.field.matnr.purUnit'), width: 100 },
        { field: 'stockUnit', headerName: translate('table.field.matnr.stockUnit'), width: 100 },
        { field: 'stockLeval$', headerName: translate('table.field.matnr.stockLevel'), width: 100, sortable: false },
        { field: 'wareArea', headerName: translate('table.field.locItem.wareArea'), width: 100, sortable: false },
    ])
    const handleSelectionChange = (ids) => {
rsf-admin/src/page/orders/transfer/ManualCreate.jsx
@@ -344,24 +344,22 @@
        },
        {
            field: 'anfme',
            headerName: translate('table.field.outStockItem.anfme') + "*",
            headerName: translate('table.field.outStockItem.anfme'),
            type: 'number',
            minWidth: 100,
            flex: 1,
            editable: true,
            valueFormatter: (val) => val < 0 ? 0 : val,
            headerClassName: "custom",
        },
        {
            field: 'splrCode',
            headerName: translate('table.field.outStockItem.splrCode') + "*",
            headerName: translate('table.field.outStockItem.splrCode'),
            minWidth: 100,
            flex: 1,
            editable: true,
            renderEditCell: (params) => (
                <SelectInputSplrCodeEditCell {...params} />
            ),
            headerClassName: "custom",
        },
        {
            field: 'splrName',
@@ -372,7 +370,6 @@
            renderEditCell: (params) => (
                <SelectInputSplrNameEditCell {...params} />
            ),
            headerClassName: "custom",
        },
        {
            field: 'batch',
rsf-admin/src/page/orders/transfer/TransferOrders.jsx
@@ -11,6 +11,7 @@
    WrapperField,
    useRecordContext,
    DatagridConfigurable,
    useRedirect,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting.js';
@@ -40,6 +41,7 @@
}));
const TransferOrders = () => {
    const redirct = useRedirect();
    const record = useRecordContext();
    if (!record) return null;
    const translate = useTranslate();
@@ -65,12 +67,18 @@
                    perPage={DEFAULT_PAGE_SIZE}
                >
                    <StyledDatagrid
                        sx={{ width: '100%' }}
                        sx={{ margin: 'auto', width: '98%' }}
                        preferenceKey='outStock'
                        bulkActionButtons={false}
                        rowClick={false}
                        rowClick={(id, resource, record) => {
                            if (record.type == 'out') {
                                redirct("/outStock")
                            } else if (record.type == 'in') {
                                redirct("/asnOrder")
                            }
                        }}
                        expandSingle={true}
                        omit={['id', 'createTime', 'createBy$', 'memo']}
                        omit={['id', 'memo']}
                    >
                        <NumberField source="id" />
                        <TextField source="code" label="table.field.transferOrder.code" />
@@ -80,10 +88,10 @@
                        <NumberField source="anfme" label="table.field.transferOrder.anfme" />
                        <NumberField source="workQty" label="table.field.transferOrder.workQty" />
                        <NumberField source="qty" label="table.field.transferOrder.qty" />
                        <TextField source="updateBy$" label="common.field.updateBy" />
                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                        <TextField source="createBy$" label="common.field.createBy" />
                        <TextField source="updateBy$" label="common.field.updateBy" />
                        <DateField source="createTime" label="common.field.createTime" showTime />
                        <DateField source="updateTime" label="common.field.updateTime" showTime />
                        <BillStatusField cellClassName="status" source="exceStatus" label="table.field.outStock.exceStatus" />
                        <TextField source="memo" label="common.field.memo" sortable={false} />
                    </StyledDatagrid>
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TransferController.java
@@ -11,6 +11,7 @@
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.OrgLocParams;
import com.vincent.rsf.server.manager.controller.params.TransferItemParams;
import com.vincent.rsf.server.manager.entity.Transfer;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
@@ -154,7 +155,7 @@
    @ApiOperation("单据信息修改")
    @PostMapping("/transfer/items/update")
    @PreAuthorize("hasAuthority('manager:outStock:update')")
    @PreAuthorize("hasAuthority('manager:transfer:update')")
    public R orderAndrItemUpdate(@RequestBody TransferItemParams params) throws Exception {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
@@ -163,6 +164,18 @@
    }
    @ApiOperation("获取原库区物料信息")
    @PostMapping("/transfer/locs/items")
    @PreAuthorize("hasAuthority('manager:transfer:list')")
    public R locsPage(@RequestBody OrgLocParams params) throws Exception {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return R.ok().add(transferService.getLocsItems(params, getLoginUserId()));
    }
    /**
     * @author Ryan
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OrgLocParams.java
New file
@@ -0,0 +1,30 @@
package com.vincent.rsf.server.manager.controller.params;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@ApiModel(value = "OrgLocParams", description = "原库区物料")
public class OrgLocParams implements Serializable {
    @ApiModelProperty("原库区ID")
    private Long orgAreaId;
    @ApiModelProperty("当前页")
    private Integer current;
    @ApiModelProperty("物料编码")
    private String matnrCode;
    @ApiModelProperty("物料名称")
    private String maktx;
    @ApiModelProperty("当前页数")
    private Integer pageSize;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/TransferOrder.java
@@ -20,13 +20,12 @@
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    @ApiModelProperty("单据类型:in: 入库, out:出库")
    private String type;
    @ApiModelProperty("调拔单ID")
    private Long transferId;
    @ApiModelProperty("订单ID")
    private Long orderId;
    @ApiModelProperty("执行状态")
    private Integer exceStatus;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/OrderWorkType.java
@@ -57,6 +57,8 @@
            return OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.type;
        } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.desc)) {
            return OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type;
        } else if (desc.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.desc)) {
            return OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type;
        }
        return null;
    }
@@ -86,6 +88,8 @@
            return OrderWorkType.ORDER_WORK_TYPE_STOCK_CHECK.desc;
        } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.type)) {
            return OrderWorkType.ORDER_WORK_TYPE_STOCK_TERANSFER.desc;
        } else if (type.equals(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)) {
            return OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.desc;
        }
        return null;
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -13,8 +13,10 @@
import com.vincent.rsf.server.manager.service.impl.TransferOrderServiceImpl;
import com.vincent.rsf.server.manager.utils.LocManageUtil;
import com.vincent.rsf.server.system.constant.GlobalConfigCode;
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.entity.Config;
import com.vincent.rsf.server.system.service.ConfigService;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import com.vincent.rsf.server.system.utils.SystemAuthUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
@@ -92,6 +94,7 @@
     * @version 1.0
     */
    @Scheduled(cron = "0/5 * * * * ?  ")
    @Transactional(rollbackFor = Exception.class)
    public void complateOutStock() throws Exception {
        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
                .eq(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id)
@@ -118,7 +121,7 @@
     * @version 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public void genInStock(List<TaskItem> taskItems) {
    public void genInStock(List<TaskItem> taskItems) throws Exception {
        Set<Long> orderIds = taskItems.stream().map(TaskItem::getSourceId).collect(Collectors.toSet());
        List<WkOrder> wkOrders = outStockService.list(new LambdaQueryWrapper<WkOrder>().in(WkOrder::getId, orderIds));
        wkOrders.forEach(wkOrder -> {
@@ -126,10 +129,21 @@
            if (!orderItems.isEmpty()) {
                WkOrder order = new WkOrder();
                BeanUtils.copyProperties(wkOrder, order);
                String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, order);
                if (StringUtils.isNotBlank(ruleCode)) {
                    throw new CoolException("入库单号生成失败!!");
                }
                order.setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)
                        .setId(null)
                        .setType(OrderType.ORDER_IN.type)
                        .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_RECEIPT_DONE.val);
                        .setCode(ruleCode)
                        .setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val)
                        .setType(OrderType.ORDER_IN.type);
//                Config config = configService.getOne(new LambdaQueryWrapper<Config>().eq(Config::getFlag, GlobalConfigCode.DIRECT_WAIT_PAKIN));
//                if (!Boolean.parseBoolean(config.getVal())) {
//                    order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val);
//                } else {
//                    order.setExceStatus(AsnExceStatus.ASN_EXCE_STATUS_UN_EXCE.val);
//                }
                if (!asnOrderService.save(order)) {
                    throw new CoolException("入库单生成失败!!");
                }
@@ -140,50 +154,60 @@
                       throw new CoolException("入库单明细保存失败!!");
                   }
                });
                Transfer transfer = transferService.getById(order.getPoId());
                TransferOrder transferOrder = new TransferOrder();
                transferOrder.setOrderId(order.getId())
                        .setType(OrderType.ORDER_IN.type)
                        .setTransferId(transfer.getId());
                if (!transferOrderService.save(transferOrder)) {
                    throw new CoolException("关联单保存失败!!");
                }
            }
        });
        Set<Long> taskIds = taskItems.stream().map(TaskItem::getTaskId).collect(Collectors.toSet());
        List<Task> tasks = taskService.listByIds(taskIds);
        if (!tasks.isEmpty()) {
            tasks.forEach(task -> {
                TaskItem one = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()), false);
                if (Objects.isNull(one)) {
                    throw new CoolException("数据错误:任务明细丢失!!");
                }
                TransferOrder order = transferOrderService.getOne(new LambdaQueryWrapper<TransferOrder>().eq(TransferOrder::getOrderId, one.getOrderId()));
                if (Objects.isNull(order)) {
                    throw new CoolException("数据错误!!");
                }
                Transfer transfer = transferService.getById(order.getTransferId());
                Task task1 = new Task();
                BeanUtils.copyProperties(task, task1);
                String targetLoc = LocManageUtil.getTargetLoc(transfer.getTarAreaId());
                if (Objects.isNull(targetLoc)) {
                    throw new CoolException("未能找到有效库位");
                }
                task.setTaskType(TaskType.TASK_TYPE_IN.type)
                        .setTargLoc(targetLoc)
                        .setTargSite(null)
                        .setId(null)
                        .setTaskStatus(TaskStsType.GENERATE_IN.id);
                if (!taskService.save(task1)) {
                    throw new CoolException("任务生成失败!!");
                }
                List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
                if (items.isEmpty()) {
                    throw new CoolException("数据错误!!");
                }
                items.forEach(taskItem -> {
                    TaskItem item = new TaskItem();
                    BeanUtils.copyProperties(taskItem, item);
                    item.setTaskId(task1.getId()).setId(null);
                    if (!taskItemService.save(item)) {
                        throw new CoolException("入库任务明细保存失败!!");
                    }
                });
            });
        }
//        Set<Long> taskIds = taskItems.stream().map(TaskItem::getTaskId).collect(Collectors.toSet());
//        List<Task> tasks = taskService.listByIds(taskIds);
//        if (!tasks.isEmpty()) {
//            tasks.forEach(task -> {
//                TaskItem one = taskItemService.getOne(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()), false);
//                if (Objects.isNull(one)) {
//                    throw new CoolException("数据错误:任务明细丢失!!");
//                }
//                TransferOrder order = transferOrderService.getOne(new LambdaQueryWrapper<TransferOrder>().eq(TransferOrder::getOrderId, one.getOrderId()));
//                if (Objects.isNull(order)) {
//                    throw new CoolException("数据错误!!");
//                }
//                Transfer transfer = transferService.getById(order.getTransferId());
//                Task task1 = new Task();
//                BeanUtils.copyProperties(task, task1);
//                String targetLoc = LocManageUtil.getTargetLoc(transfer.getTarAreaId());
//                if (Objects.isNull(targetLoc)) {
//                    throw new CoolException("未能找到有效库位");
//                }
//                task.setTaskType(TaskType.TASK_TYPE_IN.type)
//                        .setTargLoc(targetLoc)
//                        .setTargSite(null)
//                        .setId(null)
//                        .setTaskStatus(TaskStsType.GENERATE_IN.id);
//                if (!taskService.save(task1)) {
//                    throw new CoolException("任务生成失败!!");
//                }
//                List<TaskItem> items = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
//                if (items.isEmpty()) {
//                    throw new CoolException("数据错误!!");
//                }
//                items.forEach(taskItem -> {
//                    TaskItem item = new TaskItem();
//                    BeanUtils.copyProperties(taskItem, item);
//                    item.setTaskId(task1.getId()).setId(null);
//                    if (!taskItemService.save(item)) {
//                        throw new CoolException("入库任务明细保存失败!!");
//                    }
//                });
//            });
//        }
    }
    /**
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TransferService.java
@@ -6,7 +6,9 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.OrgLocParams;
import com.vincent.rsf.server.manager.controller.params.TransferItemParams;
import com.vincent.rsf.server.manager.entity.LocItem;
import com.vincent.rsf.server.manager.entity.Transfer;
import com.vincent.rsf.server.manager.entity.WkOrder;
@@ -23,5 +25,7 @@
    Transfer genOutStock(Transfer transfer, Long loginUserId);
    boolean removeTransfer(List<Long> list);
    IPage<LocItem> getLocsItems(OrgLocParams params, Long loginUserId);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TransferServiceImpl.java
@@ -3,11 +3,13 @@
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.common.domain.PageResult;
import com.vincent.rsf.server.manager.controller.params.OrgLocParams;
import com.vincent.rsf.server.manager.controller.params.TransferItemParams;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
@@ -40,6 +42,14 @@
    private TransferOrderService transferOrderService;
    @Autowired
    private TransferService transferService;
    @Autowired
    private AsnOrderService asnOrderService;
    @Autowired
    private AsnOrderItemService asnOrderItemService;
    @Autowired
    private LocItemService locItemService;
    @Autowired
    private LocService locService;
    /**
     * @author Ryan
@@ -239,13 +249,66 @@
        }
        TransferOrder transferOrder = new TransferOrder();
        transferOrder.setTransferId(transfer.getId()).setOrderId(wkOrder.getId()).setExceStatus((int)CheckExceStatus.CHECK_ORDER_STATUS_INIT.val);
        transferOrder.setTransferId(transfer.getId())
                .setOrderId(wkOrder.getId())
                .setType(OrderType.ORDER_OUT.type);
        if (!transferOrderService.save(transferOrder)) {
            throw new CoolException("单据关联失败!!");
        }
        try {
            /**生成入库单据信息*/
            genInStock(wkOrder, orderItems);
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
        return transfer;
    }
    /**
     * @author Ryan
     * @date 2025/7/29
     * @description: TODO
     * @version 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public void genInStock(WkOrder wkOrder, List<WkOrderItem> orderItems) throws Exception {
        WkOrder order = new WkOrder();
        BeanUtils.copyProperties(wkOrder, order);
        order.setType(OrderType.ORDER_IN.type)
                .setWkType(OrderWorkType.ORDER_WORK_TYPE_OTHER_TERANSFER.type)
                .setId(null);
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_ASN_ORDER, order);
        if (StringUtils.isBlank(ruleCode)) {
            throw new CoolException("入库单号生成失败!!");
        }
        order.setCode(ruleCode);
        if (!asnOrderService.save(order)) {
            throw new CoolException("单据保存失败!!");
        }
        orderItems.forEach(item -> {
            item.setOrderId(order.getId())
                    .setOrderCode(order.getCode())
                    .setId(null);
            if (!asnOrderItemService.save(item)) {
                throw new CoolException("入库单明细保存失败!!");
            }
        });
        TransferOrder transferOrder = new TransferOrder();
        transferOrder.setTransferId(wkOrder.getPoId())
                .setOrderId(order.getId())
                .setType(OrderType.ORDER_IN.type);
        if (!transferOrderService.save(transferOrder)) {
            throw new CoolException("单据关联失败!!");
        }
    }
    /**
@@ -273,4 +336,29 @@
        transferItemService.remove(new LambdaQueryWrapper<TransferItem>().in(TransferItem::getTransferId, list));
        return true;
    }
    /**
     * @author Ryan
     * @date 2025/7/29
     * @description: 获取原库区物料信息
     * @version 1.0
     */
    @Override
    public IPage<LocItem> getLocsItems(OrgLocParams params, Long loginUserId) {
        List<Loc> locs = locService.list(new LambdaQueryWrapper<Loc>()
                .eq(!Objects.isNull(params.getOrgAreaId()), Loc::getAreaId, params.getOrgAreaId()));
        Page<LocItem> page = new Page<>(params.getCurrent(), params.getPageSize());
        LambdaQueryWrapper<LocItem> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(StringUtils.isNotBlank(params.getMatnrCode()), LocItem::getMatnrCode, params.getMatnrCode().trim())
                .like(StringUtils.isNotBlank(params.getMaktx().trim()), LocItem::getMaktx, params.getMaktx().trim());
        if (!locs.isEmpty()) {
            Set<Long> locIds = locs.stream().map(Loc::getId).collect(Collectors.toSet());
            wrapper.in(LocItem::getLocId, locIds);
            return locItemService.page(page, wrapper);
        } else {
            return locItemService.page(page, wrapper);
        }
    }
}