添加培训

This commit is contained in:
zhangyanan 2025-10-17 20:25:14 +08:00
parent b88b8587f2
commit 0a0ea2de88
8 changed files with 1163 additions and 0 deletions

View File

@ -0,0 +1,86 @@
import { axios } from '@/utils/request'
/**
* 查询培训
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataPage (parameter) {
return axios({
url: '/scrTrainData/page',
method: 'get',
params: parameter
})
}
/**
* 培训列表
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataList (parameter) {
return axios({
url: '/scrTrainData/list',
method: 'get',
params: parameter
})
}
/**
* 添加培训
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataAdd (parameter) {
return axios({
url: '/scrTrainData/add',
method: 'post',
data: parameter
})
}
/**
* 编辑培训
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataEdit (parameter) {
return axios({
url: '/scrTrainData/edit',
method: 'post',
data: parameter
})
}
/**
* 删除培训
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataDelete (parameter) {
return axios({
url: '/scrTrainData/delete',
method: 'post',
data: parameter
})
}
/**
* 导出培训
*
* @author 1
* @date 2025-10-17 19:55:20
*/
export function scrTrainDataExport (parameter) {
return axios({
url: '/scrTrainData/export',
method: 'get',
params: parameter,
responseType: 'blob'
})
}

View File

@ -0,0 +1,86 @@
import { axios } from '@/utils/request'
/**
* 查询培训安排
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainSchePage (parameter) {
return axios({
url: '/scrTrainSche/page',
method: 'get',
params: parameter
})
}
/**
* 培训安排列表
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainScheList (parameter) {
return axios({
url: '/scrTrainSche/list',
method: 'get',
params: parameter
})
}
/**
* 添加培训安排
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainScheAdd (parameter) {
return axios({
url: '/scrTrainSche/add',
method: 'post',
data: parameter
})
}
/**
* 编辑培训安排
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainScheEdit (parameter) {
return axios({
url: '/scrTrainSche/edit',
method: 'post',
data: parameter
})
}
/**
* 删除培训安排
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainScheDelete (parameter) {
return axios({
url: '/scrTrainSche/delete',
method: 'post',
data: parameter
})
}
/**
* 导出培训安排
*
* @author 1
* @date 2025-10-17 20:13:05
*/
export function scrTrainScheExport (parameter) {
return axios({
url: '/scrTrainSche/export',
method: 'get',
params: parameter,
responseType: 'blob'
})
}

View File

@ -0,0 +1,136 @@
<template>
<a-modal
title="新增"
:width="900"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleSubmit"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item
label="月份"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-month-picker show-time style="width: 100%" placeholder="请选择月份" v-decorator="['happenTime',{rules: [{ required: true, message: '请选择月份' }]}]" @change="happenTimeOnChange"/>
</a-form-item>
<a-form-item
label="培训类型"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入培训类型" v-decorator="['type', {rules: [{required: true, message: '请输入培训类型'}]}]" />
</a-form-item>
<a-form-item
label="数量"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input-number placeholder="请输入数量" style="width: 100%" v-decorator="['num', {rules: [{required: true, message: '请输入数量'}]}]" />
</a-form-item>
<a-form-item
label="内部还是外部"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<a-radio-group placeholder="请选择内部还是外部" v-decorator="['nborwb',{rules: [{ required: true, message: '请选择内部还是外部' }]}]" >
<a-radio v-for="(item,index) in nborwbData" :key="index" :value="item.code">{{ item.name }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
label="部门"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入部门" v-decorator="['workPlace', {rules: [{required: true, message: '请输入部门'}]}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import { scrTrainDataAdd } from '@/api/modular/main/scrtraindata/scrTrainDataManage'
import moment from 'moment'
export default {
data () {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 15 }
},
happenTimeDateString: '',
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
nborwbData: [
{
code: 1,
name: '内部'
},
{
code: 0,
name: '外部'
}
]
}
},
methods: {
moment,
//
add (record) {
this.visible = true
},
/**
* 提交表单
*/
handleSubmit () {
const { form: { validateFields } } = this
this.confirmLoading = true
validateFields((errors, values) => {
if (!errors) {
for (const key in values) {
if (typeof (values[key]) === 'object' && values[key] != null) {
values[key] = JSON.stringify(values[key])
}
}
values.happenTime = moment(this.happenTimeDateString).format('YYYY-MM-DD') || null
scrTrainDataAdd(values).then((res) => {
if (res.success) {
this.$message.success('新增成功')
this.confirmLoading = false
this.$emit('ok', values)
this.handleCancel()
} else {
this.$message.error('新增失败')// + res.message
}
}).finally((res) => {
this.confirmLoading = false
})
} else {
this.confirmLoading = false
}
})
},
happenTimeOnChange(date, dateString) {
this.happenTimeDateString = dateString
},
handleCancel () {
this.happenTimeDateString = ''
this.form.getFieldDecorator('happenTime', { initialValue: null })
this.form.resetFields()
this.visible = false
}
}
}
</script>

