This commit is contained in:
2025-08-20 15:16:40 +08:00
parent c4dee115af
commit 65eb86c0dc
41 changed files with 2774 additions and 299 deletions
@@ -76,19 +76,19 @@ let ASSSET_INFO = {
style="width: 100%"
>
<el-table-column
label="责任人" prop="oldAssetUseUserName">
label="责任人" prop="oldAssetUseUserName">
</el-table-column>
<el-table-column
label="使用/管理部门" prop="oldAssetUseUnionName">
label="使用/管理部门" prop="oldAssetUseUnionName">
</el-table-column>
<el-table-column
label="存放地点" prop="oldAssetStorageLocation">
label="存放地点" prop="oldAssetStorageLocation">
</el-table-column>
<el-table-column
label="使用状况" prop="oldAssetUsageStateName">
label="使用状况" prop="oldAssetUsageStateName">
</el-table-column>
<el-table-column
label="旧使用状况" prop="oldAssetUsageStateName">
label="操作时间" prop="createdAt">
<template v-slot="{row}">
{{$moment(row.createdAt).format('YYYY-MM-DD HH:mm:ss')}}
</template>
@@ -68,6 +68,14 @@ layout("/layouts/platform.html"){
ref="table"
row-key="id"
style="width: 100%">
<el-table-column
:index="indexMethod"
align="center"
header-align="center"
label="序号"
type="index"
width="80px"
></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
@@ -133,6 +141,7 @@ layout("/layouts/platform.html"){
{prop: 'assetNumber', label: '资产编号'},
{prop: 'assetName', label: '资产名称'},
{prop: 'categoryName', label: '类别名称'},
{prop: 'assetTypeCode', label: '资产类型'},
{prop: 'assetStorageLocation', label: '存放地点'},
{prop: 'assetUseUserName', label: '责任人'},
{prop: 'assetRetiredAssetsDate', label: '折旧到期日期'},
@@ -225,7 +225,7 @@ layout("/layouts/platform.html"){
this.notifyWarning("当前分工会没有名单,暂不需要提交")
return
}
const confirm = await this.$confirm('您确定名单都已核实,准确无误?', '提示', {
const confirm = await this.$confirm(flag?'您确定名单都已核实,准确无误?':'您确定取消确认?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
@@ -72,6 +72,9 @@ layout("/layouts/platform.html"){
<el-dropdown-item :command="{type:'view',data:row}">
查看
</el-dropdown-item>
<el-dropdown-item :command="{type:'code',data:row}">
二维码
</el-dropdown-item>
<el-dropdown-item
v-if="( row.isWithinChoiceTime || row.canCreated ) && row.isHasUserList===0"
:command="{type:'created',data:row}">
@@ -93,9 +96,7 @@ layout("/layouts/platform.html"){
<el-dropdown-item :command="{type:'delete',data:row}">
删除
</el-dropdown-item>
<!-- <el-dropdown-item :command="{type:'code',data:row}">
二维码
</el-dropdown-item>-->
</el-dropdown-menu>
</el-dropdown>
</template>
@@ -296,7 +297,18 @@ layout("/layouts/platform.html"){
></drawer-user-scope>
<!-- <open-qr-code ref="openQRCode" :url="url"></open-qr-code>-->
<el-dialog
title="活动二维码"
:visible.sync="codeDialogVisible"
:close-on-click-modal="false"
width="30%">
<div style=" display: flex;justify-content: center;">
<qrcode :options="{ width: 400 }" :value="activityUrl" ></qrcode>
</div>
<span slot="footer" class="dialog-footer">
<el-button @click="codeDialogVisible = false" type="primary">关 闭</el-button>
</span>
</el-dialog>
<el-dialog
:close-on-click-modal="false"
@@ -359,12 +371,13 @@ layout("/layouts/platform.html"){
}],
},
deleteRowIds: [],
description: ""
description: "",
codeDialogVisible: false,
activityUrl: '',
}
},
components: {
"drawer-user-scope": httpVueLoader("/components/module/activity/DrawerUserScope.vue"),
// 'open-qr-code': httpVueLoader('/components/plugins/OpenQRCode.vue'),
},
methods: {
dropdownCommand(command) {
@@ -458,7 +471,8 @@ layout("/layouts/platform.html"){
}
},
openCode(id) {
this.$refs.openQRCode.openCode("/mobile/healthCheckup/list")
this.activityUrl = location.origin + "/platform/healthCheckup/project/mange"
this.codeDialogVisible = true
},
deleteRow(row, index) {
@@ -51,6 +51,7 @@ layout("/layouts/platform.html"){
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="积分列表">
<el-button @click="openImportAdd" size="small" type="primary">增加导入</el-button>
<el-button @click="batchDeductions()" size="small" type="primary">批量扣减
</el-button>
@@ -170,6 +171,12 @@ layout("/layouts/platform.html"){
post_url="/platform/integral/manage/doImport" @flush="$refs.guava.index();pageData()"
></file-import>
</template>
<template #public>
<file-import ref="viewImport" temp_url="/platform/integral/manage/downloadImport"
post_url="/platform/integral/manage/doImportAdd" @flush="$refs.guava.index();pageData()"
></file-import>
</template>
</guava>
@@ -283,6 +290,10 @@ layout("/layouts/platform.html"){
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime())
},
methods: {
openImportAdd(){
this.$refs.guava.public()
this.$refs.viewImport.resetImportData()
},
openImport() {
this.$refs.guava.edit()
this.$refs.viewImport.resetImportData()
@@ -0,0 +1,342 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="年度预算申报" define_key="NDYSSB"></snaker-start>
<el-form :model="formData" :rules="formRules" ref="formRef" class="flow-task-form">
<el-descriptions :column="2" border>
<el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item>
<el-descriptions-item label="申报时间">{{formData.applyDate}}</el-descriptions-item>
<el-descriptions-item label="联系方式">
<el-form-item label="联系方式" prop="mobile">
<el-input placeholder="请输入联系方式" v-model="formData.mobile"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="预算类型">
<el-form-item label="预算类型" prop="outlayManageSource">
<el-select @change="budgetTypeCodeChange"
placeholder="请选择预算类型"
style="width: 100%;"
v-model="formData.outlayManageSource">
<el-option
:key="item.code"
:label="item.name"
:value="item.code"
v-for="item in budgetTypeOption">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
</el-descriptions-item>
<el-descriptions-item label="申报(承办)单位">
<el-form-item label="申报(承办)单位" prop="helpUnitName"
v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(formData.outlayManageSource)">
<el-input placeholder="请输入申报(承办)单位" readonly
type="text" v-model="formData.helpUnitName"></el-input>
</el-form-item>
<el-form-item label="申报(承办)单位" prop="unionId"
v-if="formData.outlayManageSource==='ACTIVITY_BUDGET_TYPE_TWO'">
<el-select v-model="formData.unionId" filterable @change="unionChange"
clearable
:disabled="!['superadmin'].includes($store.state.user.loginname)"
placeholder="请选择工会" style="width: 100%;">
<el-option v-for="item in unionList" :label="item.name"
:value="item.id"
:key="item.id">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="申报(承办)单位" prop="clubId"
v-if="['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
<el-select @change="clubChange"
placeholder="请选择申报(承办)单位"
style="width: 100%;" v-model="formData.clubId">
<el-option
:key="item.id"
:label="item.clubName"
:value="item.id"
v-for="item in clubOption">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动项目">
<el-form-item
prop="activityMatter" label="活动项目">
<el-input maxlength="50" placeholder="请输入项目"
v-model="formData.activityMatter"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动时间">
<el-form-item
prop="activityDate" label="活动时间">
<el-input maxlength="50" placeholder="请输入活动时间"
v-model="formData.activityDate"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="预算金额(元)">
<el-form-item
prop="declareTotalBudgetMoney" label="预算金额(元)"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number :min="0" :precision="2"
:disabled="formData.budgetDetails&&formData.budgetDetails.length>0"
placeholder="请输入预算金额"
style="width: 100%"
v-model="formData.declareTotalBudgetMoney"></el-input-number>
</el-form-item>
</el-descriptions-item>
<!--<el-descriptions-item label="是否可以重复报销"
v-if="['superadmin'].includes($store.state.user.loginname)">
<el-form-item
prop="isRepeatReimburse" label="是否可以重复报销"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.isRepeatReimburse">
<el-radio-button :label="true">可以</el-radio-button>
<el-radio-button :label="false">不可以</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>-->
<el-descriptions-item label="是否属于校工会预算"
v-if="['ACTIVITY_BUDGET_TYPE_TWO','ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)
&&['superadmin'].includes($store.state.user.loginname)" :span="2">
<el-form-item
prop="isSchoolBudget" label="是否属于校工会预算"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.isSchoolBudget">
<el-radio-button :label="true">属于</el-radio-button>
<el-radio-button :label="false">不属于</el-radio-button>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item v-if="!['ACTIVITY_BUDGET_TYPE_TWO','ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)
&&!['superadmin'].includes($store.state.user.loginname)"></el-descriptions-item>
<el-descriptions-item label="校工会预算" v-if="formData.isSchoolBudget" :span="2">
<el-form-item
prop="schoolBudgetId" label="校工会预算"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"
>
<el-select v-model="formData.schoolBudgetId" filterable
default-first-option
placeholder="请选择校工会预算" style="width: 100%">
<el-option :label="item.activityMatter"
:value="item.id"
:key="item.id"
v-for="item in activityList"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动内容(如训练、装备等)" :span="2">
<el-form-item
prop="activityContent" label="活动内容(如训练、装备等)">
<text-editor v-model="formData.activityContent"></text-editor>
</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-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button>
<el-button type="primary" @click="onFinishTask" v-else>提交</el-button>
</el-row>
</el-card>
</div>
<script>
new Vue({
el: "#app",
store,
data() {
return {
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
activityList: [],
budgetTypeOption: [],
unionList: [],
clubOption: [],
formRules: {
outlayManageSource: [{
required: true,
message: '必填',
trigger: ['blur', 'change']
}],
activityMatter: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fundsUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
clubId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
helpUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unionId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
},
formData: {
budgetDetails: []
},
dialogVisible: false,
editType: "apply"
}
},
methods: {
async findOne(id) {
const resp = await $.get('/platform/activity/budget/applyList/findOne', {id})
if (resp.code === 0) {
if (resp.data.budgets) {
resp.data.budgets = JSON.parse(resp.data.budgets)
}
return resp.data
}
},
init() {
if (this.bizId) {
this.findOne(this.bizId).then(data => {
this.formData = data
})
} else {
this.formData = {
isSchoolBudget: false,
isRepeatReimburse: true,
budgetDetails: [],
applyDate: this.$moment().format('YYYY-MM-DD'),
userName: this.$store.state.user.username,
mobile: this.$store.state.user.mobile,
}
}
},
clubChange(val) {
const club = this.clubOption.find(c => c.id === val)
this.formData.helpUnitName = club.clubName
},
unionChange(id) {
if (id) {
const union = this.unionList.find(c => c.id === id)
this.$set(this.formData, "helpUnitName", union.unionname)
} else {
this.$set(this.formData, "helpUnitName", '')
}
},
budgetTypeCodeChange(val) {
if (val === "ACTIVITY_BUDGET_TYPE_ONE") {
this.$set(this.formData, "helpUnitName", "校工会")
} else if (val === "ACTIVITY_BUDGET_TYPE_TWO") {
this.$set(this.formData, "helpUnitName", this.$store.state.user.union.name)
this.$set(this.formData, "unionId", this.$store.state.user.union.id)
} else if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(val)) {
this.$set(this.formData, "helpUnitName", '')
this.$set(this.formData, "clubId", '')
} else {
this.$set(this.formData, "helpUnitName", "校工会")
}
if (val) {
const budgetType = this.budgetTypeOption.find(b => b.code === val)
this.$set(this.formData, "budgetTypeId", budgetType.code)
}
},
async getActivityBudgetType() {
const data = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
let budgetTypeOption = []
if (this.$auth.hasRoleOr(['SYSADMIN'])) {
this.budgetTypeOption = data
} else {
if (this.$auth.hasRoleOr(['SCHOOL_UNION_ADMIN'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_ONE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(['BRANCH_UNION_ADMIN', 'BRANCH_UNION_CHAIRMAN'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_TWO"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(['CLUB_PRESIDENT'])) {
data.map(v => {
if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
this.budgetTypeOption = budgetTypeOption
}
},
getSchoolBudget() {
this.$axios.post("/platform/activity/budget/apply/getSchoolBudget").then((res) => {
if (res.code === 0) {
this.activityList = res.data
}
})
},
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/activity/budget/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
window.location.href = '/platform/activity/budget/applyList'
}
})
})
},
// 提交
onSubmit() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/activity/budget/apply/submit', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
window.location.href = '/platform/activity/budget/applyList'
}
})
})
},
onFinishTask() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/flow/common/executeTask', {
data: JSON.stringify({
processTaskId: GetQueryString("taskId"),
submitType: 5
})
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
window.location.href = '/platform/activity/budget/applyList'
}
})
})
},
},
async created() {
this.init()
await this.getActivityBudgetType()
await this.getSchoolBudget()
this.unionList = await this.$businessTool.listUnion(this.$store.state.user.union.id)
}
})
</script>
<!--#
}
#-->
@@ -87,11 +87,13 @@ layout("/layouts/platform.html"){
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary">
<el-button @click="openEdit(row)" size="mini" type="primary" v-if="row.taskKey === 'startTask' || !row.instanceId">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
:disabled="![0,1].includes(row.auditState)">
v-if="row.taskKey === 'startTask' || !row.instanceId">
删除
</el-button>
</template>
@@ -101,12 +103,15 @@ layout("/layouts/platform.html"){
</el-card>
</template>
<template #edit>
<template #view>
<activity-budget-info ref="activityBudgetInfo">
</activity-budget-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
const vue = new Vue({
el: '#app',
mixins: [initTableMixins],
@@ -133,10 +138,12 @@ layout("/layouts/platform.html"){
auditIds: [],
}
},
components: {},
components: {
"activity-budget-info": ACTIVITY_BUDGET_INFO
},
methods: {
openAdd() {
window.open('/flow/common/approval/form?defineKey=NDYSSB')
window.location.href = '/platform/activity/budget/apply'
},
doExport() {
},
@@ -201,14 +208,31 @@ layout("/layouts/platform.html"){
})
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
handleSelectionChange(val) {
this.auditIds = val.map(item => item.id)
},
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + row.instanceId + "&businessId=" + row.businessNo + "")
this.$refs.guava.view(()=>{
this.showApprovalForm = false
this.$refs.activityBudgetInfo.onOpen(row)
})
},
openEdit(row) {
window.open("/flow/common/approval/form?businessId=" + row.id + "&defineKey=NDYSSB")
window.location.href = '/platform/activity/budget/apply?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id
},
doDelete(id) {
this.$confirm('确定删除该条数据?', '提示', {
@@ -100,10 +100,10 @@ layout("/layouts/platform.html"){
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary"
<!-- <el-button @click="openEdit(row)" size="mini" type="primary"
:disabled="!['superadmin'].includes($store.state.user.loginname)">
编辑
</el-button>
</el-button>-->
<el-button @click="doDelete(row.id)" size="mini" type="danger"
:disabled="!['superadmin'].includes($store.state.user.loginname)">
删除
@@ -116,13 +116,16 @@ layout("/layouts/platform.html"){
</el-card>
</template>
<template #view>
<activity-budget-info ref="activityBudgetInfo"></activity-budget-info>
</template>
</guava>
</div>
<script>
<!--#include("../common/apply.js"){}#-->
<!--#include('../info.js'){}#-->
const vue = new Vue({
el: '#app',
store,
@@ -155,9 +158,9 @@ layout("/layouts/platform.html"){
}
},
components: {
"activity-budget-info": ACTIVITY_BUDGET_INFO
},
methods: {
openEdit(row) {
},
@@ -194,9 +197,11 @@ layout("/layouts/platform.html"){
this.doSearch()
this.getApplyMoney()
},
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + row.instanceId + "&businessId=" + row.businessNo+"")
this.$refs.guava.view(() => {
this.showApprovalForm = false
this.$refs.activityBudgetInfo.onOpen(row)
})
},
getApplyMoney() {
this.$axios.post("/platform/activity/budget/applyStatistics/getApplyMoney", this.pageForm).then(resp => {
@@ -0,0 +1,115 @@
const ACTIVITY_BUDGET_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="申报人">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="预算类型">
<dict-tag :options="budgetTypeOption"
:value="viewData.outlayManageSource"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="申报(承办)单位">{{viewData.helpUnitName}}</el-descriptions-item>
<el-descriptions-item label="活动项目">{{viewData.activityMatter}}</el-descriptions-item>
<el-descriptions-item label="活动时间">{{viewData.activityDate}}</el-descriptions-item>
<el-descriptions-item label="申报预算金额(元)">{{viewData.declareTotalBudgetMoney}}
</el-descriptions-item>
<el-descriptions-item label="最终预算金额(元)">{{viewData.totalBudgetMoney}}</el-descriptions-item>
<el-descriptions-item label="申报时间">{{viewData.applyDate}}</el-descriptions-item>
<el-descriptions-item :span="2"></el-descriptions-item>
<el-descriptions-item label="活动内容(如训练、装备等)" :span="3">
<div v-html="viewData.activityContent"></div>
</el-descriptions-item>
</el-descriptions>
<template v-for="task in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
}}({{task.ext.initiatorAccount}})
</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="审核金额">
{{task.ext.tf_totalBudgetMoney}}
</el-descriptions-item>
<el-descriptions-item :span="2"></el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
task.taskFormData.opinion
}}
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {},
doneTasks: [],
budgetTypeOption: [],
row: null
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE").then(resp => {
this.budgetTypeOption = resp
})
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/activity/budget/applyList/findOne', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId,this.row.instanceId)
}
}
}
@@ -2,9 +2,8 @@
layout("/layouts/platform.html"){
#-->
<guava ref="guava">
<div id="app">
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
@@ -69,17 +68,50 @@ layout("/layouts/platform.html"){
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openApproval(row)" size="mini" type="primary">审核</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</div>
</guava>
<template #edit>
<activity-budget-info ref="activityBudgetInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审核金额" prop="tf_totalBudgetMoney"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number :min="0" :precision="2"
placeholder="请输入审核金额"
style="width: 100%"
v-model="formData.tf_totalBudgetMoney"></el-input-number>
</el-form-item>
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</activity-budget-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
@@ -91,22 +123,77 @@ layout("/layouts/platform.html"){
clubOption: [],
unionList: [],
pageForm: {
year: moment().format("YYYY"), auditState: 2,
year: moment().format("YYYY"),
outlayManageSource: "",
activityMatter: "",
unionId: "",
clubId: "",
approval: false
},
formData: {},
showApprovalForm: false
}
},
components: {
"activity-budget-info": ACTIVITY_BUDGET_INFO
},
methods: {
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
openView(row) {
window.open("/flow/common/approval/form?instanceId=" + row.instanceId + "&businessId=" + row.businessNo+"")
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.activityBudgetInfo.onOpen(row)
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
tf_totalBudgetMoney: 0,
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.activityBudgetInfo.onOpen(row)
})
},
openApproval(row) {
window.open("/flow/common/approval/form?taskId=" + row.taskId + "&instanceId=" + row.instanceId + "&businessId=" + row.businessNo)
}
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
@@ -128,127 +128,7 @@
}
},
methods: {
outlayManageSourceChange(val) {
if (!val) {
this.budgetMoney = 0
return
}
this.$set(this.formData, "budgetId", null)
this.getBudgetMoneyOrActivity()
if (val === "ACTIVITY_BUDGET_TYPE_TWO") {
this.$set(this.formData, "unionId", this.$store.state.user.union.id)
}
},
async budgetIdChange(val) {
if (val) {
if (["ACTIVITY_BUDGET_TYPE_TWO", "ACTIVITY_BUDGET_TYPE_ONE"].includes(this.formData.outlayManageSource)) {
//如果是分工会和校工会
const data = this.activityList.find(a => a.id === val)
if (this.formData.outlayManageSource === "ACTIVITY_BUDGET_TYPE_TWO") {
//如果是分工会
if (data.isSchoolBudget) {
//如果这一条分工会活动预算金额是属于校工会的
this.moneyPlaceholder = "预算金额" + data.totalBudgetMoney + "元"
} else {
//如果这一条分工会活动活动,并且预算金额也是自己分工会的
if (data.isRepeatReimburse) {
//如果这一条活动预算可以重复报销
const money = await this.getBxMoneyByBudgetId(val)
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + money + ",不能超过20%"
} else {
//如果如果不能重复报销暂无判断
}
}
} else {
//如果是校工会
if (data.twoLevelBudgetList.length > 0) {
//如果大于0代表肯定有分工会使用校工会的预算,这里要减去分工会的预算
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + data.twoLevelTotalBudgetMoney
} else {
if (data.isRepeatReimburse) {
const money = await this.getBxMoneyByBudgetId(val)
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + money + ",不能超过20%"
} else {
//如果如果不能重复报销暂无判断
}
}
}
this.totalBudgetMoney = data.totalBudgetMoney
this.$set(this.formData, 'activityMatter', data.activityMatter)
} else {
this.moneyPlaceholder = "预算金额" + this.budgetMoney + "元"
this.totalBudgetMoney = this.budgetMoney
this.$set(this.formData, 'activityMatter', val)
}
} else {
this.moneyPlaceholder = "请输入金额"
this.totalBudgetMoney = 0
this.$set(this.formData, 'activityMatter', null)
}
},
async getBxMoneyByBudgetId(budgetId) {
const resp = await this.$axios.post("/platform/outlay/reimburse/apply/getBxMoneyByBudgetId", {
budgetId
})
if (resp.code === 0) {
return resp.data
} else {
return 0
}
},
getBudgetMoneyOrActivity() {
this.$axios.post("/platform/outlay/reimburse/apply/getBudgetMoneyOrActivity", {
outlayManageSource: this.formData.outlayManageSource,
clubId: this.formData.clubId,
unionId: this.formData.unionId,
id: this.formData.id
}).then((resp) => {
if (resp.code === 0) {
this.budgetMoney = resp.data.budgetMoney
this.activityList = resp.data.activityList
}
})
},
init() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
} else {
if (this.$auth.hasRoleOr(["SCHOOL_OUTLAY_ADMIN", "SCHOOL_UNION_ADMIN"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_ONE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(["BRANCH_UNION_CHAIRMAN", "BRANCH_UNION_ADMIN"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_TWO"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(["CLUB_MANAGER", "CLUB_PRESIDENT"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
this.budgetTypeOption = budgetTypeOption
}
if (this.id) {
} else {
this.formData = {
userName: this.$store.state.user.username,
loginName: this.$store.state.user.loginname,
mobile: this.$store.state.user.mobile,
}
}
},
handleTaskAction(val) {
this.$refs.formRef.validate(valid => {
if (valid) {
@@ -3,34 +3,126 @@ layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
</el-card>
<el-card shadow="never">
<table-tool>
<el-button @click="openAdd" size="small" class="ml10" type="primary">
报销申请
</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="outlayManageSource" label="活动类型"></el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" 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="onOpen(row.id)" size="mini" type="primary">查看</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
<div id="app" v-cloak>
<el-card shadow="never">
<snaker-start slot="header" label="年度预算申报" define_key="FYBXSQ"></snaker-start>
<el-form :model="formData" ref="formRef" class="flow-task-form">
<el-descriptions :column="2" border>
<el-descriptions-item label="活动类型" :span="2">
<el-form-item label="活动类型" prop="outlayManageSource"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-radio-group v-model="formData.outlayManageSource" @change="outlayManageSourceChange">
<el-radio border :label="i.code" :key="i.code" v-for="i in budgetTypeOption">
{{i.name}}
</el-radio>
</el-radio-group>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item>
<el-descriptions-item label="申报人工号">{{formData.loginName}}</el-descriptions-item>
<el-descriptions-item label="联系方式">
<el-form-item label="联系方式" prop="mobile"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.mobile" placeholder="请输入联系方式"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="所属协会"
v-if="['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
<el-form-item label="所属协会" prop="clubId"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select v-model="formData.clubId" @change="getBudgetMoneyOrActivity"
style="width: 100%"
placeholder="请选择所属协会">
<el-option
v-for="item in clubList"
:key="item.clubid"
:label="item.clubName"
:value="item.clubid">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="经费余额">
<el-form-item label="经费余额" prop="budgetMoney">
<el-input v-model="budgetMoney" readonly></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动事项"
v-if="['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
<el-form-item label="活动事项" prop="activityMatter"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.activityMatter" placeholder="请输入活动事项"
maxlength="100"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动事项"
v-if="!['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)">
<el-form-item label="活动事项" prop="budgetId"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-select v-model="formData.budgetId" filterable
@change="budgetIdChange"
default-first-option
placeholder="请选择项目名称" style="width: 100%">
<el-option :label="item.activityMatter"
:value="item.id"
v-for="item in activityList"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item
v-if="!['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)"></el-descriptions-item>
<el-descriptions-item label="金额" :span="2">
<el-form-item label="金额" prop="money"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.money" :placeholder="moneyPlaceholder"
type="number"></el-input>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动时间">
<el-form-item label="活动时间" prop="activityTime"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-date-picker v-model="formData.activityTime"
placeholder="活动时间"
style="width: 100%" type="date"
value-format="yyyy-MM-dd">
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item
v-if="!['ACTIVITY_BUDGET_TYPE_THREE'].includes(formData.outlayManageSource)"></el-descriptions-item>
<el-descriptions-item label="支付内容" :span="2">
<el-form-item label="支付内容" prop="paymentContent"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="formData.paymentContent" :autosize="{ minRows: 4, maxRows: 8}"
maxlength="500"
placeholder="请填写支付内容" type="textarea"></el-input>
</el-date-picker>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="2">
<el-form-item label="附件" prop="files"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<file-upload :upload_number="10" :value.sync="formData.files"
upload_result_type="url"
complete_result upload_mode="drag"
upload_result_category="array"></file-upload>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="2">
<el-form-item label="签字" prop="userSign"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.userSign"></pc-signature>
</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-button type="primary" @click="onSubmit" v-if="!taskId">提交</el-button>
<el-button type="primary" @click="onFinishTask" v-else>提交</el-button>
</el-row>
</el-card>
</div>
<script>
new Vue({
@@ -39,18 +131,217 @@ layout("/layouts/platform.html"){
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/apply/pageData"
bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"),
formData: {},
budgetTypeOption: [],
clubList: [],
activityList: [],
moneyPlaceholder: "请输入金额",
budgetMoney: 0,
}
},
methods: {
openAdd() {
window.open('/flow/common/approval/form?defineKey=FYBXSQ')
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/outlay/reimburse/apply/bxAddValidate", this.formData).then(res => {
if (res.code === 0) {
this.$axios.post('/platform/outlay/reimburse/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
window.location.href = '/platform/outlay/reimburse/applyList/index'
}
})
}
})
})
},
// 提交
onSubmit() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/outlay/reimburse/apply/bxAddValidate", this.formData).then(res => {
if (res.code === 0) {
this.$axios.post('/platform/outlay/reimburse/apply/submit', {
data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId")
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
window.location.href = '/platform/outlay/reimburse/applyList/index'
}
})
}
})
})
},
onFinishTask() {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/platform/outlay/reimburse/apply/bxAddValidate", this.formData).then(res => {
if (res.code === 0) {
this.$axios.post('/flow/common/executeTask', {
data: JSON.stringify({
processTaskId: GetQueryString("taskId"),
submitType: 5
})
}).then(res => {
if (res.code === 0) {
this.$message.success("提交成功")
window.location.href = '/platform/outlay/reimburse/applyList/index'
}
})
}
})
})
},
async outlayManageSourceChange(val) {
if (!val) {
this.budgetMoney = 0
return
}
this.$set(this.formData, "budgetId", null)
await this.getBudgetMoneyOrActivity()
if (val === "ACTIVITY_BUDGET_TYPE_TWO") {
this.$set(this.formData, "unionId", this.$store.state.user.union.id)
}
},
async budgetIdChange(val) {
if (val) {
if (["ACTIVITY_BUDGET_TYPE_TWO", "ACTIVITY_BUDGET_TYPE_ONE"].includes(this.formData.outlayManageSource)) {
//如果是分工会和校工会
const data = this.activityList.find(a => a.id === val)
if (this.formData.outlayManageSource === "ACTIVITY_BUDGET_TYPE_TWO") {
//如果是分工会
if (data.isSchoolBudget) {
//如果这一条分工会活动预算金额是属于校工会的
this.moneyPlaceholder = "预算金额" + data.totalBudgetMoney + "元"
} else {
//如果这一条分工会活动活动,并且预算金额也是自己分工会的
if (data.isRepeatReimburse) {
//如果这一条活动预算可以重复报销
const money = await this.getBxMoneyByBudgetId(val)
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + money + ",不能超过20%"
} else {
//如果如果不能重复报销暂无判断
}
}
} else {
//如果是校工会
if (data.twoLevelBudgetList.length > 0) {
//如果大于0代表肯定有分工会使用校工会的预算,这里要减去分工会的预算
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + data.twoLevelTotalBudgetMoney
} else {
if (data.isRepeatReimburse) {
const money = await this.getBxMoneyByBudgetId(val)
this.moneyPlaceholder = "预算金额:" + data.totalBudgetMoney + "元,已报销金额:" + money + ",不能超过20%"
} else {
//如果如果不能重复报销暂无判断
}
}
}
this.totalBudgetMoney = data.totalBudgetMoney
this.$set(this.formData, 'activityMatter', data.activityMatter)
} else {
this.moneyPlaceholder = "预算金额" + this.budgetMoney + "元"
this.totalBudgetMoney = this.budgetMoney
this.$set(this.formData, 'activityMatter', val)
}
} else {
this.moneyPlaceholder = "请输入金额"
this.totalBudgetMoney = 0
this.$set(this.formData, 'activityMatter', null)
}
},
async getBxMoneyByBudgetId(budgetId) {
const resp = await this.$axios.post("/platform/outlay/reimburse/apply/getBxMoneyByBudgetId", {
budgetId
})
if (resp.code === 0) {
return resp.data
} else {
return 0
}
},
async getBudgetMoneyOrActivity() {
const resp = await this.$axios.post("/platform/outlay/reimburse/apply/getBudgetMoneyOrActivity", {
outlayManageSource: this.formData.outlayManageSource,
clubId: this.formData.clubId,
unionId: this.formData.unionId,
id: this.formData.id
})
if (resp.code === 0) {
this.budgetMoney = resp.data.budgetMoney
this.activityList = resp.data.activityList
}
},
async findOne(id) {
const resp = await $.get('/platform/outlay/reimburse/apply/findOne', {id})
if (resp.code === 0) {
return resp.data
}
},
init() {
if (this.$auth.hasRoleOr(["SYSADMIN", "SCHOOL_UNION_ADMIN"])) {
} else {
if (this.$auth.hasRoleOr(["SCHOOL_OUTLAY_ADMIN", "SCHOOL_UNION_ADMIN"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_ONE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(["BRANCH_UNION_CHAIRMAN", "BRANCH_UNION_ADMIN"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_TWO"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
if (this.$auth.hasRoleOr(["CLUB_MANAGER", "CLUB_PRESIDENT"])) {
this.budgetTypeOption.map(v => {
if (["ACTIVITY_BUDGET_TYPE_THREE"].includes(v.code)) {
budgetTypeOption.push(v)
}
})
}
this.budgetTypeOption = budgetTypeOption
}
if (this.bizId) {
this.findOne(this.bizId).then(async data => {
this.formData = data
await this.getBudgetMoneyOrActivity()
if (data.budgetId){
await this.budgetIdChange(data.budgetId)
}
})
} else {
this.formData = {
userName: this.$store.state.user.username,
loginName: this.$store.state.user.loginname,
mobile: this.$store.state.user.mobile,
}
}
},
onOpen(id) {
}
},
created() {
this.pageData()
async created() {
this.init()
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
}
})
</script>
@@ -0,0 +1,108 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
</el-card>
<el-card shadow="never">
<table-tool>
</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="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary"
v-if="row.taskKey === 'startTask' || !row.instanceId">
编辑
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
<el-button @click="doDelete(row.id)" size="mini" type="danger"
v-if="row.taskKey === 'startTask' || !row.instanceId">
删除
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</guava>
</div>
<script>
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/applyList/pageData",
budgetTypeOption: []
}
},
methods: {
openView(row) {
},
openEdit(row) {
window.location.href = '/platform/outlay/reimburse/apply/index?taskId=' + (row.startTaskId || '') + "&bizId=" + row.id
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
}
})
})
},
doDelete(id) {
}
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,135 @@
const OUTLAY_REIMBURSE_INFO = {
template: /*language=HTML*/ `
<div>
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="申请人">{{viewData.userName}}</el-descriptions-item>
<el-descriptions-item label="工号">{{viewData.loginName}}</el-descriptions-item>
<el-descriptions-item label="联系方式">{{viewData.mobile}}</el-descriptions-item>
<el-descriptions-item label="预算类型">
<dict-tag :options="budgetTypeOption"
:value="viewData.outlayManageSource"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="活动事项">
{{viewData.activityMatter}}
</el-descriptions-item>
<el-descriptions-item label="申请金额">
{{viewData.money}}
</el-descriptions-item>
<el-descriptions-item label="活动时间">
{{viewData.activityTime}}
</el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="支付内容" :span="3">
<div style="white-space: pre-line">{{viewData.paymentContent}}</div>
</el-descriptions-item>
<el-descriptions-item label="附件" :span="3">
<file-preview :files="viewData.files" complete_result></file-preview>
</el-descriptions-item>
<el-descriptions-item label="签字" :span="3">
<el-image :src="viewData.userSign" fit="cover" style="height: 60px"
v-if="viewData.userSign"></el-image>
</el-descriptions-item>
</el-descriptions>
<template v-for="(task,index) in doneTasks">
<div class="task-panel mt10">
<div class="task-panel-header">{{ task.displayName }}</div>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id"
v-if="task.ext.isFirstTaskNode">
<el-descriptions-item label="申请用户">{{ task.ext.initiatorName
}}({{task.ext.initiatorAccount}})
</el-descriptions-item>
<el-descriptions-item label="申请时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
</el-descriptions>
<el-descriptions border class="flow-task-form" :column="3" :key="task.id" v-else>
<el-descriptions-item label="办理用户">{{ task.taskFormData.userName
}}({{task.taskFormData.loginName}})
</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ task.finishTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="明细类" v-if="!task.ext.isFirstTaskNode&&index===2" :span="3">
<dict-tag :options="detailsTypeOption"
:value="task.ext.detailsTypeId"></dict-tag>
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode" :span="3">
{{
task.taskFormData.opinion
}}
</el-descriptions-item>
<el-descriptions-item label="签字" v-if="!task.ext.isFirstTaskNode" :span="3">
<el-image :src="task.ext.tf_userSign" fit="cover" style="height: 60px"
v-if="task.ext.tf_userSign"></el-image>
</el-descriptions-item>
</el-descriptions>
</div>
</template>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
viewData: {},
doneTasks: [],
budgetTypeOption: [],
detailsTypeOption: [],
row: null
}
},
methods: {
// 打开
onOpen(row) {
this.row = row
this.visible = true
this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE").then(resp => {
this.budgetTypeOption = resp
})
this.$businessTool.getDictOptions("ACTIVITY_BUDGET_DETAILS_TYPE").then(resp => {
this.detailsTypeOption = resp
})
this.getInfo()
this.getDoneTasks()
},
// 获取申请信息
getInfo() {
this.$axios.post('/platform/outlay/reimburse/apply/findOne', {id: this.row.id}).then((res) => {
if (res.code === 0) {
this.viewData = res.data
}
})
},
// 获取已办任务审批记录
getDoneTasks() {
this.$axios.post("/flow/common/doneTasks", {bizId: this.row.id}).then((res) => {
if (res.code === 0) {
this.doneTasks = res.data
}
})
},
// 查看流程图
openChart(){
this.$refs.snakerChartRef.onOpenFull(this.row.instanceProcessDefineId,this.row.instanceId)
}
}
}
@@ -0,0 +1,184 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<outlay-reimburse-info ref="outlayReimburseInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="签字" prop="tf_userSign"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</outlay-reimburse-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/schoolCnAudit/pageData",
budgetTypeOption: [],
pageForm: {
year: moment().format("YYYY"),
approval: false
},
showApprovalForm: false
}
},
components: {
"outlay-reimburse-info": OUTLAY_REIMBURSE_INFO
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,342 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<outlay-reimburse-info ref="outlayReimburseInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="签字" prop="tf_userSign"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="openAuditPass" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</outlay-reimburse-info>
</template>
</guava>
<el-dialog
title="提示"
:visible.sync="passDialogVisible"
width="30%">
<el-row>
<el-col :span="20">
<el-select v-model="formData.detailsTypeId"
style="width: 100%"
placeholder="请选择明细类">
<el-option
v-for="item in detailsTypeOption"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-col>
<el-col :span="4">
<el-button class="ml5" type="primary"
@click="detailsTypeDialogVisible = true">设置类型
</el-button>
</el-col>
</el-row>
<span slot="footer" class="dialog-footer">
<el-button @click="passDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doAudit">确 定</el-button>
</span>
</el-dialog>
<el-dialog
title="编辑明细类"
:visible.sync="detailsTypeDialogVisible"
width="50%">
<el-table
:data="detailsTypeList"
border
row-key="id"
style="width: 100%">
<el-table-column
type="index"
width="50" label="序号">
</el-table-column>
<el-table-column
prop="code"
label="编码">
<template slot-scope="{row}">
<el-input v-model="row.code" placeholder="请输入编码" disabled></el-input>
</template>
</el-table-column>
<el-table-column
prop="name"
label="名称" width="200">
<template slot-scope="{row}">
<el-input v-model="row.name" placeholder="请输入名称"
style="width: 100%"></el-input>
</template>
</el-table-column>
<el-table-column width="100px">
<template slot="header" slot-scope="{row}">
<el-button type="primary" size="mini"
@click="detailsTypeList.push({code:'ACTIVITY_BUDGET_DETAILS_TYPE_'+(detailsTypeList.length+1),name:''})">
添加
</el-button>
</template>
<template slot-scope="{row,$index}">
<el-button
size="mini"
type="danger"
@click="doDeleteDetailsType($index,row)">删除
</el-button>
</template>
</el-table-column>
</el-table-column>
</el-table>
<span slot="footer" class="dialog-footer">
<el-button @click="detailsTypeDialogVisible = false">取 消</el-button>
<el-button type="primary" @click="doSubmitDetailsType">确 定</el-button>
</span>
</el-dialog>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/schoolKjAudit/pageData",
budgetTypeOption: [],
pageForm: {
year: moment().format("YYYY"),
approval: false
},
showApprovalForm: false,
passDialogVisible: false,
detailsTypeOption: [],
detailsTypeList: [],
detailsTypeDialogVisible: false
}
},
components: {
"outlay-reimburse-info": OUTLAY_REIMBURSE_INFO
},
methods: {
doDeleteDetailsType(index, row) {
this.$confirm('确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
this.detailsTypeList.splice(index, 1)
if (row.id) {
const res = await this.$axios.post('/platform/outlay/reimburse/schoolKjAudit/doDeleteDetailsType', {id: row.id})
if (res.code === 0) {
this.$message.success('操作成功')
this.detailsTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_DETAILS_TYPE")
} else {
this.$message.error(res.msg)
}
}
})
},
async doSubmitDetailsType() {
const res = await this.$axios.post("/platform/outlay/reimburse/schoolKjAudit/doSubmitDetailsType", {detailsTypeList: JSON.stringify(this.detailsTypeList)})
if (res.code === 0) {
this.$message({
type: 'success',
message: '保存成功!'
});
this.detailsTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_DETAILS_TYPE")
this.detailsTypeList = clone(this.detailsTypeOption)
this.detailsTypeDialogVisible = false
} else {
this.$message({
type: 'error',
message: res.msg
});
}
},
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
openAuditPass() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.passDialogVisible = true;
this.$set(this.formData, "detailsTypeId", null)
}
})
},
doAudit() {
if (!this.formData.detailsTypeId) {
this.$message.error("请选择明细类")
return
}
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: 1
})
}).then((res) => {
if (res.code === 0) {
this.passDialogVisible = false
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.detailsTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_DETAILS_TYPE")
this.detailsTypeList = clone(this.detailsTypeOption)
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,184 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app">
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="选择年"
style="width: 100%"
type="year"
v-model="pageForm.year"
value-format="yyyy">
</el-date-picker>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="申请列表">
<el-radio-group v-model="pageForm.approval" size="small" @change="doSearch">
<el-radio-button :label="true">已审核</el-radio-button>
<el-radio-button :label="false">未审核</el-radio-button>
</el-radio-group>
</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="outlayManageSource" label="活动类型">
<template v-slot="{row}">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
</el-table-column>
<el-table-column prop="activityMatter" label="活动事项"></el-table-column>
<el-table-column prop="helpUnitName" label="申报单位">
<template v-slot="{row}">
<span v-if="['ACTIVITY_BUDGET_TYPE_ONE'].includes(row.outlayManageSource)">校工会</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_TWO'].includes(row.outlayManageSource)">{{row.unionName}}</span>
<span v-if="['ACTIVITY_BUDGET_TYPE_THREE','ACTIVITY_BUDGET_TYPE_FOUR'].includes(row.outlayManageSource)">{{row.clubName}}</span>
</template>
</el-table-column>
<el-table-column prop="money" label="金额"></el-table-column>
<el-table-column prop="applyTime" label="申报时间"></el-table-column>
<el-table-column prop="taskName" label="当前节点"></el-table-column>
<el-table-column prop="instanceState" label="流程状态">
<template v-slot="{row}">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag>
</template>
</el-table-column>
<el-table-column label="操作" fixed="right" width="300px">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">查看</el-button>
<el-button v-if="row.taskState === 10" @click="openAudit(row)" size="mini" type="primary">审核
</el-button>
<el-button v-if="row.canRevoke" @click="onRevoke(row)" size="mini" type="danger">撤回
</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<outlay-reimburse-info ref="outlayReimburseInfo">
<div v-if="showApprovalForm">
<div class="process-title">
{{formData.taskName}}
</div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
class="flow-task-form">
<el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
</el-form-item>
<el-form-item label="签字" prop="tf_userSign"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<pc-signature v-model="formData.tf_userSign"></pc-signature>
</el-form-item>
</el-form>
<el-row type="flex" justify="end">
<el-button @click="$refs.guava.index()" size="small">取消</el-button>
<el-button @click="handleTaskAction(6)" size="small" type="info">退回到发起人</el-button>
<el-button @click="handleTaskAction(2)" size="small" type="danger">拒绝申请</el-button>
<el-button @click="handleTaskAction(1)" size="small" type="primary">同意申请</el-button>
</el-row>
</div>
</outlay-reimburse-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
new Vue({
el: "#app",
store,
mixins: [initTableMixins],
data() {
return {
pageDataUrl: "/platform/outlay/reimburse/schoolZxAudit/pageData",
budgetTypeOption: [],
pageForm: {
year: moment().format("YYYY"),
approval: false
},
showApprovalForm: false
}
},
components: {
"outlay-reimburse-info": OUTLAY_REIMBURSE_INFO
},
methods: {
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
handleTaskAction(val) {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post("/flow/common/executeTask", {
data: JSON.stringify({
...this.formData,
submitType: val
})
}).then((res) => {
if (res.code === 0) {
this.$refs.guava.index()
this.$message.success(res.msg)
this.doSearch()
}
})
})
}
})
},
onRevoke(row) {
this.$confirm("您确定要撤回吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "info"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
}
})
})
},
openAudit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
processTaskId: row.taskId,
taskName: row.curTaskName
}
this.$refs.outlayReimburseInfo.onOpen(row)
})
},
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -35,13 +35,13 @@ layout("/layouts/platform.html"){
@keyup.enter.native="doSearch">
</el-input>
</search-item>
<search-item label="办证年">
<search-item label="办证年">
<el-date-picker
format="yyyy"
value-format="yyyy"
v-model="pageForm.thirtyCertificateProcessingTime"
type="year"
placeholder="请选择荣誉证办理年月"
placeholder="请选择荣誉证办理办证年份"
style="width: 100%">
</el-date-picker>
</search-item>
@@ -95,6 +95,7 @@ layout("/layouts/platform.html"){
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:width="column.width"
:key="column.prop"
:sortable="column.sortable"
>
@@ -106,12 +107,30 @@ layout("/layouts/platform.html"){
<i class="fa fa-circle ml5"></i>
</span>
</template>
<template v-else-if="column.prop==='thirtyCertificateProcessingTime'" v-slot="{row}">
<span v-if="row.isEditThirtyCertificateProcessingTime">
<el-date-picker
style="width: 100%;"
v-model="row.thirtyCertificateProcessingTime"
type="month"
placeholder="选择日期时间"
@change="rowThirtyCertificateProcessingTimeChange(row)"
value-format="yyyy-MM">
</el-date-picker>
</span>
<span v-else>
{{row.thirtyCertificateProcessingTime}}
</span>
</template>
</el-table-column>
<el-table-column prop="userOnline" align="center" header-align="center"
label="操作"
width="180px">
<template slot-scope="{row}">
<!-- <el-button size="mini" type="primary" @click="openView(row.id)">查看</el-button>-->
<el-button size="mini" type="primary"
@click="row.isEditThirtyCertificateProcessingTime=1">编辑
</el-button>
<el-button size="mini" type="danger" @click="doDelete(row.id)">删除</el-button>
</template>
</el-table-column>
@@ -122,7 +141,8 @@ layout("/layouts/platform.html"){
<template #edit>
<file-import ref="viewImport" temp_url="/platform/thirtyTeach/manage/downloadImportTemp"
post_url="/platform/thirtyTeach/manage/doImport" is_show_radio @flush="$refs.guava.index();pageData()"
post_url="/platform/thirtyTeach/manage/doImport" is_show_radio
@flush="$refs.guava.index();pageData()"
></file-import>
</template>
</guava>
@@ -175,7 +195,7 @@ layout("/layouts/platform.html"){
{prop: 'unitName', label: '所属单位', sortable: true},
{prop: 'member', label: '是否会员', sortable: true},
{prop: 'mobile', label: '联系电话'},
{prop: 'thirtyCertificateProcessingTime', label: '《30年教龄荣誉证》办理年月'},
{prop: 'thirtyCertificateProcessingTime', label: '《30年教龄荣誉证》办理年月', width: 200},
],
setThirtyTeachVisible: false,
@@ -197,8 +217,25 @@ layout("/layouts/platform.html"){
"file-import": httpVueLoader("/components/plugins/sysImport/index.vue?v=" + new Date().getTime())
},
methods: {
rowThirtyCertificateProcessingTimeChange(row) {
row.isEditThirtyCertificateProcessingTime = false
this.$axios.post('/platform/thirtyTeach/manage/doEditThirtyCertificateProcessingTime', {
thirtyCertificateProcessingTime: row.thirtyCertificateProcessingTime,
id: row.id,
}).then(resp => {
if (resp.code === 0) {
this.doSearch()
this.notifySuccess(resp.msg)
} else {
this.notifyWarning(resp.msg)
}
})
},
openEdit(row) {
},
openImport() {
this.$refs.guava.edit(()=>{
this.$refs.guava.edit(() => {
this.$refs.viewImport.resetImportData()
})
@@ -263,7 +300,7 @@ layout("/layouts/platform.html"){
},
openView() {
},
async doDelete(userId) {
async doDelete(userId) {
const confirm = await this.$confirm('您确定要删除吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',