skyouc
2025-04-29 669fe984048785873c20fbd0ce8abb3cd52c1fce
新增出库单优化
11个文件已修改
11个文件已删除
1 文件已重命名
1642 ■■■■■ 已修改文件
rsf-admin/src/i18n/en.js 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/components/DictSelect.jsx 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/AsnOrderModal.jsx 643 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/MatnrInfoModal.jsx 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/SelectMatnrModal.jsx 40 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java 112 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderItemController.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java 221 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java 333 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/OrderItemMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/OrderMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OrderItemService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OrderService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OrderItemServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OrderServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java 46 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js
@@ -533,6 +533,40 @@
                ntyStatus: "Notify",
                exceStatus: 'bill status'
            },
            outStock: {
                code: "Code",
                poCode: "poCode",
                poId: "doId",
                type: "Type",
                wkType: "wkType",
                anfme: "anfme",
                qty: "qty",
                logisNo: "logisNo",
                arrTime: "Arrived",
                rleStatus: "Release",
                ntyStatus: "Notify",
                exceStatus: 'bill status'
            },
            outStockItem: {
                asnId: "ID",
                asnCode: "DO Code",
                poDetlId: "poDetlId",
                poDetlCode: "DO Detl Code",
                matnrId: "matnrId",
                maktx: "maktx",
                anfme: "anfme",
                stockUnit: "stockUnit",
                purQty: "purQty",
                purUnit: "purUnit",
                qty: "qty",
                splrCode: "splrCode",
                splrName: "splrName",
                qrcode: "qrcode",
                barcode: "barcode",
                packName: "packName",
                ntyStatus: "ntyStatus",
                platItemId: 'platItemId'
            },
            asnOrderItem: {
                asnId: "asnId",
                asnCode: "asnCode",
rsf-admin/src/i18n/zh.js
@@ -583,6 +583,7 @@
                asnId: "主单标识",
                asnCode: "单号",
                poDetlId: "平台明细ID",
                poDetlCode: "DO单",
                matnrId: "物料标识",
                maktx: "物料名称",
                matnrCode: "物料编码",
rsf-admin/src/page/components/DictSelect.jsx
@@ -1,6 +1,6 @@
import { useState, useEffect } from 'react';
import {
    useTranslate, useNotify
    useTranslate, useNotify, required
} from 'react-admin';
import request from '@/utils/request';
import { Select, MenuItem, FormControl, InputLabel } from '@mui/material';
@@ -47,6 +47,7 @@
                variant="filled"
                onChange={handleChange}
                size='small'
            >
                {list.map((item) => (
                    <MenuItem key={item.value} value={item.value}>
rsf-admin/src/page/orders/outStock/AsnOrderModal.jsx
File was deleted
rsf-admin/src/page/orders/outStock/MatnrInfoModal.jsx
File was renamed from rsf-admin/src/page/orders/outStock/AsnWareModal.jsx
@@ -18,7 +18,7 @@
import { DataGrid } from '@mui/x-data-grid';
import SaveIcon from '@mui/icons-material/Save';
import TreeSelectInput from "@/page/components/TreeSelectInput";
const AsnWareModal = (props) => {
const MatnrInfoModal = (props) => {
    const { open, setOpen, data, setData } = props;
    const translate = useTranslate();
@@ -110,7 +110,7 @@
                backgroundColor: 'background.paper',
                zIndex: 1000
            }}>
                选择物料
                {translate("common.action.newAddMats")}
                <Box sx={{ position: 'absolute', top: 8, right: 8, zIndex: 1001 }}>
                    <DialogCloseButton onClose={handleClose} />
                </Box>
@@ -175,7 +175,7 @@
    );
};
export default AsnWareModal;
export default MatnrInfoModal;
const AsnWareModalTable = ({ tableData, setTableData, selectedRows, setSelectedRows, dyFields, setDyFields }) => {
    const translate = useTranslate();
@@ -189,7 +189,6 @@
        { field: 'spec', headerName: translate('table.field.matnr.spec'), 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: 'unit', headerName: translate('table.field.matnr.unit'), width: 100 },
@@ -197,7 +196,6 @@
        { field: 'stockUnit', headerName: translate('table.field.matnr.stockUnit'), width: 100 },
        { field: 'stockLeval$', headerName: translate('table.field.matnr.stockLevel'), width: 100, sortable: false },
    ])
    const handleSelectionChange = (ids) => {
rsf-admin/src/page/orders/outStock/SelectMatnrModal.jsx
@@ -46,7 +46,7 @@
import DialogCloseButton from "../../components/DialogCloseButton";
import StatusSelectInput from "../../components/StatusSelectInput";
import ConfirmButton from "../../components/ConfirmButton";
import AsnWareModal from "./AsnWareModal";
import MatnrInfoModal from "./MatnrInfoModal";
import { useForm, Controller, useWatch, FormProvider, useFormContext } from "react-hook-form";
import SaveIcon from '@mui/icons-material/Save';
import request from '@/utils/request';
@@ -134,7 +134,7 @@
                "items": tabelData,
            }
            const res = await request.post(`/asnOrder/items/save`, parmas);
            const res = await request.post(`/outStock/items/save`, parmas);
            if (res?.data?.code === 200) {
                setOpen(false);
                refresh();
@@ -148,7 +148,7 @@
                "orders": formData,
                "items": tabelData,
            }
            const res = await request.post(`/asnOrder/items/update`, parmas);
            const res = await request.post(`/outStock/items/update`, parmas);
            if (res?.data?.code === 200) {
                setOpen(false);
                refresh();
@@ -164,7 +164,7 @@
    const handleDelete = async () => {
        const res = await request.post(`/asnOrder/remove/${asnId}`);
        const res = await request.post(`/outStock/remove/${asnId}`);
        if (res?.data?.code === 200) {
            setOpen(false);
            refresh();
@@ -174,7 +174,7 @@
    };
    const requestGetHead = async () => {
        const res = await request.get(`/asnOrder/${asnId}`);
        const res = await request.get(`/outStock/${asnId}`);
        if (res?.data?.code === 200) {
            setFormData(res.data.data)
        } else {
@@ -183,7 +183,7 @@
    }
    const requestGetBody = async () => {
        const res = await request.post(`/asnOrderItem/page`, { asnId });
        const res = await request.post(`/outStockItem/page`, { asnId });
        if (res?.data?.code === 200) {
            setTableData(res.data.data.records)
        } else {
@@ -235,7 +235,7 @@
                                </Grid> */}
                                <Grid item md={2}>
                                    <DictSelect
                                        label={translate("table.field.asnOrder.wkType")}
                                        label={translate("table.field.outStock.wkType")}
                                        value={formData.wkType}
                                        variant="filled"
                                        onChange={(e) => handleChange(e.target.value, 'wkType')}
@@ -245,7 +245,7 @@
                                </Grid>
                                <Grid item md={2}>
                                    <TextField
                                        label={translate("table.field.asnOrder.poCode")}
                                        label={translate("table.field.outStock.poCode")}
                                        value={formData.poCode}
                                        variant="filled"
                                        size='small'
@@ -254,7 +254,7 @@
                                </Grid>
                                <Grid item md={2}>
                                    <TextField
                                        label={translate("table.field.asnOrder.logisNo")}
                                        label={translate("table.field.outStock.logisNo")}
                                        value={formData.logisNo}
                                        variant="filled"
                                        size='small'
@@ -264,7 +264,7 @@
                                <Grid item md={2}>
                                    <DateInput
                                        source="arrTime"
                                        label="table.field.asnOrder.arrTime"
                                        label="table.field.outStock.arrTime"
                                        size='small'
                                        variant="filled"
                                        value={formData.arrTime}
@@ -294,7 +294,7 @@
                    </Toolbar>
                </DialogActions>
            </Dialog>
            <AsnWareModal
            <MatnrInfoModal
                open={createDialog}
                setOpen={setCreateDialog}
                data={tabelData}
@@ -424,19 +424,19 @@
    const [columns, setColumns] = useState([
        {
            field: 'maktx',
            headerName: translate('table.field.asnOrderItem.maktx'),
            headerName: translate('table.field.outStockItem.maktx'),
            width: 250,
            editable: false,
        },
        {
            field: 'matnrCode',
            headerName: translate('table.field.asnOrderItem.matnrCode'),
            headerName: translate('table.field.outStockItem.matnrCode'),
            width: 130,
            editable: false,
        },
        {
            field: 'anfme',
            headerName: translate('table.field.asnOrderItem.anfme') + "*",
            headerName: translate('table.field.outStockItem.anfme') + "*",
            type: 'number',
            minWidth: 100,
            flex: 1,
@@ -446,7 +446,7 @@
        },
        {
            field: 'splrCode',
            headerName: translate('table.field.asnOrderItem.splrCode') + "*",
            headerName: translate('table.field.outStockItem.splrCode') + "*",
            minWidth: 100,
            flex: 1,
            editable: true,
@@ -457,7 +457,7 @@
        },
        {
            field: 'splrName',
            headerName: translate('table.field.asnOrderItem.splrName') + "*",
            headerName: translate('table.field.outStockItem.splrName') + "*",
            minWidth: 100,
            flex: 1,
            editable: true,
@@ -481,7 +481,7 @@
        // },
        {
            field: 'poCode',
            headerName: translate('table.field.asnOrderItem.poDetlCode') + "*",
            headerName: translate('table.field.outStockItem.poDetlCode') + "*",
            minWidth: 100,
            flex: 1,
            editable: true,
@@ -490,7 +490,7 @@
        {
            field: 'stockUnit',
            headerName: translate('table.field.asnOrderItem.stockUnit'),
            headerName: translate('table.field.outStockItem.stockUnit'),
            minWidth: 100,
            flex: 1,
            editable: false,
@@ -504,7 +504,7 @@
        // },
        {
            field: 'purUnit',
            headerName: translate('table.field.asnOrderItem.purUnit'),
            headerName: translate('table.field.outStockItem.purUnit'),
            minWidth: 100,
            flex: 1,
            editable: false,
@@ -583,7 +583,7 @@
                rows={tabelData}
                columns={columns}
                disableRowSelectionOnClick
                getRowId={(row) => row.matnrId}
                getRowId={(row) => row.matnrId ? row.matnrId : row.id}
                disableColumnFilter
                disableColumnSelector
                disableColumnSorting
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderController.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OrderItemController.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/OutStockController.java
@@ -219,11 +219,11 @@
    @PostMapping("/outStock/items/save")
    @ApiOperation("保存主单及明细")
    @PreAuthorize("hasAuthority('manager:outStock:save')")
    public R orderAndItem(@RequestBody AsnOrderAndItemsParams params) throws Exception {
    public R saveOutStock(@RequestBody AsnOrderAndItemsParams params) throws Exception {
        if (Objects.isNull(params)) {
            return R.error("参数不能为空!!");
        }
        return outStockService.saveOrderAndItems(params, getLoginUserId());
        return outStockService.saveOutStock(params, getLoginUserId());
    }
    @ApiOperation("单据信息修改")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Order.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/OrderItem.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/OrderItemMapper.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/OrderMapper.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -50,10 +50,6 @@
    private StockService stockService;
    @Autowired
    private LocService locService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderItemService orderItemService;
    /**
    * @author Ryan
    * @description 完成入库,更新库存
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OrderItemService.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OrderService.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/OutStockService.java
@@ -17,7 +17,7 @@
    R generateWaves(List<Long> ids);
    R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId);
    R saveOutStock(AsnOrderAndItemsParams params, Long loginUserId);
    R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderItemServiceImpl.java
@@ -165,11 +165,14 @@
        if (StringUtils.isBlank(asnOrderItem.getTrackCode())) {
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_LABEL_CODE, asnOrderItem);
            asnOrderItem.setTrackCode(ruleCode).setBarcode(ruleCode);
            ;
        }
        if (Objects.isNull(asnOrderItem.getAnfme()) || Double.compare(asnOrderItem.getAnfme(), 0.0) <= 0) {
            throw new CoolException("计划收货数不能为空!!");
            throw new CoolException("计划数不能为空!!");
        }
//        if (StringUtils.isBlank(asnOrderItem.getSplrBatch())) {
//            throw new CoolException("供应商批次不能为空!!");
//        }
        //保存扩展字段
        try {
            String uuid16 = CommonUtil.randomUUID16();
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/AsnOrderServiceImpl.java
@@ -119,6 +119,7 @@
        if (params.getItems().isEmpty()) {
            throw new CoolException("收货通知单明细不能为寒食节!!");
        }
        params.setOrders(orders);
        svaeOrUpdateOrderItem(params,loginUserId);
@@ -164,7 +165,6 @@
    @Transactional(rollbackFor = Exception.class)
    private void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception{
        AsnOrder orders = params.getOrders();
        params.getItems().forEach(item -> {
            item.put("asnId", orders.getId());
            item.put("asnCode", orders.getCode());
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OrderItemServiceImpl.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OrderServiceImpl.java
File was deleted
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/OutStockServiceImpl.java
@@ -6,6 +6,7 @@
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
import com.vincent.rsf.server.api.entity.enums.OrderType;
import com.vincent.rsf.server.manager.controller.params.AsnOrderAndItemsParams;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.AsnExceStatus;
@@ -62,7 +63,6 @@
    @Transactional(rollbackFor = Exception.class)
    private void svaeOrUpdateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) throws Exception {
        AsnOrder orders = params.getOrders();
        params.getItems().forEach(item -> {
            item.put("asnId", orders.getId());
            item.put("asnCode", orders.getCode());
@@ -317,7 +317,8 @@
     * @time 2025/4/29 13:47
     */
    @Override
    public R saveOrderAndItems(AsnOrderAndItemsParams params, Long loginUserId) {
    @Transactional(rollbackFor = Exception.class)
    public R saveOutStock(AsnOrderAndItemsParams params, Long loginUserId) {
        if (Objects.isNull(params.getOrders())) {
            throw new CoolException("主单信息不能为空");
        }
@@ -325,26 +326,35 @@
        if (Objects.isNull(orders)) {
            throw new CoolException("单据不能为空!!");
        }
        if (StringUtils.isBlank(orders.getWkType())) {
            throw new CoolException("业务类型不能为空!!");
        }
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_OUT_STOCK_CODE, orders);
        if (Objects.isNull(ruleCode) || StringUtils.isBlank(ruleCode)) {
            throw new CoolException("编码规则错误:请检查「SYS_OUT_STOCK_CODE」是否设置正确!!");
        }
        orders.setCode(ruleCode)
                .setType(OrderType.ORDER_OUT.type)
                .setUpdateBy(loginUserId)
                .setCreateBy(loginUserId);
        if (!this.save(orders)) {
            throw new CoolException("主单保存失败!!");
        }
        if (params.getItems().isEmpty()) {
            throw new CoolException("收货通知单明细不能为寒食节!!");
            throw new CoolException("收货通知单明细不能为空!!");
        }
        params.setOrders(orders);
        try {
            svaeOrUpdateOrderItem(params,loginUserId);
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
//        svaeOrUpdateOrderItem(params,loginUserId);
        return null;
        return R.ok();
    }
    /**
     * @author Ryan
@@ -355,6 +365,26 @@
     */
    @Override
    public R updateOrderItem(AsnOrderAndItemsParams params, Long loginUserId) {
        AsnOrder orders = params.getOrders();
        if (Objects.isNull(orders)) {
            throw new CoolException("主单信息不能为空!!");
        }
        if (Objects.isNull(orders.getId())) {
            throw new CoolException("数据错误:单据ID不能为空!!");
        }
        if (!this.updateById(orders)) {
            throw new CoolException("主单修改失败!!");
        }
        if (Objects.isNull(params.getItems()) || params.getItems().isEmpty()) {
            return R.ok("明细参数不能为空!!");
        }
        try {
            svaeOrUpdateOrderItem(params,loginUserId);
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
        return null;
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -54,16 +54,8 @@
    private StockItemService stockItemService;
    @Autowired
    private DeviceSiteService deviceSiteService;
    @Autowired
    private OrderService orderService;
    @Autowired
    private OrderItemService orderItemService;
    @Autowired
    private LocItemService locItemService;
    @Autowired
    private DeviceBindService deviceBindService;
    @Autowired