View File

@ -0,0 +1,150 @@
<template>
<a-modal
title="编辑培训"
:width="900"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleSubmit"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
<a-form-item
label="月份"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-month-picker show-time style="width: 100%" placeholder="请选择月份" v-decorator="['happenTime',{rules: [{ required: true, message: '请选择月份' }]}]" @change="happenTimeOnChange"/>
</a-form-item>
<a-form-item
label="培训类型"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入培训类型" v-decorator="['type', {rules: [{required: true, message: '请输入培训类型'}]}]" />
</a-form-item>
<a-form-item
label="数量"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input-number placeholder="请输入数量" style="width: 100%" v-decorator="['num', {rules: [{required: true, message: '请输入数量'}]}]" />
</a-form-item>
<a-form-item
label="内部还是外部"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
>
<a-radio-group placeholder="请选择内部还是外部" v-decorator="['nborwb',{rules: [{ required: true, message: '请选择内部还是外部' }]}]" >
<a-radio v-for="(item,index) in nborwbData" :key="index" :value="item.code">{{ item.name }}</a-radio>
</a-radio-group>
</a-form-item>
<a-form-item
label="部门"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入部门" v-decorator="['workPlace', {rules: [{required: true, message: '请输入部门'}]}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import moment from 'moment'
import { scrTrainDataEdit } from '@/api/modular/main/scrtraindata/scrTrainDataManage'
export default {
data () {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 15 }
},
happenTimeDateString: '',
visible: false,
confirmLoading: false,
form: this.$form.createForm(this),
nborwbData: [
{
code: 1,
name: '内部'
},
{
code: 0,
name: '外部'
}
]
}
},
methods: {
moment,
//
edit (record) {
this.visible = true
setTimeout(() => {
this.form.setFieldsValue(
{
id: record.id,
type: record.type,
num: record.num,
nborwb: record.nborwb,
workPlace: record.workPlace
}
)
}, 100)
//
if (record.happenTime) {
this.form.getFieldDecorator('happenTime', { initialValue: moment(record.happenTime, 'YYYY-MM-DD') })
this.happenTimeDateString = moment(record.happenTime).format('YYYY-MM-DD')
}
},
handleSubmit () {
const { form: { validateFields } } = this
this.confirmLoading = true
validateFields((errors, values) => {
if (!errors) {
for (const key in values) {
if (typeof (values[key]) === 'object' && values[key] != null) {
values[key] = JSON.stringify(values[key])
}
}
values.happenTime = moment(this.happenTimeDateString).format('YYYY-MM-DD') || null
scrTrainDataEdit(values).then((res) => {
if (res.success) {
this.$message.success('编辑成功')
this.confirmLoading = false
this.$emit('ok', values)
this.handleCancel()
} else {
this.$message.error('编辑失败')// + res.message
}
}).finally((res) => {
this.confirmLoading = false
})
} else {
this.confirmLoading = false
}
})
},
happenTimeOnChange(date, dateString) {
this.happenTimeDateString = dateString
},
handleCancel () {
this.happenTimeDateString = ''
this.form.getFieldDecorator('happenTime', { initialValue: null })
this.form.resetFields()
this.visible = false
}
}
}
</script>

View File

