skyouc
2 天以前 5c0ac8adccb4d895148ee32ca7afc9a07d50e635
添加作业临时库存表
优化拣料出库作业
7个文件已添加
6个文件已修改
691 ■■■■■ 已修改文件
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java 110 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java 368 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java 8 ●●●●● 补丁 | 查看 | 原始文档 | 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/LocItemWorkingServiceImpl.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java 117 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/locItemWorking.sql 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
rsf-server/src/main/java/com/vincent/rsf/server/api/controller/WcsController.java
@@ -63,8 +63,10 @@
        return R.ok();
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/common/CodeBuilder.java
@@ -22,7 +22,7 @@
//        generator.username="sa";
//        generator.password="Zoneyung@zy56$";
        generator.table = "man_bas_container";
        generator.table = "man_loc_item_working";
        generator.tableDesc = "容器管理";
        generator.packagePath = "com.vincent.rsf.server.manager";
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/LocItemWorkingController.java
New file
@@ -0,0 +1,110 @@
package com.vincent.rsf.server.manager.controller;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.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.manager.entity.LocItemWorking;
import com.vincent.rsf.server.manager.service.LocItemWorkingService;
import com.vincent.rsf.server.system.controller.BaseController;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.access.prepost.PreAuthorize;
import org.springframework.web.bind.annotation.*;
import javax.servlet.http.HttpServletResponse;
import java.util.*;
@RestController
public class LocItemWorkingController extends BaseController {
    @Autowired
    private LocItemWorkingService locItemWorkingService;
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @PostMapping("/locItemWorking/page")
    public R page(@RequestBody Map<String, Object> map) {
        BaseParam baseParam = buildParam(map, BaseParam.class);
        PageParam<LocItemWorking, BaseParam> pageParam = new PageParam<>(baseParam, LocItemWorking.class);
        return R.ok().add(locItemWorkingService.page(pageParam, pageParam.buildWrapper(true)));
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @PostMapping("/locItemWorking/list")
    public R list(@RequestBody Map<String, Object> map) {
        return R.ok().add(locItemWorkingService.list());
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @PostMapping({"/locItemWorking/many/{ids}", "/locItemWorkings/many/{ids}"})
    public R many(@PathVariable Long[] ids) {
        return R.ok().add(locItemWorkingService.listByIds(Arrays.asList(ids)));
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @GetMapping("/locItemWorking/{id}")
    public R get(@PathVariable("id") Long id) {
        return R.ok().add(locItemWorkingService.getById(id));
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:save')")
    @OperationLog("Create 容器管理")
    @PostMapping("/locItemWorking/save")
    public R save(@RequestBody LocItemWorking locItemWorking) {
        locItemWorking.setCreateBy(getLoginUserId());
        locItemWorking.setCreateTime(new Date());
        locItemWorking.setUpdateBy(getLoginUserId());
        locItemWorking.setUpdateTime(new Date());
        if (!locItemWorkingService.save(locItemWorking)) {
            return R.error("Save Fail");
        }
        return R.ok("Save Success").add(locItemWorking);
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:update')")
    @OperationLog("Update 容器管理")
    @PostMapping("/locItemWorking/update")
    public R update(@RequestBody LocItemWorking locItemWorking) {
        locItemWorking.setUpdateBy(getLoginUserId());
        locItemWorking.setUpdateTime(new Date());
        if (!locItemWorkingService.updateById(locItemWorking)) {
            return R.error("Update Fail");
        }
        return R.ok("Update Success").add(locItemWorking);
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:remove')")
    @OperationLog("Delete 容器管理")
    @PostMapping("/locItemWorking/remove/{ids}")
    public R remove(@PathVariable Long[] ids) {
        if (!locItemWorkingService.removeByIds(Arrays.asList(ids))) {
            return R.error("Delete Fail");
        }
        return R.ok("Delete Success").add(ids);
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @PostMapping("/locItemWorking/query")
    public R query(@RequestParam(required = false) String condition) {
        List<KeyValVo> vos = new ArrayList<>();
        LambdaQueryWrapper<LocItemWorking> wrapper = new LambdaQueryWrapper<>();
        if (!Cools.isEmpty(condition)) {
            wrapper.like(LocItemWorking::getId, condition);
        }
        locItemWorkingService.page(new Page<>(1, 30), wrapper).getRecords().forEach(
                item -> vos.add(new KeyValVo(item.getId(), item.getId()))
        );
        return R.ok().add(vos);
    }
    @PreAuthorize("hasAuthority('manager:locItemWorking:list')")
    @PostMapping("/locItemWorking/export")
    public void export(@RequestBody Map<String, Object> map, HttpServletResponse response) throws Exception {
        ExcelUtil.build(ExcelUtil.create(locItemWorkingService.list(), LocItemWorking.class), response);
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/controller/TaskController.java
@@ -153,7 +153,11 @@
        if (Objects.isNull(id)) {
            throw new CoolException("能数不能为空!!");
        }
        try {
        return taskService.pickTask(id);
        } catch (Exception e) {
            throw new CoolException(e.getMessage());
        }
    }
//    @PreAuthorize("hasAuthority('manager:task:update')")
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/LocItemWorking.java
New file
@@ -0,0 +1,368 @@
package com.vincent.rsf.server.manager.entity;
import com.baomidou.mybatisplus.annotation.TableLogic;
import java.text.SimpleDateFormat;
import java.util.Date;
import lombok.experimental.Accessors;
import org.springframework.format.annotation.DateTimeFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableLogic;
import com.baomidou.mybatisplus.annotation.TableName;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import com.vincent.rsf.framework.common.Cools;
import com.vincent.rsf.framework.common.SpringUtils;
import com.vincent.rsf.server.system.service.UserService;
import com.vincent.rsf.server.system.entity.User;
import java.io.Serializable;
import java.util.Date;
@Data
@Accessors(chain = true)
@TableName("man_loc_item_working")
public class LocItemWorking implements Serializable {
    private static final long serialVersionUID = 1L;
    /**
     * ID
     */
    @ApiModelProperty(value= "ID")
    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    /**
     * 主单ID
     */
    @ApiModelProperty(value= "主单ID")
    private Long locId;
    @ApiModelProperty("任务明细ID")
    private Long taskId;
    /**
     * 库位
     */
    @ApiModelProperty(value= "库位")
    private String locCode;
    /**
     * 单据ID
     */
    @ApiModelProperty(value= "单据ID")
    private Long orderId;
    /**
     * 单据类型
     */
    @ApiModelProperty(value= "单据类型")
    private String type;
    /**
     * 订单明细id
     */
    @ApiModelProperty(value= "订单明细id")
    private Long orderItemId;
    /**
     * 业务类型
     */
    @ApiModelProperty(value= "业务类型")
    private Short wkType;
    /**
     * 物料ID
     */
    @ApiModelProperty(value= "物料ID")
    private Long matnrId;
    /**
     * 物料名称
     */
    @ApiModelProperty(value= "物料名称")
    private String maktx;
    /**
     * 平台ID(行号)
     */
    @ApiModelProperty(value= "平台ID(行号)")
    private String platItemId;
    /**
     * 客户订单号
     */
    @ApiModelProperty(value= "客户订单号")
    private String platOrderCode;
    /**
     * 工单号
     */
    @ApiModelProperty(value= "工单号")
    private String platWorkCode;
    /**
     * 项目号
     */
    @ApiModelProperty(value= "项目号")
    private String projectCode;
    /**
     * 物料编码
     */
    @ApiModelProperty(value= "物料编码")
    private String matnrCode;
    /**
     * 物料跟踪码
     */
    @ApiModelProperty(value= "物料跟踪码")
    private String trackCode;
    /**
     * 库存单位
     */
    @ApiModelProperty(value= "库存单位")
    private String unit;
    /**
     * 数量
     */
    @ApiModelProperty(value= "数量")
    private Double anfme;
    /**
     * 完成数量
     */
    @ApiModelProperty(value= "完成数量")
    private Double qty;
    /**
     * 执行数量
     */
    @ApiModelProperty(value= "执行数量 ")
    private Double workQty;
    /**
     * 供应商批次
     */
    @ApiModelProperty(value= "供应商批次")
    private String batch;
    /**
     * 供应商批次(原供应商批次,暂停使用)
     */
    @ApiModelProperty(value= "供应商批次(原供应商批次,暂停使用)")
    private String splrBatch;
    /**
     * 供应商ID
     */
    @ApiModelProperty(value= "供应商ID")
    private Long splrId;
    /**
     * 规格
     */
    @ApiModelProperty(value= "规格")
    private String spec;
    /**
     * 型号
     */
    @ApiModelProperty(value= "型号")
    private String model;
    /**
     * 字段索引
     */
    @ApiModelProperty(value= "字段索引")
    private String fieldsIndex;
    /**
     * 状态 1: 正常  0: 冻结
     */
    @ApiModelProperty(value= "状态 1: 正常  0: 冻结  ")
    private Integer status;
    /**
     * 是否删除 1: 是  0: 否
     */
    @ApiModelProperty(value= "是否删除 1: 是  0: 否  ")
    @TableLogic
    private Integer deleted;
    /**
     * 租户
     */
    @ApiModelProperty(value= "租户")
    private Integer tenantId;
    /**
     * 添加人员
     */
    @ApiModelProperty(value= "添加人员")
    private Long createBy;
    /**
     * 添加时间
     */
    @ApiModelProperty(value= "添加时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    /**
     * 修改人员
     */
    @ApiModelProperty(value= "修改人员")
    private Long updateBy;
    /**
     * 修改时间
     */
    @ApiModelProperty(value= "修改时间")
    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
    private Date updateTime;
    /**
     * 备注
     */
    @ApiModelProperty(value= "备注")
    private String memo;
    public LocItemWorking() {}
    public LocItemWorking(Long locId,String locCode,Long orderId,String type,Long orderItemId,Short wkType,Long matnrId,String maktx,String platItemId,String platOrderCode,String platWorkCode,String projectCode,String matnrCode,String trackCode,String unit,Double anfme,Double qty,Double workQty,String batch,String splrBatch,Long splrId,String spec,String model,String fieldsIndex,Integer status,Integer deleted,Integer tenantId,Long createBy,Date createTime,Long updateBy,Date updateTime,String memo) {
        this.locId = locId;
        this.locCode = locCode;
        this.orderId = orderId;
        this.type = type;
        this.orderItemId = orderItemId;
        this.wkType = wkType;
        this.matnrId = matnrId;
        this.maktx = maktx;
        this.platItemId = platItemId;
        this.platOrderCode = platOrderCode;
        this.platWorkCode = platWorkCode;
        this.projectCode = projectCode;
        this.matnrCode = matnrCode;
        this.trackCode = trackCode;
        this.unit = unit;
        this.anfme = anfme;
        this.qty = qty;
        this.workQty = workQty;
        this.batch = batch;
        this.splrBatch = splrBatch;
        this.splrId = splrId;
        this.spec = spec;
        this.model = model;
        this.fieldsIndex = fieldsIndex;
        this.status = status;
        this.deleted = deleted;
        this.tenantId = tenantId;
        this.createBy = createBy;
        this.createTime = createTime;
        this.updateBy = updateBy;
        this.updateTime = updateTime;
        this.memo = memo;
    }
//    LocItemWorking locItemWorking = new LocItemWorking(
//            null,    // 主单ID
//            null,    // 库位
//            null,    // 单据ID
//            null,    // 单据类型
//            null,    // 订单明细id
//            null,    // 业务类型
//            null,    // 物料ID
//            null,    // 物料名称
//            null,    // 平台ID(行号)
//            null,    // 客户订单号
//            null,    // 工单号
//            null,    // 项目号
//            null,    // 物料编码
//            null,    // 物料跟踪码
//            null,    // 库存单位
//            null,    // 数量
//            null,    // 完成数量
//            null,    // 执行数量
//            null,    // 供应商批次
//            null,    // 供应商批次(原供应商批次,暂停使用)
//            null,    // 供应商ID
//            null,    // 规格
//            null,    // 型号
//            null,    // 字段索引
//            null,    // 状态[非空]
//            null,    // 是否删除[非空]
//            null,    // 租户
//            null,    // 添加人员
//            null,    // 添加时间[非空]
//            null,    // 修改人员
//            null,    // 修改时间[非空]
//            null    // 备注
//    );
    public String getStatus$(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return "正常";
            case 0:
                return "冻结";
            default:
                return String.valueOf(this.status);
        }
    }
    public String getCreateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.getById(this.createBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getNickname());
        }
        return null;
    }
    public String getCreateTime$(){
        if (Cools.isEmpty(this.createTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.createTime);
    }
    public String getUpdateBy$(){
        UserService service = SpringUtils.getBean(UserService.class);
        User user = service.getById(this.updateBy);
        if (!Cools.isEmpty(user)){
            return String.valueOf(user.getNickname());
        }
        return null;
    }
    public String getUpdateTime$(){
        if (Cools.isEmpty(this.updateTime)){
            return "";
        }
        return new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(this.updateTime);
    }
    public Boolean getStatusBool(){
        if (null == this.status){ return null; }
        switch (this.status){
            case 1:
                return true;
            case 0:
                return false;
            default:
                return null;
        }
    }
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/entity/Task.java
@@ -56,6 +56,8 @@
    @ApiModelProperty(value= "任务状态")
    private Short taskStatus;
    @ApiModelProperty("上级任务ID")
    private Long parentId;
    @ApiModelProperty("仓库类型")
    private Short warehType;
rsf-server/src/main/java/com/vincent/rsf/server/manager/mapper/LocItemWorkingMapper.java
New file
@@ -0,0 +1,12 @@
package com.vincent.rsf.server.manager.mapper;
import com.vincent.rsf.server.manager.entity.LocItemWorking;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
@Mapper
@Repository
public interface LocItemWorkingMapper extends BaseMapper<LocItemWorking> {
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/LocItemWorkingService.java
New file
@@ -0,0 +1,8 @@
package com.vincent.rsf.server.manager.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.vincent.rsf.server.manager.entity.LocItemWorking;
public interface LocItemWorkingService extends IService<LocItemWorking> {
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/TaskService.java
@@ -21,5 +21,5 @@
    R removeTask(Long[] ids);
    R pickTask(Long id);
    R pickTask(Long id) throws Exception;
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/LocItemWorkingServiceImpl.java
New file
@@ -0,0 +1,12 @@
package com.vincent.rsf.server.manager.service.impl;
import com.vincent.rsf.server.manager.mapper.LocItemWorkingMapper;
import com.vincent.rsf.server.manager.entity.LocItemWorking;
import com.vincent.rsf.server.manager.service.LocItemWorkingService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;
@Service("locItemWorkingService")
public class LocItemWorkingServiceImpl extends ServiceImpl<LocItemWorkingMapper, LocItemWorking> implements LocItemWorkingService {
}
rsf-server/src/main/java/com/vincent/rsf/server/manager/service/impl/TaskServiceImpl.java
@@ -9,6 +9,7 @@
import com.vincent.rsf.server.api.utils.LocUtils;
import com.vincent.rsf.server.manager.controller.params.GenerateTaskParams;
import com.vincent.rsf.server.manager.entity.*;
import com.vincent.rsf.server.manager.mapper.TaskItemMapper;
import com.vincent.rsf.server.manager.mapper.TaskMapper;
import com.vincent.rsf.server.manager.service.*;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
@@ -65,6 +66,8 @@
    private BasStationService basStationService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private LocItemWorkingService locItemWorkingService;
    @Override
    @Transactional(rollbackFor = Exception.class)
@@ -386,7 +389,7 @@
                    complateInstock(task);
                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_IN.type)) {
                    //53.拣料再入库
                    pickComplateInStock(task);
                }
            } else {
                //出库任务
@@ -394,11 +397,75 @@
                    //全托出库
                    complateOutStock(task);
                } else if (task.getTaskType().equals(TaskType.TASK_TYPE_PICK_AGAIN_IN.type)) {
                    //拣料出库,
                    taskService.pickTask(task.getId());
                    //拣料出库
                    //
                    pickTask(task.getId());
                    //移除原始库存
                    complateOutStock(task);
                }
            }
        }
    }
    /**
     * 拣料再入库
     *
     * @param task
     */
    @Transactional(rollbackFor = Exception.class)
    public void pickComplateInStock(Task task) throws Exception {
        if (Objects.isNull(task)) {
            return;
        }
        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
        if (Objects.isNull(loc)) {
            throw new CoolException("库存不存在!!");
        }
        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) {
            throw new CoolException("当前库位状态不处于S.入库预约,不可执行入库操作!");
        }
        loc.setUseStatus(LocStsType.LOC_STS_TYPE_F.type).setBarcode(task.getBarcode());
        if (!locService.updateById(loc)) {
            throw new CoolException("库位信息更新失败!!");
        }
        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
        if (taskItems.isEmpty()) {
            throw new CoolException("任务明细不存在!!");
        }
        List<LocItem> items = new ArrayList<>();
        for (TaskItem taskItem : taskItems) {
            LocItem locItem = new LocItem();
            LocItemWorking locWorking = locItemWorkingService.getOne(new LambdaQueryWrapper<LocItemWorking>()
                    .eq(LocItemWorking::getTaskId, taskItem.getTaskId())
                    .eq(LocItemWorking::getLocCode, task.getTargLoc())
                    .eq(LocItemWorking::getMatnrId, taskItem.getMatnrId())
                    .eq(StringUtils.isNoneBlank(taskItem.getFieldsIndex()), LocItemWorking::getFieldsIndex, taskItem.getFieldsIndex())
                    .eq(StringUtils.isNotBlank(taskItem.getBatch()), LocItemWorking::getBatch, taskItem.getBatch()));
            if (Objects.isNull(locWorking)) {
                throw new CoolException("数据错误,作业中库存数据丢失!!");
            }
            if (locWorking.getAnfme().compareTo(taskItem.getAnfme()) >= 0) {
               locWorking.setAnfme(Math.round((locWorking.getAnfme() - taskItem.getAnfme()) * 10000) / 10000.0);
            } else {
                continue;
            }
            BeanUtils.copyProperties(locWorking, locItem);
            locItem.setLocCode(loc.getCode()).setLocId(loc.getId()).setId(null);
            items.add(locItem);
        }
       if (!locItemService.saveBatch(items)) {
           throw new CoolException("作业库存回写失败!!");
       }
       if (!locItemWorkingService.remove(new LambdaQueryWrapper<LocItemWorking>().eq(LocItemWorking::getTaskId, task.getId()))) {
           throw new CoolException("作业中库存删除失败!!");
       }
    }
    /**
@@ -476,7 +543,8 @@
     * @return
     */
    @Override
    public R pickTask(Long id) {
    @Transactional(rollbackFor = Exception.class)
    public R pickTask(Long id) throws Exception {
        Task task = this.getById(id);
        if (Objects.isNull(task)) {
            throw new CoolException("当前任务不存在!!");
@@ -491,22 +559,32 @@
            throw new CoolException("没有空库位!!");
        }
        List<LocItem> locItems = locItemService.list(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()));
        if (locItems.isEmpty()) {
            throw new CoolException("库位明细不存在!!");
        }
        String ruleCode = SerialRuleUtils.generateRuleCode(SerialRuleCode.SYS_TASK_CODE, task);
        //更新任务主单
        task.setTaskCode(ruleCode)
                .setTaskType(TaskType.TASK_TYPE_PICK_IN.type)
                .setTargLoc(task.getOrgLoc()) //出库源库位变入库目标库位
                .setBarcode(task.getBarcode())
                .setTaskStatus(TaskStsType.GENERATE_IN.id);
        if (!this.updateById(task)) {
            throw new CoolException("任务状态更新失败!!");
        }
        //修改库位状态 预约出库.R==>预约入库.S
        loc.setUseStatus(StaUseStatusType.TYPE_S.type);
        //TODO 后续需根据仓库类型查找新库位,原始库位置空闲状态
        List<LocItemWorking> workings = new ArrayList<>();
        for (LocItem item : locItems) {
            LocItemWorking working = new LocItemWorking();
            BeanUtils.copyProperties(item, working);
            working.setId(null).setTaskId(task.getId());
            workings.add(working);
        }
        if (!locService.updateById(loc)) {
            throw new CoolException("库位状态更新失败!!");
        if (!locItemWorkingService.saveBatch(workings)) {
            throw new CoolException("临时库存保存失败!!");
        }
        return R.ok("拣货成功!!");
@@ -518,8 +596,9 @@
     * @description: 完成出库任务,更新出库库存信息
     * @version 1.0
     */
    @Synchronized
    @Transactional(rollbackFor = Exception.class)
    public synchronized void complateOutStock(Task task) {
    public void complateOutStock(Task task) throws Exception {
        if (Objects.isNull(task)) {
            throw new CoolException("参数不能为空!!");
        }
@@ -537,9 +616,9 @@
        }
        try {
            //更新库位明细
            subtractLocItem(taskItems, loc);
            subtractLocItem(loc);
        } catch (Exception e) {
            throw new RuntimeException(e.getMessage());
            throw new CoolException(e.getMessage());
        }
        //添加出入库记录信息
@@ -630,7 +709,7 @@
     * @version 1.0
     */
    @Transactional(rollbackFor = Exception.class)
    public void subtractLocItem(List<TaskItem> items, Loc loc) throws Exception {
    public void subtractLocItem(Loc loc) throws Exception {
        if (!locItemService.remove(new LambdaQueryWrapper<LocItem>().eq(LocItem::getLocId, loc.getId()))) {
            throw new CoolException("库存明细删除失败!!");
        }
@@ -647,6 +726,16 @@
        if (Objects.isNull(task)) {
            return;
        }
        Loc loc = locService.getOne(new LambdaQueryWrapper<Loc>().eq(Loc::getCode, task.getTargLoc()));
        if (Objects.isNull(loc)) {
            throw new CoolException("目标库位不存在!");
        }
        if (!loc.getUseStatus().equals(LocStsType.LOC_STS_TYPE_S.type)) {
            throw new CoolException("当前库位状态不处于S.入库预约,不可执行入库操作!");
        }
        List<TaskItem> taskItems = taskItemService.list(new LambdaQueryWrapper<TaskItem>().eq(TaskItem::getTaskId, task.getId()));
        if (taskItems.isEmpty()) {
            throw new CoolException("任务明细不存在!!");
rsf-server/src/main/java/locItemWorking.sql
New file
@@ -0,0 +1,45 @@
-- save locItemWorking record
-- mysql
insert into `sys_menu` ( `name`, `parent_id`, `route`, `component`, `type`, `sort`, `tenant_id`, `status`) values ( 'menu.locItemWorking', '0', '/manager/locItemWorking', 'locItemWorking', '0' , '0', '1' , '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Query 容器管理', '', '1', 'manager:locItemWorking:list', '0', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Create 容器管理', '', '1', 'manager:locItemWorking:save', '1', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Update 容器管理', '', '1', 'manager:locItemWorking:update', '2', '1', '1');
insert into `sys_menu` ( `name`, `parent_id`, `type`, `authority`, `sort`, `tenant_id`, `status`) values ( 'Delete 容器管理', '', '1', 'manager:locItemWorking:remove', '3', '1', '1');
-- locale menu name
locItemWorking: 'LocItemWorking',
-- locale field
locItemWorking: {
    locId: "locId",
    locCode: "locCode",
    orderId: "orderId",
    type: "type",
    orderItemId: "orderItemId",
    wkType: "wkType",
    matnrId: "matnrId",
    maktx: "maktx",
    platItemId: "platItemId",
    platOrderCode: "platOrderCode",
    platWorkCode: "platWorkCode",
    projectCode: "projectCode",
    matnrCode: "matnrCode",
    trackCode: "trackCode",
    unit: "unit",
    anfme: "anfme",
    qty: "qty",
    workQty: "workQty",
    batch: "batch",
    splrBatch: "splrBatch",
    splrId: "splrId",
    spec: "spec",
    model: "model",
    fieldsIndex: "fieldsIndex",
},
-- ResourceContent
import locItemWorking from './locItemWorking';
case 'locItemWorking':
    return locItemWorking;
rsf-server/src/main/resources/mapper/manager/LocItemWorkingMapper.xml
New file
@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vincent.rsf.server.manager.mapper.LocItemWorkingMapper">
</mapper>