add: 新增mes对接接口,油漆线任务变动,废弃油漆线缓存区

This commit is contained in:
2023-06-27 09:35:09 +08:00
parent 7838d89ef7
commit cf74502043
24 changed files with 1572 additions and 468 deletions

View File

@@ -137,6 +137,11 @@ public class MaterialbaseServiceImpl implements MaterialbaseService {
Long currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
WQLObject wo = WQLObject.getWQLObject("md_me_materialbase");
JSONObject jsonObject = wo.query("material_code = '" + dto.getMaterial_code() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(jsonObject)) {
throw new BadRequestException("物料柜号不能重复");
}
dto.setMaterial_id(IdUtil.getSnowflake(1, 1).nextId());
dto.setCreate_id(currentUserId);
@@ -146,7 +151,6 @@ public class MaterialbaseServiceImpl implements MaterialbaseService {
dto.setUpdate_time(now);
dto.setCreate_time(now);
dto.setBase_unit_id(15);
WQLObject wo = WQLObject.getWQLObject("md_me_materialbase");
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
wo.insert(json);
}

View File

@@ -21,10 +21,7 @@ import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask;
import org.nl.wms.sch.tasks.sendEmpty.DpxwSendEmpVehicleTask;
import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask;
import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask;
import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask;
import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask;
import org.nl.wms.sch.tasks.sendMaterial.HtSendMaterialTask;
import org.nl.wms.sch.tasks.sendMaterial.YqxSendMaterialTask;
import org.nl.wms.sch.tasks.sendMaterial.*;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -171,7 +168,9 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
@Transactional(rollbackFor = Exception.class)
public JSONObject apply(JSONObject whereJson) {
String type = whereJson.getString("type");
String point_code = whereJson.getString("point_code");
String point_code = ObjectUtil.isNotEmpty(whereJson.getString("point_code"))
? whereJson.getString("point_code")
: whereJson.getString("device_code");
String vehicle_type = whereJson.getString("vehicle_type");
String vehicle_code = whereJson.getString("vehicle_code");
//载具数量
@@ -194,6 +193,8 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
* 8.豪凯自动线下料入库
* 9.碟盘限位送空盘到输送线
* 10.一楼货梯送料
* 11.新增包装输送线送料
* 12.新增包装输送线送料入库
*/
if (StrUtil.equals(type, "1")) {
// 1.共挤线申请空盘: 调用空托盘出库处理类创建任务
@@ -218,6 +219,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("qty", material_num); // 满料位
param.put("vehicle_type", vehicle_type);
param.put("vehicle_code", vehicle_code);
param.put("task_code", whereJson.getString("task_code"));
GjxSendMaterialTask taskBean = SpringContextHolder.getBean(GjxSendMaterialTask.class);
String task_id = taskBean.createTask(param); // 创建任务
@@ -240,6 +242,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("vehicle_type", vehicle_type);
param.put("vehicle_code", vehicle_code);
param.put("material_num", material_num);
param.put("task_code", whereJson.getString("task_code"));
// 创建任务
YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class);
String task_id = taskBean.createTask(param);
@@ -281,6 +284,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("vehicle_code", vehicle_code);
param.put("vehicle_type", vehicle_type);
param.put("qty", material_num);
param.put("task_code", whereJson.getString("task_code"));
HkxSendMaterialTask taskBean = SpringContextHolder.getBean(HkxSendMaterialTask.class);
String task_id = taskBean.createTask(param);
@@ -300,6 +304,22 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("task_id", whereJson.getString("task_id"));
HtSendMaterialTask taskBean = SpringContextHolder.getBean(HtSendMaterialTask.class);
String task_id = taskBean.createTask(param);
} else if (StrUtil.equals(type, "11")) {
// 11.新增包装输送线送料
JSONObject param = new JSONObject();
param.put("point_code1", point_code);
param.put("vehicle_type", vehicle_type);
param.put("qty", material_num);
param.put("material_id", whereJson.getString("material_id"));
BzssxSendMaterialTask taskBean = SpringContextHolder.getBean(BzssxSendMaterialTask.class);
String task_id = taskBean.createTask(param);
} else if (StrUtil.equals(type, "12")) {
// 12.新增包装输送线送料入库
JSONObject param = new JSONObject();
param.put("point_code1", point_code);
param.put("task_id", whereJson.getString("task_id"));
BZXSendMaterialTask taskBean = SpringContextHolder.getBean(BZXSendMaterialTask .class);
String task_id = taskBean.createTask(param);
}
return null;
}

View File

