skyouc
2 天以前 1af8eb8dc7bdafd9e2f8d8650c93243a0cb6963c
代码优化
2个文件已添加
16个文件已修改
361 ■■■■ 已修改文件
rsf-admin/src/i18n/zh.js 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/basicInfo/loc/LocEdit.jsx 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/locItem/LocItemList.jsx 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/orders/delivery/DeliveryList.jsx 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/task/TaskList.jsx 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/work/checkOutBound/CheckOutBoundList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/page/work/outBound/OutBoundList.jsx 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java 90 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-admin/src/i18n/zh.js
@@ -208,7 +208,8 @@
        basContainer: '容器管理',
        outBound: '出库作业',
        checkOutBound: '盘点出库',
        stockTransfer: '库存转移',
        stockTransfer: '库位转移',
    },
    table: {        
        field: {
rsf-admin/src/page/basicInfo/loc/LocEdit.jsx
@@ -111,24 +111,21 @@
                                    <NumberInput
                                        label="table.field.loc.length"
                                        source="length"
                                        validate={required()}
                                    />
                                    <NumberInput
                                        label="table.field.loc.width"
                                        source="width"
                                        validate={required()}
                                    />
                                    <NumberInput
                                        label="table.field.loc.height"
                                        source="height"
                                        validate={required()}
                                    />
                                </Grid>
                                <Grid item display="flex" gap={1}>
                                    <ReferenceArrayInput source="typeIds" reference="locType" >
                                        <SelectArrayInput label="table.field.loc.type" validate={[required()]} />
                                        <SelectArrayInput label="table.field.loc.type" />
                                    </ReferenceArrayInput>
                                    <TextInput
                                        label="table.field.loc.unit"
rsf-admin/src/page/locItem/LocItemList.jsx
@@ -107,6 +107,7 @@
            source="useStatus"
            optionValue="value"
            parse={v => v}
            alwaysOn
        />,
        <TextInput source="code" label="table.field.loc.code" />,
        <AutocompleteInput
rsf-admin/src/page/orders/delivery/DeliveryList.jsx
@@ -39,6 +39,7 @@
import EmptyData from "../../components/EmptyData";
import MyCreateButton from "../../components/MyCreateButton";
import MyExportButton from '../../components/MyExportButton';
import ImportButton from "../../components/ImportButton";
import PageDrawer from "../../components/PageDrawer";
import MyField from "../../components/MyField";
import { PAGE_DRAWER_WIDTH, OPERATE_MODE, DEFAULT_PAGE_SIZE } from '@/config/setting';
@@ -60,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" />,
    <TextInput source="code" label="table.field.delivery.code" />,
    <TextInput source="platId" label="table.field.delivery.platId" />,
    <TextInput source="type" label="table.field.delivery.type" />,
@@ -110,7 +111,8 @@
                        <FilterButton />
                        <MyCreateButton onClick={() => { setCreateDialog(true) }} />
                        <SelectColumnsButton preferenceKey='delivery' />
                        <MyExportButton />
                        <ImportButton value={'delivery'} />
                        {/* <MyExportButton /> */}
                    </TopToolbar>
                )}
                perPage={DEFAULT_PAGE_SIZE}
@@ -121,7 +123,7 @@
                    rowClick={(id, resource, record) => false}
                    expand={false}
                    expandSingle={true}
                    omit={['id', 'createTime', 'createBy','platId', 'memo', 'workQty', 'startTime', 'endTime', 'updateBy','createTime']}
                    omit={['id', 'createTime', 'createBy', 'platId', 'memo', 'workQty', 'startTime', 'endTime', 'updateBy', 'createTime']}
                >
                    <NumberField source="id" />
                    <TextField source="code" label="table.field.delivery.code" />
@@ -135,7 +137,7 @@
                    <TextField source="platCode" label="table.field.delivery.platCode" />
                    <DateField source="startTime" label="table.field.delivery.startTime" showTime />
                    <DateField source="endTime" label="table.field.delivery.endTime" showTime />
                    <TextField source="updateBy$" label="common.field.updateBy"  />
                    <TextField source="updateBy$" label="common.field.updateBy" />
                    <DateField source="updateTime" label="common.field.updateTime" showTime />
                    <TextField source="createBy$" label="common.field.createBy" />
                    <DateField source="createTime" label="common.field.createTime" showTime />
