fix: 初步维护主体框架

This commit is contained in:
2024-08-06 16:13:20 +08:00
parent 1c05806c3f
commit 9a8395f4b6
20 changed files with 191 additions and 106 deletions

View File

@@ -161,26 +161,6 @@ mybatis-plus:
db-config:
id-type: INPUT
banner: false
jetcache:
statIntervalMinutes: 15
areaInCacheName: false
local:
default:
type: linkedhashmap
keyConvertor: fastjson
remote:
default:
type: redis
keyConvertor: fastjson2
broadcastChannel: projectA
valueEncoder: java
valueDecoder: java
poolConfig:
minIdle: 5
maxIdle: 20
maxTotal: 50
host: 127.0.0.1
port: 6379
lucene:
index:
path: D:\log\lms\ld\index

View File

@@ -15,7 +15,7 @@ public interface AcsToWmsService {
* @return Map<String, Object>
*/
Map<String, Object> receiveTaskStatusAcs(String string);
Map<String, Object> receiveTaskStatusAcs(String string) throws InterruptedException;
/**

View File

@@ -4,6 +4,7 @@ import org.nl.wms.ext.acs.service.dto.to.wms.AcsResponse;
import org.nl.wms.sch.task_manage.AcsTaskDto;
import java.util.List;
import java.util.Map;
/**
* @Author: lyd
@@ -18,6 +19,6 @@ public interface WmsToAcsService {
* @param list: 任务链表
* @return
*/
AcsResponse renotifyAcs(List<AcsTaskDto> list);
Map<String, Object> issueTaskToAcs(List<AcsTaskDto> list);
}

View File

