This commit is contained in:
ldj_willow
2022-10-26 11:00:55 +08:00
23 changed files with 543 additions and 62 deletions

View File

@@ -17,7 +17,7 @@ import org.nl.wms.sch.manage.TaskStatusEnum;
import org.nl.wms.sch.service.TaskService;
import org.nl.wms.sch.tasks.callEmpty.GjxCallEmpVehicleTask;
import org.nl.wms.sch.tasks.callEmpty.YqxCallEmpVehicleTask;
import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterial;
import org.nl.wms.sch.tasks.callMaterial.YqxCallMaterialTask;
import org.nl.wms.sch.tasks.sendEmpty.HtSendEmpVehicleTask;
import org.nl.wms.sch.tasks.sendEmpty.YqxSendEmpVehicleTask;
import org.nl.wms.sch.tasks.sendMaterial.GjxSendMaterialTask;
@@ -234,7 +234,7 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
param.put("vehicle_type", vehicle_type);
param.put("vehicle_code", vehicle_code);
// 创建任务
YqxCallMaterial taskBean = SpringContextHolder.getBean(YqxCallMaterial.class);
YqxCallMaterialTask taskBean = SpringContextHolder.getBean(YqxCallMaterialTask.class);
String task_id = taskBean.createTask(param);
} else if (StrUtil.equals(type, "5")) {

View File

@@ -61,6 +61,9 @@ public class WorkorderDto implements Serializable {
/** 回传MES状态 */
private String passback_status;
/** 设备编码 */
private String device_code;
/** 外部标识 */
private String ext_id;

View File

@@ -113,6 +113,12 @@ public class WorkorderServiceImpl implements WorkordeService {
@Override
@Transactional(rollbackFor = Exception.class)
public void create(WorkorderDto dto) {
Long device_id = dto.getDevice_id();
if (ObjectUtil.isNotEmpty(device_id)) {
WQLObject deviceTab = WQLObject.getWQLObject("PDM_BI_Device");
JSONObject object = deviceTab.query("device_id = '" + device_id + "'").uniqueResult(0);
dto.setDevice_code(object.getString("device_code"));
}
Long currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
String now = DateUtil.now();
@@ -121,7 +127,6 @@ public class WorkorderServiceImpl implements WorkordeService {
String newCode = CodeUtil.getNewCode("PDM_SHIFTORDER");
dto.setWorkorder_id(IdUtil.getSnowflake(1, 1).nextId());
dto.setWorkorder_code(newCode);
dto.setOrder_status("1");
dto.setCreate_id(currentUserId);
dto.setCreate_time(now);
dto.setCreate_name(nickName);

View File

@@ -31,8 +31,8 @@ import java.util.List;
@Service
@RequiredArgsConstructor
@Slf4j
public class YqxCallMaterial extends AbstractAcsTask {
private final String THIS_CLASS = YqxCallMaterial.class.getName();
public class YqxCallMaterialTask extends AbstractAcsTask {
private final String THIS_CLASS = YqxCallMaterialTask.class.getName();
@Override
@@ -268,10 +268,6 @@ public class YqxCallMaterial extends AbstractAcsTask {
@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");
}
@Transactional(rollbackFor = Exception.class)

View File

@@ -0,0 +1,235 @@
package org.nl.wms.sch.tasks.cpOut;
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.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 CpOutTask extends AbstractAcsTask {
private final String THIS_CLASS = CpOutTask.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");
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
String task_id = task.getString("task_id");
JSONObject taskObj = taskTab.query("task_id = '" + task_id + "'").uniqueResult(0);
//任务取消
if (StrUtil.equals(status, "0")) {
// 取消删除任务
if (StrUtil.equals(taskObj.getString("task_status"), TaskStatusEnum.FINISHED.getCode())) {
throw new BadRequestException("已完成不能取消!");
}
String point_code2 = taskObj.getString("point_code2");
JSONObject point2Obj = pointTab.query("point_code = '" + point_code2 + "'").uniqueResult(0);
taskObj.put("task_status", TaskStatusEnum.FINISHED.getCode());
taskObj.put("remark", "任务已取消");
taskTab.update(taskObj);
// 释放终点点位
point2Obj.put("lock_type", "1");
point2Obj.put("point_status", "1");
pointTab.update(point2Obj);
}
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);
// 任务表的点位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
regionIoTab.update(regionIoObject);
//完成后将仓位库存删掉
//仓位库存表【ST_IVT_StructIvt】
WQLObject ivtTab = WQLObject.getWQLObject("ST_IVT_StructIvt");
ivtTab.delete("point_code = '" + taskObj.getString("point_code1") + "'");
// 点位解锁 并设置空位
point1Obj.put("lock_type", "1");
point1Obj.put("point_status", "1");
point2Obj.put("lock_type", "1");
point2Obj.put("point_status", "1");
pointTab.update(point1Obj);
pointTab.update(point2Obj);
}
}
@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 = '" + 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 param1 = new JSONObject();
param1.put("flag", "1");
param1.put("material_id", material_id);
param1.put("region_code", "CPCKQ01");
//1、找空位的终点
JSONObject endPoint = WQL.getWO("QSCH_cpOut_01").addParamMap(param1).process().uniqueResult(0);
if (ObjectUtil.isNotEmpty(endPoint)) {
// 找到终点,上锁
taskObj.put("update_time", DateUtil.now());
taskObj.put("point_code2", endPoint.getString("point_code"));
taskObj.put("task_status", TaskStatusEnum.START_AND_POINT.getCode());
taskTab.update(taskObj);
//锁住终点
endPoint.put("task_id", taskObj.getString("task_id"));
endPoint.put("lock_type", "2");
pointTab.update(endPoint);
} 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);
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_code3"))
.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) {
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
String point_code1 = whereJson.getString("point_code1"); // 起点
String vehicle_type = whereJson.getString("vehicle_type");
String vehicle_code = whereJson.getString("vehicle_code");
String iostorinv_id = whereJson.getString("iostorinv_id");
SchTaskDto dto = SchTaskDto.builder()
.task_id(IdUtil.getLongId())
.task_code(CodeUtil.getNewCode("TASK_CODE"))
.task_type("task_type")
.task_name("成品区出库")
.task_status(TaskStatusEnum.SURE_END.getCode())
.point_code1(point_code1)
.vehicle_code(vehicle_code)
.vehicle_type(vehicle_type)
.handle_class(THIS_CLASS)
.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");
regionIoTab.update(iostorinv);
//创建好立即下发
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.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");
}
}

View File

@@ -0,0 +1,59 @@
[交易说明]
交易名: 成品出库
所属模块:
功能简述:
版权所有:
表引用:
版本经历:
[数据库]
--指定数据库为空采用默认值默认为db.properties中列出的第一个库
[IO定义]
#################################################
## 表字段对应输入参数
#################################################
输入.flag TYPEAS s_string
输入.region_code TYPEAS s_string
[临时表]
--这边列出来的临时表就会在运行期动态创建
[临时变量]
--所有中间过程变量均可在此处定义
[业务过程]
##########################################
# 1、输入输出检查 #
##########################################
##########################################
# 2、主过程前处理 #
##########################################
##########################################
# 3、业务主过程 #
##########################################
IF 输入.flag = "1"
QUERY
SELECT
*
FROM
SCH_BASE_Point
WHERE
is_used = '1'
AND is_delete = '0'
AND lock_type = '1'
AND is_used = '1'
AND point_status = '1'
OPTION 输入.region_code <> ""
region_code = 输入.region_code
ENDOPTION
ORDER BY point_code
ENDSELECT
ENDQUERY
ENDIF

View File

@@ -1,5 +1,6 @@
package org.nl.wms.st.bill.rest;
import com.alibaba.fastjson.JSONArray;
import org.nl.wms.st.bill.service.RegionIoService;
import org.nl.wms.st.bill.service.dto.RegionIoDto;
import org.springframework.data.domain.Pageable;
@@ -60,4 +61,13 @@ public class RegionIoController {
regionioService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/makeTask")
@Log("生成任务")
@ApiOperation("生成任务")
//@SaCheckPermission("@el.check('regionio:add')")
public ResponseEntity<Object> makeTask(@RequestBody JSONArray dto){
regionioService.makeTask(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
}

View File

@@ -64,4 +64,9 @@ public interface RegionIoService {
*/
void deleteAll(Long[] ids);
/**
* 生成任务
* @param dto
*/
void makeTask(JSONArray dto);
}

View File

@@ -4,7 +4,10 @@ import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.util.SpringContextHolder;
import org.nl.wms.sch.service.RegionService;
import org.nl.wms.sch.tasks.cpOut.CpOutTask;
import org.nl.wms.sch.tasks.sendMaterial.HkxSendMaterialTask;
import org.nl.wms.st.bill.service.RegionIoService;
import org.nl.wms.st.bill.service.dto.RegionIoDto;
import org.springframework.stereotype.Service;
@@ -137,5 +140,28 @@ public class RegionIoServiceImpl implements RegionIoService {
}
}
/**
* 生成任务
*
* @param dto
*/
@Override
public void makeTask(JSONArray dto) {
WQLObject regionIoTab = WQLObject.getWQLObject("st_ivt_regionIO");
for (int i = 0; i < dto.size(); i++) {
JSONObject dtoJSONObject = dto.getJSONObject(i);
JSONObject iostorinv = regionIoTab.query("iostorinv_id = '" + dtoJSONObject.getString("iostorinv_id") + "'").uniqueResult(0);
if (ObjectUtil.equal(iostorinv.getString("bill_status"), "3")) continue; // 已完成的单据不在继续
JSONObject param = new JSONObject();
param.put("point_code1", dtoJSONObject.getString("start_point_code"));
param.put("vehicle_code", dtoJSONObject.getString("vehicle_code"));
// param.put("vehicle_type", vehicle_type);
param.put("iostorinv_id", dtoJSONObject.getString("iostorinv_id"));
CpOutTask taskBean = SpringContextHolder.getBean(CpOutTask.class);
String task_id = taskBean.createTask(param);
}
}
}

View File

@@ -53,7 +53,7 @@
WHERE
regionio.io_type = 输入.io_type
AND
start_region_id IN
region_id IN
(
SELECT region.region_id FROM sch_base_region region WHERE region.region_code IN 输入.io_region
)

View File

@@ -1,5 +1,6 @@
package org.nl.wms.st.structivt.rest;
import com.alibaba.fastjson.JSONArray;
import org.nl.wms.st.structivt.service.StructivtService;
import org.nl.wms.st.structivt.service.dto.StructivtDto;
import org.springframework.data.domain.Pageable;
@@ -62,5 +63,13 @@ public class StructivtController {
structivtService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
@PostMapping("/outInventory")
@Log("出库")
@ApiOperation("出库")
public ResponseEntity<Object> outInventory(@RequestBody JSONArray jsonArray){
structivtService.outInventory(jsonArray);
return new ResponseEntity<>(HttpStatus.CREATED);
}
}

View File

@@ -1,5 +1,6 @@
package org.nl.wms.st.structivt.service;
import com.alibaba.fastjson.JSONArray;
import org.nl.wms.st.structivt.service.dto.StructivtDto;
import org.springframework.data.domain.Pageable;
import java.util.Map;
@@ -61,5 +62,11 @@ public interface StructivtService {
* @param ids /
*/
void deleteAll(Long[] ids);
/**
* 出库
* @param jsonArray
*/
void outInventory(JSONArray jsonArray);
}

View File

@@ -3,6 +3,7 @@ package org.nl.wms.st.structivt.service.impl;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.modules.wql.WQL;
import org.nl.wms.sch.service.PointService;
import org.nl.wms.sch.service.RegionService;
@@ -42,7 +43,7 @@ public class StructivtServiceImpl implements StructivtService {
@Override
public Map<String,Object> queryAll(Map whereJson, Pageable page){
JSONObject map = new JSONObject();
JSONObject map = new JSONObject();
map.put("flag", "1");
map.put("region_code", "(" + whereJson.get("region_code") + ")");
if (!ObjectUtil.isNull(whereJson.get("point_code"))) {
@@ -227,4 +228,57 @@ public class StructivtServiceImpl implements StructivtService {
}
}
/**
* 出库
*
* @param jsonArray
*/
@Override
public void outInventory(JSONArray jsonArray) {
WQLObject structIvtTab = WQLObject.getWQLObject("ST_IVT_STRUCTIVT");
WQLObject regionIoTab = WQLObject.getWQLObject("ST_IVT_REGIONIO");
WQLObject pointTab = WQLObject.getWQLObject("sch_base_point");
WQLObject taskTab = WQLObject.getWQLObject("SCH_BASE_Task");
String in_store_code = CodeUtil.getNewCode("IN_STORE_CODE");
for (int i = 0; i < jsonArray.size(); i++) {
JSONObject structivts = jsonArray.getJSONObject(i);
// 如果是空位或者锁定就跳过
if (structivts.getString("lock_type").equals("2") || !structivts.getString("point_status").equals("3")) continue;
// 找到任務
JSONObject taskObj = taskTab.query("task_id = '" + structivts.getString("task_id") + "'").uniqueResult(0);
String end_point_code = taskObj.getString("point_code3");
if (ObjectUtil.isEmpty(end_point_code)) end_point_code = taskObj.getString("point_code2");
// 插入regionIO - 未锁定,有料位
JSONObject regionIoObj = new JSONObject();
regionIoObj.put("iostorinv_id", IdUtil.getSnowflake(1, 1).nextId());
regionIoObj.put("bill_code", in_store_code); // 批量新增相同
regionIoObj.put("buss_date", DateUtil.today());
regionIoObj.put("io_type", "2");
regionIoObj.put("material_id", structivts.getString("material_id"));
regionIoObj.put("pcsn", structivts.getString("pcsn"));
regionIoObj.put("vehicle_code", structivts.getString("vehicle_code"));
regionIoObj.put("qty", structivts.getString("ivt_qty"));
regionIoObj.put("qty_unit_id", structivts.getString("qty_unit_id"));
regionIoObj.put("bill_status", "1");
regionIoObj.put("start_point_code", structivts.getString("point_code")); // 起点
String start_region_id = pointTab.query("point_code = '" + structivts.getString("point_code") + "'").uniqueResult(0).getString("region_id");
if (ObjectUtil.isNotEmpty(start_region_id))
// regionIoObj.put("start_region_id", start_region_id);
regionIoObj.put("task_id", structivts.getString("task_id"));
regionIoObj.put("region_id", structivts.getString("region_id"));
regionIoObj.put("region_code", structivts.getString("region_code"));
regionIoObj.put("region_name", structivts.getString("region_name"));
regionIoObj.put("create_mode", "2");
regionIoObj.put("create_id", SecurityUtils.getCurrentUserId());
regionIoObj.put("create_name", SecurityUtils.getCurrentNickName());
regionIoObj.put("create_time", DateUtil.now());
regionIoTab.insert(regionIoObj);
// 上锁
JSONObject point = pointTab.query("point_id = '" + structivts.getString("point_id") + "'").uniqueResult(0);
point.put("lock_type", "2");
pointTab.update(point);
}
}
}

View File

@@ -21,6 +21,7 @@
输入.bill_code TYPEAS s_string
输入.bill_status TYPEAS s_string
输入.io_type TYPEAS s_string
输入.lock_type TYPEAS s_string
[临时表]
@@ -70,7 +71,7 @@
vehicle_type = 输入.vehicle_type
ENDOPTION
OPTION 输入.layer_num <> ""
layer_num = 输入.layer_num
cppoint.layer_num = 输入.layer_num
ENDOPTION
OPTION 输入.row_num <> ""
row_num = 输入.row_num
@@ -79,7 +80,7 @@
col_num = 输入.col_num
ENDOPTION
OPTION 输入.lock_type <> ""
YsaPoint.lock_type = 输入.lock_type
lock_type = 输入.lock_type
ENDOPTION
OPTION 输入.is_used <> ""
is_used = 输入.is_used