This commit is contained in:
zj
2025-12-15 17:33:20 +08:00
parent 2bc6feb754
commit 8c6329b191
12 changed files with 135 additions and 65 deletions

View File

@@ -143,7 +143,7 @@ public class ApiServiceImpl implements IApiService {
*/ */
@Override @Override
public RequestLog finishMydoJob(Map<String, Object> param) { public RequestLog finishMydoJob(Map<String, Object> param) {
return requestLogService.getRequestLog(JOB_FINISH_URL, "agv任务完成", JSONUtil.toJsonStr(param)); return requestLogService.getRequestLog(JOB_FINISH_URL, "任务完成上报", JSONUtil.toJsonStr(param));
} }

View File

@@ -65,7 +65,7 @@ public class RequestLogServiceImpl implements IRequestLogService
if ("1".equals(requestLog.getIsSuccessful())){ if ("1".equals(requestLog.getIsSuccessful())){
return requestLogMapper.insertRequestLog(requestLog); return requestLogMapper.insertRequestLog(requestLog);
}else { }else {
//log.error("请求失败:" + requestLog.getErrorDetails()); requestLogMapper.insertRequestLog(requestLog);
return 0; return 0;
} }
} }
@@ -126,26 +126,30 @@ public class RequestLogServiceImpl implements IRequestLogService
requestLog.setRequestHeaders(null); requestLog.setRequestHeaders(null);
requestLog.setRequestBody(param); requestLog.setRequestBody(param);
requestLog.setRequestUrl(url); requestLog.setRequestUrl(url);
Date responseTime =new Date();
try { try {
String resStr = HttpUtil.post(url, param); String resStr = HttpUtil.post(url, param);
requestLog.setResponseBody(resStr); requestLog.setResponseBody(resStr);
InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class); InterfaceReceive bean = JSONUtil.toBean(resStr, InterfaceReceive.class);
Date responseTime =new Date();
if (bean.getCode() == 200) { if (bean.getCode() == 200) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss")); requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("1"); requestLog.setResponseStatus("1");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS))); requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
requestLog.setIsSuccessful("1"); requestLog.setIsSuccessful("1");
}else { }else {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setResponseStatus("0"); requestLog.setResponseStatus("0");
requestLog.setErrorDetails(bean.getMsg()); requestLog.setErrorDetails(bean.getMsg());
requestLog.setIsSuccessful("0"); requestLog.setIsSuccessful("0");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
} }
} catch (Exception e) { } catch (Exception e) {
requestLog.setResponseTime(DateUtil.format(responseTime, "yyyy-MM-dd HH:mm:ss"));
requestLog.setErrorDetails(e.getMessage()); requestLog.setErrorDetails(e.getMessage());
requestLog.setIsSuccessful("0"); requestLog.setIsSuccessful("0");
requestLog.setResponseStatus("0"); requestLog.setResponseStatus("0");
requestLog.setDuration(Convert.toStr(DateUtil.between(requestTime, responseTime, DateUnit.MS)));
} finally { } finally {
insertRequestLog(requestLog); insertRequestLog(requestLog);
} }

View File

@@ -60,4 +60,6 @@ public interface JobCallBackMapper
public int deleteJobCallBackByIds(Long[] ids); public int deleteJobCallBackByIds(Long[] ids);
List<JobCallBack> selectJobCallBackListNoSuccess(); List<JobCallBack> selectJobCallBackListNoSuccess();
List<JobCallBack> getTopJobCallBack();
} }

View File

