健身卡

This commit is contained in:
=
2025-10-14 17:04:38 +08:00
parent e7b24d3afb
commit f3a8598e91
15 changed files with 1174 additions and 12 deletions
@@ -49,7 +49,7 @@ layout("/layouts/platform.html"){
<el-option
v-for="item in clubList"
:key="item.id"
:label="item.name"
:label="item.clubName"
:value="item.id">
</el-option>
</el-select>
@@ -317,6 +317,8 @@ layout("/layouts/platform.html"){
},
async created() {
this.init()
//社团查询
this.$businessTool.listCLubByRole().then((res) => (this.clubList = res))
}
})
</script>
@@ -0,0 +1,325 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<h3 style="color: var(--color-primary)" slot="header">信息填报</h3>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form">
<el-descriptions :column="3" border>
<el-descriptions-item label="职工姓名">
<el-form-item prop="userId">
<el-select :remote-method="queryUsers"
@change="userChange"
clearable
filterable
remote
placeholder="输入工号或者姓名查找"
style="width: 100%"
v-model="selectedUserId">
<el-option :key="o.id"
:label="o.username+'('+o.loginname+')'"
:value="o.id"
v-for="o in userList"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工号">
<el-form-item prop="loginName">
<el-input v-model="formData.loginName" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="性别">
<el-form-item prop="sex">
<el-input v-model="formData.sex" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="出生年月">
<el-form-item prop="birthday">
<el-input :value="formatDate(formData.birthday)" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="工会">
<el-form-item prop="unionName">
<el-input v-model="formData.unionName" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="单位">
<el-form-item prop="unitName">
<el-input v-model="formData.unitName" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="初始额度">
<el-form-item prop="initMoney">
<el-input v-model="formData.initMoney" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="剩余额度" :span="2">
<el-form-item prop="money">
<el-input v-model="formData.money" readonly size="small"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="健身卡使用情况记录" :span="3">
<el-form-item prop="usages">
<el-table :data="formData.usages" border size="small">
<el-table-column label="使用时间" prop="useTime" >
<template slot-scope="{row}">
<el-date-picker
v-model="row.useTime"
type="datetime"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请选择使用时间"
style="width: 100%">
</el-date-picker>
</template>
</el-table-column>
<el-table-column label="使用地点" prop="place">
<template slot-scope="{row}">
<el-input v-model="row.place" maxlength="100"
placeholder="请输入使用地点"></el-input>
</template>
</el-table-column>
<el-table-column label="使用项目" prop="project">
<template slot-scope="{row}">
<el-input v-model="row.project" maxlength="100" placeholder="请输入使用项目"></el-input>
</template>
</el-table-column>
<el-table-column label="花费额度" prop="useMoney" >
<template slot-scope="{row}">
<el-input v-model="row.useMoney" maxlength="10" placeholder="请输入花费额度"></el-input>
</template>
</el-table-column>
<el-table-column label="操作" width="100">
<template slot="header">
<el-button type="primary" size="mini" @click="addUsage">添加</el-button>
</template>
<template slot-scope="scope">
<el-button
type="danger"
icon="el-icon-delete"
size="mini"
@click="removeUsage(scope.$index)">
</el-button>
</template>
</el-table-column>
</el-table>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-form>
<el-row type="flex" justify="end" class="mt20">
<el-button type="primary" plain @click="onSave">保存</el-button>
</el-row>
</el-card>
</div>
<script>
new Vue({
el: '#app',
store,
dicts: [],
data() {
return {
bizId: GetQueryString("bizId"),
formData: {
usages: []
},
userList: [],
selectedUserId: '',
formRules: {
userId: [{ required: true, message: '请选择职工', trigger: 'change' }],
userName: [{ required: true, message: '职工姓名不能为空', trigger: 'blur' }],
sex: [{ required: true, message: '性别不能为空', trigger: 'blur' }],
birthday: [{ required: true, message: '出生年月不能为空', trigger: 'blur' }],
unionName: [{ required: true, message: '工会单位不能为空', trigger: 'blur' }],
unitName: [{ required: true, message: '单位不能为空', trigger: 'blur' }],
initMoney: [{ required: true, message: '初始额度不能为空', trigger: 'blur' }],
},
}
},
watch: {
// 监听formData.usages的变化,实时计算剩余额度
'formData.usages': {
handler(newVal) {
this.calculateRemainingMoney();
},
deep: true
}
},
methods: {
// 添加使用记录方法
addUsage() {
if (!this.formData.usages) {
this.$set(this.formData, 'usages', []);
}
this.formData.usages.push({
useTime: '',
place: '',
project: '',
useMoney: ''
});
},
// 删除使用记录方法
removeUsage(index) {
if (this.formData.usages && this.formData.usages.length > 0) {
this.formData.usages.splice(index, 1);
}
},
// 计算剩余额度
calculateRemainingMoney() {
if (this.formData.initMoney) {
const totalUsed = this.formData.usages.reduce((sum, usage) => {
const useMoney = parseFloat(usage.useMoney) || 0;
return sum + useMoney;
}, 0);
this.$set(this.formData, 'money', this.formData.initMoney - totalUsed);
}
},
// 检查额度是否足够
checkBalance() {
if (this.formData.money < 0) {
this.$message.error('余额不足!');
return false;
}
return true;
},
// 查询用户
queryUsers(key) {
if (!key) return;
this.$axios.get("/platform/exerciseCard/apply/queryUsers", {
params: { key }
}).then(res => {
if (res.code === 0) {
this.userList = res.data;
}
});
},
// 用户选择变化
userChange(userId) {
const user = this.userList.find(item => item.id === userId);
this.selectedUserId = userId;
if (user) {
this.$set(this.formData, 'userId', user.id);
this.$set(this.formData, 'userName', user.username);
this.$set(this.formData, 'loginName', user.loginname);
this.$set(this.formData, 'sex', user.sex);
this.$set(this.formData, 'unitId', user.unitId);
this.$set(this.formData, 'unitName', user.unitName);
this.$set(this.formData, 'unionId', user.unionId);
this.$set(this.formData, 'unionName', user.unionName);
this.$set(this.formData, 'birthday', user.birthday);
this.$set(this.formData, 'initMoney', 300);
this.$set(this.formData, 'money', 300);
} else {
// 清空表单数据
this.$set(this.formData, 'userId', null);
this.$set(this.formData, 'userName', null);
this.$set(this.formData, 'loginName', null);
this.$set(this.formData, 'sex', null);
this.$set(this.formData, 'unitId', null);
this.$set(this.formData, 'unitName', null);
this.$set(this.formData, 'unionId', null);
this.$set(this.formData, 'unionName', null);
this.$set(this.formData, 'birthday', null);
this.$set(this.formData, 'initMoney', null);
this.$set(this.formData, 'money', null);
}
},
// 添加日期格式化方法
formatDate(date) {
if (!date) return '';
// 如果已经是 yyyy-MM-dd 格式,直接返回
if (typeof date === 'string' && /^\d{4}-\d{2}-\d{2}/.test(date)) {
// 如果包含时间,只取日期部分
if (date.length > 10) {
return date.substring(0, 10);
}
return date;
}
// 否则转换为 yyyy-MM-dd 格式
try {
const d = new Date(date);
if (isNaN(d.getTime())) {
return date;
}
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
} catch (e) {
return date;
}
},
// 保存
onSave() {
if (!this.checkBalance()) {
return;
}
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/exerciseCard/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
commonUtil.pjaxPush('/platform/exerciseCard/query/index')
}
})
})
},
// 提交验证
validateBeforeSubmit() {
return new Promise((resolve) => {
this.$refs.formRef.validate((valid) => {
if (valid) {
resolve(true);
} else {
this.$message.error('请完善表单信息并勾选申报理由');
resolve(false);
}
});
});
},
async findOne(id) {
const resp = await $.get('/platform/exerciseCard/apply/findOne', {id})
if (resp.code === 0) {
return resp.data
}
},
init() {
if (this.bizId) {
this.findOne(this.bizId).then(async data => {
this.formData = data || {}
// 设置选中的用户ID
if (data && data.userId) {
this.selectedUserId = data.userId;
if (data.loginName) {
this.queryUsers(data.loginName);
}
}
})
} else {
}
}
},
created() {
this.init();
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,85 @@
const EXERCISECARD_INFO = {
template: /*language=HTML*/ `
<div>
<table-tool label="人员信息"></table-tool>
<el-descriptions :column="3" border class="flow-task-form">
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="职工姓名">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="性别">{{viewData.sex}}</el-descriptions-item>
<el-descriptions-item label="出生年月">{{formatDate(viewData.birthday)}}</el-descriptions-item>
<el-descriptions-item label="工会">{{viewData.unionName}}</el-descriptions-item>
<el-descriptions-item label="单位">{{viewData.unitName}}</el-descriptions-item>
<el-descriptions-item label="初始额度">{{viewData.initMoney}}</el-descriptions-item>
<el-descriptions-item label="当前额度" :span="2">{{viewData.money}}</el-descriptions-item>
<el-descriptions-item label="健身卡使用情况记录" :span="3">
<el-table :data="viewData.usages" border size="small">
<el-table-column label="使用时间" prop="useTime"></el-table-column>
<el-table-column label="使用地点" prop="place"></el-table-column>
<el-table-column label="使用项目" prop="project"></el-table-column>
<el-table-column label="花费额度" prop="useMoney"></el-table-column>
</el-table>
</el-descriptions-item>
</el-descriptions>
<slot></slot>
</div>
`,
store,
data() {
return {
visible: false,
viewData: {
usages: [] // 初始化使用记录数组
},
doneTasks: [],
row: null
}
},
methods: {
// 添加日期格式化方法
formatDate(date) {
if (!date) return '';
// 如果已经是 yyyy-MM-dd 格式,直接返回
if (typeof date === 'string' && /^\d{4}-\d{2}-\d{2}/.test(date)) {
// 如果包含时间,只取日期部分
if (date.length > 10) {
return date.substring(0, 10);
}
return date;
}
// 否则转换为 yyyy-MM-dd 格式
try {
const d = new Date(date);
if (isNaN(d.getTime())) {
return date;
}
const year = d.getFullYear();
const month = String(d.getMonth() + 1).padStart(2, '0');
const day = String(d.getDate()).padStart(2, '0');
return year + '-' + month + '-' + day;
} catch (e) {
return date;
}
},
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.getInfo()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/exerciseCard/apply/findOne', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data || {}
// 确保usages字段存在
if (!this.viewData.usages) {
this.$set(this.viewData, 'usages', [])
}
}
})
},
}
}
@@ -0,0 +1,153 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker v-model="pageForm.year" type="year" value-format="yyyy" placeholder="年度"
style="width: 100%"></el-date-picker>
</search-item>
<search-item label="姓名/工号">
<el-input placeholder="请输入姓名或工号查询" clearable v-model="pageForm.searchKeyword"></el-input>
</search-item>
<search-item label="性别">
<el-select v-model="pageForm.sex" placeholder="请选择性别" clearable style="width: 100%">
<el-option label="男" value="男"></el-option>
<el-option label="女" value="女"></el-option>
</el-select>
</search-item>
<search-item label="分工会">
<el-select v-model="pageForm.unionId" @change="doSearch" style="width: 100%"
placeholder="请选择分工会" clearable>
<el-option v-for="item in unionOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
<search-item label="单位">
<el-select v-model="pageForm.unitId" @change="doSearch" style="width: 100%"
placeholder="请选择单位" clearable>
<el-option v-for="item in unitOptions"
:value="item.id"
:key="item.id"
:label="item.name"
></el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool>
<el-button type="primary" size="small" icon="el-icon-upload2" @click="openImport">导入人员</el-button>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" style="width: 100%">
<el-table-column type="index" width="50px" label="序号" :index="indexMethod"></el-table-column>
<el-table-column prop="loginName" label="工号"></el-table-column>
<el-table-column prop="userName" label="职工姓名"></el-table-column>
<el-table-column prop="sex" label="性别"></el-table-column>
<el-table-column prop="unionName" label="所属工会"></el-table-column>
<el-table-column prop="unitName" label="所属单位"></el-table-column>
<el-table-column prop="initMoney" label="初始额度"></el-table-column>
<el-table-column prop="money" label="剩余额度"></el-table-column>
<el-table-column prop="applyTime" label="录入时间"></el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="onView(row)" size="mini" type="primary">查看</el-button>
<el-button @click="onEdit(row)" size="mini" type="primary">编辑</el-button>
<el-button v-if="$auth.hasRole('SYSADMIN')" @click="onDelete(row.id)" size="mini" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog title="人员导入" :visible.sync="importDialog" width="50%" :close-on-click-modal="false" :close-on-press-escape="false">
<file-import
ref="viewImport"
temp_url="/platform/exerciseCard/query/downloadTemplate"
post_url="/platform/exerciseCard/query/importData"
@flush="successImport"
></file-import>
</el-dialog>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<exercise-card-info ref="exerciseCardInfoRef"></exercise-card-info>
</template>
</guava>
</div>
<script>
<!--#include('../common/info.js'){}#-->
new Vue({
el: "#app",
store,
//分页数据
mixins: [initTableMixins],
components: {
"exercise-card-info": EXERCISECARD_INFO
},
data() {
return {
pageDataUrl: "/platform/exerciseCard/query/pageData",
unionOptions: [],
unitOptions: [],
userOptions: [],
importDialog: false,
checkedFields: []
}
},
components: {
"exercise-card-info": EXERCISECARD_INFO,
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime())
},
methods: {
openImport() {
this.importDialog = true
},
successImport() {
this.importDialog = false
this.pageData()
},
onView(row) {
this.$refs.guava.view(()=>{
this.$refs.exerciseCardInfoRef.onOpen(row)
})
},
onEdit(row) {
commonUtil.pjaxPush('/platform/exerciseCard/apply/index', { bizId: row.id})
},
onDelete(id) {
this.$confirm("您确定要删除吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/exerciseCard/query/delete", {id}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
},
created() {
this.pageData()
//工会查询
this.$businessTool.listUnion().then((res) => (this.unionOptions = res))
//单位查询
this.$businessTool.listUnit().then((res) => (this.unitOptions = res))
}
})
</script>
<!--#
}
#-->
@@ -5,7 +5,7 @@ layout("/layouts/platform.html"){
<guava ref="guava">
<template>
<el-card shadow="never">
<snaker-start slot="header" label="省级互助保障" define_key="SJHZBZ" ></snaker-start>
<h3 style="color: var(--color-primary)" slot="header">省级互助保障</h3>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="140px" label-position="right"
label-suffix="">
<el-row :gutter="20">
@@ -1,10 +1,6 @@
const userInfo = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<table-tool label="人员信息"></table-tool>
<el-descriptions :column="2" border class="flow-task-form">
<el-descriptions-item label="所属事项">{{viewData.projectName}}</el-descriptions-item>
@@ -1,10 +1,7 @@
const childManageInfo = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
子女信息
</div>
<table-tool label="子女信息"></table-tool>
<el-descriptions :column="3" border>
<el-descriptions-item label="就读年级">
<dict-tag :options="dict.type.CHILD_MANAGE_GRADE"
@@ -4,7 +4,7 @@ layout("/layouts/platform.html"){
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="信息填报" define_key="XXTB"></snaker-start>
<h3 style="color: var(--color-primary)" slot="header">信息填报</h3>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<table-tool label="子女信息"></table-tool>