skyouc
2 天以前 15ed897e0bd9ec3ac56f260e326b21ffd4bafae9
新增自定义编辑列
新增自定义出库路由
10个文件已修改
156 ■■■■ 已修改文件
rsf-admin/src/i18n/en.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderList.jsx 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx 72 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/application.yml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -79,6 +79,8 @@
                result: 'Contacts import complete. Imported %{success} success, with %{error} errors',
            },
            loadMore: 'Load More Data',
            updateSucc: 'Update Success',
            updateFaild: 'Update Failed',
            complete: 'Complete',
            deprecate: 'Deprecate',
            stockError: 'Empty',
rsf-admin/src/i18n/zh.js
@@ -81,6 +81,8 @@
                result: '导入完成。已导入 %{success} 成功, 和 %{error} 失败',
            },
            loadMore: '加载更多',
            updateSucc: '更新成功',
            updateFaild: '更新失败',
            complete: '完成',
            deprecate: '废弃',
            stockError: '没有库存',
rsf-admin/src/page/orders/outStock/OutOrderList.jsx
@@ -37,6 +37,7 @@
  Button,
  useRedirect,
  useUnselectAll,
  useRecordSelection,
} from 'react-admin';
import { Box, Typography, Card, Stack, Drawer } from '@mui/material';
import { styled } from '@mui/material/styles';
@@ -57,6 +58,7 @@
import AddTaskIcon from '@mui/icons-material/AddTask';
import PageEditDrawer from "../../components/PageEditDrawer";
import OutStockPublic from "./OutStockPublic";
import OutOrderPreview from "./OutOrderPreview";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
  '& .css-1vooibu-MuiSvgIcon-root': {
@@ -114,6 +116,7 @@
  const translate = useTranslate();
  const [createDialog, setCreateDialog] = useState(false);
  const [manualDialog, setManualDialog] = useState(false);
  const [preview, setPreview] = useState(false);
  const [drawerVal, setDrawerVal] = useState(false);
  const [modalType, setmodalType] = useState(0);
  const [select, setSelect] = useState(0);
@@ -191,13 +194,16 @@
      <OutOrderModal
        open={createDialog}
        setOpen={setCreateDialog}
        preview={preview}
        setPreview={setPreview}
      />
      <OutOrderPreview open={preview} setOpen={setPreview} />
      <PageEditDrawer
        title={"toolbar.publicWorking"}
        drawerVal={drawerVal}
        setDrawerVal={setDrawerVal}
      >
        <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal}/>
        <OutStockPublic record={select} open={drawerVal} setOpen={setDrawerVal} />
      </PageEditDrawer>
    </Box >
  )
@@ -257,7 +263,6 @@
  const record = useRecordContext();
  const notify = useNotify();
  const refresh = useRefresh();
  const createByOrder = async (event) => {
    event.stopPropagation();
    setCreateDialog(true);
rsf-admin/src/page/orders/outStock/OutOrderModal.jsx
@@ -46,6 +46,8 @@
import request from '@/utils/request';
import SaveIcon from '@mui/icons-material/Save';
import CheckCircleIcon from '@mui/icons-material/CheckCircle';
import EditableTextField from "../../components/EditableTextField";
import OutOrderPreview from "./OutOrderPreview";
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -90,9 +92,11 @@
]
const OutOrderModal = (props) => {
    const { open, setOpen, record } = props;
    const { open, setOpen, preview, setPreview, record } = props;
    const translate = useTranslate();
    const [params, setParams] = useState({});
    const [select, setSelect] = useState([]);
    const [drawerVal, setDrawerVal] = useState(false);
    const refresh = useRefresh();
@@ -221,7 +225,7 @@
                                />
                                <StyledDatagrid
                                    preferenceKey='deliveryItem'
                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} />}
                                    bulkActionButtons={<AddOutStockButton setOpen={setOpen} setPreview={setPreview} setSelect={setSelect}/>}
                                    rowClick={(id, resource, record) => false}
                                    expand={false}
                                    expandSingle={true}
