Merge remote-tracking branch 'origin/master'

# Conflicts:
#	mes/hd/nladmin-system/src/main/java/org/nl/wms/pda/service/impl/CacheLineHandServiceImpl.java
This commit is contained in:
2023-03-24 11:39:12 +08:00
59 changed files with 1658 additions and 319 deletions

View File

@@ -2,6 +2,13 @@ package org.nl.common.enums;
import lombok.AllArgsConstructor;
import lombok.Getter;
import org.springframework.util.CollectionUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Locale;
import java.util.Optional;
import java.util.stream.Collectors;
/*
* @author ZZQ
@@ -13,28 +20,28 @@ import lombok.Getter;
public enum AcsTaskEnum {
UNDEFINED("0","未定义类型"),
//任务类型3个点任务编号无需载具
PRODUCT_MAC("1","专机-专机任务"),
TASK_PRODUCT_MAC("1","专机-专机任务"),
//3个点任务编号缓存线空载具列表
PRODUCT_CACHE("2","专机-缓存线任务"),
TASK_PRODUCT_CACHE("2","专机-缓存线任务"),
//3个点任务编号缓存线满料载具列表
CACHELINE_OUT("3","缓存线出库任务"),
TASK_CACHELINE_OUT("3","缓存线出库任务"),
//回调状态
ACS_RUNDING("1","运行中"),
ACS_FINISH("2","完成"),
ACS_CANNEL("3","完成"),
STATUS_START("1","开始取货"),
STATUS_RUNDING("2","放货中"),
STATUS_FINISH("3","完成"),
STATUS_CANNEL("4","取消"),
ACS_CALLTYPE_FULL("1","满料请求"),
ACS_CALLTYPE_EMP("2","缺料请求"),
REQUEST_CALLTYPE_FULL("1","满料请求"),
REQUEST_CALLTYPE_EMP("2","缺料请求"),
;
private String code;
private String desc;
public static AcsTaskEnum getType(String type){
for (AcsTaskEnum value : AcsTaskEnum.values()) {
if (value.getCode().equals(type)){
return value;
}
public static AcsTaskEnum getType(String type,String enumType){
Optional<AcsTaskEnum> first = Arrays.stream(AcsTaskEnum.values()).filter(a -> a.name().contains(enumType.toUpperCase(Locale.ROOT)) && a.getCode().equals(type)).findFirst();
if (first.isPresent()){
return first.get();
}
return AcsTaskEnum.UNDEFINED;
}

View File

@@ -24,7 +24,7 @@ public class CachelinePositionDto implements Serializable {
private BigDecimal positionOrder_no;
/** 缓存线编码 */
private String cacheLine_code;
private String cacheline_code;
/** 缓存线层数 */
private BigDecimal layer_num;

View File

@@ -0,0 +1,66 @@
package org.nl.wms.cacheline.region.rest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.anno.Log;
import org.nl.wms.cacheline.region.service.CachelineRegionRelationService;
import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.Map;
/**
* @author lyd
* @date 2023-03-24
**/
@RestController
@RequiredArgsConstructor
@Api(tags = "个缓存线区域关系管理")
@RequestMapping("/api/cachelineRegionRelation")
@Slf4j
public class CachelineRegionRelationController {
private final CachelineRegionRelationService cachelineRegionRelationService;
@GetMapping
@Log("查询个缓存线区域关系")
@ApiOperation("查询个缓存线区域关系")
//@PreAuthorize("@el.check('cachelineRegionRelation:list')")
public ResponseEntity<Object> query(@RequestParam Map whereJson, Pageable page){
return new ResponseEntity<>(cachelineRegionRelationService.queryAll(whereJson,page),HttpStatus.OK);
}
@PostMapping
@Log("新增个缓存线区域关系")
@ApiOperation("新增个缓存线区域关系")
//@PreAuthorize("@el.check('cachelineRegionRelation:add')")
public ResponseEntity<Object> create(@Validated @RequestBody CachelineRegionRelationDto dto){
cachelineRegionRelationService.create(dto);
return new ResponseEntity<>(HttpStatus.CREATED);
}
@PutMapping
@Log("修改个缓存线区域关系")
@ApiOperation("修改个缓存线区域关系")
//@PreAuthorize("@el.check('cachelineRegionRelation:edit')")
public ResponseEntity<Object> update(@Validated @RequestBody CachelineRegionRelationDto dto){
cachelineRegionRelationService.update(dto);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);
}
@Log("删除个缓存线区域关系")
@ApiOperation("删除个缓存线区域关系")
//@PreAuthorize("@el.check('cachelineRegionRelation:del')")
@DeleteMapping
public ResponseEntity<Object> delete(@RequestBody String[] ids) {
cachelineRegionRelationService.deleteAll(ids);
return new ResponseEntity<>(HttpStatus.OK);
}
}

