first commit

This commit is contained in:
2026-09-09 09:14:28 +08:00
commit 5343198112
5199 changed files with 1052895 additions and 0 deletions
@@ -0,0 +1,352 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.item-button {
text-align: right;
}
.item-button .el-button {
padding: 12px 25px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="clearfix" slot="header">
<h3 style="color: rgb(24, 103, 176);font-family: Microsoft YaHei;">提案配置</h3>
</div>
<el-form :model="formData" :rules="formRules" label-width="150px" ref="addForm">
<el-form-item label="配置名称" prop="configName">
<el-input placeholder="请输入配置名称" v-model="formData.configName"></el-input>
</el-form-item>
<el-form-item label="附议人数量" prop="seconderNum">
<el-input maxlength="1" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="请输入附议人数量" v-model="formData.seconderNum"></el-input>
</el-form-item>
<el-form-item label="提交模式" prop="submitMode">
<el-radio-group v-model="formData.submitMode">
<el-radio-button :label="item.code"
v-for="item in submitModeList">{{item.description}}
</el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="超时自动提交天数" prop="timeoutDays">
<el-input maxlength="3" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="协办单位超时自动提交天数" v-model="formData.timeoutDays"></el-input>
</el-form-item>
<el-form-item label="提醒日期" prop="remindProposalCreatorDate">
<el-date-picker
:picker-options="remindProposalCreatorDatepickerOptions"
placeholder="选择提醒日期"
type="datetime"
v-model="formData.remindProposalCreatorDate"
value-format="yyyy-MM-dd HH:mm:ss">
</el-date-picker>
</el-form-item>
<el-form-item label="办理提醒设置(多选)" prop="reminder">
<el-checkbox-group v-model="formData.reminder">
<el-checkbox-button :key="item.id" :label="item.code" v-for="item in reminderList">{{item.name}}
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<el-form-item label="撰写提案方式(多选)" prop="manner">
<el-checkbox-group v-model="formData.manner">
<el-checkbox-button :key="item.id" :label="item.code" v-for="item in allMannerList">
{{item.name}}
</el-checkbox-button>
</el-checkbox-group>
</el-form-item>
<!-- <el-form-item label="是否自动提交" prop="isAutoSubmit">-->
<!-- <el-radio-group v-model="formData.isAutoSubmit">-->
<!-- <el-radio-button :label="true">是</el-radio-button>-->
<!-- <el-radio-button :label="false">否</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="个人是否看审核环节" prop="isSeeAudit">-->
<!-- <el-radio-group v-model="formData.isSeeAudit">-->
<!-- <el-radio-button :label="true">是</el-radio-button>-->
<!-- <el-radio-button :label="false">否</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<!-- <el-form-item label="团长审核方式" prop="headAuditMethod">-->
<!-- <el-radio-group v-model="formData.headAuditMethod">-->
<!-- <el-radio-button label="TRADITION">传统方式</el-radio-button>-->
<!-- <el-radio-button label="UNITE">联合方式</el-radio-button>-->
<!-- </el-radio-group>-->
<!-- </el-form-item>-->
<el-form-item label="提案最少字数" prop="words">
<el-input-number :max="5000" :min="1" :precision="0" :step="1"
v-model="formData.words"></el-input-number>
</el-form-item>
<el-form-item label="校领导单位代码" prop="schoolLeaderUnitCode">
<el-input v-model="formData.schoolLeaderUnitCode"></el-input>
</el-form-item>
<el-form-item label="不予立案理由">
<template v-for="(o,i) in formData.noFilingReason">
<el-row style="margin-bottom: 10px" type="flex">
<el-col :span="20">
<el-input maxlength="100" v-model="formData.noFilingReason[i]">
<template slot="prepend">{{i+1}}.</template>
</el-input>
</el-col>
<el-col :span="4" class="pl5">
<el-button @click="deleteReasonRow(i)" icon="el-icon-delete"
type="danger"></el-button>
</el-col>
</el-row>
</template>
<el-button @click="formData.noFilingReason.push('')" type="primary">增加一条</el-button>
</el-form-item>
<el-form-item label="二次答复需要校领导审批" prop="secondReplyAfterNeedLeaderAudit">
<el-radio-group v-model="formData.secondReplyAfterNeedLeaderAudit">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-row>
<p style="width: 150px;text-align: right;padding-right: 12px">主办配置</p>
<el-col :span="8">
<el-form-item label="需要答复" prop="masterUnitConfig.isNeedReply">
<el-switch
active-text="需要"
inactive-text="不需要"
v-model="formData.masterUnitConfig.isNeedReply">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="答复顺序" prop="masterUnitConfig.isFirstReply">
<el-switch
:disabled="!formData.masterUnitConfig.isNeedReply"
active-text="首先答复"
inactive-text="第二答复"
v-model="formData.masterUnitConfig.isFirstReply">
</el-switch>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="需要二次答复" prop="masterUnitConfig.isNeedSecondReply">
<el-switch
v-model="formData.masterUnitConfig.isNeedSecondReply"
:disabled="!formData.masterUnitConfig.isFirstReply"
active-text="需要"
inactive-text="不需要">
</el-switch>
</el-form-item>
</el-col>-->
</el-row>
<el-row>
<p style="width: 150px;text-align: right;padding-right: 12px">协办配置</p>
<el-col :span="8">
<el-form-item label="需要答复" prop="slaveUnitConfig.isNeedReply">
<el-switch
active-text="需要"
inactive-text="不需要"
v-model="formData.slaveUnitConfig.isNeedReply">
</el-switch>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="答复顺序" prop="slaveUnitConfig.isFirstReply">
<el-switch
:disabled="!formData.slaveUnitConfig.isNeedReply"
active-text="首先答复"
inactive-text="第二答复"
v-model="formData.slaveUnitConfig.isFirstReply">
</el-switch>
</el-form-item>
</el-col>
<!-- <el-col :span="8">
<el-form-item label="需要二次答复" prop="slaveUnitConfig.isNeedSecondReply">
<el-switch
v-model="formData.slaveUnitConfig.isNeedSecondReply"
:disabled="!formData.slaveUnitConfig.isFirstReply"
active-text="需要"
inactive-text="不需要">
</el-switch>
</el-form-item>
</el-col>-->
</el-row>
<el-form-item label="撰写须知" prop="writeRemind">
<el-input
:autosize="{ minRows: 5, maxRows: 10}"
maxlength="800"
placeholder="请输入撰写须知"
type="textarea"
v-model="formData.writeRemind">
</el-input>
</el-form-item>
<el-form-item class="item-button">
<el-button @click="resetForm" type="danger">&emsp;</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">&emsp;</el-button>
</el-form-item>
</el-form>
</el-card>
</guava>
</div>
<script>
const vue = new Vue({
el: '#app',
data() {
return {
subLoading: false,
reminderList: [],
allMannerList: [],
openMannerList: [],
submitModeList: [],
formData: {
configName: '智慧工会提案配置',
seconderNum: '',
reminder: ['SMS'],
manner: ['W01'],
isAutoSubmit: true,
isSeeAudit: false,
headAuditMethod: null,
words: 1,
noFilingReason: [],
masterUnitConfig: {},
slaveUnitConfig: {},
submitMode: 'AMT'
},
formRules: {
configName: [{required: true, message: '请填写配置名称', trigger: ['blur', 'change']}],
seconderNum: [{required: true, message: '请填写附议人数量', trigger: ['blur', 'change']}],
reminder: [{required: true, message: '请选择办理提醒设置', trigger: ['blur', 'change']}],
manner: [{required: true, message: '请选择撰写提案方式', trigger: ['blur', 'change']}],
isAutoSubmit: [{required: true, message: '请选择是否自动提交', trigger: ['blur', 'change']}],
isSeeAudit: [{required: true, message: '请选择个人是否能看审核环节', trigger: ['blur', 'change']}],
headAuditMethod: [{required: true, message: '请选择团长审核方式', trigger: ['blur', 'change']}],
words: [{required: true, message: '请输入提案内容要求字数', trigger: ['blur', 'change']}],
submitMode: [{required: true, message: '请选择提交模式', trigger: ['blur', 'change']}]
},
remindProposalCreatorDatepickerOptions: {
disabledDate(time) {
return time.getTime() < Date.now()
}
}
}
},
watch: {
'formData.masterUnitConfig.isNeedReply'(val) {
if (!val) {
this.$set(this.formData.masterUnitConfig, 'isFirstReply', false)
this.$set(this.formData.masterUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.masterUnitConfig.isFirstReply'(val) {
if (!val) {
this.$set(this.formData.masterUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.slaveUnitConfig.isNeedReply'(val) {
if (!val) {
this.$set(this.formData.slaveUnitConfig, 'isFirstReply', false)
this.$set(this.formData.slaveUnitConfig, 'isNeedSecondReply', false)
}
},
'formData.slaveUnitConfig.isFirstReply'(val) {
if (!val) {
this.$set(this.formData.slaveUnitConfig, 'isNeedSecondReply', false)
}
}
},
methods: {
deleteReasonRow(i) {
if (i === 0) {
return
}
this.formData.noFilingReason.splice(i, 1)
},
async getDictByCode() {
const {data} = await $.get(loc() + "/getDictByCode", {code: "proposal_manner"})
return data
},
async pageData() {
const {data} = await $.get(loc() + "/findOne")
if (data) {
data.noFilingReason = data.noFilingReason ? data.noFilingReason : ['']
if (!data.masterUnitConfig) {
data.masterUnitConfig = {}
}
if (!data.slaveUnitConfig) {
data.slaveUnitConfig = {}
}
this.formData = data
}
/*this.$set(this.formData, "manner", this.openMannerList.map(v => {
return v.id
}))*/
},
resetForm() {
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
const valid = await this.$refs["addForm"].validate()
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {
"data": JSON.stringify(this.formData),
"mannerList": JSON.stringify(this.formData.manner)
})
requestLaterFun(resp, () => {
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
}
},
async created() {
this.allMannerList = await this.getDictByCode("proposal_manner");
this.reminderList = await getDictByCode("proposal_remind");
this.openMannerList = await getDictByCode("proposal_manner");
this.submitModeList = await getEnumOptions("ProposalSubmitMode")
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,314 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select slot="prepend" style="width: 80px;" v-model="pageForm.searchName">
<el-option label="名称" value="stateName"></el-option>
<el-option label="编码" value="stateCode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" icon="el-icon-plus" type="primary">添加状态</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" v-loading="tableLoading">
<el-table-column type="expand">
<template slot-scope="{row}">
<el-form style="margin-left: 108px">
<el-form-item label="关联角色">
{{row.roleNames}}
</el-form-item>
</el-form>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="状态名称" prop="stateName"></el-table-column>
<el-table-column align="center" header-align="center" label="状态编码" prop="stateCode"></el-table-column>
<el-table-column align="center" header-align="center" label="状态颜色" prop="stateColor">
<template scope="{row}">
<el-tag :color="row.stateColor" :key="row.stateCode"
style="border-radius: 50%;height: 22px;"></el-tag>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否需要签字" prop="isSign">
<template scope="{row}">
<el-switch @change="switchChange(row)" active-color="#13ce66"
inactive-color="#ff4949" v-model="row.isSign">
</el-switch>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="是否开启" prop="stateColor">
<template scope="{row}">
<el-tag :key="row.isEnable" :type="row.isEnable?'':'danger'">
{{row.isEnable?'已开启':'已关闭'}}
</el-tag>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="关联菜单" prop="menuName"></el-table-column>
<el-table-column align="center" header-align="center" label="关联角色" prop="roleNames"
show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="前置节点" prop="prevState"
show-overflow-tooltip>
<template scope="{row}">
{{row.prevState && row.prevState.stateName}}
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="后置节点" prop="nextState"
show-overflow-tooltip>
<template scope="{row}">
{{row.nextState && row.nextState.stateName}}
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i><span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<!-- <el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>-->
<el-dropdown-item :command="{type:'enable',data:row}">
{{row.isEnable?'关闭':'开启'}}
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
</el-card>
</guava>
<el-dialog :visible.sync="dialogVisible" title="提案状态" width="50%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="状态编码" prop="stateCode">
<el-input maxlength="4" oninput="value=value.replace(/[^\d]/g,'')"
placeholder="请输入状态编码" v-model="formData.stateCode"></el-input>
</el-form-item>
<el-form-item label="状态名称" prop="stateName">
<el-input placeholder="请输入状态名称" v-model="formData.stateName"></el-input>
</el-form-item>
<el-form-item label="状态颜色" prop="stateColor">
<el-input placeholder="请输入状态颜色" v-model="formData.stateColor"></el-input>
</el-form-item>
<el-form-item label="是否需要签字" prop="isSign">
<el-radio-group v-model="formData.isSign">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-switch active-color="#13ce66" inactive-color="#ff4949" v-model="formData.isEnable"></el-switch>
</el-form-item>
<el-form-item label="前置节点" prop="prevId">
<el-select clearable placeholder="请选择前置节点" v-model="formData.prevId">
<!-- :disabled="item.stateCode>=formData.stateCode"-->
<el-option :key="item.id"
:label="item.stateName"
:value="item.id"
v-for="item in allState"></el-option>
</el-select>
</el-form-item>
<el-form-item label="后置节点" prop="nextId">
<el-select clearable placeholder="请选择前置节点" v-model="formData.nextId">
<!-- :disabled="item.stateCode<=formData.stateCode"-->
<el-option :key="item.id"
:label="item.stateName"
:value="item.id"
v-for="item in allState"></el-option>
</el-select>
</el-form-item>
<el-form-item label="关联菜单" prop="menuId">
<el-select placeholder="请选择前置节点" v-model="formData.menuId">
<el-option :key="item.id"
:label="item.name"
:value="item.id"
v-for="item in proposalMenu"></el-option>
</el-select>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
subLoading: false,
dialogVisible: false,
pageForm: {
searchName: "stateName",
pageSize: 20
},
formRules: {
stateCode: [{required: true, message: '请填写状态编码', trigger: ['blur', 'change']}],
stateName: [{required: true, message: '请填写状态名称', trigger: ['blur', 'change']}],
stateColor: [{required: true, message: '请填写状态颜色', trigger: ['blur', 'change']}],
isSign: [{required: true, message: '请选择是否需要签字', trigger: ['blur', 'change']}],
isEnable: [{required: true, message: '请选择是否启用', trigger: ['blur', 'change']}],
},
allState: [],
proposalMenu: []
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
} else if (type === 'enable') {
data.isEnable = !data.isEnable
this.switchChange(data)
}
},
openAdd() {
this.formData = {}
const newStateCode = this.tableData && this.tableData.length > 0 ? this.tableData[this.tableData.length - 1].stateCode + 100 : 100
this.$set(this.formData, "stateCode", newStateCode)
this.$set(this.formData, "stateColor", '#1D8CE0')
this.$set(this.formData, "isSign", false)
this.$set(this.formData, "isEnable", true)
this.$set(this.formData, "prevId", null)
this.$set(this.formData, "nextId", null)
this.resetForm()
},
openEdit(data) {
this.formData = JSON.parse(JSON.stringify(data))
this.resetForm()
},
resetForm() {
this.dialogVisible = true
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async switchChange(data) {
this.formData = data
const resp = await $.post(loc() + "/doEdit", {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
proposal.getProposalEnableStateCode()
proposal.getProposalNeedSignStateCode()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.pageData()
})
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
const valid = this.$refs["addForm"].validate
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const cloneFormData = clone(this.formData)
delete cloneFormData.prevState
delete cloneFormData.nextState
const resp = await $.post(loc() + '/doHandler', cloneFormData)
requestLaterFun(resp, () => {
this.dialogVisible = false
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
proposal.getProposalAllStateCode()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
},
doDelete(id) {
let self = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/doDelete", {id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
self.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async listAll() {
const resp = await $.post(loc() + "/listAll")
if (resp.code === 0) {
this.allState = resp.data
}
},
async menuInProposal() {
const resp = await $.post(loc() + "/menuInProposal")
if (resp.code === 0) {
this.proposalMenu = resp.data
}
}
},
created() {
this.pageData();
this.listAll()
this.menuInProposal()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,180 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
</style>
<div id="app" v-cloak>
<guava>
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="请输入内容"
v-model="pageForm.searchKeyword">
<el-select placeholder="查询类型" slot="prepend" style="width: 80px;"
v-model="pageForm.searchName">
<el-option label="名称" value="typeName"></el-option>
<el-option label="编码" value="typeCode"></el-option>
</el-select>
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch" icon="el-icon-search" type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" icon="el-icon-plus" type="primary">添加类型</el-button>
</div>
</el-card>
<el-card class="mt20" shadow="never">
<el-table :data="tableData" @sort-change="pageOrder" row-key="id" style="width: 100%"
v-loading="tabLoading">
<el-table-column align="center" header-align="center" label="序号" width="120px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}} </span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="类型编号"
prop="typeCode"></el-table-column>
<el-table-column align="center" header-align="center" label="类型名称"
prop="typeName"></el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template slot-scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i>
<span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'edit',data:row}">
编辑
</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<el-dialog :close-on-click-modal="false" :title="title" :visible.sync="DialogVisible" width="40%">
<el-form :model="formData" :rules="formRules" label-width="100px"
ref="addForm">
<el-form-item label="类型编号" prop="typeCode">
<el-input maxlength="50" placeholder="类型编号" type="text" v-model="formData.typeCode"></el-input>
</el-form-item>
<el-form-item label="类型名称" prop="typeName">
<el-input maxlength="50" placeholder="请填写类型名称" type="text" v-model="formData.typeName"></el-input>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="DialogVisible = false">取 消</el-button>
<el-button :disabled="subDis" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return {
title: "",
subDis: false,
DialogVisible: false,
tabLoading: false,
pageForm: {
searchName: "typeName",
},
formRules: {
typeName: [{required: true, message: '必选', trigger: ['blur', 'change']}],
typeCode: [{required: true, message: '必选', trigger: ['blur', 'change']}],
},
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type == 'edit') {
this.openEdit(data)
} else if (type == 'delete') {
this.doDelete(data.id)
}
},
openAdd() {
this.title = "添加类型"
this.formData = {}
this.DialogVisible = true;
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
openEdit(data) {
this.title = "编辑类型"
this.formData = data
this.DialogVisible = true;
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {proposalType: JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.DialogVisible = false;
this.$notify.success({title: '成功', message: resp.msg});
this.pageData();
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
})
}
});
},
async doDelete(id) {
let self = this
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.get(loc() + "/doDelete", {id: id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
self.pageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
},
async created() {
this.pageData();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,453 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.dialog-footer .el-button {
padding: 12px 30px;
}
.el-tag {
border-radius: 50%;
height: 22px;
}
.el-transfer {
text-align: center;
}
.el-transfer-panel {
text-align: left;
width: 35%;
height: 400px;
}
.el-transfer-panel__list.is-filterable {
height: 300px;
}
.v-box .el-card__header {
padding: 5px 15px;
}
.v-tree-layout-left .v-tree {
width: 100%;
}
.v-tree-layout-left .custom-tree-node {
width: 90%;
position: relative;
}
.v-tree-layout-left .v-tree .v-node {
width: 100%;
display: inline-block;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
</style>
<div id="app" v-cloak>
<guava>
<tree-layout>
<template #tree>
<div style="padding: 15px;">
<el-input placeholder="输入单位名称进行过滤" v-model="filterText"></el-input>
</div>
<el-tree :data="treeData" :filter-node-method="filterNode" :props="defaultProps"
@node-click="handleNodeClick" accordion class="filter-tree"
default-expand-all highlight-current ref="tree">
<div class="custom-tree-node" slot-scope="{ node, data }">
<div class="v-node" style="font-size: 16px;" v-if="node.level==1">
<i class="el-icon-office-building"></i>&nbsp;{{ data.unitName }}
</div>
<div class="v-node" style="font-size: 14px" v-if="node.level==2">
<i class="el-icon-s-help" v-if="checkData.unitName==data.unitName"></i>
<i class="el-icon-help" v-else></i>
&emsp;{{ data.unitName }}
</div>
</div>
</el-tree>
</template>
<template>
<div style="width: 100%;" v-if="node.level==1">
<el-card shadow="never">
<div class="btn-group tool-button">
<el-input @keyup.enter.native="doSearch" clearable placeholder="根据承办单位名称进行查询"
v-model="pageForm.unitName">
</el-input>
</div>
<div class="btn-group tool-button">
<el-button @click="doSearch()" icon="el-icon-search" slot="append"
type="primary"></el-button>
</div>
<div class="pull-right offscreen-right">
<el-button @click="openAdd" type="primary"><i class="ti-plus"></i>增补承办单位</el-button>
</div>
</el-card>
<el-card class="mt10" shadow="never">
<el-table :data="tableData" height="722" highlight-current-row ref="underTakeTable">
<el-table-column label="序号" width="60px">
<template scope="scope">
<span>{{scope.$index+(pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</span>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="承办单位编码" prop="unitCode"
width="120px"></el-table-column>
<el-table-column align="center" header-align="center" label="承办单位名称" prop="unitName"
width="200px"></el-table-column>
<el-table-column align="center" header-align="center" label="分管校领导及联系电话"
prop="leader" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="负责人及联系电话"
prop="principal" show-overflow-tooltip></el-table-column>
<el-table-column align="center" header-align="center" label="是否启用" prop="isEnable"
width="100px">
<template scope="{row}">
<el-switch @change="switchChange(row)" active-color="#13ce66"
inactive-color="#ff4949" v-model="row.isEnable">
</el-switch>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="120px">
<template scope="{row}">
<el-dropdown @command="dropdownCommand">
<el-button plain size="mini">
<i class="ti-settings"></i><span class="ti-angle-down"></span>
</el-button>
<el-dropdown-menu slot="dropdown">
<el-dropdown-item :command="{type:'leader',data:row}">设置分管校领导
</el-dropdown-item>
<el-dropdown-item :command="{type:'principal',data:row}">设置负责人
</el-dropdown-item>
<el-dropdown-item :command="{type:'edit',data:row}">编辑</el-dropdown-item>
<el-dropdown-item :command="{type:'delete',data:row}" v-if="!row.isEnable">
删除
</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
<div style="padding: 5px 10px" v-if="node.level==2">
<el-tabs @tab-click="handleTabClick" type="card" v-model="activeName">
<el-tab-pane label="分管校领导" name="one"></el-tab-pane>
<el-tab-pane label="负责人" name="two"></el-tab-pane>
</el-tabs>
<el-table :data="adminTableData" highlight-current-row size="small" style="width: 100%;">
<el-table-column label="序号" width="60px">
<template scope="scope"><span>{{scope.$index+1}}</span></template>
</el-table-column>
<el-table-column align="center" label="职工号" prop="loginname"></el-table-column>
<el-table-column align="center" label="姓名" prop="username"></el-table-column>
<el-table-column align="center" label="性别" prop="sex"></el-table-column>
<el-table-column align="center" label="联系方式" prop="mobile"></el-table-column>
<el-table-column align="center" label="操作">
<template scope="{row}">
<el-button @click="removeAdmin(row)" circle icon="el-icon-delete" plain size="mini"
type="danger">
</el-button>
</template>
</el-table-column>
</el-table>
<el-row class="el-pagination-container" style="text-align: right;margin-top: 20px">
<span style="color: red">{{butTitle}}</span>
<el-button @click="openAdmin(adminPageForm,adminPageForm.flag)" circle size="medium"
type="primary">
<i class="el-icon-plus"></i>
</el-button>
</el-row>
</div>
</template>
</tree-layout>
</guava>
<el-dialog :visible.sync="dialogVisible" title="增补承办单位" width="50%">
<el-form :model="formData" :rules="formRules" label-width="120px" ref="addForm">
<el-form-item label="承办单位编码" prop="unitCode">
<el-input placeholder="请输入承办单位编码" v-model="formData.unitCode"></el-input>
</el-form-item>
<el-form-item label="承办单位名称" prop="unitName">
<el-input placeholder="请输入承办单位名称" v-model="formData.unitName"></el-input>
</el-form-item>
<el-form-item label="是否启用" prop="isEnable">
<el-radio-group v-model="formData.isEnable">
<el-radio-button :label="true"></el-radio-button>
<el-radio-button :label="false"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-form>
<span class="dialog-footer" slot="footer">
<el-button @click="dialogVisible = false">取 消</el-button>
<el-button :loading="subLoading" @click="operation" type="primary">确 定</el-button>
</span>
</el-dialog>
<el-dialog :title="title" :visible.sync="adminDialogVisible" width="55%">
<div style="width: 100%;">
<el-transfer :data="adminData" :filter-method="adminFilterMethod"
:props="{key: 'id',label: 'name'}"
:titles="['单位成员', '管理员']"
filterable
v-model="adminFormData.adminValue">
</el-transfer>
</div>
<span class="dialog-footer" slot="footer">
<el-button @click="adminDialogVisible = false">取 消</el-button>
<el-button :loading="adminSubLoading" @click="doAdmin" type="primary">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
components: {
'tree-layout': httpVueLoader('/components/plugins/TreeLayout.vue')
},
data() {
return {
title: '',
butTitle: '添加分管校领导',
filterText: '',
activeName: 'one',
subLoading: false,
dialogVisible: false,
treeData: [],
node: {
level: 1
},
formData: {
isEnable: true
},
checkData: {},
adminSubLoading: false,
adminDialogVisible: false,
adminFormData: {
adminValue: [],
flag: true
},
adminData: [],
adminTableData: [],
adminPageForm: {
flag: true
},
defaultProps: {
children: 'childrens',
label: 'unitName',
disabled: 'disabled'
},
formRules: {
unitCode: [{required: true, message: '请输入承办单位编码', trigger: ['blur', 'change']}],
unitName: [{required: true, message: '请输入承办单位名称', trigger: ['blur', 'change']}],
isEnable: [{required: true, message: '请选择是否启用', trigger: ['blur', 'change']}],
},
}
},
watch: {
filterText(val) {
this.$refs.tree.filter(val);
}
},
methods: {
dropdownCommand(command) {
const {type, data} = command
if (type === 'leader') {
this.title = '设置分管校领导'
this.openAdmin(data, true)
} else if (type === 'principal') {
this.title = '设置负责人'
this.openAdmin(data, false)
} else if (type === 'edit') {
this.openEdit(data)
} else if (type === 'delete') {
this.doDelete(data.id)
}
},
filterNode(value, data) {
if (!value) return true;
return data.unitName.indexOf(value) !== -1
return false
},
adminFilterMethod(query, item) {
return item.username.indexOf(query) > -1;
},
handleNodeClick(data, node) {
this.node = node
this.checkData = data
this.adminPageForm.id = data.id
this.adminPageForm.unitCode = data.unitCode
this.adminPageForm.flag = this.activeName === 'one'
this.adminPageData()
},
handleTabClick(tab) {
this.butTitle = tab.name === 'one' ? '添加分管校领导' : '添加负责人'
this.adminPageForm.flag = tab.name === 'one'
this.adminPageData()
},
removeAdmin(row) {
this.$confirm('确定要移除该管理员吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" === a) {
const resp = await $.post(loc() + "/removeAdmin", {
unitId: this.adminPageForm.id,
userId: row.id,
roleId: row.roleid
})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.adminPageData()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async adminPageData() {
const resp = await $.post(loc() + "/adminPageData", this.adminPageForm)
requestLaterFun(resp, () => {
this.adminTableData = resp.data;
}, () => {
console.log(resp)
this.$notify.error({title: '失败', message: resp.msg});
})
},
openAdd() {
this.formData = {}
this.$set(this.formData, "isEnable", true)
this.resetForm()
},
openEdit(data) {
this.formData = data
this.resetForm()
},
async openAdmin(row, flag) {
const {id, unitCode} = row
this.adminFormData.unitId = id
this.adminFormData.flag = flag
const {data} = await $.get(loc() + "/findUserAndAdmin", {id, unitCode, flag})
if (data) {
this.adminData = data.data
this.adminFormData.adminValue = data.value.map(v => {
return v.id
})
}
this.adminDialogVisible = true
},
async doAdmin() {
this.adminSubLoading = true
const data = clone(this.adminFormData)
data.adminValue = JSON.stringify(data.adminValue)
const resp = await $.post(loc() + "/setAdmin", data)
requestLaterFun(resp, () => {
this.adminDialogVisible = false
this.pageData()
this.adminPageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.adminSubLoading = false
})
},
resetForm() {
this.dialogVisible = true
if (this.$refs['addForm']) {
this.$refs['addForm'].resetFields()
}
},
async switchChange(data) {
this.formData = data
const resp = await $.post(loc() + "/doEdit", {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
this.undertakeUnitTree()
})
},
async operation() {
let method = this.formData.id ? "/doEdit" : "/doAdd"
this.$refs["addForm"].validate(async (valid) => {
if (valid) {
this.subLoading = true
const loading = this.$loading({
lock: true,
text: '正在提交...',
spinner: 'el-icon-loading',
background: COVER_LAYER_COLOR
});
const resp = await $.post(loc() + method, {"data": JSON.stringify(this.formData)})
requestLaterFun(resp, () => {
this.dialogVisible = false
this.pageData()
this.$notify.success({title: '成功', message: resp.msg});
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
}, () => {
loading.close()
this.subLoading = false
})
}
});
},
doDelete(id) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning',
callback: async (a, b) => {
if ("confirm" == a) {
const resp = await $.post(loc() + "/doDelete", {id})
requestLaterFun(resp, () => {
this.$notify.success({title: '成功', message: resp.msg});
this.undertakeUnitTree()
}, () => {
this.$notify.error({title: '失败', message: resp.msg});
})
}
}
});
},
async undertakeUnitTree() {
const {data} = await $.get(loc() + "/undertakeUnitTree")
this.treeData = [data]
this.pageData()
}
},
async created() {
await this.undertakeUnitTree()
}
})
</script>
<!--#
}
#-->