11 changed files with 339 additions and 7 deletions
@ -0,0 +1,17 @@ |
|||
package org.nl.common.domain.interfaces; |
|||
|
|||
public interface CallBack { |
|||
/** |
|||
* 回调执行方法 |
|||
*/ |
|||
void executor(); |
|||
|
|||
/** |
|||
* 本回调任务名称 |
|||
* @return / |
|||
*/ |
|||
default String getCallBackName() { |
|||
return Thread.currentThread().getId() + ":" + this.getClass().getName(); |
|||
} |
|||
} |
|||
|
@ -0,0 +1,12 @@ |
|||
package org.nl.common.domain.interfaces; |
|||
|
|||
/* |
|||
* @author ZZQ |
|||
* @Date 2022/12/14 8:40 下午 |
|||
*/ |
|||
@FunctionalInterface |
|||
public interface LConsumer<X,Y,Z> { |
|||
|
|||
void accept(X x,Y y,Z z); |
|||
|
|||
} |
@ -0,0 +1,9 @@ |
|||
package org.nl.common.domain.interfaces; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
@FunctionalInterface |
|||
public |
|||
interface LockProcess { |
|||
void process() throws IOException; |
|||
} |
@ -0,0 +1,9 @@ |
|||
package org.nl.common.domain.interfaces; |
|||
|
|||
import java.io.IOException; |
|||
|
|||
@FunctionalInterface |
|||
public |
|||
interface ReturnLockProcess<T> { |
|||
T process() throws IOException; |
|||
} |
@ -0,0 +1,75 @@ |
|||
package org.nl.common.utils; |
|||
|
|||
import lombok.SneakyThrows; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.common.domain.interfaces.LockProcess; |
|||
import org.nl.common.domain.interfaces.ReturnLockProcess; |
|||
import org.nl.common.exception.BadRequestException; |
|||
import org.nl.config.SpringContextHolder; |
|||
import org.redisson.api.RLock; |
|||
import org.redisson.api.RedissonClient; |
|||
|
|||
import java.util.concurrent.TimeUnit; |
|||
|
|||
/* |
|||
* @author ZZQ |
|||
* @Date 2023/3/27 10:30 |
|||
*/ |
|||
@Slf4j |
|||
public class RedissonUtils { |
|||
/** |
|||
* |
|||
* @param process 业务代码 |
|||
* @param key |
|||
* @param seconds 尝试获取锁的等待时间,允许为空 |
|||
*/ |
|||
@SneakyThrows |
|||
public static void lock(LockProcess process, String key, Integer seconds){ |
|||
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class); |
|||
RLock lock = redissonClient.getLock(key); |
|||
boolean isLock; |
|||
if (seconds == null){ |
|||
isLock = lock.tryLock(); |
|||
}else { |
|||
isLock = lock.tryLock(seconds, TimeUnit.SECONDS); |
|||
} |
|||
try { |
|||
if (isLock){ |
|||
process.process(); |
|||
} else { |
|||
throw new BadRequestException("当前业务:"+key+"正在执行请稍后再试"); |
|||
} |
|||
}catch (Exception ex){ |
|||
log.error("key:"+ex.getMessage()); |
|||
throw ex; |
|||
}finally { |
|||
if (lock.isHeldByCurrentThread() && lock.isLocked()){ |
|||
lock.unlock(); |
|||
} |
|||
} |
|||
} |
|||
|
|||
@SneakyThrows |
|||
public static<T> T lockAndReturn(ReturnLockProcess<T> process, String key, Integer seconds){ |
|||
RedissonClient redissonClient = SpringContextHolder.getBean(RedissonClient.class); |
|||
RLock lock = redissonClient.getLock(key); |
|||
boolean isLock; |
|||
if (seconds == null){ |
|||
isLock = lock.tryLock(); |
|||
}else { |
|||
isLock = lock.tryLock(seconds, TimeUnit.SECONDS); |
|||
} |
|||
try { |
|||
if (isLock){ |
|||
T result = process.process(); |
|||
return result; |
|||
} else { |
|||
throw new BadRequestException("当前业务 key:"+key+"正在执行请稍后再试"); |
|||
} |
|||
}finally { |
|||
if (isLock){ |
|||
lock.unlock(); |
|||
} |
|||
} |
|||
} |
|||
} |
@ -0,0 +1,36 @@ |
|||
package org.nl.wms.gateway.controller; |
|||
import cn.dev33.satoken.annotation.SaIgnore; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.nl.common.logging.annotation.Log; |
|||
import org.nl.wms.gateway.service.GateWayService; |
|||
import org.nl.wms.gateway.dto.InteracteDto; |
|||
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; |
|||
import org.nl.common.base.TableDataInfo; |
|||
|
|||
import javax.annotation.Resource; |
|||
|
|||
/** |
|||
* 网关执行控制层 |
|||
* |
|||
* @author gbx |
|||
* @since 2025-06-27 |
|||
*/ |
|||
@RestController |
|||
@RequestMapping("/api/wms/out") |
|||
@Slf4j |
|||
public class GateWayController { |
|||
|
|||
@Resource |
|||
private GateWayService gateWayService; |
|||
@PostMapping("/apply") |
|||
@SaIgnore |
|||
@Log("外层服务请求wms") |
|||
public ResponseEntity<Object> apply(@RequestBody InteracteDto form) { |
|||
return new ResponseEntity<>(TableDataInfo.buildJson(gateWayService.apply(form)),HttpStatus.OK); |
|||
} |
|||
} |
@ -0,0 +1,27 @@ |
|||
package org.nl.wms.gateway.dto; |
|||
|
|||
import lombok.AllArgsConstructor; |
|||
import lombok.Builder; |
|||
import lombok.Data; |
|||
import lombok.NoArgsConstructor; |
|||
|
|||
/* |
|||
* @author ZZQ |
|||
* @Date 2024/5/29 16:26 |
|||
*/ |
|||
@Data |
|||
@Builder |
|||
@NoArgsConstructor |
|||
@AllArgsConstructor |
|||
public class InteracteDto<T> { |
|||
|
|||
private String service; |
|||
private String type; |
|||
private String ip; |
|||
private String request_time; |
|||
private String trace_id; |
|||
/** |
|||
* 要么JSONArray要么JSONObject |
|||
*/ |
|||
private T data; |
|||
} |
@ -0,0 +1,82 @@ |
|||
package org.nl.wms.gateway.service; |
|||
|
|||
import cn.hutool.core.lang.Assert; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; |
|||
import org.nl.common.exception.BadRequestException; |
|||
import org.nl.common.utils.RedissonUtils; |
|||
import org.nl.wms.ext.service.AcsToWmsService; |
|||
import org.nl.wms.gateway.dto.InteracteDto; |
|||
import org.nl.wms.gateway.service.impl.GateWayServiceImpl; |
|||
import org.nl.wms.sch_manage.service.ISchBasePointService; |
|||
import org.nl.wms.sch_manage.service.ISchBaseTaskService; |
|||
import org.nl.wms.sch_manage.service.dao.SchBasePoint; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import java.util.Map; |
|||
import java.util.concurrent.atomic.AtomicReference; |
|||
|
|||
/** |
|||
* 网关执行接口层 |
|||
* |
|||
* @author gbx |
|||
* @since 2025-06-27 |
|||
*/ |
|||
@Service |
|||
public class GateWayService { |
|||
|
|||
@Autowired |
|||
private GateWayServiceImpl gateWayServiceImpl; |
|||
@Autowired |
|||
private ISchBasePointService iSchBasePointService; |
|||
@Autowired |
|||
private ISchBaseTaskService iSchBaseTaskService; |
|||
|
|||
|
|||
public JSONObject apply(InteracteDto<Map> param) { |
|||
JSONObject jsonObject = new JSONObject(param.getData()); |
|||
//处理日志相关
|
|||
JSONObject result = new JSONObject(); |
|||
String service = param.getService(); |
|||
String type = param.getType(); |
|||
//根据服务拆分不同的业务
|
|||
if ("InStorage".equals(service)) { |
|||
RedissonUtils.lock(() -> { |
|||
String taskCode = gateWayServiceImpl.applyTask(param.getService(), type, jsonObject, param); |
|||
result.put("taskCode", taskCode); |
|||
}, param.getService() + param.getType(), null); |
|||
} |
|||
if ("Task".equals(service)) { |
|||
iSchBaseTaskService.operation(jsonObject); |
|||
} |
|||
if ("DeviceInfo".equals(service)) { |
|||
|
|||
} |
|||
if ("Device".equals(service)) { |
|||
Assert.noNullElements(new Object[]{jsonObject.getString("devicePoint"), jsonObject.getString("status")}, "请求参数不能为空"); |
|||
if (!"1207".equals(jsonObject.getString("devicePoint")) && !"1210".equals(jsonObject.getString("devicePoint"))) { |
|||
throw new BadRequestException("您输入的拣选位不存在,请输入1207或1210拣选位!"); |
|||
} |
|||
RedissonUtils.lock(() -> { |
|||
LambdaUpdateWrapper<SchBasePoint> updateWrapper = new LambdaUpdateWrapper<>(); |
|||
updateWrapper.set(SchBasePoint::getIs_used, "0".equals(jsonObject.getString("status")) ? 0 : 1); |
|||
iSchBasePointService.update(updateWrapper); |
|||
}, param.getService() + param.getType(), null); |
|||
} |
|||
if ("ErrorInfo".equals(service)) { |
|||
Assert.noNullElements(new Object[]{type, jsonObject.getString("msg")}, "请求参数不能为空"); |
|||
String msg = jsonObject.getString("msg").trim(); |
|||
//iSchBasePointService.sendErrorMsg(type,null, msg);
|
|||
} |
|||
if ("ErrorTask".equals(service)) { |
|||
AtomicReference<JSONObject> reference = new AtomicReference<>(new JSONObject()); |
|||
RedissonUtils.lock(() -> { |
|||
// reference.set(iSchBaseTaskService.errorTask(jsonObject, param.getType()));
|
|||
}, param.getService() + param.getType(), null); |
|||
return reference.get(); |
|||
} |
|||
return result; |
|||
} |
|||
|
|||
} |
@ -0,0 +1,54 @@ |
|||
package org.nl.wms.gateway.service.impl; |
|||
|
|||
import cn.hutool.core.date.DateUtil; |
|||
import com.alibaba.fastjson.JSON; |
|||
import com.alibaba.fastjson.JSONObject; |
|||
import lombok.extern.slf4j.Slf4j; |
|||
import org.apache.commons.lang3.StringUtils; |
|||
import org.nl.common.exception.BadRequestException; |
|||
import org.nl.wms.gateway.dto.InteracteDto; |
|||
import org.nl.wms.sch_manage.service.ISchBasePointService; |
|||
import org.nl.wms.sch_manage.service.ISchBaseTaskService; |
|||
import org.nl.wms.sch_manage.service.util.AbstractTask; |
|||
import org.springframework.beans.factory.annotation.Autowired; |
|||
import org.springframework.stereotype.Service; |
|||
|
|||
import javax.annotation.Resource; |
|||
import java.util.Map; |
|||
|
|||
/** |
|||
* 网关执行实现层 |
|||
* |
|||
* @author gbx |
|||
* @since 2025-06-27 |
|||
*/ |
|||
@Slf4j |
|||
@Service |
|||
public class GateWayServiceImpl { |
|||
|
|||
|
|||
@Resource |
|||
private Map<String, AbstractTask> applyTaskMap; |
|||
|
|||
public String applyTask(String service, String type, JSONObject data, InteracteDto<Map> param) { |
|||
if ("InStorage".equals(service)) { |
|||
try { |
|||
String taskId = applyTaskMap.get(type).create(data); |
|||
if (StringUtils.isBlank(taskId)) { |
|||
log.error("创建任务失败:返回任务信息为空,申请参数为:" + JSON.toJSONString(param)); |
|||
throw new BadRequestException("创建任务失败:返回任务信息为空,申请参数为:" + JSON.toJSONString(param)); |
|||
} |
|||
return taskId; |
|||
} catch (Exception e) { |
|||
if (param.getData() != null) { |
|||
String title = param.getType() + DateUtil.today() + param.getData().toString(); |
|||
// iSchBasePointService.sendErrorMsg("1", title, "任务申请失败,申请参数为:" + JSON.toJSONString(param) + "请查看错误日志" + e);
|
|||
} |
|||
throw new BadRequestException("申请任务失败,申请参数为:" + JSON.toJSONString(param) + "请查看错误日志:" + e); |
|||
} |
|||
} |
|||
return null; |
|||
} |
|||
|
|||
|
|||
} |
Loading…
Reference in new issue