This commit is contained in:
2025-12-17 15:02:14 +08:00
parent 74970eacb5
commit debd178bae
14 changed files with 765 additions and 308 deletions
@@ -1,5 +1,6 @@
package com.budwk.app.base.model; package com.budwk.app.base.model;
import cn.hutool.json.JSONObject;
import com.budwk.app.web.commons.auth.utils.SecurityUtil; import com.budwk.app.web.commons.auth.utils.SecurityUtil;
import lombok.Data; import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
@@ -64,6 +65,16 @@ public class Audit extends BaseModel {
@ColDefine(type = ColType.INT) @ColDefine(type = ColType.INT)
private Integer auditType; private Integer auditType;
@Column
@Comment("扩展字段")
@ColDefine(type = ColType.MYSQL_JSON)
private JSONObject ext;
@Column
@Comment("父级ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String parentId;
public Date nowDate() { public Date nowDate() {
return new Date(); return new Date();
@@ -98,6 +98,7 @@ public class ActivityDeclareClubPrincipalController {
pageParam.buildSearch(cnd, "info."); pageParam.buildSearch(cnd, "info.");
cnd.and("t.taskName", "=", "06d5979b-b52f-4df1-8974-087568322cd6"); cnd.and("t.taskName", "=", "06d5979b-b52f-4df1-8974-087568322cd6");
cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId())); cnd.and("ta.actorId", "in", List.of(SecurityUtil.getUserId()));
if (pageParam.getAudit()) { if (pageParam.getAudit()) {
@@ -131,4 +131,9 @@ public class ActivityDeclareInfo extends BaseModel {
@Comment("预算总金额") @Comment("预算总金额")
@ColDefine(customType = "decimal(10,2)") @ColDefine(customType = "decimal(10,2)")
private BigDecimal budgetMoney; private BigDecimal budgetMoney;
@Column
@Comment("扣款预算")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String deductionBudgetId;
} }
@@ -0,0 +1,91 @@
package com.budwk.app.zhgh.dayofficework.outlay.activityBudget.conteoller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.models.Sys_file;
import com.budwk.app.zhgh.dayofficework.outlay.activityBudget.models.ActivityBudget;
import com.budwk.app.zhgh.dayofficework.outlay.activityBudget.service.ActivityBudgetApplyStatisticsService;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.util.NutMap;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;
import java.util.Map;
/**
* @author zhf
* @date 2025/5/26 14:25
* @description 预算指定某个人修改
*/
@IocBean
@Ok("json:full")
@Slf4j
@Api(tags = "管理员修改预算")
@At("/platform/activity/budget/allocationEdit")
public class ActivityBudgetAllocationEditController {
@Inject
private ActivityBudgetApplyStatisticsService applyStatisticsService;
@At("")
@Ok("beetl:/platform/zhgh/dayofficework/outlay/activityBudget/allocationEdit/index.html")
@SaCheckPermission("activity.budget.allocationEdit")
public void index() {
}
@At
@SaCheckPermission("activity.budget.allocationEdit")
public Result pageData(PageForm pageForm, Integer year, String unionId, String clubId, String budgetTypeCode, String activityMatter, String budgetReimburseType) {
Sql sql = applyStatisticsService.getsql(year, unionId, clubId, budgetTypeCode, activityMatter, budgetReimburseType);
return Result.success(applyStatisticsService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql));
}
@At
@SaCheckPermission("activity.budget.allocationEdit")
public Result getApplyMoney(Integer year, String unionId, String clubId, String budgetTypeCode, String activityMatter, String budgetReimburseType) {
Sql sql = applyStatisticsService.getsql(year, unionId, clubId, budgetTypeCode, activityMatter, budgetReimburseType);
List<NutMap> list = applyStatisticsService.listMap(sql);
list = list.stream().filter(v -> !v.getBoolean("isSchoolBudget")).toList();
double declareTotalBudgetMoney = list.stream().mapToDouble(map -> map.getDouble("declareTotalBudgetMoney")).sum();
double totalBudgetMoney = list.stream().mapToDouble(map -> map.getDouble("totalBudgetMoney")).sum();
return Result.success(Map.of("declareTotalBudgetMoney", declareTotalBudgetMoney, "totalBudgetMoney", totalBudgetMoney));
}
@At
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "管理员修改预算", msg = "预算名称:${args[0].activityMatter},预算金额:${args[1]}")
@SaCheckPermission("activity.budget.allocationEdit")
public Result doSubmit(String id, String totalBudgetMoney, String activityMatter, Sys_file[] files, Audit audit) {
ActivityBudget budget = applyStatisticsService.dao().fetch(ActivityBudget.class, id);
JSONObject jsonObject = new JSONObject();
jsonObject.set("money", budget.getTotalBudgetMoney());
jsonObject.set("files", files);
audit.setExt(jsonObject);
audit.setParentId(id);
applyStatisticsService.insert(audit);
applyStatisticsService.dao().update(ActivityBudget.class,
Chain.make("totalBudgetMoney", totalBudgetMoney),
Cnd.where("id", "=", id));
return Result.success();
}
}
@@ -5,6 +5,8 @@ import org.nutz.dao.sql.Sql;
public interface ActivityBudgetApplyStatisticsService extends BaseService { public interface ActivityBudgetApplyStatisticsService extends BaseService {
Sql getsql(Integer year, String unionId,String clubId, String outlayManageSource,String activityMatter,String budgetReimburseType); Sql getsql(Integer year, String unionId,String clubId, String outlayManageSource,String activityMatter,String budgetReimburseType);
@@ -7,6 +7,7 @@ import cn.afterturn.easypoi.excel.entity.params.ExcelExportEntity;
import cn.hutool.core.lang.Dict; import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.model.Audit;
import com.budwk.app.base.param.PageForm; import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result; import com.budwk.app.base.result.Result;
import com.budwk.app.base.service.impl.BaseServiceImpl; import com.budwk.app.base.service.impl.BaseServiceImpl;
@@ -242,6 +243,7 @@ public class ActivityBudgetServiceImpl extends BaseServiceImpl<ActivityBudget> i
execute(sql); execute(sql);
NutMap activityBudget = (NutMap) sql.getResult(); NutMap activityBudget = (NutMap) sql.getResult();
activityBudget.put("budgetDetails", dao().query(ActivityBudgetDetails.class, Cnd.where("budgetId", "=", id))); activityBudget.put("budgetDetails", dao().query(ActivityBudgetDetails.class, Cnd.where("budgetId", "=", id)));
activityBudget.put("allocationEditAuditList", dao().query(Audit.class, Cnd.where("parentId", "=", id)));
return activityBudget; return activityBudget;
} }
@@ -2,325 +2,367 @@
layout("/layouts/platform.html"){ layout("/layouts/platform.html"){
#--> #-->
<style> <style>
.el-descriptions-item__label.is-bordered-label { .el-descriptions-item__label.is-bordered-label {
width: 15% !important; width: 15% !important;
} }
.el-descriptions-item__label { .el-descriptions-item__label {
width: 15% !important; width: 15% !important;
} }
</style> </style>
<div id="app"> <div id="app">
<el-card shadow="never"> <el-card shadow="never">
<snaker-start slot="header" label="活动申报" define_key="HDSB"></snaker-start> <snaker-start slot="header" label="活动申报" define_key="HDSB"></snaker-start>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix="" class="flow-task-form"> <el-form :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=""
<el-descriptions :column="2" border> class="flow-task-form">
<el-descriptions-item label="活动名称"> <el-descriptions :column="2" border>
<el-form-item prop="activityName"> <el-descriptions-item label="活动名称">
<el-input placeholder="请输入活动名称" style="width: 100%" v-model="formData.activityName"> <el-form-item prop="activityName">
</el-input> <el-input placeholder="请输入活动名称" style="width: 100%" v-model="formData.activityName">
</el-form-item> </el-input>
</el-descriptions-item> </el-form-item>
<el-descriptions-item label="活动类型"> </el-descriptions-item>
<el-form-item prop="activityType"> <el-descriptions-item label="活动类型">
<el-select @change="activityTypeChange" placeholder="请选择活动类型" <el-form-item prop="activityType">
style="width: 100%" v-model="formData.activityType"> <el-select @change="activityTypeChange" placeholder="请选择活动类型"
<el-option style="width: 100%" v-model="formData.activityType">
:key="item.name" <el-option
:label="item.typeName" :key="item.name"
:value="item.name" :label="item.typeName"
v-for="item in activityDeclareReimbursementList"> :value="item.name"
</el-option> v-for="item in activityDeclareReimbursementList">
</el-select> </el-option>
</el-form-item> </el-select>
</el-descriptions-item> </el-form-item>
</el-descriptions-item>
<el-descriptions-item label="申请人姓名"> <el-descriptions-item label="申请人姓名">
<el-form-item prop="userName"> <el-form-item prop="userName">
<el-input disabled type="text" v-model="formData.userName"></el-input> <el-input disabled type="text" v-model="formData.userName"></el-input>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<template v-if="formData.activityType == 'CLUB'"> <template v-if="formData.activityType == 'CLUB'">
<el-descriptions-item label="申请协会"> <el-descriptions-item label="申请协会">
<el-form-item prop="clubId" label="申请协会"> <el-form-item prop="clubId" label="申请协会">
<el-select v-model="formData.clubId" placeholder="请选择协会" <el-select v-model="formData.clubId" placeholder="请选择协会"
@change="setDeclareUnitName" style="width: 100%"> @change="setDeclareUnitName" style="width: 100%">
<el-option <el-option
v-for="item in clubList" v-for="item in clubList"
:key="item.id" :key="item.id"
:label="item.clubName" :label="item.clubName"
:value="item.id"> :value="item.id">
</el-option> </el-option>
</el-select> </el-select>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
</template> </template>
<template v-else> <template v-else>
<el-descriptions-item label="申请单位"> <el-descriptions-item label="申请单位">
<el-form-item prop="declareUnitName"> <el-form-item prop="declareUnitName">
<el-input readonly v-model="formData.declareUnitName" type="text" placeholder="请选择项目类型,自动填充"></el-input> <el-input readonly v-model="formData.declareUnitName" type="text"
</el-form-item> placeholder="请选择活动类型,自动填充"></el-input>
</el-descriptions-item> </el-form-item>
</template> </el-descriptions-item>
</template>
<el-descriptions-item label="联系方式"> <el-descriptions-item label="联系方式">
<el-form-item prop="mobile"> <el-form-item prop="mobile">
<el-input type="text" v-model="formData.mobile" placeholder="请输入联系方式" maxlength="11"></el-input> <el-input type="text" v-model="formData.mobile" placeholder="请输入联系方式"
</el-form-item> maxlength="11"></el-input>
</el-descriptions-item> </el-form-item>
<el-descriptions-item label="申请时间"> </el-descriptions-item>
<el-form-item prop="applyTime"> <el-descriptions-item label="申请时间">
<el-input disabled type="text" v-model="formData.applyTime"></el-input> <el-form-item prop="applyTime">
</el-form-item> <el-input disabled type="text" v-model="formData.applyTime"></el-input>
</el-descriptions-item> </el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动计划时间"> <el-descriptions-item label="活动计划时间">
<el-form-item prop="planDate"> <el-form-item prop="planDate">
<el-date-picker <el-date-picker
start-placeholder="开始日期" start-placeholder="开始日期"
range-separator="-" range-separator="-"
end-placeholder="结束日期" end-placeholder="结束日期"
style="width: 100%" style="width: 100%"
type="daterange" type="daterange"
v-model="formData.planDate" v-model="formData.planDate"
value-format="yyyy-MM-dd"> value-format="yyyy-MM-dd">
</el-date-picker> </el-date-picker>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="活动人数"> <el-descriptions-item label="活动人数">
<el-form-item prop="activityNumber"> <el-form-item prop="activityNumber">
<el-input-number v-model="formData.activityNumber" placeholder="请输入活动人数"></el-input-number> <el-input-number v-model="formData.activityNumber"
</el-form-item> placeholder="请输入活动人数"></el-input-number>
</el-descriptions-item> </el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动地址" :span="2"> <el-descriptions-item label="活动地址">
<el-form-item prop="activityAddress"> <el-form-item prop="activityAddress">
<el-input maxlength="150" placeholder="请填写活动地址" type="text" <el-input maxlength="150" placeholder="请填写活动地址" type="text"
v-model="formData.activityAddress"></el-input> v-model="formData.activityAddress"></el-input>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="扣款预算">
<el-form-item prop="deductionBudgetId">
<el-select v-model="formData.deductionBudgetId"
style="width: 100%;"
filterable placeholder="选择扣款预算">
<el-option
v-for="item in budgetOption"
:key="item.id"
:label="'预算名称:'+item.activityMatter + ',申报预算:' + item.totalBudgetMoney"
:value="item.id">
</el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="活动预算费用" :span="2"> <el-descriptions-item label="活动预算费用" :span="2">
<el-form-item prop="budgets"> <el-form-item prop="budgets">
<el-table :data="formData.budgets" border max-height="500" size="mini" style="width: 95%"> <el-table :data="formData.budgets" border max-height="500" size="mini" style="width: 95%" show-summary>
<el-table-column label="序号" sortable type="index" width="100"></el-table-column> <el-table-column label="序号" sortable type="index" width="100"></el-table-column>
<el-table-column label="费用项目名称" prop="name"> <el-table-column label="费用项目名称" prop="name">
<template scope="{row,$index}"> <template scope="{row,$index}">
<el-form-item label-width="0" <el-form-item label-width="0"
:prop="'budgets.'+$index+'.name'" :prop="'budgets.'+$index+'.name'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input v-model="row.name" maxlength="50" <el-input v-model="row.name" maxlength="50"
placeholder="请输入费用项目名称"></el-input> placeholder="请输入费用项目名称"></el-input>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column label="预算费用" prop="budgetPrice"> <el-table-column label="预算费用(元)" prop="budgetPrice">
<template scope="{row,$index}"> <template scope="{row,$index}">
<el-form-item label-width="0" <el-form-item label-width="0"
:prop="'budgets.'+$index+'.budgetPrice'" :prop="'budgets.'+$index+'.budgetPrice'"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]"> :rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number placeholder="预算费用" v-model="row.budgetPrice" :precision="2" <el-input-number placeholder="预算费用" v-model="row.budgetPrice" :precision="2"
style="width: 100%" :min="1"></el-input-number> style="width: 100%" :min="1"></el-input-number>
</el-form-item> </el-form-item>
</template> </template>
</el-table-column> </el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="150px"> <el-table-column align="center" header-align="center" label="操作" width="150px">
<template slot="header" slot-scope="scope"> <template slot="header" slot-scope="scope">
<el-button @click="formData.budgets.push({})" icon="el-icon-plus" type="primary" <el-button @click="formData.budgets.push({})" icon="el-icon-plus" type="primary"
size="mini">添加 size="mini">添加
</el-button> </el-button>
</template> </template>
<template slot-scope="scope"> <template slot-scope="scope">
<el-button :disabled="formData.budgets.length==1" <el-button :disabled="formData.budgets.length==1"
@click="formData.budgets.splice(scope.$index,1)" @click="formData.budgets.splice(scope.$index,1)"
size="mini" size="mini"
icon="el-icon-delete" icon="el-icon-delete"
type="danger"></el-button> type="danger"></el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="活动方案及简介" :span="2"> <el-descriptions-item label="活动方案及简介" :span="2">
<el-form-item prop="activityContent"> <el-form-item prop="activityContent">
<text-editor v-model="formData.activityContent"></text-editor> <text-editor v-model="formData.activityContent"></text-editor>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="附件" :span="2"> <el-descriptions-item label="附件" :span="2">
<el-form-item prop="files"> <el-form-item prop="files">
<file-upload :value.sync="formData.files" <file-upload :value.sync="formData.files"
upload_mode="drag" upload_mode="drag"
:upload_number="10" upload_result_category="array" :upload_number="10" upload_result_category="array"
accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png" accept=".doc, .docx, .xls, .xlsx, .pdf, .ppt, .jpg, .jpeg, .png"
complete_result></file-upload> complete_result></file-upload>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="签字" :span="2"> <el-descriptions-item label="签字" :span="2">
<el-form-item prop="sign"> <el-form-item prop="sign">
<pc-signature v-model="formData.sign"></pc-signature> <pc-signature v-model="formData.sign"></pc-signature>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
</el-descriptions> </el-descriptions>
</el-form> </el-form>
<el-row type="flex" justify="end" class="mt20"> <el-row type="flex" justify="end" class="mt20">
<el-button type="primary" plain @click="onSave">保存</el-button> <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="onSubmit" v-if="!taskId">提交</el-button>
<el-button type="primary" @click="onFinishTask" v-else>提交</el-button> <el-button type="primary" @click="onFinishTask" v-else>提交</el-button>
</el-row> </el-row>
</el-card> </el-card>
</div> </div>
<script> <script>
new Vue({ new Vue({
el: "#app", el: "#app",
mixins: [initTableMixins], mixins: [initTableMixins],
store, store,
data() { data() {
return { return {
bizId: GetQueryString("bizId"), bizId: GetQueryString("bizId"),
taskId: GetQueryString("taskId"), taskId: GetQueryString("taskId"),
formData: { formData: {
id: GetQueryString("businessId"), id: GetQueryString("businessId"),
planDate: [] planDate: []
}, },
formRules: { formRules: {
activityName: [{required: true, message: '必填', trigger: ['blur', 'change']}], activityName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
activityType: [{required: true, message: '必填', trigger: ['blur', 'change']}], activityType: [{required: true, message: '必填', trigger: ['blur', 'change']}],
fundsUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}], fundsUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
declareUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}], declareUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
planDate: [{required: true, message: '必填', trigger: ['blur', 'change']}], planDate: [{required: true, message: '必填', trigger: ['blur', 'change']}],
budgets: [{required: true, message: '必填', trigger: ['blur', 'change']}], budgets: [{required: true, message: '必填', trigger: ['blur', 'change']}],
clubId: [{required: true, message: '必填', trigger: ['blur', 'change']}], clubId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}], mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
sign: [{required: true, message: '必填', trigger: ['blur', 'change']}], sign: [{required: true, message: '必填', trigger: ['blur', 'change']}],
}, deductionBudgetId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
activityDeclareReimbursementList: [], },
clubList: [], activityDeclareReimbursementList: [],
} clubList: [],
}, budgetOption: []
methods: { }
// 保存 },
onSave() { methods: {
this.$confirm("您确定保存吗?", "提示", { getBudgetByYear() {
confirmButtonText: "确定", this.budgetOption = []
cancelButtonText: "取消", this.$set(this.formData, "deductionBudgetId", null)
type: "warning" let outlayManageSource = ""
}).then(() => { if (this.formData.activityType === "SCHOOL_UNION") {
if (this.formData.planDate && this.formData.planDate.length > 0) { outlayManageSource = "ACTIVITY_BUDGET_TYPE_ONE"
this.formData.planStartTime = this.formData.planDate[0] } else if (this.formData.activityType === "BRANCH_UNION") {
this.formData.planEndTime = this.formData.planDate[1] outlayManageSource = "ACTIVITY_BUDGET_TYPE_TWO"
} } else if (this.formData.activityType === "CLUB") {
this.$axios.post('/platform/activityDeclare/apply/save', {data: JSON.stringify(this.formData)}).then(res => { outlayManageSource = "ACTIVITY_BUDGET_TYPE_THREE"
if (res.code === 0) { }
this.$message.success("保存成功") this.$axios.post('/platform/activityReimbursement/apply/getBudgetByYear', {
outlayManageSource: outlayManageSource,
clubId: this.formData.clubId
}).then(res => {
if (res.code === 0) {
this.budgetOption = res.data
}
})
},
// 保存
onSave() {
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
if (this.formData.planDate && this.formData.planDate.length > 0) {
this.formData.planStartTime = this.formData.planDate[0]
this.formData.planEndTime = this.formData.planDate[1]
}
this.$axios.post('/platform/activityDeclare/apply/save', {data: JSON.stringify(this.formData)}).then(res => {
if (res.code === 0) {
this.$message.success("保存成功")
commonUtil.pjaxPush('/platform/activityDeclare/mine') commonUtil.pjaxPush('/platform/activityDeclare/mine')
} }
}) })
}) })
}, },
// 提交 // 提交
onSubmit() { onSubmit() {
this.$confirm("您确定要提交吗?", "提示", { this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
if (this.formData.planDate && this.formData.planDate.length > 0) { if (this.formData.planDate && this.formData.planDate.length > 0) {
this.formData.planStartTime = this.formData.planDate[0] this.formData.planStartTime = this.formData.planDate[0]
this.formData.planEndTime = this.formData.planDate[1] this.formData.planEndTime = this.formData.planDate[1]
} }
this.$axios.post('/platform/activityDeclare/apply/submit', { this.$axios.post('/platform/activityDeclare/apply/submit', {
data: JSON.stringify(this.formData) data: JSON.stringify(this.formData)
}).then(res => { }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success("提交成功") this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/activityDeclare/mine') commonUtil.pjaxPush('/platform/activityDeclare/mine')
} }
}) })
}) })
}, },
onFinishTask() { onFinishTask() {
this.$confirm("您确定要提交吗?", "提示", { this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定", confirmButtonText: "确定",
cancelButtonText: "取消", cancelButtonText: "取消",
type: "warning" type: "warning"
}).then(() => { }).then(() => {
if (this.formData.planDate && this.formData.planDate.length > 0) { if (this.formData.planDate && this.formData.planDate.length > 0) {
this.formData.planStartTime = this.formData.planDate[0] this.formData.planStartTime = this.formData.planDate[0]
this.formData.planEndTime = this.formData.planDate[1] this.formData.planEndTime = this.formData.planDate[1]
} }
this.$axios.post('/platform/activityDeclare/apply/submitAgain', { this.$axios.post('/platform/activityDeclare/apply/submitAgain', {
data: JSON.stringify(this.formData), data: JSON.stringify(this.formData),
taskId: GetQueryString("taskId") taskId: GetQueryString("taskId")
}).then(res => { }).then(res => {
if (res.code === 0) { if (res.code === 0) {
this.$message.success("提交成功") this.$message.success("提交成功")
commonUtil.pjaxPush('/platform/activityDeclare/mine') commonUtil.pjaxPush('/platform/activityDeclare/mine')
} }
}) })
}) })
}, },
// 设置申报主体名称 // 设置申报主体名称
setDeclareUnitName(val){ setDeclareUnitName(val) {
const club = this.clubList.find(v => v.id === val) const club = this.clubList.find(v => v.id === val)
this.$set(this.formData, "declareUnitName", club ? club.clubName : null) this.$set(this.formData, "declareUnitName", club ? club.clubName : null)
}, this.getBudgetByYear()
// 申请类型选中 },
activityTypeChange(val) { // 申请类型选中
if (val === "SCHOOL_UNION") { activityTypeChange(val) {
this.$set(this.formData, "declareUnitName", "校工会") if (val === "SCHOOL_UNION") {
} else if (val === "BRANCH_UNION") { this.$set(this.formData, "declareUnitName", "校工会")
this.$set(this.formData, "declareUnitName", this.$store.state.user.union.name) } else if (val === "BRANCH_UNION") {
this.$set(this.formData, "unionId", this.$store.state.user.union.id) this.$set(this.formData, "declareUnitName", this.$store.state.user.union.name)
} this.$set(this.formData, "unionId", this.$store.state.user.union.id)
}, }
findOne(id) { this.getBudgetByYear()
this.$axios.post("/platform/activityDeclare/mine/findOne", { id }) },
.then((res) => { findOne(id) {
if (res.code === 0) { this.$axios.post("/platform/activityDeclare/mine/findOne", {id})
this.formData = res.data .then((res) => {
if (res.data.clubId) { if (res.code === 0) {
this.setDeclareUnitName(res.data.clubId) this.formData = res.data
} if (res.data.clubId) {
this.setDeclareUnitName(res.data.clubId)
}
if (res.data.planStartTime && res.data.planEndTime) { if (res.data.planStartTime && res.data.planEndTime) {
this.$set(this.formData, "planDate", [res.data.planStartTime, res.data.planEndTime]) this.$set(this.formData, "planDate", [res.data.planStartTime, res.data.planEndTime])
} }
} else { } else {
this.$message.error(res.msg) this.$message.error(res.msg)
} }
}) })
}, },
async init() { async init() {
this.activityDeclareReimbursementList = await this.$businessTool.getEnumOptions("ActivityDeclareReimbursement") this.activityDeclareReimbursementList = await this.$businessTool.getEnumOptions("ActivityDeclareReimbursement")
if (this.bizId) { if (this.bizId) {
this.findOne(this.bizId) this.findOne(this.bizId)
} else { } else {
const user = this.$store.state.user const user = this.$store.state.user
this.$set(this.formData, "userId", user.id) this.$set(this.formData, "userId", user.id)
this.$set(this.formData, "userName", user.username) this.$set(this.formData, "userName", user.username)
this.$set(this.formData, "loginName", user.loginname) this.$set(this.formData, "loginName", user.loginname)
this.$set(this.formData, "mobile", user.mobile) this.$set(this.formData, "mobile", user.mobile)
this.$set(this.formData, "applyTime", this.$moment().format("YYYY-MM-DD")) this.$set(this.formData, "applyTime", this.$moment().format("YYYY-MM-DD"))
this.$set(this.formData, "budgets", []) this.$set(this.formData, "budgets", [])
} }
} }
}, },
async created() { async created() {
this.init() this.init()
//社团查询 //社团查询
this.$businessTool.listCLubByRole().then((res) => (this.clubList = res)) this.$businessTool.listCLubByRole().then((res) => (this.clubList = res))
} }
}) })
</script> </script>
<!--# <!--#
} }
@@ -135,7 +135,7 @@ layout("/layouts/platform.html"){
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true }, { prop: "declareUnitName", label: "申报单位/协会", sortable: true },
{ prop: "activityNumber", label: "活动人数", sortable: true }, { prop: "activityNumber", label: "活动人数", sortable: true },
{ prop: "applyTime", label: "申报时间", sortable: true }, { prop: "applyTime", label: "申报时间", sortable: true },
{ prop: "taskName", label: "当前节点"}, { prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"} { prop: "instanceState", label: "流程状态"}
], ],
activityDeclareReimbursementList: [], activityDeclareReimbursementList: [],
@@ -122,7 +122,7 @@ layout("/layouts/platform.html"){
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true }, { prop: "declareUnitName", label: "申报单位/协会", sortable: true },
{ prop: "activityNumber", label: "活动人数", sortable: true }, { prop: "activityNumber", label: "活动人数", sortable: true },
{ prop: "applyTime", label: "申报时间", sortable: true }, { prop: "applyTime", label: "申报时间", sortable: true },
{ prop: "taskName", label: "当前节点"}, { prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"} { prop: "instanceState", label: "流程状态"}
], ],
activityDeclareReimbursementList: [], activityDeclareReimbursementList: [],
@@ -135,7 +135,7 @@ layout("/layouts/platform.html"){
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true }, { prop: "declareUnitName", label: "申报单位/协会", sortable: true },
{ prop: "activityNumber", label: "活动人数", sortable: true }, { prop: "activityNumber", label: "活动人数", sortable: true },
{ prop: "applyTime", label: "申报时间", sortable: true }, { prop: "applyTime", label: "申报时间", sortable: true },
{ prop: "taskName", label: "当前节点"}, { prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"} { prop: "instanceState", label: "流程状态"}
], ],
activityDeclareReimbursementList: [], activityDeclareReimbursementList: [],
@@ -135,7 +135,7 @@ layout("/layouts/platform.html"){
{ prop: "declareUnitName", label: "申报单位/协会", sortable: true }, { prop: "declareUnitName", label: "申报单位/协会", sortable: true },
{ prop: "activityNumber", label: "活动人数", sortable: true }, { prop: "activityNumber", label: "活动人数", sortable: true },
{ prop: "applyTime", label: "申报时间", sortable: true }, { prop: "applyTime", label: "申报时间", sortable: true },
{ prop: "taskName", label: "当前节点"}, { prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"} { prop: "instanceState", label: "流程状态"}
], ],
activityDeclareReimbursementList: [], activityDeclareReimbursementList: [],
@@ -0,0 +1,269 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div class="platform" id="app" v-cloak>
<guava ref="guava">
<template>
<el-card shadow="never">
<search @search="doSearch();getApplyMoney()">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="请选择年度"
style="width: 100%" type="year"
v-model="pageForm.year"
:clearable="false"
value-format="yyyy">
</el-date-picker>
</search-item>
<search-item label="活动项目">
<el-input v-model="pageForm.activityMatter" placeholder="请输入活动项目"
clearable></el-input>
</search-item>
<search-item label="预算条目">
<dict-select v-model="pageForm.budgetReimburseType"
code="ACTIVITY_BUDGET_REIMBURSE_TYPE"></dict-select>
</search-item>
<search-item label="所属工会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_TWO'">
<el-select v-model="pageForm.unionId" filterable
clearable
placeholder="请选择所属工会" style="width: 100%;">
<el-option v-for="item in unionList" :label="item.name"
:value="item.id">
</el-option>
</el-select>
</search-item>
<search-item label="协会"
v-if="!pageForm.outlayManageSource||pageForm.outlayManageSource==='ACTIVITY_BUDGET_TYPE_THREE'">
<el-select clearable
placeholder="请选择协会"
style="width: 100%;" v-model="pageForm.clubId">
<el-option
:key="item.id"
:label="item.clubName"
:value="item.id"
v-for="item in clubOption">
</el-option>
</el-select>
</search-item>
</search>
</el-card>
<el-card class="mt10" shadow="never">
<table-tool label="综合查询">
<el-tag style="font-size: 15px;">
申报预算金额:{{declareTotalBudgetMoney}}元,审核预算金额:{{totalBudgetMoney}}元
</el-tag>
<el-radio-group @change="budgetTypeCodeChange" size="small"
style="margin-left: 10px;"
v-model="pageForm.outlayManageSource">
<el-radio-button :label="item.code"
:key="item.code" v-for="item in budgetTypeOption">
{{item.name}}
</el-radio-button>
</el-radio-group>
</table-tool>
<el-table :data="tableData" @sort-change="pageOrder" row-key="id"
style="width: 100%"
ref="table"
v-loading="tableLoading">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号"
fixed
type="index"
width="80px"></el-table-column>
<el-table-column
:label="column.label"
:prop="column.prop"
:key="column.prop"
:width="column.width"
:fixed="column.fixed"
show-overflow-tooltip
:sortable="column.sortable"
align="center"
header-align="center"
v-for="column in tableColumns">
<template v-slot="{row}" v-if="column.prop==='outlayManageSource'">
<dict-tag :options="budgetTypeOption"
:value="row.outlayManageSource"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop==='budgetReimburseType'">
<dict-tag :options="dict.type.ACTIVITY_BUDGET_REIMBURSE_TYPE"
:value="row.budgetReimburseType"></dict-tag>
</template>
<template v-slot="{row}" v-else-if="column.prop==='note'">
<span v-if="row.schoolBudgetId">费用使用校工会中的:{{row.activityMatterTwo}}</span>
</template>
</el-table-column>
<el-table-column align="center" fixed="right" header-align="center" label="操作"
width="200">
<template slot-scope="{row}">
<el-button @click="openView(row)" size="mini" type="primary">
查看
</el-button>
<el-button @click="openEdit(row)" size="mini" type="primary"
:disabled="!['superadmin'].includes($store.state.user.loginname)">
编辑
</el-button>
<!-- <el-button @click="doDelete(row.id)" size="mini" type="danger"
:disabled="!['superadmin'].includes($store.state.user.loginname)">
删除
</el-button>-->
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
</template>
<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="totalBudgetMoney"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<el-input-number :min="0" :precision="2"
placeholder="请输入预算金额"
style="width: 100%"
v-model="formData.totalBudgetMoney"></el-input-number>
</el-form-item>
<el-form-item label="审批意见" prop="auditOpinion"
:rules="[{required:true,message:'必填',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.auditOpinion"></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="doSubmit" size="small" type="primary">提交</el-button>
</el-row>
</div>
</activity-budget-info>
</template>
</guava>
</div>
<script>
<!--#include('../info.js'){}#-->
const vue = new Vue({
el: '#app',
store,
mixins: [initTableMixins],
dicts: ["ACTIVITY_BUDGET_REIMBURSE_TYPE"],
data() {
return {
declareTotalBudgetMoney: 0,
totalBudgetMoney: 0,
budgetTypeOption: [],
clubOption: [],
unionList: [],
pageForm: {
year: new Date().getFullYear() + "",
outlayManageSource: "",
budgetReimburseType: "",
unionId: "",
clubId: "",
},
tableColumns: [
{prop: 'year', label: '年度', width: '80', fixed: "left"},
{prop: 'userName', label: '申报人姓名', fixed: "left"},
{prop: 'loginName', label: '申报人工号', fixed: "left"},
{prop: 'mobile', label: '联系方式', width: '120'},
{prop: 'outlayManageSource', label: '申报类型'},
{prop: 'budgetReimburseType', label: '预算条目'},
{prop: 'helpUnitName', label: '申报单位'},
{prop: 'activityMatter', label: '活动项目', width: '300'},
{prop: 'declareTotalBudgetMoney', label: '申报预算金额'},
{prop: 'totalBudgetMoney', label: '审核预算金额'},
{prop: 'note', label: '备注'},
{prop: 'applyDate', label: '申报时间', width: '120'},
],
showApprovalForm: false
}
},
components: {
"activity-budget-info": ACTIVITY_BUDGET_INFO
},
methods: {
doSubmit() {
this.$refs.formRef.validate((valid) => {
if (valid) {
this.$confirm('确认提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(() => {
this.$axios.post(loc() + "/doSubmit", this.formData).then(resp => {
if (resp.code === 0) {
this.$message({
type: 'success',
message: '提交成功!'
})
this.doSearch()
this.$refs.guava.index()
}
})
})
}
})
},
openEdit(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = true
this.formData = {
id: row.id,
totalBudgetMoney: row.totalBudgetMoney,
}
this.$refs.activityBudgetInfo.onOpen(row)
})
},
budgetTypeCodeChange() {
this.$set(this.pageForm, "unionId", '')
this.$set(this.pageForm, "clubId", '')
this.doSearch()
this.getApplyMoney()
},
openView(row) {
this.$refs.guava.edit(() => {
this.showApprovalForm = false
this.$refs.activityBudgetInfo.onOpen(row)
})
},
getApplyMoney() {
this.$axios.post("/platform/activity/budget/applyStatistics/getApplyMoney", this.pageForm).then(resp => {
if (resp.code === 0) {
this.declareTotalBudgetMoney = resp.data.declareTotalBudgetMoney
this.totalBudgetMoney = resp.data.totalBudgetMoney
} else {
this.$message.error(resp.message)
}
})
}
},
async created() {
this.budgetTypeOption = await this.$businessTool.getDictOptions("ACTIVITY_BUDGET_TYPE")
this.budgetTypeOption.unshift({name: "全部类型", code: ""})
this.clubOption = await this.$businessTool.listCLubByRole()
this.unionList = await this.$businessTool.listUnion()
this.getApplyMoney()
this.pageData()
}
})
</script>
<!--#
}
#-->
@@ -9,11 +9,19 @@ layout("/layouts/platform.html"){
<el-descriptions :column="2" border> <el-descriptions :column="2" border>
<el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item> <el-descriptions-item label="申报人姓名">{{formData.userName}}</el-descriptions-item>
<el-descriptions-item label="申报时间">{{formData.applyDate}}</el-descriptions-item> <el-descriptions-item label="申报时间">{{formData.applyDate}}</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-descriptions-item label="联系方式">
<el-form-item label="联系方式" prop="mobile"> <el-form-item label="联系方式" prop="mobile">
<el-input placeholder="请输入联系方式" v-model="formData.mobile"></el-input> <el-input placeholder="请输入联系方式" v-model="formData.mobile"></el-input>
</el-form-item> </el-form-item>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="预算类型"> <el-descriptions-item label="预算类型">
<el-form-item label="预算类型" prop="outlayManageSource"> <el-form-item label="预算类型" prop="outlayManageSource">
<el-select @change="budgetTypeCodeChange" <el-select @change="budgetTypeCodeChange"
@@ -63,13 +71,7 @@ layout("/layouts/platform.html"){
</el-form-item> </el-form-item>
</el-descriptions-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-descriptions-item label="活动时间">
<el-form-item <el-form-item
prop="activityDate" label="活动时间"> prop="activityDate" label="活动时间">
@@ -178,6 +180,8 @@ layout("/layouts/platform.html"){
clubId: [{required: true, message: '必填', trigger: ['blur', 'change']}], clubId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
helpUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}], helpUnitName: [{required: true, message: '必填', trigger: ['blur', 'change']}],
unionId: [{required: true, message: '必填', trigger: ['blur', 'change']}], unionId: [{required: true, message: '必填', trigger: ['blur', 'change']}],
mobile: [{required: true, message: '必填', trigger: ['blur', 'change']}],
activityDate: [{required: true, message: '必填', trigger: ['blur', 'change']}],
}, },
formData: { formData: {
budgetDetails: [] budgetDetails: []
@@ -270,9 +274,10 @@ layout("/layouts/platform.html"){
}) })
} }
this.budgetTypeOption = budgetTypeOption this.budgetTypeOption = budgetTypeOption
if (this.budgetTypeOption.length === 1){
this.$set(this.formData, "outlayManageSource", this.budgetTypeOption[0].code)
}
} }
}, },
getSchoolBudget() { getSchoolBudget() {
this.$axios.post("/platform/activity/budget/apply/getSchoolBudget").then((res) => { this.$axios.post("/platform/activity/budget/apply/getSchoolBudget").then((res) => {
@@ -68,6 +68,35 @@ const ACTIVITY_BUDGET_INFO = {
</div> </div>
</template> </template>
<template v-if="viewData.allocationEditAuditList&&viewData.allocationEditAuditList.length>0">
<div class="task-panel mt10">
<div class="task-panel-header">管理员修改预算</div>
<div v-for="(item,index) in viewData.allocationEditAuditList" :key="index">
<el-descriptions :column="2" border class="table_fixed">
<el-descriptions-item label="审核人">
{{ item.username }}({{ item.loginname }})
</el-descriptions-item>
<el-descriptions-item label="审核时间">
{{ item.auditTime }}
</el-descriptions-item>
<el-descriptions-item label="编辑前金额">
{{ item.ext.money }}
</el-descriptions-item>
<!-- <el-descriptions-item label="编辑前活动项目名称">
{{ item.ext.activityMatter }}
</el-descriptions-item>-->
<el-descriptions-item></el-descriptions-item>
<el-descriptions-item label="审核意见" span="2">
{{ item.auditOpinion }}
</el-descriptions-item>
<!-- <el-descriptions-item label="审核附件" span="2">
<file-upload :files.sync="item.ext.files" view></file-upload>
</el-descriptions-item>-->
</el-descriptions>
</div>
</div>
</template>
<slot></slot> <slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart> <snaker-chart ref="snakerChartRef"></snaker-chart>