@@ -103,8 +103,22 @@ public class JobCallBackServiceImpl implements IJobCallBackService
@Override @Override
public void jobCallBack() { public void jobCallBack() {
List<JobCallBack> jobCallBackList = jobCallBackMapper.selectJobCallBackListNoSuccess(); // List<JobCallBack> jobCallBackList = jobCallBackMapper.selectJobCallBackListNoSuccess();
for (JobCallBack jobCallBack : jobCallBackList) { // for (JobCallBack jobCallBack : jobCallBackList) {
// Map<String, Object> param = new HashMap<>();
// param.put("jobId", jobCallBack.getMydojobId());
// param.put("taskNo", jobCallBack.getTaskNo());
// param.put("wmsType", jobCallBack.getType());
// RequestLog requestLog = apiService.finishMydoJob(param);
// if ("1".equals(requestLog.getIsSuccessful())){
// jobCallBack.setStatus("1");
// jobCallBackMapper.updateJobCallBack(jobCallBack);
// }
// }
List<JobCallBack> list = jobCallBackMapper.getTopJobCallBack();
if(list != null && list.size() > 0){
JobCallBack jobCallBack = list.get(0);
Map<String, Object> param = new HashMap<>(); Map<String, Object> param = new HashMap<>();
param.put("jobId", jobCallBack.getMydojobId()); param.put("jobId", jobCallBack.getMydojobId());
param.put("taskNo", jobCallBack.getTaskNo()); param.put("taskNo", jobCallBack.getTaskNo());
@@ -113,6 +127,14 @@ public class JobCallBackServiceImpl implements IJobCallBackService
if ("1".equals(requestLog.getIsSuccessful())){ if ("1".equals(requestLog.getIsSuccessful())){
jobCallBack.setStatus("1"); jobCallBack.setStatus("1");
jobCallBackMapper.updateJobCallBack(jobCallBack); jobCallBackMapper.updateJobCallBack(jobCallBack);
}else{
if(Integer.parseInt(jobCallBack.getSpare1()) < 2){
jobCallBack.setSpare1(String.valueOf(Integer.parseInt(jobCallBack.getSpare1())+1));
jobCallBackMapper.updateJobCallBack(jobCallBack);
}else{
jobCallBack.setStatus("2");
jobCallBackMapper.updateJobCallBack(jobCallBack);
}
} }
} }
} }

View File

@@ -234,7 +234,11 @@ public class PlcSsjRead implements Runnable {
return PlcSsjRead.WriteToSSJ(address, bytes); return PlcSsjRead.WriteToSSJ(address, bytes);
} }
public static int writeToSsjQH(String address, int size) {
SendData sizeSendData = new SendData(Tools.INT, size);
byte[] bytes = Tools.sendData(sizeSendData);
return PlcSsjRead.WriteToSSJ(address, bytes);
}
} }

View File

