22 changed files with 231 additions and 23 deletions
-
42src/src/main/java/com/my/graphiteDigesterBg/api/ApiOperationLog.java
-
8src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecord.java
-
2src/src/main/java/com/my/graphiteDigesterBg/diframe/DiActiveRecordCriteria.java
-
3src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTask.java
-
14src/src/main/java/com/my/graphiteDigesterBg/diframe/DiTaskBase.java
-
11src/src/main/java/com/my/graphiteDigesterBg/diframe/api/DiApiTask.java
-
12src/src/main/java/com/my/graphiteDigesterBg/diframe/mapper/DiActiveRecordMapper.java
-
32src/src/main/java/com/my/graphiteDigesterBg/model/MdbOperationLog.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDigestion.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorClose.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskDoorOpen.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskHeating.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskLiquidAdd.java
-
2src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleAdd.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToHeatPlate.java
-
2src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleMoveToLiquidPlate.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskSampleTakeOut.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskStartReset.java
-
3src/src/main/java/com/my/graphiteDigesterBg/task/TaskStopReset.java
-
4src/src/main/java/com/my/graphiteDigesterBg/task/TaskTubeMoveToErrorSlot.java
-
86src/web/src/pages/main/contents/History.vue
-
5src/web/src/utils/ApiClient.js
@ -0,0 +1,42 @@ |
|||||
|
package com.my.graphiteDigesterBg.api; |
||||
|
import com.my.graphiteDigesterBg.diframe.DiActiveRecord; |
||||
|
import com.my.graphiteDigesterBg.diframe.DiActiveRecordCriteria; |
||||
|
import com.my.graphiteDigesterBg.diframe.DiApiControllerBase; |
||||
|
import com.my.graphiteDigesterBg.diframe.DiApiResponse; |
||||
|
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; |
||||
|
import com.my.graphiteDigesterBg.model.MdbDigestionTask; |
||||
|
import com.my.graphiteDigesterBg.model.MdbOperationLog; |
||||
|
import org.springframework.stereotype.Controller; |
||||
|
import org.springframework.web.bind.annotation.PostMapping; |
||||
|
import org.springframework.web.bind.annotation.RequestBody; |
||||
|
import org.springframework.web.bind.annotation.ResponseBody; |
||||
|
import java.util.ArrayList; |
||||
|
import java.util.Map; |
||||
|
@Controller |
||||
|
public class ApiOperationLog extends DiApiControllerBase { |
||||
|
@ResponseBody |
||||
|
@PostMapping("/api/operation-log/list") |
||||
|
public DiApiResponse list(@RequestBody Map<String,Object> params ) { |
||||
|
Integer offset = (Integer)params.get("offset"); |
||||
|
Integer limit = (Integer)params.get("limit"); |
||||
|
|
||||
|
var criteria = new DiActiveRecordCriteria(); |
||||
|
criteria.limit = limit == null ? 10 : limit; |
||||
|
criteria.offset = offset == null ? 0 : offset; |
||||
|
var logs = DiActiveRecord.find(MdbOperationLog.class, criteria); |
||||
|
|
||||
|
var list = new ArrayList<Map<String,Object>>(); |
||||
|
for ( var log : logs ) { |
||||
|
var map = log.toMap(); |
||||
|
map.put("user", null); |
||||
|
if ( 0 != log.userId ) { |
||||
|
var user = DiActiveRecord.findOne(DiMdbUser.class, log.userId); |
||||
|
map.put("user", user.toMap()); |
||||
|
} |
||||
|
list.add(map); |
||||
|
} |
||||
|
|
||||
|
var total = DiActiveRecord.count(MdbOperationLog.class, criteria); |
||||
|
return this.success(Map.of("list",list, "total", total)); |
||||
|
} |
||||
|
} |
@ -0,0 +1,32 @@ |
|||||
|
package com.my.graphiteDigesterBg.model; |
||||
|
import com.my.graphiteDigesterBg.diframe.ActiveRecordField; |
||||
|
import com.my.graphiteDigesterBg.diframe.DiActiveRecord; |
||||
|
import com.my.graphiteDigesterBg.diframe.model.DiMdbUser; |
||||
|
|
||||
|
public class MdbOperationLog extends DiActiveRecord { |
||||
|
@ActiveRecordField |
||||
|
public Integer id; |
||||
|
|
||||
|
@ActiveRecordField |
||||
|
public Integer userId; |
||||
|
|
||||
|
@ActiveRecordField |
||||
|
public String content; |
||||
|
|
||||
|
@ActiveRecordField |
||||
|
public Integer time; |
||||
|
|
||||
|
// get table name |
||||
|
public static String getTableName() { |
||||
|
return "app_operation_logs"; |
||||
|
} |
||||
|
|
||||
|
// log |
||||
|
public static void log(DiMdbUser user, String content, Object ... args ) { |
||||
|
var log = new MdbOperationLog(); |
||||
|
log.userId = user.id; |
||||
|
log.content = String.format(content, args); |
||||
|
log.time = (int)(System.currentTimeMillis() / 1000); |
||||
|
log.save(); |
||||
|
} |
||||
|
} |
@ -1,29 +1,75 @@ |
|||||
<template> |
<template> |
||||
<div class="p-1"> |
<div class="p-1"> |
||||
<a-table :dataSource="dataSource" :columns="columns"></a-table> |
|
||||
</div> |
|
||||
|
<a-table |
||||
|
:pagination="pagination" |
||||
|
:dataSource="dataSource" |
||||
|
:columns="columns" |
||||
|
@change="actionTableChange" |
||||
|
> |
||||
|
<template #bodyCell="{ column, record }"> |
||||
|
<template v-if="column.key === 'user'"> |
||||
|
{{ record.user.account }} |
||||
|
</template> |
||||
|
<template v-else-if="column.key === 'time'"> |
||||
|
{{ formatTime(record.time) }} |
||||
</template> |
</template> |
||||
|
</template> |
||||
|
</a-table> |
||||
|
</div> |
||||
|
</template> |
||||
<script setup> |
<script setup> |
||||
import { ref } from 'vue'; |
|
||||
|
import ApiClient from '@/utils/ApiClient'; |
||||
|
import { onMounted, ref } from 'vue'; |
||||
/** @var {Array<Object>} */ |
/** @var {Array<Object>} */ |
||||
const columns = [ |
const columns = [ |
||||
{key:'account',dataIndex:'account',title:'用户',align:'center'}, |
|
||||
{key:'slot',dataIndex:'slot',title:'试管架',align:'center'}, |
|
||||
{key:'action',dataIndex:'action',title:'动作',align:'center'}, |
|
||||
{key:'createdAt',dataIndex: 'createdAt',title:'时间',align:'center'}, |
|
||||
|
{key:'user',dataIndex:'user',title:'用户',align:'left'}, |
||||
|
{key:'content',dataIndex:'content',title:'操作',align:'left'}, |
||||
|
{key:'time',dataIndex: 'time',title:'时间',align:'right'}, |
||||
]; |
]; |
||||
/** @var {Array<Object>} */ |
/** @var {Array<Object>} */ |
||||
const dataSource = ref([ |
|
||||
{account:'admin',slot:'A-1',action:'加入试管',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加酸:硫酸',createdAt:'2021-08-01 12:00:00'}, |
|
||||
{account:'admin',slot:'A-1',action:'加热: 270℃ 15分钟',createdAt:'2021-08-01 12:00:00'}, |
|
||||
]); |
|
||||
|
const dataSource = ref([]); |
||||
|
/** @var {Object} */ |
||||
|
const pagination = ref({ |
||||
|
current: 1, |
||||
|
pageSize: 10, |
||||
|
total: 0, |
||||
|
showSizeChanger: false, |
||||
|
}); |
||||
|
// on mounted |
||||
|
onMounted(mounted); |
||||
|
|
||||
|
// on mounted |
||||
|
async function mounted() { |
||||
|
await refresh(); |
||||
|
} |
||||
|
|
||||
|
// format time |
||||
|
function formatTime(time) { |
||||
|
let date = new Date(time * 1000); |
||||
|
let year = date.getFullYear(); |
||||
|
let month = (date.getMonth()+1).toString().padStart(2,'0'); |
||||
|
let day = (date.getDate()).toString().padStart(2,'0'); |
||||
|
let hour = (date.getHours()).toString().padStart(2,'0'); |
||||
|
let minute = (date.getMinutes()).toString().padStart(2,'0'); |
||||
|
let second = (date.getSeconds()).toString().padStart(2,'0'); |
||||
|
return `${year}-${month}-${day} ${hour}:${minute}:${second}`; |
||||
|
} |
||||
|
|
||||
|
// refresh |
||||
|
async function refresh() { |
||||
|
let client = ApiClient.getClient(); |
||||
|
let response = await client.operationLogList({ |
||||
|
offset : (pagination.value.current-1)*pagination.value.pageSize, |
||||
|
limit : pagination.value.pageSize, |
||||
|
}); |
||||
|
dataSource.value = response.list; |
||||
|
pagination.value.total = response.total; |
||||
|
} |
||||
|
|
||||
|
// action table change |
||||
|
async function actionTableChange(page) { |
||||
|
pagination.value.current = page.current; |
||||
|
pagination.value.pageSize = page.pageSize; |
||||
|
await refresh(); |
||||
|
} |
||||
</script> |
</script> |
Write
Preview
Loading…
Cancel
Save
Reference in new issue