skyouc
2 天以前 03dbce0ba849005d060af569ffe3a58c0a1e0e45
盘点再入库
18个文件已修改
178 ■■■■ 已修改文件
rsf-admin/src/config/setting.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/en.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/AsnOrderPanel.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/asnOrder/POItemModal.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/outStock/SelectMatnrModal.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/outWork/checkOutBound/CheckOutBoundList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/outWork/outBound/OutBoundList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/task/TaskList.jsx 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java 2 ●●● 补丁 | 查看 | 原始文档 | 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/TaskService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 37 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/config/setting.js
@@ -25,7 +25,7 @@
export const ABORT_SIGNAL = false;
export const DEFAULT_PAGE_SIZE = 10;
export const DEFAULT_PAGE_SIZE = 15;
export const DEFAULT_ITEM_PAGE_SIZE = 10;
rsf-admin/src/i18n/en.js
@@ -1121,6 +1121,7 @@
        siteInit: 'site init',
        batch: 'batch',
        pick: 'Pick',
        check: 'Check',
        confirm: 'confirm',
        cancel: "cancel",
        query: "Query",
rsf-admin/src/i18n/zh.js
@@ -1119,6 +1119,7 @@
        continue: '继续收货',
        batch: '批量操作',
        confirm: '确认',
        check: '盘点',
        pick: '拣料',
        bulkExport: "批量导出",
        selectSite: '选择站点',
rsf-admin/src/page/orders/asnOrder/AsnOrderModal.jsx
@@ -706,7 +706,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
rsf-admin/src/page/orders/asnOrder/AsnOrderPanel.jsx
@@ -175,7 +175,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50]}
                pageSizeOptions={[15, 25, 50]}
            />
        </Box >
rsf-admin/src/page/orders/asnOrder/POItemModal.jsx
@@ -394,7 +394,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
rsf-admin/src/page/orders/outStock/SelectMatnrModal.jsx
@@ -595,7 +595,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
rsf-admin/src/page/outWork/checkOutBound/CheckOutBoundList.jsx
@@ -342,7 +342,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
rsf-admin/src/page/outWork/outBound/OutBoundList.jsx
@@ -342,7 +342,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                editMode="row"
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
rsf-admin/src/page/statistics/stockManage/WarehouseStockInfo.jsx
@@ -396,7 +396,7 @@
                        },
                    },
                }}
                pageSizeOptions={[10, 25, 50, 100]}
                pageSizeOptions={[15, 25, 50, 100]}
                checkboxSelection
                onRowSelectionModelChange={handleSelectionChange}
                selectionModel={selectedRows}
