feat: 同步地大代码-打开密码sso验证
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
-- 1. 将现有“社团统计”移到新父级下面,保留原权限和角色关联。
|
||||
UPDATE sys_menu
|
||||
SET parentId = 'f2b61f72eab34e139bc150a2d907c385',
|
||||
path = '001100060001',
|
||||
updatedAt = UNIX_TIMESTAMP(NOW()) * 1000,
|
||||
permission = 'club.statistics.group'
|
||||
WHERE id = 'b8817cce3ae34d49844a7ea8d8b15f3f'
|
||||
AND permission = 'club.statistics';
|
||||
|
||||
-- 2. 新增“社团统计”父级菜单。
|
||||
INSERT INTO sys_menu (
|
||||
id, parentId, path, name, aliasName, type, href, target,
|
||||
icon, showit, disabled, permission, location, hasChildren,
|
||||
createdBy, createdAt, updatedBy, updatedAt, delFlag,
|
||||
platform, moduleId, initialPinyinName, isRecommendApp, isRecommendService
|
||||
) VALUES (
|
||||
'f2b61f72eab34e139bc150a2d907c385',
|
||||
'',
|
||||
'00110006',
|
||||
'社团统计', '', 'menu',
|
||||
'', '',
|
||||
'', 1, 0, 'club.statistics', 411, 1,
|
||||
'', UNIX_TIMESTAMP(NOW()) * 1000,
|
||||
'', UNIX_TIMESTAMP(NOW()) * 1000, 0,
|
||||
'PC', '4cfc8977507c40b3acee8443c7c5a8a3', 's', 0, 0
|
||||
);
|
||||
|
||||
-- 3. 新增“成员统计”子菜单。
|
||||
INSERT INTO sys_menu (
|
||||
id, parentId, path, name, aliasName, type, href, target,
|
||||
icon, showit, disabled, permission, location, hasChildren,
|
||||
createdBy, createdAt, updatedBy, updatedAt, delFlag,
|
||||
platform, moduleId, initialPinyinName, isRecommendApp, isRecommendService
|
||||
) VALUES (
|
||||
'a914ce82f0764e9c8f1b35a6d2270b41',
|
||||
'f2b61f72eab34e139bc150a2d907c385',
|
||||
'001100060002',
|
||||
'成员统计', '', 'menu',
|
||||
'/platform/club/statistics/member', 'data-pjax',
|
||||
'', 1, 0, 'club.statistics.member', 412, 0,
|
||||
'', UNIX_TIMESTAMP(NOW()) * 1000,
|
||||
'', UNIX_TIMESTAMP(NOW()) * 1000, 0,
|
||||
'PC', '4cfc8977507c40b3acee8443c7c5a8a3', 'c', 0, 0
|
||||
);
|
||||
|
||||
-- 成员统计可查询所有社团,仅给系统管理员和校工会管理员授权。
|
||||
-- 社团统计父级
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES
|
||||
('419844ad90f34ca58807e84224905f27', 'f2b61f72eab34e139bc150a2d907c385'),
|
||||
('6aece46b946e4fb9ac4cb15c0cd8c3e6', 'f2b61f72eab34e139bc150a2d907c385'),
|
||||
('722d454171ac49f1bba60b7672e500ff', 'f2b61f72eab34e139bc150a2d907c385'),
|
||||
('72e17abb91cb48b4820474904e189182', 'f2b61f72eab34e139bc150a2d907c385'),
|
||||
('7f4a820d5a394bb8a0a92d6699afe7c8', 'f2b61f72eab34e139bc150a2d907c385');
|
||||
|
||||
-- 成员统计
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES
|
||||
('722d454171ac49f1bba60b7672e500ff', 'a914ce82f0764e9c8f1b35a6d2270b41'),
|
||||
('7f4a820d5a394bb8a0a92d6699afe7c8', 'a914ce82f0764e9c8f1b35a6d2270b41');
|
||||
@@ -1,58 +0,0 @@
|
||||
;(function (a) {
|
||||
;(jQuery.browser = jQuery.browser || {}).mobile =
|
||||
/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i.test(
|
||||
a
|
||||
) ||
|
||||
/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(
|
||||
a.substr(0, 4)
|
||||
)
|
||||
})(navigator.userAgent || navigator.vendor || window.opera)
|
||||
|
||||
$.ajaxSetup({
|
||||
contentType: "application/x-www-form-urlencoded;charset=utf-8",
|
||||
success: function (response, textStatus, jqXHR) {
|
||||
if (response.code !== 0) {
|
||||
// AJAX全局回调没有Vue实例上下文,使用Element全局消息组件展示业务错误。
|
||||
if (window.ELEMENT && ELEMENT.Message) {
|
||||
ELEMENT.Message.error(response.msg)
|
||||
}
|
||||
} else {
|
||||
return response
|
||||
}
|
||||
},
|
||||
error: function (v1) {
|
||||
this.$message.error(v1.status + " " + v1.statusText)
|
||||
},
|
||||
complete: function (XMLHttpRequest, textStatus) {
|
||||
var sessionstatus = XMLHttpRequest.getResponseHeader("loginStatus") //通过XMLHttpRequest取得响应头,sessionstatus,
|
||||
if (sessionstatus == "accessDenied") {
|
||||
this.$message({
|
||||
message: "\u767b\u5f55\u5931\u6548\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u91cd\u65b0\u767b\u5f55",
|
||||
type: "error"
|
||||
})
|
||||
}
|
||||
if (sessionstatus == "unauthorized") {
|
||||
this.$message({
|
||||
message: "\u6ca1\u6709\u6743\u9650",
|
||||
type: "error"
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
function pjaxReplace(url, data = {}) {
|
||||
const { pathname, search } = location
|
||||
if (url === pathname + search) {
|
||||
return
|
||||
}
|
||||
$.pjax({
|
||||
url: url,
|
||||
container: "#sub-app-container-main-content-body",
|
||||
maxCacheLength: 0,
|
||||
push: false,
|
||||
replace: true,
|
||||
fragment: "#sub-app-container-main-content-body",
|
||||
timeout: 8000,
|
||||
data
|
||||
})
|
||||
}
|
||||
@@ -11,7 +11,7 @@
|
||||
|
||||
<el-table-column label="总分" prop="totalScore" header-align="center"
|
||||
align="center" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column align="center" header-align="center" type="index" :index="indexMethod" label="名次"
|
||||
<el-table-column align="center" header-align="center" prop="rank" label="名次"
|
||||
width="80px"></el-table-column>
|
||||
|
||||
</el-table>
|
||||
@@ -47,7 +47,21 @@ module.exports = {
|
||||
this.tableData = []
|
||||
const {data} = await this.$axios.post(loc() + "/isScoreTopEight", this.Form)
|
||||
const table = data.score.sort(this.compare("totalScore"))
|
||||
this.tableData = table.slice(0, 8)
|
||||
// 按竞赛名次规则取前八:同分并列同名次,并列后名次不跳号(dense rank);
|
||||
// 名次大于 8 的舍弃。不能直接 slice(0, 8),否则同分并列的工会会被切掉。
|
||||
const ranked = []
|
||||
let rank = 0
|
||||
let prevScore = null
|
||||
table.forEach(v => {
|
||||
// 总分带 0.5 折半小数,比较用容差,避免浮点误差误判并列
|
||||
if (prevScore === null || Math.abs(v.totalScore - prevScore) > 0.000001) {
|
||||
// 每遇到一个新的分值,名次 +1;同分者沿用同一名次
|
||||
rank += 1
|
||||
prevScore = v.totalScore
|
||||
}
|
||||
ranked.push(Object.assign({}, v, {rank: rank}))
|
||||
})
|
||||
this.tableData = ranked.filter(v => v.rank <= 8)
|
||||
} catch (e) {
|
||||
this.$message.error(e.msg)
|
||||
} finally {
|
||||
|
||||
@@ -15,7 +15,7 @@ const act = {
|
||||
<el-image :src="activity.cover" fit="cover" :alt="activity.name">
|
||||
<div slot="error" class="portal-cover-empty"><i class="fa fa-picture-o" aria-hidden="true"></i><span>暂无图片</span></div>
|
||||
</el-image>
|
||||
<span class="status" :class="{'status-ended': getStatusText(activity) === '已结束', 'status-upcoming': getStatusText(activity) === '未开始'}">
|
||||
<span class="status" :class="{'status-ended': getStatusText(activity) === '报名已结束', 'status-upcoming': getStatusText(activity) === '未开始'}">
|
||||
{{getStatusText(activity)}}
|
||||
</span>
|
||||
</div>
|
||||
@@ -76,9 +76,9 @@ const act = {
|
||||
if (!this.swiper) return
|
||||
this.swiper.isEnd ? this.swiper.slideTo(0) : this.swiper.slideNext()
|
||||
},
|
||||
/*查询活动*/
|
||||
// PC首页包含已结束活动;接口data为按未结束在前、已结束在后排列的活动实体数组。
|
||||
listAct() {
|
||||
this.$axios.post("/platform/home/listHomeActivity").then((res) => {
|
||||
this.$axios.post("/platform/home/listHomeActivity", {includeEnded: true}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
// for (let i = 0; i < 10; i++) {
|
||||
// this.actList = this.actList.concat(res.data)
|
||||
@@ -149,7 +149,7 @@ const act = {
|
||||
// 活动状态
|
||||
getStatusText(item) {
|
||||
if (this.$moment().unix() > this.$moment(item.endDate).unix()) {
|
||||
return "已结束"
|
||||
return "报名已结束"
|
||||
} else if (this.$moment().unix() < this.$moment(item.startDate).unix()) {
|
||||
return "未开始"
|
||||
} else {
|
||||
|
||||
@@ -40,7 +40,7 @@ const branchUnionGroupManage = {
|
||||
</el-card>
|
||||
|
||||
<el-dialog :title="formData.id ? '编辑' : '新增'" :visible.sync="dialogFormVisible" width="600px"
|
||||
:close-on-click-modal="false">
|
||||
:close-on-click-modal="false" @close="clearUserOptions">
|
||||
<el-form ref="formRef" :model="formData" :rules="rules" label-width="100px">
|
||||
<el-form-item label="小组编码" prop="code">
|
||||
<el-input v-model="formData.code" placeholder="小组编码" maxlength="10"
|
||||
@@ -103,6 +103,7 @@ const branchUnionGroupManage = {
|
||||
unitIds: [{ required: true, message: "请选择组成单位", trigger: "change" }],
|
||||
},
|
||||
userOptions: [],
|
||||
userOptionsRequestId: 0,
|
||||
units: [],
|
||||
}
|
||||
},
|
||||
@@ -173,13 +174,21 @@ const branchUnionGroupManage = {
|
||||
})
|
||||
},
|
||||
|
||||
clearUserOptions() {
|
||||
this.userOptions = []
|
||||
// 关闭后使未完成的搜索失效,防止旧结果回填到下一次打开的弹窗。
|
||||
this.userOptionsRequestId++
|
||||
},
|
||||
|
||||
getUserOptions(keyword, userIds = null) {
|
||||
if (!this.dialogFormVisible && !userIds) return
|
||||
const requestId = ++this.userOptionsRequestId
|
||||
$.get("/platform/sys/unionGroup/listUser", {
|
||||
keyword,
|
||||
unionId: this.union_id,
|
||||
userIds: JSON.stringify(userIds)
|
||||
}).then((res) => {
|
||||
if (res.code === 0) {
|
||||
if (res.code === 0 && this.dialogFormVisible && requestId === this.userOptionsRequestId) {
|
||||
this.userOptions = res.data
|
||||
}
|
||||
})
|
||||
|
||||
@@ -77,6 +77,7 @@ layout("/layouts/platform.html"){
|
||||
<el-input placeholder="输入关键字进行查找" v-model="filterText" clearable></el-input>
|
||||
<div style="max-height: calc(100vh - 200px); overflow-y: auto">
|
||||
<el-tree
|
||||
v-loading="treeLoading"
|
||||
:data="treeData"
|
||||
ref="treeRef"
|
||||
:expand-on-click-node="false"
|
||||
@@ -151,13 +152,14 @@ layout("/layouts/platform.html"){
|
||||
<!--#include("unitLeader.js"){}#-->
|
||||
new Vue({
|
||||
el: "#app",
|
||||
data: function () {
|
||||
data() {
|
||||
return {
|
||||
unitTabActive: "threeUnitManage",
|
||||
filterText: null,
|
||||
currentTreeNode: null,
|
||||
currentTreeData: null,
|
||||
defaultExpandedKeys: [],
|
||||
treeLoading: false,
|
||||
treeData: []
|
||||
}
|
||||
},
|
||||
@@ -173,26 +175,45 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
methods: {
|
||||
getTreeData() {
|
||||
this.$axios.post(loc() + "/tree").then((res) => {
|
||||
this.treeData = res.data
|
||||
if (this.treeData) {
|
||||
this.currentTreeData = this.treeData[0]
|
||||
this.defaultExpandedKeys = this.treeData.length > 0 ? [this.treeData[0].id] : []
|
||||
this.$set(this, "treeLoading", true)
|
||||
// tree 返回单位树数组;失败时保留现有内容,成功后按 ID 恢复当前单位。
|
||||
return this.$axios.post(loc() + "/tree").then((res) => {
|
||||
if (res.code !== 0 || !Array.isArray(res.data)) return
|
||||
const selectedId = this.currentTreeData?.id
|
||||
this.$set(this, "treeData", res.data)
|
||||
this.$set(this, "defaultExpandedKeys", res.data.length > 0 ? [res.data[0].id] : [])
|
||||
if (res.data.length === 0) {
|
||||
this.$set(this, "currentTreeData", null)
|
||||
this.$set(this, "currentTreeNode", null)
|
||||
return
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
const tree = this.$refs.treeRef
|
||||
const node = (selectedId && tree.getNode(selectedId)) || tree.getNode(res.data[0].id)
|
||||
// 将选中节点的祖先展开,避免刷新后当前单位隐藏在折叠的分支中。
|
||||
let parent = node.parent
|
||||
while (parent && parent.level > 0) {
|
||||
parent.expanded = true
|
||||
parent = parent.parent
|
||||
}
|
||||
tree.setCurrentKey(node.data.id)
|
||||
tree.filter(this.filterText)
|
||||
this.treeNodeClick(node.data, node)
|
||||
})
|
||||
}).finally(() => {
|
||||
this.$set(this, "treeLoading", false)
|
||||
})
|
||||
},
|
||||
treeNodeClick(data, node) {
|
||||
this.currentTreeData = data
|
||||
this.currentTreeNode = node
|
||||
this.$nextTick(()=>{
|
||||
if (data.unitTypeCode==1) {
|
||||
this.$refs.bmlRef.pageData()
|
||||
this.$refs.userRef.pageData()
|
||||
this.$refs.leaderRef.pageData()
|
||||
} else {
|
||||
this.$refs.bzlRef.pageData()
|
||||
}
|
||||
})
|
||||
this.$set(this, "currentTreeData", data)
|
||||
this.$set(this, "currentTreeNode", node)
|
||||
// 单位列表由 currentData 监听刷新,部门类另外更新人员和干部页签。
|
||||
this.$nextTick(() => {
|
||||
if (data.unitTypeCode == 1) {
|
||||
this.$refs.userRef.pageData()
|
||||
this.$refs.leaderRef.pageData()
|
||||
}
|
||||
})
|
||||
},
|
||||
filterNode(value, data, node) {
|
||||
if (!value) return true
|
||||
|
||||
@@ -11,7 +11,7 @@ const UNIT_MANAGE_TEMPLATE = {
|
||||
<table-tool label="单位列表">
|
||||
<el-button @click="openAdd" type="primary" size="small">新建单位</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" size="mini">
|
||||
<el-table :data="tableData" v-loading="tableLoading" size="mini">
|
||||
<el-table-column label="序号" type="index" width="60">
|
||||
<template v-slot="scope">{{scope.$index + (pageForm.pageNumber - 1) * pageForm.pageSize + 1}}</template>
|
||||
</el-table-column>
|
||||
@@ -75,8 +75,8 @@ const UNIT_MANAGE_TEMPLATE = {
|
||||
<!-- </el-form-item>-->
|
||||
</el-form>
|
||||
<span slot="footer" class="dialog-footer">
|
||||
<el-button @click="dialogVisible = false">取 消</el-button>
|
||||
<el-button type="primary" @click="doHandle">确 定</el-button>
|
||||
<el-button :disabled="formLoading" @click="closeDialog">取 消</el-button>
|
||||
<el-button type="primary" :loading="formLoading" @click="doHandle">确 定</el-button>
|
||||
</span>
|
||||
</el-dialog>
|
||||
</div>
|
||||
@@ -110,6 +110,8 @@ const UNIT_MANAGE_TEMPLATE = {
|
||||
audit: false
|
||||
},
|
||||
tableData: [],
|
||||
tableLoading: false,
|
||||
formLoading: false,
|
||||
dialogVisible: false,
|
||||
formData: {},
|
||||
formRules: {
|
||||
@@ -128,96 +130,130 @@ const UNIT_MANAGE_TEMPLATE = {
|
||||
}
|
||||
},
|
||||
computed: {},
|
||||
watch: {
|
||||
// 首次进入、切换节点以及刷新树后,均按最新上级单位从第一页重新查询。
|
||||
currentData: {
|
||||
immediate: true,
|
||||
handler() {
|
||||
this.doSearch()
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
doSearch() {
|
||||
this.pageForm.pageNumber = 1
|
||||
this.pageData()
|
||||
this.$set(this.pageForm, "pageNumber", 1)
|
||||
return this.pageData()
|
||||
},
|
||||
openAdd() {
|
||||
this.dialogVisible = true
|
||||
this.formData = {} //打开新增窗口,表单先清空
|
||||
this.parentUnit = []
|
||||
this.options = []
|
||||
// 上级关系取当前单位 ID,与用户是否点击过树节点无关;手工新增默认其他类。
|
||||
this.$set(this, "formData", {
|
||||
parentId: this.currentData.id,
|
||||
unitLevel: this.unitLevel,
|
||||
unitTypeCode: 0
|
||||
})
|
||||
this.$set(this, "parentUnit", [])
|
||||
this.$set(this, "options", [])
|
||||
this.$set(this, "dialogVisible", true)
|
||||
this.$nextTick(() => {
|
||||
this.$refs.form.clearValidate()
|
||||
})
|
||||
},
|
||||
closeDialog() {
|
||||
// 提交过程中保留表单,等待请求完成后再允许取消。
|
||||
if (!this.formLoading) {
|
||||
this.$set(this, "dialogVisible", false)
|
||||
}
|
||||
},
|
||||
doHandle() {
|
||||
this.$confirm("确定要提交吗?", "提示", {
|
||||
if (this.formLoading) return
|
||||
this.$refs.form.validate((valid) => {
|
||||
if (!valid) return
|
||||
return this.$confirm("确定要提交吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
if (this.formLoading) return
|
||||
const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo"
|
||||
// 新建始终携带当前上级;编辑沿用回显的原上级,不在保存时意外变更层级。
|
||||
if (!this.formData.id) {
|
||||
this.$set(this.formData, "parentId", this.currentData.id)
|
||||
}
|
||||
this.$set(this, "formLoading", true)
|
||||
return this.$axios.post(url, this.formData).then((resp) => {
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.$set(this, "dialogVisible", false)
|
||||
// 父页面刷新并恢复当前树节点,currentData 监听统一刷新列表,避免重复查询。
|
||||
this.$emit("refresh", null)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
}).finally(() => {
|
||||
this.$set(this, "formLoading", false)
|
||||
})
|
||||
}).catch(() => {
|
||||
// 取消确认直接结束;请求错误由全局 axios 拦截器提示,保留表单供重试。
|
||||
})
|
||||
})
|
||||
},
|
||||
// id 为待编辑单位 ID,接口 data 为单位实体;保留已有部门类别及原上级关系。
|
||||
openEdit(id) {
|
||||
return this.$axios.post("/platform/sys/unit/edit/" + id).then((resp) => {
|
||||
if (resp.code === 0) {
|
||||
this.$set(this, "formData", resp.data)
|
||||
this.$set(this, "dialogVisible", true)
|
||||
this.$nextTick(() => {
|
||||
this.$refs.form.clearValidate()
|
||||
})
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
})
|
||||
},
|
||||
doDelete(id) {
|
||||
return this.$confirm("此操作将永久删除, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
}).then(() => {
|
||||
const self = this
|
||||
const url = this.formData.id ? "/platform/sys/unit/editDo" : "/platform/sys/unit/addDo"
|
||||
this.$refs["form"].validate(async function (valid) {
|
||||
if (valid) {
|
||||
if (self.currentNode) {
|
||||
self.formData.parentId = self.currentData.id
|
||||
}
|
||||
const resp = await self.$axios.post(url, self.formData)
|
||||
if (resp.code === 0) {
|
||||
self.$message.success(resp.msg)
|
||||
self.doSearch()
|
||||
self.dialogVisible = false
|
||||
self.$emit("refresh", null)
|
||||
} else {
|
||||
self.$message.warning(resp.msg)
|
||||
}
|
||||
return this.$axios.post("/platform/sys/unit/delete/" + id).then((resp) => {
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.$emit("refresh", null)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
})
|
||||
})
|
||||
},
|
||||
async openEdit(id) {
|
||||
console.log(this.currentData)
|
||||
const resp = await this.$axios.post("/platform/sys/unit/edit/" + id)
|
||||
if (resp.code === 0) {
|
||||
this.formData = resp.data
|
||||
this.dialogVisible = true
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async doDelete(id) {
|
||||
const confirm = await this.$confirm("此操作将永久删除, 是否继续?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
type: "warning"
|
||||
})
|
||||
if (confirm === "confirm") {
|
||||
const resp = await this.$axios.post("/platform/sys/unit/delete/" + id)
|
||||
if (resp.code === 0) {
|
||||
this.$message.success(resp.msg)
|
||||
this.doSearch()
|
||||
this.$emit("refresh", null)
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
pageNumberChange(val) {
|
||||
this.pageForm.pageNumber = val
|
||||
this.$set(this.pageForm, "pageNumber", val)
|
||||
this.pageData()
|
||||
},
|
||||
pageSizeChange(val) {
|
||||
this.pageForm.pageSize = val
|
||||
this.$set(this.pageForm, "pageSize", val)
|
||||
this.pageData()
|
||||
},
|
||||
pageData() {
|
||||
this.pageForm.unitId = this.currentData.id
|
||||
// this.pageForm.unitLevel = this.unitLevel
|
||||
this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
|
||||
if (!this.currentData || !this.currentData.id) return
|
||||
// unitId 限定当前上级,返回 data.list 为下设单位,data.totalCount 为分页总数。
|
||||
this.$set(this.pageForm, "unitId", this.currentData.id)
|
||||
this.$set(this, "tableLoading", true)
|
||||
return this.$axios.post(loc() + "/pageData", this.pageForm).then((res) => {
|
||||
if (res.code === 0) {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
this.$set(this, "tableData", res.data.list)
|
||||
this.$set(this.pageForm, "totalCount", res.data.totalCount)
|
||||
}
|
||||
}).finally(() => {
|
||||
this.$set(this, "tableLoading", false)
|
||||
})
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
this.pageData()
|
||||
|
||||
if (this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN')) {
|
||||
this.unions = await this.$businessTool.listUnion()
|
||||
} else {
|
||||
this.unions = await this.$businessTool.listUnion(this.store.state.user.union.id)
|
||||
}
|
||||
created() {
|
||||
const unionId = this.$auth.hasRoleOr('SYSADMIN, SCHOOL_UNION_ADMIN') ? null : this.store.state.user.union.id
|
||||
this.$businessTool.listUnion(unionId).then((unions) => {
|
||||
this.$set(this, "unions", unions)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
+21
-4
@@ -14,6 +14,7 @@ const ACTIVITY_BASIC_BRANCH_UNION_MANAGE = {
|
||||
<el-card shadow="never" style="border: 1px solid var(--border-color-lighter); margin-top: 10px">
|
||||
<table-tool>
|
||||
<el-button @click="openAdd" icon="ti-plus" type="primary" style="margin-left: auto" size="small">新建临时分工会</el-button>
|
||||
<el-button @click="updateUnions" :loading="formLoading" :disabled="formLoading" icon="el-icon-refresh" type="primary" size="small">更新工会</el-button>
|
||||
</table-tool>
|
||||
<el-table :data="tableData" border size="small" height="calc(100vh - 375px)">
|
||||
<el-table-column label="序号" type="index" :index="indexMethod" width="100px"></el-table-column>
|
||||
@@ -79,6 +80,7 @@ const ACTIVITY_BASIC_BRANCH_UNION_MANAGE = {
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
pageDataUrl: "/platform/activity/basic/union/pageData",
|
||||
dialogFormVisible: false,
|
||||
dialogGlyFormVisible: false,
|
||||
formData: {},
|
||||
@@ -88,10 +90,25 @@ const ACTIVITY_BASIC_BRANCH_UNION_MANAGE = {
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
pageData() {
|
||||
this.$axios.post("/platform/activity/basic/union/pageData", this.pageForm).then((res) => {
|
||||
this.tableData = res.data.list
|
||||
this.pageForm.totalCount = res.data.totalCount
|
||||
// 同步新增工会和已有工会名称;复用表格查询及父页面刷新事件,保留现有查询和分页逻辑。
|
||||
updateUnions() {
|
||||
if (this.formLoading) {
|
||||
return
|
||||
}
|
||||
this.$set(this, "formLoading", true)
|
||||
return this.$axios.post("/platform/activity/basic/union/updateUnions").then((res) => {
|
||||
if (res.code !== 0) {
|
||||
this.notifyWarning(res.msg)
|
||||
return
|
||||
}
|
||||
const result = res.data
|
||||
this.notifySuccess("工会更新完成:新增 " + result.insertCount + " 个,更新名称 " + result.updateCount + " 个。")
|
||||
this.$emit("refresh", null)
|
||||
return this.pageData()
|
||||
}).catch(() => {
|
||||
this.notifyError("工会更新或刷新失败,请刷新页面后核对结果")
|
||||
}).finally(() => {
|
||||
this.$set(this, "formLoading", false)
|
||||
})
|
||||
},
|
||||
openAdd() {
|
||||
|
||||
@@ -9,10 +9,10 @@ layout("/layouts/platform.html"){
|
||||
<div style="max-height: calc(100vh - 160px); overflow-y: auto">
|
||||
<el-tree
|
||||
:data="treeData"
|
||||
:default-expanded-keys="['1']"
|
||||
:default-expanded-keys="pageForm.parentId ? [pageForm.parentId] : []"
|
||||
:expand-on-click-node="false"
|
||||
:props="{
|
||||
children: 'child',
|
||||
children: 'children',
|
||||
label: 'name'
|
||||
}"
|
||||
@node-click="treeNodeClick"
|
||||
@@ -52,6 +52,7 @@ layout("/layouts/platform.html"){
|
||||
</div>
|
||||
<div class="search-item">
|
||||
<el-button @click="doSearch" icon="el-icon-search" type="primary">搜索</el-button>
|
||||
<el-button @click="updateUnits" :loading="formLoading" :disabled="formLoading" icon="el-icon-refresh" type="primary">更新单位</el-button>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
@@ -104,6 +105,36 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
components: {},
|
||||
methods: {
|
||||
// 点击后同步一次系统单位;已有活动工会归属由后端保留,完成后刷新树和当前单位列表。
|
||||
updateUnits() {
|
||||
if (this.formLoading) {
|
||||
return
|
||||
}
|
||||
this.$set(this, "formLoading", true)
|
||||
this.$axios.post(loc() + "/updateUnits").then((res) => {
|
||||
if (res.code !== 0) {
|
||||
this.notifyWarning(res.msg)
|
||||
return
|
||||
}
|
||||
const result = res.data
|
||||
let message = "单位更新完成:新增 " + result.insertCount + " 个,更新 " + result.updateCount + " 个。"
|
||||
if (result.pendingUnionCount > 0) {
|
||||
message += "新增单位中有 " + result.pendingUnionCount + " 个待配置活动工会,请到活动工会的组成单位中维护。"
|
||||
this.notifyWarning(message)
|
||||
} else {
|
||||
this.notifySuccess(message)
|
||||
}
|
||||
return this.getTreeData().then((loaded) => {
|
||||
if (loaded) {
|
||||
this.doSearch()
|
||||
}
|
||||
})
|
||||
}).catch(() => {
|
||||
this.notifyError("单位更新或刷新失败,请刷新页面后核对结果")
|
||||
}).finally(() => {
|
||||
this.$set(this, "formLoading", false)
|
||||
})
|
||||
},
|
||||
async doDelete(id) {
|
||||
const confirm = await this.$confirm("确定要删除该单位吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
@@ -122,24 +153,42 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
},
|
||||
treeNodeClick(data, node) {
|
||||
this.currentTreeData = data
|
||||
this.currentTreeNode = node
|
||||
this.pageForm.parentId = data.id
|
||||
this.$set(this, "currentTreeData", data)
|
||||
this.$set(this, "currentTreeNode", node)
|
||||
this.$set(this.pageForm, "parentId", data.id)
|
||||
this.doSearch()
|
||||
},
|
||||
getTreeData() {
|
||||
this.$axios.post(loc() + "/tree").then((res) => {
|
||||
this.treeData = res.data
|
||||
if (this.treeData) {
|
||||
this.currentTreeData = this.treeData[0]
|
||||
return this.$axios.post(loc() + "/tree").then((res) => {
|
||||
if (res.code !== 0) {
|
||||
this.notifyWarning(res.msg)
|
||||
return false
|
||||
}
|
||||
this.$set(this, "treeData", res.data || [])
|
||||
// 同步后沿用当前选择,首次进入按真实树根查询,不再依赖旧的根单位ID常量。
|
||||
if (!this.pageForm.parentId && this.treeData.length > 0) {
|
||||
this.$set(this.pageForm, "parentId", this.treeData[0].id)
|
||||
}
|
||||
this.$nextTick(() => {
|
||||
const tree = this.$refs.treeRef
|
||||
const node = tree.getNode(this.pageForm.parentId)
|
||||
this.$set(this, "currentTreeNode", node || null)
|
||||
this.$set(this, "currentTreeData", node ? node.data : null)
|
||||
tree.setCurrentKey(this.pageForm.parentId)
|
||||
})
|
||||
return true
|
||||
})
|
||||
},
|
||||
openUnit() {}
|
||||
},
|
||||
created() {
|
||||
this.pageData()
|
||||
this.getTreeData()
|
||||
this.getTreeData().then((loaded) => {
|
||||
if (loaded) {
|
||||
this.doSearch()
|
||||
}
|
||||
}).catch(() => {
|
||||
this.notifyError("加载单位失败,请稍后重试")
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
@@ -6,18 +6,19 @@ layout("/layouts/platform.html"){
|
||||
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<search @search="doSearch" :is-search-button="false">
|
||||
<search @search="refreshPrizes" :is-search-button="false">
|
||||
<search-item label="年度">
|
||||
<el-date-picker
|
||||
:clearable="false"
|
||||
:disabled="tableLoading"
|
||||
@change="getActivitys"
|
||||
placeholder="选择年"
|
||||
style="width: 100%" type="year"
|
||||
v-model="pageForm.year" value-format="yyyy">
|
||||
</el-date-picker>
|
||||
</search-item>
|
||||
<search-item label="活动名称" v-if="!pageForm.status">
|
||||
<el-select :clearable="false" @change="actChange(pageForm.activityId)"
|
||||
<search-item label="活动名称" v-if="pageForm.status!=='1'">
|
||||
<el-select :clearable="false" :disabled="tableLoading" @change="actChange(pageForm.activityId)"
|
||||
filterable
|
||||
placeholder="请选择活动名称"
|
||||
style="width: 100%" v-model="pageForm.activityId">
|
||||
@@ -30,7 +31,7 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="工会名称" v-if="!pageForm.status">
|
||||
<el-select :clearable="false" @change="unionChange(pageForm.unionId)"
|
||||
<el-select :clearable="false" :disabled="tableLoading" @change="unionChange(pageForm.unionId)"
|
||||
filterable
|
||||
placeholder="请选择工会"
|
||||
style="width: 100%" v-model="pageForm.unionId">
|
||||
@@ -43,9 +44,9 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="性别" v-if="pageForm.status==='1'||!pageForm.status">
|
||||
<el-select filterable
|
||||
<el-select filterable :disabled="tableLoading"
|
||||
placeholder="请选择性别"
|
||||
style="width: 100%" v-model="pageForm.sex">
|
||||
style="width: 100%" v-model="pageForm.sex" @change="sexChange">
|
||||
<el-option label="男" value="男"></el-option>
|
||||
<el-option label="女" value="女"></el-option>
|
||||
</el-select>
|
||||
@@ -56,7 +57,7 @@ layout("/layouts/platform.html"){
|
||||
|
||||
<el-card class="mt10" shadow="never">
|
||||
<table-tool
|
||||
:label="pageForm.status==='2'?('浙江师范大学'+pageForm.year+'年教职工运动会获奖个数汇总表'):'奖品名单'">
|
||||
:label="pageForm.status==='2'?('中国地质大学(武汉)'+pageForm.year+'年教职工运动会获奖个数汇总表'):'奖品名单'">
|
||||
<el-tag
|
||||
:effect="pageForm.status===item.code?'dark':'plain'"
|
||||
:key="item.code"
|
||||
@@ -66,17 +67,32 @@ layout("/layouts/platform.html"){
|
||||
v-for="item in statusOptions">
|
||||
{{ item.name }}
|
||||
</el-tag>
|
||||
<el-button @click="print" icon="el-icon-printer" type="primary" size="small">打 印</el-button>
|
||||
<el-button @click="print" :disabled="tableLoading || queryFailed" icon="el-icon-printer" type="primary" size="small">打 印</el-button>
|
||||
</table-tool>
|
||||
|
||||
|
||||
<div id=print>
|
||||
<template v-if="pageForm.activityId!=null">
|
||||
<!-- 未分配记录同时进入打印内容,避免将部分已确认数量当作最终发放总数。 -->
|
||||
<div v-if="isSummary!==3" class="mb10">
|
||||
<p>{{ isSummary===2 ? '当前活动' : '当前工会' }}已确认奖品:{{ confirmedTotal }}份;当前活动待确认成绩:{{ pendingResults.length }}条。</p>
|
||||
<el-alert v-if="pendingResults.length" type="warning" :closable="false" title="当前数量尚未包含以下待确认成绩,请补充分配后再作为最终发放依据。"></el-alert>
|
||||
<table v-if="pendingResults.length" class="table table-bordered">
|
||||
<tr><th>项目</th><th>参赛工会/人员</th><th>名次</th><th>获奖总人数</th><th>操作</th></tr>
|
||||
<tr v-for="item in pendingResults" :key="item.id">
|
||||
<td>{{ item.allName }}</td>
|
||||
<td>{{ item.username || item.participantUnionName }}</td>
|
||||
<td>第{{ item.ranking }}名</td>
|
||||
<td>{{ item.totalNumberOfPeople == null ? '待确认' : item.totalNumberOfPeople }}</td>
|
||||
<td><a :href="resultsInputUrl(item)">补充分配</a></td>
|
||||
</tr>
|
||||
</table>
|
||||
</div>
|
||||
<template v-if="isSummary!==3">
|
||||
<table class="table table-bordered" v-if="isSummary==1" v-loading="tableLoading">
|
||||
<tr>
|
||||
<td class="text-center" colspan="11">
|
||||
<span v-if="activityList.find(v=>v.id === pageForm.activityId)">
|
||||
浙江师范大学{{ activityList.find(v=>v.id === pageForm.activityId).name }}
|
||||
中国地质大学(武汉){{ activityList.find(v=>v.id === pageForm.activityId).name }}
|
||||
({{unionName}})获奖名单
|
||||
</span>
|
||||
</td>
|
||||
@@ -97,10 +113,10 @@ layout("/layouts/platform.html"){
|
||||
<td>{{k}}</td>
|
||||
<td v-for="i in 8">
|
||||
<span v-if="o.filter(f=>f.ranking==i && f.numberOfPeople!=null) && o.filter(f=>f.ranking==i && f.numberOfPeople!=null).length>0">
|
||||
{{o.filter(f=>f.ranking==i && f.numberOfPeople!=null).map(g=>g.numberOfPeople).reduce((a,b)=>a+b)}}
|
||||
{{o.filter(f=>f.ranking==i && f.numberOfPeople!=null).map(g=>Number(g.numberOfPeople)).reduce((a,b)=>a+b,0)}}
|
||||
</span>
|
||||
</td>
|
||||
<td></td>
|
||||
<td>{{ prizeSourceText(o) }}</td>
|
||||
</tr>
|
||||
<tr v-for="(o,k,index) in tableDataUnionPrize['男子项目']">
|
||||
<td :rowspan="Object.keys(tableDataUnionPrize['男子项目']).length"
|
||||
@@ -111,7 +127,7 @@ layout("/layouts/platform.html"){
|
||||
<td v-for="i in 8">
|
||||
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
|
||||
</td>
|
||||
<td></td>
|
||||
<td>{{ prizeSourceText(o) }}</td>
|
||||
</tr>
|
||||
<tr v-for="(o,k,index) in tableDataUnionPrize['女子项目']">
|
||||
<td :rowspan="Object.keys(tableDataUnionPrize['女子项目']).length" dd
|
||||
@@ -122,7 +138,13 @@ layout("/layouts/platform.html"){
|
||||
<td v-for="i in 8">
|
||||
{{o.filter(f=>f.ranking==i).map(g=>g.username).join('、')}}
|
||||
</td>
|
||||
<td></td>
|
||||
<td>{{ prizeSourceText(o) }}</td>
|
||||
</tr>
|
||||
<tr v-for="(o,k,index) in tableDataUnionPrize['其他']">
|
||||
<td :rowspan="Object.keys(tableDataUnionPrize['其他']).length" v-if="index===0">其他项目</td>
|
||||
<td>{{ k }}</td>
|
||||
<td v-for="i in 8">{{ o.filter(item=>item.ranking===i).map(item=>item.username).join('、') }}</td>
|
||||
<td>{{ prizeSourceText(o) }}</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td>合计</td>
|
||||
@@ -283,200 +305,161 @@ layout("/layouts/platform.html"){
|
||||
],
|
||||
tableDataUnionPrize: {},
|
||||
lastSum: {},
|
||||
tableDataPrize: [],
|
||||
tableDataPrize: {},
|
||||
confirmedTotal: 0,
|
||||
pendingResults: [],
|
||||
queryFailed: false,
|
||||
|
||||
statusOptions: [{code: "1", name: "分组汇总年度前八"}, {code: "2", name: "奖品个数年度汇总表"}]
|
||||
}
|
||||
},
|
||||
components: {},
|
||||
methods: {
|
||||
async statusType(state) {
|
||||
this.tableLoading = true
|
||||
if (state === "1") {
|
||||
const data = await this.summaryYearPrizes()
|
||||
if (!data) {
|
||||
this.tableLoading = false
|
||||
return
|
||||
}
|
||||
} else if (state === "2") {
|
||||
this.pageForm.sex = null
|
||||
await this.summary()
|
||||
statusType(state) {
|
||||
if (this.tableLoading) return
|
||||
const next = this.pageForm.status === state ? null : state
|
||||
if (next === '1' && !this.pageForm.sex) {
|
||||
this.$message.warning('请选择性别')
|
||||
return
|
||||
}
|
||||
|
||||
if (this.pageForm.status === state) {
|
||||
this.pageForm.status = null
|
||||
this.pageForm.sex = null
|
||||
this.pageForm.activityId = this.activityList[0].id
|
||||
this.pageForm.unionId = this.unionList[0].id
|
||||
this.unionChange(this.unionList[0].id)
|
||||
} else {
|
||||
this.pageForm.status = state
|
||||
}
|
||||
this.tableLoading = false
|
||||
|
||||
this.$set(this.pageForm, 'status', next)
|
||||
this.$set(this, 'isSummary', next === '1' ? 3 : (next === '2' ? 2 : 1))
|
||||
return this.refreshPrizes()
|
||||
},
|
||||
getSummaryByYear(o, i, type) {
|
||||
if (type === "集体项目") {
|
||||
const datas = o.filter(o => o.ranking === i).map(o => o.unionname)
|
||||
if (datas) {
|
||||
return datas.join(",")
|
||||
} else {
|
||||
return ""
|
||||
}
|
||||
} else {
|
||||
//甲组里面有可能有团体项目,所以说如果这个没有username就代表是团体
|
||||
return o.filter(f => f.ranking === i).map(g => g.username ? g.username : g.unionname).join('、')
|
||||
}
|
||||
|
||||
|
||||
// 三种展示分别刷新,沿用mixins的分页能力,不另写公共表格分页方法。
|
||||
refreshPrizes() {
|
||||
if (this.isSummary === 3) return this.summaryYearPrizes()
|
||||
if (this.isSummary === 2) return this.summary()
|
||||
return this.getPrizes()
|
||||
},
|
||||
async summaryYearPrizes() {
|
||||
try {
|
||||
if (!this.pageForm.sex) {
|
||||
this.$message.warning("请选择性别")
|
||||
return false
|
||||
}
|
||||
this.$set(this.pageForm, "unionId", null)
|
||||
this.$set(this.pageForm, "activityId", null)
|
||||
this.isSummary = 3
|
||||
const {data} = await this.$axios.post(loc() + "/getSummaryYearPrizes", this.pageForm)
|
||||
this.tableDataPrize = data
|
||||
return true
|
||||
} catch (e) {
|
||||
this.$message.error(e.msg)
|
||||
return false
|
||||
}
|
||||
|
||||
|
||||
sexChange() {
|
||||
if (this.isSummary === 3) return this.summaryYearPrizes()
|
||||
},
|
||||
getTableTdContent(d, i) {
|
||||
return d.filter(v => {
|
||||
if (v.isteampersonal === 1) {
|
||||
if (v.ranking == i) {
|
||||
console.log(v, i)
|
||||
return v.username
|
||||
}
|
||||
} else {
|
||||
if (v.ranking == i) {
|
||||
return v.numberofpeople
|
||||
}
|
||||
}
|
||||
}).map(v => {
|
||||
return v.isteampersonal === 1 ? v.username : v.numberofpeople
|
||||
}).toString()
|
||||
getSummaryByYear(rows, ranking, type) {
|
||||
return rows.filter(item => item.ranking === ranking).map(item => type === '集体项目' ? item.unionname : (item.username || item.unionname)).join('、')
|
||||
},
|
||||
|
||||
async summary() {
|
||||
try {
|
||||
if (this.activityList.length === 0) {
|
||||
return
|
||||
}
|
||||
if (!this.pageForm.activityId) {
|
||||
this.pageForm.activityId = this.activityList[0].id
|
||||
}
|
||||
this.$set(this.pageForm, "unionId", null)
|
||||
this.isSummary = 2
|
||||
this.tableData = []
|
||||
|
||||
const {data} = await this.$axios.post(loc() + "/summary", this.pageForm)
|
||||
this.$set(this, "tableData", data.score)
|
||||
this.unionName = "汇总"
|
||||
} catch (e) {
|
||||
this.$message.error(e.msg)
|
||||
prizeSourceText(rows) {
|
||||
return [...new Set(rows.map(item => item.participantUnionName).filter(Boolean))].join('、')
|
||||
},
|
||||
resultsInputUrl(item) {
|
||||
return '/platform/activity/results/input?activityId=' + encodeURIComponent(item.activityId)
|
||||
+ '&eventId=' + encodeURIComponent(item.eventId) + '&year=' + encodeURIComponent(this.pageForm.year)
|
||||
},
|
||||
acceptPrizeStatistics(data) {
|
||||
this.$set(this, 'confirmedTotal', Number(data.confirmedTotal) || 0)
|
||||
this.$set(this, 'pendingResults', data.pendingResults || [])
|
||||
},
|
||||
clearPrizeStatistics() {
|
||||
this.$set(this, 'confirmedTotal', 0)
|
||||
this.$set(this, 'pendingResults', [])
|
||||
this.$set(this, 'lastSum', {})
|
||||
this.$set(this, 'tableDataUnionPrize', {})
|
||||
this.$set(this, 'tableData', [])
|
||||
},
|
||||
summaryYearPrizes() {
|
||||
if (!this.pageForm.sex) {
|
||||
this.$message.warning('请选择性别')
|
||||
return Promise.resolve()
|
||||
}
|
||||
|
||||
this.$set(this, 'tableLoading', true)
|
||||
this.$set(this, 'queryFailed', false)
|
||||
this.$set(this, 'tableDataPrize', {})
|
||||
return this.$axios.post(loc() + '/getSummaryYearPrizes', this.pageForm).then((resp) => {
|
||||
if (resp.code !== 0) throw new Error(resp.msg || '年度名次查询失败')
|
||||
this.$set(this, 'tableDataPrize', resp.data)
|
||||
}).catch((error) => {
|
||||
this.$set(this, 'queryFailed', true)
|
||||
this.$message.error(error.message || error.msg || '年度名次查询失败')
|
||||
}).finally(() => {
|
||||
this.$set(this, 'tableLoading', false)
|
||||
})
|
||||
},
|
||||
summary() {
|
||||
this.clearPrizeStatistics()
|
||||
this.$set(this, 'tableLoading', true)
|
||||
this.$set(this, 'queryFailed', false)
|
||||
return this.$axios.post(loc() + '/summary', {activityId: this.pageForm.activityId}).then((resp) => {
|
||||
if (resp.code !== 0) throw new Error(resp.msg || '奖品汇总查询失败')
|
||||
this.$set(this, 'tableData', resp.data.score || [])
|
||||
this.acceptPrizeStatistics(resp.data)
|
||||
}).catch((error) => {
|
||||
this.$set(this, 'queryFailed', true)
|
||||
this.$message.error(error.message || error.msg || '奖品汇总查询失败')
|
||||
}).finally(() => {
|
||||
this.$set(this, 'tableLoading', false)
|
||||
})
|
||||
},
|
||||
print() {
|
||||
let subOutputRankPrint = document.getElementById('print');
|
||||
let newContent = subOutputRankPrint.innerHTML;
|
||||
let oldContent = document.body.innerHTML;
|
||||
document.body.innerHTML = newContent;
|
||||
window.print();
|
||||
window.location.reload();
|
||||
document.body.innerHTML = oldContent;
|
||||
return false;
|
||||
if (this.tableLoading || this.queryFailed) return
|
||||
let newContent = document.getElementById('print').innerHTML
|
||||
let oldContent = document.body.innerHTML
|
||||
document.body.innerHTML = newContent
|
||||
window.print()
|
||||
window.location.reload()
|
||||
document.body.innerHTML = oldContent
|
||||
return false
|
||||
},
|
||||
actChange(activityId) {
|
||||
this.tableColumns = []
|
||||
this.tableData = []
|
||||
this.pageForm.activityId = ""
|
||||
const activityData = this.activityList.find(v => v.id == activityId)
|
||||
this.pageForm.activityId = activityData.id
|
||||
this.getPrizes()
|
||||
this.$set(this.pageForm, 'activityId', activityId)
|
||||
return this.refreshPrizes()
|
||||
},
|
||||
unionChange(unionId) {
|
||||
this.tableColumns = []
|
||||
this.tableData = []
|
||||
this.pageForm.unionId = ""
|
||||
this.isSummary = 1
|
||||
const unionData = this.unionList.find(v => v.id == unionId)
|
||||
this.pageForm.unionId = unionData.id
|
||||
this.unionName = unionData.name
|
||||
this.getPrizes()
|
||||
this.$set(this.pageForm, 'unionId', unionId)
|
||||
const union = this.unionList.find(item => item.id === unionId)
|
||||
this.$set(this, 'unionName', union ? union.name : '')
|
||||
return this.getPrizes()
|
||||
},
|
||||
async getActivitys() {
|
||||
this.tableData = []
|
||||
const {data} = await this.$axios.post("/platform/activity/score/statistics/getActivitys", {year: this.pageForm.year})
|
||||
this.pageForm.activityId = ""
|
||||
this.activityList = data
|
||||
if (data && data.length > 0) {
|
||||
this.pageForm.activityId = data[0].id
|
||||
}
|
||||
await this.getPrizes()
|
||||
|
||||
},
|
||||
async getPrizes() {
|
||||
try {
|
||||
this.tableLoading = true
|
||||
const {data} = await this.$axios.post(loc() + "/getPrizes", this.pageForm)
|
||||
this.tableDataUnionPrize = data
|
||||
const lastSum = {}
|
||||
for (let i = 1; i <= 8; i++) {
|
||||
let sum = 0
|
||||
if (!$.isEmptyObject(data['男子项目'])) {
|
||||
let xm = []
|
||||
for (let key in data['男子项目']) {
|
||||
xm = xm.concat(data['男子项目'][key])
|
||||
}
|
||||
sum += xm.filter(v => v.ranking === i).length
|
||||
}
|
||||
if (!$.isEmptyObject(data['女子项目'])) {
|
||||
let xm = []
|
||||
for (let key in data['女子项目']) {
|
||||
xm = xm.concat(data['女子项目'][key])
|
||||
}
|
||||
sum += xm.filter(v => v.ranking === i).length
|
||||
}
|
||||
if (!$.isEmptyObject(data['团体项目'])) {
|
||||
let xm = []
|
||||
for (let key in data['团体项目']) {
|
||||
xm = xm.concat(data['团体项目'][key])
|
||||
}
|
||||
const teams = xm.filter(v => v.ranking === i).map(v => Number(v.numberOfPeople))
|
||||
if (teams && teams.length > 0) {
|
||||
sum += teams.reduce((a, b) => a + b)
|
||||
}
|
||||
}
|
||||
lastSum[i] = sum
|
||||
getActivitys() {
|
||||
this.clearPrizeStatistics()
|
||||
this.$set(this, 'tableDataPrize', {})
|
||||
this.$set(this, 'tableLoading', true)
|
||||
this.$set(this, 'queryFailed', false)
|
||||
return this.$axios.post('/platform/activity/score/statistics/getActivitys', {year: this.pageForm.year}).then((resp) => {
|
||||
if (resp.code !== 0) throw new Error(resp.msg || '活动查询失败')
|
||||
const activities = resp.data || []
|
||||
this.$set(this, 'activityList', activities)
|
||||
if (!activities.some(item => item.id === this.pageForm.activityId)) {
|
||||
this.$set(this.pageForm, 'activityId', activities.length ? activities[0].id : '')
|
||||
}
|
||||
|
||||
lastSum[9] = Object.values(lastSum).reduce((a, b) => a + b)
|
||||
this.lastSum = lastSum
|
||||
} catch (e) {
|
||||
this.$message.error(e.msg)
|
||||
} finally {
|
||||
this.tableLoading = false
|
||||
}
|
||||
return this.refreshPrizes()
|
||||
}).catch((error) => {
|
||||
this.$set(this, 'queryFailed', true)
|
||||
this.$message.error(error.message || error.msg || '活动查询失败')
|
||||
}).finally(() => {
|
||||
this.$set(this, 'tableLoading', false)
|
||||
})
|
||||
},
|
||||
getPrizes() {
|
||||
this.clearPrizeStatistics()
|
||||
this.$set(this, 'tableLoading', true)
|
||||
this.$set(this, 'queryFailed', false)
|
||||
return this.$axios.post(loc() + '/getPrizes', this.pageForm).then((resp) => {
|
||||
if (resp.code !== 0) throw new Error(resp.msg || '奖品名单查询失败')
|
||||
this.$set(this, 'tableDataUnionPrize', resp.data)
|
||||
// 名单与汇总共用后端人数统计,前端不再用积分或整队人数另算一套合计。
|
||||
this.$set(this, 'lastSum', resp.data.lastSum || {})
|
||||
this.acceptPrizeStatistics(resp.data)
|
||||
}).catch((error) => {
|
||||
this.$set(this, 'queryFailed', true)
|
||||
this.$message.error(error.message || error.msg || '奖品名单查询失败')
|
||||
}).finally(() => {
|
||||
this.$set(this, 'tableLoading', false)
|
||||
})
|
||||
},
|
||||
},
|
||||
async created() {
|
||||
await this.getActivitys()
|
||||
this.unionList = await this.$businessTool.listUnion()
|
||||
if (this.unionList.length > 0) {
|
||||
this.pageForm.unionId = this.unionList[0].id
|
||||
this.unionName = this.unionList[0].unionname
|
||||
}
|
||||
await this.getPrizes()
|
||||
created() {
|
||||
this.$set(this, 'tableLoading', true)
|
||||
this.$businessTool.listUnion().then((unions) => {
|
||||
this.$set(this, 'unionList', unions || [])
|
||||
this.$set(this.pageForm, 'unionId', unions.length ? unions[0].id : '')
|
||||
this.$set(this, 'unionName', unions.length ? unions[0].name : '')
|
||||
return this.getActivitys()
|
||||
}).catch((error) => {
|
||||
this.$set(this, 'queryFailed', true)
|
||||
this.$message.error(error.message || error.msg || '工会查询失败')
|
||||
}).finally(() => {
|
||||
this.$set(this, 'tableLoading', false)
|
||||
})
|
||||
}
|
||||
})
|
||||
</script>
|
||||
|
||||
+619
-179
File diff suppressed because it is too large
Load Diff
@@ -73,7 +73,8 @@ layout("/layouts/platform.html"){
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item>
|
||||
<el-button @click="doExcelCj" icon="el-icon-printer" type="primary">导出成绩excel
|
||||
<el-button @click="doExcelCj" icon="el-icon-printer" type="primary"
|
||||
:disabled="!pageForm.activityId">导出成绩excel
|
||||
</el-button>
|
||||
</search-item>
|
||||
</search>
|
||||
@@ -301,10 +302,18 @@ layout("/layouts/platform.html"){
|
||||
},
|
||||
doExcelCj() {
|
||||
const {activityId, unionname} = this.pageForm
|
||||
// 年度统计视图下 activityId 已被清空,此处导出会查不到数据
|
||||
if (!activityId) {
|
||||
this.$message.warning("当前为年度统计视图,无法导出单个活动的成绩明细,请先选择「运动会成绩统计」中的任一维度")
|
||||
return
|
||||
}
|
||||
let unionId = ''
|
||||
if (unionname) {
|
||||
const unionlist = clone(this.unionList)
|
||||
unionId = unionlist.find(v => v.unionname === unionname).id
|
||||
const target = unionlist.find(v => v.name === unionname)
|
||||
if (target) {
|
||||
unionId = target.id
|
||||
}
|
||||
}
|
||||
this.$downLoad(loc() + "/doExcelCj", {activityId: activityId, unionId: unionId})
|
||||
|
||||
|
||||
@@ -0,0 +1,126 @@
|
||||
<!--#
|
||||
layout("/layouts/platform.html"){
|
||||
#-->
|
||||
<div id="app" v-cloak>
|
||||
<el-card shadow="never">
|
||||
<search :is-search-button="false" @search="doSearch">
|
||||
<search-item label="社团名称:">
|
||||
<el-select v-model="pageForm.clubId" placeholder="请选择社团" clearable filterable>
|
||||
<el-option v-for="item in clubList" :key="item.id" :label="item.clubName" :value="item.id"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="姓名/工号:">
|
||||
<user-select
|
||||
v-model="pageForm.userId"
|
||||
placeholder="请输入姓名或工号选择人员"
|
||||
api_input_key_name="query"
|
||||
:option_label_func="(item) => item.username + '(' + item.loginname + ')'"
|
||||
></user-select>
|
||||
</search-item>
|
||||
<search-item label="所属单位:">
|
||||
<el-select v-model="pageForm.unitName" placeholder="请选择所属单位" clearable filterable>
|
||||
<el-option v-for="item in unitList" :key="item.id" :label="item.name" :value="item.name"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="人员状态:">
|
||||
<el-select v-model="pageForm.userState" placeholder="请选择人员状态" clearable>
|
||||
<el-option label="在职" value="在职"></el-option>
|
||||
<el-option label="在岗" value="在岗"></el-option>
|
||||
<el-option label="退休" value="退休"></el-option>
|
||||
<el-option label="不在岗" value="不在岗"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<search-item label="性别:">
|
||||
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable>
|
||||
<el-option label="男" value="男"></el-option>
|
||||
<el-option label="女" value="女"></el-option>
|
||||
</el-select>
|
||||
</search-item>
|
||||
<div class="search-query">
|
||||
<el-button type="primary" icon="el-icon-search" @click="doSearch">搜索</el-button>
|
||||
<el-button icon="el-icon-refresh" @click="resetSearch">重置</el-button>
|
||||
</div>
|
||||
</search>
|
||||
</el-card>
|
||||
<el-card shadow="never" class="mt10">
|
||||
<table-tool label="成员统计">
|
||||
<span>成员记录数:{{ pageForm.totalCount }}(同一人员加入多个社团分别统计)</span>
|
||||
</table-tool>
|
||||
<el-table :data="tableData">
|
||||
<el-table-column label="社团名称" prop="clubName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="姓名" prop="userName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="工号" prop="loginName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="性别" prop="sex" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="联系方式" prop="mobile" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="所属单位" prop="unitName" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="在职状态" prop="userState" show-overflow-tooltip></el-table-column>
|
||||
<el-table-column label="职务" prop="roleName" show-overflow-tooltip></el-table-column>
|
||||
</el-table>
|
||||
<!--#include("/layouts/pagination.html"){}#-->
|
||||
</el-card>
|
||||
</div>
|
||||
<script nonce="${cspNonce!}">
|
||||
new Vue({
|
||||
el: "#app",
|
||||
mixins: [initTableMixins],
|
||||
data() {
|
||||
return {
|
||||
clubList: [],
|
||||
unitList: [],
|
||||
pageForm: {
|
||||
pageNumber: 1,
|
||||
pageSize: 10,
|
||||
totalCount: 0,
|
||||
clubId: "",
|
||||
userId: "",
|
||||
unitName: "",
|
||||
userState: "",
|
||||
sex: ""
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
resetSearch() {
|
||||
this.pageForm.clubId = ""
|
||||
this.pageForm.userId = ""
|
||||
this.pageForm.unitName = ""
|
||||
this.pageForm.userState = ""
|
||||
this.pageForm.sex = ""
|
||||
this.doSearch()
|
||||
},
|
||||
async getUnit() {
|
||||
const resp = await this.$axios.post("/open/common/unitOptions")
|
||||
if (resp.code === 0) {
|
||||
this.unitList = resp.data
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async pageData() {
|
||||
const resp = await this.$axios.post("/platform/club/statistics/member/pageData", this.pageForm)
|
||||
if (resp.code === 0) {
|
||||
this.tableData = resp.data.list
|
||||
this.pageForm.totalCount = resp.data.totalCount
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
},
|
||||
async getClub() {
|
||||
const resp = await this.$axios.post("/platform/club/statistics/member/clubOptions")
|
||||
if (resp.code === 0) {
|
||||
this.clubList = resp.data
|
||||
} else {
|
||||
this.$message.warning(resp.msg)
|
||||
}
|
||||
}
|
||||
},
|
||||
async created() {
|
||||
await this.getClub()
|
||||
await this.getUnit()
|
||||
await this.pageData()
|
||||
}
|
||||
})
|
||||
</script>
|
||||
<!--#
|
||||
}
|
||||
#-->
|
||||
+10
-2
@@ -818,6 +818,10 @@ layout("/layouts/platform.html"){
|
||||
paymentWay: [{required: true, message: "请选择支付方式", trigger: ["change", "blur"]}],
|
||||
reimburseProject: [{required: true, message: "请选择报销项目", trigger: ["change", "blur"]}],
|
||||
reimburseFundSource: [{required: true, message: "请选择经费来源", trigger: ["change", "blur"]}],
|
||||
// 报销事由仅在慰问项目显示,提交和重新提交时拒绝空值及纯空白。
|
||||
paymentNotes: [{required: true, whitespace: true, message: "请填写报销事由", trigger: ["change", "blur"]}],
|
||||
// 所属协会仅在协会经费显示,候选范围由后端当前会员关系确定。
|
||||
clubId: [{required: true, message: "请选择所属协会", trigger: ["change", "blur"]}],
|
||||
bankUserName: [{
|
||||
required: true,
|
||||
whitespace: true,
|
||||
@@ -1890,10 +1894,14 @@ layout("/layouts/platform.html"){
|
||||
this.normalizeFundBalance()
|
||||
resolve(true)
|
||||
} else {
|
||||
// 支付信息已移至发票信息页,支付明细校验失败时跳转到对应页签。
|
||||
// 新增必填项属于基本信息;同时存在支付错误时优先展示这两个字段的校验提示。
|
||||
const basicInfoInvalid = Object.keys(invalidFields || {})
|
||||
.some((field) => ["paymentNotes", "clubId"].includes(field))
|
||||
const paymentDetailInvalid = Object.keys(invalidFields || {})
|
||||
.some((field) => field.indexOf("paymentDetails.") === 0)
|
||||
if (paymentDetailInvalid) {
|
||||
if (basicInfoInvalid) {
|
||||
this.$set(this, "activeTabName", "basic")
|
||||
} else if (paymentDetailInvalid) {
|
||||
this.$set(this, "activeTabName", "invoice")
|
||||
}
|
||||
this.$message.warning("请完善必填信息")
|
||||
|
||||
+11
-11
@@ -170,6 +170,7 @@ layout("/layouts/platform.html"){
|
||||
<el-table-column align="center" header-align="center" label="更新时间"
|
||||
min-width="145px" prop="changeTime"
|
||||
show-overflow-tooltip sortable>
|
||||
<template scope="{row}">{{row.changeTime || '--'}}</template>
|
||||
</el-table-column>
|
||||
<el-table-column align="center" header-align="center" label="异动类型"
|
||||
prop="changeType" show-overflow-tooltip sortable>
|
||||
@@ -649,17 +650,16 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
},
|
||||
getChangeTypes(changeTypes){
|
||||
if (!changeTypes) return null
|
||||
const changeTypesList = JSON.parse(changeTypes)
|
||||
if (changeTypesList) {
|
||||
if (!changeTypesList || changeTypesList.length === 0 || !this.changeTypeData || this.changeTypeData.length === 0) return null
|
||||
return changeTypesList
|
||||
.map((v) => {
|
||||
return this.changeTypeData.find((item) => item.code === v).changeTypeName
|
||||
})
|
||||
.join(",")
|
||||
}
|
||||
return null
|
||||
if (!changeTypes) return '--'
|
||||
const changeTypesList = Array.isArray(changeTypes) ? changeTypes : JSON.parse(changeTypes)
|
||||
if (!Array.isArray(changeTypesList) || changeTypesList.length === 0) return '--'
|
||||
// 历史编码可能已不在当前枚举中,保留原编码,避免整张表格渲染中断。
|
||||
return changeTypesList
|
||||
.map((v) => {
|
||||
const changeType = (this.changeTypeData || []).find((item) => item.code === v)
|
||||
return changeType ? changeType.changeTypeName : (v || '未知异动类型')
|
||||
})
|
||||
.join(",")
|
||||
},
|
||||
changeDateRangeChange(val) {
|
||||
if (val && val.length > 0) {
|
||||
|
||||
Reference in New Issue
Block a user