Author SHA1 Message Date
c-chenxs1 0cd4f52b30 fix: 修复文化活动表单交互并统一流程图布局
- 修复活动列表插槽渲染异常及字段回显问题
- 修复选择联系人时的报错和手机号回填逻辑
- 暂时注释报名表单及设计入口
- 统一社团、分工会文化活动新建和编辑页的流程图布局
- 隐藏社团文化活动进入审核后的编辑入口
2026-11-02 11:15:47 +08:00
c-chenxs1 365c812c6c fix: 完善年度考核签字展示及文化活动编辑与权限处理
- 补充年度考核审核记录的签字结果展示,兼容历史记录
- 修复文化活动编辑时联系人为空导致加载中断的问题
- 修复活动列表异步组件挂载时的节点查询异常
- 修正全局 jQuery 请求回调的错误提示
- 增加人员范围设置及人员调整的入口权限校验
- 修复设置活动人员失败后错误未提示、持续加载的问题
2026-11-02 10:52:00 +08:00
c-chenxs1 12448bee0d feat: 困难帮扶优化3 2026-10-31 18:42:11 +08:00
c-chenxs1 81a1432702 feat: 困难帮扶优化2 标签 2026-10-31 18:30:38 +08:00
15 changed files with 177 additions and 174 deletions
@@ -44,7 +44,7 @@ public class DifficultHelpApprovalController {
ProcessTask task = dao.fetch(ProcessTask.class, args.getLong(FlowConst.PROCESS_TASK_ID_KEY)); ProcessTask task = dao.fetch(ProcessTask.class, args.getLong(FlowConst.PROCESS_TASK_ID_KEY));
if (task == null) throw new BaseException("审批任务不存在"); if (task == null) throw new BaseException("审批任务不存在");
boolean actualAmountApproval = "e405f96c-5fc0-4f63-b323-e69dfe853253".equals(task.getTaskName()); boolean actualAmountApproval = "e405f96c-5fc0-4f63-b323-e69dfe853253".equals(task.getTaskName());
boolean amountApproval = "715ece82-4ae3-433c-ad18-ed875f45d1e3".equals(task.getTaskName()) || actualAmountApproval; boolean amountApproval = "715ece82-4ae3-433c-ad18-ed875f45d1e3".equals(task.getTaskName());
if (!amountApproval && !"36ebafda-44c2-4bd3-bd7f-10839a575a0d".equals(task.getTaskName()) if (!amountApproval && !"36ebafda-44c2-4bd3-bd7f-10839a575a0d".equals(task.getTaskName())
&& !"e405f96c-5fc0-4f63-b323-e69dfe853253".equals(task.getTaskName())) { && !"e405f96c-5fc0-4f63-b323-e69dfe853253".equals(task.getTaskName())) {
throw new BaseException("当前任务不是困难帮扶审批任务"); throw new BaseException("当前任务不是困难帮扶审批任务");
@@ -61,16 +61,16 @@ public class DifficultHelpApprovalController {
Double money = amountApproval ? args.getDouble("money") : null; Double money = amountApproval ? args.getDouble("money") : null;
if (amountApproval) { if (amountApproval) {
if (money == null || !Double.isFinite(money) || money < 0) { if (money == null || !Double.isFinite(money) || money < 0) {
throw new BaseException(actualAmountApproval ? "请填写有效的实际审批金额" : "请填写有效的帮扶金额"); throw new BaseException("请填写有效的帮扶金额");
}
if (actualAmountApproval && java.math.BigDecimal.valueOf(money).stripTrailingZeros().scale() > 2) {
throw new BaseException("实际审批金额最多保留两位小数");
} }
args.put("tf_money", money); args.put("tf_money", money);
if (actualAmountApproval) args.put("tf_actualMoney", money);
} else { } else {
args.remove("money"); args.remove("money");
args.remove("tf_money"); args.remove("tf_money");
if (actualAmountApproval && info.getMoney() != null) {
args.put("tf_money", info.getMoney());
args.put("tf_actualMoney", info.getMoney());
}
} }
// 参与者权限由流程引擎校验,业务入口不接受客户端指定管理员代办。 // 参与者权限由流程引擎校验,业务入口不接受客户端指定管理员代办。
args.remove(FlowConst.EXT_ENABLE_OPERATOR); args.remove(FlowConst.EXT_ENABLE_OPERATOR);
@@ -9,7 +9,6 @@ import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.date.DateUtil; import cn.hutool.core.date.DateUtil;
import cn.hutool.core.io.FileUtil; import cn.hutool.core.io.FileUtil;
import cn.hutool.core.util.StrUtil; import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.alibaba.excel.EasyExcel; import com.alibaba.excel.EasyExcel;
import com.budwk.app.base.constant.RoleConstant; import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination; import com.budwk.app.base.page.Pagination;
@@ -281,42 +280,14 @@ public class DifficultHelpReadingController {
for (int i = 0; i < list.size(); i++) { for (int i = 0; i < list.size(); i++) {
NutMap record = list.get(i); NutMap record = list.get(i);
HashMap<String, Object> docData = new HashMap<>(); DifficultHelpInfo difficultHelp = difficultHelpCommonService.fetch(record.getString("id"));
docData.put("unionName", record.getString("unitName")); if (difficultHelp == null) {
docData.put("proxyUserName", record.getString("proxyUserName")); throw new IllegalStateException("待导出的申请记录不存在:" + record.getString("id"));
docData.put("sex", record.getString("sex"));
docData.put("loginName", record.getString("loginName"));
docData.put("unitName", record.getString("unitName"));
docData.put("homeIncome", record.getDouble("homeIncome"));
docData.put("homeNumber", record.getInt("homeNumber"));
docData.put("position", record.getString("position"));
docData.put("officialCapacity", record.getString("officialCapacity"));
docData.put("mobile", record.getString("mobile"));
docData.put("userName", record.getString("userName"));
docData.put("homeAddress", record.getString("homeAddress"));
docData.put("bankOfDeposit", record.getString("bankOfDeposit"));
docData.put("bankCardNum", record.getString("bankCardNum"));
docData.put("reason", record.getString("reason"));
docData.put("applyTime", DateUtil.format(DateUtil.parse(record.getString("applyTime")), "yyyy年MM月dd日"));
docData.put("schoolname", "中国地质大学(武汉)");
docData.put("year", DateUtil.format(DateUtil.parse(record.getString("applyTime")), "yyyy"));
String familyListStr = record.getString("familyList");
if (StrUtil.isNotBlank(familyListStr)) {
docData.put("familyList", JSONUtil.toList(familyListStr, Object.class));
} else {
docData.put("familyList", new ArrayList<>());
} }
byte[] bytes = renderApplyDocument(difficultHelp, false);
String fileName = (i + 1) + record.getString("userName") + "申请表.docx"; String fileName = (i + 1) + difficultHelp.getUserName() + "申请表.docx";
zipOutputStream.putNextEntry(new ZipEntry(fileName)); zipOutputStream.putNextEntry(new ZipEntry(fileName));
zipOutputStream.write(bytes);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder().bind("familyList", policy).build();
try (InputStream input = sysOfficeTemplateUtil.getTemplate("difficulty_apply")) {
zipOutputStream.write(sysOfficeTemplateUtil.renderTemplate(input, docData, config, false, "difficulthelp:batch:" + record.getString("id")));
}
zipOutputStream.closeEntry(); zipOutputStream.closeEntry();
} }
zipOutputStream.flush(); zipOutputStream.flush();
@@ -353,6 +324,14 @@ public class DifficultHelpReadingController {
throw new RuntimeException("该记录不在当前可查看的范围内,无法导出"); throw new RuntimeException("该记录不在当前可查看的范围内,无法导出");
} }
} }
boolean pdf = Boolean.TRUE.equals(print);
String fileName = FileUtil.mainName(sysOfficeTemplateUtil.getTemplateFileName("difficulty_apply")) + "_" + difficultHelp.getUserName() + "_" +
DateUtil.format(difficultHelp.getApplyTime(), "yyyyMMdd") + (pdf ? ".pdf" : ".docx");
byte[] bytes = renderApplyDocument(difficultHelp, pdf);
CommonDownloadUtil.download(fileName, bytes, response);
}
private byte[] renderApplyDocument(DifficultHelpInfo difficultHelp, boolean pdf) throws Exception {
HashMap<String, Object> docData = new HashMap<>(); HashMap<String, Object> docData = new HashMap<>();
docData.put("unionName", difficultHelp.getUnitName()); docData.put("unionName", difficultHelp.getUnitName());
@@ -385,10 +364,8 @@ public class DifficultHelpReadingController {
docData.put("applyMoney", difficultHelp.getApplyMoney()); docData.put("applyMoney", difficultHelp.getApplyMoney());
docData.put("money", difficultHelp.getMoney()); docData.put("money", difficultHelp.getMoney());
fillApplyApprovals(docData, difficultHelp.getId()); fillApplyApprovals(docData, difficultHelp.getId());
if (print) { try (InputStream input = getApplyTemplate(templateName)) {
exportAsPDF(templateName, docData, config, difficultHelp, response); return sysOfficeTemplateUtil.renderTemplate(input, docData, config, pdf, "difficulthelp:" + difficultHelp.getId());
} else {
exportAsWord(templateName, docData, config, difficultHelp,response);
} }
} }
@@ -465,30 +442,6 @@ public class DifficultHelpReadingController {
return new ByteArrayInputStream(templateBytes); return new ByteArrayInputStream(templateBytes);
} }
@At
private void exportAsPDF(String templateName, HashMap<String, Object> docData,Configure config,
DifficultHelpInfo difficultHelp, HttpServletResponse response) throws Exception {
String fileName = FileUtil.mainName(sysOfficeTemplateUtil.getTemplateFileName(templateName)) + "_" + difficultHelp.getUserName() + "_" +
DateUtil.format(difficultHelp.getApplyTime(), "yyyyMMdd") + ".pdf";
try (InputStream input = getApplyTemplate(templateName)) {
byte[] bytes = sysOfficeTemplateUtil.renderTemplate(input, docData, config, true, "difficulthelp:" + difficultHelp.getId());
CommonDownloadUtil.download(fileName, bytes, response);
}
}
@At
private void exportAsWord(String templateName, HashMap<String, Object> docData,Configure config,
DifficultHelpInfo difficultHelp, HttpServletResponse response) throws Exception {
String fileName = FileUtil.mainName(sysOfficeTemplateUtil.getTemplateFileName(templateName)) + "_" + difficultHelp.getUserName() + "_" +
DateUtil.format(difficultHelp.getApplyTime(), "yyyyMMdd") + ".docx";
try (InputStream input = getApplyTemplate(templateName)) {
byte[] bytes = sysOfficeTemplateUtil.renderTemplate(input, docData, config, false, "difficulthelp:" + difficultHelp.getId());
CommonDownloadUtil.download(fileName, bytes, response);
}
}
@At @At
@Ok("void") @Ok("void")
@SaCheckPermission("difficultHelp.reading") @SaCheckPermission("difficultHelp.reading")
@@ -83,6 +83,7 @@ public class DifficultHelpThirdApprovalController {
LEFT(info.applyTime, 10) AS applyTime, LEFT(info.applyTime, 10) AS applyTime,
info.applyCount, info.applyCount,
info.applyMoney, info.applyMoney,
info.money,
info.mobile, info.mobile,
ins.id AS instanceId, ins.id AS instanceId,
ins.businessNo, ins.businessNo,
@@ -11,25 +11,25 @@
$.ajaxSetup({ $.ajaxSetup({
contentType: "application/x-www-form-urlencoded;charset=utf-8", contentType: "application/x-www-form-urlencoded;charset=utf-8",
success: function (response, textStatus, jqXHR) { success: function (response, textStatus, jqXHR) {
if (response.code !== 0) { if (response && typeof response === "object" && response.code !== undefined && response.code !== 0) {
this.$message.error(response.msg) Vue.prototype.$message.error(response.msg)
} else { } else {
return response return response
} }
}, },
error: function (v1) { error: function (v1) {
this.$message.error(v1.status + " " + v1.statusText) Vue.prototype.$message.error(v1.status + " " + v1.statusText)
}, },
complete: function (XMLHttpRequest, textStatus) { complete: function (XMLHttpRequest, textStatus) {
var sessionstatus = XMLHttpRequest.getResponseHeader("loginStatus") //通过XMLHttpRequest取得响应头,sessionstatus, var sessionstatus = XMLHttpRequest.getResponseHeader("loginStatus") //通过XMLHttpRequest取得响应头,sessionstatus,
if (sessionstatus == "accessDenied") { if (sessionstatus == "accessDenied") {
this.$message({ Vue.prototype.$message({
message: "\u767b\u5f55\u5931\u6548\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u91cd\u65b0\u767b\u5f55", message: "\u767b\u5f55\u5931\u6548\uff0c\u8bf7\u5237\u65b0\u9875\u9762\u91cd\u65b0\u767b\u5f55",
type: "error" type: "error"
}) })
} }
if (sessionstatus == "unauthorized") { if (sessionstatus == "unauthorized") {
this.$message({ Vue.prototype.$message({
message: "\u6ca1\u6709\u6743\u9650", message: "\u6ca1\u6709\u6743\u9650",
type: "error" type: "error"
}) })
@@ -4,7 +4,7 @@
<div style="padding: 0px 16px" class="clearfix"> <div style="padding: 0px 16px" class="clearfix">
<el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="userScopeDialog = false">返回</el-button> <el-button icon="el-icon-back" style="font-size: 16px" type="text" @click="userScopeDialog = false">返回</el-button>
</div> </div>
<el-tabs tab-position="top" v-model="activeName" @tab-click="handleClick" style="margin: 20px"> <el-tabs tab-position="top" v-model="activeName" @tab-click="handleClick" :before-leave="beforeTabLeave" style="margin: 20px">
<el-tab-pane label="人员设置" name="1"> <el-tab-pane label="人员设置" name="1">
<template> <template>
<user-scope ref="userScope" @group_change="group_change" :group_id.sync="groupId"></user-scope> <user-scope ref="userScope" @group_change="group_change" :group_id.sync="groupId"></user-scope>
@@ -12,7 +12,7 @@
</el-tab-pane> </el-tab-pane>
<el-tab-pane label="人员调整" name="2"> <el-tab-pane label="人员调整" name="2">
<user-data-scope @group_change="group_change" ref="userDataScope"></user-data-scope> <user-data-scope v-if="activeName === '2'" @group_change="group_change" ref="userDataScope"></user-data-scope>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-drawer> </el-drawer>
@@ -32,9 +32,19 @@ module.exports = {
} }
}, },
methods: { methods: {
beforeTabLeave(name) {
const permission = name === "2" ? "activity.basic.user" : "activity.basic.scope"
if (!this.$auth.hasRole("SYSADMIN") && !this.$auth.hasPermission(permission)) {
this.$message.error("无此权限:" + permission)
return false
}
return true
},
handleClick() { handleClick() {
if (this.activeName === "2") { if (this.activeName === "2") {
this.$refs.userDataScope.getActivityGroup() if (this.$refs.userDataScope) {
this.$refs.userDataScope.getActivityGroup()
}
} else { } else {
this.$refs.userScope.getActivityGroup() this.$refs.userScope.getActivityGroup()
} }
@@ -680,6 +680,10 @@ module.exports = {
} }
}, },
doSetActivityUser() { doSetActivityUser() {
if (!this.$auth.hasRole("SYSADMIN") && !this.$auth.hasPermission("activity.basic.scope")) {
this.$message.error("无此权限:activity.basic.scope")
return
}
// 方法级状态保护与整页遮罩共同阻止慢请求期间的重复确认。 // 方法级状态保护与整页遮罩共同阻止慢请求期间的重复确认。
if (this.settingLoading) { if (this.settingLoading) {
return return
@@ -711,11 +715,15 @@ module.exports = {
spinner: "el-icon-loading", spinner: "el-icon-loading",
background: "rgba(255, 255, 255, 0.65)" background: "rgba(255, 255, 255, 0.65)"
}) })
const pageForm = this.normalizePageForm(this.pageForm) Promise.resolve().then(() => {
Object.assign(pageForm, this.formData) const pageForm = this.normalizePageForm(this.pageForm)
Object.assign(pageForm, this.formData)
$.post("/platform/activity/basic/scope/doSetActivityUser", { return $.ajax({
data: JSON.stringify(pageForm) url: "/platform/activity/basic/scope/doSetActivityUser",
type: "POST",
data: { data: JSON.stringify(pageForm) },
success: () => {}
})
}).then((resp) => { }).then((resp) => {
if (resp.code !== 0) { if (resp.code !== 0) {
// 将后端业务错误转入统一失败分支,直接展示接口返回的真实原因。 // 将后端业务错误转入统一失败分支,直接展示接口返回的真实原因。
@@ -741,7 +749,7 @@ module.exports = {
? error.message ? error.message
: "设置活动人员失败" : "设置活动人员失败"
this.$message.error(errorMessage) this.$message.error(errorMessage)
}).always(() => { }).finally(() => {
this.settingLoading = false this.settingLoading = false
loading.close() loading.close()
}) })
@@ -3,8 +3,12 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
<div> <div>
<template> <template>
<el-card shadow="never"> <el-card shadow="never">
<snaker-start slot="header" label="文化活动申报" define_key="WHHD" <div slot="header" v-if="activity_type===40002||activity_type===40003"
v-if="activity_type===40002||activity_type===40003"></snaker-start> style="display: flex; align-items: center; justify-content: space-between; width: 100%">
<h3 style="color: var(--color-primary); margin: 0">文化活动申报</h3>
<el-link type="primary" @click="$refs.activityChartRef.onOpen('WHHD')">流程图</el-link>
</div>
<snaker-chart v-if="activity_type===40002||activity_type===40003" ref="activityChartRef"></snaker-chart>
<el-form :model="formData" :rules="formRules" label-suffix=":" label-width="170px" <el-form :model="formData" :rules="formRules" label-suffix=":" label-width="170px"
ref="addForm" v-loading="formLoading"> ref="addForm" v-loading="formLoading">
<el-tabs tab-position="top" v-model="activeName"> <el-tabs tab-position="top" v-model="activeName">
@@ -171,7 +175,7 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
</div> </div>
<div> <div>
<el-button <el-button
@click="$refs.drawerUserScope.userScopeDialog = true" @click="openUserScope"
type="primary">设置 type="primary">设置
</el-button> </el-button>
</div> </div>
@@ -370,12 +374,14 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
</el-form-item> </el-form-item>
</el-col> </el-col>
<!--
<el-col :span="24"> <el-col :span="24">
<el-form-item label="报名表单" prop="formConfig" <el-form-item label="报名表单" prop="formConfig"
v-if="formData.isEnrollSystem&&formData.signUpMethod===1"> v-if="formData.isEnrollSystem&&formData.signUpMethod===1">
<custom-form-field v-model="formData.formConfig"></custom-form-field> <custom-form-field v-model="formData.formConfig"></custom-form-field>
</el-form-item> </el-form-item>
</el-col> </el-col>
-->
<el-col :span="24" v-if="formData.signUpMethod!=null&&formData.isEnrollSystem"> <el-col :span="24" v-if="formData.signUpMethod!=null&&formData.isEnrollSystem">
<el-form-item label="封面图" prop="cover"> <el-form-item label="封面图" prop="cover">
@@ -977,13 +983,20 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
this.$set(this.formData, "time", val) this.$set(this.formData, "time", val)
}, },
userChang(id) { userChang(id) {
const userList = this.$refs.userData.options const user = (this.userList || []).find((v) => v.userId === id)
this.$set(this.formData, "mobile", id ? userList.find((v) => v.id === id).mobile : null) this.$set(this.formData, "mobile", id && user ? user.mobile : null)
}, },
async getActivityTwoLevelType(code) { async getActivityTwoLevelType(code) {
const {data} = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", {code: code}) const {data} = await this.$axios.post("/platform/activity/basic/settings/getActivityTwoLevelType", {code: code})
return data return data
}, },
openUserScope() {
if (!this.$auth.hasRole("SYSADMIN") && !this.$auth.hasPermission("activity.basic.scope")) {
this.$message.error("无此权限:activity.basic.scope")
return
}
this.$refs.drawerUserScope.userScopeDialog = true
},
async getActivityGroup() { async getActivityGroup() {
const {data} = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup") const {data} = await this.$axios.post("/platform/activity/basic/scope/getActivityUserScopeGroup")
this.activityGroupList = data this.activityGroupList = data
@@ -1048,9 +1061,16 @@ const ACTIVITY_CULTURE_APPLY_ACTIVITY = {
async findOne(id) { async findOne(id) {
const {data, code, msg} = await this.$axios.post("/platform/activity/culture/infoManage/findOne", {id}) const {data, code, msg} = await this.$axios.post("/platform/activity/culture/infoManage/findOne", {id})
if (code === 0) { if (code === 0) {
this.userList = []
if (data.userId) { if (data.userId) {
const user = await this.queryUserByIds([data.userId]) let loginName = data.loginname
await this.remoteMethod(user[0].loginname) if (!loginName) {
const users = await this.queryUserByIds([data.userId])
loginName = users && users.length > 0 ? users[0].loginname : null
}
if (loginName) {
await this.remoteMethod(loginName)
}
} }
if (data.goods) data.goods = JSON.parse(data.goods) if (data.goods) data.goods = JSON.parse(data.goods)
if (data.billFiles && data.billFiles.length > 0) data.billFiles = JSON.parse(data.billFiles) if (data.billFiles && data.billFiles.length > 0) data.billFiles = JSON.parse(data.billFiles)
@@ -3,7 +3,7 @@
const ACTIVITY_CULTURE_INFO_MANAGE = { const ACTIVITY_CULTURE_INFO_MANAGE = {
template: /*language=HTML*/` template: /*language=HTML*/`
<guava ref="guava"> <guava ref="guava" @hook:mounted="initTableResize">
<template> <template>
<div class="culture-info-manage-layout"> <div class="culture-info-manage-layout">
<el-card class="culture-info-query-card" shadow="never"> <el-card class="culture-info-query-card" shadow="never">
@@ -55,43 +55,47 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
show-overflow-tooltip show-overflow-tooltip
v-for="column in tableColumns"> v-for="column in tableColumns">
<template scope="{row}" v-if="column.prop=='time2'"> <template slot-scope="{row}">
{{row.applyStartTime}}-{{row.applyEndTime}} <template v-if="column.prop=='time2'">
</template> {{row.applyStartTime}}-{{row.applyEndTime}}
</template>
<template scope="{row}" v-else-if="column.prop=='projectTypeName'"> <template v-else-if="column.prop=='projectTypeName'">
{{row.projectTypeName}}({{row.projectTypeCode}}) {{row.projectTypeName}}({{row.projectTypeCode}})
</template> </template>
<template scope="{row}" v-else-if="column.prop=='tussueName'"> <template v-else-if="column.prop=='tussueName'">
<span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span> <span v-if="row.activity_type==40002">{{row.unionname?row.unionname:'暂无'}}</span>
<span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span> <span v-if="row.activity_type==40003">{{row.clubName?row.clubName:'暂无'}}</span>
<span v-if="row.activity_type==40001">校工会</span> <span v-if="row.activity_type==40001">校工会</span>
</template> </template>
<template scope="{row}" v-else-if="column.prop=='isUnseal'"> <template v-else-if="column.prop=='isUnseal'">
<el-switch <el-switch
@change="(val)=>{activityStatusChange(row.id,row.isUnseal)}" @change="(val)=>{activityStatusChange(row.id,row.isUnseal)}"
active-color="#13ce66" active-color="#13ce66"
:disabled="isUnsealDisabled(row)" :disabled="isUnsealDisabled(row)"
inactive-color="#ff4949" inactive-color="#ff4949"
v-model="row.isUnseal"> v-model="row.isUnseal">
</el-switch> </el-switch>
</template> </template>
<template scope="{row}" v-else-if="column.prop=='taskName'"> <template v-else-if="column.prop=='taskName'">
<span v-if="row.activity_type==40002 || row.activity_type==40003"> <span v-if="row.activity_type==40002 || row.activity_type==40003">
{{row.taskName}} {{row.taskName}}
</span> </span>
<span v-else>-</span> <span v-else>-</span>
</template> </template>
<template scope="{row}" v-else-if="column.prop=='instanceState'"> <template v-else-if="column.prop=='instanceState'">
<span v-if="row.activity_type==40002 || row.activity_type==40003"> <span v-if="row.activity_type==40002 || row.activity_type==40003">
<enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message" <enum-tag :value="row.instanceState" name="ProcessInstanceStateEnum" label_key="message"
size="small"></enum-tag> size="small"></enum-tag>
</span> </span>
<span v-else>-</span> <span v-else>-</span>
</template>
<template v-else>{{ row[column.prop] }}</template>
</template> </template>
</el-table-column> </el-table-column>
@@ -110,7 +114,7 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item :command="{type:'edit',row}" <el-dropdown-item :command="{type:'edit',row}"
> v-if="activity_type !== 40003 || !row.instanceId || row.taskKey === 'startTask'">
编辑 编辑
</el-dropdown-item> </el-dropdown-item>
<el-dropdown-item u <el-dropdown-item u
@@ -214,6 +218,19 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
"activity-culture-info-activity": ACTIVITY_CULTURE_INFO_ACTIVITY "activity-culture-info-activity": ACTIVITY_CULTURE_INFO_ACTIVITY
}, },
methods: { methods: {
initTableResize() {
if (!this.isTemplateManagedActivity) {
return
}
const listCardBody = this.$refs.guava.$el.querySelector(".culture-info-list-card > .el-card__body")
if (listCardBody && window.ResizeObserver) {
// 查询区换行、页签权限或窗口变化时同步调整表格内部滚动区域。
this.tableResizeObserver = new ResizeObserver(this.updateTableHeight)
this.tableResizeObserver.observe(listCardBody)
}
this.updateTableHeight()
window.addEventListener("resize", this.updateTableHeight)
},
activityStatusChange(id, isUnseal) { activityStatusChange(id, isUnseal) {
this.$axios.post("/platform/activity/culture/infoManage/activityStatusChange", { this.$axios.post("/platform/activity/culture/infoManage/activityStatusChange", {
id: id, id: id,
@@ -264,7 +281,11 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
return return
} }
this.$nextTick(() => { this.$nextTick(() => {
const cardBody = this.$el.querySelector(".culture-info-list-card > .el-card__body") const root = this.$refs.guava && this.$refs.guava.$el
if (!root || typeof root.querySelector !== "function") {
return
}
const cardBody = root.querySelector(".culture-info-list-card > .el-card__body")
if (!cardBody || cardBody.clientHeight <= 0) { if (!cardBody || cardBody.clientHeight <= 0) {
return return
} }
@@ -408,19 +429,6 @@ const ACTIVITY_CULTURE_INFO_MANAGE = {
} }
this.pageData() this.pageData()
}, },
mounted() {
if (!this.isTemplateManagedActivity) {
return
}
const listCardBody = this.$el.querySelector(".culture-info-list-card > .el-card__body")
if (listCardBody && window.ResizeObserver) {
// 查询区换行、页签权限或窗口变化时同步调整表格内部滚动区域。
this.tableResizeObserver = new ResizeObserver(this.updateTableHeight)
this.tableResizeObserver.observe(listCardBody)
}
this.updateTableHeight()
window.addEventListener("resize", this.updateTableHeight)
},
beforeDestroy() { beforeDestroy() {
if (this.tableResizeObserver) { if (this.tableResizeObserver) {
this.tableResizeObserver.disconnect() this.tableResizeObserver.disconnect()
@@ -113,6 +113,9 @@
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" <dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE"
:value="task.ext.submitType"></dict-tag> :value="task.ext.submitType"></dict-tag>
</el-descriptions-item> </el-descriptions-item>
<el-descriptions-item label="审批签字" :span="3" v-if="task.taskFormData && (task.taskFormData.userSign || task.taskFormData.tf_userSign)">
<el-image :src="task.taskFormData.userSign || task.taskFormData.tf_userSign" style="height: 80px" fit="contain"></el-image>
</el-descriptions-item>
<el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{ <el-descriptions-item label="办理意见" v-if="!task.ext.isFirstTaskNode">{{
getTaskFormValue(task, "opinion", "tf_opinion") }} getTaskFormValue(task, "opinion", "tf_opinion") }}
</el-descriptions-item> </el-descriptions-item>
@@ -126,6 +129,9 @@
<el-descriptions-item label="办理用户">{{ record.userName }}({{ record.loginName }})</el-descriptions-item> <el-descriptions-item label="办理用户">{{ record.userName }}({{ record.loginName }})</el-descriptions-item>
<el-descriptions-item label="办理时间">{{ record.auditTime }}</el-descriptions-item> <el-descriptions-item label="办理时间">{{ record.auditTime }}</el-descriptions-item>
<el-descriptions-item label="办理结果">{{ getLegacyAuditResult(record) }}</el-descriptions-item> <el-descriptions-item label="办理结果">{{ getLegacyAuditResult(record) }}</el-descriptions-item>
<el-descriptions-item label="审批签字" :span="3" v-if="record.auditSign">
<el-image :src="record.auditSign" style="height: 80px" fit="contain"></el-image>
</el-descriptions-item>
<el-descriptions-item label="办理意见" span="3">{{ record.auditOpinion }}</el-descriptions-item> <el-descriptions-item label="办理意见" span="3">{{ record.auditOpinion }}</el-descriptions-item>
</el-descriptions> </el-descriptions>
</div> </div>
@@ -1,7 +1,7 @@
<div id="difficult_help_school_union_approval_form"> <div id="difficult_help_school_union_approval_form">
<el-form :model="formData" ref="formRef" label-width="100px" label-suffix=":"> <el-form :model="formData" ref="formRef" label-width="100px" label-suffix=":">
<el-form-item label="实际审批金额(元)" prop="money" :rules="[{required:true,type:'number',min:0,message:'请填写不小于零的实际审批金额',trigger:['change','blur']}]"> <el-form-item label="实际审批金额(元)">
<el-input-number v-model="formData.money" :precision="2" :min="0" placeholder="请输入实际审批金额"></el-input-number> <span>{{ formData.money != null ? formData.money : '--' }}</span>
</el-form-item> </el-form-item>
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]"> <el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
@@ -18,13 +18,20 @@
el: "#difficult_help_school_union_approval_form", el: "#difficult_help_school_union_approval_form",
data() { data() {
return { return {
businessId: GetQueryString("businessId"), businessId: GetQueryString("businessId") || GetQueryString("bizId"),
formData: { formData: {
money: undefined, money: undefined,
tf_sign: "", tf_opinion: "", tf_sign: "", tf_opinion: "",
}, },
} }
}, },
created() {
if (this.businessId) {
this.$axios.post("/platform/difficultHelp/mine/findOne", {id: this.businessId}).then(res => {
if (res.code === 0 && res.data) this.formData.money = res.data.money
})
}
},
methods: { methods: {
async handleTaskAction(val) { async handleTaskAction(val) {
try { try {
@@ -83,8 +83,8 @@ layout("/layouts/platform.html"){
<el-dialog title="设置审核信息" :visible.sync="dialogVisible" width="30%" center> <el-dialog title="设置审核信息" :visible.sync="dialogVisible" width="30%" center>
<el-form :model="formData" ref="formData" label-width="100px"> <el-form :model="formData" ref="formData" label-width="100px">
<el-form-item label="实际审批金额(元)" prop="money" :rules="[{required:true,type:'number',min:0,message:'请填写不小于零的实际审批金额',trigger:['change','blur']}]"> <el-form-item label="实际审批金额(元)">
<el-input-number v-model="formData.money" :precision="2" :min="0" placeholder="请输入实际审批金额"></el-input-number> <span>{{ formData.money != null ? formData.money : '--' }}</span>
</el-form-item> </el-form-item>
<el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]"> <el-form-item label="审批意见" prop="tf_opinion" :rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]">
<user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea> <user-opinion-textarea v-model="formData.tf_opinion"></user-opinion-textarea>
@@ -106,8 +106,8 @@ layout("/layouts/platform.html"){
{{formData.taskName}} {{formData.taskName}}
</div> </div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="100px" label-suffix=":"> <el-form :model="formData" ref="formRef" :rules="formRules" label-width="100px" label-suffix=":">
<el-form-item label="实际审批金额(元)" prop="money" :rules="[{required:true,type:'number',min:0,message:'请填写不小于零的实际审批金额',trigger:['change','blur']}]"> <el-form-item label="实际审批金额(元)">
<el-input-number v-model="formData.money" :precision="2" :min="0" placeholder="请输入实际审批金额"></el-input-number> <span>{{ formData.money != null ? formData.money : '--' }}</span>
</el-form-item> </el-form-item>
<el-form-item label="审批意见" prop="tf_opinion" <el-form-item label="审批意见" prop="tf_opinion"
:rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]"> :rules="[{required:true,whitespace:true,message:'请填写审批意见',trigger:['change','blur']}]">
@@ -248,7 +248,7 @@ layout("/layouts/platform.html"){
async approveSingleItem(item) { async approveSingleItem(item) {
const res = await this.$axios.post("/platform/difficultHelp/approval/executeTask", { const res = await this.$axios.post("/platform/difficultHelp/approval/executeTask", {
data: JSON.stringify({processTaskId: item.taskId, money: this.formData.money, tf_opinion: this.formData.tf_opinion, tf_sign: this.formData.tf_sign, submitType: 1}) data: JSON.stringify({processTaskId: item.taskId, tf_opinion: this.formData.tf_opinion, tf_sign: this.formData.tf_sign, submitType: 1})
}) })
if (res.code !== 0) throw new Error(res.msg || '审批失败') if (res.code !== 0) throw new Error(res.msg || '审批失败')
}, },
@@ -256,7 +256,7 @@ layout("/layouts/platform.html"){
this.$refs.guava.edit(()=>{ this.$refs.guava.edit(()=>{
this.showApprovalForm = true this.showApprovalForm = true
this.formData = { this.formData = {
money: undefined, money: row.money,
tf_sign: "", tf_sign: "",
processTaskId: row.taskId, processTaskId: row.taskId,
taskName: row.curTaskName, taskName: row.curTaskName,
@@ -127,8 +127,8 @@ layout("/layouts/platform_h5.html"){
show-word-limit show-word-limit
></van-field> ></van-field>
<section class="difficult-help-info-card"> <section class="difficult-help-info-card">
<h2 class="difficult-help-info-card__title">审批签字</h2> <h2 class="difficult-help-info-card__title">审批签字<span class="difficult-help-audit-card__required">*</span></h2>
<van-field name="tf_sign" :value="formData.tf_sign" required :rules="[{required:true,message:'请完成审批签字'}]"> <van-field name="tf_sign" :value="formData.tf_sign" :rules="[{required:true,message:'请完成审批签字'}]">
<template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template> <template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template>
</van-field> </van-field>
</section> </section>
@@ -167,11 +167,11 @@
} }
.difficult-help-info-card .van-cell__title { .difficult-help-info-card .van-cell__title {
width: 112px; width: 102px;
color: #596779; color: #596779;
font-size: 12px; font-size: 12px;
line-height: 24px; line-height: 24px;
flex: 0 0 112px; flex: 0 0 102px;
} }
.difficult-help-info-card .van-cell__value { .difficult-help-info-card .van-cell__value {
@@ -184,16 +184,8 @@
} }
.difficult-help-info-long-cell { .difficult-help-info-long-cell {
display: block; display: flex;
} align-items: flex-start;
.difficult-help-info-long-cell .van-cell__title {
width: auto;
max-width: 100%;
}
.difficult-help-info-long-cell .van-cell__value {
margin-top: 7px;
} }
.difficult-help-info-pre-line { .difficult-help-info-pre-line {
@@ -111,9 +111,7 @@ layout("/layouts/platform_h5.html"){
<info ref="infoRef" page-key="difficult-help-school-union-detail" full-screen> <info ref="infoRef" page-key="difficult-help-school-union-detail" full-screen>
<div v-if="showApprovalForm"> <div v-if="showApprovalForm">
<van-form ref="formRef"> <van-form ref="formRef">
<van-field v-model="formData.money" name="money" label="实际审批金额(元)" type="number" required <van-cell title="实际审批金额(元)">{{ formData.money != null ? formData.money : '--' }}</van-cell>
placeholder="请输入实际审批金额"
:rules="[{validator: value => /^(0|[1-9][0-9]*)(\.[0-9]{1,2})?$/.test(String(value)) && Number.isFinite(Number(value)), message:'请填写不小于零的实际审批金额,最多两位小数'}]"></van-field>
<section class="difficult-help-info-card"> <section class="difficult-help-info-card">
<h2 class="difficult-help-info-card__title"> <h2 class="difficult-help-info-card__title">
@@ -132,8 +130,8 @@ layout("/layouts/platform_h5.html"){
></van-field> ></van-field>
</section> </section>
<section class="difficult-help-info-card"> <section class="difficult-help-info-card">
<h2 class="difficult-help-info-card__title">审批签字</h2> <h2 class="difficult-help-info-card__title">审批签字<span class="difficult-help-audit-card__required">*</span></h2>
<van-field name="tf_sign" :value="formData.tf_sign" required :rules="[{required:true,message:'请完成审批签字'}]"> <van-field name="tf_sign" :value="formData.tf_sign" :rules="[{required:true,message:'请完成审批签字'}]">
<template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template> <template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template>
</van-field> </van-field>
</section> </section>
@@ -238,7 +236,7 @@ layout("/layouts/platform_h5.html"){
onApproval(row) { onApproval(row) {
this.$set(this, "showApprovalForm", true) this.$set(this, "showApprovalForm", true)
this.$set(this, "formData", { this.$set(this, "formData", {
money: undefined, money: row.money,
processTaskId: row.taskId, processTaskId: row.taskId,
taskName: row.curTaskName, taskName: row.curTaskName,
id: row.id, id: row.id,
@@ -143,8 +143,8 @@ layout("/layouts/platform_h5.html"){
></van-field> ></van-field>
</section> </section>
<section class="difficult-help-info-card"> <section class="difficult-help-info-card">
<h2 class="difficult-help-info-card__title">审批签字</h2> <h2 class="difficult-help-info-card__title">审批签字<span class="difficult-help-audit-card__required">*</span></h2>
<van-field name="tf_sign" :value="formData.tf_sign" required :rules="[{required:true,message:'请完成审批签字'}]"> <van-field name="tf_sign" :value="formData.tf_sign" :rules="[{required:true,message:'请完成审批签字'}]">
<template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template> <template #input><h5-signature v-model="formData.tf_sign" :key="formData.processTaskId"></h5-signature></template>
</van-field> </van-field>
</section> </section>