@@ -1,20 +1,88 @@
package org.nl.wms.ext.acs.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.wms.ext.acs.service.AcsToWmsService;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.AbstractTask;
import org.nl.wms.sch.task_manage.task.TaskFactory;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import java.util.Map;
import java.util.concurrent.TimeUnit;
@Service
@RequiredArgsConstructor
@Slf4j
public class AcsToWmsServiceImpl implements AcsToWmsService {
@Autowired
private RedissonClient redissonClient;
@Autowired
private ISchBaseTaskService taskService;
@Autowired
private TaskFactory taskFactory;
@Override
public Map<String, Object> receiveTaskStatusAcs(String string) {
return null;
public Map<String, Object> receiveTaskStatusAcs(String string) throws InterruptedException {
log.info("acs向lms反馈任务状态请求参数--------------------------------------" + string);
JSONArray array = JSONArray.parseArray(string);
//返回处理失败的任务
JSONArray errArr = new JSONArray();
for (int i = 0; i < array.size(); i++) {
JSONObject row = array.getJSONObject(i);
String taskId = row.getString("task_id");
RLock lock = redissonClient.getLock(taskId);
boolean tryLock = lock.tryLock(0, TimeUnit.SECONDS);
try {
if (tryLock) {
SchBaseTask task = taskService.getById(taskId);
row.put("task_code", task.getTask_code());
//1:执行中,2:完成 ,3:acs取消
String acsTaskStatus = row.getString("task_status");
String message = "";
TaskStatus status = null;
if ("1".equals(acsTaskStatus)) {
status = TaskStatus.EXECUTING;
}
if ("2".equals(acsTaskStatus)) {
status = TaskStatus.FINISHED;
}
if ("3".equals(acsTaskStatus)) {
status = TaskStatus.CANCELED;
}
// 任务处理类
try {
AbstractTask task1 = taskFactory.getTask(task.getConfig_code());
task1.updateTaskStatus(row, status);
} catch (Exception e) {
e.printStackTrace();
message = e.getMessage();
throw new BadRequestException(message);
}
} else {
throw new BadRequestException("任务标识为:" + taskId + "的任务正在操作中!");
}
} finally {
if (tryLock) {
lock.unlock();
}
}
}
JSONObject result = new JSONObject();
result.put("status", HttpStatus.OK.value());
result.put("message", "任务状态反馈成功!");
result.put("data", new JSONObject());
result.put("errArr", errArr);
log.info("acs向lms反馈任务状态返回参数--------------------------------------" + result.toString());
return result;
}
@Override

View File

@@ -1,5 +1,7 @@
package org.nl.wms.ext.acs.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.nl.wms.ext.acs.service.WmsToAcsService;
import org.nl.wms.ext.acs.service.dto.to.acs.IssueAcsRequest;
@@ -12,6 +14,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
import java.util.Map;
/**
* @Author: lyd
@@ -25,12 +28,13 @@ public class WmsToAcsServiceImpl implements WmsToAcsService {
private ISysInteractRecordService interactRecordService;
@Override
public AcsResponse renotifyAcs(List<AcsTaskDto> list) {
public Map<String, Object> issueTaskToAcs(List<AcsTaskDto> list) {
String api = "api/wms/task";
AcsResponse resultForAcs = AcsUtil.notifyAcs2(api, IssueAcsRequest.buildRequestObj("下发任务", list));
// 记录日志
interactRecordService.saveRecord("下发任务", list, resultForAcs, GeneralDefinition.LMS_ACS);
return resultForAcs;
JSONArray jsonArray = new JSONArray();
for (AcsTaskDto dto : list) {
jsonArray.add(JSONObject.toJSONString(dto));
}
return AcsUtil.notifyAcs(api, jsonArray);
}
}

View File

@@ -70,8 +70,7 @@ public class SchBaseTaskController {
}
@PutMapping("/operation")
@Log("任务操作")
@Log("PC操作任务")
public ResponseEntity<Object> update(@RequestBody Map<String, Object> map) {
schBaseTaskService.operation(map);
return new ResponseEntity<>(HttpStatus.NO_CONTENT);

View File

@@ -1,11 +1,8 @@
package org.nl.wms.sch.task_manage;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Assert;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpStatus;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.SneakyThrows;
@@ -48,10 +45,19 @@ public abstract class AbstractTask {
@Autowired
private WmsToAcsService wmsToAcsService;
/**
* 不走任务配置的创建任务类, 不会被定时任务扫描自动创建
* @param form 创建任务需要的参数
* @return 返回任务标识
*/
public String createTask(JSONObject form) {
return null;
}
/**
* 任务创建
* 根据配置生成任务,如并发控制等
*
* 这里会定时任务执行,例如:一条任务状态是[起点确认]的任务会在这个方法,由子类来定时扫描去执行对应的逻辑
* @throws BadRequestException /
*/
public abstract void create() throws BadRequestException;
@@ -59,20 +65,19 @@ public abstract class AbstractTask {
/**
* 任务创建
* 只会创建完整的任务,创建失败则抛出异常
*
* 这个定时任务不会扫描到,只做一次性创建,失败则报错
* @param task /
*/
public void createCompletion(SchBaseTask task) {
}
/**
* @return WCS的任务集合
* @discription 重新下发给wcs任务
* @author ldjun
* @created 2020年6月12日 下午5:52:28
*/
protected AcsResponse renotifyAcs(SchBaseTask task) {
protected AcsResponse immediateNotifyAcs(SchBaseTask task) {
Assert.notNull(task);
List<SchBaseTask> taskList = new ArrayList<>();
taskList.add(task);
@@ -94,7 +99,7 @@ public abstract class AbstractTask {
List<AcsTaskDto> list = new ArrayList<>();
for (SchBaseTask task : taskList) {
AcsTaskDto taskDto = new AcsTaskDto();
taskDto.setExt_task_uuid(task.getTask_id());
taskDto.setExt_task_id(task.getTask_id());
taskDto.setTask_code(task.getTask_code());
taskDto.setRoute_plan_code("normal");
taskDto.setStart_device_code(task.getPoint_code1());
@@ -108,35 +113,7 @@ public abstract class AbstractTask {
this.deliveryBeforeProcessing(task, taskDto);
list.add(taskDto);
}
try {
// 创建下发对象
resultForAcs = wmsToAcsService.renotifyAcs(list);
} catch (Exception e) {
log.error("任务下发异常: {}", e.getMessage());
resultForAcs.setResponseDate(DateUtil.now());
resultForAcs.setCode(HttpStatus.HTTP_BAD_REQUEST);
resultForAcs.setMessage(e.getMessage());
}
// 如果下发完毕,就修改状态
if (resultForAcs.getCode() == HttpStatus.HTTP_OK) {
// 解析
JSONArray errArr = resultForAcs.getErrArr();
for (SchBaseTask schBaseTask : taskList) {
schBaseTask.setTask_status(TaskStatus.ISSUE.getCode());
// 判断是否是出错的任务
for (int i = 0; ObjectUtil.isNotEmpty(errArr) && i < errArr.size(); i++) {
JSONObject errObj = errArr.getJSONObject(i);
String taskCode = errObj.getString("task_code");
if (taskCode.equals(schBaseTask.getTask_code())) {
// 出错的任务就设置出错信息为备注,不是出错就设置下发
schBaseTask.setTask_status(TaskStatus.START_AND_POINT.getCode());
schBaseTask.setRemark(errObj.getString("message"));
break;
}
}
}
taskService.updateBatchById(taskList);
}
wmsToAcsService.issueTaskToAcs(list);
return resultForAcs;
}
@@ -244,7 +221,7 @@ public abstract class AbstractTask {
public abstract void cancel(String task_code);
/**
* 申请任务
* 申请任务 - 暂时不用
* <p>创建task的总入口会根据自定义的子类去执行创建方法。</p>
* @param param 请求任务的参数可以是只确定了单个点也可以是4个点都确定了
* @throws BadRequestException 如果创建失败
@@ -286,18 +263,14 @@ public abstract class AbstractTask {
task.setTask_id(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setTask_code(IdUtil.getSnowflake(1, 1).nextIdStr());
task.setConfig_code(configCode);
// todo
task.setCreate_mode(ObjectUtil.isNotEmpty(param.getString("create_mode"))
? param.getString("create_mode") : GeneralDefinition.ACS_CREATION);
task.setVehicle_code(vehicleCode);
task.setVehicle_qty(param.getInteger("vehicle_qty"));
task.setVehicle_type(vehicleType);
task.setTask_status(TaskStatus.APPLY.getCode());
task.setTask_status(TaskStatus.CREATED.getCode());
// 设置起/终点
task.setPoint_code1(param.getString("point_code1"));
task.setPoint_code2(param.getString("point_code2"));
task.setPoint_code3(param.getString("point_code3"));
task.setPoint_code4(param.getString("point_code4"));
bean.setTaskPoint(taskConfig, task, applyPointCode);
// 将所有参数存到表中,后续需要可以提取
task.setRequest_param(JSONObject.toJSONString(param));
// 设置创建人信息
@@ -314,5 +287,4 @@ public abstract class AbstractTask {
bean.create();
}
}
}

View File

@@ -23,7 +23,7 @@ public class AcsTaskDto {
/**
* 任务标识
*/
private String ext_task_uuid;
private String ext_task_id;
/**
* 任务编号

View File

@@ -4,14 +4,22 @@ import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.param.dao.Param;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.ext.acs.service.dto.ResultForAcs;
import org.nl.wms.ext.acs.service.dto.to.wms.AcsResponse;
import org.nl.wms.sch.task.service.ISchBaseTaskService;
import org.nl.wms.sch.task.service.dao.SchBaseTask;
import org.nl.wms.sch.task_manage.GeneralDefinition;
import org.nl.wms.sch.task_manage.task.core.TaskStatus;
import org.nl.wms.util.URLEnum;
import org.springframework.http.HttpStatus;
import java.util.List;
@@ -25,6 +33,69 @@ import java.util.List;
*/
@Slf4j
public class AcsUtil {
public static JSONObject notifyAcs(String api, JSONArray list) {
log.info("下发ACS参数----------------------------------------+" + api + ",---" + list.toString());
//判断是否连接ACS系统
String isConnect = SpringContextHolder.getBean(SysParamServiceImpl.class).findByCode("is_connect_acs").getValue();
JSONObject result = new JSONObject();
if (StrUtil.equals("0", isConnect)) {
result.put("status", HttpStatus.OK.value());
result.put("message", "下发成功但未连接ACS!");
result.put("data", new JSONObject());
return result;
}
for (int j = 0; j < list.size(); j++) {
JSONObject jo = list.getJSONObject(j);
String product_area = jo.getString("product_area");
if (StrUtil.isEmpty(product_area)) {
throw new BadRequestException("区域不能为空!下发信息:" + jo.toString());
}
String acs_url = URLEnum.find(product_area);
if (StrUtil.isEmpty(acs_url)) {
log.info(product_area);
throw new BadRequestException("未查询到区域对应的acs地址");
}
String url = acs_url + api;
try {
JSONArray rows = new JSONArray();
rows.add(jo);
String resultMsg = HttpRequest.post(url)
.body(String.valueOf(rows))
.execute().body();
result = JSONObject.parseObject(resultMsg);
log.info("下发acs任务成功返回参数----------------------------------------+" + api + ",---" + result.toString());
} catch (Exception e) {
//acs抛异常这里
String msg = e.getMessage();
//ConnectException: Connection refused: connect
//网络不通
result.put("status", HttpStatus.BAD_REQUEST);
result.put("message", "网络不通,操作失败!");
result.put("data", new JSONObject());
log.error("ACS出现异常: {}", e);
log.info("下发ACS任务失败原因是----------------------------------------+"+ msg);
}
if (!StrUtil.equals(result.getString("status"), "200")) {
log.info("下发acs任务失败原因是----------------------------------------+"+ result.getString("message"));
throw new BadRequestException(result.getString("message"));
} else {
//如果向ACS下发任务变更任务状态为下发
if ("api/wms/task".equals(api)) {
for (int i = 0; i < list.size(); i++) {
JSONObject task_jo = list.getJSONObject(i);
ISchBaseTaskService bean = SpringContextHolder.getBean(ISchBaseTaskService.class);
bean.update(new LambdaUpdateWrapper<SchBaseTask>()
.set(SchBaseTask::getTask_status, TaskStatus.ISSUE.getCode())
.eq(SchBaseTask::getTask_id, task_jo.getString("ext_task_id")));
}
}
}
}
log.info("下发acs任务结果是----------------------------------------+"+ result);
return result;
}
/**
* 原生默认请求方法: 默认执行的参数都是jsonArray
* @param api
@@ -32,7 +103,7 @@ public class AcsUtil {
* @return
* @param <T>
*/
public static <T> ResultForAcs notifyAcs(String api, List<T> list) {
public static <T> ResultForAcs notifyAcs2(String api, List<T> list) {
SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class);
// list转JSONArray
String s = JSON.toJSONString(list);
@@ -77,7 +148,7 @@ public class AcsUtil {
* @return
* @param <T>
*/
public static <T> AcsResponse notifyAcs2(String api, T object) {
public static <T> AcsResponse notifyAcs3(String api, T object) {
SysParamServiceImpl sysParamService = SpringContextHolder.getBean(SysParamServiceImpl.class);
//判断是否连接ACS系统
Param isConnectAcs = sysParamService.findByCode(GeneralDefinition.IS_CONNECT_ACS);

View File

@@ -175,7 +175,7 @@ public class CallEmpReelTask extends AbstractTask {
taskService.save(task);
// 如果需要立即下发
if (BooleanUtil.toBoolean(task.getIs_send())) {
this.renotifyAcs(task);
this.immediateNotifyAcs(task);
}
}

View File

@@ -154,7 +154,7 @@ public class CoolCutTask extends AbstractTask {
taskService.save(task);
//如果目标点位没有空位先创建不下发
if (isSend) {
this.renotifyAcs(task);
this.immediateNotifyAcs(task);
}
}

View File

@@ -18,12 +18,9 @@ import org.nl.common.exception.BadRequestException;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.dict.ISysDictService;
import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.dict.dao.mapper.SysDictMapper;
import org.nl.system.service.param.impl.SysParamServiceImpl;
import org.nl.wms.basedata.material.service.ImdMeMaterialbaseService;
import org.nl.wms.pdm.bi.dao.PdmBiRawfoilworkorder;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.bi.service.IpdmBiSlittingproductionplanService;
import org.nl.wms.pdm.ivt.dao.StIvtCoolpointivt;
import org.nl.wms.pdm.ivt.service.*;
import org.nl.wms.sch.point.service.ISchBasePointService;
@@ -40,7 +37,6 @@ import org.springframework.stereotype.Component;
import org.springframework.transaction.annotation.Transactional;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;
@@ -150,7 +146,7 @@ public class InCoolIvtTask extends AbstractTask {
taskService.save(task);
//如果目标点位没有空位先创建不下发
if (isSend) {
this.renotifyAcs(task);
this.immediateNotifyAcs(task);
}
}

View File

@@ -178,7 +178,7 @@ public class InHotTask extends AbstractTask {
taskService.save(task);
//如果目标点位没有空位先创建不下发
if (isSend) {
this.renotifyAcs(task);
this.immediateNotifyAcs(task);
}
}

View File

@@ -14,14 +14,8 @@ import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import lombok.extern.slf4j.Slf4j;
import org.nl.common.exception.BadRequestException;
import org.nl.common.utils.SecurityUtils;
import org.nl.config.SpringContextHolder;
import org.nl.system.service.dict.ISysDictService;
import org.nl.system.service.dict.dao.Dict;
import org.nl.system.service.dict.dao.mapper.SysDictMapper;
import org.nl.wms.basedata.material.service.ImdMeMaterialbaseService;
import org.nl.wms.pdm.bi.service.IpdmBiRawfoilworkorderService;
import org.nl.wms.pdm.bi.service.IpdmBiSlittingproductionplanService;
import org.nl.wms.pdm.ivt.dao.StIvtCoolpointivt;
import org.nl.wms.pdm.ivt.dao.StIvtHotpointivt;
import org.nl.wms.pdm.ivt.dao.StIvtHotregioniomst;
import org.nl.wms.pdm.ivt.service.*;
@@ -146,7 +140,7 @@ public class OutHotTask extends AbstractTask {
taskService.save(task);
//如果目标点位没有空位先创建不下发
if (isSend) {
this.renotifyAcs(task);
this.immediateNotifyAcs(task);
}
}

View File

@@ -53,7 +53,7 @@ spring:
login-username: admin
login-password: admin
dynamic:
primary: dm
primary: mysql
datasource:
mysql:
driver-class-name: net.sf.log4jdbc.sql.jdbcapi.DriverSpy

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@@ -2,7 +2,7 @@ export default {
'lang': 'English',
// 平台
'platform': {
'title': 'NOBLELIFT Platform',
'title': 'LDHX LMS',
'tip1': 'The user name cannot be empty',
'tip2': 'The password cannot be empty',
'tip3': 'The verification code cannot be empty'

View File

@@ -2,7 +2,7 @@ export default {
'lang': 'in',
// 平台
'platform': {
'title': 'NOBLELIFT Platform',
'title': 'Longdian Huaxin LMS',
'tip1': 'Nama pengguna tidak dapat kosong',
'tip2': 'Kata sandi tidak dapat kosong',
'tip3': 'Kode verifikasi tidak dapat kosong'

View File

@@ -2,7 +2,7 @@ export default {
'lang': 'zh',
// 平台
'platform': {
'title': '诺力开发平台',
'title': '龙电华鑫铜箔LMS',
'tip1': '用户名不能为空',
'tip2': '密码不能为空',
'tip3': '验证码不能为空'

View File

@@ -14,8 +14,9 @@
</template>
<script>
import Logo from '@/assets/images/logo.png'
import Logo from '@/assets/images/longdian.png'
import variables from '@/assets/styles/variables.scss'
import i18n from '@/i18n'
export default {
name: 'SidebarLogo',
props: {
@@ -26,9 +27,8 @@ export default {
},
data() {
return {
title: '诺力开发平台',
logo: Logo,
title_param: 'platform'
title: i18n.t('platform.title'),
logo: Logo
}
},
computed: {
@@ -65,8 +65,8 @@ export default {
width: 100%;
& .sidebar-logo {
width: 32px;
height: 32px;
width: 55px;
height: 15px;
vertical-align: middle;
margin-right: 6px;
}