@@ -23,22 +23,21 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Api(tags = "mes请求wms")
@RequestMapping("/api/to/wms")
@RequestMapping("/api")
@Slf4j
@SaIgnore
public class MesToWmsController {
private final MesToWmsService mesToWmsService;
@PostMapping("/workWorder")
@PostMapping("/workOrder")
@Log("mes下发工单")
@ApiOperation("mes下发工单")
@SaIgnore
public ResponseEntity<Object> issueWorkOrderForMes(@RequestBody JSONObject param) {
mesToWmsService.issueWorkOrderForMes(param);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
return new ResponseEntity<>(mesToWmsService.issueWorkOrderForMes(param), HttpStatus.OK);
}
@PostMapping("/workWorder/finish")
@PostMapping("/workOrder/finish")
@Log("mes获取工单反馈")
@ApiOperation("mes获取工单反馈")
@SaIgnore
@@ -54,11 +53,35 @@ public class MesToWmsController {
return new ResponseEntity<>(mesToWmsService.gjxAutomaticForMes(param), HttpStatus.OK);
}
@PostMapping("/yqxUp")
@Log("油漆线上料")
@ApiOperation("油漆线上料")
@SaIgnore
public ResponseEntity<Object> yqxAutomaticForMes(@RequestBody JSONObject param) {
return new ResponseEntity<>(mesToWmsService.yqxAutomaticForMes(param), HttpStatus.OK);
}
@PostMapping("/hkxDown")
@Log("豪凯自动线下料")
@ApiOperation("豪凯自动线下料")
@Log("1.5成品入库")
@ApiOperation("1.5成品入库")
@SaIgnore
public ResponseEntity<Object> hawKeAutomaticForMes(@RequestBody JSONObject param) {
return new ResponseEntity<>(mesToWmsService.hawKeAutomaticForMes(param), HttpStatus.OK);
}
@PostMapping("/finishMaterialOut")
@Log("1.5成品出库")
@ApiOperation("1.5成品出库")
@SaIgnore
public ResponseEntity<Object> finishMaterialOut(@RequestBody JSONObject param) {
return new ResponseEntity<>(mesToWmsService.finishMaterialOut(param), HttpStatus.OK);
}
@PostMapping("/releaseCpPointArea")
@Log("成品出库区域释放")
@ApiOperation("成品出库区域释放")
@SaIgnore
public ResponseEntity<Object> releaseCpPointArea(@RequestBody JSONObject param) {
return new ResponseEntity<>(mesToWmsService.releaseCpPointArea(param), HttpStatus.OK);
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.ext.mes.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
@@ -21,7 +22,7 @@ import org.springframework.web.bind.annotation.RestController;
@RestController
@RequiredArgsConstructor
@Api(tags = "wms请求mes")
@RequestMapping("/api/to/wms")
@RequestMapping("/api")
@Slf4j
@SaIgnore
public class WmsToMesController {
@@ -45,12 +46,12 @@ public class WmsToMesController {
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@PostMapping("/device")
@Log("从MES系统获取设备基础信息")
@ApiOperation("从MES系统获取设备基础信息")
@PostMapping("/task/feedback")
@Log("任务反馈")
@ApiOperation("任务反馈")
@SaIgnore
public ResponseEntity<Object> getDeviceInfoForMes() {
wmsToMesService.getDeviceInfoForMes();
public ResponseEntity<Object> taskFeedback(JSONObject param) {
wmsToMesService.taskFeedback(param);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
}

View File

@@ -12,11 +12,17 @@ public interface MesToWmsService {
/**
* mes下发工单
*/
void issueWorkOrderForMes(JSONObject param);
JSONObject issueWorkOrderForMes(JSONObject param);
JSONObject feedbackWorkOrderToMes(JSONObject param);
JSONObject hawKeAutomaticForMes(JSONObject param);
JSONObject gjxAutomaticForMes(JSONObject param);
JSONObject yqxAutomaticForMes(JSONObject param);
JSONObject finishMaterialOut(JSONObject param);
JSONObject releaseCpPointArea(JSONObject param);
}

View File

@@ -1,5 +1,7 @@
package org.nl.wms.ext.mes.service;
import com.alibaba.fastjson.JSONObject;
/**
* @Author: lyd
* @Description: wms对接mes的业务层
@@ -17,8 +19,5 @@ public interface WmsToMesService {
*/
void getUnitInfoForMes();
/**
* 设备
*/
void getDeviceInfoForMes();
void taskFeedback(JSONObject param);
}

View File

@@ -1,10 +1,28 @@
package org.nl.wms.ext.mes.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.basedata.service.MaterialbaseService;
import org.nl.wms.basedata.service.dto.MaterialbaseDto;
import org.nl.wms.ext.acs.service.AcsToWmsService;
import org.nl.wms.ext.mes.service.MesToWmsService;
import org.nl.wms.pdm.service.DeviceService;
import org.nl.wms.pdm.service.dto.DeviceDto;
import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask;
import org.nl.wms.sch.tasks.cpOut.CpOutTask;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
/**
* @Author: lyd
@@ -15,28 +33,126 @@ import org.springframework.stereotype.Service;
@RequiredArgsConstructor
@Slf4j
public class MesToWmsServiceImpl implements MesToWmsService {
private final AcsToWmsService acsToWmsService;
private final MaterialbaseService materialbaseService;
@Override
public void issueWorkOrderForMes(JSONObject param) {
//
@Transactional
public JSONObject issueWorkOrderForMes(JSONObject param) {
MDC.put("log_file_type", "MES下发工单");
log.info("mes传来工单信息" + param);
WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder");
WQLObject deviceTab = WQLObject.getWQLObject("pdm_bi_device");
if (ObjectUtil.isEmpty(param)) {
throw new BadRequestException("工单不能为空");
}
MaterialbaseDto materialCode = materialbaseService.findByCode(param.getString("material_code"));
JSONObject deviceCode = deviceTab.query("extend_code = '" + param.getString("device_code") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(deviceCode)) {
throw new BadRequestException("设备编码错误!");
}
param.put("workorder_id", IdUtil.getSnowflake(1,1).nextIdStr());
param.put("plan_qty", param.getString("qty"));
param.put("order_status", param.getString("workorder_status"));
param.put("material_id", materialCode.getMaterial_id());
param.put("device_id", deviceCode.getString("device_id"));
param.put("device_code", deviceCode.getString("device_code"));
param.put("produce_date", DateUtil.format(new Date(), "yyyy-MM-dd"));
param.put("create_id", "3");
param.put("create_name", "MES系统");
param.put("create_time", param.getString("create_time"));
workOrderTab.insert(param);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
MDC.remove("log_file_type");
return result;
}
@Override
public JSONObject feedbackWorkOrderToMes(JSONObject param) {
return null;
log.info("mes传来工单信息", param);
WQLObject workOrderTab = WQLObject.getWQLObject("pdm_bd_workorder");
if (ObjectUtil.isEmpty(param)) {
throw new BadRequestException("工单不能为空");
}
JSONObject jsonObject = workOrderTab
.query("workorder_code = '" + param.getString("workorder_code") + "'")
.uniqueResult(0);
jsonObject.put("order_status", param.getString("workorder_status"));
jsonObject.put("update_optid", "3");
jsonObject.put("update_optname", "MES系统");
jsonObject.put("update_time", DateUtil.now());
jsonObject.put("realproduceend_date", DateUtil.now());
workOrderTab.update(jsonObject);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
return result;
}
@Override
public JSONObject hawKeAutomaticForMes(JSONObject param) {
return null;
log.info("mes成品入库参数" + param);
param.put("type", "8");
acsToWmsService.apply(param);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
return result;
}
@Override
public JSONObject gjxAutomaticForMes(JSONObject param) {
log.info("mes供给线下料参数" + param);
param.put("type", "2");
acsToWmsService.apply(param);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
return result;
}
@Override
public JSONObject yqxAutomaticForMes(JSONObject param) {
log.info("mes油漆线上料参数" + param);
param.put("type", "4");
acsToWmsService.apply(param);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
return result;
}
@Override
public JSONObject finishMaterialOut(JSONObject param) {
// 创建任务
CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class);
taskBean.createTask(param);
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
return result;
}
@Override
public JSONObject releaseCpPointArea(JSONObject param) {
if (ObjectUtil.isEmpty(param) || ObjectUtil.isEmpty(param.getString("out_store_order"))) {
throw new BadRequestException("参数不能为空");
}
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
JSONObject entity = new JSONObject();
entity.put("point_status", "1");
entity.put("material_id", "");
entity.put("pcsn", "");
entity.put("ivt_qty", "0");
entity.put("instorage_time", "");
entity.put("vehicle_type", "");
entity.put("vehicle_code", "");
entity.put("update_time", DateUtil.now());
pointTab.update(entity, "region_code = 'CPCKQ01' and lock_type = '1'");
JSONObject result = new JSONObject();
result.put("status", 200);
result.put("message", "操作成功");
result.put("data", param);
return result;
}
}

View File

@@ -1,6 +1,7 @@
package org.nl.wms.ext.mes.service.impl;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.ext.mes.service.WmsToMesService;
@@ -31,9 +32,13 @@ public class WmsToMesServiceImpl implements WmsToMesService {
}
@Override
public void getDeviceInfoForMes() {
String url = http + "api/device";
String result = HttpUtil.post(url, "");
System.out.println(result);
public void taskFeedback(JSONObject param) {
String url = http + "api/task";
try {
// String result = HttpUtil.post(url, param);
} catch (Exception e) {
log.error("反馈MES异常");
}
}
}

View File

@@ -0,0 +1,55 @@
package org.nl.wms.pda.ssxsendmaterial.rest;
import cn.dev33.satoken.annotation.SaIgnore;
import com.alibaba.fastjson.JSONObject;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.logging.annotation.Log;
import org.nl.wms.pda.ssxsendmaterial.service.SSXSendMaterialService;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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;
/**
* @Author: lyd
* @Description: 包装输送线送料
* @Date: 2023/6/15
*/
@RestController
@RequiredArgsConstructor
@Api(tags = "手持送料")
@RequestMapping("api/pda/ssx/sendMaterial")
@Slf4j
public class SSXSendMaterialController {
private final SSXSendMaterialService sendMaterialService;
@PostMapping("/queryMaterial")
@Log("查询物料")
@ApiOperation("查询物料")
@SaIgnore
public ResponseEntity<Object> queryMaterial() {
return new ResponseEntity<>(sendMaterialService.queryMaterial(), HttpStatus.OK);
}
@PostMapping("/queryVehicle")
@Log("查询载具类型")
@ApiOperation("查询载具类型")
@SaIgnore
public ResponseEntity<Object> queryVehicle() {
return new ResponseEntity<>(sendMaterialService.queryVehicle(), HttpStatus.OK);
}
@PostMapping("/confirm")
@Log("送料确定")
@ApiOperation("送料确定")
@SaIgnore
public ResponseEntity<Object> confirm(@RequestBody JSONObject whereJson) {
return new ResponseEntity<>(sendMaterialService.confirm(whereJson), HttpStatus.OK);
}
}

View File

@@ -0,0 +1,16 @@
package org.nl.wms.pda.ssxsendmaterial.service;
import com.alibaba.fastjson.JSONObject;
/**
* @Author: lyd
* @Description:
* @Date: 2023/6/15
*/
public interface SSXSendMaterialService {
JSONObject queryMaterial();
JSONObject confirm(JSONObject whereJson);
JSONObject queryVehicle();
}

View File

@@ -0,0 +1,77 @@
package org.nl.wms.pda.ssxsendmaterial.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.AcsToWmsService;
import org.nl.wms.pda.ssxsendmaterial.service.SSXSendMaterialService;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @Author: lyd
* @Description: 输送线送料
* @Date: 2023/6/15
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class SSXSendMaterialServiceImpl implements SSXSendMaterialService {
private final AcsToWmsService acsToWmsService;
@Override
public JSONObject queryMaterial() {
JSONObject result = new JSONObject();
JSONArray mdMeMaterialbase = WQLObject.getWQLObject("md_me_materialbase").query("is_used = '1' and is_delete = '0'").getResultJSONArray(0);
result.put("result", mdMeMaterialbase);
result.put("code", "1");
result.put("desc", "查询成功");
return result;
}
@Override
@Transactional(rollbackFor = Exception.class)
public JSONObject confirm(JSONObject param) {
JSONObject result = new JSONObject();
String materialId = param.getString("material_id");
String vehicle_type = param.getString("value");
String qty = param.getString("qty");
if (ObjectUtil.isEmpty(materialId)) {
// 物料不能为空
throw new BadRequestException("物料不能为空");
}
// 执行创建任务并下发给acs: 1001 -> 1004
param.put("point_code", "BZSSX1001");
param.put("material_id", materialId);
param.put("vehicle_type", vehicle_type);
param.put("qty", qty);
param.put("type", "11");// 组盘信息task_id
// 2、调用接口
JSONObject json = acsToWmsService.apply(param);
if (ObjectUtil.isEmpty(json) || StrUtil.equals(json.getString("status"), "200")) {
result.put("result", "");
result.put("code", "1");
result.put("desc", "操作成功");
} else {
result.put("result", "");
result.put("code", "0");
result.put("desc", "操作失败:" + json.getString("message"));
}
return result;
}
@Override
public JSONObject queryVehicle() {
JSONObject result = new JSONObject();
WQLObject dictTab = WQLObject.getWQLObject("sys_dict_detail");
JSONArray dictSort = dictTab.query("name = 'vehicle_type' and value in ('4','5','6')", "dict_sort").getResultJSONArray(0);
result.put("result", dictSort);
result.put("code", "1");
result.put("desc", "操作成功");
return result;
}
}

View File

@@ -1,323 +1,323 @@
package org.nl.wms.sch.tasks.autoTask;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.util.IdUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: lyd
* @Description: 油漆线缓存区自动叫料
* @Date: 2023/2/25
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class YqxhcqCallMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = YqxhcqCallMaterialTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
/*
* 下发给ACS时需要特殊处理
*/
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
//养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)
String point_code = json.getString("point_code1");
if (ObjectUtil.isEmpty(point_code)) {
// 证明是等待点
point_code = json.getString("point_code3");
}
String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(newPoint)
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
.priority(json.getString("priority"))
.remark(json.getString("remark"))
.build();
acsTaskArr.add(dto);
}
return acsTaskArr;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
// 物料点
JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0);
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
throw new BadRequestException("已完成不能取消!");
}
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "已取消");
taskTab.update(taskObj);
if (ObjectUtil.isEmpty(material_point)) return;
// 点位解锁
material_point.put("lock_type", "1");
pointTab.update(material_point);
}
if ("1".equals(status)) {
// 更新任务状态为执行中
taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
}
if (StrUtil.equals(status, "2")) {
//完成后
// 物料点位解锁 并设置空位
material_point.put("lock_type", "1");
material_point.put("point_status", "1");
material_point.put("material_id", "");
material_point.put("vehicle_type", "");
material_point.put("vehicle_code", "");
pointTab.update(material_point);
// 油漆线缓存点位更新
JSONObject yqx_point = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0);
yqx_point.put("point_status", "3");
yqx_point.put("material_id", taskObj.getString("material_id"));
yqx_point.put("vehicle_type", taskObj.getString("vehicle_type"));
yqx_point.put("material_qty", taskObj.getString("material_qty"));
yqx_point.put("vehicle_qty", taskObj.getString("vehicle_qty"));
pointTab.update(yqx_point);
// 更改任务状态为完成
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("remark", "任务完成");
taskTab.update(taskObj);
if (ObjectUtil.isEmpty(material_point)) return;
//区域出入表【st_ivt_regionIO】
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
JSONObject regionIoObj = new JSONObject();
regionIoObj.put("iostorinv_id", IdUtil.getLongId());
regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE"));
regionIoObj.put("buss_date", DateUtil.today());
regionIoObj.put("io_type", "2");
regionIoObj.put("region_id", material_point.getString("region_id"));
regionIoObj.put("region_code", material_point.getString("region_code"));
regionIoObj.put("region_name", material_point.getString("region_name"));
regionIoObj.put("material_id", taskObj.getString("material_id"));
regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code"));
regionIoObj.put("qty", taskObj.getString("material_qty"));
regionIoObj.put("bill_status", "3");
regionIoObj.put("start_point_code", taskObj.getString("point_code1"));
regionIoObj.put("end_point_code", taskObj.getString("point_code2"));
regionIoObj.put("create_mode", "2");
regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd"));
regionIoObj.put("create_id", SecurityUtils.getCurrentUserId());
regionIoObj.put("create_name", SecurityUtils.getCurrentNickName());
regionIoObj.put("create_time", DateUtil.now());
regionIoTab.insert(regionIoObj);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public void autoCreate() {
// 自动叫料
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
// 找终点:四个缓存区按顺序获取一个
JSONObject endPoint = WQL.getWO("YQX_AUTOTASK").addParamMap(MapOf.of("flag","1")).process().uniqueResult(0);
if (ObjectUtil.isEmpty(endPoint)) return;
String point_code2 = endPoint.getString("point_code");
// 判断任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务");
// 判断工单
JSONObject workOrderObj = workOrderTab.query("device_code = '" + endPoint.getString("device_code") + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
// 创建任务
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_type("task_type")
.task_name("油漆线叫料")
.acs_task_type("2")//2楼AGV普通任务
.priority("7")
.task_status(TaskStatusEnum.SURE_END.getCode())
.point_code2(point_code2)
.vehicle_qty(1)
.material_info_id(workOrderObj.getLong("workorder_id"))
.material_id(workOrderObj.getLong("material_id"))
.vehicle_type(workOrderObj.getString("vehicle_type"))
.handle_class(THIS_CLASS)
.create_time(DateUtil.now())
.remark("任务创建成功")
.build();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void findStartPoint() {
// 到养生A区找起点根据物料、载具类型去查找均在工单中
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject taskObj = taskArr.getJSONObject(i);
String material_id = taskObj.getString("material_id");
String vehicle_type = taskObj.getString("vehicle_type");
JSONObject queryParam = new JSONObject();
queryParam.put("flag", "1");
queryParam.put("material_id", material_id);
queryParam.put("region_code", "YSQA01");
queryParam.put("vehicle_type", vehicle_type );
// 查找养生A区如果最后一个位置有货直接搬走如果没货就作为等待点。先让agv到达等待点
// 1、根据物料id查找养生A区物料点
JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0);
if (ObjectUtil.isNotEmpty(materialPoint)) {
// 2、判断是否在等待点如果不是先去等待点是直接搬运
// 2.1、获取当前快排列的等待点 row:排
JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01")
.addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"),
"row_num", materialPoint.getString("row_num"),
"region_code", "YSQA01")).process()
.uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线缓存区判断等待点异常!");
// 2.2、判断等待点
if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) {
// 获取等待点
JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " +
"AND row_num = '" + materialPoint.getString("row_num") + "' " +
"AND col_num = '" + waitPoint.getString("waitcol") + "' " +
"AND is_used = '1' " +
"AND is_delete = '0' " +
"AND lock_type = '1' " +
"AND region_code = 'YSQA01'").uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoints)) {
taskObj.put("remark", "等待点已被占用");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
// 等待点上锁
// waitPoints.put("lock_type", "2");
pointTab.update(waitPoints);
taskObj.put("point_code3", waitPoints.getString("point_code"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "3");
taskObj.put("remark", "等待点");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
// 是等待点直接搬走
// 物料点位上锁
materialPoint.put("lock_type", "2");
pointTab.update(materialPoint);
taskObj.put("point_code1", materialPoint.getString("point_code"));
taskObj.put("material_qty", materialPoint.getString("ivt_qty"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "2");
taskObj.put("remark", "等待点搬运物料");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
} else {
taskObj.put("remark", "养生A区无所需物料");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
}
}
}
@Override
public String createTask(JSONObject whereJson) {
return null;
}
@Override
public void forceFinish(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!");
this.updateTaskStatus(taskObj,"2");
}
@Override
public void cancel(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!");
this.updateTaskStatus(taskObj,"0");
}
@Override
@Transactional(rollbackFor = Exception.class)
public String againApply(String task_id) {
// 二次下发任务
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!");
JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!");
JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of(
"flag", "3", "material_id", hcTask.getString("material_id"),
"region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"),
"block_num", hcTask.getString("block_num"), "col_num", hcTask.getString("col_num")
)).process().uniqueResult(0);
if (ObjectUtil.isEmpty(materialPoint)) throw new BadRequestException("养生A区暂无所需物料!");
String pointCode = materialPoint.getString("point_code");
// 修改任务
hcTask.put("point_code1", pointCode);
hcTask.put("remark", "养生A区" + pointCode);
taskTab.update(hcTask);
// 锁住点位
materialPoint.put("lock_type", "2");
pointTab.update(materialPoint);
// 点位处理
//养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812
String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10);
return newPoint;
}
}
//package org.nl.wms.sch.tasks.autoTask;
//
//import cn.hutool.core.date.DateUtil;
//import cn.hutool.core.util.ObjectUtil;
//import cn.hutool.core.util.StrUtil;
//import com.alibaba.fastjson.JSON;
//import com.alibaba.fastjson.JSONArray;
//import com.alibaba.fastjson.JSONObject;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//import org.nl.config.MapOf;
//import org.nl.modules.common.exception.BadRequestException;
//import org.nl.modules.common.utils.SecurityUtils;
//import org.nl.modules.system.util.CodeUtil;
//import org.nl.modules.wql.WQL;
//import org.nl.modules.wql.core.bean.WQLObject;
//import org.nl.wms.sch.SchTaskDto;
//import org.nl.wms.sch.manage.AbstractAcsTask;
//import org.nl.wms.sch.manage.TaskStatusEnum;
//import org.nl.wms.sch.tasks.AcsTaskDto;
//import org.nl.wms.util.IdUtil;
//import org.springframework.stereotype.Service;
//import org.springframework.transaction.annotation.Transactional;
//
//import java.util.ArrayList;
//import java.util.List;
//
///**
// * @Author: lyd
// * @Description: 油漆线缓存区自动叫料
// * @Date: 2023/2/25
// */
//@Service
//@RequiredArgsConstructor
//@Slf4j
//public class YqxhcqCallMaterialTask extends AbstractAcsTask {
// private final String THIS_CLASS = YqxhcqCallMaterialTask.class.getName();
// @Override
// public List<AcsTaskDto> addTask() {
// /*
// * 下发给ACS时需要特殊处理
// */
// JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
//
// ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
// for (int i = 0; i < arr.size(); i++) {
// JSONObject json = arr.getJSONObject(i);
// //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)
// String point_code = json.getString("point_code1");
// if (ObjectUtil.isEmpty(point_code)) {
// // 证明是等待点
// point_code = json.getString("point_code3");
// }
// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10);
//
// AcsTaskDto dto = AcsTaskDto.builder()
// .task_id(json.getString("task_id"))
// .task_code(json.getString("task_code"))
// .task_type(json.getString("acs_task_type"))
// .start_device_code(newPoint)
// .next_device_code(json.getString("point_code2"))
// .vehicle_code(json.getString("vehicle_code"))
// .vehicle_type(json.getString("vehicle_type"))
// .priority(json.getString("priority"))
// .remark(json.getString("remark"))
// .build();
// acsTaskArr.add(dto);
// }
// return acsTaskArr;
// }
//
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void updateTaskStatus(JSONObject task, String status) {
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
//
// String task_id = task.getString("task_id");
// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
// // 物料点
// JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0);
// //任务取消
// if (StrUtil.equals(status, "0")) {
// // 取消删除任务
// if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
// throw new BadRequestException("已完成不能取消!");
// }
// taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
// taskObj.put("remark", "已取消");
// taskTab.update(taskObj);
//
// if (ObjectUtil.isEmpty(material_point)) return;
// // 点位解锁
// material_point.put("lock_type", "1");
// pointTab.update(material_point);
// }
//
// if ("1".equals(status)) {
// // 更新任务状态为执行中
// taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode());
// taskObj.put("update_time", DateUtil.now());
// taskObj.put("car_no", taskObj.getString("car_no"));
// taskTab.update(taskObj);
// }
//
// if (StrUtil.equals(status, "2")) {
// //完成后
// // 物料点位解锁 并设置空位
// material_point.put("lock_type", "1");
// material_point.put("point_status", "1");
// material_point.put("material_id", "");
// material_point.put("vehicle_type", "");
// material_point.put("vehicle_code", "");
// pointTab.update(material_point);
//
// // 油漆线缓存点位更新
// JSONObject yqx_point = pointTab.query("point_code = '" + taskObj.getString("point_code2") + "'").uniqueResult(0);
// yqx_point.put("point_status", "3");
// yqx_point.put("material_id", taskObj.getString("material_id"));
// yqx_point.put("vehicle_type", taskObj.getString("vehicle_type"));
// yqx_point.put("material_qty", taskObj.getString("material_qty"));
// yqx_point.put("vehicle_qty", taskObj.getString("vehicle_qty"));
// pointTab.update(yqx_point);
//
// // 更改任务状态为完成
// taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
// taskObj.put("update_time", DateUtil.now());
// taskObj.put("remark", "任务完成");
// taskTab.update(taskObj);
//
// if (ObjectUtil.isEmpty(material_point)) return;
//
// //区域出入表【st_ivt_regionIO】
// WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
// JSONObject regionIoObj = new JSONObject();
// regionIoObj.put("iostorinv_id", IdUtil.getLongId());
// regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE"));
// regionIoObj.put("buss_date", DateUtil.today());
// regionIoObj.put("io_type", "2");
// regionIoObj.put("region_id", material_point.getString("region_id"));
// regionIoObj.put("region_code", material_point.getString("region_code"));
// regionIoObj.put("region_name", material_point.getString("region_name"));
// regionIoObj.put("material_id", taskObj.getString("material_id"));
// regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code"));
// regionIoObj.put("qty", taskObj.getString("material_qty"));
// regionIoObj.put("bill_status", "3");
// regionIoObj.put("start_point_code", taskObj.getString("point_code1"));
// regionIoObj.put("end_point_code", taskObj.getString("point_code2"));
// regionIoObj.put("create_mode", "2");
// regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd"));
// regionIoObj.put("create_id", SecurityUtils.getCurrentUserId());
// regionIoObj.put("create_name", SecurityUtils.getCurrentNickName());
// regionIoObj.put("create_time", DateUtil.now());
// regionIoTab.insert(regionIoObj);
// }
// }
//
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void autoCreate() {
// // 自动叫料
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
// WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
// // 找终点:四个缓存区按顺序获取一个
// JSONObject endPoint = WQL.getWO("YQX_AUTOTASK").addParamMap(MapOf.of("flag","1")).process().uniqueResult(0);
// if (ObjectUtil.isEmpty(endPoint)) return;
// String point_code2 = endPoint.getString("point_code");
// // 判断任务
// JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
// if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务");
// // 判断工单
// JSONObject workOrderObj = workOrderTab.query("device_code = '" + endPoint.getString("device_code") + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
// if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
// // 创建任务
// SchTaskDto dto = SchTaskDto.builder()
// .task_id(IdUtil.getLongId())
// .task_code(CodeUtil.getNewCode("TASK_CODE"))
// .task_type("task_type")
// .task_name("油漆线叫料")
// .acs_task_type("2")//2楼AGV普通任务
// .priority("7")
// .task_status(TaskStatusEnum.SURE_END.getCode())
// .point_code2(point_code2)
// .vehicle_qty(1)
// .material_info_id(workOrderObj.getLong("workorder_id"))
// .material_id(workOrderObj.getLong("material_id"))
// .vehicle_type(workOrderObj.getString("vehicle_type"))
// .handle_class(THIS_CLASS)
// .create_time(DateUtil.now())
// .remark("任务创建成功")
// .build();
// JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
// taskTab.insert(json);
// }
//
// @Override
// @Transactional(rollbackFor = Exception.class)
// public void findStartPoint() {
// // 到养生A区找起点根据物料、载具类型去查找均在工单中
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
// JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0);
// for (int i = 0; i < taskArr.size(); i++) {
// JSONObject taskObj = taskArr.getJSONObject(i);
// String material_id = taskObj.getString("material_id");
// String vehicle_type = taskObj.getString("vehicle_type");
// JSONObject queryParam = new JSONObject();
// queryParam.put("flag", "1");
// queryParam.put("material_id", material_id);
// queryParam.put("region_code", "YSQA01");
// queryParam.put("vehicle_type", vehicle_type );
// // 查找养生A区如果最后一个位置有货直接搬走如果没货就作为等待点。先让agv到达等待点
// // 1、根据物料id查找养生A区物料点
// JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0);
// if (ObjectUtil.isNotEmpty(materialPoint)) {
// // 2、判断是否在等待点如果不是先去等待点是直接搬运
// // 2.1、获取当前快排列的等待点 row:排
// JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01")
// .addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"),
// "row_num", materialPoint.getString("row_num"),
// "region_code", "YSQA01")).process()
// .uniqueResult(0);
// if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线缓存区判断等待点异常!");
// // 2.2、判断等待点
// if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) {
// // 获取等待点
// JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " +
// "AND row_num = '" + materialPoint.getString("row_num") + "' " +
// "AND col_num = '" + waitPoint.getString("waitcol") + "' " +
// "AND is_used = '1' " +
// "AND is_delete = '0' " +
// "AND lock_type = '1' " +
// "AND region_code = 'YSQA01'").uniqueResult(0);
// if (ObjectUtil.isEmpty(waitPoints)) {
// taskObj.put("remark", "等待点已被占用");
// taskObj.put("update_time", DateUtil.now());
// taskTab.update(taskObj);
// continue;
// }
// // 等待点上锁
//// waitPoints.put("lock_type", "2");
// pointTab.update(waitPoints);
//
// taskObj.put("point_code3", waitPoints.getString("point_code"));
// taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
// taskObj.put("acs_task_type", "3");
// taskObj.put("remark", "等待点");
// taskObj.put("update_time", DateUtil.now());
// taskTab.update(taskObj);
// continue;
// }
// // 是等待点直接搬走
// // 物料点位上锁
// materialPoint.put("lock_type", "2");
// pointTab.update(materialPoint);
//
// taskObj.put("point_code1", materialPoint.getString("point_code"));
// taskObj.put("material_qty", materialPoint.getString("ivt_qty"));
// taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
// taskObj.put("acs_task_type", "2");
// taskObj.put("remark", "等待点搬运物料");
// taskObj.put("update_time", DateUtil.now());
// taskTab.update(taskObj);
// } else {
// taskObj.put("remark", "养生A区无所需物料");
// taskObj.put("update_time", DateUtil.now());
// taskTab.update(taskObj);
// }
//
// }
// }
//
// @Override
// public String createTask(JSONObject whereJson) {
// return null;
// }
//
// @Override
// public void forceFinish(String task_id) {
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
// if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!");
// this.updateTaskStatus(taskObj,"2");
// }
//
// @Override
// public void cancel(String task_id) {
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
// JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
// if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!");
// this.updateTaskStatus(taskObj,"0");
// }
//
// @Override
// @Transactional(rollbackFor = Exception.class)
// public String againApply(String task_id) {
// // 二次下发任务
// WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
// WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
// JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
// if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!");
// JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0);
// if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!");
// JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of(
// "flag", "3", "material_id", hcTask.getString("material_id"),
// "region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"),
// "block_num", hcTask.getString("block_num"), "col_num", hcTask.getString("col_num")
// )).process().uniqueResult(0);
// if (ObjectUtil.isEmpty(materialPoint)) throw new BadRequestException("养生A区暂无所需物料!");
// String pointCode = materialPoint.getString("point_code");
// // 修改任务
// hcTask.put("point_code1", pointCode);
// hcTask.put("remark", "养生A区" + pointCode);
// taskTab.update(hcTask);
// // 锁住点位
// materialPoint.put("lock_type", "2");
// pointTab.update(materialPoint);
// // 点位处理
// //养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812
// String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10);
// return newPoint;
// }
//}

View File

@@ -10,7 +10,6 @@ import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
@@ -38,7 +37,6 @@ import java.util.Map;
public class GjxCallEmpVehicleTask extends AbstractAcsTask {
private final String THIS_CLASS = GjxCallEmpVehicleTask.class.getName();
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject taskObj, String status) {
@@ -47,7 +45,6 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask {
String task_id = taskObj.getString("task_id");
JSONObject jsonTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
if (StrUtil.equals(status, "0")) {
/*
* 取消删除
@@ -61,6 +58,13 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask {
String point_code1 = jsonTask.getString("point_code1");
String point_code2 = jsonTask.getString("point_code2");
if (ObjectUtil.isEmpty(point_code1)) {
jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
return;
}
JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
// 终点在叠盘架
if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) {
@@ -117,7 +121,12 @@ public class GjxCallEmpVehicleTask extends AbstractAcsTask {
// 判断终点在哪里
String point_code1 = jsonTask.getString("point_code1");
String point_code2 = jsonTask.getString("point_code2");
if (ObjectUtil.isEmpty(point_code1)) {
jsonTask.put("task_status", TaskStatusEnum.FINISHED.getCode());
jsonTask.put("update_time", DateUtil.now());
taskTab.update(jsonTask);
return;
}
JSONObject jsonEnd = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
// 终点在叠盘架
if (StrUtil.equals(jsonEnd.getString("region_id"), RegionTypeEnum.DPJQB.getId())) {

View File

@@ -8,16 +8,20 @@ import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.config.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.mes.service.WmsToMesService;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.util.IdUtil;
import org.slf4j.MDC;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -34,10 +38,10 @@ import java.util.List;
public class YqxCallMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = YqxCallMaterialTask.class.getName();
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class);
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
@@ -45,6 +49,8 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
// 物料点
JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0);
JSONObject feedback = new JSONObject();
feedback.put("task_code", taskObj.getString("task_code"));
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
@@ -53,13 +59,11 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
}
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "已取消");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
// 点位解锁
if (ObjectUtil.isEmpty(material_point)) return;
// 点位解锁
material_point.put("lock_type", "1");
material_point.put("update_time", DateUtil.now());
pointTab.update(material_point);
}
@@ -69,15 +73,35 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode());
feedback.put("struct_code", taskObj.getString("point_code1"));
wmsToMesService.taskFeedback(feedback);
}
if (StrUtil.equals(status, "2")) {
//完成后
// 物料点位解锁 并设置空位
material_point.put("lock_type", "1");
material_point.put("point_status", "1");
material_point.put("material_id", "");
material_point.put("vehicle_type", "");
material_point.put("vehicle_code", "");
pointTab.update(material_point);
// 更改任务状态为完成
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("remark", "任务完成");
taskTab.update(taskObj);
// JSONObject requestObj = task.getJSONObject("request_param");
// 通知mes
feedback.put("task_status", TaskStatusEnum.FINISHED.getCode());
feedback.put("struct_code", taskObj.getString("point_code1"));
wmsToMesService.taskFeedback(feedback);
if (ObjectUtil.isEmpty(material_point)) return;
//区域出入表【st_ivt_regionIO】
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
@@ -101,26 +125,14 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
regionIoObj.put("create_name", SecurityUtils.getCurrentNickName());
regionIoObj.put("create_time", DateUtil.now());
regionIoTab.insert(regionIoObj);
//完成后
// 物料点位解锁 并设置空位
if (ObjectUtil.isEmpty(material_point)) return;
material_point.put("lock_type", "1");
material_point.put("point_status", "1");
material_point.put("material_id", "");
material_point.put("vehicle_type", "");
material_point.put("vehicle_code", "");
material_point.put("update_time", DateUtil.now());
pointTab.update(material_point);
}
}
@Override
public void findStartPoint() {
/*
* 根据业务找对应的起点
*/
MDC.put("log_file_type", "YqxCallMaterial");
// 到养生A区找起点根据物料、载具类型去查找均在工单中
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0);
@@ -128,28 +140,76 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
JSONObject taskObj = taskArr.getJSONObject(i);
String material_id = taskObj.getString("material_id");
String vehicle_type = taskObj.getString("vehicle_type");
// 直接到缓存区获取物料
JSONObject material_point = pointTab.query("region_code = 'YQXHCQ' AND material_id = '" + material_id + "' " +
"AND vehicle_type = '" + vehicle_type + "' AND is_used = '1' AND lock_type = '1' AND is_delete = '0'", "point_code").uniqueResult(0);
if (ObjectUtil.isNotEmpty(material_point)) {
// 拿到点位
material_point.put("lock_type", "2");
pointTab.update(material_point);
JSONObject queryParam = new JSONObject();
queryParam.put("flag", "1");
queryParam.put("material_id", material_id);
queryParam.put("region_code", "YSQA01");
queryParam.put("vehicle_type", vehicle_type );
// 查找养生A区如果最后一个位置有货直接搬走如果没货就作为等待点。先让agv到达等待点
// 1、根据物料id查找养生A区物料点
JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(queryParam).process().uniqueResult(0);
if (ObjectUtil.isNotEmpty(materialPoint)) {
// 2、判断是否在等待点如果不是先去等待点是就直接搬运
// 2.1、获取当前快排列的等待点 row:排
JSONObject waitPoint = WQL.getWO("QSCH_yqxCallMAterial_01")
.addParamMap(MapOf.of("flag", "2", "block_num", materialPoint.getString("block_num"),
"row_num", materialPoint.getString("row_num"),
"region_code", "YSQA01")).process()
.uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoint)) {
log.error("油漆线缓存区判断等待点异常!");
throw new BadRequestException("油漆线缓存区判断等待点异常!");
}
// 2.2、判断等待点
if (!waitPoint.getString("waitcol").equals(materialPoint.getString("col_num"))) {
// 获取等待点
JSONObject waitPoints = pointTab.query("block_num = '" + materialPoint.getString("block_num") + "' " +
"AND row_num = '" + materialPoint.getString("row_num") + "' " +
"AND col_num = '" + waitPoint.getString("waitcol") + "' " +
"AND is_used = '1' " +
"AND is_delete = '0' " +
"AND lock_type = '1' " +
"AND region_code = 'YSQA01'").uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoints)) {
log.info("等待点已被占用");
taskObj.put("remark", "等待点已被占用");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
// 等待点上锁
// waitPoints.put("lock_type", "2");
pointTab.update(waitPoints);
taskObj.put("point_code1", material_point.getString("point_code"));
taskObj.put("material_qty", material_point.getString("ivt_qty"));
taskObj.put("point_code3", waitPoints.getString("point_code"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "3");
taskObj.put("remark", "等待点");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
// 是等待点直接搬走
// 物料点位上锁
materialPoint.put("lock_type", "2");
pointTab.update(materialPoint);
log.info("等待点搬运物料");
taskObj.put("point_code1", materialPoint.getString("point_code"));
taskObj.put("material_qty", materialPoint.getString("ivt_qty"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "2");
taskObj.put("remark", "");
taskObj.put("remark", "等待点搬运物料");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
} else {
taskObj.put("remark", "油漆线缓存区无所需物料");
log.info("养生A区无所需物料");
taskObj.put("remark", "养生A区无所需物料");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
}
}
MDC.remove("log_file_type");
}
@Override
@@ -163,14 +223,18 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
//养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)
String point_code =json.getString("point_code1");
// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10);
String point_code = json.getString("point_code1");
if (ObjectUtil.isEmpty(point_code)) {
// 证明是等待点
point_code = json.getString("point_code3");
}
String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(point_code)
.start_device_code(newPoint)
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
@@ -185,7 +249,10 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
@Override
public String createTask(JSONObject whereJson) {
String point_code2 = whereJson.getString("point_code2");
String task_code = CodeUtil.getNewCode("TASK_CODE");
if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) {
task_code = whereJson.getString("task_code");
}
//生产工单表【PDM_BD_WorkOrder】
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
//任务表【SCH_BASE_Task】
@@ -201,7 +268,7 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_code(task_code)
.task_type("task_type")
.task_name("油漆线叫料")
.acs_task_type("2")//2楼AGV普通任务
@@ -239,4 +306,36 @@ public class YqxCallMaterialTask extends AbstractAcsTask {
if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!");
this.updateTaskStatus(taskObj,"0");
}
@Override
@Transactional(rollbackFor = Exception.class)
public String againApply(String task_id) {
// 二次下发任务
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
JSONObject hcTask = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(hcTask)) throw new BadRequestException("任务ID: " + task_id + "的任务不存在!");
JSONObject waitPoint = pointTab.query("point_code = '" + hcTask.getString("point_code3") + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(waitPoint)) throw new BadRequestException("油漆线二次下发等待点编码错误!");
JSONObject materialPoint = WQL.getWO("QSCH_yqxCallMAterial_01").addParamMap(MapOf.of(
"flag", "3", "material_id", hcTask.getString("material_id"),
"region_code", "YSQA01", "vehicle_type", hcTask.getString("vehicle_type"),
"block_num", waitPoint.getString("block_num"), "row_num", waitPoint.getString("row_num")
)).process().uniqueResult(0);
if (ObjectUtil.isEmpty(materialPoint)) {
throw new BadRequestException("养生A区暂无所需物料!"); // 此时车会停止
}
String pointCode = materialPoint.getString("point_code");
// 修改任务
hcTask.put("point_code1", pointCode);
hcTask.put("remark", "养生A区" + pointCode);
taskTab.update(hcTask);
// 锁住点位
materialPoint.put("lock_type", "2");
pointTab.update(materialPoint);
// 点位处理
//养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)2812
String newPoint = pointCode.substring(0, 4) + "2" + pointCode.substring(4, 10);
return newPoint;
}
}

View File

@@ -0,0 +1,242 @@
package org.nl.wms.sch.tasks.callMaterial;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.util.IdUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
*油漆线叫料
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class YqxCallMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = YqxCallMaterialTask.class.getName();
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
// 物料点
JSONObject material_point = pointTab.query("point_code = '" + taskObj.getString("point_code1") + "'").uniqueResult(0);
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
throw new BadRequestException("已完成不能取消!");
}
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "已取消");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
// 点位解锁
if (ObjectUtil.isEmpty(material_point)) return;
material_point.put("lock_type", "1");
material_point.put("update_time", DateUtil.now());
pointTab.update(material_point);
}
if ("1".equals(status)) {
// 更新任务状态为执行中
taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
}
if (StrUtil.equals(status, "2")) {
// 更改任务状态为完成
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
// JSONObject requestObj = task.getJSONObject("request_param");
//区域出入表【st_ivt_regionIO】
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
JSONObject regionIoObj = new JSONObject();
regionIoObj.put("iostorinv_id", IdUtil.getLongId());
regionIoObj.put("bill_code", CodeUtil.getNewCode("IN_STORE_CODE"));
regionIoObj.put("buss_date", DateUtil.today());
regionIoObj.put("io_type", "2");
regionIoObj.put("region_id", material_point.getString("region_id"));
regionIoObj.put("region_code", material_point.getString("region_code"));
regionIoObj.put("region_name", material_point.getString("region_name"));
regionIoObj.put("material_id", taskObj.getString("material_id"));
regionIoObj.put("vehicle_code", taskObj.getString("vehicle_code"));
regionIoObj.put("qty", taskObj.getString("material_qty"));
regionIoObj.put("bill_status", "3");
regionIoObj.put("start_point_code", taskObj.getString("point_code1"));
regionIoObj.put("end_point_code", taskObj.getString("point_code2"));
regionIoObj.put("create_mode", "2");
regionIoObj.put("pcsn", DateUtil.format(DateUtil.parse(DateUtil.today()), "yyyyMMdd"));
regionIoObj.put("create_id", SecurityUtils.getCurrentUserId());
regionIoObj.put("create_name", SecurityUtils.getCurrentNickName());
regionIoObj.put("create_time", DateUtil.now());
regionIoTab.insert(regionIoObj);
//完成后
// 物料点位解锁 并设置空位
if (ObjectUtil.isEmpty(material_point)) return;
material_point.put("lock_type", "1");
material_point.put("point_status", "1");
material_point.put("material_id", "");
material_point.put("vehicle_type", "");
material_point.put("vehicle_code", "");
material_point.put("update_time", DateUtil.now());
pointTab.update(material_point);
}
}
@Override
public void findStartPoint() {
/*
* 根据业务找对应的起点
*/
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task"); // 任务表
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point"); // 点位表
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject taskObj = taskArr.getJSONObject(i);
String material_id = taskObj.getString("material_id");
String vehicle_type = taskObj.getString("vehicle_type");
// 直接到缓存区获取物料
JSONObject material_point = pointTab.query("region_code = 'YQXHCQ' AND material_id = '" + material_id + "' " +
"AND vehicle_type = '" + vehicle_type + "' AND is_used = '1' AND lock_type = '1' AND is_delete = '0'", "point_code").uniqueResult(0);
if (ObjectUtil.isNotEmpty(material_point)) {
// 拿到点位
material_point.put("lock_type", "2");
pointTab.update(material_point);
taskObj.put("point_code1", material_point.getString("point_code"));
taskObj.put("material_qty", material_point.getString("ivt_qty"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("acs_task_type", "2");
taskObj.put("remark", "");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
} else {
taskObj.put("remark", "油漆线缓存区无所需物料");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
}
}
}
@Override
public List<AcsTaskDto> addTask() {
/*
* 下发给ACS时需要特殊处理
*/
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
//养生A区发给ACS需要新的点位(2101-03-1----->21011-03-1)
String point_code =json.getString("point_code1");
// String newPoint = point_code.substring(0, 4) + "2" + point_code.substring(4, 10);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(point_code)
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
.priority(json.getString("priority"))
.remark(json.getString("remark"))
.build();
acsTaskArr.add(dto);
}
return acsTaskArr;
}
@Override
public String createTask(JSONObject whereJson) {
String point_code2 = whereJson.getString("point_code2");
//生产工单表【PDM_BD_WorkOrder】
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
//任务表【SCH_BASE_Task】
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
//判断当前点是否有未完成的任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code2 = '" + point_code2 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code2 + "存在未完成的任务");
//点位基础表【SCH_BASE_Point】
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
String device_code = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0).getString("device_code");
JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_type("task_type")
.task_name("油漆线叫料")
.acs_task_type("2")//2楼AGV普通任务
.priority("8")
.task_status(TaskStatusEnum.SURE_END.getCode())
.point_code2(point_code2)
.material_info_id(workOrderObj.getLong("workorder_id"))
.material_id(workOrderObj.getLong("material_id"))
.vehicle_type(workOrderObj.getString("vehicle_type"))
.handle_class(THIS_CLASS)
.create_time(DateUtil.now())
.request_param(whereJson.toJSONString())
.build();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
//创建好立即下发
this.immediateNotifyAcs();
return String.valueOf(dto.getTask_id());
}
@Override
public void forceFinish(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("未找到该任务或者任务已完成!");
this.updateTaskStatus(taskObj,"2");
}
@Override
public void cancel(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isEmpty(taskObj)) throw new BadRequestException("任务已完成不能取消!");
this.updateTaskStatus(taskObj,"0");
}
}

