skyouc
昨天 2938aa734a2cf0baf93fdced92ea21e37f187365
出库单下发执行生成任务明细
13个文件已修改
1个文件已添加
265 ■■■■ 已修改文件
rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx 73 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java 16 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 56 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnWareModal.jsx
@@ -20,11 +20,9 @@
import TreeSelectInput from "@/page/components/TreeSelectInput";
const AsnWareModal = (props) => {
    const { open, setOpen, data, setData } = props;
    const translate = useTranslate();
    const notify = useNotify();
    const refresh = useRefresh();
    const handleClose = (event, reason) => {
        if (reason !== "backdropClick") {
            setOpen(false);
@@ -55,7 +53,6 @@
        const hasarr = data.map(el => +el.matnrId)
        const selectedData = selectedRows.filter(item => !hasarr.includes(item)).map(id => (tableData.find(row => row.id === id)));
        const value = selectedData.map((el => {
            console.log(el);
            const dynamicFields = dyFields.reduce((acc, item) => {
                acc[item.fields] = el['extendFields']?.[item.fields] || '';
                return acc;
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
@@ -13,7 +13,6 @@
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    Toolbar,
    useRecordContext,
    useTranslate,
    useNotify,
@@ -45,7 +44,6 @@
import { Grid, margin, Stack, width } from "@mui/system";
import request from '@/utils/request';
import SaveIcon from '@mui/icons-material/Save';
import debounce from "lodash/debounce";
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -1,4 +1,4 @@
import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, Tooltip } from "@mui/material";
import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, Tooltip, IconButton } from "@mui/material";
import React, { useState, useRef, useEffect, useMemo } from "react";
import {
    List,
@@ -13,7 +13,6 @@
    ExportButton,
    BulkDeleteButton,
    WrapperField,
    Toolbar,
    useRecordContext,
    useTranslate,
    useNotify,
@@ -36,14 +35,17 @@
    SimpleForm,
    required,
    Form,
    useRefresh,
    useRedirect,
} from 'react-admin';
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE, DEFAULT_ITEM_PAGE_SIZE } from '@/config/setting';
import { styled } from '@mui/material/styles';
import { DataGrid, useGridApiContext } from '@mui/x-data-grid';
import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid';
import request from '@/utils/request';
import ConfirmationNumberOutlinedIcon from '@mui/icons-material/ConfirmationNumberOutlined';
import CloseSharpIcon from '@mui/icons-material/CloseSharp';
import ConfirmButton from '../../components/ConfirmButton';
import { Delete, Edit, Add } from '@mui/icons-material';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -60,8 +62,8 @@
const OutStockPublic = (props) => {
    const { record, open, setOpen } = props;
    const dataGridRef = useRef(null);
    const notify = useNotify();
    const gridRef = useGridApiRef();
    const [rows, setRows] = useState({});
    const translate = useTranslate();
    const [selectedIds, setSelectedIds] = React.useState([]);
@@ -91,11 +93,14 @@
            [name]: value
        }));
    };
    gridRef.current = useGridApiRef();
    return (
        <>
            <Box>
                <Grid sx={{ display: "flex" }} container rowSpacing={2} columnSpacing={2}>
                    <Grid item xl={6} gap={2} >
                    <Grid item xl={5.7} gap={2} >
                        <Card>
                            <Form>
                                <ReferenceInput
@@ -124,9 +129,7 @@
                                empty={false}
                                filter={{ asnId: record?.id, deleted: 0 }}
                                sort={{ field: "create_time", order: "desc" }}
                                actions={(
                                    <SelectColumnsButton preferenceKey='outStock' />
                                )}
                                actions={false}
                                perPage={DEFAULT_ITEM_PAGE_SIZE}
                            >
                                <LinearProgress
@@ -152,12 +155,13 @@
                            </List>
                        </Card>
                    </Grid>
                    <Grid item xl={6} gap={2}>
                    <Grid item xl={6.3} gap={2}>
                        <Card>
                            <Box>
                            <Box sx={{ height: 500, width: '100%' }}>
                                <DataGrid
                                    rows={rows}
                                    columns={columns}
                                    apiRef={gridRef}
                                    initialState={{
                                        pagination: {
                                            paginationModel: {
@@ -165,17 +169,16 @@
                                            },
                                        },
                                    }}
                                    ref={dataGridRef}
                                    checkboxSelection
                                    pageSizeOptions={[15, 25, 35, 45]}
                                    onRowSelectionModelChange={(ids) => {
                                        setSelectedIds(ids)
                                    }}
                                    pageSizeOptions={[15, 25, 35, 45]}
                                />
                            </Box>
                            <Box sx={{ textAlign: 'center' }}>
                                <CloseButton setOpen={setOpen} />
                                <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} />
                                <SubmitButton selectedIds={selectedIds} setSelectedIds={setSelectedIds} gridRef={gridRef} />
                            </Box>
                        </Card>
                    </Grid>
@@ -187,12 +190,20 @@
//提交按钮
const SubmitButton = ({ selectedIds, setSelectedIds }) => {
    const submit = () => {
        if (selectedIds.length < 1) { return }
        console.log(selectedIds);
const SubmitButton = ({ selectedIds, setSelectedIds, gridRef }) => {
    const notify = useNotify();
    const refresh = useRefresh();
    const redirect = useRedirect();
    const submit = async () => {
        const items = gridRef.current?.getSortedRows();
        const { data: { code, data, msg } } = await request.post('/outStock/generate/tasks', { items });
        if (code == 200) {
            refresh();
            redirect("/task")
        } else {
            notify(msg);
        }
    }
    return (
        <ConfirmButton
            label="toolbar.confirm"
@@ -220,14 +231,13 @@
    )
}
const columns = [
    { field: 'id', headerName: 'ID', width: 40 },
    { field: 'locCode', headerName: '库位', width: 110 },
    { field: 'barcode', headerName: '容器', width: 120 },
    { field: 'batch', headerName: '批次', width: 90 },
    { field: 'unit', headerName: '单位', width: 90 },
    { field: 'workQty', headerName: '本次出库数量', width: 110 },
    { field: 'outQty', headerName: '本次出库数量', width: 110 },
    {
        field: 'siteNo',
        headerName: '出库口',
@@ -241,8 +251,31 @@
            <OutStockSite {...params} />
        ),
    },
    {
        field: 'actions',
        type: 'actions',
        headerName: '操作',
        with: 120,
        getActions: (params) => [
            <GridActionsCellItem
                icon={<Delete />}
                label="Delete"
                onClick={() => handleDelete(params.row.id)}
            />,
        ]
    },
]
/**
 * 删除事件
 * @param {*} params
 */
const handleDelete = (params) => {
    console.log(params);
}
const OutStockSiteNo = React.memo(function OutStockSiteNo(props) {
    const { value } = props;
    if (!value) {
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/mcp/McpController.java
@@ -86,7 +86,13 @@
        }
        param.setType(Constants.TASK_TYPE_OUT_STOCK);
        return locItemService.generateTask(param, getLoginUserId());
        try {
            locItemService.generateTask(param, getLoginUserId());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return R.ok();
    }
rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java
@@ -103,6 +103,11 @@
    public static final String TASK_TYPE_OUT_CHECK = "check";
    /**
     * 单据出库
     */
    public static final String TASK_TYPE_ORDER_OUT_STOCK = "OrderOutStock";
    /**
     * 拣料出库
     */
    public static final String TASK_TYPE_OUT_PICK = "pick";
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
@@ -97,7 +97,13 @@
        }
        param.setType(Constants.TASK_TYPE_OUT_STOCK);
        return locItemService.generateTask(param, getLoginUserId());
        try {
            locItemService.generateTask(param, getLoginUserId());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return R.ok();
    }
    /**
@@ -129,7 +135,13 @@
        }
        map.setType(Constants.TASK_TYPE_OUT_CHECK);
        return R.ok("任务生成成功").add(locItemService.generateTask(map, getLoginUserId()));
        try {
            locItemService.generateTask(map, getLoginUserId());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return R.ok("任务生成成功");
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -1,5 +1,6 @@
package com.vincent.rsf.server.manager.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
@@ -8,6 +9,7 @@
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
import com.vincent.rsf.server.manager.enums.OrderType;
import com.vincent.rsf.server.manager.enums.OrderWorkType;
import com.vincent.rsf.server.common.annotation.OperationLog;
@@ -28,6 +30,8 @@
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
@@ -38,6 +42,8 @@
@RestController
@Api(tags = "出库单据")
public class OutStockController extends BaseController {
    Logger logger = LoggerFactory.getLogger(OutStockController.class);
    @Autowired
    private OutStockService outStockService;
@@ -235,11 +241,31 @@
    @PostMapping("/outStock/order/getOutTaskItems")
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param){
        if (Cools.isEmpty(param)){
    public R getOrderOutTaskItem(@RequestBody OrderOutTaskParam param) {
        if (Cools.isEmpty(param)) {
            return R.error("参数不能为空");
        }
        return outStockService.getOrderOutTaskItem(param);
    }
    /**
     * 出库单生成出库任务
     * @param params
     * @return
     */
    @PostMapping("/outStock/generate/tasks")
    @ApiOperation("出库单生成出库任务")
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    public R genOutStockTask( @RequestBody Map<String, Object> params) {
        if (Cools.isEmpty()) {
            return R.error("参数不能为空!!");
        }
        List<OutStockToTaskParams> taskParams = JSONArray.parseArray(JSONArray.toJSONString(params.get("items")), OutStockToTaskParams.class);
        return  outStockService.genOutStockTask(taskParams, getLoginUserId());
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/OutStockToTaskParams.java
New file
@@ -0,0 +1,34 @@
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;
@Data
@Accessors(chain = true)
@ApiModel(value = "OutStockToTaskParams", description = "出库单生成任务参数")
public class OutStockToTaskParams {
    @ApiModelProperty("库位")
    private String locCode;
    @ApiModelProperty("库位明细ID")
    private Long id;
    @ApiModelProperty("托盘码")
    private String barcode;
    @ApiModelProperty("批次")
    private String batch;
    @ApiModelProperty("单位")
    private String unit;
    @ApiModelProperty("数量")
    private Double outQty;
    @ApiModelProperty("站点")
    private String siteNo;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
@@ -172,6 +172,10 @@
    @TableField(exist = false)
    private Map<String, String> extendFields;
    @ApiModelProperty("托盘码")
    @TableField(exist = false)
    private String barcode;
    /**
     * 状态 1: 正常  0: 冻结  
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -8,7 +8,7 @@
public interface LocItemService extends IService<LocItem> {
    R generateTask(LocToTaskParams map, Long loginUserId);
    void generateTask(LocToTaskParams map, Long loginUserId) throws Exception;
    Task genMoveTask(LocToTaskParams map, Long loginUserId);
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
@@ -4,6 +4,7 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
import com.vincent.rsf.server.manager.entity.AsnOrder;
import java.util.List;
@@ -21,4 +22,6 @@
    R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId);
    R getOrderOutTaskItem(OrderOutTaskParam param);
    R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -7,7 +7,6 @@
import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto;
import com.vincent.rsf.server.api.service.WcsService;
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.api.utils.SlaveProperties;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.*;
@@ -19,6 +18,8 @@
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import lombok.Synchronized;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -29,6 +30,8 @@
@Service("locItemService")
public class LocItemServiceImpl extends ServiceImpl<LocItemMapper, LocItem> implements LocItemService {
    Logger logger = LoggerFactory.getLogger(LocItemServiceImpl.class);
    @Autowired
    private LocService locService;
@@ -55,7 +58,7 @@
    @Override
    @Synchronized
    @Transactional(rollbackFor = Exception.class)
    public R generateTask(LocToTaskParams map, Long loginUserId) {
    public void generateTask(LocToTaskParams map, Long loginUserId) throws Exception {
        if (Objects.isNull(map.getSiteNo())) {
            throw new CoolException("站点不能为空!");
        }
@@ -69,16 +72,21 @@
        listMap.keySet().forEach(key -> {
            Task task = new Task();
            Loc loc = locService.getById(key);
            logger.info("库位:>{}<UNK>", loc.getCode());
            if (Objects.isNull(loc)) {
                throw new CoolException("数据错误:所选库存信息不存在!!");
            }
            if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_F.type)) {
                throw new CoolException("库位:" + loc.getCode() +  ",不处于F.在库状态,不可执行R.出库预约操作!!");
            }
            loc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
            if (!locService.updateById(loc)) {
                throw new CoolException("库位状态更新失败!!");
            }
            Task moveTask = new Task();
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
            task.setOrgLoc(loc.getCode())
                    .setTaskCode(ruleCode)
@@ -101,12 +109,12 @@
            List<LocItem> locItemList = listMap.get(key);
            Double outQty = locItemList.stream().mapToDouble(LocItem::getOutQty).sum();
            Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode()));
            if (!Objects.isNull(serviceOne)) {
                throw new CoolException("托盘任务执行中,不能重复创建!");
            }
//            Task serviceOne = taskService.getOne(new LambdaQueryWrapper<Task>().eq(Task::getBarcode, loc.getBarcode()));
//            if (!Objects.isNull(serviceOne)) {
//                throw new CoolException("托盘任务执行中,不能重复创建!");
//            }
            if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) {
            if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK) || map.getType().equals(Constants.TASK_TYPE_ORDER_OUT_STOCK)) {
                Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0;
                if (orgQty.compareTo(useQty) > 0) {
                    //拣料出库
@@ -140,6 +148,7 @@
                }
                task.setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type).setWarehType(deviceSite.getDevice());
            }
            if (!taskService.save(task)) {
                throw new CoolException("任务创建失败!!");
            }
@@ -222,8 +231,6 @@
                throw new CoolException("任务明细生成失败!!");
            }
        });
        return R.ok("任务生成完成!!");
    }
    /**
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -8,9 +8,12 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.manager.controller.dto.ExistDto;
import com.vincent.rsf.server.manager.controller.dto.OrderOutItemDto;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.OutStockToTaskParams;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.entity.*;
@@ -20,6 +23,8 @@
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -40,6 +45,9 @@
 */
@Service("outStockServiceImpl")
public class OutStockServiceImpl extends ServiceImpl<AsnOrderMapper, AsnOrder> implements OutStockService {
    public Logger logger = LoggerFactory.getLogger(this.getClass());
    @Autowired
    private AsnOrderItemService asnOrderItemService;
@@ -421,6 +429,51 @@
        return R.ok(locItems);
    }
    /**
     * 生成出库任务
     * @param params
     * @return
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R genOutStockTask(List<OutStockToTaskParams> params, Long loginUserId) {
        if (params.isEmpty()) {
            throw new CoolException("参数不能为空!!");
        }
        //优先生成浅库位任务
        List<OutStockToTaskParams> Items = params.stream().sorted(Comparator.comparing(OutStockToTaskParams::getLocCode).thenComparing(item -> {
            return LocUtils.isShallowLoc(item.getLocCode()) ? 1 : 0;
        }).reversed()).collect(Collectors.toList());
        for (OutStockToTaskParams param : Items) {
            if (Objects.isNull(param)) {
                continue;
            }
            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode()));
            if (!Objects.isNull(loc)) {
                List<LocItem> locItems = new ArrayList<>();
                LocItem locItem = locItemService.getById(param.getId());
                locItem.setOutQty(param.getOutQty()).setBatch(param.getBatch());
                locItems.add(locItem);
                LocToTaskParams taskParams = new LocToTaskParams();
                taskParams.setType(Constants.TASK_TYPE_OUT_STOCK)
                        .setOrgLoc(loc.getCode())
                        .setItems(locItems)
                        .setSiteNo(param.getSiteNo());
                try {
                    locItemService.generateTask(taskParams, loginUserId);
                } catch (Exception e) {
                    logger.error("UNK", e);
                    throw new CoolException(e.getMessage());
                }
            }
        }
        return R.ok();
    }
    private List<LocItem> getEfficiencyFirstItemList(AsnOrderItem asnOrderItem) {
        QueryWrapper<LocItem> locItemQueryWrapper = new QueryWrapper<>();
        locItemQueryWrapper.eq("matnr_code", asnOrderItem.getMatnrCode());
@@ -463,7 +516,8 @@
                if (issued.doubleValue() > 0) {
                    ExistDto existDto = new ExistDto().setBatch(locItem.getBatch()).setMatnr(locItem.getMatnrCode()).setLocNo(locItem.getLocCode());
                    if (existDtos.add(existDto)) {
                        locItem.setWorkQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue());
                        locItem.setOutQty(issued.doubleValue() >= locItem.getAnfme() ? locItem.getAnfme() : issued.doubleValue());
                        locItem.setBarcode(loc.getBarcode());
                        OrderOutItemDto orderOutItemDto = new OrderOutItemDto();
                        orderOutItemDto.setLocItem(locItem);
                        List<DeviceSite> deviceSites = deviceSiteService.list(new LambdaQueryWrapper<DeviceSite>()
rsf-server/src/main/resources/application.yml
@@ -25,7 +25,7 @@
  #  global-config:
  #    field-strategy: 0
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
#    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
    map-underscore-to-camel-case: true
    cache-enabled: true
    call-setters-on-nulls: true