package com.zy.asrs.controller;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.core.annotations.AppAuth;
import com.core.common.Cools;
import com.core.common.R;
import com.zy.asrs.entity.AgvBasDevp;
import com.zy.asrs.entity.AgvWrkMast;
import com.zy.asrs.entity.WrkMastExecute;
import com.zy.asrs.entity.param.AgvTaskCallBackParam;
import com.zy.asrs.service.*;
import com.zy.asrs.utils.AppAuthUtil;
import com.zy.common.web.BaseController;
import lombok.Setter;
import lombok.extern.slf4j.Slf4j;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.PostConstruct;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Date;
import java.util.EnumSet;
import java.util.Map;
import static org.reflections.Reflections.log;
/**
* 上报事件类型(eventType):
* task:上报任务状态。
* task_allocated: 上报任务分配给机器人。
* tote_load:上报取箱状态。
* tote_unload:上报放箱状态。
* robot_reach:机器人到达工作站。
* weight:称重事件回调。
* rfid:RFID识别事件回调。
*
* 任务状态(status):
* success:成功。
* fail:失败。
* cancel:取消。
* suspend:挂起。
*/
@Slf4j
@RestController
@RequestMapping("/agv")
public class AgvOpenController extends BaseController {
private static final Logger log = LoggerFactory.getLogger(AgvMobileController.class);
@Autowired
AgvWrkMastService agvWrkMastService;
@Autowired
ApiLogService apiLogService;
@Autowired
private WrkMastExecuteService wrkMastExecuteService;
@Autowired
private AgvBasDevpService agvBasDevpService;
@PostMapping("/task/event/status")
@AppAuth(memo = "ESS任务回调")
public R taskEventStaus(@RequestBody AgvTaskCallBackParam param, HttpServletRequest request) {
//save api log (appkey 后续添加)
R r = new R(0, "成功");
AppAuthUtil.auth("", param, request);
int wrkNo = Integer.parseInt(param.getTaskCode());
if (wrkNo < 0) {
wrkNo = -wrkNo;
}
AgvWrkMast agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper().eq("wrk_no", wrkNo));
if (Cools.isEmpty(agvWrkMast)) {
agvWrkMast = agvWrkMastService.selectOne(new EntityWrapper().eq("barcode", param.getPodCode()));
if (Cools.isEmpty(agvWrkMast)) {
r = R.error("任务编号错误");
logPost(param, JSONObject.toJSONString(r), false);
return r;
}
}
try {
if (!Cools.isEmpty(agvWrkMast.getBarcode()) && !Cools.isEmpty(param.getPodCode())) {
if (!agvWrkMast.getBarcode().equals(param.getPodCode())) {
log.info("AGV回调的返回的托盘码和工作档托盘不一致,{}{}", agvWrkMast.getBarcode(), param.getPodCode());
}
}
} catch (Exception e) {
e.printStackTrace();
}
if (agvWrkMast.getIoType().equals(121)) {
try {
if (agvWrkMast.getWrkSts().equals(12L)) {
WrkMastExecute wrkMastExecute = wrkMastExecuteService.selectOne(new EntityWrapper().eq("wrk_no", wrkNo));
if (Cools.isEmpty(wrkMastExecute) || wrkMastExecute.getWrkSts() != 1) {
r = R.error("任务状态WrkSts参数有误,WrkSts:" + wrkMastExecute.getWrkSts$());
logPost(param, "任务状态WrkSts参数有误,WrkSts:" + wrkMastExecute.getWrkSts$() + JSONObject.toJSONString(r), false);
return r;
} else {
wrkMastExecute.setWrkSts(wrkMastExecute.getWrkStsCode());
wrkMastExecuteService.updateById(wrkMastExecute);
}
} else {
r = R.error("任务异常");
logPost(param, JSONObject.toJSONString(r), false);
return r;
}
} catch (Exception e) {
r = R.error("" + e.getMessage());
logPost(param, JSONObject.toJSONString(r), false);
return r;
}
} else {
if (agvWrkMast.getWrkSts() >= 205) {
r = R.error("当前任务已完成");
logPost(param, JSONObject.toJSONString(r), false);
return r;
}
AgvTask agvTask = AgvTask.valueOf(param.getMethod());
Class clz = AgvTask.class;
try {
Method method = clz.getDeclaredMethod("success", AgvWrkMast.class, AgvTaskCallBackParam.class);
method.invoke(agvTask, agvWrkMast, param);
} catch (NoSuchMethodException e) {
r = R.error("任务状态status参数有误");
logPost(param, JSONObject.toJSONString(r), false);
return r;
} catch (InvocationTargetException e) {
log.error(e.getMessage());
r = R.error("" + e.getMessage());
logPost(param, JSONObject.toJSONString(r), false);
return r;
} catch (IllegalAccessException e) {
log.error(e.getMessage());
r = R.error("" + e.getMessage());
logPost(param, JSONObject.toJSONString(r), false);
return r;
}
}
logPost(param, JSONObject.toJSONString(r), true);
return r;
}
@PostMapping("/conveyor/loadContainerFinish ")
@AppAuth(memo = "取货架完成通知")
public R loadContainerFinish(@RequestBody Map params) {
return R.ok();
}
private void logPost(AgvTaskCallBackParam param, String response, boolean success) {
apiLogService.save(
"ESS任务回调",
"/phyzwms/agv/task/event/status",
null,
null,
JSON.toJSONString(JSONObject.toJSONString(param)),
response,
success
);
}
}
enum AgvTask {
/**
* 上报任务完成
*/
end {
@Transactional
public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
//修改AGV工作档的工作状态为205.工作完成
agvWrkMast.setWrkSts(205L);
//出库任务 101.出库 || 103.拣料出库 || 107.盘点出库
if (agvWrkMast.getIoType() == 101 || agvWrkMast.getIoType() == 103 || agvWrkMast.getIoType() == 107) {
AgvBasDevp byDevNo = agvBasDevpService.getByDevNo(agvWrkMast.getLocNo());
if (byDevNo != null) {
log.info("出库任务进入站点===>>站点码:{},站点状态{}", byDevNo.getDevNo(), byDevNo.getLocSts());
//修改出库站点状态
agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue());
}
}
//出库任务 110.空板出库
if (agvWrkMast.getIoType() == 110) {
agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getLocNo(), "F", agvWrkMast.getBarcode(), agvWrkMast.getWhsType().shortValue());
agvWrkMast.setWrkSts(206L);
}
agvWrkMast.setModiTime(new Date());
agvWrkMastService.updateById(agvWrkMast);
}
},
/**
* 任务开始
*/
start {
@Transactional
public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
//修改AGV工作档的工作状态为203.任务开始
agvWrkMast.setWrkSts(203L);
agvWrkMast.setModiTime(new Date());
agvWrkMast.setPdcType(param.getRobotCode());
agvWrkMastService.updateById(agvWrkMast);
}
},
/**
* 走出储位状态
*/
outbin {
@Transactional
public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
switch (agvWrkMast.getIoType()) {
//入库任务
case 1:
// 空板入库
case 10:
// 拣料入库任务
case 53:
// 站点退回
case 58:
// 盘点再入库
case 57:
AgvBasDevp byDevNo = agvBasDevpService.getByDevNo(agvWrkMast.getSourceLocNo());
String locSts = "O";
if (byDevNo != null) {
assert log != null;
// if (!Cools.isEmpty(agvWrkMast.getBarcode())) {
// AgvBasDevp agvBasDevp = agvBasDevpService.selectOne(new EntityWrapper().eq("barcode", agvWrkMast.getBarcode()));
// if (!Cools.isEmpty(agvBasDevp) && agvBasDevp.getLocSts().equals("F") && !agvBasDevp.getDevNo().equals(byDevNo.getDevNo())) {
// agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvBasDevp.getDevNo(), locSts, "", null);
// }
// }
log.info("料架离开时当前站点状态:{},{}", byDevNo.getDevNo(), byDevNo.getLocSts());
if ("S".equals(byDevNo.getLocSts()) || "F".equals(byDevNo.getLocSts())) {
log.info("料架离开时当前站点状态保持不变1:{},{}", byDevNo.getDevNo(), byDevNo.getLocSts());
locSts = byDevNo.getLocSts();
agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), locSts, byDevNo.getBarcode(), null);
} else {
log.info("料架离开时当前站点状态保持不变2:{},{}", byDevNo.getDevNo(), byDevNo.getLocSts());
locSts = "O";
agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(), locSts, "", null);
}
}
break;
}
if (agvWrkMast.getIoType() == 108 || agvWrkMast.getIoType() == 114) {
//更新库存明细
agvLocDetlService.updateStock(agvWrkMast.getSourceLocNo(), agvWrkMast.getLocNo(), agvWrkMast.getAppeUser());
//修改源库位状态为O
agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0);
} else if (agvWrkMast.getIoType() == 109 && !agvWrkMast.getSourceLocNo().substring(0, 2).equals("DB")) {
//修改源库位状态为O
agvLocMastService.updateLocStsByLocNo(agvWrkMast.getSourceLocNo(), "O", "", agvWrkMast.getWhsType().shortValue(), "", (short) 0);
}
//if(agvWrkMast.getIoType() == 1 || agvWrkMast.getIoType() == 53 || agvWrkMast.getIoType() == 57 || agvWrkMast.getIoType() == 10){
// //修改源站点状态为O.空,以及解绑托盘条码
// agvBasDevpService.updateLocStsAndBarcodeByDevNo(agvWrkMast.getSourceLocNo(),"O","",null);
//}
//修改AGV工作档的工作状态为203.RCS放货中
agvWrkMastService.updateWrkStsByWrkNo(agvWrkMast.getWrkNo(), 204);
}
},
/**
* 上报放箱状态
*/
cancel {
@Transactional
public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
}
},
apply {
@Transactional
public void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param) {
}
};
//任务状态为成功
public abstract void success(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
// //任务状态为失败
// public abstract void fail(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
// //任务状态为取消
// public abstract void cancel(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
// //任务状态为挂起
// public abstract void suspend(AgvWrkMast agvWrkMast, AgvTaskCallBackParam param);
@Setter
AgvBasDevpService agvBasDevpService;
@Setter
AgvLocMastService agvLocMastService;
@Setter
AgvLocDetlService agvLocDetlService;
@Setter
AgvWrkMastService agvWrkMastService;
@Setter
AgvWrkDetlService agvWrkDetlService;
@Setter
AgvWaitPakinService agvWaitPakinService;
@Setter
AgvWaitPakinLogService agvWaitPakinLogService;
@Setter
AgvWrkMastLogService agvWrkMastLogService;
@Setter
AgvWrkDetlLogService agvWrkDetlLogService;
@Component
public static class ReportTypeServiceInjector {
@Autowired
AgvBasDevpService agvBasDevpService;
@Autowired
AgvLocMastService agvLocMastService;
@Autowired
AgvLocDetlService agvLocDetlService;
@Autowired
AgvWrkMastService agvWrkMastService;
@Autowired
AgvWrkDetlService agvWrkDetlService;
@Autowired
AgvWaitPakinService agvWaitPakinService;
@Autowired
AgvWaitPakinLogService agvWaitPakinLogService;
@Autowired
AgvWrkMastLogService agvWrkMastLogService;
@Autowired
AgvWrkDetlLogService agvWrkDetlLogService;
@PostConstruct
public void postConstruct() {
for (AgvTask task : EnumSet.allOf(AgvTask.class)) {
task.setAgvBasDevpService(agvBasDevpService);
task.setAgvLocDetlService(agvLocDetlService);
task.setAgvLocMastService(agvLocMastService);
task.setAgvWrkMastService(agvWrkMastService);
task.setAgvWaitPakinService(agvWaitPakinService);
task.setAgvWaitPakinLogService(agvWaitPakinLogService);
task.setAgvWrkMastLogService(agvWrkMastLogService);
task.setAgvWrkDetlLogService(agvWrkDetlLogService);
task.setAgvWrkDetlService(agvWrkDetlService);
}
}
}
public static void main(String[] args) {
try {
String s = null;
System.out.println(s.equals("1"));
}catch (Exception e){
}
}
}