This commit is contained in:
2026-05-14 10:26:49 +08:00
parent 0a2e7b3502
commit 2e63cdbad6
@@ -0,0 +1,363 @@
const WORKFLOW_MESSAGE_FORM = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="120px">
<el-form-item prop="title" label="标题">
<el-input maxlength="255" placeholder="请输入标题" v-model="formData.title"></el-input>
</el-form-item>
<!-- <el-form-item prop="url" label="链接地址">
<el-input placeholder="请输入链接地址" v-model="formData.url"></el-input>
</el-form-item>-->
<el-form-item prop="wechatEnterprise" label="同步企业微信">
<div style="color: grey; font-size: 13px">(温馨提醒:如选择是,将会在审核通过后同步发送到企业微信。)</div>
<el-radio-group v-model="formData.wechatEnterprise" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
<!--<el-form-item prop="needBack" label="是否需要反馈">
<el-radio-group v-model="formData.needBack" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>-->
<el-form-item label="用户列表">
<el-row class="mb10">
<el-button icon="el-icon-search" @click="openSelect" size="small">选择用户</el-button>
<el-button icon="el-icon-delete" @click="clearSelect" type="danger" size="small">清空用户</el-button>
</el-row>
<el-table :data="userTableData" style="width: 100%" size="mini" max-height="500">
<el-table-column fixed prop="loginname" label="工号" width="150"></el-table-column>
<el-table-column prop="username" label="姓名" width="120"></el-table-column>
<el-table-column prop="sex" label="性别" width="50"></el-table-column>
<el-table-column prop="userState" label="在职状态" width="120"></el-table-column>
<el-table-column prop="personType" label="教职工类别" width="120"></el-table-column>
<el-table-column prop="mobile" label="手机" width="120"></el-table-column>
<el-table-column prop="unitname" label="所属单位" show-overflow-tooltip></el-table-column>
<el-table-column prop="unionname" label="所属工会" show-overflow-tooltip></el-table-column>
</el-table>
<p style="color: var(--color-primary)">总计:{{ userTableData.length }}人</p>
</el-form-item>
<el-form-item prop="note" label="消息内容">
<text-editor v-model="formData.note"></text-editor>
</el-form-item>
<el-form-item prop="files" label="消息附件">
<file-upload :value.sync="formData.files" :upload_number="5" upload_result_category="array" complete_result></file-upload>
</el-form-item>
<el-row class="mt20" justify="end" type="flex">
<el-button @click="back">取消</el-button>
<el-button type="primary" @click="doSubmit" :loading="formLoading">提交审核</el-button>
</el-row>
</el-form>
<el-dialog title="选择用户" :visible.sync="selectDialogVisible" width="65%" append-to-body top="2%" class="select-dialog">
<div class="btn-group tool-button" style="line-height: 50px">
<el-input placeholder="请输入内容" v-model="pageForm.searchKeyword" @keyup.enter.native="doSearch" style="width: 240px">
<el-select v-model="pageForm.searchName" slot="prepend" placeholder="查询类型" style="width: 80px">
<el-option label="工号" value="u.loginname"></el-option>
<el-option label="姓名" value="u.username"></el-option>
<el-option label="手机" value="u.mobile"></el-option>
</el-select>
</el-input>
<el-select v-model="pageForm.sex" placeholder="性别" clearable>
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
<el-select v-if="showUnionSelect" v-model="pageForm.unionId" @change="flushUnits" @clear="flushUnits" placeholder="请选择所属工会" filterable clearable>
<el-option v-for="item in unionList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-select v-if="showUnitSelect" v-model="pageForm.unitId" placeholder="请选择所属单位" filterable clearable>
<el-option v-for="item in selectUnitList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-select v-if="showClubSelect" v-model="pageForm.clubId" placeholder="请选择所属协会" filterable clearable>
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
</el-select>
<el-select v-if="showRoleSelect" v-model="pageForm.roleId" placeholder="请选择角色" filterable clearable>
<el-option v-for="item in roleList" :key="item.id" :label="item.name" :value="item.id"></el-option>
</el-select>
<el-button icon="el-icon-search" @click="doSearch" type="primary"></el-button>
</div>
<div class="left-span-label mt20">人员列表</div>
<el-table :data="tableData" v-loading="tableLoading" @selection-change="handleSelectionChange" row-key="id" ref="tableRef">
<el-table-column type="selection" reserve-selection width="35"></el-table-column>
<el-table-column fixed prop="loginname" label="工号" width="150"></el-table-column>
<el-table-column prop="username" label="姓名" width="120"></el-table-column>
<el-table-column prop="sex" label="性别" width="50"></el-table-column>
<el-table-column prop="userState" label="在职状态" width="120"></el-table-column>
<el-table-column prop="personType" label="教职工类别" width="120"></el-table-column>
<el-table-column prop="mobile" label="手机" width="120"></el-table-column>
<el-table-column prop="unitname" label="所属单位" show-overflow-tooltip></el-table-column>
<el-table-column prop="unionname" label="所属工会" show-overflow-tooltip></el-table-column>
</el-table>
<el-row class="el-pagination-container">
<el-pagination @size-change="pageSizeChange" @current-change="pageNumberChange" :current-page="pageForm.pageNumber" :page-sizes="[10, 20, 30, 50]" :page-size="pageForm.pageSize" layout="total, sizes, prev, pager, next" :total="pageForm.totalCount"></el-pagination>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="selectDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSelect">确 定</el-button>
</span>
</el-dialog>
</div>
`,
mixins: [initTableMixins],
data() {
return {
formData: {},
taskId: null,
userTableData: [],
tableData: [],
selectUsers: [],
selectUnitList: [],
unionList: [],
unitList: [],
clubList: [],
roleList: [],
selectDialogVisible: false,
tableLoading: false,
formLoading: false,
pageForm: {
searchName: "u.username",
searchKeyword: "",
pageNumber: 1,
pageSize: 10,
totalCount: 0,
pageOrderName: "",
pageOrderBy: ""
},
formRules: {
title: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
note: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
needBack: [{ required: true, message: "必填", trigger: ["blur", "change"] }],
wechatEnterprise: [{ required: true, message: "必填", trigger: ["blur", "change"] }]
}
}
},
computed: {
isSchoolMsgScope() {
return this.$auth.hasPermission("dayofficework.message.workflow.school")
},
isUnionMsgScope() {
return !this.isSchoolMsgScope && this.$auth.hasPermission("dayofficework.message.workflow.union")
},
isClubMsgScope() {
return !this.isSchoolMsgScope && this.$auth.hasPermission("dayofficework.message.workflow.club")
},
showUnionSelect() {
return this.isSchoolMsgScope
},
showUnitSelect() {
return this.isSchoolMsgScope || this.isUnionMsgScope
},
showClubSelect() {
return this.isSchoolMsgScope || this.isClubMsgScope
},
showRoleSelect() {
return this.isSchoolMsgScope
}
},
methods: {
initAdd() {
this.formData = {
id: "",
needBack: false,
wechatEnterprise: false
}
this.taskId = null
this.userTableData = []
this.selectUsers = []
if (this.$refs.formRef) {
this.$refs.formRef.resetFields()
}
if (this.$refs.tableRef) {
this.$refs.tableRef.clearSelection()
}
},
// 编辑撤回后的消息申请:row 为申请列表当前行,需包含 id 和 startTaskId;详情接口返回 message 与 receivers 用于回填表单。
initEdit(row) {
this.taskId = row.startTaskId || row.taskId
this.$axios.post("/platform/dayofficework/workflowmessage/info", { id: row.id }).then((res) => {
if (res.code === 0) {
this.formData = res.data.message
this.userTableData = res.data.receivers.map((receiver) => {
return {
id: receiver.userId,
loginname: receiver.loginName,
username: receiver.userName,
sex: receiver.sex,
mobile: receiver.mobile,
userState: receiver.userState,
personType: receiver.personType,
unitname: receiver.unitName,
unionname: receiver.unionName
}
})
this.selectUsers = []
if (this.$refs.formRef) {
this.$refs.formRef.clearValidate()
}
if (this.$refs.tableRef) {
this.$refs.tableRef.clearSelection()
}
} else {
this.$message.warning(res.msg)
}
})
},
back() {
this.$emit("back")
},
// 初始化表单选人基础数据:单位、工会、协会、角色用于选人弹窗筛选条件。
initSelectData() {
this.$businessTool.listUnit().then((data) => {
this.unitList = data
if (this.isSchoolMsgScope) {
this.selectUnitList = data
}
})
this.$businessTool.listUnion().then((data) => {
this.unionList = data
})
this.$businessTool.listCLubByRole().then((data) => {
this.clubList = data
})
this.$axios.post("/platform/dayofficework/workflowmessage/roleList").then((res) => {
if (res.code === 0) {
this.roleList = res.data
}
})
},
getCurrentUnionId() {
return this.$store.state.user.union && this.$store.state.user.union.id ? this.$store.state.user.union.id : ""
},
applyMsgScope(resetUnitId) {
if (!this.showRoleSelect) {
this.$set(this.pageForm, "roleId", null)
}
if (!this.showUnitSelect) {
this.$set(this.pageForm, "unitId", null)
}
if (!this.showClubSelect) {
this.$set(this.pageForm, "clubId", null)
}
if (this.isUnionMsgScope) {
const unionId = this.getCurrentUnionId()
this.$set(this.pageForm, "unionId", unionId)
if (resetUnitId) {
this.$set(this.pageForm, "unitId", null)
this.selectUnitList = []
}
if (unionId && (resetUnitId || this.selectUnitList.length === 0)) {
this.$businessTool.listUnit(unionId).then((data) => {
this.selectUnitList = data
})
}
return
}
if (this.isSchoolMsgScope) {
this.selectUnitList = this.unitList
return
}
this.$set(this.pageForm, "unionId", null)
this.selectUnitList = []
},
flushUnits() {
this.$set(this.pageForm, "unitId", null)
this.selectUnitList = []
if (this.pageForm.unionId) {
this.$businessTool.listUnit(this.pageForm.unionId).then((data) => {
this.selectUnitList = data
})
}
this.doSearch()
},
openSelect() {
this.applyMsgScope(true)
this.selectDialogVisible = true
this.pageData()
},
clearSelect() {
this.userTableData = []
if (this.$refs.tableRef) {
this.$refs.tableRef.clearSelection()
}
},
handleSelectionChange(val) {
this.selectUsers = val
},
pageData() {
this.applyMsgScope(false)
this.tableLoading = true
this.$axios.post("/platform/dayofficework/workflowmessage/userData", this.pageForm).then((res) => {
if (res.code === 0) {
this.tableData = res.data.list
this.pageForm.totalCount = res.data.totalCount
} else {
this.$message.warning(res.msg)
}
}).finally(() => {
this.tableLoading = false
})
},
doSelect() {
const tableLoginNames = this.userTableData.map((v) => v.loginname)
const selectUsers = this.selectUsers.length > 0 ? this.selectUsers : (this.$refs.tableRef && this.$refs.tableRef.selection ? this.$refs.tableRef.selection : [])
if (selectUsers.length === 0) {
this.$message.warning("请选择用户")
return
}
selectUsers.forEach((o) => {
if (!tableLoginNames.includes(o.loginname)) {
this.userTableData.push(o)
}
})
if (this.$refs.tableRef) {
this.$refs.tableRef.clearSelection()
}
this.selectDialogVisible = false
},
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (!valid) {
return
}
const loginNames = this.userTableData.map((u) => u.loginname)
if (loginNames.length === 0) {
this.$message.warning("请选择用户")
return
}
if (loginNames.length > 100) {
this.$message.warning("单条消息最多发送100人,请分批次发送。")
return
}
this.$confirm("您确定要提交消息发送申请吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.formLoading = true
const url = this.formData.id ? "/platform/dayofficework/workflowmessage/updateSubmit" : "/platform/dayofficework/workflowmessage/submit"
const params = {
message: JSON.stringify(this.formData),
users: JSON.stringify(loginNames)
}
if (this.formData.id) {
this.$set(params, "taskId", this.taskId)
}
this.$axios.post(url, params).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.$emit("success")
this.back()
} else {
this.$message.error(res.msg)
}
}).finally(() => {
this.formLoading = false
})
})
})
}
},
created() {
this.initSelectData()
}
}