View File

@@ -106,8 +106,8 @@
SCH_BASE_Point p
WHERE
p.is_used = '1'
AND is_delete = '0'
AND lock_type='1'
AND p.is_delete = '0'
AND p.lock_type='1'
OPTION 输入.material_id <> ""
p.material_id = 输入.material_id
ENDOPTION

View File

@@ -13,10 +13,13 @@ import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.mes.service.WmsToMesService;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.sch.tasks.utils.PointUpdateUtil;
import org.nl.wms.util.IdUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@@ -38,13 +41,15 @@ public class CpOutTask extends AbstractAcsTask {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class);
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
JSONObject requestParam = JSONObject.parseObject(taskObj.getString("request_param"));
JSONObject feedback = new JSONObject();
feedback.put("task_code", taskObj.getString("task_code"));
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
@@ -76,6 +81,10 @@ public class CpOutTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
}
if (StrUtil.equals(status, "2")) {
@@ -84,40 +93,32 @@ public class CpOutTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.FINISHED.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
// 任务表的点位1:成品库区点
String point_code1 = taskObj.getString("point_code1"); // 起点编码
JSONObject point1Obj = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0);// 起点
//table_fk_id = 单据id
JSONObject regionIoObject = regionIoTab.query("iostorinv_id = '" + taskObj.getString("table_fk_id") + "'").uniqueResult(0);
String point_code2 = taskObj.getString("point_code2"); // 终点编码:出库点位
JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);// 终点
// 修改区域出入库 - 起点点位解锁、点位状态更新 - 终点上锁、更新状态
//区域出入表【st_ivt_regionIO】
regionIoObject.put("end_point_code", point_code2);
regionIoObject.put("start_region_id", point1Obj.getString("region_id")); // 起点区域
regionIoObject.put("end_region_id", point2Obj.getString("region_id")); // 终点区域
regionIoObject.put("bill_status", "3"); // 单据状态
regionIoObject.put("task_id", task_id); // 任务id
regionIoObject.put("update_optid", SecurityUtils.getCurrentUserId());
regionIoObject.put("update_optname", SecurityUtils.getCurrentNickName());
regionIoObject.put("update_time", DateUtil.now());
regionIoTab.update(regionIoObject);
//完成后修改点位
// 点位解锁 并设置空位
// 货位点
point2Obj.put("lock_type", "2");
point2Obj.put("point_status", "3");
point2Obj.put("material_id", point1Obj.getString("material_id"));
point2Obj.put("pcsn", point1Obj.getString("pcsn"));
point2Obj.put("ivt_qty", point1Obj.getString("ivt_qty"));
point2Obj.put("instorage_time", point1Obj.getString("instorage_time"));
point2Obj.put("vehicle_type", point1Obj.getString("vehicle_type"));
point2Obj.put("vehicle_code", point1Obj.getString("vehicle_code"));
point2Obj.put("standing_time", point1Obj.getString("standing_time"));
if (ObjectUtil.isNotEmpty(point2Obj)) {
point2Obj.put("lock_type", "1");
point2Obj.put("point_status", "3");
point2Obj.put("material_id", point1Obj.getString("material_id"));
point2Obj.put("pcsn", requestParam.getString("out_store_order"));
point2Obj.put("ivt_qty", point1Obj.getString("ivt_qty"));
point2Obj.put("instorage_time", DateUtil.now());
point2Obj.put("vehicle_type", point1Obj.getString("vehicle_type"));
point2Obj.put("vehicle_code", point1Obj.getString("vehicle_code"));
point2Obj.put("update_time", DateUtil.now());
}
// 起点
point1Obj.put("lock_type", "1");
point1Obj.put("point_status", "1");
@@ -128,6 +129,7 @@ public class CpOutTask extends AbstractAcsTask {
point1Obj.put("vehicle_type", "");
point1Obj.put("vehicle_code", "");
point1Obj.put("standing_time", 0);
point1Obj.put("update_time", DateUtil.now());
pointTab.update(point1Obj);
pointTab.update(point2Obj);
@@ -145,11 +147,10 @@ public class CpOutTask extends AbstractAcsTask {
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '" + TaskStatusEnum.SURE_END.getCode() + "'").getResultJSONArray(0);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject taskObj = taskArr.getJSONObject(i);
String material_id = taskObj.getString("material_id");
JSONObject requestParam = JSONObject.parseObject(taskObj.getString("request_param"));
JSONObject param1 = new JSONObject();
param1.put("flag", "1");
param1.put("material_id", material_id);
param1.put("region_code", "CPCKQ01");
param1.put("region_code", requestParam.getString("end_area_code"));
//1、找空位的终点
JSONObject endPoint = WQL.getWO("QSCH_cpOut_01").addParamMap(param1).process().uniqueResult(0);
if (ObjectUtil.isNotEmpty(endPoint)) {
@@ -161,15 +162,14 @@ public class CpOutTask extends AbstractAcsTask {
//锁住终点
endPoint.put("task_id", taskObj.getString("task_id"));
taskObj.put("remark", "");
endPoint.put("lock_type", "2");
pointTab.update(endPoint);
} else {
taskObj.put("remark", "成品出库区无可用货位");
taskObj.put("update_time", DateUtil.now());
}
taskTab.update(taskObj);
}
}
@@ -202,19 +202,27 @@ public class CpOutTask extends AbstractAcsTask {
@Override
public String createTask(JSONObject whereJson) {
WQLObject pointTab = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
String point_code1 = whereJson.getString("point_code1"); // 起点
WQLObject materialTab = WQLObject.getWQLObject("md_me_materialbase");
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
String point_code1 = whereJson.getString("start_struct_code"); // 起点
String vehicle_code = whereJson.getString("vehicle_code");
String iostorinv_id = whereJson.getString("iostorinv_id");
String material_id = whereJson.getString("material_id");
JSONObject materialCode = materialTab.query("material_code = '" + whereJson.getString("material_code") + "'").uniqueResult(0);
String material_id = materialCode.getString("material_id");
String taskCode = CodeUtil.getNewCode("TASK_CODE");
if (ObjectUtil.isNotEmpty(whereJson.get("task_code"))) {
taskCode = whereJson.getString("task_code");
}
// 校验任务
//判断当前点是否有未完成的任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务");
JSONObject point = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0);
String vehicle_type = point.getString("vehicle_type");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_code(taskCode)
.task_type("task_type")
.task_name("成品区出库")
.task_status(TaskStatusEnum.SURE_END.getCode())
@@ -225,23 +233,10 @@ public class CpOutTask extends AbstractAcsTask {
.material_id(Long.valueOf(material_id))
.create_time(DateUtil.now())
.request_param(whereJson.toJSONString())
.table_name("st_ivt_regionIO")
.table_fk("iostorinv_id")
.table_fk_id(Long.valueOf(iostorinv_id))
.build();
//任务表【SCH_BASE_Task】
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
// 单据设置执行中
JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + iostorinv_id + "'").uniqueResult(0);
iostorinv.put("bill_status", "2");
iostorinv.put("update_optid", SecurityUtils.getCurrentUserId());
iostorinv.put("update_optname", SecurityUtils.getCurrentNickName());
iostorinv.put("update_time", DateUtil.now());
regionIoTab.update(iostorinv);
//创建好立即下发
this.immediateNotifyAcs();
return String.valueOf(dto.getTask_id());

View File

@@ -209,12 +209,6 @@ public class HtSendEmpVehicleTask extends AbstractAcsTask {
for (int i = 0; i < taskArr.size(); i++) {
JSONObject jsonTask = taskArr.getJSONObject(i);
String pointCode1 = jsonTask.getString("point_code1");
JSONObject jsonObject = pointTab.query("point_code = '" + pointCode1 + "'").uniqueResult(0);
if (jsonObject.getString("lock_type").equals("2")) { // 查看是否被锁住
jsonTask.put("remark", "货梯已被锁住!");
taskTab.update(jsonTask);
continue;
}
String point_code_ht = "";
// 查找组盘信息
JSONObject groupObj = groupTab.query("vehicle_code = '" + jsonTask.getString("vehicle_code") + "'").uniqueResult(0);

View File

@@ -0,0 +1,199 @@
package org.nl.wms.sch.tasks.sendMaterial;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.util.IdUtil;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: lyd
* @Description: 包装入库->成品区
* @Date: 2023/6/25
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class BZXSendMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = BZXSendMaterialTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(json.getString("point_code1"))
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
.priority(json.getString("priority"))
.remark(json.getString("remark"))
.build();
acsTaskArr.add(dto);
}
return acsTaskArr;
}
@Override
public void updateTaskStatus(JSONObject task, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
String point_code2 = taskObj.getString("point_code2");
JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
throw new BadRequestException("已完成不能取消!");
}
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "已取消");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
if (ObjectUtil.isEmpty(endPoint)) return;
endPoint.put("lock_type", "1");
endPoint.put("update_time", DateUtil.now());
pointTab.update(endPoint);
}
if ("1".equals(status)) {
// 更新任务状态为执行中
taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
}
if (StrUtil.equals(status, "2")) {
// 更改任务状态为完成
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("remark", "任务执行完成");
taskTab.update(taskObj);
if (ObjectUtil.isNotEmpty(endPoint)) {
// 终点解锁并赋值
endPoint.put("lock_type", "1");
endPoint.put("point_status", "3");
endPoint.put("material_id", taskObj.getString("material_id"));
endPoint.put("vehicle_type", taskObj.getString("vehicle_type"));
endPoint.put("update_time", DateUtil.now());
pointTab.update(endPoint);
}
}
}
@Override
public String createTask(JSONObject whereJson) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
String startPointCode = whereJson.getString("point_code1");
String taskId = whereJson.getString("task_id");
// 根据上个任务的载具类型寻找起点
JSONObject taskObj = taskTab.query("task_id = '" + taskId + "'").uniqueResult(0);
// 找起点
if (taskObj.getString("vehicle_type").equals("4")) {
// 1.3选择第一位
startPointCode = startPointCode + "01";
} else {
startPointCode = startPointCode + "02";
}
//判断当前点是否有未完成的任务
JSONObject taskEntity = taskTab.query("is_delete='0' and point_code1 = '" + startPointCode + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskEntity)) throw new BadRequestException("当前点位" + startPointCode + "存在未完成的任务");
// 创建任务
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_type("task_type")
.task_name("包装输送线入库")
.task_status(TaskStatusEnum.SURE_START.getCode())
.point_code1(startPointCode)
.acs_task_type("1")//1楼AGV普通任务
.material_qty(taskObj.getString("material_qty"))
.material_id(taskObj.getLong("material_id"))
.vehicle_type(taskObj.getString("vehicle_type"))
.handle_class(THIS_CLASS)
.create_time(DateUtil.now())
.request_param(whereJson.toJSONString())
.build();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
//创建好立即下发
this.immediateNotifyAcs();
return String.valueOf(dto.getTask_id());
}
@Override
public void findNextPoint() {
// 从立库中查找一个空位
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' " +
"and task_status = '2'").getResultJSONArray(0);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject taskObj = taskArr.getJSONObject(i);
JSONObject pointObj = pointTab.query("region_code = 'CPQYA01' AND is_delete = '0' " +
"AND is_used = '1' AND lock_type = '1' AND point_status = '1'").uniqueResult(0);
if (ObjectUtil.isEmpty(pointObj)) {
taskObj.put("remark", "暂无可用的点位!");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("remark", "");
taskObj.put("point_code2", pointObj.getString("point_code"));
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
//锁住相关货位
pointObj.put("lock_type", "2");
pointTab.update(pointObj);
}
}
@Override
public void forceFinish(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) {
this.updateTaskStatus(taskObj, "2");
} else {
throw new BadRequestException("任务已删除或者已完成!");
}
}
@Override
public void cancel(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) {
this.updateTaskStatus(taskObj, "0");
} else {
throw new BadRequestException("任务已完成不能取消!");
}
}
}

