1
2 天以前 66e2b81704718350c0a3fcf0dfbd2f9d614b044c
lsh#
7个文件已修改
188 ■■■■■ 已修改文件
rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx 78 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/container/ContainerList.jsx 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/MobileController.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/basContainer/BasContainerList.jsx
@@ -31,7 +31,6 @@
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    Button,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -43,11 +42,8 @@
import PageDrawer from "../../components/PageDrawer";
import MyField from "../../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import CrossZoneAreaField from "../basStation/CrossZoneAreaField";
import AllInclusiveIcon from '@mui/icons-material/AllInclusive';
import BasContainerInit from "./BasContainerInit";
import PrintModal from './PrintModal'
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -65,8 +61,8 @@
const filters = [
    <SearchInput source="condition" alwaysOn />,
    <DateInput label='common.time.after' source="timeStart" />,
    <DateInput label='common.time.before' source="timeEnd" />,
    <DateInput label='common.time.after' source="timeStart"  />,
    <DateInput label='common.time.before' source="timeEnd"  />,
    <NumberInput source="containerType" label="table.field.basContainer.containerType" />,
    <TextInput source="codeType" label="table.field.basContainer.codeType" />,
@@ -89,9 +85,6 @@
    const [areaFieldDialog, setAreaFieldDialog] = useState(false);
    const [createDialog, setCreateDialog] = useState(false);
    const [drawerVal, setDrawerVal] = useState(false);
    const [open, setOpen] = useState(false);
    const [print, setPrint] = useState(false);
    const [selectPrints, setSelectPrints] = useState([]);
    return (
        <Box display="flex">
@@ -105,14 +98,13 @@
                    marginRight: !!drawerVal ? `${PAGE_DRAWER_WIDTH}px` : 0,
                }}
                title={"menu.basContainer"}
                empty={false}
                empty={<EmptyData onClick={() => { setCreateDialog(true) }} />}
                filters={filters}
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <InitButton setOpen={setOpen} />
                        <FilterButton />
                        {/* <MyCreateButton onClick={() => { setCreateDialog(true) }} /> */}
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='basContainer' />
                        <MyExportButton />
                    </TopToolbar>
@@ -121,18 +113,21 @@
            >
                <StyledDatagrid
                    preferenceKey='basContainer'
                    bulkActionButtons={<>
                        <BulkPrintBarcode setPrint={setPrint} setSelectPrints={setSelectPrints} />
                        <BulkDeleteButton mutationMode={OPERATE_MODE} />
                    </>}
                    rowClick={(id, resource, record) => false}
                    bulkActionButtons={() => <BulkDeleteButton mutationMode={OPERATE_MODE} />}
                    rowClick={(id, resource, record) => false}
                    expandSingle={true}
                    omit={['id', 'statusBool']}
                    omit={['id', 'createTime', 'createBy', 'memo','statusBool']}
                >
                    <NumberField source="id" />
                    <NumberField source="containerType$" label="table.field.basContainer.containerType" />
                    <TextField source="code" label="table.field.basContainer.code" />
                    <TextField source="codeType" label="table.field.basContainer.codeType" />
                    <WrapperField cellClassName="areas" label="table.field.basContainer.areas">
                        <CrossZoneAreaField
                            open={areaFieldDialog}
                            setOpen={setAreaFieldDialog}
                        />
                    </WrapperField>
                    <ReferenceField source="updateBy" label="common.field.updateBy" reference="user" link={false} sortable={false}>
                        <TextField source="nickname" />
                    </ReferenceField>
@@ -153,15 +148,6 @@
                open={createDialog}
                setOpen={setCreateDialog}
            />
            <BasContainerInit
                open={open}
                setOpen={setOpen}
            />
            <PrintModal
                open={print}
                setOpen={setPrint}
                rows={selectPrints}
            />
            <PageDrawer
                title='BasContainer Detail'
                drawerVal={drawerVal}