rsf-admin/src/page/task/TaskList.jsx
@@ -44,6 +44,7 @@
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
import * as Common from '@/utils/common';
import ColorizeOutlinedIcon from '@mui/icons-material/ColorizeOutlined';
import GradingOutlinedIcon from '@mui/icons-material/GradingOutlined';
const StyledDatagrid = styled(DatagridConfigurable)(({ theme }) => ({
    '& .css-1vooibu-MuiSvgIcon-root': {
@@ -161,6 +162,7 @@
                        <EditButton label="toolbar.detail" />
                        <DoneButton sx={{ padding: '1px', fontSize: '.75rem' }} ></DoneButton>
                        <CancelButton sx={{ padding: '1px', fontSize: '.75rem' }} mutationMode={OPERATE_MODE} />
                        <CheckButton />
                        <PickButton />
                    </WrapperField>
                </StyledDatagrid>
@@ -178,6 +180,24 @@
export default TaskList;
const CheckButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
    const refresh = useRefresh();
    const checkClick = async () => {
        const { data: { code, data, msg } } = await request.post(`/task/pick/` + record.id);
        if (code === 200) {
            notify(msg);
            refresh();
        } else {
            notify(msg);
        }
    }
    return (record?.taskStatus == 199 && record?.taskType == 107 ? <ConfirmButton label={"toolbar.check"} startIcon={<GradingOutlinedIcon />} onConfirm={checkClick} /> : <></>)
}
/**
 * 拣料出库
 * @returns 
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
@@ -76,6 +76,11 @@
        return R.ok().add(page);
    }
    /**
     * 生成库存出库任务
     * @param map
     * @return
     */
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @PostMapping("/locItem/generate/task")
    public R generateTask(@RequestBody Map<String, Object> map) {
@@ -85,6 +90,35 @@
        return locItemService.generateTask(map);
    }
    /**
     * 生成移库任务
     * @param map
     * @return
     */
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @PostMapping("/locItem/generate/move/task")
    public R genMoveTask(@RequestBody Map<String, Object> map) {
        if (Objects.isNull(map)) {
            return R.error("参数不能为空!!");
        }
        return locItemService.gentMoveTask(map);
    }
    /**
     * 生成盘点出库任务
     * @param map
     * @return
     */
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @PostMapping("/locItem/generate/check/task")
    public R genStatisticalTask(@RequestBody Map<String, Object> map) {
        if (Objects.isNull(map)) {
            return R.error("参数不能为空!!");
        }
        return locItemService.generateTask(map);
    }
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @PostMapping("/locItem/list")
    public R list(@RequestBody Map<String, Object> map) {
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -132,7 +132,9 @@
            throw new CoolException("参数不能为空!!");
        }
        List<Integer> longs = Arrays.asList(TaskStsType.GENERATE_IN.id, TaskStsType.GENERATE_OUT.id);
        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getId, id).in(Task::getTaskStatus, longs));
        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>()
                .eq(Task::getId, id)
                .in(Task::getTaskStatus, longs));
        for (Task task : tasks) {
            task.setTaskStatus(task.getTaskType() < (short) 100 ? TaskStsType.COMPLETE_IN.id : TaskStsType.COMPLETE_OUT.id);
@@ -146,6 +148,7 @@
    /**
     * 拣料出库
     *
     * @return
     */
    @PreAuthorize("hasAuthority('manager:task:update')")
@@ -156,7 +159,26 @@
            throw new CoolException("能数不能为空!!");
        }
        try {
            return R.ok(taskService.pickTask(id));
            return R.ok(taskService.pickOrCheckTask(id, "pick"));
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
    }
    /**
     * 盘点出库
     *
     * @return
     */
    @PreAuthorize("hasAuthority('manager:task:update')")
    @ApiOperation("拣料出库")
    @PostMapping("/task/check/{id}")
    public R checkTask(@PathVariable Long id) {
        if (Objects.isNull(id)) {
            throw new CoolException("能数不能为空!!");
        }
        try {
            return R.ok(taskService.pickOrCheckTask(id, "check"));
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/enums/TaskType.java
@@ -16,7 +16,7 @@
    TASK_TYPE_MERGE_IN("54", "并板再入库"),
    TASK_TYPE_CHECK_IN("57", "盘点再入库"),
    TASK_TYPE_OUT("101", "出库"),
    TASK_TYPE_PICK_AGAIN_IN("103", "拣料出库"),
    TASK_TYPE_PICK_AGAIN_OUT("103", "拣料出库"),
    TASK_TYPE_MERGE_OUT("104", "并板出库"),
    TASK_TYPE_CHECK_OUT("107", "盘点出库"),
    TASK_TYPE_EMPITY_OUT("110", "空板出库"),
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -9,4 +9,7 @@
public interface LocItemService extends IService<LocItem> {
    R generateTask(Map<String, Object> map);
    R gentMoveTask(Map<String, Object> map);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -21,7 +21,7 @@
    R removeTask(Long[] ids);
    Task pickTask(Long id) throws Exception;
    Task pickOrCheckTask(Long id, String oType) throws Exception;
    void complateInTask(List<Task> tasks) throws Exception;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -19,6 +19,7 @@
import com.vincent.rsf.server.system.constant.SerialRuleCode;
import com.vincent.rsf.server.system.utils.SerialRuleUtils;
import lombok.Synchronized;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@@ -45,6 +46,7 @@
    /**
     * 库存出库生成出库任务
     * type: check 盘点, stock: 库存出库
     *
     * @param map
     * @return
@@ -53,6 +55,12 @@
    @Synchronized
    @Transactional(rollbackFor = Exception.class)
    public R generateTask(Map<String, Object> map) {
        String type;
        if (!Objects.isNull(map.get("type")) && StringUtils.isNotBlank(map.get("type").toString())) {
            type = map.get("type").toString();
        } else {
            type = "stock";
        }
        if (Objects.isNull(map.get("siteNo"))) {
            throw new CoolException("站点不能为空!");
        }
@@ -91,19 +99,25 @@
            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 (type.equals("stock")) {
            Double useQty  = Math.round((outQty + workQty) * 10000) / 10000.0;
            if (orgQty.compareTo(useQty) > 0) {
                //拣料出库
                task.setTaskType(TaskType.TASK_TYPE_PICK_AGAIN_IN.type);
                    task.setTaskType(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type);
            } else {
                //全板出库
                task.setTaskType(TaskType.TASK_TYPE_OUT.type);
            }
            } else if (type.equals("check")) {
                //盘点出库
                task.setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type);
            }
            if (!taskService.save(task)) {
                throw new CoolException("任务创建失败!!");
            }
@@ -142,4 +156,22 @@
        return R.ok("任务生成完成!!");
    }
    /**
     * 生成移库任务
     * @param map
     * @return
     */
    @Override
    public R gentMoveTask(Map<String, Object> map) {
        if (Objects.isNull(map.get("targetLoc"))) {
        }
        if (Objects.isNull(map.get("orgLoc"))) {
        }
        return null;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -393,6 +393,8 @@
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
                //53.拣料再入库
                pickComplateInStock(task);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_IN.type)) {
                //57.盘点再入库
            }
        }
    }
