修改整体样式,并且完成型号、舷号管理

This commit is contained in:
RenCheng 2025-02-18 19:01:51 +08:00
parent c3837919b7
commit cc26a51744
9 changed files with 1043 additions and 16 deletions

BIN
dist.zip

Binary file not shown.

30
src/api/ship.js Normal file
View File

@ -0,0 +1,30 @@
import { getAction, deleteAction, putAction, postAction, httpAction,uploadAction } from '@/api/manage'
const shipNumCreate = (params)=>postAction("/shipNum/create",params);
const shipNumUpdateById = (params)=>putAction("/shipNum/updateById",params);
const shipNumQueryById = (params)=>getAction("/shipNum/queryById",params);
const shipNumPageList = (params)=>getAction("/shipNum/pageList",params);
const shipNumQueryByModelId = (params)=>getAction("/shipNum/queryByModelId",params);
const shipModelCreate = (params)=>postAction("/shipModel/create",params);
const shipModelUpdateById = (params)=>putAction("/shipModel/updateById",params);
const shipModelQueryById = (params)=>getAction("/shipModel/queryById",params);
const shipModelPageList = (params)=>getAction("/shipModel/pageList",params);
const shipModelQueryByModelId = (params)=>getAction("/shipModel/queryByModelId",params);
const shipModeldeleteById = (params)=>deleteAction("/shipModel/deleteById",params);
export {
shipNumCreate,
shipNumUpdateById,
shipNumQueryById,
shipNumPageList,
shipNumQueryByModelId,
shipModelCreate,
shipModelUpdateById,
shipModelQueryById,
shipModelPageList,
shipModelQueryByModelId,
shipModeldeleteById
}

View File

@ -100,7 +100,7 @@
width: 0;
height: 0;
border: 6px solid transparent;
border-top-color: rgba(0, 0, 0, 0.25);
border-top-color: #1890FF;
transition: all .3s linear;
transform-origin: center;
}
@ -121,7 +121,7 @@
margin: 2px 0;
border-radius: 4px;
outline: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
box-shadow: 0 2px 8px #1890FF;
transition: opacity 0.15s, transform 0.3s !important;
transform-origin: center top !important;
@ -133,7 +133,7 @@
padding: 6px 0;
width: 100%;
font-size: 14px;
color: #565656;
color: #ffffff;
list-style: none;
}
@ -169,7 +169,7 @@
margin: 2px 0;
border-radius: 4px;
outline: none;
box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);
box-shadow: 0 2px 8px #1890FF;
transition: opacity 0.15s, transform 0.3s !important;
transform-origin: center top !important;
@ -249,11 +249,11 @@
.cascader-menu-list::-webkit-scrollbar-thumb:vertical,
.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical {
background-color: #b8b8b8;
background-color: #ffffff;
border-radius: 4px;
}
.cascader-menu-list::-webkit-scrollbar-thumb:vertical:hover,
.area-selectable-list-wrap::-webkit-scrollbar-thumb:vertical:hover {
background-color: #777;
background-color: #ffffff;
}

View File