@@ -171,39 +157,5 @@
        </Box>
    )
}
//初始化按钮
const InitButton = ({ setOpen }) => {
    const init = () => {
        setOpen(true)
    }
    return (
        <Button
            label="toolbar.init"
            variant="text"
            size="small"
            onClick={init}
            startIcon={<AllInclusiveIcon />} />
    )
}
const BulkPrintBarcode = ({ setPrint, setSelectPrints }) => {
    const { selectedIds } = useListContext();
    //打印
    const print = () => {
        setPrint(true);
        setSelectPrints(selectedIds);
    }
    return (
        <Button
            label="toolbar.print"
            variant="text"
            size="small"
            onClick={print}
            startIcon={<AllInclusiveIcon />} />
    )
}
export default BasContainerList;
rsf-admin/src/page/container/ContainerList.jsx
@@ -31,7 +31,6 @@
    ReferenceArrayInput,
    AutocompleteInput,
    DeleteButton,
    Button,
} from 'react-admin';
import { Box, Typography, Card, Stack } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -44,7 +43,6 @@
import MyField from "../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import AllInclusiveIcon from '@mui/icons-material/AllInclusive';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -124,7 +122,6 @@
                sort={{ field: "create_time", order: "desc" }}
                actions={(
                    <TopToolbar>
                        <InitButton />
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='container' />
@@ -185,23 +182,5 @@
        </Box>
    )
}
//初始化按钮
const InitButton = ({ setOpen }) => {
    const close = () => {
        setOpen(false)
    }
    return (
        <Button
            label="toolbar.init"
            variant="outlined"
            size="medium"
            onClick={close}
            startIcon={<AllInclusiveIcon />}
            sx={{ margin: '3.5em' }} />
    )
}
export default ContainerList;
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/pda/MobileController.java
@@ -120,6 +120,13 @@
        return mobileService.getReceiptAreas(getLoginUser());
    }
    @PreAuthorize("hasAuthority('manager:warehouseAreas:list')")
    @ApiOperation("获取可用库区")
    @GetMapping("/areas/user/all")
    public R getAreasUserAll() {
        return mobileService.getAreasUserAll(getLoginUser());
    }
    @PreAuthorize("hasAuthority('manager:asnOrder:list')")
    @GetMapping("/orders/asn")