View File

@@ -0,0 +1,203 @@
package org.nl.wms.sch.tasks.sendMaterial;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.tasks.AcsTaskDto;
import org.nl.wms.util.IdUtil;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* @Author: lyd
* @Description: 包装输送线送料
* @Date: 2023/6/25
*/
@Service
@RequiredArgsConstructor
@Slf4j
public class BzssxSendMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = BzssxSendMaterialTask.class.getName();
@Override
public List<AcsTaskDto> addTask() {
JSONArray arr = WQLObject.getWQLObject("SCH_BASE_Task").query("handle_class = '" + THIS_CLASS + "' and task_status = '" + TaskStatusEnum.START_AND_POINT.getCode() + "' and is_delete ='0'").getResultJSONArray(0);
ArrayList<AcsTaskDto> acsTaskArr = new ArrayList<>();
for (int i = 0; i < arr.size(); i++) {
JSONObject json = arr.getJSONObject(i);
AcsTaskDto dto = AcsTaskDto.builder()
.task_id(json.getString("task_id"))
.task_code(json.getString("task_code"))
.task_type(json.getString("acs_task_type"))
.start_device_code(json.getString("point_code1"))
.next_device_code(json.getString("point_code2"))
.vehicle_code(json.getString("vehicle_code"))
.vehicle_type(json.getString("vehicle_type"))
.priority(json.getString("priority"))
.remark(json.getString("remark"))
.build();
acsTaskArr.add(dto);
}
return acsTaskArr;
}
@Override
public void updateTaskStatus(JSONObject task, String status) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
WQLObject materialtaskgroupTab = WQLObject.getWQLObject("md_pb_materialtaskgroup");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
String point_code2 = taskObj.getString("point_code2");
JSONObject endPoint = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
throw new BadRequestException("已完成不能取消!");
}
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "已取消");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
if (ObjectUtil.isEmpty(endPoint)) return;
endPoint.put("lock_type", "1");
endPoint.put("update_time", DateUtil.now());
pointTab.update(endPoint);
}
if ("1".equals(status)) {
// 更新任务状态为执行中
taskObj.put("task_status", TaskStatusEnum.EXECUTING.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
// 终点解锁
endPoint.put("lock_type", "1");
endPoint.put("update_time", DateUtil.now());
pointTab.update(endPoint);
}
if (StrUtil.equals(status, "2")) {
// 更改任务状态为完成
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("update_time", DateUtil.now());
taskObj.put("remark", "任务执行完成");
taskTab.update(taskObj);
if (ObjectUtil.isNotEmpty(endPoint)) {
// 组盘
JSONObject group = new JSONObject();
group.put("task_material_id", cn.hutool.core.util.IdUtil.getSnowflake(1,1).nextIdStr());
group.put("material_id", taskObj.getString("material_id"));
group.put("task_id", taskObj.getString("task_id"));
group.put("qty", taskObj.getString("material_qty"));
group.put("vehicle_type", taskObj.getString("vehicle_type"));
materialtaskgroupTab.insert(group);
}
}
}
@Override
public String createTask(JSONObject whereJson) {
String point_code1 = whereJson.getString("point_code1");
String vehicle_type = whereJson.getString("vehicle_type");
Long materialId = whereJson.getLong("material_id");
String qty = whereJson.getString("qty");
//任务表【SCH_BASE_Task】
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
//判断当前点是否有未完成的任务
JSONObject taskObj = taskTab.query("is_delete='0' and point_code1 = '" + point_code1 + "' and task_status <> '" + TaskStatusEnum.FINISHED.getCode() + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) throw new BadRequestException("当前点位" + point_code1 + "存在未完成的任务");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_type("task_type")
.task_name("进入包装线")
.task_status(TaskStatusEnum.SURE_START.getCode())
.point_code1(point_code1)
.acs_task_type("1")//1楼AGV普通任务
.material_qty(qty)
.material_id(materialId)
.vehicle_type(vehicle_type)
.handle_class(THIS_CLASS)
.create_time(DateUtil.now())
.request_param(whereJson.toJSONString())
.build();
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
taskTab.insert(json);
//创建好立即下发
this.immediateNotifyAcs();
return String.valueOf(dto.getTask_id());
}
@Override
@Transactional
public void findNextPoint() {
//判断共挤线是否有执行中的任务,如果任务数>=3,则不生成任务
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
JSONArray taskArr = taskTab.query("handle_class = '" + THIS_CLASS + "'and is_delete = '0' and task_status = '2'").getResultJSONArray(0);
for (int i = 0; i < taskArr.size(); i++) {
JSONObject taskObj = taskArr.getJSONObject(i);
// 找BZSSX04, 先查看是否锁住
JSONObject point = pointTab.query("point_code = 'BZSSX1005' AND lock_type = '1' AND is_used = '1' AND is_delete = '0'").uniqueResult(0);
if (ObjectUtil.isEmpty(point)) {
taskObj.put("remark", "暂无可用的点位!");
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
continue;
}
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskObj.put("remark", "");
taskObj.put("point_code2", point.getString("point_code"));
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
//锁住相关货位
point.put("lock_type", "2");
pointTab.update(point);
}
}
@Override
public void forceFinish(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status < " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) {
this.updateTaskStatus(taskObj, "2");
} else {
throw new BadRequestException("任务已删除或者已完成!");
}
}
@Override
public void cancel(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "' and is_delete = '0' and task_status <> " + TaskStatusEnum.FINISHED.getCode()).uniqueResult(0);
if (ObjectUtil.isNotEmpty(taskObj)) {
this.updateTaskStatus(taskObj, "0");
} else {
throw new BadRequestException("任务已完成不能取消!");
}
}
}