@ -1,12 +1,12 @@
@bordercolor : #C8C8C8;
@headercolor : #1f232a;
@backcolor : #454959;
@headercolor : #ffffff;
@backcolor : #ffffff;
@inpuitbackcolor : #ffffff;
@labelDeaultColor : #282828;
@defaultWhiteColor: #eeeeee;
@labelDeaultColor : #000000;
@defaultWhiteColor: #ffffff;
@fontfamily : 'Microsoft YaHei';
@tableheadColor : #e5e8eb;
@tableColor : #575D63;
@tableheadColor : #fafafa;
@tableColor : #000000;
/* 滚动条优化 start */
::-webkit-scrollbar {
@ -670,7 +670,7 @@ textarea,
.ant-btn:hover,
.ant-btn:active,
.ant-btn:focus {
background: url('~@/assets/img/buttonSelect.png') !important;
//background: url('~@/assets/img/buttonSelect.png') !important;
}
.ant-menu-light {

View File

@ -23,6 +23,6 @@ i {
cursor: pointer;
}
.trcolor{
background-color: rgba(255, 192, 203, 0.31);
background-color: #1890FF;
color:red;
}

View File

@ -209,10 +209,10 @@
.ant-modal-close {
right: 56px;
color: rgba(0, 0, 0, 0.45);
color: rgba(255, 255, 255, 0.45);
&:hover {
color: rgba(0, 0, 0, 0.75);
color: rgb(255, 255, 255);
}
}
}

View File

@ -0,0 +1,199 @@
<template>
<a-modal
:title="title"
:width="800"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleOk"
@cancel="handleCancel"
okText="保存并安排任务"
cancelText="关闭">
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item label="任务名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<a-input v-decorator="['quartzName']" ></a-input>
</a-form-item>
<a-form-item label="同步策略名称" :labelCol="labelCol" :wrapperCol="wrapperCol">
<j-select-multiple v-model="dataStrategySelected" :options="strategys"/>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="cron表达式">
<j-cron ref="innerVueCron" v-decorator="['cronExpression', { initialValue: '* * * * * ? *' }]" @change="setCorn"></j-cron>
</a-form-item>
<a-form-item
:labelCol="labelCol"
:wrapperCol="wrapperCol"
label="描述">
<a-textarea placeholder="请输入描述" :rows="3" v-decorator="['description', {}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import { httpAction } from '@/api/manage'
import JCron from "@/components/jeecg/JCron";
import JSelectMultiple from '@/components/jeecg/JSelectMultiple'
import pick from 'lodash.pick'
// import moment from "moment"
export default {
name: "QuartzJobModal",
components: {
JCron,
JSelectMultiple
},
data () {
return {
title:"操作",
buttonStyle: 'solid',
visible: false,
status:'',
model: {},
labelCol: {
xs: { span: 24 },
sm: { span: 5 },
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 16 },
},
cron: {
label: '',
value: ''
},
confirmLoading: false,
form: this.$form.createForm(this),
validatorRules: {
cron: {
rules: [{
required: true, message: '请输入cron表达式!'
}]
}
},
url: {
add: "/sys/quartzJob/add",
edit: "/sys/quartzJob/edit",
queryEditStrategyList:"/sys/quartzJob/editSynchronSelectDetails",
queryAddStrategyList:"/sys/quartzJob/addSynchronSelectDetails"
},
strategys:[],
dataStrategySelected:'',
idcDataStrategyId:""
}
},
created () {
},
methods: {
add () {
this.edit({});
},
edit (record) {
let that = this;
that.form.resetFields();
this.model = Object.assign({},record);
this.visible = true;
this.$nextTick(() => {
if(this.model.id){
this.status = this.model.status;
this.getEditStrategyList();
}else{
this.getAddStrategyList();
}
this.dataStrategySelected = this.model.strategyId;
this.form.setFieldsValue(pick(this.model,'cronExpression','description','quartzName'));
});
},
close () {
this.$emit('close');
this.visible = false;
},
//add
getAddStrategyList(){
httpAction(this.url.queryAddStrategyList,{},"get").then((res)=>{
if(res.success){
this.strategys=res.result;
}
});
},
//edit
getEditStrategyList(){
httpAction(this.url.queryEditStrategyList,{},"get").then((res)=>{
if(res.success){
this.strategys=res.result;
}
});
},
strategyChange(value){
this.idcDataStrategyId = value;
},
handleOk () {
const that = this;
//
this.form.validateFields((err, values) => {
console.log('values',values)
if (!err) {
if (typeof values.cronExpression == "undefined" || Object.keys(values.cronExpression).length==0 ) {
this.$message.warning('请输入cron表达式!');
return false;
}
that.confirmLoading = true;
let httpurl = '';
let method = '';
if(!this.model.id){
httpurl+=this.url.add;
method = 'post';
}else{
httpurl+=this.url.edit;
method = 'put';
}
httpAction(httpurl, {quartzName:values.quartzName,strategyId:this.dataStrategySelected,cronExpression:values.cronExpression,description:values.description,id:this.model.id,status:this.status},method).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.$emit('ok');
}else{
that.$message.warning(res.message);
}
}).finally(() => {
that.confirmLoading = false;
that.close();
})
}
})
},
handleCancel () {
this.close()
},
setCorn(data){
console.log('data)',data);
this.$nextTick(() => {
this.model.cronExpression = data;
})
if (Object.keys(data).length==0) {
this.$message.warning('请输入cron表达式!');
}
},
validateCron(rule, value, callback){
if(!value){
callback()
}else if (Object.keys(value).length==0) {
callback("请输入cron表达式!");
}
},
}
}
</script>
<style scoped>
.disabled{
pointer-events: none;
}
</style>