@ -0,0 +1,224 @@
<template>
<div>
<a-card :bordered="false" :bodyStyle="tstyle">
<div class="table-page-search-wrapper">
<a-form layout="inline">
<a-row :gutter="48">
<a-col :md="8" :sm="24">
<a-form-item label="培训类型">
<a-input v-model="queryParam.type" allow-clear placeholder="请输入培训类型"/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="月份">
<a-month-picker style="width: 100%" placeholder="请选择月份" v-model="queryParam.happenTimeDate" @change="onChangehappenTime"/>
</a-form-item>
</a-col>
<template v-if="advanced">
<a-col :md="8" :sm="24">
<a-form-item label="部门">
<a-input v-model="queryParam.workPlace" allow-clear placeholder="请输入部门"/>
</a-form-item>
</a-col>
</template>
<a-col :md="8" :sm="24" >
<span class="table-page-search-submitButtons">
<a-button type="primary" @click="$refs.table.refresh(true)" >查询</a-button>
<a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
<a @click="toggleAdvanced" style="margin-left: 8px">
{{ advanced ? '收起' : '展开' }}
<a-icon :type="advanced ? 'up' : 'down'"/>
</a>
</span>
</a-col>
</a-row>
</a-form>
</div>
</a-card>
<a-card :bordered="false">
<s-table
ref="table"
:columns="columns"
:data="loadData"
:alert="options.alert"
:rowKey="(record) => record.id"
:rowSelection="options.rowSelection"
>
<template class="table-operator" slot="operator">
<a-button type="primary" icon="plus" @click="$refs.addForm.add()">新增</a-button>
<a-button type="danger" :disabled="selectedRowKeys.length < 1" @click="batchDelete"><a-icon type="delete"/>批量删除</a-button>
<x-down
ref="batchExport"
@batchExport="batchExport"
/>
</template>
<span slot="nborwbScopedSlots" slot-scope="text">
{{ text=='0'?'外部':'内部' }}
</span>
<span slot="action" slot-scope="text, record">
<a @click="$refs.editForm.edit(record)">编辑</a>
<a-divider type="vertical" />
<a-popconfirm placement="topRight" title="确认删除?" @confirm="() => singleDelete(record)">
<a>删除</a>
</a-popconfirm>
</span>
</s-table>
<add-form ref="addForm" @ok="handleOk" />
<edit-form ref="editForm" @ok="handleOk" />
</a-card>
</div>
</template>
<script>
import { STable, XDown } from '@/components'
import moment from 'moment'
import { scrTrainDataPage, scrTrainDataDelete, scrTrainDataExport } from '@/api/modular/main/scrtraindata/scrTrainDataManage'
import addForm from './addForm.vue'
import editForm from './editForm.vue'
export default {
components: {
STable,
addForm,
editForm,
XDown
},
data () {
return {
// /
advanced: false,
//
queryParam: {},
//
columns: [
{
title: '月份',
align: 'center',
dataIndex: 'happenTime',
customRender: (text, record) => {
return moment(text).format('YYYY-MM')
}
},
{
title: '培训类型',
align: 'center',
dataIndex: 'type'
},
{
title: '数量',
align: 'center',
dataIndex: 'num'
},
{
title: '内部/外部',
align: 'center',
dataIndex: 'nborwb',
scopedSlots: { customRender: 'nborwbScopedSlots' }
},
{
title: '部门',
align: 'center',
dataIndex: 'workPlace'
}
],
tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
// Promise
loadData: parameter => {
return scrTrainDataPage(Object.assign(parameter, this.switchingDate())).then((res) => {
return res.data
})
},
selectedRowKeys: [],
selectedRows: [],
options: {
alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
rowSelection: {
selectedRowKeys: this.selectedRowKeys,
onChange: this.onSelectChange
}
}
}
},
created () {
this.columns.push({
title: '操作',
width: '150px',
dataIndex: 'action',
scopedSlots: { customRender: 'action' }
})
},
methods: {
moment,
/**
* 查询参数组装
*/
switchingDate () {
const queryParamhappenTime = this.queryParam.happenTimeDate
if (queryParamhappenTime != null) {
this.queryParam.happenTime = moment(queryParamhappenTime).format('YYYY-MM-DD')
if (queryParamhappenTime.length < 1) {
delete this.queryParam.happenTime
}
}
const obj = JSON.parse(JSON.stringify(this.queryParam))
return obj
},
/**
* 单个删除
*/
singleDelete (record) {
const param = [{ 'id': record.id }]
this.scrTrainDataDelete(param)
},
/**
* 批量删除
*/
batchDelete () {
const paramIds = this.selectedRowKeys.map((d) => {
return { 'id': d }
})
this.scrTrainDataDelete(paramIds)
},
scrTrainDataDelete (record) {
scrTrainDataDelete(record).then((res) => {
if (res.success) {
this.$message.success('删除成功')
this.$refs.table.clearRefreshSelected()
} else {
this.$message.error('删除失败') // + res.message
}
})
},
toggleAdvanced () {
this.advanced = !this.advanced
},
onChangehappenTime(date, dateString) {
this.happenTimeDateString = dateString
},
/**
* 批量导出
*/
batchExport () {
const paramIds = this.selectedRowKeys.map((d) => {
return { 'id': d }
})
scrTrainDataExport(paramIds).then((res) => {
this.$refs.batchExport.downloadfile(res)
})
},
handleOk () {
this.$refs.table.refresh()
},
onSelectChange (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectedRows = selectedRows
}
}
}
</script>
<style lang="less">
.table-operator {
margin-bottom: 18px;
}
button {
margin-right: 8px;
}
</style>

