自动化立体仓库 - WMS系统
zhou zhou
2025-12-25 418a73bcee019e078307a1c2c255235de33d20ca
src/main/java/com/zy/common/web/WcsController.java
@@ -8,20 +8,29 @@
import com.zy.asrs.entity.*;
import com.zy.asrs.entity.param.EmptyPlateOutParam;
import com.zy.asrs.entity.result.FindLocNoAttributeVo;
import com.zy.asrs.enums.LocAreaType;
import com.zy.asrs.enums.LocStsType;
import com.zy.asrs.enums.TaskIOType;
import com.zy.asrs.service.*;
import com.zy.common.CodeRes;
import com.zy.common.model.LocTypeDto;
import com.zy.common.model.StartupDto;
import com.zy.common.model.enums.WorkNoType;
import com.zy.common.service.CommonService;
import com.zy.common.web.param.GenerateAgvTaskParam;
import com.zy.common.web.param.SearchLocParam;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import static com.zy.asrs.enums.TaskIOType.EMPTY_IN;
/**
 * Created by vincent on 2020/10/30
@@ -49,6 +58,102 @@
    private RowLastnoService rowLastnoService;
    @Autowired
    private WorkService workService;
    @Autowired
    private TaskService taskService;
    @Autowired
    private TaskDetlService taskDetlService;
    @Autowired
    private BasAreasService basAreasService;
    @Autowired
    private LocCacheService locCacheService;
    @PostMapping("/generate/AgvTask/v1")
    @ResponseBody
    @Transactional(rollbackFor = Exception.class)
    public synchronized R generateAgvTask(@RequestBody GenerateAgvTaskParam param) {
        if (Cools.isEmpty(param.getStaNo(),param.getWrkNo())){
            return R.error("站点编号和工作号不能为空");
        }
        Task searchTask = taskService.selectOne(new EntityWrapper<Task>()
                .eq("source_sta_no", param.getStaNo())
        );
        if (!Cools.isEmpty(searchTask)){
            return R.error("任务已存在");
        }
        WrkMast wrkMast = wrkMastService.selectOne(new EntityWrapper<WrkMast>()
                .eq("wrk_no", param.getWrkNo())
                .eq("sta_no", param.getStaNo())
        );
        List<WrkDetl> wrkDetls = wrkDetlService.selectList(new EntityWrapper<WrkDetl>()
                .eq("wrk_no", param.getWrkNo())
        );
        if (Cools.isEmpty(wrkMast) || Cools.isEmpty(wrkDetls)){
            return R.error("工作关联任务或明细不存在");
        }
        BasAreas basAreas = basAreasService
                .selectOne(new EntityWrapper<BasAreas>().eq("whs_type_id", LocAreaType.LOC_AREA_TYPE_CK.type));
        LocCache locCache = locCacheService.selectOne(new EntityWrapper<LocCache>()
                .eq("area_id", basAreas.getId())
                .eq("frozen", 0)
                .eq("loc_sts", LocStsType.LOC_STS_TYPE_O.type)
                // .eq("loc_no", params.getTarSite())
                .orderAsc(Arrays.asList("loc_no"))
                .last("OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY"));
        // 获取工作号
        int workNo = commonService.getWorkNo(WorkNoType.PICK.type);
        // 保存工作档
        Task task = new Task();
        Date now = new Date();
        task.setWrkNo(workNo)
                .setIoTime(now)
                .setWrkSts(7L) // 工作状态:11.生成出库ID
                .setIoType(1) // 入出库状态: 1.入库
                .setTaskType("agv")
                .setIoPri(10D)
                .setLocNo(locCache.getLocNo()) // 目标库位
                .setFullPlt(wrkMast.getIoType().equals(TaskIOType.EMPTY_IN.type) ? "N" : "Y")// 满板:Y
                .setPicking("N") // 拣料
                .setExitMk("N")// 退出
                .setSourceStaNo(param.getStaNo().toString())
                .setEmptyMk(wrkMast.getIoType().equals(TaskIOType.EMPTY_IN.type) ? "Y" : "N")// 空板
                .setBarcode(wrkMast.getBarcode())// 托盘码
                .setLinkMis("N")
                .setAppeTime(now)
                .setModiTime(now);
        if (!taskService.insert(task)) {
            throw new CoolException("保存工作档失败");
        }
        wrkDetls.forEach(wrkDetl -> {
            TaskDetl taskDetl = new TaskDetl();
            BeanUtils.copyProperties(wrkDetl, taskDetl);
            taskDetl.setTaskId(task.getId());
            taskDetl.setWrkNo(task.getWrkNo());
            taskDetl.setAppeTime(now);
            taskDetl.setModiTime(now);
            if (!taskDetlService.insert(taskDetl)) {
                throw new CoolException("保存AGV工作档明细失败");
            }
        });
        // 修改目标库位状态
        if (locCache.getLocSts().equals(LocStsType.LOC_STS_TYPE_O.type)) {
            locCache.setLocSts(LocStsType.LOC_STS_TYPE_S.type); // S.入库预约
            locCache.setModiTime(new Date());
            if (!locCacheService.updateById(locCache)) {
                throw new CoolException("更新目标库位状态失败");
            }
        } else {
            throw new CoolException("移转失败,目标库位状态:" + locCache.getLocSts$());
        }
        return R.ok();
    }
    @PostMapping("/pakin/loc/v1")
    @ResponseBody