View File

@@ -0,0 +1,64 @@
package org.nl.wms.cacheline.region.service;
import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto;
import org.springframework.data.domain.Pageable;
import java.util.Map;
import java.util.List;
/**
* @description 服务接口
* @author lyd
* @date 2023-03-24
**/
public interface CachelineRegionRelationService {
/**
* 查询数据分页
* @param whereJson 条件
* @param page 分页参数
* @return Map<String,Object>
*/
Map<String,Object> queryAll(Map whereJson, Pageable page);
/**
* 查询所有数据不分页
* @param whereJson 条件参数
* @return List<CachelineRegionRelationDto>
*/
List<CachelineRegionRelationDto> queryAll(Map whereJson);
/**
* 根据ID查询
* @param relation_id ID
* @return CachelineRegionRelation
*/
CachelineRegionRelationDto findById(String relation_id);
/**
* 根据编码查询
* @param code code
* @return CachelineRegionRelation
*/
CachelineRegionRelationDto findByCode(String code);
/**
* 创建
* @param dto /
*/
void create(CachelineRegionRelationDto dto);
/**
* 编辑
* @param dto /
*/
void update(CachelineRegionRelationDto dto);
/**
* 多选删除
* @param ids /
*/
void deleteAll(String[] ids);
}

View File

@@ -0,0 +1,49 @@
package org.nl.wms.cacheline.region.service.dto;
import lombok.Data;
import java.io.Serializable;
/**
* @author lyd
* @description /
* @date 2023-03-24
**/
@Data
public class CachelineRegionRelationDto implements Serializable {
/**
* 主键标识
*/
private String relation_id;
/**
* 区域编码
*/
private String region_code;
/**
* 缓存线编码
*/
private String cacheline_code;
/**
* 创建时间
*/
private String create_time;
/**
* 更新时间
*/
private String update_time;
/**
* 是否可用
*/
private String is_active;
/**
* 是否删除
*/
private String is_delete;
}

View File