rsf-admin/src/page/task/TaskList.jsx
@@ -63,8 +63,17 @@
const TaskList = (props) => {
    const translate = useTranslate();
    const refresh = useRefresh();
    const [drawerVal, setDrawerVal] = useState(false);
    const dict = JSON.parse(localStorage.getItem('sys_dicts'))?.filter(dict => (dict.dictTypeCode == 'sys_warehouse_type')) || [];
    // useEffect(() => {
    //     const interval = setInterval(() => {
    //         refresh();
    //     }, 5000); // 每5秒刷新一次
    //     return () => clearInterval(interval); // 清除定时器
    // }, [refresh])
    const filters = [
        <SearchInput source="condition" alwaysOn />,
@@ -103,6 +112,7 @@
    return (
        <Box display="flex">
            <List
                queryOptions={{ refetchInterval: 5000 }}
                sx={{
                    flexGrow: 1,
                    transition: (theme) =>
@@ -179,7 +189,10 @@
export default TaskList;
/**
 * 盘点
 * @returns te
 */
const CheckButton = () => {
    const record = useRecordContext();
    const notify = useNotify();
@@ -195,7 +208,7 @@
        }
    }
    return (record?.taskStatus == 198 && record?.taskType == 107 ? <ConfirmButton label={"toolbar.check"} startIcon={<GradingOutlinedIcon />} onConfirm={checkClick} /> : <></>)
    return (record?.taskStatus == 199 && record?.taskType == 107 ? <ConfirmButton label={"toolbar.check"} startIcon={<GradingOutlinedIcon />} onConfirm={checkClick} /> : <></>)
}
/**
@@ -273,7 +286,7 @@
        }
    }
    return (
        (record.taskStatus == 1 || record.taskStatus  < 101) && (record.taskType == 1 || record.taskType == 101 || record.taskType == 10 || record.taskType == 104) ?
        (record.taskStatus == 1 || record.taskStatus == 101) && (record.taskType == 1 || record.taskType == 101 || record.taskType == 10 || record.taskType == 104) ?
            <Button
                onClick={clickCancel}
                label="toolbar.cancel">
rsf-admin/src/page/work/checkOutBound/CheckOutBoundList.jsx
@@ -182,7 +182,7 @@
        http(sta, data);
    }
    const http = async (sta, items) => {
        const { data: { code, data, msg } } = await request.post(`/locItem/generate/task`, { siteNo: sta, items: items, type: 'check' });
        const { data: { code, data, msg } } = await request.post(`/locItem/check/task`, { siteNo: sta, items: items });
        if (code === 200) {
            notify(msg);
            refresh()
rsf-admin/src/page/work/outBound/OutBoundList.jsx
@@ -189,7 +189,7 @@
            notify(translate('toolbar.request.error.out_stock_qty'))
            return
        }
        const { data: { code, data, msg } } = await request.post(`/locItem/check/task`, { siteNo: sta, items: items });
        const { data: { code, data, msg } } = await request.post(`/locItem/generate/task`, { siteNo: sta, items: items });
        if (code === 200) {
            notify(msg);
            refresh()
rsf-server/src/main/java/com/vincent/rsf/server/api/utils/LocUtils.java
@@ -55,7 +55,12 @@
    public static String getShallowLoc(SlaveProperties slaveProperties, String deepLoc) {
        LocService locService = SpringUtils.getBean(LocService.class);
        Loc depLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, deepLoc));
        int row = depLoc.getRow()-1;
        int row;
        if (depLoc.getRow() != 1) {
            row = depLoc.getRow()-1;
        } else {
            row = depLoc.getRow();
        }
        boolean contains = slaveProperties.getDoubleLocs().contains(row);
        Loc shallowLoc = null;
        if (!contains) {
rsf-server/src/main/java/com/vincent/rsf/server/common/constant/Constants.java
@@ -90,4 +90,19 @@
     */
    public static final String TOKEN_TYPE = "Bearer";
    /**
     * 库存出库
     */
    public static final String TASK_TYPE_OUT_STOCK = "outStock";
    /**
     * 库存盘点出库
     */
    public static final String TASK_TYPE_OUT_CHECK = "check";
    /**
     * 拣料出库
     */
    public static final String TASK_TYPE_OUT_PICK = "pick";
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/DeliveryController.java
@@ -124,4 +124,4 @@
        ExcelUtil.build(ExcelUtil.create(deliveryService.list(), Delivery.class), response);
    }
}
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemController.java
@@ -5,12 +5,14 @@
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.common.utils.ExcelUtil;
import com.vincent.rsf.server.common.annotation.OperationLog;
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.common.utils.FieldsUtils;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.LocItem;
import com.vincent.rsf.server.manager.service.LocItemService;
import com.vincent.rsf.server.manager.service.LocService;
@@ -82,17 +84,19 @@
    /**
     * 生成库存出库任务
     * @param map
     * @param param
     * @return
     */
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @ApiOperation("生成库存出库任务")
    @PostMapping("/locItem/generate/task")
    public R generateTask(@RequestBody Map<String, Object> map) {
        if (Objects.isNull(map)) {
    public R generateTask(@RequestBody LocToTaskParams param) {
        if (Objects.isNull(param)) {
            return R.error("参数不能为空!!");
        }
        return locItemService.generateTask(map);
        param.setType(Constants.TASK_TYPE_OUT_STOCK);
        return locItemService.generateTask(param);
    }
    /**
@@ -103,11 +107,11 @@
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @ApiOperation("生成移库任务")
    @PostMapping("/locItem/move/task")
    public R genMoveTask(@RequestBody Map<String, Object> map) {
    public R genMoveTask(@RequestBody LocToTaskParams map) {
        if (Objects.isNull(map)) {
            return R.error("参数不能为空!!");
        }
        return locItemService.genMoveTask(map);
        return R.ok("任务生成成功").add(locItemService.genMoveTask(map));
    }
    /**
@@ -118,11 +122,12 @@
    @PreAuthorize("hasAuthority('manager:locItem:list')")
    @ApiOperation("生成盘点出库任务")
    @PostMapping("/locItem/check/task")
    public R genStatisticalTask(@RequestBody Map<String, Object> map) {
    public R genStatisticalTask(@RequestBody LocToTaskParams map) {
        if (Objects.isNull(map)) {
            return R.error("参数不能为空!!");
        }
        return locItemService.generateTask(map);
        map.setType(Constants.TASK_TYPE_OUT_CHECK);
        return R.ok("任务生成成功").add(locItemService.generateTask(map));
    }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.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.common.constant.Constants;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.common.utils.ExcelUtil;
@@ -158,7 +159,7 @@
            throw new CoolException("能数不能为空!!");
        }
        try {
            return R.ok(taskService.pickOrCheckTask(id, "pick"));
            return R.ok("出库完成").add(taskService.pickOrCheckTask(id, Constants.TASK_TYPE_OUT_PICK));
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
@@ -177,7 +178,7 @@
            throw new CoolException("能数不能为空!!");
        }
        try {
            return R.ok(taskService.pickOrCheckTask(id, "check"));
            return R.ok(taskService.pickOrCheckTask(id, Constants.TASK_TYPE_OUT_CHECK));
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/params/LocToTaskParams.java
New file
@@ -0,0 +1,32 @@
package com.vincent.rsf.server.manager.controller.params;
import com.vincent.rsf.server.manager.entity.LocItem;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.util.List;
@Data
@Accessors(chain = true)
@ApiModel(value = "LocToTaskParams", description = "库存出库参数")
public class LocToTaskParams {
    @ApiModelProperty("类型: check:盘点出库, outStock: 库存出库")
    private String type;
    @ApiModelProperty("目标站点")
    private String siteNo;
    @ApiModelProperty("库位明细列表")
    private List<LocItem> items;
    @ApiModelProperty("源库位")
    private String orgLoc;
    @ApiModelProperty("目标库位")
    private String tarLoc;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/excel/DeliveryTemplate.java
New file
@@ -0,0 +1,118 @@
package com.vincent.rsf.server.manager.entity.excel;
import cn.afterturn.easypoi.excel.annotation.Excel;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelAutoColumnSize;
import com.vincent.rsf.server.manager.entity.excel.annotation.ExcelComment;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@ExcelAutoColumnSize
@Accessors(chain = true)
public class DeliveryTemplate implements Serializable {
    private static final long serialVersionUID = 1L;
    @Excel(name = "*DO单号")
    @ApiModelProperty(value= "*PO单号")
    @ExcelComment(value = "poCode", example = "PO25413975")
    private String poCode;
    @Excel(name = "*行号")
    @ApiModelProperty(value= "*行号")
    @ExcelComment(value = "platItemId", example = "100068541001")
    private String platItemId;
    @Excel(name = "单据类型")
    @ApiModelProperty(value= "单据类型")
    @ExcelComment(value = "type", example = "入库单")
    private String type;
    @Excel(name = "单据来源")
    @ApiModelProperty(value= "单据来源")
    @ExcelComment(value = "source", example = "ERP同步")
    private String source;
    @Excel(name = "客单号")
    @ApiModelProperty(value= "客单号")
    @ExcelComment(value = "platOrderCode", example = "2052146822")
    private String platOrderCode;
    @Excel(name = "工单号")
    @ApiModelProperty(value= "工单号")
    @ExcelComment(value = "platWorkCode", example = "64875413")
    private String platWorkCode;
    @Excel(name = "项目号")
    @ApiModelProperty(value= "项目号")
    @ExcelComment(value = "projectCode", example = "65413")
    private String projectCode;
    @Excel(name = "业务类型")
    @ApiModelProperty(value= "业务类型")
    @ExcelComment(value = "wkType", example = "采购入库单")
    private String wkType;
    @Excel(name = "项目名称")
    @ApiModelProperty(value= "项目名称")
    @ExcelComment(value = "project", example = "京东电商立库")
    private String project;
    /**
     * 物料编码
     */
    @Excel(name = "*物料编码")
    @ApiModelProperty(value= "*物料编码")
    @ExcelComment(value = "matnrCode", example = "101000000002")
    private String matnrCode;
    /**
     *
     */
    @Excel(name = "物料名称")
    @ApiModelProperty(value= "物料名称")
    @ExcelComment(value = "matnrName", example = "TC-03128寸连体内上托")
    private String matnrName;
    /**
     * 数量
     */
    @Excel(name = "数量")
    @ApiModelProperty(value= "数量")
    @ExcelComment(value = "anfme", example = "75")
    private Double anfme;
    /**
     * 供应商编码
     */
    @Excel(name = "*供应商编码")
    @ApiModelProperty(value= "*供应商编码")
    @ExcelComment(value = "splrCode", example = "685947")
    private String splrCode;
    /**
     * 供应商批次
     */
    @Excel(name = "供应商批次")
    @ApiModelProperty(value= "供应商批次")
    @ExcelComment(value = "splrBatch", example = "20250401")
    private String splrBatch;
    @Excel(name = "预计送达时间")
    @ApiModelProperty("预计送达时间")
    @ExcelComment(value = "arrTime", example = "2025-05-21")
    private String arrTime;
    @Excel(name = "备注")
    @ApiModelProperty("备注")
    @ExcelComment(value = "memo", example = "注:易碎品,轻拿放")
    private String memo;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/schedules/TaskSchedules.java
@@ -58,7 +58,6 @@
     * @time 2025/4/2 12:37
     */
    @Scheduled(cron = "0/3 * * * * ?")
//    @Transactional(rollbackFor = Exception.class)
    public void completeInStock() throws Exception {
        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.COMPLETE_IN.id));
        if (tasks.isEmpty()) {
@@ -73,8 +72,7 @@
     * @description: 完成出库任务,更新库存
     * @version 1.0
     */
    @Scheduled(cron = "0/30 * * * * ?  ")
    @Transactional(rollbackFor = Exception.class)
    @Scheduled(cron = "0/5 * * * * ?  ")
    public void complateOutStock() throws Exception {
        List<Task> tasks = taskService.list(new LambdaQueryWrapper<Task>().eq(Task::getTaskStatus, TaskStsType.COMPLETE_OUT.id));
        if (tasks.isEmpty()) {
@@ -90,7 +88,7 @@
     * @description 已完成任务加入历史档
     * @time 2025/4/3 12:54
     */
    @Scheduled(cron = "0 0/05 * * * ?  ")
    @Scheduled(cron = "0 0/01 * * * ?  ")
    @Transactional(rollbackFor = Exception.class)
    public void taskLogUpdate() {
        LambdaQueryWrapper<Task> queryWrapper = new LambdaQueryWrapper<Task>();
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemService.java
@@ -2,14 +2,16 @@
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.framework.common.R;
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;
import java.util.Map;
public interface LocItemService extends IService<LocItem> {
    R generateTask(Map<String, Object> map);
    R generateTask(LocToTaskParams map);
    R genMoveTask(Map<String, Object> map);
    Task genMoveTask(LocToTaskParams map);
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemServiceImpl.java
@@ -10,6 +10,8 @@
import com.vincent.rsf.server.api.service.WcsService;
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.api.utils.SlaveProperties;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.manager.controller.params.LocToTaskParams;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.server.manager.enums.LocType;
@@ -58,22 +60,16 @@
    @Override
    @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"))) {
    public R generateTask(LocToTaskParams map) {
        if (Objects.isNull(map.getSiteNo())) {
            throw new CoolException("站点不能为空!");
        }
        if (Objects.isNull(map.get("items"))) {
        if (Objects.isNull(map.getItems()) || map.getItems().isEmpty()) {
            throw new CoolException("明细不能为空!");
        }
        String siteNo = map.get("siteNo").toString();
        List<LocItem> items = JSONArray.parseArray(JSONArray.toJSONString(map.get("items")), LocItem.class);
        String siteNo = map.getSiteNo();
        List<LocItem> items = map.getItems();
        Map<Long, List<LocItem>> listMap = items.stream().collect(Collectors.groupingBy(LocItem::getLocId));
        listMap.keySet().forEach(key -> {
            Task task = new Task();
@@ -87,13 +83,25 @@
                throw new CoolException("库位状态更新失败!!");
            }
            Task moveTask = new Task();
            if (!LocUtils.isShallowLoc(slaveProperties, loc.getCode())) {
                //TODO 判断是否深库位,如果为深库位,需生成移库任务
                //获取深库位对应浅库位
                String shallowLoc = LocUtils.getShallowLoc(slaveProperties, loc.getCode());
                Loc one = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, shallowLoc));
                if (Objects.isNull(one)) {
                    throw new CoolException("对应库位不存在!!");
                }
                map.setOrgLoc(one.getCode());
                //优先生成移库任务
                if (!one.getUseStatus().equals(LocStsType.LOC_STS_TYPE_O.type)) {
                    moveTask = genMoveTask(map);
                }
            }
            String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, null);
            task.setOrgLoc(loc.getCode())
                    .setTaskCode(ruleCode)
                    .setParentId(moveTask.getId())
                    .setTargSite(siteNo)
                    .setTaskStatus(TaskStsType.GENERATE_OUT.id)
                    .setBarcode(loc.getBarcode());
@@ -113,7 +121,7 @@
                throw new CoolException("托盘任务执行中,不能重复创建!");
            }
            if (type.equals("stock")) {
            if (map.getType().equals(Constants.TASK_TYPE_OUT_STOCK)) {
                Double useQty = Math.round((outQty + workQty) * 10000) / 10000.0;
                if (orgQty.compareTo(useQty) > 0) {
                    //拣料出库
@@ -136,7 +144,7 @@
                        throw new CoolException("站点不支持全板出库!!");
                    }
                }
            } else if (type.equals("check")) {
            } else if (map.getType().equals(Constants.TASK_TYPE_OUT_CHECK)) {
                //盘点出库
                task.setTaskType(TaskType.TASK_TYPE_CHECK_OUT.type);
                DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
@@ -144,7 +152,7 @@
                        .eq(DeviceSite::getSite, siteNo)
                        .eq(DeviceSite::getType, TaskType.TASK_TYPE_CHECK_OUT.type));
                if (Objects.isNull(deviceSite)) {
                    throw new CoolException("站点不支持盘点出库!!");
                    throw new CoolException("当前站点不支持盘点出库!!");
                }
            }
@@ -199,14 +207,20 @@
     */
    @Override
    @Transactional(rollbackFor = Exception.class)
    public R genMoveTask(Map<String, Object> map) {
        if (Objects.isNull(map.get("orgLoc")) || StringUtils.isBlank(map.get("orgLoc").toString())) {
    public Task genMoveTask(LocToTaskParams map) {
        if (Objects.isNull(map.getOrgLoc()) || StringUtils.isBlank(map.getOrgLoc())) {
            throw new CoolException("源库位不能为空!");
        }
        Loc orgLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, map.get("orgLoc")));
        Loc orgLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, map.getOrgLoc()));
        if (Objects.isNull(orgLoc)) {
            throw new CoolException("源库位不存在!!");
        }
        if (orgLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_R.type)
                || orgLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)
                || orgLoc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_X.type ) ) {
            throw new CoolException("源库位有任务正在执行中...");
        }
        orgLoc.setUseStatus(LocStsType.LOC_STS_TYPE_R.type);
@@ -216,7 +230,7 @@
        }
        Loc targetLoc = new Loc();
        if (Objects.isNull(map.get("tarLoc")) || StringUtils.isBlank(map.get("tarLoc").toString())) {
        if (Objects.isNull(map.getTarLoc()) || StringUtils.isBlank(map.getTarLoc())) {
            //目标库位为空,自动获取新库位
            DeviceSite deviceSite = deviceSiteService.getOne(new LambdaQueryWrapper<DeviceSite>()
                            .eq(DeviceSite::getType, TaskType.TASK_TYPE_LOC_MOVE.type)
@@ -237,7 +251,7 @@
            }
            targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, locNo.getLocNo()));
        } else {
            targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, map.get("tarLoc").toString()));
            targetLoc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, map.getTarLoc()));
        }
        if (Objects.isNull(targetLoc)) {
@@ -264,26 +278,22 @@
        }
        List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, orgLoc.getId()));
        if (locItems.isEmpty()) {
            throw new CoolException("库位明细不存在!!");
        if (!locItems.isEmpty()) {
            List<TaskItem> taskItems = new ArrayList<>();
            for (LocItem item : locItems) {
                TaskItem taskItem = new TaskItem();
                BeanUtils.copyProperties(item, taskItem);
                taskItem.setTaskId(task.getId())
                        .setAnfme(item.getAnfme())
                        .setBatch(item.getBatch())
                        .setOrderType(OrderType.ORDER_IN.type)
                        .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type));
                taskItems.add(taskItem);
            }
            if (!taskItemService.saveBatch(taskItems)) {
                throw new CoolException("任务明细生成失败!!");
            }
        }
        List<TaskItem> taskItems = new ArrayList<>();
        for (LocItem item : locItems) {
            TaskItem taskItem = new TaskItem();
            BeanUtils.copyProperties(item, taskItem);
            taskItem.setTaskId(task.getId())
                    .setAnfme(item.getAnfme())
                    .setBatch(item.getBatch())
                    .setOrderType(OrderType.ORDER_IN.type)
                    .setWkType(Short.parseShort(OrderWorkType.ORDER_WORK_TYPE_OTHER_IN.type));
            taskItems.add(taskItem);
        }
        if (!taskItemService.saveBatch(taskItems)) {
            throw new CoolException("任务明细生成失败!!");
        }
        return R.ok(task);
        return task;
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -6,6 +6,7 @@
import com.vincent.rsf.server.api.controller.params.TaskInParam;
import com.vincent.rsf.server.api.entity.dto.InTaskMsgDto;
import com.vincent.rsf.server.api.service.WcsService;
import com.vincent.rsf.server.common.constant.Constants;
import com.vincent.rsf.server.manager.enums.*;
import com.vincent.rsf.framework.common.R;
import com.vincent.rsf.framework.exception.CoolException;
@@ -167,7 +168,6 @@
            throw new CoolException("参数不能为空!!");
        }
        /**获取组拖*/