View File

@ -0,0 +1,125 @@
<template>
<a-modal
title="新增"
:width="900"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleSubmit"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item
label="月份"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-month-picker show-time style="width: 100%" placeholder="请选择月份" v-decorator="['happenTime',{rules: [{ required: true, message: '请选择月份' }]}]" @change="happenTimeOnChange"/>
</a-form-item>
<a-form-item
label="培训计划"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入培训计划" v-decorator="['name', {rules: [{required: true, message: '请输入培训计划'}]}]" />
</a-form-item>
<a-form-item
label="线上培训"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入线上培训" v-decorator="['uppx', {rules: [{required: true, message: '请输入线上培训'}]}]" />
</a-form-item>
<a-form-item
label="线下培训"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入线下培训" v-decorator="['downpx', {rules: [{required: true, message: '请输入线下培训'}]}]" />
</a-form-item>
<a-form-item
label="在线考试"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入在线考试" v-decorator="['workPlace', {rules: [{required: true, message: '请输入在线考试'}]}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import { scrTrainScheAdd } from '@/api/modular/main/scrtrainsche/scrTrainScheManage'
import moment from 'moment'
export default {
data () {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 15 }
},
happenTimeDateString: '',
visible: false,
confirmLoading: false,
form: this.$form.createForm(this)
}
},
methods: {
moment,
//
add (record) {
this.visible = true
},
/**
* 提交表单
*/
handleSubmit () {
const { form: { validateFields } } = this
this.confirmLoading = true
validateFields((errors, values) => {
if (!errors) {
for (const key in values) {
if (typeof (values[key]) === 'object' && values[key] != null) {
values[key] = JSON.stringify(values[key])
}
}
values.happenTime = moment(this.happenTimeDateString).format('YYYY-MM-DD') || null
scrTrainScheAdd(values).then((res) => {
if (res.success) {
this.$message.success('新增成功')
this.confirmLoading = false
this.$emit('ok', values)
this.handleCancel()
} else {
this.$message.error('新增失败')// + res.message
}
}).finally((res) => {
this.confirmLoading = false
})
} else {
this.confirmLoading = false
}
})
},
happenTimeOnChange(date, dateString) {
this.happenTimeDateString = dateString
},
handleCancel () {
this.happenTimeDateString = ''
this.form.getFieldDecorator('happenTime', { initialValue: null })
this.form.resetFields()
this.visible = false
}
}
}
</script>

View File