@@ -0,0 +1,123 @@
package org.nl.wms.cacheline.region.service.impl;
import com.alibaba.fastjson.JSON;
import lombok.RequiredArgsConstructor;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.wql.core.bean.ResultBean;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.util.WqlUtil;
import org.nl.wms.cacheline.region.service.CachelineRegionRelationService;
import org.nl.wms.cacheline.region.service.dto.CachelineRegionRelationDto;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.data.domain.Pageable;
import java.util.List;
import java.util.Map;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.nl.common.utils.SecurityUtils;
import lombok.extern.slf4j.Slf4j;
import cn.hutool.core.util.ObjectUtil;
/**
* @description 服务实现
* @author lyd
* @date 2023-03-24
**/
@Service
@RequiredArgsConstructor
@Slf4j
public class CachelineRegionRelationServiceImpl implements CachelineRegionRelationService {
@Override
public Map<String,Object> queryAll(Map whereJson, Pageable page){
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
String where = "1 = 1";
if (ObjectUtil.isNotEmpty(whereJson.get("search"))){
String search = whereJson.get("search").toString();
where = "region_code like '%" + search + "%' " +
"OR cacheline_code like '%" + search + "%'";
}
ResultBean rb = wo.pagequery(WqlUtil.getHttpContext(page), where, "region_code, cacheline_code");
final JSONObject json = rb.pageResult();
return json;
}
@Override
public List<CachelineRegionRelationDto> queryAll(Map whereJson){
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
JSONArray arr = wo.query().getResultJSONArray(0);
if (ObjectUtil.isNotEmpty(arr)) return arr.toJavaList(CachelineRegionRelationDto.class);
return null;
}
@Override
public CachelineRegionRelationDto findById(String relation_id) {
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
JSONObject json = wo.query("relation_id = '" + relation_id + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(json)){
return json.toJavaObject( CachelineRegionRelationDto.class);
}
return null;
}
@Override
public CachelineRegionRelationDto findByCode(String code) {
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
JSONObject json = wo.query("code ='" + code + "'").uniqueResult(0);
if (ObjectUtil.isNotEmpty(json)){
return json.toJavaObject( CachelineRegionRelationDto.class);
}
return null;
}
@Override
@Transactional(rollbackFor = Exception.class)
public void create(CachelineRegionRelationDto dto) {
dto.setRelation_id(IdUtil.getSnowflake(1, 1).nextIdStr());
dto.setUpdate_time(DateUtil.now());
dto.setCreate_time(DateUtil.now());
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
wo.insert(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void update(CachelineRegionRelationDto dto) {
CachelineRegionRelationDto entity = this.findById(dto.getRelation_id());
if (entity == null) throw new BadRequestException("被删除或无权限,操作失败!");
dto.setUpdate_time(DateUtil.now());
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
JSONObject json = JSONObject.parseObject(JSON.toJSONString(dto));
wo.update(json);
}
@Override
@Transactional(rollbackFor = Exception.class)
public void deleteAll(String[] ids) {
String currentUserId = SecurityUtils.getCurrentUserId();
String nickName = SecurityUtils.getCurrentNickName();
WQLObject wo = WQLObject.getWQLObject("sch_cacheline_region_relation");
for (String relation_id: ids) {
JSONObject param = new JSONObject();
param.put("relation_id", String.valueOf(relation_id));
param.put("is_delete", "1");
param.put("update_optid", currentUserId);
param.put("update_optname", nickName);
param.put("update_time", DateUtil.now());
wo.update(param);
}
}
}

View File

@@ -44,9 +44,9 @@ public class AcsToWmsController {
return new ResponseEntity<>(acsToWmsService.receiveTaskStatusAcs(string), HttpStatus.OK);
}
// @PostMapping("/orderFinish")
// @Log("ACS给WMS下发工单完成状态")
// @ApiOperation("ACS给WMS下发工单完成状态")
@PostMapping("/orderFinish")
@Log("ACS给WMS下发工单完成状态")
@ApiOperation("ACS给WMS下发工单完成状态")
public ResponseEntity<Object> orderFinish(@RequestBody String string) {
return new ResponseEntity<>(acsToWmsService.orderFinish(string), HttpStatus.OK);
}

View File

@@ -38,14 +38,14 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
@Override
public Map<String, Object> apply(JSONObject jsonObject) {
Map result = MapOf.of("status", HttpStatus.OK.value(), "message", "ACS向WMS申请任务成功!");
//1.满料请求
//2.缺料请求
//1.专机设备满料请求
//2.专机设备缺料请求:专机,深坑
String type = jsonObject.getString("type");
try {
if (type.equals(AcsTaskEnum.ACS_CALLTYPE_FULL.getCode())){
if (type.equals(AcsTaskEnum.REQUEST_CALLTYPE_FULL.getCode())){
agvInstService.fullMaster(jsonObject);
}
if (type.equals(AcsTaskEnum.ACS_CALLTYPE_EMP.getCode())){
if (type.equals(AcsTaskEnum.REQUEST_CALLTYPE_EMP.getCode())){
agvInstService.callMatter(jsonObject);
}
}catch (Exception ex){
@@ -78,10 +78,10 @@ public class AcsToWmsServiceImpl implements AcsToWmsService {
String message = "";
String status = "";
if ("1".equals(acs_task_status)) {
status = AcsTaskEnum.ACS_RUNDING.getCode();
status = AcsTaskEnum.STATUS_RUNDING.getCode();
}
if ("2".equals(acs_task_status)) {
status = AcsTaskEnum.ACS_FINISH.getCode();
status = AcsTaskEnum.STATUS_FINISH.getCode();
}
// 任务处理类
try {

View File

@@ -1,34 +1,21 @@
package org.nl.wms.ext.acs.service.impl;
import cn.hutool.core.date.DateUtil;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.nl.common.ConstantParam;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.InterfaceLogType;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.IdUtil;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.service.RedisService;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.modules.wql.exception.WDKException;
import org.nl.utils.PointLockUtils;
import org.nl.wms.sch.tasks.PointToPointTask;
import org.nl.wms.sch.tasks.SpeMachineryTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.stream.Collectors;
/*
@@ -68,7 +55,7 @@ public class AgvInstService {
String needMove = order.getString("is_needmove");
String materialprocessSeries = order.getString("materialprocess_series");
String taskType = AcsTaskEnum.PRODUCT_MAC.getCode();
String taskType = AcsTaskEnum.TASK_PRODUCT_MAC.getCode();
if (StatusEnum.STATUS_TRUE.equals(needMove)){
JSONObject devicePoint = basePoint.query("point_code = '" + point_code + "' and is_delete = 0 and is_used = 1").uniqueResult(0);
JSONObject empPoint = WQL.getWO("sch_point").addParamMap(MapOf.of("flag", "2", "point_code", point_code, "point_type", StatusEnum.POINT_LOCATION_EMP.getCode())).process().uniqueResult(0);
@@ -100,11 +87,11 @@ public class AgvInstService {
if (StringUtils.isEmpty(cacheVehile)) {
throw new BadRequestException("缓存线:"+nextPoint+"没有可用空载具");
}
taskType = AcsTaskEnum.CACHELINE_OUT.getCode();
taskType = AcsTaskEnum.TASK_CACHELINE_OUT.getCode();
}
//生成任务nextPoint
PointToPointTask pointTask = new PointToPointTask();
SpeMachineryTask pointTask = new SpeMachineryTask();
JSONObject taskForm = new JSONObject(MapOf.of("start_device_code",point_code,
"next_device_code",nextPoint,"return_device_code", empPoint.getString("point_code"),"vehicle_code",
cacheVehile,"quantity", quantity,"product_area",devicePoint.getString("product_area"),"type",taskType));
@@ -143,10 +130,10 @@ public class AgvInstService {
if (StringUtils.isEmpty(cacheVehile)) {
throw new BadRequestException("缓存线:"+startPoint+"没有可用空载具");
}
PointToPointTask pointTask = new PointToPointTask();
SpeMachineryTask pointTask = new SpeMachineryTask();
JSONObject taskForm = new JSONObject(MapOf.of("start_device_code",startPoint,
"next_device_code",point_code,"return_device_code", startPoint,"vehicle_code",
cacheVehile,"product_area",devicePoint.getString("product_area"),"type",AcsTaskEnum.CACHELINE_OUT.getCode()));
cacheVehile,"product_area",devicePoint.getString("product_area"),"type",AcsTaskEnum.TASK_CACHELINE_OUT.getCode()));
String taskId = pointTask.createTask(taskForm);
log.info(OPT_NAME+"callMatter taskID:{}",taskId);
}

View File

@@ -13,6 +13,7 @@ import cn.hutool.poi.excel.ExcelUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
@@ -71,8 +72,10 @@ public class ProduceWorkorderServiceImpl implements ProduceWorkorderService {
String product_area = MapUtil.getStr(whereJson, "product_area");
String product_series = "";
// 员工只能看到自己创建的工单
String currentUsername = SecurityUtils.getCurrentUsername();
SysUser one = userService.getOne(new LambdaQueryWrapper<SysUser>().eq(SysUser::getUsername, currentUsername));
String currentUserId = "";
if (!SecurityUtils.getCurrentUsername().equals("admin")) currentUserId = SecurityUtils.getCurrentUserId();
if (!one.getIsAdmin()) currentUserId = SecurityUtils.getCurrentUserId();
JSONObject map = new JSONObject();
map.put("flag", "1");
//map.put("order_status", order_status);

View File

@@ -14,12 +14,11 @@ import org.nl.config.thread.ThreadPoolExecutorUtil;
import org.nl.modules.common.utils.RedisUtils;
import org.nl.modules.wql.WQL;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.ext.acs.service.impl.WmsToAcsServiceImpl;
import org.nl.wms.pda.dto.CachelineVehileMaterialDto;
import org.nl.wms.pda.dto.MaterialDto;
import org.nl.wms.pda.service.CacheLineHandService;
import org.nl.wms.sch.service.impl.TaskServiceImpl;
import org.nl.wms.sch.tasks.PointToPointTask;
import org.nl.wms.sch.tasks.SpeMachineryTask;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
@@ -28,7 +27,6 @@ import java.util.*;
import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.stream.Collectors;
/**
@@ -36,8 +34,6 @@ import java.util.stream.Collectors;
* 1、比如要N个空箱子或N个满料料箱。查询出来以后一个码都无法扫描出来这时候标记这些箱子为异常
* 2、箱码扫描不出来则用手持经过WMS中转传输给WCS最后给电器。
* 3、AGV搬运过程中异常非AGVERR,查询条件为设备、起始点等未完成的时候(有可能不是异常)。
*
* @author gbx
* @date 2023/3/22
*/
@Service
@@ -46,7 +42,6 @@ import java.util.stream.Collectors;
public class CacheLineHandServiceImpl implements CacheLineHandService{
private final RedisUtils redisUtils;
private final TaskServiceImpl taskServiceImp;
private final WmsToAcsServiceImpl wmsToAcsServiceImpl;
@Autowired
private LocalCache cache;
@@ -58,7 +53,6 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
@Override
public List<MaterialDto> materialQuery(String param) {
AtomicBoolean atomicBoolean = new AtomicBoolean(false);
// StopWatch stopWatch = new StopWatch();
// stopWatch.start();
// stopWatch.stop();
@@ -144,6 +138,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
@Override
public void instOperation(JSONObject param) {
String optType = param.getString("opt_type");
SpeMachineryTask SpeMachineryTask = new SpeMachineryTask();
WQLObject taskTab = WQLObject.getWQLObject("sch_base_task");
JSONObject taskObject = taskTab.query("task_id =" + param.getString("instruct_uuid")).uniqueResult(0);
//01-取消、02-完成、03-重发,根据操作类型执行相关操作
@@ -151,10 +146,7 @@ public class CacheLineHandServiceImpl implements CacheLineHandService{
updateTaskStatus(taskObject, optType);
}
if("03".equals(optType)) {
JSONArray taskArray = new JSONArray();
taskArray.add(taskObject);
//任务下发
wmsToAcsServiceImpl.issueTaskToAcs(taskArray);
SpeMachineryTask.createTask(taskObject);
}
}

View File

@@ -1,165 +0,0 @@
package org.nl.wms.sch.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.InterfaceLogType;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.springframework.http.HttpStatus;
import java.util.HashMap;
/**
* 普通点对点任务
*/
@Slf4j
public class PointToPointTask extends AbstractAcsTask {
private static String OPT_NAME = "ACS回调# ";
@Override
public void updateTaskStatus(JSONObject param,String status) {
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
log.info(InterfaceLogType.ACS_TO_LMS.getDesc());
//参数:
String taskId = param.getString("taskId");
String workprocedureCode = param.getString("workorder_code");
//入箱条码,出箱条码
String inboxtxm = param.getString("inboxtxm");
String outboxtxm = param.getString("outboxtxm");
// 指令执行中
JSONObject task = taskTable.query("task_id = '" + taskId + "'").uniqueResult(0);
String taskStatus = task.getString("task_status");
AcsTaskEnum taskTypeEnum = AcsTaskEnum.getType(task.getString("task_type"));
try {
if (AcsTaskEnum.ACS_RUNDING.getCode().equals(status)) {
if (!taskStatus.equals(StatusEnum.TASK_PUBLISH.getCode())){
log.error(OPT_NAME+"任务:{} 状态异常不是处于下发状态:{}",taskId,taskStatus);
}
// 更新指令为执行中
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+taskId+"'");
//如果是缓存线任务:释放缓存线对应载具
// 如果终点是缓存线,出箱的时候代表已经入了满料箱子
//根据任务类型确认更新
switch (taskTypeEnum){
case PRODUCT_MAC:
break;
case PRODUCT_CACHE:
//到缓存线说明需要出一个空箱号
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
case CACHELINE_OUT:
//到缓存线说明需要出满箱号
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
default:
log.error(OPT_NAME+"未定义任务类型:{}",task.getString("task_type"));
throw new BadRequestException(OPT_NAME+"未定义任务类型:"+task.getString("task_type"));
}
}
// 指令完成
if (AcsTaskEnum.ACS_FINISH.getCode().equals(status)) {
if (!taskStatus.equals(StatusEnum.TASK_RUNNING.getCode())) {
log.error(OPT_NAME + "任务:{} 状态异常不是处于运行中状态:{}", taskId, taskStatus);
}
switch (taskTypeEnum) {
case PRODUCT_MAC:case CACHELINE_OUT:
//到专机:更新设备上料位物料数量
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
case PRODUCT_CACHE:
cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"),
"material_id", task.getString("material_id"),
"vehicle_code", inboxtxm,
"vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(),
//工单,工序?
"workorder_code", workprocedureCode,
"create_time", DateUtil.now(),
"update_time", DateUtil.now()
//物料规格,物料名称 从物料信息表关联查询
));
break;
default:
log.error(OPT_NAME + "未定义任务类型:{}", task.getString("task_type"));
throw new BadRequestException(OPT_NAME + "未定义任务类型:" + task.getString("task_type"));
}
}
}catch (Exception ex){
log.error(OPT_NAME+"updateStatus error:{}",ex);
throw ex;
}
}
@Override
public String createTask(JSONObject form) {
String start_point_code = form.getString("start_point_code");
String next_point_code = form.getString("next_point_code");
String vehicle_code = form.getString("vehicle_code");
String type = form.getString("type");
if (StrUtil.isEmpty(start_point_code)) {
throw new BadRequestException("起点不能为空!");
}
if (StrUtil.isEmpty(next_point_code)) {
throw new BadRequestException("终点不能为空!");
}
if (StrUtil.isEmpty(vehicle_code)) {
throw new BadRequestException("载具不能为空!");
}
String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + "";
JSONObject task = new JSONObject();
task.put("taskdtl_id", taskdtl_id);
task.put("task_id", taskdtl_id);
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
task.put("task_type", type);
task.put("task_status", "01");
task.put("start_point_code", start_point_code);
task.put("next_point_code", next_point_code);
task.put("vehicle_code", vehicle_code);
task.put("handle_class", this.getClass().getName());
task.put("finished_type", "01");
task.put("is_delete", "0");
String currentUserId = SecurityUtils.getCurrentUserId();
task.put("create_id", currentUserId);
task.put("create_name", SecurityUtils.getCurrentNickName());
task.put("update_optid", currentUserId);
task.put("update_optname", SecurityUtils.getCurrentNickName());
task.put("create_time", DateUtil.now());
task.put("update_time", DateUtil.now());
task.put("priority", "1");
WQLObject.getWQLObject("SCH_BASE_Task").insert(task);
return taskdtl_id;
}
@Override
public void cancel(String taskId) {
log.info(OPT_NAME+"cancel taskID:{}",taskId);
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
//专机-专机
//专机-缓存线
//缓存线出库
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'");
}
}

View File

@@ -0,0 +1,201 @@
package org.nl.wms.sch.tasks;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.enums.AcsTaskEnum;
import org.nl.common.enums.InterfaceLogType;
import org.nl.common.enums.StatusEnum;
import org.nl.common.utils.MapOf;
import org.nl.modules.common.exception.BadRequestException;
import org.nl.modules.system.util.CodeUtil;
import org.nl.common.utils.SecurityUtils;
import org.nl.modules.wql.core.bean.WQLObject;
import org.nl.wms.sch.manage.AbstractAcsTask;
import org.springframework.http.HttpStatus;
import java.util.HashMap;
import java.util.Map;
/**
* 专机任务
*/
@Slf4j
public class SpeMachineryTask extends AbstractAcsTask {
private final Map<String,SpeStatusHandler > SpeHandles= new HashMap<>();
private static String OPT_NAME = "ACS回调# ";
public SpeMachineryTask() {
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_MAC.name() ,new Spe2Spe());
SpeHandles.put(AcsTaskEnum.TASK_PRODUCT_CACHE.name() ,new Spe2Cache());
SpeHandles.put(AcsTaskEnum.TASK_CACHELINE_OUT.name() ,new Cache2Spe());
}
@Override
public void updateTaskStatus(JSONObject param,String status) {
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
log.info(InterfaceLogType.ACS_TO_LMS.getDesc());
// 指令执行中
JSONObject task = taskTable.query("task_id = '" + param.getString("taskId") + "'").uniqueResult(0);
AcsTaskEnum taskType = AcsTaskEnum.getType(task.getString("task_type"),"TASK_");
try {
SpeHandles.get(taskType.name()).handle(param,status,task);
}catch (Exception ex){
log.error(OPT_NAME+"updateStatus error:{}",ex);
throw ex;
}
}
@Override
public String createTask(JSONObject form) {
String start_point_code = form.getString("start_point_code");
String next_point_code = form.getString("next_point_code");
String vehicle_code = form.getString("vehicle_code");
String type = form.getString("type");
if (StrUtil.isEmpty(start_point_code)) {
throw new BadRequestException("起点不能为空!");
}
if (StrUtil.isEmpty(next_point_code)) {
throw new BadRequestException("终点不能为空!");
}
if (StrUtil.isEmpty(vehicle_code)) {
throw new BadRequestException("载具不能为空!");
}
String taskdtl_id = IdUtil.getSnowflake(1, 1).nextId() + "";
JSONObject task = new JSONObject();
task.put("taskdtl_id", taskdtl_id);
task.put("task_id", taskdtl_id);
task.put("task_code", CodeUtil.getNewCode("TASK_CODE"));
task.put("task_type", type);
task.put("task_status", "01");
task.put("start_point_code", start_point_code);
task.put("next_point_code", next_point_code);
task.put("vehicle_code", vehicle_code);
task.put("handle_class", this.getClass().getName());
task.put("finished_type", "01");
task.put("is_delete", "0");
String currentUserId = SecurityUtils.getCurrentUserId();
task.put("create_id", currentUserId);
task.put("create_name", SecurityUtils.getCurrentNickName());
task.put("update_optid", currentUserId);
task.put("update_optname", SecurityUtils.getCurrentNickName());
task.put("create_time", DateUtil.now());
task.put("update_time", DateUtil.now());
task.put("priority", "1");
WQLObject.getWQLObject("SCH_BASE_Task").insert(task);
return taskdtl_id;
}
@Override
public void cancel(String taskId) {
log.info(OPT_NAME+"cancel taskID:{}",taskId);
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
//专机-专机
//专机-缓存线
//缓存线出库
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_CANNEL.getCode()),"task_id = '"+taskId+"'");
}
interface SpeStatusHandler{
void handle(JSONObject param,String status,JSONObject task);
}
class Spe2Spe implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
break;
case STATUS_RUNDING:
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
//到专机:更新设备上料位物料数量
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
default:
log.error(OPT_NAME+"未定义任务状态:{}",sta);
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
class Spe2Cache implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
String workprocedureCode = param.getString("workorder_code");
String inboxtxm = param.getString("inboxtxm");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
break;
case STATUS_RUNDING:
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.insert(MapOf.of("quantity", task.getString("material_qty"),
"material_id", task.getString("material_id"),
"vehicle_code", inboxtxm,
"vehicle_status", StatusEnum.CACHE_VEL_FULL.getCode(),
//工单,工序?
"workorder_code", workprocedureCode,
"create_time", DateUtil.now(),
"update_time", DateUtil.now()
//物料规格,物料名称 从物料信息表关联查询
));
break;
default:
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
class Cache2Spe implements SpeStatusHandler{
@Override
public void handle(JSONObject param, String sta,JSONObject task) {
AcsTaskEnum status = AcsTaskEnum.getType(sta,"status_");
WQLObject taskTable = WQLObject.getWQLObject("sch_base_task");
WQLObject cacheVehTable = WQLObject.getWQLObject("sch_cacheline_vehilematerial");
WQLObject pointTable = WQLObject.getWQLObject("SCH_BASE_Point");
WQLObject deviceTable = WQLObject.getWQLObject("pdm_bi_device");
String outboxtxm = param.getString("outboxtxm");
switch (status){
case STATUS_START:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_RUNNING.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
cacheVehTable.delete("vehicle_code = '" + outboxtxm + "'");
break;
case STATUS_FINISH:
taskTable.update(MapOf.of("task_status",StatusEnum.TASK_FINISH.getCode(),"update_name","acs","update_time", DateUtil.now()),"task_id = '"+task.getString("task_id")+"'");
String point_code2 = task.getString("point_code2");
JSONObject pointInfo = pointTable.query("point_code = '" + point_code2 + "'").uniqueResult(0);
JSONObject device = deviceTable.query("device_code = '" + pointInfo.getString("device_code") + "'").uniqueResult(0);
task.getDouble("material_qty");
double currentQty = device.getDouble("deviceinstor_qty") + task.getDouble("material_qty");
deviceTable.update(MapOf.of("deviceinstor_qty", String.valueOf(currentQty)), "device_code = '" + pointInfo.getString("device_code") + "'");
break;
default:
throw new BadRequestException(OPT_NAME+"未定义任务状态:"+sta);
}
}
}
}