package com.zy.asrs.controller; import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.mapper.Wrapper; import com.core.annotations.ManagerAuth; import com.core.common.Cools; import com.core.common.R; import com.core.exception.CoolException; import com.zy.asrs.entity.*; import com.zy.asrs.entity.param.*; import com.zy.asrs.service.*; import com.zy.common.web.BaseController; import io.swagger.models.auth.In; import lombok.Synchronized; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import java.util.*; import java.util.stream.Collectors; /** * 移动端接口控制器 * Created by vincent on 2020/6/10 */ @RestController @RequestMapping("agvMobile") public class AgvMobileController extends BaseController { @Autowired private AgvMobileService agvMobileService; @Autowired private AgvBasDevpService agvBasDevpService; @Autowired private AgvWorkService workService; @Autowired private AgvLocMastService agvLocMastService; @Autowired private OrderDetlService orderDetlService; @Autowired private AgvLocDetlService agvLocDetlService; @Autowired private AgvWrkMastService agvWrkMastService; @Autowired private AgvWrkDetlService agvWrkDetlService; /* locno?组托+绑定暂存位 : 组托 */ @PostMapping("/comb/auth") public R comb(@RequestBody CombParam combParam){ agvMobileService.comb(combParam, getUserId()); return R.ok(); } // 再次拣料 @RequestMapping("/pick/again/auth") @ManagerAuth(memo = "再次拣料") public R pickAgain(@RequestBody PickParam pickParams){ agvMobileService.pickAgain(pickParams, 1l); return R.ok("拣料成功"); } /* 绑定货架条码与暂存位 */ @PostMapping("/combBinging/auth") public R combBinding(@RequestBody Map map){ String barcode = map.get("barcode").toString(); String stationCode = map.get("stationCode").toString(); Short containerType = Short.valueOf(barcode.substring(0,2)); agvMobileService.combBinding(barcode,stationCode,containerType); return R.ok("货架绑定站点成功"); } /* 获取当前已绑定的还没生成工作档的暂存位 */ @PostMapping("/getBasDevp/auth") public R getBasDevpByFloor(@RequestBody Map map){ String floor = map.get("floor").toString(); if("1".equals(floor) || "3".equals(floor)){ return R.ok(agvMobileService.getAgvBasDevpByFloor(Integer.parseInt(floor))); } return R.error("参数错误"); } /* 获取输送线站点 */ @PostMapping("/getBasDevp/noCacheShelves/auth") public R getBasDevpByNoCacheShelves(){ return R.ok(agvBasDevpService.getBasDevpByNoCacheShelves()); } /* 启动入库,生成工作档 */ @PostMapping("/pakin/auth") @Synchronized public R pakin(@RequestBody Map map){ List devNos = (List) map.get("devNo"); List agvBasDevpList = devNos.stream().map(devNo -> { return agvBasDevpService.selectById(devNo); }).collect(Collectors.toList()); workService.createWaitPainWrkMastStart(agvBasDevpList, getUserId(),false); return R.ok("生成工作档成功"); } /* 启动入库,组托 + 生产工作档 */ @PostMapping("/start/pakin/auth") @Synchronized @Transactional @ManagerAuth(memo = "启动入库") public R startPakin(@RequestBody AgvMobileStartPakin params){ // 组托 params.getCombParams().forEach(combParam -> { agvMobileService.comb(combParam,getUserId()); }); params.setContainerType(Short.valueOf(params.getContainerCode().substring(0,2))); workService.emptyPlateIn(params.getDevNo(),params.getContainerCode(),params.getContainerType(), getUserId(),false); return R.ok("生成工作档成功"); } /* 入库 */ @PostMapping("/pakin/empty/auth") @Synchronized @ManagerAuth(memo = "空板入库") public R pakinEmpty(@RequestBody AgvMobileStartParam params){ for (AgvMobileStartParam.Pda pda : params.getPad()) { pda.setContainerType(Short.valueOf(pda.getContainerCode().substring(0,2))); workService.emptyPlateIn(pda.getDevNo(),pda.getContainerCode(),pda.getContainerType(), getUserId(),false); } return R.ok(); } /* 空板出库 */ @PostMapping("/pakout/empty/auth") @Synchronized @ManagerAuth(memo = "空板出库") public R pakoutEmpty(@RequestBody AgvMobileStartParam params){ for (AgvMobileStartParam.Pda pda : params.getPad()) { workService.emptyPlateOut(pda.getDevNo(),pda.getContainerType(), getUserId()); } return R.ok(); } /* 空板出库货架码选择 */ @PostMapping("/pakout/empty/container/selector/auth") public R containerType(@RequestBody HashMap params){ String devNo = params.get("devNo"); AgvBasDevp agvBasDevp = agvBasDevpService.selectById(devNo); return R.ok(agvLocMastService.queryContainerTypeByLocType1(agvBasDevp.getLocType1())); } /* 查询库存 入库订单与销售单号 */ @PostMapping("/query/locDetl/v1") public R queryAgvLocDetl(@RequestBody HashMap params){ String orderNo = params.get("orderNo"); String threeCode = params.get("threeCode"); String matnr = params.get("matnr"); String floor = params.get("floor"); Wrapper wrapper = new EntityWrapper().eq("matnr", matnr); // wrapper.eq("orderNo",orderNo); wrapper = Cools.isEmpty(threeCode) ? wrapper.isNull("three_code") : wrapper.eq("three_code",threeCode); if (threeCode.substring(0,2).equals(30)) { wrapper.isNull("specs").or().eq("specs","").eq("floor",1); } List agvLocDetls = agvLocDetlService.selectList(wrapper); List locDetls = new ArrayList<>(); for (AgvLocDetl agvLocDetl : agvLocDetls) { AgvLocMast agvLocMast = new AgvLocMast(); if (Cools.isEmpty(floor)) { agvLocMast = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", agvLocDetl.getLocNo()).notLike("loc_no","F1")); } else { agvLocMast = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", agvLocDetl.getLocNo()).like("loc_no",floor)); } if (Cools.isEmpty(agvLocMast)) continue; agvLocDetl.setLocSts(agvLocMast.getLocSts()); agvLocDetl.setLocSts$(agvLocMast.getLocSts$()); locDetls.add(agvLocDetl); } return R.ok(locDetls); } /* 盘点接口 */ @PostMapping("/check/detl/v1") @ManagerAuth(memo = "库存盘点") @Synchronized public R checkLocDetl(@RequestBody HashMap param){ String locNo = param.get("locNo"); String containerCode = param.get("containerCode"); List listByLocNo = null; List listByContainerCode = null; if(!Cools.isEmpty(locNo)){ listByLocNo = agvLocDetlService.selectList(new EntityWrapper().eq("loc_no", locNo)); } if(!Cools.isEmpty(locNo)){ listByContainerCode = agvLocDetlService.selectList(new EntityWrapper().eq("supp_code", containerCode)); } Map result = new HashMap(); result.put("locNo",listByLocNo); result.put("containerCode",listByContainerCode); return R.ok(result); } /* 盘点库位错乱维护接口 */ @PostMapping("/update/detl/v1") @ManagerAuth(memo = "纠正库位") @Synchronized public R updateLocDetlLocNo(@RequestBody HashMap param){ String locNo = param.get("locNo"); String containerCode = param.get("containerCode"); if(Cools.isEmpty(locNo) || Cools.isEmpty(containerCode)){ return R.error("参数不全"); } List listByLocNo = null; List listByContainerCode = null; if(!Cools.isEmpty(locNo)){ // 源库位 listByLocNo = agvLocDetlService.selectList(new EntityWrapper().eq("loc_no", locNo)); } if(!Cools.isEmpty(locNo)){ // 目标库位 listByContainerCode = agvLocDetlService.selectList(new EntityWrapper().eq("supp_code", containerCode)); } AgvLocMast agvLocMastByContainerCode = agvLocMastService.selectOne(new EntityWrapper().eq("barcode", containerCode)); AgvLocMast agvLocMastByLocNo = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", locNo)); String barcode1 = agvLocMastByLocNo.getBarcode(); if((!Cools.eq("F",agvLocMastByContainerCode.getLocSts()) && !Cools.eq("D",agvLocMastByContainerCode.getLocSts())) || (!Cools.eq("F",agvLocMastByLocNo.getLocSts()) && !Cools.eq("D",agvLocMastByLocNo.getLocSts()))){ return R.error("库位状态不为F或者D,无法维护"); } // -------------1----------------------------- //库位信息为空 货架信息不为空 if(Cools.isEmpty(listByLocNo) && !Cools.isEmpty(listByContainerCode)){ //更新货架信息的库位为当前库位 listByContainerCode.forEach(agvLocDetl -> { String sourceLoc = agvLocDetl.getLocNo(); agvLocDetl.setLocNo(locNo); agvLocDetlService.updateLocNo(locNo,sourceLoc,agvLocDetl); }); agvLocMastByLocNo.setLocSts("F"); agvLocMastByLocNo.setBarcode(containerCode); agvLocMastService.updateById(agvLocMastByLocNo); if(!Cools.isEmpty(agvLocMastByContainerCode) && Cools.eq("F",agvLocMastByContainerCode.getLocSts())){ agvLocMastByContainerCode.setLocSts("D"); agvLocMastByContainerCode.setBarcode(barcode1); agvLocMastService.updateById(agvLocMastByContainerCode); } return R.ok("维护成功"); } // -------------2----------------------------- //库位信息不为空 货架信息为空 if(!Cools.isEmpty(listByLocNo) && Cools.isEmpty(listByContainerCode)){ String newLocNo = agvLocMastByContainerCode.getLocNo(); //更新货架信息的库位为当前库位 listByLocNo.forEach(agvLocDetl -> { String sourceLoc = agvLocDetl.getLocNo(); agvLocDetl.setLocNo(agvLocMastByContainerCode.getLocNo()); agvLocDetlService.updateLocNo(newLocNo,sourceLoc,agvLocDetl); }); agvLocMastByContainerCode.setLocSts("F"); agvLocMastByContainerCode.setBarcode(agvLocMastByLocNo.getBarcode()); agvLocMastService.updateById(agvLocMastByContainerCode); agvLocMastByLocNo.setLocSts("D"); agvLocMastByLocNo.setBarcode(containerCode); agvLocMastService.updateById(agvLocMastByLocNo); return R.ok("维护成功"); } if((listByLocNo == null && listByContainerCode == null) || listByLocNo.equals(listByContainerCode)){ return R.ok("该库位与货架库存一致,无需维护"); } // --------------3---------------------------- String locNo1 = listByContainerCode.get(0).getLocNo(); listByContainerCode.forEach(agvLocDetl -> { String sourceLoc = agvLocDetl.getLocNo(); agvLocDetl.setLocNo(agvLocMastByLocNo.getLocNo()); agvLocDetlService.updateLocNo(locNo,sourceLoc,agvLocDetl); }); if (!Cools.isEmpty(listByLocNo)) { String suppCode = listByLocNo.get(0).getSuppCode(); List supp_codes = agvLocDetlService.selectList(new EntityWrapper().eq("supp_code", suppCode)); supp_codes.forEach(agvLocDetl -> { agvLocDetl.setLocNo(locNo1); agvLocDetlService.updateLocNo(locNo1,locNo,agvLocDetl); }); } // listByLocNo.forEach(agvLocDetl -> { // String sourceLoc = agvLocDetl.getLocNo(); // agvLocDetl.setLocNo(agvLocMastByContainerCode.getLocNo()); // agvLocDetlService.updateLocNo(sourceLoc,locNo,agvLocDetl); // }); agvLocMastByContainerCode.setBarcode(agvLocMastByLocNo.getBarcode()); agvLocMastService.updateById(agvLocMastByContainerCode); agvLocMastByLocNo.setBarcode(containerCode); agvLocMastService.updateById(agvLocMastByLocNo); return R.ok("维护成功"); } @PostMapping("/agv/v1/locMove") @Transactional @ManagerAuth(memo = "调拨单任务下发") @Synchronized public R agvLocMove(@RequestBody HashMap params){ String fl = String.valueOf(params.get("floor")); short floor =(short)Integer.parseInt(fl.substring(0, 1)); List> dbList = (List>) params.get("dbList"); params.get("dbList"); Object mT = params.get("moveType"); String moveType = ""; if (mT.equals("unAuto")) { moveType = "2"; } else { moveType = "1"; } for (HashMap map : dbList) { String locNo = map.get("locNo"); Wrapper wrapper = new EntityWrapper().eq("loc_no", locNo); AgvLocMast agvLocMast = agvLocMastService.selectOne(wrapper); agvLocMast.setLocType(moveType); agvLocMast.setLocType3(floor); agvLocMastService.update(agvLocMast,wrapper); // 同步调拨单 List agvLocDetls = agvLocDetlService.selectList(new EntityWrapper().eq("loc_no", locNo)); for (AgvLocDetl agvLocDetl : agvLocDetls) { // 更新订单 OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper().eq("order_no", "DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode())); orderDetl.setQty(orderDetl.getQty() + agvLocDetl.getAnfme()); if (!orderDetlService.update(orderDetl,new EntityWrapper().eq("order_no","DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode()))){ throw new CoolException("修改订单明细失败,请联系管理员"+agvLocDetl.getOrderNo()+agvLocDetl.getMatnr()); } } } return R.ok(); } @PostMapping("/agv/v2/locMove") @Transactional @ManagerAuth(memo = "调拨单任务下发") @Synchronized public R agvLocMove2(@RequestBody HashMap params){ Date now = new Date(); String fl = String.valueOf(params.get("floor")); Integer floor = Integer.parseInt(fl.substring(0, 1)); List> dbList = (List>) params.get("dbList"); params.get("dbList"); Object mT = params.get("moveType"); String moveType = ""; Integer ioType = 0; if (mT.equals("unAuto")) { moveType = "2"; ioType = 111; } else { moveType = "1"; ioType = 108; } for (HashMap map : dbList) { String locNo = map.get("locNo"); String barcode = map.get("suppCode"); AgvWrkMast source_loc_no = agvWrkMastService.selectOne(new EntityWrapper().eq("source_loc_no", locNo)); if (!Cools.isEmpty(source_loc_no)) { throw new CoolException("当前库位已生成任务!"); } AgvLocMast locMastS = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", locNo).eq("loc_sts","F")); if (Cools.isEmpty(locMastS)) { throw new CoolException("当前库位非在库状态!库位号="+locNo); } AgvWrkMast wrkMast = createWrkMast(ioType, 22L, locNo, "", barcode, now, getUserId(), 30,floor); // 同步调拨单 List agvLocDetls = agvLocDetlService.selectList(new EntityWrapper().eq("loc_no", locNo)); for (AgvLocDetl agvLocDetl : agvLocDetls) { AgvWrkDetl wrkDetl = new AgvWrkDetl(); wrkDetl.setWrkNo(wrkMast.getWrkNo()); wrkDetl.sync(agvLocDetl); wrkDetl.setSuppCode(agvLocDetl.getSuppCode()); wrkDetl.setIoTime(now); wrkDetl.setAppeUser(getUserId()); wrkDetl.setAppeTime(now); wrkDetl.setModiUser(getUserId()); wrkDetl.setModiTime(now); if (!agvWrkDetlService.insert(wrkDetl)) { throw new CoolException("保存工作明细失败"); } // 更新订单 OrderDetl orderDetl = orderDetlService.selectOne(new EntityWrapper().eq("order_no", "DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode())); orderDetl.setQty(orderDetl.getQty() + agvLocDetl.getAnfme()); if (!orderDetlService.update(orderDetl,new EntityWrapper().eq("order_no","DB" + agvLocDetl.getOrderNo()).eq("matnr", agvLocDetl.getMatnr()).eq("three_code",agvLocDetl.getThreeCode()))){ throw new CoolException("修改订单明细失败,请联系管理员"+agvLocDetl.getOrderNo()+agvLocDetl.getMatnr()); } } // 更新源库位 AgvLocMast locMast = agvLocMastService.selectOne(new EntityWrapper().eq("loc_no", locNo)); locMast.setLocSts("R"); agvLocMastService.updateById(locMast); } return R.ok(); } @PostMapping("/hand/control/locMove") @Transactional @ManagerAuth(memo = "手动库位转移") @Synchronized public R handControlLocMove(@RequestBody LocMoveParam param){ agvMobileService.handControlLocMove(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/allocationOut") @Transactional @ManagerAuth(memo = "调拨离场") @Synchronized public R allocationOut(@RequestBody AgvMobileStartPakin param){ agvMobileService.allocationOut(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/allocationIn") @Transactional @ManagerAuth(memo = "调拨进场") @Synchronized public R allocationIn(@RequestBody AgvMobileStartPakin param){ agvMobileService.allocationIn(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/empOut") @Transactional @ManagerAuth(memo = "空架离场") @Synchronized public R empOut(@RequestBody AgvMobileStartPakin param){ agvMobileService.empOut(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/empIn") @Transactional @ManagerAuth(memo = "空架进场") @Synchronized public R empIn(@RequestBody AgvMobileStartPakin param){ agvMobileService.empIn(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/doBack") @Transactional @ManagerAuth(memo = "站点回退") @Synchronized public R doBack(@RequestBody AgvMobileStartPakin param){ agvMobileService.doBack(param, getUserId()); return R.ok(); } @PostMapping("/hand/control/handBack") @Transactional @ManagerAuth(memo = "转手动回流") @Synchronized public R handBack(@RequestBody AgvMobileStartPakin param){ agvMobileService.handBack(param, getUserId()); return R.ok(); } public static void main(String[] args) { List agvLocDetls1 = new ArrayList<>(); List agvLocDetls2 = new ArrayList<>(); AgvLocDetl agvLocDetl1 = new AgvLocDetl(); agvLocDetl1.setLocNo("AA"); AgvLocDetl agvLocDetl2 = new AgvLocDetl(); agvLocDetl2.setLocNo("AA"); agvLocDetls1.add(agvLocDetl1); agvLocDetls2.add(agvLocDetl2); System.out.println(agvLocDetls1.equals(agvLocDetls2)); List agvLocDetls22 = null; System.out.println(agvLocDetls22.equals(agvLocDetls2)); } /* 生成工作档 */ private AgvWrkMast createWrkMast(int ioType, long wrkSts, String sourceLocNo, String locNo, String barcode, Date now, Long userId, int containerType,int floor){ AgvWrkMast wrkMast = new AgvWrkMast(); //工作状态 wrkMast.setWrkSts(wrkSts); //入出库类型 wrkMast.setIoType(ioType); wrkMast.setIoTime(now); //优先级 wrkMast.setIoPri(300.0); //源站点 wrkMast.setSourceLocNo(sourceLocNo); //目标站点 wrkMast.setLocNo(locNo); //货架编码 wrkMast.setBarcode(barcode); //货架类型 wrkMast.setWhsType(containerType); // 目标楼层 wrkMast.setCrnNo(floor); wrkMast.setAppeUser(userId); wrkMast.setAppeTime(now); wrkMast.setModiUser(userId); wrkMast.setModiTime(now); if (!agvWrkMastService.insertByIncrease(wrkMast)) { throw new CoolException("保存工作档失败"); } wrkMast = agvWrkMastService.selectOne(new EntityWrapper().eq("loc_no", locNo).eq("source_loc_no",sourceLocNo)); return wrkMast; } }