@@ -247,6 +251,9 @@
                    </Grid>
                </DialogContent>
            </Grid>
            <Grid>
                <OutOrderPreview open={preview} setOpen={setPreview} selectedIds={select} />
            </Grid>
        </Dialog >
    )
}
@@ -254,7 +261,7 @@
export default OutOrderModal;
const AddOutStockButton = (props) => {
    const { setOpen } = props;
    const { setOpen, setPreview, setSelect } = props;
    const { selectedIds, onUnselectItems } = useListContext();
    const notify = useNotify();
    const refresh = useRefresh();
@@ -265,9 +272,10 @@
        } else {
            notify(res.data.msg);
        }
        refresh();
        setPreview(true)
        setSelect(selectedIds);
        onUnselectItems();
        setOpen(false);
        // refresh();
    }
    return (
rsf-admin/src/page/orders/outStock/OutStockPublic.jsx
@@ -69,14 +69,39 @@
    const notify = useNotify();
    const gridRef = useGridApiRef();
    const [rows, setRows] = useState([]);
    const [fetchRows, setFetchRows] = useState([]);
    const translate = useTranslate();
    const [rowSelectedIds, setRowSelectedIds] = useState([]);
    const [selectedMatnr, setSelectedMatnr] = useState([]);
    const [selectedIds, setSelectedIds] = useState([]);
    const [formData, setFormData] = useState({
        orderId: record?.id,
        waveId: DEFAULT_TYPE
    });
    const [formData, setFormData] = useState({ orderId: record?.id, waveId: DEFAULT_TYPE });
    const [dialog, setDialog] = useState(false);
    const [selectedValue, setSelectedValue] = useState({});
    useEffect(() => {
        if (selectedMatnr.length < 1) {
            setRows(fetchRows)
        } else {
            const mas = fetchRows.filter(item => selectedMatnr.includes(item.matnrCode));
            setRows(mas)
        }
    }, [selectedMatnr])
    const handleRowClick = (id, resource, record) => {
        setRowSelectedIds(prev =>
            prev.includes(id)
                ? prev.filter(item => item !== id)  // 取消选择
                : [...prev, id]                     // 添加选择
        );
        //设置库位信息筛选条件
        setSelectedMatnr(prev =>
            prev.includes(record?.matnrCode)
                ? prev.filter(item => item !== record?.matnrCode)  // 取消选择
                : [...prev, record?.matnrCode]                     // 添加选择
        );
    };
    const handleClickOpen = () => {
        setDialog(true);
@@ -85,13 +110,23 @@
    const handleClose = (value) => {
        setDialog(false);
        setSelectedValue(value);
        const newRows = rows.map(item => {
            return selectedIds.includes(item?.id) ? {
                ...item,
                siteNo: value?.site
            } : item
        })
        setRows(newRows);
        if (selectedIds.length == 0) {
            const newRows = rows.map(item => {
                return {
                    ...item,
                    siteNo: value?.site
                }
            })
            setRows(newRows);
        } else {
            const newRows = rows.map(item => {
                return selectedIds.includes(item?.id) ? {
                    ...item,
                    siteNo: value?.site
                } : item
            })
            setRows(newRows);
        }
    };
    useEffect(() => {
@@ -107,6 +142,7 @@
        const { data: { code, data, msg } } = await request.post('/outStock/order/getOutTaskItems', { ...formData });
        if (code === 200) {
            setRows(data)
            setFetchRows(data)
        } else {
            notify(msg);
        }
@@ -161,9 +197,11 @@
                                    sx={{ height: "2px", position: 'absolute', top: 0, left: 0, right: 0, }}
                                />
                                <StyledDatagrid
                                    storeKey={"outStockPublic"}
                                    preferenceKey='outStockItem'
                                    bulkActionButtons={<></>}
                                    rowClick={false}
                                    rowClick={handleRowClick}
                                    selectedIds={rowSelectedIds}
                                    omit={['id', 'splrName', 'qty', 'poCode', 'workQty']}
                                >
                                    <NumberField source="id" />
@@ -181,8 +219,8 @@
                        </Card>
                    </Grid>
                    <Grid item xl={6.3} gap={2}>
                        <Card>
                            <Box sx={{ height: 500, width: '100%' }}>
                        <Card sx={{ minHeight: 1050, height: 'calc(100% - 10px)', width: '100%' }}>
                            <Box>
                                <PreviewTable
                                    rows={rows}
                                    gridRef={gridRef}
@@ -223,7 +261,6 @@
        }
    }, [selectedIds])
    const baseColumns = [
        // { field: 'id', headerName: 'ID', width: 40 },
        { field: 'locCode', headerName: '库位', width: 110 },
@@ -232,8 +269,7 @@
        { field: 'batch', headerName: '批次', width: 90 },
        { field: 'unit', headerName: '单位', width: 60 },
        { field: 'outQty', headerName: '出库数量', width: 110, },
        {
            field: 'anfme', headerName: '库存数量', width: 110,
        { field: 'anfme', headerName: '库存数量', width: 110,
            renderCell: (params) => (
                <OutStockAnfme value={params.value} />
            )
@@ -379,6 +415,7 @@
    return (
        <DataGrid
            storeKey={"locItemPreview"}
            rows={rows}
            columns={columns}
            slots={{ toolbar: CustomToolBar }}
@@ -393,7 +430,6 @@
        />
    )
}
//提交按钮
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -63,6 +63,17 @@
    }
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    @PostMapping("/outStock/dialog/page")
    public R dialogPage(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<AsnOrder, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrder.class);
        QueryWrapper<AsnOrder> queryWrapper = pageParam.buildWrapper(true);
        List<String> list = Arrays.asList(OrderType.ORDER_OUT.type);
        queryWrapper.in("type", list);
        return R.ok().add(outStockService.page(pageParam, queryWrapper));
    }
    @PreAuthorize("hasAuthority('manager:outStock:list')")
    @PostMapping("/outStock/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(outStockService.list(new LambdaQueryWrapper<AsnOrder>().eq(AsnOrder::getType, OrderType.ORDER_OUT.type)));
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockItemController.java
@@ -4,6 +4,7 @@
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
@@ -48,7 +49,32 @@
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class);
        return R.ok().add(outStockItemService.listByAsnId(pageParam, pageParam.buildWrapper(true)));
        QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true);
        if (!Objects.isNull(map.get("poDetlId"))) {
            queryWrapper.in("po_detl_id", JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class));
        }
        return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper));
    }
    @PreAuthorize("hasAuthority('manager:outStockItem:list')")
    @ApiOperation("分页获取列表")
    @PostMapping("/outStockItem/edit/page")
    public R byPoIdspage(@RequestBody Map<String, Object> map) {
        List<Long> poDetlIds = new ArrayList<>();
        if (!Objects.isNull(map.get("poDetlId"))) {
            poDetlIds = JSONArray.parseArray(JSONArray.toJSONString(map.get("poDetlId")), Long.class);
            map.remove("poDetlId");
        }
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<AsnOrderItem, BaseParam> pageParam = new PageParam<>(baseParam, AsnOrderItem.class);
        QueryWrapper<AsnOrderItem> queryWrapper = pageParam.buildWrapper(true);
        if (!poDetlIds.isEmpty()) {
            queryWrapper.in("po_detl_id", poDetlIds);
        } else {
            return R.ok();
        }
        return R.ok().add(outStockItemService.listByAsnId(pageParam, queryWrapper));
    }
    @PreAuthorize("hasAuthority('manager:outStockItem:list')")
@@ -106,6 +132,7 @@
        return R.ok("Update Success").add(asnOrderItem);
    }
    @PreAuthorize("hasAuthority('manager:outStockItem:remove')")
    @OperationLog("Delete 出库单明细")
    @PostMapping("/outStockItem/remove/{ids}")
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -115,18 +115,11 @@
            }
            Double orgQty = locItems.stream().mapToDouble(LocItem::getAnfme).sum();
            Double workQty = locItems.stream().mapToDouble(LocItem::getWorkQty).sum();
            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("托盘任务执行中,不能重复创建!");
//            }
            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) {
                if (orgQty.compareTo(outQty) > 0) {
                    //拣料出库
                    DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                            .eq(DeviceSite::getSite, siteNo)
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -446,7 +446,7 @@
            if (Objects.isNull(param)) {
                continue;
            }
            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getBarcode, param.getBarcode()));
            Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, param.getLocCode()).eq(Loc::getBarcode, param.getBarcode()));
            if (!Objects.isNull(loc)) {
                List<LocItem> locItems = new ArrayList<>();
                LocItem locItem = locItemService.getById(param.getId());
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