@@ -120,6 +120,7 @@ public class Floor1BothWayOutSsjThread implements Runnable {
jobCallBack.setStatus("0"); jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
jobCallBack.setCreateTime(new Date()); jobCallBack.setCreateTime(new Date());
jobCallBack.setSpare1("0");
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
log.info("完成任务 taskNo{} ", mydoJob.getTaskNo()); log.info("完成任务 taskNo{} ", mydoJob.getTaskNo());

View File

@@ -129,6 +129,7 @@ public class Floor1SingleSsjThread implements Runnable {
jobCallBack.setStatus("0"); jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
jobCallBack.setCreateTime(new Date()); jobCallBack.setCreateTime(new Date());
jobCallBack.setSpare1("0");
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
log.info("完成任务 taskNo{} ", mydoJob.getTaskNo()); log.info("完成任务 taskNo{} ", mydoJob.getTaskNo());
mydoJob.setStatus(TASK_STATUS_FINISH); mydoJob.setStatus(TASK_STATUS_FINISH);

View File

@@ -14,6 +14,7 @@ import com.ruoyi.job.service.IMydoJobService;
import com.ruoyi.queue.agv.domain.AgvQueue; import com.ruoyi.queue.agv.domain.AgvQueue;
import com.ruoyi.queue.agv.service.IAgvQueueService; import com.ruoyi.queue.agv.service.IAgvQueueService;
import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead; import com.ruoyi.schedule.plcRead.ssj.PlcSsjRead;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import java.util.ArrayList; import java.util.ArrayList;
@@ -23,6 +24,7 @@ import java.util.List;
import static com.ruoyi.common.TaskStatusCode.*; import static com.ruoyi.common.TaskStatusCode.*;
import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsj; import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsj;
import static com.ruoyi.schedule.plcRead.ssj.PlcSsjRead.writeToSsjQH;
/** /**
* 二楼出入口输送线线程 * 二楼出入口输送线线程
@@ -98,6 +100,14 @@ public class Floor2InOutSsjThread implements Runnable {
agvQueue.setPositionCode2(inSsjDevice.getDeviceCode()); agvQueue.setPositionCode2(inSsjDevice.getDeviceCode());
List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueue); List<AgvQueue> agvQueues = agvQueueService.selectAgvQueueList(agvQueue);
//不允许放货 等着 //不允许放货 等着
if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 0 && "L1001".equals(inSsjDevice.getDeviceCode())) {
//下发输送线切换导向
int i = writeToSsjQH(inSsjDevice.getPlcDbWriteAddress(), Integer.parseInt(agvQueues.get(0).getCtnrType()));
if (i == 1) {
log.info("输送机{}下发切换导向{}成功", inSsjDevice.getDeviceCode(), agvQueues.get(0).getCtnrType());
}
}
//允许放货 //允许放货
if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 1) { if (!agvQueues.isEmpty() && inSsjDevice.getAllowPut() == 1) {
log.info("设备:{} 位置:{} 任务号:{} 请求放货成功", inSsjDevice.getDeviceCode(), "输送线", agvQueues.get(0).getTaskCode()); log.info("设备:{} 位置:{} 任务号:{} 请求放货成功", inSsjDevice.getDeviceCode(), "输送线", agvQueues.get(0).getTaskCode());
@@ -151,6 +161,7 @@ public class Floor2InOutSsjThread implements Runnable {
jobCallBack.setStatus("0"); jobCallBack.setStatus("0");
jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo())); jobCallBack.setTaskNo(Convert.toLong(mydoJob.getTaskNo()));
jobCallBack.setCreateTime(new Date()); jobCallBack.setCreateTime(new Date());
jobCallBack.setSpare1("0");
jobCallBackService.insertJobCallBack(jobCallBack); jobCallBackService.insertJobCallBack(jobCallBack);
} }
} }

View File

@@ -38,12 +38,13 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
<if test="requestHeaders != null and requestHeaders != ''"> and request_headers = #{requestHeaders}</if> <if test="requestHeaders != null and requestHeaders != ''"> and request_headers = #{requestHeaders}</if>
<if test="requestBody != null and requestBody != ''"> and request_body like concat('%',#{requestBody},'%') </if> <if test="requestBody != null and requestBody != ''"> and request_body like concat('%',#{requestBody},'%') </if>
<if test="responseTime != null and responseTime != ''"> and response_time = #{responseTime}</if> <if test="responseTime != null and responseTime != ''"> and response_time = #{responseTime}</if>
<if test="responseBody != null and responseBody != ''"> and response_body = #{responseBody}</if> <if test="responseBody != null and responseBody != ''"> and response_body like concat('%',#{responseBody},'%')</if>
<if test="responseStatus != null and responseStatus != ''"> and response_status = #{responseStatus}</if> <if test="responseStatus != null and responseStatus != ''"> and response_status = #{responseStatus}</if>
<if test="errorDetails != null and errorDetails != ''"> and error_details = #{errorDetails}</if> <if test="errorDetails != null and errorDetails != ''"> and error_details like concat('%',#{errorDetails},'%')</if>
<if test="duration != null and duration != ''"> and duration = #{duration}</if> <if test="duration != null and duration != ''"> and duration = #{duration}</if>
<if test="isSuccessful != null and isSuccessful != ''"> and Is_successful = #{isSuccessful}</if> <if test="isSuccessful != null and isSuccessful != ''"> and Is_successful = #{isSuccessful}</if>
</where> </where>
order by request_time desc
</select> </select>
<select id="selectRequestLogByRequestId" parameterType="Long" resultMap="RequestLogResult"> <select id="selectRequestLogByRequestId" parameterType="Long" resultMap="RequestLogResult">

View File

@@ -91,4 +91,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
#{id} #{id}
</foreach> </foreach>
</delete> </delete>
<select id="getTopJobCallBack" resultMap="JobCallBackResult">
select top(1) id, type, task_no, mydojob_id, status, create_time, spare1, spare2, spare3 from job_call_back
where status = '0' and spare1 in ('0','1','2')
order by create_time asc
</select>
</mapper> </mapper>

View File

@@ -1,6 +1,16 @@
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px"> <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="接口类型" prop="endpoint">
<el-select v-model="queryParams.endpoint" placeholder="请选择接口类型" clearable>
<el-option
v-for="dict in dict.type.interface_endpoint"
:key="dict.value"
:label="dict.label"
:value="dict.value"
/>
</el-select>
</el-form-item>
<el-form-item label="请求参数" prop="requestBody"> <el-form-item label="请求参数" prop="requestBody">
<el-input <el-input
v-model="queryParams.requestBody" v-model="queryParams.requestBody"
@@ -88,10 +98,10 @@
<el-table-column label="接口名称" align="left" prop="endpoint" /> <el-table-column label="接口名称" align="left" prop="endpoint" />
<el-table-column label="url路径" align="left" prop="requestUrl" /> <el-table-column label="url路径" align="left" prop="requestUrl" />
<el-table-column label="请求方式" align="left" prop="requestMethod" /> <el-table-column label="请求方式" align="left" prop="requestMethod" />
<el-table-column label="请求头信息" align="left" prop="requestHeaders" /> <el-table-column label="请求头信息" align="left" prop="requestHeaders"/>
<el-table-column label="请求参数" align="left" prop="requestBody" /> <el-table-column label="请求参数" align="left" prop="requestBody" :show-overflow-tooltip="true"/>
<el-table-column label="响应时间" align="left" prop="responseTime" /> <el-table-column label="响应时间" align="left" prop="responseTime" />
<el-table-column label="响应主体" align="left" prop="responseBody" /> <el-table-column label="响应主体" align="left" prop="responseBody" :show-overflow-tooltip="true"/>
<el-table-column label="响应状态" align="left" prop="responseStatus" /> <el-table-column label="响应状态" align="left" prop="responseStatus" />
<el-table-column label="错误信息" align="left" prop="errorDetails" /> <el-table-column label="错误信息" align="left" prop="errorDetails" />
<el-table-column label="耗时" align="left" prop="duration" /> <el-table-column label="耗时" align="left" prop="duration" />
@@ -100,7 +110,7 @@
<dict-tag :options="dict.type.interface_status" :value="scope.row.isSuccessful"/> <dict-tag :options="dict.type.interface_status" :value="scope.row.isSuccessful"/>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
<pagination <pagination
@@ -168,7 +178,7 @@ import { listApi, getApi, delApi, addApi, updateApi } from "@/api/device/api"
export default { export default {
name: "Api", name: "Api",
dicts: ['interface_status'], dicts: ['interface_status','interface_endpoint'],
data() { data() {
return { return {
// 遮罩层 // 遮罩层

View File

@@ -35,51 +35,55 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
<!-- <el-row :gutter="10" class="mb8">--> <el-row :gutter="10" class="mb8">
<!-- <el-col :span="1.5">--> <el-col :span="1.5">
<!-- <el-button--> <el-button
<!-- type="primary"--> type="primary"
<!-- plain--> plain
<!-- icon="el-icon-plus"--> icon="el-icon-plus"
<!-- size="mini"--> size="mini"
<!-- @click="handleAdd"--> @click="handleAdd"
<!-- v-hasPermi="['job:mydoJob:add']"--> v-hasPermi="['job:callBack:add']"
<!-- >新增</el-button>--> >新增
<!-- </el-col>--> </el-button>
<!-- <el-col :span="1.5">--> </el-col>
<!-- <el-button--> <el-col :span="1.5">
<!-- type="success"--> <el-button
<!-- plain--> type="success"
<!-- icon="el-icon-edit"--> plain
<!-- size="mini"--> icon="el-icon-edit"
<!-- :disabled="single"--> size="mini"
<!-- @click="handleUpdate"--> :disabled="single"
<!-- v-hasPermi="['job:mydoJob:edit']"--> @click="handleUpdate"
<!-- >修改</el-button>--> v-hasPermi="['job:callBack:edit']"
<!-- </el-col>--> >修改
<!-- <el-col :span="1.5">--> </el-button>
<!-- <el-button--> </el-col>
<!-- type="danger"--> <el-col :span="1.5">
<!-- plain--> <el-button
<!-- icon="el-icon-delete"--> type="danger"
<!-- size="mini"--> plain
<!-- :disabled="multiple"--> icon="el-icon-delete"
<!-- @click="handleDelete"--> size="mini"
<!-- v-hasPermi="['job:mydoJob:remove']"--> :disabled="multiple"
<!-- >删除</el-button>--> @click="handleDelete"
<!-- </el-col>--> v-hasPermi="['job:callBack:remove']"
<!-- <el-col :span="1.5">--> >删除
<!-- <el-button--> </el-button>
<!-- type="warning"--> </el-col>
<!-- plain--> <el-col :span="1.5">
<!-- icon="el-icon-download"--> <el-button
<!-- size="mini"--> type="warning"
<!-- @click="handleExport"--> plain
<!-- v-hasPermi="['job:mydoJob:export']"--> icon="el-icon-download"
<!-- >导出</el-button>--> size="mini"
<!-- </el-col>--> @click="handleExport"
<!-- <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>--> v-hasPermi="['job:callBack:export']"
<!-- </el-row>--> >导出
</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="jobCallBackList" @selection-change="handleSelectionChange"> <el-table v-loading="loading" :data="jobCallBackList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center"/> <el-table-column type="selection" width="55" align="center"/>
@@ -132,25 +136,29 @@
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body> <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px"> <el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="主键" prop="id"> <el-form-item label="主键" prop="id">
<el-input v-model="form.id" placeholder="请输入主键" disabled/> <el-input v-model="form.id" placeholder="请输入主键" style="width: 240px" disabled/>
</el-form-item> </el-form-item>
<el-form-item label="作业ID" prop="jobId"> <el-form-item label="作业ID" prop="jobId">
<el-input v-model="form.mydojobId" placeholder="请输入作业ID"/> <el-input v-model="form.mydojobId" placeholder="请输入作业ID" style="width: 240px"/>
</el-form-item> </el-form-item>
<el-form-item label="任务号" prop="taskNo"> <el-form-item label="任务号" prop="taskNo">
<el-input v-model="form.taskNo" placeholder="请输入任务号"/> <el-input v-model="form.taskNo" placeholder="请输入任务号" style="width: 240px"/>
</el-form-item> </el-form-item>
<el-form-item label="任务类型" prop="type"> <el-form-item label="任务类型" prop="type">
<el-input v-model="form.type" placeholder="请输入任务类型"/> <el-select v-model="form.type" placeholder="请选择任务类型" style="width: 240px">
<el-option v-for="dict in dict.type.job_type" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="回传状态" prop="status"> <el-form-item label="回传状态" prop="status">
<el-input v-model="form.status" placeholder="请输入回传状态"/> <el-select v-model="form.status" placeholder="请选择回传状态" style="width: 240px">
<el-option v-for="dict in dict.type.call_status" :key="dict.value" :label="dict.label" :value="dict.value"></el-option>
</el-select>
</el-form-item> </el-form-item>
<el-form-item label="创建时间" prop="createTime"> <el-form-item label="创建时间" prop="createTime">
<el-input v-model="form.createTime" placeholder="请输入创建时间"/> <el-date-picker v-model="form.createTime" style="width: 240px" type="datetime" value-format="yyyy-MM-dd HH:mm:ss" placeholder="请输入创建时间"></el-date-picker>
</el-form-item> </el-form-item>
<el-form-item label="失败次数" prop="spare1"> <el-form-item label="失败次数" prop="spare1">
<el-input v-model="form.spare1" placeholder="请输入失败次数"/> <el-input v-model="form.spare1" style="width: 240px" placeholder="请输入失败次数"/>
</el-form-item> </el-form-item>
</el-form> </el-form>