@@ -413,11 +415,14 @@
            if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)) {
                //全托出库
                complateOutStock(task);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) {
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
                //拣料出库
//                Task seviceOne = pickTask(task.getId());
                //移除原始库存
                complateOutStock(task);
            } else if (task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) {
            }
        }
    }
@@ -535,7 +540,7 @@
                            .eq(BasStation::getUseStatus, LocStsType.LOC_STS_TYPE_R.type)
                    );
                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_OUT.type)
                        || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)
                        || task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)
                        || task.getTaskType().equals(TaskType.TASK_TYPE_MERGE_OUT.type)
                        || task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)
                        || task.getTaskType().equals(TaskType.TASK_TYPE_EMPITY_OUT.type)
@@ -569,13 +574,26 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public Task pickTask(Long id) throws Exception {
    public Task pickOrCheckTask(Long id, String oType) throws Exception {
        Task task = this.getById(id);
        if (Objects.isNull(task)) {
            throw new CoolException("当前任务不存在!!");
        }
        if (!task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) {
        Integer type;
        if (oType.equals("check")) {
            //盘点入库
            type = TaskType.TASK_TYPE_CHECK_IN.type;
            if (!task.getTaskType().equals(TaskType.TASK_TYPE_CHECK_OUT.type)) {
                throw new CoolException("非盘点出库 ,不可执行此操作!!");
            }
        } else {
            //拣料入库
            type = TaskType.TASK_TYPE_PICK_IN.type;
            if (!task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
            throw new CoolException("非拣料出库 ,不可执行此操作!!");
            }
        }
        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>()
@@ -587,13 +605,14 @@
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, task);
        //更新任务主单
        task.setTaskCode(ruleCode)
                .setTaskType(TaskType.TASK_TYPE_PICK_IN.type)
                .setTaskType(type)
                .setBarcode(task.getBarcode())
                .setTaskStatus(TaskStsType.GENERATE_IN.id);
        //TODO 根据物料的库位类型生成新的库位
        TaskInParam param = new TaskInParam();
        param.setSourceStaNo(Integer.parseInt(task.getTargSite()))
                .setIoType(Integer.parseInt(TaskType.TASK_TYPE_PICK_IN.type + ""))
                .setIoType(type)
                .setLocType1(Integer.parseInt(loc.getType()));
        InTaskMsgDto locInfo = wcsService.getLocNo(param);
@@ -664,6 +683,7 @@
            //更新库位明细
            subtractLocItem(loc);
        } catch (Exception e) {
            log.error("<UNK>", e);
            throw new CoolException(e.getMessage());
        }
@@ -702,7 +722,7 @@
            throw new CoolException("库位状态修改失败!!");
        }
        if (!task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) {
        if (!task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_OUT.type)) {
            if (!this.update(new LambdaUpdateWrapper<Task>()
                    .eq(Task::getId, task.getId())
                    .set(Task::getTaskStatus, TaskStsType.UPDATED_OUT.id))) {
@@ -904,7 +924,8 @@
     * @return
     */
    @Transactional(rollbackFor = Exception.class)
    public void saveStockItems(List<TaskItem> items, Long id, String code, Short wkType, String type) throws Exception {
    public void saveStockItems(List<TaskItem> items, Long id, String code, Short wkType, String type) throws
            Exception {
        Stock stock = new Stock();
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_STOCK_CODE, null);
        if (StringUtils.isBlank(ruleCode)) {