@ -0,0 +1,139 @@
<template>
<a-modal
title="编辑培训安排"
:width="900"
:visible="visible"
:confirmLoading="confirmLoading"
@ok="handleSubmit"
@cancel="handleCancel"
>
<a-spin :spinning="confirmLoading">
<a-form :form="form">
<a-form-item v-show="false"><a-input v-decorator="['id']" /></a-form-item>
<a-form-item
label="月份"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-month-picker show-time style="width: 100%" placeholder="请选择月份" v-decorator="['happenTime',{rules: [{ required: true, message: '请选择月份' }]}]" @change="happenTimeOnChange"/>
</a-form-item>
<a-form-item
label="培训计划"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入培训计划" v-decorator="['name', {rules: [{required: true, message: '请输入培训计划'}]}]" />
</a-form-item>
<a-form-item
label="线上培训"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入线上培训" v-decorator="['uppx', {rules: [{required: true, message: '请输入线上培训'}]}]" />
</a-form-item>
<a-form-item
label="线下培训"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入线下培训" v-decorator="['downpx', {rules: [{required: true, message: '请输入线下培训'}]}]" />
</a-form-item>
<a-form-item
label="在线考试"
:labelCol="labelCol"
:wrapperCol="wrapperCol"
has-feedback
>
<a-input placeholder="请输入在线考试" v-decorator="['workPlace', {rules: [{required: true, message: '请输入在线考试'}]}]" />
</a-form-item>
</a-form>
</a-spin>
</a-modal>
</template>
<script>
import moment from 'moment'
import { scrTrainScheEdit } from '@/api/modular/main/scrtrainsche/scrTrainScheManage'
export default {
data () {
return {
labelCol: {
xs: { span: 24 },
sm: { span: 5 }
},
wrapperCol: {
xs: { span: 24 },
sm: { span: 15 }
},
happenTimeDateString: '',
visible: false,
confirmLoading: false,
form: this.$form.createForm(this)
}
},
methods: {
moment,
//
edit (record) {
this.visible = true
setTimeout(() => {
this.form.setFieldsValue(
{
id: record.id,
name: record.name,
uppx: record.uppx,
downpx: record.downpx,
workPlace: record.workPlace
}
)
}, 100)
//
if (record.happenTime) {
this.form.getFieldDecorator('happenTime', { initialValue: moment(record.happenTime, 'YYYY-MM-DD') })
this.happenTimeDateString = moment(record.happenTime).format('YYYY-MM-DD')
}
},
handleSubmit () {
const { form: { validateFields } } = this
this.confirmLoading = true
validateFields((errors, values) => {
if (!errors) {
for (const key in values) {
if (typeof (values[key]) === 'object' && values[key] != null) {
values[key] = JSON.stringify(values[key])
}
}
values.happenTime = moment(this.happenTimeDateString).format('YYYY-MM-DD') || null
scrTrainScheEdit(values).then((res) => {
if (res.success) {
this.$message.success('编辑成功')
this.confirmLoading = false
this.$emit('ok', values)
this.handleCancel()
} else {
this.$message.error('编辑失败')// + res.message
}
}).finally((res) => {
this.confirmLoading = false
})
} else {
this.confirmLoading = false
}
})
},
happenTimeOnChange(date, dateString) {
this.happenTimeDateString = dateString
},
handleCancel () {
this.happenTimeDateString = ''
this.form.getFieldDecorator('happenTime', { initialValue: null })
this.form.resetFields()
this.visible = false
}
}
}
</script>

View File