View File

@@ -13,6 +13,8 @@ import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.mes.service.WmsToMesService;
import org.nl.wms.log.LokiLogType;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
@@ -45,7 +47,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class);
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
WQLObject orderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
@@ -53,6 +55,8 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
String workOrderId = taskObj.getString("material_info_id");
JSONObject feedback = new JSONObject();
feedback.put("task_code", taskObj.getString("task_code"));
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
@@ -79,6 +83,10 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
}
if (StrUtil.equals(status, "2")) {
@@ -121,6 +129,11 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
taskObj.put("remark", "任务执行完成");
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.FINISHED.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
//区域出入表【st_ivt_regionIO】
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
JSONObject regionIoObj = new JSONObject();
@@ -163,11 +176,10 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
String task_id = taskObj.getString("task_id");
String material_id = taskObj.getString("material_id");
String vehicle_type = taskObj.getString("vehicle_type");
String workOrderId = taskObj.getString("material_info_id"); // 工单号
// 获取工单判断是去养生区还是货梯口
JSONObject workOrder = orderTab.query("workorder_id = '" + workOrderId + "'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrder)) throw new BadRequestException("工单不能为空");
if (workOrder.getString("workorder_type").equals("1")) { // 机采去货梯扣
JSONObject areaType = JSONObject.parseObject(taskObj.getString("request_param"));
if (ObjectUtil.isNotEmpty(areaType.getString("end_area_type"))
&& areaType.getString("end_area_type").equals("1")) { // 机采去货梯扣
// 更新点位
JSONArray ssxArray = WQL.getWO("QSCH_yqxSendMaterial_01").addParam("flag", "2").process().getResultJSONArray(0);
PointUpdateUtil.updatePoint(ssxArray);
@@ -316,8 +328,12 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
public String createTask(JSONObject whereJson) {
String point_code1 = whereJson.getString("point_code1");
String vehicle_code = whereJson.getString("vehicle_code");
String vehicle_type = whereJson.getString("vehicle_type");
String qty = whereJson.getString("qty");
String task_code = CodeUtil.getNewCode("TASK_CODE");
if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) {
task_code = whereJson.getString("task_code");
}
//生产工单表【PDM_BD_WorkOrder】
WQLObject workOrderTab = WQLObject.getWQLObject("PDM_BD_WorkOrder");
//点位基础表【SCH_BASE_Point】
@@ -331,14 +347,13 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
String device_code = pointTab.query("point_code = '" + point_code1 + "'").uniqueResult(0).getString("device_code");
JSONObject workOrderObj = workOrderTab.query("device_code = '" + device_code + "' and order_status = '3' and is_delete ='0'").uniqueResult(0);
if (ObjectUtil.isEmpty(workOrderObj)) throw new BadRequestException("该设备当前未生产或者已删除");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_code(task_code)
.task_type("task_type")
.task_name("共挤线满料")
.task_status(TaskStatusEnum.SURE_START.getCode())
@@ -348,7 +363,7 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
.material_qty(qty)
.material_info_id(workOrderObj.getLong("workorder_id"))
.material_id(workOrderObj.getLong("material_id"))
.vehicle_type(workOrderObj.getString("vehicle_type"))
.vehicle_type(vehicle_type)
.handle_class(THIS_CLASS)
.create_time(DateUtil.now())
.request_param(whereJson.toJSONString())
@@ -374,7 +389,6 @@ public class GjxSendMaterialTask extends AbstractAcsTask {
}
@Override
public void cancel(String task_id) {
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");

View File

@@ -13,6 +13,8 @@ import org.nl.modules.common.utils.SecurityUtils;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.ext.mes.service.WmsToMesService;
import org.nl.wms.sch.SchTaskDto;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.nl.wms.sch.manage.TaskStatusEnum;
@@ -39,12 +41,14 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
@Override
@Transactional(rollbackFor = Exception.class)
public void updateTaskStatus(JSONObject task, String status) {
WmsToMesService wmsToMesService = SpringContextHolder.getBean(WmsToMesService.class);
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
JSONObject feedback = new JSONObject();
feedback.put("task_code", taskObj.getString("task_code"));
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
@@ -69,6 +73,10 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskObj.put("car_no", taskObj.getString("car_no"));
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.EXECUTING.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
}
if (StrUtil.equals(status, "2")) {
@@ -77,9 +85,14 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
taskObj.put("update_time", DateUtil.now());
taskTab.update(taskObj);
// 通知mes
feedback.put("task_status", TaskStatusEnum.FINISHED.getCode());
feedback.put("struct_code", taskObj.getString("point_code2"));
wmsToMesService.taskFeedback(feedback);
String point_code2 = taskObj.getString("point_code2");
JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject requestObj = task.getJSONObject("request_param");
JSONObject requestObj = JSONObject.parseObject(taskObj.getString("request_param"));
//工单标识
String workorder_id = requestObj.getString("material_info_id");
//生产工单表【PDM_BD_WorkOrder】
@@ -151,6 +164,7 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
taskTab.update(taskObj);
} else {
taskObj.put("update_time", DateUtil.now());
taskObj.put("remark", "");
taskObj.put("point_code2", endPoint.getString("point_code"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskTab.update(taskObj);
@@ -197,7 +211,10 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
String vehicle_type = whereJson.getString("vehicle_type");
String vehicle_code = whereJson.getString("vehicle_code");
String qty = whereJson.getString("qty");
String task_code = CodeUtil.getNewCode("TASK_CODE");
if (ObjectUtil.isNotEmpty(whereJson.getString("task_code"))) {
task_code = whereJson.getString("task_code");
}
//任务表【SCH_BASE_Task】
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
@@ -216,7 +233,7 @@ public class HkxSendMaterialTask extends AbstractAcsTask {
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_code(task_code)
.task_type("task_type")
.task_name("豪凯线满料")
.material_qty(qty)

View File

@@ -59,6 +59,16 @@ spring:
password: ${REDIS_PWD:}
#连接超时时间
timeout: 5000
redisson:
config: |
threads: 4
nettyThreads: 4
singleServerConfig:
connectionMinimumIdleSize: 8
connectionPoolSize: 8
address: redis://127.0.0.1:6379
idleConnectionTimeout: 10000
timeout: 3000
# 登录相关配置
login:
# 登录缓存
@@ -162,4 +172,4 @@ sa-token:
loki:
url: http://localhost:3100/loki/api/v1
systemName: lms
systemName: lms