//        List<Long> ids = pakins.stream().map(WaitPakin::getId).collect(Collectors.toList());
        List<WaitPakin> waitPakins = waitPakinService.list(new LambdaQueryWrapper<WaitPakin>()
                .in(WaitPakin::getId, pakins.getId())
                .eq(WaitPakin::getIoStatus, Short.parseShort(PakinIOStatus.PAKIN_IO_STATUS_DONE.val)));
@@ -645,17 +645,15 @@
            throw new CoolException("当前任务不存在!!");
        }
        Integer type;
        if (oType.equals("check")) {
        if (oType.equals(Constants.TASK_TYPE_OUT_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("非拣料出库 ,不可执行此操作!!");
            }
@@ -674,11 +672,11 @@
                .setBarcode(task.getBarcode())
                .setTaskStatus(TaskStsType.GENERATE_IN.id);
        //TODO 根据物料的库位类型生成新的库位
        TaskInParam param = new TaskInParam();
        param.setSourceStaNo(Integer.parseInt(task.getTargSite()))
                .setIoType(type)
                .setLocType1(Integer.parseInt(loc.getType()));
        //获取新库位
        InTaskMsgDto locInfo = wcsService.getLocNo(param);
        if (Objects.isNull(locInfo)) {
@@ -746,6 +744,13 @@
        if (Objects.isNull(task)) {
            throw new CoolException("参数不能为空!!");
        }
        if (StringUtils.isNotBlank(task.getParentId() + "")) {
            Task task1 = taskService.getById(task.getParentId());
            if (!Objects.isNull(task1)) {
                throw new CoolException("父任务:" + task1.getTaskCode() + "未执行完成!");
            }
        }
        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getOrgLoc()));
        if (Objects.isNull(loc)) {
            throw new CoolException("库位不存在!!");