@ -0,0 +1,217 @@
<template>
<div>
<a-card :bordered="false" :bodyStyle="tstyle">
<div class="table-page-search-wrapper">
<a-form layout="inline">
<a-row :gutter="48">
<a-col :md="8" :sm="24">
<a-form-item label="培训计划">
<a-input v-model="queryParam.name" allow-clear placeholder="请输入培训计划"/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<a-form-item label="月份">
<a-month-picker style="width: 100%" placeholder="请选择月份" v-model="queryParam.happenTimeDate" @change="onChangehappenTime"/>
</a-form-item>
</a-col>
<a-col :md="8" :sm="24">
<span class="table-page-search-submitButtons">
<a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
<a-button style="margin-left: 8px" @click="() => queryParam = {}">重置</a-button>
</span>
</a-col>
</a-row>
</a-form>
</div>
</a-card>
<a-card :bordered="false">
<s-table
ref="table"
:columns="columns"
:data="loadData"
:alert="options.alert"
:rowKey="(record) => record.id"
:rowSelection="options.rowSelection"
>
<template class="table-operator" slot="operator" >
<a-button type="primary" icon="plus" @click="$refs.addForm.add()">新增</a-button>
<a-button type="danger" :disabled="selectedRowKeys.length < 1" @click="batchDelete"><a-icon type="delete"/>批量删除</a-button>
<x-down
ref="batchExport"
@batchExport="batchExport"
/>
</template>
<span slot="uppxScopedSlots" slot-scope="text">
<ellipsis :length="10" tooltip>{{ text }}</ellipsis>
</span>
<span slot="downpxScopedSlots" slot-scope="text">
<ellipsis :length="10" tooltip>{{ text }}</ellipsis>
</span>
<span slot="workPlaceScopedSlots" slot-scope="text">
<ellipsis :length="10" tooltip>{{ text }}</ellipsis>
</span>
<span slot="action" slot-scope="text, record">
<a @click="$refs.editForm.edit(record)">编辑</a>
<a-divider type="vertical" />
<a-popconfirm placement="topRight" title="确认删除?" @confirm="() => singleDelete(record)">
<a>删除</a>
</a-popconfirm>
</span>
</s-table>
<add-form ref="addForm" @ok="handleOk" />
<edit-form ref="editForm" @ok="handleOk" />
</a-card>
</div>
</template>
<script>
import { STable, XDown, Ellipsis } from '@/components'
import moment from 'moment'
import { scrTrainSchePage, scrTrainScheDelete, scrTrainScheExport } from '@/api/modular/main/scrtrainsche/scrTrainScheManage'
import addForm from './addForm.vue'
import editForm from './editForm.vue'
export default {
components: {
Ellipsis,
STable,
addForm,
editForm,
XDown
},
data () {
return {
//
queryParam: {},
//
columns: [
{
title: '月份',
align: 'center',
dataIndex: 'happenTime',
customRender: (text, record) => {
return moment(text).format('YYYY-MM')
}
},
{
title: '培训计划',
align: 'center',
dataIndex: 'name'
},
{
title: '线上培训',
align: 'center',
dataIndex: 'uppx',
scopedSlots: { customRender: 'uppxScopedSlots' }
},
{
title: '线下培训',
align: 'center',
dataIndex: 'downpx',
scopedSlots: { customRender: 'downpxScopedSlots' }
},
{
title: '在线考试',
align: 'center',
dataIndex: 'workPlace',
scopedSlots: { customRender: 'workPlaceScopedSlots' }
}
],
tstyle: { 'padding-bottom': '0px', 'margin-bottom': '10px' },
// Promise
loadData: parameter => {
return scrTrainSchePage(Object.assign(parameter, this.switchingDate())).then((res) => {
return res.data
})
},
selectedRowKeys: [],
selectedRows: [],
options: {
alert: { show: true, clear: () => { this.selectedRowKeys = [] } },
rowSelection: {
selectedRowKeys: this.selectedRowKeys,
onChange: this.onSelectChange
}
}
}
},
created () {
this.columns.push({
title: '操作',
width: '150px',
dataIndex: 'action',
scopedSlots: { customRender: 'action' }
})
},
methods: {
moment,
/**
* 查询参数组装
*/
switchingDate () {
const queryParamhappenTime = this.queryParam.happenTimeDate
if (queryParamhappenTime != null) {
this.queryParam.happenTime = moment(queryParamhappenTime).format('YYYY-MM-DD')
if (queryParamhappenTime.length < 1) {
delete this.queryParam.happenTime
}
}
const obj = JSON.parse(JSON.stringify(this.queryParam))
return obj
},
/**
* 单个删除
*/
singleDelete (record) {
const param = [{ 'id': record.id }]
this.scrTrainScheDelete(param)
},
/**
* 批量删除
*/
batchDelete () {
const paramIds = this.selectedRowKeys.map((d) => {
return { 'id': d }
})
this.scrTrainScheDelete(paramIds)
},
scrTrainScheDelete (record) {
scrTrainScheDelete(record).then((res) => {
if (res.success) {
this.$message.success('删除成功')
this.$refs.table.clearRefreshSelected()
} else {
this.$message.error('删除失败') // + res.message
}
})
},
onChangehappenTime(date, dateString) {
this.happenTimeDateString = dateString
},
/**
* 批量导出
*/
batchExport () {
const paramIds = this.selectedRowKeys.map((d) => {
return { 'id': d }
})
scrTrainScheExport(paramIds).then((res) => {
this.$refs.batchExport.downloadfile(res)
})
},
handleOk () {
this.$refs.table.refresh()
},
onSelectChange (selectedRowKeys, selectedRows) {
this.selectedRowKeys = selectedRowKeys
this.selectedRows = selectedRows
}
}
}
</script>
<style lang="less">
.table-operator {
margin-bottom: 18px;
}
button {
margin-right: 8px;
}
</style>