skyouc
昨天 74698ac2f0eae4c93327fe761e91421f8d89e4a1
盘点功能优化
11个文件已修改
1个文件已添加
208 ■■■■ 已修改文件
rsf-admin/src/i18n/zh.js 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/check/CheckOrderPub.jsx 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/check/CheckPreviewTable.jsx 125 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/CheckLocQueryParams.java 23 ●●●●● 补丁 | 查看 | 原始文档 | 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/mapper/LocItemMapper.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js
@@ -222,7 +222,9 @@
            stockTransfer: {
                orgLoc: '源库位',
                tarLoc: '目标库位',
                inputLoc: '输入库位'
                inputLoc: '输入库位',
                inputChannel: '输入巷道'
            },
            outBound: {
                stockWithdrawal: '提取库存',
rsf-admin/src/page/orders/check/CheckOrderPub.jsx
@@ -67,7 +67,8 @@
    const getLocs = async (ids) => {
        const { data: { code, data, msg } } = await request.post('/check/locs/' + ids);
        let params = {matnrCode: ids}
        const { data: { code, data, msg } } = await request.post('/check/locs/',  params);
        if (code === 200) {
            setRows(data)
            const matnrs = selectedMatnr.filter(item => data.some(bigData => bigData.matnrCode === item));
@@ -213,6 +214,7 @@
                                    setRows={setRows}
                                    record={record}
                                    formData={formData}
                                    selectedMatnr={selectedMatnr}
                                    selectedIds={selectedIds}
                                    setDialog={setDialog}
                                    setSelectedIds={setSelectedIds}
rsf-admin/src/page/orders/check/CheckPreviewTable.jsx
@@ -1,6 +1,8 @@
import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText } from "@mui/material";
import { Box, Card, Grid, LinearProgress, Select, MenuItem, ListItemText, TextField } from "@mui/material";
import React, { useState, useRef, useEffect, useMemo } from "react";
import QueryStatsIcon from '@mui/icons-material/QueryStats';
import request from '@/utils/request';
import { DataGrid, useGridApiContext, GridActionsCellItem, useGridApiRef } from '@mui/x-data-grid';
import {
    List,
@@ -19,7 +21,7 @@
} from 'react-admin';
const CheckPreviewTable = (props) => {
    const { rows, gridRef, setRows, record, selectedIds, setSelectedIds, setDialog, formData } = props;
    const { rows, gridRef, setRows, record, selectedIds, setSelectedIds, selectedMatnr, setDialog, formData } = props;
    // const translate = useTranslate();
    // const refresh = useRefresh();
    // const notify = useNotify();
@@ -113,25 +115,86 @@
    });
    const CustomToolBar = () => {
        const [queryParams, setQueryParams] = useState({ locCode: null, channel: null, matnrCode: selectedMatnr });
        const notify = useNotify();
        const queryClick = async () => {
            console.log(queryParams);
            console.log(rows);
            const { data: { code, data, msg } } = await request.post('/check/locs/', queryParams);
            if (code === 200) {
                setRows(data)
            } else {
                notify(msg);
            }
        }
        const handleChange = (e) => {
            const { name, value } = e.target;
            setQueryParams(() => ({
                ...queryParams,
                [name]: value
            }));
        };
        const selectSiteNo = () => {
            setDialog(true)
        }
        return (
            <Box sx={{
                p: 1,
                display: 'flex',
                justifyContent: 'flex-end',
                borderTop: '1px solid rgba(224, 224, 224, 1)'
            }}>
                <Button
                    onClick={selectSiteNo}
                    variant="outlined"
                    label="toolbar.modiftySite"
                    size="medium"
                    sx={{ mr: 1 }} />
            </Box>
            <>
                <Box sx={{
                    p: 1,
                    display: 'flex',
                    justifyContent: 'space-between',
                    borderTop: '1px solid rgba(224, 224, 224, 1)'
                }}>
                    <Box sx={{
                        '& > :not(style)': { m: 1, width: '25ch' },
                        display: 'flex',
                    }}>
                        <TextField
                            label={translate("table.field.stockTransfer.inputLoc")}
                            size="small"
                            name="locCode"
                            value={queryParams?.locCode}
                            onChange={handleChange}
                            sx={{ mr: 1 }} />
                        <TextField
                            label={translate("table.field.stockTransfer.inputChannel")}
                            size="small"
                            name="channel"
                            value={queryParams?.channel}
                            onChange={handleChange}
                            sx={{ mr: 1 }} />
                        <Box sx={{
                            '& > :not(style)': { m: 1, width: '11ch' },
                        }}>
                            <Button variant="contained"
                                size="medium"
                                startIcon={<QueryStatsIcon />}
                                label="toolbar.query"
                                onClick={queryClick} />
                        </Box>
                    </Box>
                    <Box sx={{
                        '& > :not(style)': { m: 1, width: '13ch' },
                    }}>
                        <Button
                            onClick={selectSiteNo}
                            variant="outlined"
                            label="toolbar.modiftySite"
                            size="medium"
                            sx={{ mr: 1 }} />
                    </Box>
                </Box>
            </>
        );
    }
    const OutStockSite = (params) => {
        const { id, field, siteNo, row: { staNos } } = params;
@@ -184,20 +247,24 @@
    }
    return (
        <DataGrid
            storeKey={"locItemPreview"}
            rows={rows}
            columns={columns}
            slots={{ toolbar: CustomToolBar }}
            apiRef={gridRef}
            checkboxSelection
            disableRowSelectionOnClick
            hideFooterPagination={true}  // 隐藏分页控件
            hideFooter={false}
            onRowSelectionModelChange={(ids) => {
                setSelectedIds(ids)
            }}
        />
        <Box sx={{ maxHeight: 780 }}>
            <DataGrid
                sx={{ maxHeight: 730 }}
                storeKey={"locItemPreview"}
                rows={rows}
                columns={columns}
                slots={{ toolbar: CustomToolBar }}
                apiRef={gridRef}
                checkboxSelection
                disableRowSelectionOnClick
                hideFooterPagination={true}  // 隐藏分页控件
                hideFooter={false}
                onRowSelectionModelChange={(ids) => {
                    setSelectedIds(ids)
                }}
            />
        </Box>
    )
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/CheckOrderController.java
@@ -11,10 +11,7 @@
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderItemParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.*;
import com.vincent.rsf.server.manager.entity.WkOrder;
import com.vincent.rsf.server.manager.entity.WkOrderItem;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
@@ -215,13 +212,13 @@
    @ApiOperation("获取在库物料列表")
    @PostMapping("/check/locs/{matnrs}")
    @PostMapping("/check/locs")
    @PreAuthorize("hasAuthority('manager:check:list')")
    public R getAllLocByMatnr(@PathVariable String[] matnrs) {
        if (Objects.isNull(matnrs)) {
    public R getAllLocByMatnr(@RequestBody CheckLocQueryParams params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return checkOrderService.getAllLocByMatnr(Arrays.asList(matnrs));
        return checkOrderService.getAllLocByMatnr(params);
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/CheckLocQueryParams.java
New file
@@ -0,0 +1,23 @@
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.util.List;
@Data
@Accessors
@ApiModel(value = "CheckLocQueryParams", description ="盘点单物料查询参数" )
public class CheckLocQueryParams {
   @ApiModelProperty("物料编码")
   private List<String> matnrCode;
   @ApiModelProperty("巷道")
   private String channel;
   @ApiModelProperty("库们编码")
   private String locCode;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItem.java
@@ -100,6 +100,10 @@
    @TableField(exist = false)
    private Double outQty;
    @ApiModelProperty("巷道")
    @TableField(exist = false)
    private Integer channel;
    /**
     * 物料名称
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemMapper.java
@@ -14,5 +14,5 @@
@Repository
public interface LocItemMapper extends BaseMapper<LocItem> {
    List<LocItem> listByMatnr(@Param("type") String type, @Param(Constants.WRAPPER) LambdaQueryWrapper<LocItem> matnr);
    List<LocItem> listByMatnr(@Param("type") String type, @Param("channel") String channel, @Param(Constants.WRAPPER) LambdaQueryWrapper<LocItem> matnr);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/CheckOrderService.java
@@ -2,10 +2,7 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderItemParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.*;
import com.vincent.rsf.server.manager.entity.WkOrder;
import org.springframework.web.multipart.MultipartFile;
@@ -26,7 +23,7 @@
    R genCheckPreview(OrderOutTaskParam param);
    R getAllLocByMatnr(List<String> matnrs);
    R getAllLocByMatnr(CheckLocQueryParams matnrs);
    R genCheckOutTask(List<CheckOrderParams> checkParams, Long loginUserId);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -1,6 +1,7 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.server.manager.controller.params.CheckLocQueryParams;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.LocItem;
import com.vincent.rsf.server.manager.entity.Task;
@@ -13,5 +14,5 @@
    Task genMoveTask(LocToTaskParams map, Long loginUserId);
    List<LocItem> listByMatnr(List<String> matnrs);
    List<LocItem> listByMatnr(CheckLocQueryParams matnrs);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/CheckOrderServiceImpl.java
@@ -8,10 +8,7 @@
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderItemParams;
import com.vincent.rsf.server.manager.controller.params.CheckOrderParams;
import com.vincent.rsf.server.manager.controller.params.OrderOutTaskParam;
import com.vincent.rsf.server.manager.controller.params.*;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.entity.excel.CheckOrderTemplate;
import com.vincent.rsf.server.manager.enums.*;
@@ -239,7 +236,10 @@
     * @version 1.0
     */
    @Override
    public R getAllLocByMatnr(List<String> matnrs) {
    public R getAllLocByMatnr(CheckLocQueryParams matnrs) {
        if (Objects.isNull(matnrs.getMatnrCode()) && matnrs.getMatnrCode().isEmpty()) {
            throw new CoolException("参数不能为空!!");
        }
        List<LocItem> locItems = locItemService.listByMatnr(matnrs);
        if (!locItems.isEmpty()) {
            List<Integer> list = Arrays.asList(TaskType.TASK_TYPE_CHECK_OUT.type, TaskType.TASK_TYPE_CHECK_IN.type);
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -7,6 +7,7 @@
import com.vincent.rsf.server.api.service.WcsService;
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.manager.controller.params.CheckLocQueryParams;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
@@ -371,9 +372,11 @@
     * @version 1.0
     */
    @Override
    public List<LocItem> listByMatnr(List<String> matnr) {
    public List<LocItem> listByMatnr(CheckLocQueryParams matnr) {
        LambdaQueryWrapper<LocItem> wrapper = new LambdaQueryWrapper<LocItem>()
                .in(!matnr.isEmpty(), LocItem::getMatnrCode, matnr);
        return  this.baseMapper.listByMatnr(LocStsType.LOC_STS_TYPE_F.type, wrapper);
                .eq(StringUtils.isNotBlank(matnr.getLocCode()), LocItem::getLocCode, matnr.getLocCode())
//                .eq(StringUtils.isNotBlank(matnr.getChannel()), LocItem::getChannel, matnr.getChannel())
                .in(!matnr.getMatnrCode().isEmpty(), LocItem::getMatnrCode, matnr.getMatnrCode());
        return  this.baseMapper.listByMatnr(LocStsType.LOC_STS_TYPE_F.type, matnr.getChannel(), wrapper);
    }
}
rsf-server/src/main/resources/mapper/manager/LocItemMapper.xml
@@ -11,6 +11,7 @@
                    li.loc_id,
                    li.loc_code,
                    l.barcode,
                    l.channel,
                    li.matnr_id,
                    li.matnr_code,
                    li.maktx,
@@ -22,6 +23,9 @@
                    man_loc_item li
                        INNER JOIN man_loc l ON l.id = li.loc_id
                    WHERE l.use_status = #{type}
                    <if test="channel != null">
                        AND l.channel = #{channel}
                    </if>
                GROUP BY
                    loc_id,
                    matnr_id,