@@ -167,7 +174,7 @@
    public R pikinOrder(@RequestBody WaitPakinParam waitPakin) {
        Long userId = getLoginUserId();
        if (Objects.isNull(waitPakin)) {
            return R.error("参数不能为空!!");
            return R.error( "参数不能为空!!");
        }
        if (org.apache.commons.lang3.StringUtils.isBlank(waitPakin.getBarcode())) {
            return R.error("托盘码不能为空!!");
rsf-server/src/main/java/com/vincent/rsf/server/api/service/MobileService.java
@@ -37,6 +37,7 @@
    List<WkOrder> getAllAsnOrders();
    R getReceiptAreas(User user);
    R getAreasUserAll(User user);
    List<Fields> getDynamicFields();
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/AgvServiceImpl.java
@@ -255,9 +255,17 @@
                    new LambdaQueryWrapper<BasContainer>()
                            .in(BasContainer::getContainerType, longs1)
            );
            boolean matches = containers.stream()
                    .map(BasContainer::getCodeType)
                    .anyMatch(codeType -> barcode.matches(codeType));
            boolean matches = false;
            for (BasContainer container : containers) {
                String codeType = container.getCodeType();  // 获取正则表达式
                if (barcode.matches(codeType)) {  // 判断条码是否符合这个正则
                    matches = true;
                    break;  // 找到匹配的就退出循环
                }
            }
//            boolean matches = containers.stream()
//                    .map(BasContainer::getCodeType)
//                    .anyMatch(codeType -> barcode.matches(codeType));
            if (!matches) {
                throw new CoolException("条码与站点不匹配");
            }
rsf-server/src/main/java/com/vincent/rsf/server/api/service/impl/MobileServiceImpl.java
@@ -522,6 +522,28 @@
     * @param
     * @return
     * @author Ryan
     * @description 获取集货区
     * @time 2025/3/11 10:12
     */
    @Override
    public R getAreasUserAll(User user) {
        Long[] userRoleIds = user.getUserRoleIds();
        List<WarehouseRoleMenu> warehouseRoleMenus = warehouseRoleMenuService.list(new LambdaQueryWrapper<WarehouseRoleMenu>()
                .in(WarehouseRoleMenu::getRoleId, Arrays.asList(userRoleIds))
        );
        Set<WarehouseRoleMenu> warehouseRoleMenusSet = new HashSet<>(warehouseRoleMenus);
        List<Long> longs = warehouseRoleMenusSet.stream().map(WarehouseRoleMenu::getMenuId).collect(Collectors.toList());
        List<WarehouseAreas> areas = warehouseAreasService.list(new LambdaQueryWrapper<WarehouseAreas>()
                .eq(WarehouseAreas::getType, WarehouseAreaType.WAREHOUSE_AREA_COLLECTION.type)
                .in(WarehouseAreas::getId, longs)
        );
        return R.ok(areas);
    }
    /**
     * @param
     * @return
     * @author Ryan
     * @description 获取所有启用动态字段
     * @time 2025/3/12 09:23
     */
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/BasContainerController.java
@@ -9,7 +9,6 @@
import com.vincent.rsf.server.common.domain.BaseParam;
import com.vincent.rsf.server.common.domain.KeyValVo;
import com.vincent.rsf.server.common.domain.PageParam;
import com.vincent.rsf.server.manager.controller.params.InitContainerParams;
import com.vincent.rsf.server.manager.entity.BasContainer;
import com.vincent.rsf.server.manager.entity.BasStation;
import com.vincent.rsf.server.manager.service.BasContainerService;
@@ -33,18 +32,18 @@
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<BasContainer, BaseParam> pageParam = new PageParam<>(baseParam, BasContainer.class);
        PageParam<BasContainer, BaseParam> page = basContainerService.page(pageParam, pageParam.buildWrapper(true));
//        for (BasContainer container : page.getRecords()) {
//            if (!Cools.isEmpty(container.getAreas())) {
//                String content = container.getAreas().substring(1, container.getAreas().length() - 1);
//                String[] parts = content.split(",");
//                Long[] longArray = new Long[parts.length];
//                for (int i = 0; i < parts.length; i++) {
//                    longArray[i] = Long.parseLong(parts[i].trim());
//                }
//                container.setAreaIds(longArray);
//            }
//
//        }
        for (BasContainer container : page.getRecords()) {
            if (!Cools.isEmpty(container.getAreas())) {
                String content = container.getAreas().substring(1, container.getAreas().length() - 1);
                String[] parts = content.split(",");
                Long[] longArray = new Long[parts.length];
                for (int i = 0; i < parts.length; i++) {
                    longArray[i] = Long.parseLong(parts[i].trim());
                }
                container.setAreaIds(longArray);
            }
        }
        return R.ok().add(page);
    }
@@ -82,7 +81,7 @@
        basContainer.setCreateTime(new Date());
        basContainer.setUpdateBy(getLoginUserId());
        basContainer.setUpdateTime(new Date());
        BasContainer container = basContainerService.getOne(new LambdaQueryWrapper<BasContainer>().eq(BasContainer::getContainerType, basContainer.getContainerType()).orderByDesc(BasContainer::getId),false);
        BasContainer container = basContainerService.getOne(new LambdaQueryWrapper<BasContainer>().eq(BasContainer::getContainerType, basContainer.getContainerType()));
        if (null != container) {
            return R.error("该类型已被初始化");
        }
@@ -133,22 +132,6 @@
        );
        return R.ok().add(vos);
    }
    /**
     * 初始化
     * @return
     */
    @PreAuthorize("hasAuthority('manager:basContainer:list')")
    @OperationLog("容器初始化")
    @PostMapping("/basContainer/init/save")
    public R init(@RequestBody InitContainerParams params) {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return basContainerService.init(params, getLoginUserId());
    }
    @PreAuthorize("hasAuthority('manager:basContainer:list')")
    @PostMapping("/basContainer/export")