399
src/views/ship/shipMode.vue Normal file
View File

@ -0,0 +1,399 @@
<template>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="30">
<a-col :md="6" :sm="10">
<a-form-item label="定时任务名称">
<a-input placeholder="请输入定时任务名称" v-model="queryParam.quartzName"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10">
<a-form-item label="同步策略名称">
<a-input placeholder="请输入同步策略名称" v-model="queryParam.strategyName"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10">
<a-form-item label="任务状态">
<a-select style="width: 220px" v-model="queryParam.status" placeholder="请选择状态">
<a-select-option value="">全部</a-select-option>
<a-select-option value="0">正常</a-select-option>
<a-select-option value="-1">停止</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10" >
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" v-has="'cont:btn'" icon="plus">新增</a-button>
<a-button type="primary" v-has="'cont:btn'" icon="download" @click="handleExportXls('定时任务信息')">导出</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" v-has="'cont:btn'" icon="import">导入</a-button>
</a-upload>
<a-button type="primary" v-has="'cont:btn'" @click="batchDel" icon="del">批量删除</a-button>
<a-button type="primary" v-has="'cont:btn'" @click="batchStart" icon="start" style="margin-left: 8px">批量启动</a-button>
<a-button type="primary" v-has="'cont:btn'" @click="pauseJobBatch" icon="pauseJob" style="margin-left: 8px">批量暂停</a-button>
</div>
<!-- table区域-begin -->
<div style="height:615px;overflow-y:auto;">
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
<i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
</div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys,onChange: onSelectChange}"
@change="handleTableChange">
<!-- :locale="myLocale"-->
<div slot="expandedRowRender" slot-scope="record" style="margin: 0">
<div style="margin-bottom: 5px">
<span v-for="(item,index) in record.strategyName.split(',')" :key="index">
<a-badge status="success" style="vertical-align: middle;"/><span>{{ item }}<br></span>
</span>
</div>
</div>
<!-- 字符串超长截取省略号显示-->
<span slot="description" slot-scope="text">
<j-ellipsis :value="text" :length="20" />
</span>
<span slot="parameterRender" slot-scope="text">
<j-ellipsis :value="text" :length="20" />
</span>
<span slot="action" slot-scope="text, record">
<a @click="resumeJob(record)" v-if="record.status==-1" v-has="'cont:btn'">启动</a>
<a @click="pauseJob(record)" v-if="record.status==0" v-has="'cont:btn'">停止</a>
<a-divider type="vertical" v-has="'cont:btn'" />
<a-dropdown v-has="'cont:btn'">
<a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
<a-menu slot="overlay">
<a-menu-item><a @click="executeImmediately(record)">立即执行</a></a-menu-item>
<a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
<a-menu-item>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</a-menu-item>
</a-menu>
</a-dropdown>
<a-divider type="vertical" v-has="'cont:btn'" />
<a @click="handleDetail(record)">详情</a>
</span>
<!-- 状态渲染模板 -->
<template slot="customRenderStatus" slot-scope="status">
<a-tag v-if="status==0" color="green">已启动</a-tag>
<a-tag v-if="status==-1" color="orange">已暂停</a-tag>
</template>
</a-table>
</div>
<!-- table区域-end -->
<!-- 表单区域 -->
<quartzJob-modal ref="modalForm" @ok="modalFormOk"></quartzJob-modal>
</a-card>
</template>
<script>
import QuartzJobModal from './modules/QuartzJobModal'
import { getAction } from '@/api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import JEllipsis from "@/components/jeecg/JEllipsis";
export default {
name: "QuartzJobList",
mixins:[JeecgListMixin],
components: {
QuartzJobModal,
JEllipsis,
VNodes: {
functional: true,
render: (h, ctx) => ctx.props.vnodes,
},
},
data () {
return {
description: '定时任务在线管理',
dataSources: [],
//
queryParam: {},
//myLocale: {emptyText: ''},
//
columns: [
{
title: '#',
dataIndex: '',
key:'rowIndex',
width:60,
align:"center",
customRender:function (t,r,index) {
return parseInt(index)+1;
}
},
{
title: '定时任务名称',
align:"center",
dataIndex: 'quartzName',
sorter: true,
},
{
title: 'cron表达式',
align:"center",
dataIndex: 'cronExpression'
},
{
title: '描述',
align:"center",
width: 250,
dataIndex: 'description',
scopedSlots: {customRender: 'description'},
},
{
title: '状态',
align:"center",
dataIndex: 'status',
scopedSlots: { customRender: 'customRenderStatus' },
filterMultiple: false,
filters: [
{ text: '已启动', value: '0' },
{ text: '已暂停', value: '-1' },
]
},
{
title: '操作',
dataIndex: 'action',
align:"center",
width:180,
scopedSlots: { customRender: 'action' },
}
],
url: {
list: "/sys/quartzJob/list",
delete: "/sys/quartzJob/delete",
deleteBatch: "/sys/quartzJob/deleteBatch",
startBatch: "/sys/quartzJob/startBatch",
pauseJobBatch: "/sys/quartzJob/pauseJobBatch",
pause: "/sys/quartzJob/pause",
resume: "/sys/quartzJob/resume",
exportXlsUrl: "sys/quartzJob/exportXls",
importExcelUrl: "sys/quartzJob/importExcel",
execute: "sys/quartzJob/execute",
},
}
},
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
}
},
created () {
},
methods: {
//handleTableChange
handleTableChange(pagination, filters, sorter) {
//
//TODO
if (Object.keys(sorter).length > 0) {
this.isorter.column = sorter.field;
this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
}
//
//this.filters.status = filters.status[0];
this.ipagination = pagination;
this.loadData();
},
pauseJobBatch: function () {
if(!this.url.pauseJobBatch){
this.$message.error("请设置url.pauseJobBatch属性!")
return
}
let content_ = '是否暂停选中数据?';
if (this.selectedRowKeys.length <= 0) {
content_ = '是否暂停全部数据?'
}
var ids = "";
for (var a = 0; a < this.selectedRowKeys.length; a++) {
ids += this.selectedRowKeys[a] + ",";
}
var that = this;
this.$confirm({
title: "确认暂停",
content: content_,
onOk: function () {
that.loading = true;
getAction(that.url.pauseJobBatch, {ids: ids}).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
}).finally(() => {
that.loading = false;
});
}
});
},
loadData(arg) {
if(!this.url.list){
this.$message.error("请设置url.list属性!")
return
}
// 1
if (arg === 1) {
this.ipagination.current = 1;
}
let params = this.getQueryParams();//
let strategyName = params.strategyName;
let status = "";
if(this.idcDataSourceTableId){
strategyName = this.idcDataSourceSelected + "-" + this.sourceUserId + "-" + this.idcDataSourceTableId;
}else if(this.sourceUserId && this.sourceUserId.length > 0){
strategyName = this.idcDataSourceSelected + "-" + this.sourceUserId;
}else if(this.idcDataSourceSelected){
strategyName = this.idcDataSourceSelected;
}
this.$set(this.queryParam,'strategyName',strategyName);
console.log(params)
if(params.status){
status = params.status;
}
this.loading = true;
getAction(this.url.list, {quartzName:params.quartzName,strategyName:strategyName,status:status,pageNo:params.pageNo,pageSize:params.pageSize,order:params.order,column:params.column}).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for------------
this.dataSource = res.result.records||res.result;
if(res.result.total)
{
this.ipagination.total = res.result.total;
}
//update-end---author:zhangyafei Date:20201118 for------------
}
if(res.code===510){
this.$message.warning(res.message)
}
this.loading = false;
})
},
batchStart: function () {
if(!this.url.startBatch){
this.$message.error("请设置url.startBatch属性!")
return
}
let content_ = '是否启动选中数据?';
if (this.selectedRowKeys.length <= 0) {
content_ = '是否启动全部数据?'
}
var ids = "";
for (var a = 0; a < this.selectedRowKeys.length; a++) {
ids += this.selectedRowKeys[a] + ",";
}
var that = this;
this.$confirm({
title: "确认启动",
content: content_,
onOk: function () {
that.loading = true;
getAction(that.url.startBatch, {ids: ids}).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
}).finally(() => {
that.loading = false;
});
}
});
},
pauseJob: function(record){
var that = this;
//
this.$confirm({
title:"确认暂停",
content:"是否暂停选中任务?",
onOk: function(){
getAction(that.url.pause,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
},
resumeJob: function(record){
var that = this;
//
this.$confirm({
title:"确认启动",
content:"是否启动选中任务?",
onOk: function(){
getAction(that.url.resume,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
},
executeImmediately(record){
var that = this;
//
this.$confirm({
title:"确认提示",
content:"是否立即执行任务?",
onOk: function(){
getAction(that.url.execute,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
}
}
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>

399
src/views/ship/shipNum.vue Normal file
View File

@ -0,0 +1,399 @@
<template>
<a-card :bordered="false">
<!-- 查询区域 -->
<div class="table-page-search-wrapper">
<a-form layout="inline" @keyup.enter.native="searchQuery">
<a-row :gutter="30">
<a-col :md="6" :sm="10">
<a-form-item label="定时任务名称">
<a-input placeholder="请输入定时任务名称" v-model="queryParam.quartzName"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10">
<a-form-item label="同步策略名称">
<a-input placeholder="请输入同步策略名称" v-model="queryParam.strategyName"></a-input>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10">
<a-form-item label="任务状态">
<a-select style="width: 220px" v-model="queryParam.status" placeholder="请选择状态">
<a-select-option value="">全部</a-select-option>
<a-select-option value="0">正常</a-select-option>
<a-select-option value="-1">停止</a-select-option>
</a-select>
</a-form-item>
</a-col>
<a-col :md="6" :sm="10" >
<span style="float: left;overflow: hidden;" class="table-page-search-submitButtons">
<a-button type="primary" @click="searchQuery" icon="search">查询</a-button>
<a-button type="primary" @click="searchReset" icon="reload" style="margin-left: 8px">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
<!-- 操作按钮区域 -->
<div class="table-operator">
<a-button @click="handleAdd" type="primary" v-has="'cont:btn'" icon="plus">新增</a-button>
<a-button type="primary" v-has="'cont:btn'" icon="download" @click="handleExportXls('定时任务信息')">导出</a-button>
<a-upload name="file" :showUploadList="false" :multiple="false" :headers="tokenHeader" :action="importExcelUrl" @change="handleImportExcel">
<a-button type="primary" v-has="'cont:btn'" icon="import">导入</a-button>
</a-upload>
<a-button type="primary" v-has="'cont:btn'" @click="batchDel" icon="del">批量删除</a-button>
<a-button type="primary" v-has="'cont:btn'" @click="batchStart" icon="start" style="margin-left: 8px">批量启动</a-button>
<a-button type="primary" v-has="'cont:btn'" @click="pauseJobBatch" icon="pauseJob" style="margin-left: 8px">批量暂停</a-button>
</div>
<!-- table区域-begin -->
<div style="height:615px;overflow-y:auto;">
<div class="ant-alert ant-alert-info" style="margin-bottom: 16px;">
<i class="anticon anticon-info-circle ant-alert-icon"></i> 已选择 <a style="font-weight: 600">{{ selectedRowKeys.length }}</a>
<a style="margin-left: 24px" @click="onClearSelected">清空</a>
</div>
<a-table
ref="table"
size="middle"
bordered
rowKey="id"
:columns="columns"
:dataSource="dataSource"
:pagination="ipagination"
:loading="loading"
:rowSelection="{selectedRowKeys: selectedRowKeys,onChange: onSelectChange}"
@change="handleTableChange">
<!-- :locale="myLocale"-->
<div slot="expandedRowRender" slot-scope="record" style="margin: 0">
<div style="margin-bottom: 5px">
<span v-for="(item,index) in record.strategyName.split(',')" :key="index">
<a-badge status="success" style="vertical-align: middle;"/><span>{{ item }}<br></span>
</span>
</div>
</div>
<!-- 字符串超长截取省略号显示-->
<span slot="description" slot-scope="text">
<j-ellipsis :value="text" :length="20" />
</span>
<span slot="parameterRender" slot-scope="text">
<j-ellipsis :value="text" :length="20" />
</span>
<span slot="action" slot-scope="text, record">
<a @click="resumeJob(record)" v-if="record.status==-1" v-has="'cont:btn'">启动</a>
<a @click="pauseJob(record)" v-if="record.status==0" v-has="'cont:btn'">停止</a>
<a-divider type="vertical" v-has="'cont:btn'" />
<a-dropdown v-has="'cont:btn'">
<a class="ant-dropdown-link">更多 <a-icon type="down" /></a>
<a-menu slot="overlay">
<a-menu-item><a @click="executeImmediately(record)">立即执行</a></a-menu-item>
<a-menu-item><a @click="handleEdit(record)">编辑</a></a-menu-item>
<a-menu-item>
<a-popconfirm title="确定删除吗?" @confirm="() => handleDelete(record.id)">
<a>删除</a>
</a-popconfirm>
</a-menu-item>
</a-menu>
</a-dropdown>
<a-divider type="vertical" v-has="'cont:btn'" />
<a @click="handleDetail(record)">详情</a>
</span>
<!-- 状态渲染模板 -->
<template slot="customRenderStatus" slot-scope="status">
<a-tag v-if="status==0" color="green">已启动</a-tag>
<a-tag v-if="status==-1" color="orange">已暂停</a-tag>
</template>
</a-table>
</div>
<!-- table区域-end -->
<!-- 表单区域 -->
<quartzJob-modal ref="modalForm" @ok="modalFormOk"></quartzJob-modal>
</a-card>
</template>
<script>
import QuartzJobModal from './modules/QuartzJobModal'
import { getAction } from '@/api/manage'
import { JeecgListMixin } from '@/mixins/JeecgListMixin'
import JEllipsis from "@/components/jeecg/JEllipsis";
export default {
name: "QuartzJobList",
mixins:[JeecgListMixin],
components: {
QuartzJobModal,
JEllipsis,
VNodes: {
functional: true,
render: (h, ctx) => ctx.props.vnodes,
},
},
data () {
return {
description: '定时任务在线管理',
dataSources: [],
//
queryParam: {},
//myLocale: {emptyText: ''},
//
columns: [
{
title: '#',
dataIndex: '',
key:'rowIndex',
width:60,
align:"center",
customRender:function (t,r,index) {
return parseInt(index)+1;
}
},
{
title: '定时任务名称',
align:"center",
dataIndex: 'quartzName',
sorter: true,
},
{
title: 'cron表达式',
align:"center",
dataIndex: 'cronExpression'
},
{
title: '描述',
align:"center",
width: 250,
dataIndex: 'description',
scopedSlots: {customRender: 'description'},
},
{
title: '状态',
align:"center",
dataIndex: 'status',
scopedSlots: { customRender: 'customRenderStatus' },
filterMultiple: false,
filters: [
{ text: '已启动', value: '0' },
{ text: '已暂停', value: '-1' },
]
},
{
title: '操作',
dataIndex: 'action',
align:"center",
width:180,
scopedSlots: { customRender: 'action' },
}
],
url: {
list: "/sys/quartzJob/list",
delete: "/sys/quartzJob/delete",
deleteBatch: "/sys/quartzJob/deleteBatch",
startBatch: "/sys/quartzJob/startBatch",
pauseJobBatch: "/sys/quartzJob/pauseJobBatch",
pause: "/sys/quartzJob/pause",
resume: "/sys/quartzJob/resume",
exportXlsUrl: "sys/quartzJob/exportXls",
importExcelUrl: "sys/quartzJob/importExcel",
execute: "sys/quartzJob/execute",
},
}
},
computed: {
importExcelUrl: function () {
return `${window._CONFIG['domianURL']}/${this.url.importExcelUrl}`;
}
},
created () {
},
methods: {
//handleTableChange
handleTableChange(pagination, filters, sorter) {
//
//TODO
if (Object.keys(sorter).length > 0) {
this.isorter.column = sorter.field;
this.isorter.order = "ascend" == sorter.order ? "asc" : "desc"
}
//
//this.filters.status = filters.status[0];
this.ipagination = pagination;
this.loadData();
},
pauseJobBatch: function () {
if(!this.url.pauseJobBatch){
this.$message.error("请设置url.pauseJobBatch属性!")
return
}
let content_ = '是否暂停选中数据?';
if (this.selectedRowKeys.length <= 0) {
content_ = '是否暂停全部数据?'
}
var ids = "";
for (var a = 0; a < this.selectedRowKeys.length; a++) {
ids += this.selectedRowKeys[a] + ",";
}
var that = this;
this.$confirm({
title: "确认暂停",
content: content_,
onOk: function () {
that.loading = true;
getAction(that.url.pauseJobBatch, {ids: ids}).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
}).finally(() => {
that.loading = false;
});
}
});
},
loadData(arg) {
if(!this.url.list){
this.$message.error("请设置url.list属性!")
return
}
// 1
if (arg === 1) {
this.ipagination.current = 1;
}
let params = this.getQueryParams();//
let strategyName = params.strategyName;
let status = "";
if(this.idcDataSourceTableId){
strategyName = this.idcDataSourceSelected + "-" + this.sourceUserId + "-" + this.idcDataSourceTableId;
}else if(this.sourceUserId && this.sourceUserId.length > 0){
strategyName = this.idcDataSourceSelected + "-" + this.sourceUserId;
}else if(this.idcDataSourceSelected){
strategyName = this.idcDataSourceSelected;
}
this.$set(this.queryParam,'strategyName',strategyName);
console.log(params)
if(params.status){
status = params.status;
}
this.loading = true;
getAction(this.url.list, {quartzName:params.quartzName,strategyName:strategyName,status:status,pageNo:params.pageNo,pageSize:params.pageSize,order:params.order,column:params.column}).then((res) => {
if (res.success) {
//update-begin---author:zhangyafei Date:20201118 for------------
this.dataSource = res.result.records||res.result;
if(res.result.total)
{
this.ipagination.total = res.result.total;
}
//update-end---author:zhangyafei Date:20201118 for------------
}
if(res.code===510){
this.$message.warning(res.message)
}
this.loading = false;
})
},
batchStart: function () {
if(!this.url.startBatch){
this.$message.error("请设置url.startBatch属性!")
return
}
let content_ = '是否启动选中数据?';
if (this.selectedRowKeys.length <= 0) {
content_ = '是否启动全部数据?'
}
var ids = "";
for (var a = 0; a < this.selectedRowKeys.length; a++) {
ids += this.selectedRowKeys[a] + ",";
}
var that = this;
this.$confirm({
title: "确认启动",
content: content_,
onOk: function () {
that.loading = true;
getAction(that.url.startBatch, {ids: ids}).then((res) => {
if (res.success) {
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
} else {
that.$message.warning(res.message);
}
}).finally(() => {
that.loading = false;
});
}
});
},
pauseJob: function(record){
var that = this;
//
this.$confirm({
title:"确认暂停",
content:"是否暂停选中任务?",
onOk: function(){
getAction(that.url.pause,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
},
resumeJob: function(record){
var that = this;
//
this.$confirm({
title:"确认启动",
content:"是否启动选中任务?",
onOk: function(){
getAction(that.url.resume,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
},
executeImmediately(record){
var that = this;
//
this.$confirm({
title:"确认提示",
content:"是否立即执行任务?",
onOk: function(){
getAction(that.url.execute,{id:record.id}).then((res)=>{
if(res.success){
that.$message.success(res.message);
that.loadData();
that.onClearSelected();
}else{
that.$message.warning(res.message);
}
});
}
});
}
}
}
</script>
<style scoped>
@import '~@assets/less/common.less';
</style>