feat: 特殊慰问表单优化

This commit is contained in:
2026-10-30 19:35:39 +08:00
parent e0004e410f
commit efad953710
22 changed files with 196 additions and 117 deletions
@@ -13,7 +13,7 @@ import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.param.SysMsgSummaryPageForm;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
@@ -94,6 +94,7 @@ public class CondolenceReadController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.andEX("info.type", "=", type);
cnd.andEX("YEAR(info.createTime)", "=", year);
cnd.andEX("info.applyUnionId", "=", unionId);
@@ -142,15 +143,15 @@ public class CondolenceReadController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(ProcessInstance::getState, "=", ProcessTaskStateEnum.FINISHED.getCode());
cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.andEX("con.type", "=", type);
cnd.andEX("YEAR(info.createTime)", "=", year);
cnd.andEX("YEAR(con.createTime)", "=", year);
cnd.andEX("con.applyUnionId", "=", unionId);
cnd.andEX("con.applyUnitId", "=", unitId);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("info.helpUserName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("info.helpLoginName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("con.helpUserName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("con.helpLoginName", "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_CHAIRMAN.name())) {
@@ -13,7 +13,7 @@ import com.budwk.app.base.result.Result;
import com.budwk.app.base.utils.CommonDownloadUtil;
import com.budwk.app.base.utils.PageUtil;
import com.budwk.app.flow.entity.ProcessInstance;
import com.budwk.app.flow.enums.ProcessTaskStateEnum;
import com.budwk.app.flow.enums.ProcessInstanceStateEnum;
import com.budwk.app.sys.param.SysMsgSummaryPageForm;
import com.budwk.app.web.commons.auth.utils.AuthUtil;
import com.budwk.app.web.commons.auth.utils.SecurityUtil;
@@ -94,6 +94,7 @@ public class SpecialCondolenceReadController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.andEX("info.type", "=", type);
cnd.andEX("YEAR(info.createTime)", "=", year);
cnd.andEX("info.applyUnionId", "=", unionId);
@@ -142,15 +143,15 @@ public class SpecialCondolenceReadController {
$condition
""");
Cnd cnd = Cnd.NEW();
cnd.and(ProcessInstance::getState, "=", ProcessTaskStateEnum.FINISHED.getCode());
cnd.and("ins.state", "=", ProcessInstanceStateEnum.FINISHED.getCode());
cnd.andEX("con.type", "=", type);
cnd.andEX("YEAR(info.createTime)", "=", year);
cnd.andEX("YEAR(con.createTime)", "=", year);
cnd.andEX("con.applyUnionId", "=", unionId);
cnd.andEX("con.applyUnitId", "=", unitId);
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
SqlExpressionGroup seg = new SqlExpressionGroup();
seg.or("info.helpUserName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("info.helpLoginName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("con.helpUserName", "like", "%" + pageForm.getSearchKeyword() + "%");
seg.or("con.helpLoginName", "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.and(seg);
}
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_CHAIRMAN.name())) {
@@ -160,6 +161,7 @@ public class SpecialCondolenceReadController {
List<NutMap> list = specialcondolenceService.listMap(sql);
List<ExcelExportEntity> exportEntities = new ArrayList<>();
exportEntities.add(new ExcelExportEntity("事项", "subject", 30));
exportEntities.add(new ExcelExportEntity("慰问对象", "helpUserName", 20));
exportEntities.add(new ExcelExportEntity("慰问对象工号", "helpLoginName", 20));
exportEntities.add(new ExcelExportEntity("申请人", "applyUserName", 20));
@@ -30,6 +30,12 @@ public class SpecialCondolence extends BaseModel {
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("事项")
@ColDefine(type = ColType.VARCHAR, width = 200)
private String subject;
@Column
@Comment("申请人ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@@ -14,6 +14,8 @@ public final class SpecialCondolenceRecipients {
private SpecialCondolenceRecipients() {}
public static void prepare(SpecialCondolence info, Dao dao) {
if (info.getSubject() == null || info.getSubject().trim().isEmpty() || info.getSubject().trim().length() > 200) throw new BaseException("请填写200字以内的事项");
info.setSubject(info.getSubject().trim());
List<JSONObject> rows = info.getRecipients();
if (rows == null || rows.isEmpty()) throw new BaseException("请添加慰问对象");
if (rows.size() > 1000) throw new BaseException("每次申请最多1000人");
@@ -2,6 +2,7 @@
-- 表已存在时不执行本文件中的建表语句;本文件不复制数据、不配置角色授权和工作流。
CREATE TABLE `special_condolence` (
`id` varchar(32) NOT NULL COMMENT 'ID',
`subject` varchar(255) DEFAULT NULL COMMENT '事项',
`applyUserId` varchar(32) DEFAULT NULL COMMENT '申请人ID',
`applyUserName` varchar(100) DEFAULT NULL COMMENT '申请人姓名',
`applyLoginName` varchar(120) DEFAULT NULL COMMENT '申请人工号',
@@ -0,0 +1,17 @@
<el-descriptions-item label="慰问类型">
<el-form-item label="慰问类型" prop="type">
<el-select v-model="formData.type" filterable @change="typeChange" style="width:100%" placeholder="请选择慰问类型">
<el-option v-for="t in typeOptions" :key="t.id" :value="t.id" :label="t.name"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问金额">
<el-form-item label="慰问金额" prop="perMoney" :rules="recipientRules.money">
<el-input-number v-model="formData.perMoney" :precision="2" :min="0" :max="10000" :controls="false" style="width:100%" placeholder="每人慰问金额(元)"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问时间">
<el-form-item label="慰问时间" prop="occurTime" :rules="recipientRules.occurTime">
<el-date-picker v-model="formData.occurTime" type="date" value-format="yyyy-MM-dd" style="width:100%" placeholder="请选择慰问时间"></el-date-picker>
</el-form-item>
</el-descriptions-item>
@@ -10,17 +10,18 @@ layout("/layouts/platform.html"){
<snaker-start slot="header" label="特殊慰问" define_key="TSWW"></snaker-start>
<el-form size="small" :model="formData" ref="formRef" :rules="formRules" label-width="0" label-suffix=":"
class="flow-task-form">
<div class="special-condolence-section-title">申请人信息</div>
<el-descriptions :column="2" border size="small">
<el-tabs v-model="activeApplicationTab">
<el-tab-pane label="基础信息" name="form">
<el-descriptions :column="3" border size="small">
<el-descriptions-item label="事项"><el-form-item prop="subject" label="事项"><el-input v-model="formData.subject" maxlength="200" show-word-limit placeholder="请输入特殊慰问事项"></el-input></el-form-item></el-descriptions-item>
<el-descriptions-item label="申请人姓名">{{formData.applyUserName}}</el-descriptions-item>
<el-descriptions-item label="申请人工号">{{formData.applyLoginName}}</el-descriptions-item>
<el-descriptions-item label="申请人单位">{{formData.applyUnitName}}</el-descriptions-item>
<el-descriptions-item label="申请人单位" :span="2">{{formData.applyUnitName}}</el-descriptions-item>
<el-descriptions-item label="申请人工会">{{formData.applyUnionName}}</el-descriptions-item>
</el-descriptions>
<!--#include('recipients.html'){}#-->
<div class="special-condolence-section-title">申请说明与签字</div>
<el-descriptions :column="3" border size="small">
<!--#include('config.html'){}#-->
<el-descriptions-item label="申请事由" :span="3">
<el-form-item prop="remark" label="申请事由">
<el-input maxlength="500" v-model="formData.remark" placeholder="请填写申请事由"
@@ -54,6 +55,11 @@ layout("/layouts/platform.html"){
</el-form-item>
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="慰问对象" name="recipients" :lazy="false">
<!--#include('recipients.html'){}#-->
</el-tab-pane>
</el-tabs>
</el-form>
<el-row type="flex" justify="end" class="special-condolence-actions">
<el-button type="primary" plain @click="onSave">保存申请</el-button>
@@ -84,7 +90,8 @@ layout("/layouts/platform.html"){
taskId: GetQueryString("taskId"),
formData: { recipients: [] },
formRules: {
recipients: [{ validator: (rule, value, callback) => callback(value && value.length ? undefined : new Error("请添加慰问对象")), trigger: "change" }],
subject: [{ required: true, whitespace: true, message: "请填写事项", trigger: ["blur", "change"] }, { max: 200, message: "事项最多200字", trigger: "blur" }],
recipients: [{ validator: (rule, value, callback) => callback(Array.isArray(value) && value.length > 0 ? undefined : new Error("请至少添加一位慰问对象")), trigger: "change" }],
helpUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
payUserId: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
type: [{ required: true, message: "必填", trigger: ["change", "blur"] }],
@@ -197,8 +204,8 @@ layout("/layouts/platform.html"){
}
},
onSave() {
this.$refs.formRef.validate((valid) => {
if (!valid) return
this.$refs.formRef.validate((valid, invalidFields) => {
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
this.$confirm("您确定保存吗?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
@@ -214,7 +221,13 @@ layout("/layouts/platform.html"){
})
},
onSubmit() {
this.$refs.formRef.validate((valid) => {
if (!Array.isArray(this.formData.recipients) || this.formData.recipients.length === 0) {
this.activeApplicationTab = 'recipients'
this.$message.error('请至少添加一位慰问对象')
return
}
this.$refs.formRef.validate((valid, invalidFields) => {
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
@@ -234,7 +247,13 @@ layout("/layouts/platform.html"){
})
},
onFinishTask() {
this.$refs.formRef.validate((valid) => {
if (!Array.isArray(this.formData.recipients) || this.formData.recipients.length === 0) {
this.activeApplicationTab = 'recipients'
this.$message.error('请至少添加一位慰问对象')
return
}
this.$refs.formRef.validate((valid, invalidFields) => {
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
if (valid) {
this.$confirm("您确定要提交吗?", "提示", {
confirmButtonText: "确定",
@@ -12,8 +12,8 @@
.special-condolence-apply .el-descriptions .el-textarea__inner { font-size: 14px; line-height: 22px; }
.special-condolence-apply .el-descriptions-item__label { width: 130px; color: #606266; background: #f7f9fc; }
.special-condolence-apply .special-condolence-recipients { margin: 28px 0; border: 1px solid #e4e7ed; border-radius: 6px; overflow: hidden; }
.special-condolence-apply .special-condolence-toolbar { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 14px; padding: 18px 20px; }
.special-condolence-apply .special-condolence-recipients { margin: 0; }
.special-condolence-apply .special-condolence-toolbar { display: flex; justify-content: flex-end; align-items: center; flex-wrap: wrap; gap: 14px; padding: 0 0 12px; }
.special-condolence-apply .special-condolence-toolbar .special-condolence-section-title { margin: 0 0 4px; }
.special-condolence-hint { color: #606266; font-size: 12px; line-height: 20px; }
.special-condolence-apply .special-condolence-toolbar-buttons { display: flex; flex-wrap: wrap; gap: 8px; }
@@ -28,7 +28,7 @@
.special-condolence-apply .special-condolence-table-item .el-date-editor { width: 100%; }
.special-condolence-apply .special-condolence-table-item .el-input-number .el-input__inner { text-align: right; }
.special-condolence-apply .special-condolence-delete { color: #d64040; }
.special-condolence-apply .special-condolence-table-footer { display: flex; justify-content: space-between; align-items: center; flex-wrap: wrap; gap: 10px; padding: 10px 20px; background: #fafbfd; }
.special-condolence-apply .special-condolence-table-footer { display: flex; justify-content: flex-end; align-items: center; flex-wrap: wrap; gap: 10px; padding: 10px 20px; background: #fafbfd; }
.special-condolence-apply .special-condolence-total { display: flex; align-items: baseline; gap: 6px; color: #606266; font-size: 13px; font-variant-numeric: tabular-nums; }
.special-condolence-apply .special-condolence-total > span { margin-left: 18px; }
.special-condolence-apply .special-condolence-total-amount { color: #303133; font-size: 20px; }
@@ -1,36 +1,12 @@
<div class="special-condolence-section-title">统一慰问配置</div>
<el-descriptions :column="3" border size="small">
<el-descriptions-item label="慰问类型">
<el-form-item label="慰问类型" prop="type">
<el-select v-model="formData.type" filterable @change="typeChange" style="width:100%" placeholder="请选择慰问类型">
<el-option v-for="t in typeOptions" :key="t.id" :value="t.id" :label="t.name"></el-option>
</el-select>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问金额">
<el-form-item label="慰问金额" prop="perMoney" :rules="recipientRules.money">
<el-input-number v-model="formData.perMoney" :precision="2" :min="0" :max="10000" :controls="false" style="width:100%" placeholder="每人慰问金额(元)"></el-input-number>
</el-form-item>
</el-descriptions-item>
<el-descriptions-item label="慰问时间">
<el-form-item label="慰问时间" prop="occurTime" :rules="recipientRules.occurTime">
<el-date-picker v-model="formData.occurTime" type="date" value-format="yyyy-MM-dd" style="width:100%" placeholder="请选择慰问时间"></el-date-picker>
</el-form-item>
</el-descriptions-item>
</el-descriptions>
<section class="special-condolence-recipients">
<div class="special-condolence-toolbar">
<div>
<div class="special-condolence-section-title">慰问对象明细 <el-tag size="small" effect="plain">{{ recipientCount }} 人</el-tag></div>
<div class="special-condolence-hint">一行填写一位慰问对象,所有人员随本申请统一审批。</div>
</div>
<div class="special-condolence-toolbar-buttons">
<el-button size="small" icon="el-icon-upload2" @click="importVisible = true">Excel 导入</el-button>
<el-button size="small" type="primary" icon="el-icon-plus" @click="formData.recipients.push(newRecipient())">新增慰问对象</el-button>
</div>
</div>
<el-form-item prop="recipients" label-width="0" class="special-condolence-table-item">
<el-table :data="formData.recipients" border stripe size="small" max-height="520" empty-text="暂无慰问对象,点击新增或从 Excel 导入">
<el-table ref="recipientTableRef" :data="formData.recipients" border stripe size="small" max-height="520" empty-text="暂无慰问对象,点击新增或从 Excel 导入">
<el-table-column type="index" label="序号" width="55" align="center" fixed="left"></el-table-column>
<el-table-column label="慰问对象" width="200" fixed="left"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + '.helpUserId'" :rules="recipientRules.helpUserId"><user-select size="small" v-model="s.row.helpUserId" api="/platform/special_condolence/apply/listUser" api_input_key_name="keyword" :option_list="recipientOptions(s.row)" :option_label_func="item => item.userName + '(' + (item.loginName || '') + ')'" @selected="(user, id) => recipientUserChange(s.row, s.$index, id, user)"></user-select></el-form-item></template></el-table-column>
<el-table-column label="工号" min-width="150"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + '.helpLoginName'" :rules="[{ validator: (rule, value, cb) => cb(s.row.personType === '劳务派遣人员' || value ? undefined : new Error('普通人员工号不能为空')), trigger: 'change' }]"><el-input size="small" v-model="s.row.helpLoginName" readonly placeholder="选人后带出,劳务派遣可空"></el-input></el-form-item></template></el-table-column>
@@ -42,7 +18,6 @@
</el-table>
</el-form-item>
<div class="special-condolence-table-footer">
<el-button type="text" icon="el-icon-plus" @click="formData.recipients.push(newRecipient())">继续添加一行</el-button>
<div class="special-condolence-total">共 <strong>{{ recipientCount }}</strong> 人<span>慰问金额合计</span><strong class="special-condolence-total-amount">¥ {{ recipientTotal }}</strong></div>
</div>
</section>
@@ -1,6 +1,6 @@
const specialCondolenceRecipients = {
data() {
return { recipientRules: this.createRecipientRules(), importVisible: false, importLoading: false }
return { activeApplicationTab: 'form', recipientRules: this.createRecipientRules(), importVisible: false, importLoading: false }
},
computed: {
recipientCount() {
@@ -13,10 +13,20 @@ const specialCondolenceRecipients = {
}
},
watch: {
activeApplicationTab() {
this.$nextTick(() => {
if (this.$refs.recipientTableRef) this.$refs.recipientTableRef.doLayout()
})
},
typeOptions() { this.chooseType = this.typeOptions.find(t => t.id === this.formData.type) || {} },
'formData.type'(value) { this.chooseType = this.typeOptions.find(t => t.id === value) || {} }
},
methods: {
showInvalidApplicationTab(errors) {
const fields = Array.isArray(errors) ? errors.map(error => error.name || '') : Object.keys(errors || {})
if (!fields.length) return
this.activeApplicationTab = fields.some(field => !field.startsWith('recipients')) ? 'form' : 'recipients'
},
createRecipientRules() {
const required = label => ({ required: true, whitespace: true, message: '请填写' + label, trigger: ['blur', 'change'] })
return {
@@ -1,11 +1,14 @@
const specialcondolenceInfo = {
template: /*language=HTML*/ `
<div>
<el-tabs v-model="activeInfoTab">
<el-tab-pane label="基础信息" name="form">
<div class="process-title">
申请信息
<el-link type="primary" @click="openChart">点击查看流程图</el-link>
</div>
<el-descriptions :column="3" border>
<el-descriptions-item label="事项" :span="3">{{ viewData.subject || '--' }}</el-descriptions-item>
<el-descriptions-item label="申请人姓名">{{ viewData.applyUserName }}</el-descriptions-item>
<el-descriptions-item label="申请人工号">{{ viewData.applyLoginName }}</el-descriptions-item>
<el-descriptions-item label="申请人单位">{{ viewData.applyUnitName }}</el-descriptions-item>
@@ -15,23 +18,6 @@ const specialcondolenceInfo = {
<el-descriptions-item label="每人慰问金额">{{ viewData.perMoney }} 元</el-descriptions-item>
<el-descriptions-item label="慰问时间">{{ viewData.occurTime }}</el-descriptions-item>
</template>
<template v-if="!viewData.recipients || !viewData.recipients.length">
<el-descriptions-item label="慰问对象">{{ viewData.helpUserName }}</el-descriptions-item>
<!-- <el-descriptions-item label="经办人">{{ viewData.handlerUserName }}</el-descriptions-item>-->
<el-descriptions-item label="证明人">{{ viewData.certifierUserName }}</el-descriptions-item>
<el-descriptions-item label="慰问类型">{{ viewData.typeName }}</el-descriptions-item>
<el-descriptions-item label="慰问金额">{{ viewData.money }}</el-descriptions-item>
<el-descriptions-item label="慰问时间">{{ viewData.occurTime }}</el-descriptions-item>
<el-descriptions-item label="收款账户">{{ viewData.bankCardNumber }}</el-descriptions-item>
<el-descriptions-item label="户名">{{ viewData.bankUserName }}</el-descriptions-item>
<el-descriptions-item label="开户行">{{ viewData.bankOfDeposit }}</el-descriptions-item>
<template v-if="['2'].includes(viewData.typeCode)">
<el-descriptions-item label="入院时间">{{ viewData.hospitalizationTime }}</el-descriptions-item>
<el-descriptions-item label="出院时间">{{ viewData.leaveHospitalTime }}</el-descriptions-item>
<el-descriptions-item label="当年第几次住院">{{ viewData.thisYearHospitalizationNum }}
</el-descriptions-item>
</template>
</template>
<el-descriptions-item label="申请事由" :span="3">
<div style="white-space: pre-line">{{ viewData.remark }}</div>
</el-descriptions-item>
@@ -48,11 +34,34 @@ const specialcondolenceInfo = {
</el-descriptions-item>
</el-descriptions>
</el-tab-pane>
<el-tab-pane label="慰问对象" name="recipients">
<el-descriptions v-if="!viewData.recipients || !viewData.recipients.length" :column="3" border>
<template v-if="!viewData.recipients || !viewData.recipients.length">
<el-descriptions-item label="慰问对象">{{ viewData.helpUserName }}</el-descriptions-item>
<!-- <el-descriptions-item label="经办人">{{ viewData.handlerUserName }}</el-descriptions-item>-->
<el-descriptions-item label="证明人">{{ viewData.certifierUserName }}</el-descriptions-item>
<el-descriptions-item label="慰问类型">{{ viewData.typeName }}</el-descriptions-item>
<el-descriptions-item label="慰问金额">{{ viewData.money }}</el-descriptions-item>
<el-descriptions-item label="慰问时间">{{ viewData.occurTime }}</el-descriptions-item>
<el-descriptions-item label="收款账户">{{ viewData.bankCardNumber }}</el-descriptions-item>
<el-descriptions-item label="户名">{{ viewData.bankUserName }}</el-descriptions-item>
<el-descriptions-item label="开户行">{{ viewData.bankOfDeposit }}</el-descriptions-item>
<template v-if="['2'].includes(viewData.typeCode)">
<el-descriptions-item label="入院时间">{{ viewData.hospitalizationTime }}</el-descriptions-item>
<el-descriptions-item label="出院时间">{{ viewData.leaveHospitalTime }}</el-descriptions-item>
<el-descriptions-item label="当年第几次住院">{{ viewData.thisYearHospitalizationNum }}
</el-descriptions-item>
</template>
</template>
</el-descriptions>
<div v-if="viewData.recipients && viewData.recipients.length" class="process-title" style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap;margin-top:20px">
<span>慰问对象明细 <el-tag size="small" effect="plain">{{ viewData.recipients.length }} 人</el-tag></span>
<span>慰问对象明细</span>
<span style="font-size:14px;font-weight:normal">慰问金额合计:<strong>¥ {{ detailTotal }}</strong></span>
</div>
<el-table v-if="viewData.recipients && viewData.recipients.length" :data="viewData.recipients" border stripe size="small" max-height="480" class="mt10" :header-cell-style="{ background: '#f5f7fa', color: '#606266' }">
<el-table ref="recipientInfoTableRef" v-if="viewData.recipients && viewData.recipients.length" :data="viewData.recipients" border stripe size="small" max-height="480" class="mt10" :header-cell-style="{ background: '#f5f7fa', color: '#606266' }">
<el-table-column type="index" label="序号" width="55" align="center" fixed="left"></el-table-column>
<el-table-column prop="helpUserName" label="慰问对象" width="130" fixed="left"></el-table-column>
<el-table-column prop="helpLoginName" label="工号" min-width="130"></el-table-column>
@@ -61,6 +70,9 @@ const specialcondolenceInfo = {
<el-table-column prop="bankUserName" label="户名" min-width="150"></el-table-column>
<el-table-column prop="bankCardNumber" label="收款账户" min-width="210"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="审核记录" name="records">
<div v-if="!doneTasks.length" style="padding:32px;text-align:center;color:#909399">暂无审核记录</div>
<template v-for="task in doneTasks">
<div class="mt10">
<div class="process-title">{{ task.displayName }}</div>
@@ -94,6 +106,8 @@ const specialcondolenceInfo = {
</el-descriptions>
</div>
</template>
</el-tab-pane>
</el-tabs>
<slot></slot>
<snaker-chart ref="snakerChartRef"></snaker-chart>
</div>
@@ -102,12 +116,20 @@ const specialcondolenceInfo = {
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
activeInfoTab: 'form',
visible: false,
viewData: {},
doneTasks: [],
row: null
}
},
watch: {
activeInfoTab() {
this.$nextTick(() => {
if (this.$refs.recipientInfoTableRef) this.$refs.recipientInfoTableRef.doLayout()
})
}
},
computed: {
detailTotal() {
const cents = (this.viewData.recipients || []).reduce((sum, row) => {
@@ -119,6 +141,7 @@ const specialcondolenceInfo = {
},
methods: {
onOpen(row) {
this.activeInfoTab = 'form'
this.row = row
this.visible = true
this.getInfo()
@@ -134,7 +134,7 @@ layout("/layouts/platform.html"){
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'subject', label: '事项'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
@@ -92,7 +92,7 @@ layout("/layouts/platform.html"){
typeOptions: [],
pageDataUrl: "/platform/special_condolence/mine/pageData",
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'subject', label: '事项'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
@@ -105,8 +105,7 @@ layout("/layouts/platform.html"){
return {
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'helpLoginName', label: '慰问对象工号'},
{prop: 'subject', label: '事项'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
@@ -134,7 +134,7 @@ layout("/layouts/platform.html"){
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'subject', label: '事项'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
@@ -134,7 +134,7 @@ layout("/layouts/platform.html"){
},
typeOptions: [],
tableColumns: [
{prop: 'helpUserName', label: '慰问对象'},
{prop: 'subject', label: '事项'},
{prop: 'applyUserName', label: '申请人'},
{prop: 'applyUnionName', label: '所属工会'},
{prop: 'applyUnitName', label: '所属单位'},
@@ -175,10 +175,13 @@ layout("/layouts/platform_h5.html"){
<!-- 表单容器 -->
<van-form ref="formRef" class="form-container specialcondolence-apply-form">
<van-tabs v-model="activeApplicationTab" :lazy-render="false">
<van-tab title="基础信息" name="form">
<!-- 基本信息 -->
<section class="form-section">
<h2 class="specialcondolence-card__title">基本信息</h2>
<van-cell-group :border="false">
<van-field v-model="formData.subject" name="subject" label="事项" maxlength="200" required placeholder="请输入特殊慰问事项" :rules="[{ validator: value => !!String(value || '').trim() && String(value).length <= 200, message: '请填写200字以内的事项' }]"></van-field>
<van-field label="申请人姓名" :rules="[{ required: true }]" v-model="formData.applyUserName" readonly
required name="applyUserName"></van-field>
<van-field label="申请人工号" :rules="[{ required: true }]" v-model="formData.applyLoginName" readonly
@@ -193,17 +196,6 @@ layout("/layouts/platform_h5.html"){
<van-field v-model="formData.perMoney" name="perMoney" label="每人金额" type="number" required :rules="[{ validator: validateMoney, message: '金额须大于0且不超过10000元,最多两位小数' }]"></van-field>
<van-field v-model="formData.occurTime" name="occurTime" label="慰问时间" readonly clickable is-link placeholder="请选择慰问时间" required :rules="[{ validator: value => $moment(value, 'YYYY-MM-DD', true).isValid(), message: '请选择有效慰问时间' }]" @click="showTimePickerClick"></van-field>
<van-popup v-model="showTimePicker" position="bottom" round get-container="body"><van-datetime-picker v-model="formData.occurDate" type="date" :min-date="minDate" :max-date="new Date(2100, 11, 31)" title="请选择慰问时间" @confirm="confirmOccurTime" @cancel="showTimePicker = false"></van-datetime-picker></van-popup>
<div v-for="(person, index) in formData.recipients" :key="index">
<van-cell :title="'慰问对象 ' + (index + 1)"><van-button native-type="button" size="mini" @click="formData.recipients.splice(index, 1)">删除</van-button></van-cell>
<h5-user-select v-model="person.helpUserId" :display-name="person.helpUserName" api="/platform/special_condolence/apply/listUser" label="慰问对象" placeholder="点击选择本工会人员" required :name="'recipients.' + index + '.helpUserId'" :rules="mobileRecipientRules('helpUserId', person)" @selected="(user, id) => recipientUserChange(person, index, id, user)"></h5-user-select>
<van-field v-model="person.helpLoginName" label="工号" readonly placeholder="选人后带出,劳务派遣可空" :required="person.personType !== '劳务派遣人员'" :name="'recipients.' + index + '.helpLoginName'" :rules="mobileRecipientRules('helpLoginName', person)"></van-field>
<van-field v-model="person.idCard" label="身份证号码" maxlength="18" required :name="'recipients.' + index + '.idCard'" :rules="mobileRecipientRules('idCard', person)"></van-field>
<van-field v-model="person.bankOfDeposit" label="开户行" maxlength="100" required :name="'recipients.' + index + '.bankOfDeposit'" :rules="mobileRecipientRules('bankOfDeposit', person)"></van-field>
<van-field v-model="person.bankUserName" label="户名" maxlength="100" required :name="'recipients.' + index + '.bankUserName'" :rules="mobileRecipientRules('bankUserName', person)"></van-field>
<van-field v-model="person.bankCardNumber" label="收款账户" maxlength="30" required :name="'recipients.' + index + '.bankCardNumber'" :rules="mobileRecipientRules('bankCardNumber', person)"></van-field>
</div>
<van-field name="recipients" :value="recipientCount" :rules="[{ validator: value => Number(value) > 0, message: '请至少添加一位慰问对象' }]"><template #input><van-button native-type="button" size="small" type="info" plain @click="formData.recipients.push(newRecipient())">增加一行</van-button></template></van-field>
<van-cell title="慰问金额合计" :value="'¥ ' + recipientTotal + '(' + recipientCount + '人)'"></van-cell>
<van-field
v-model="formData.remark"
name="remark"
@@ -254,6 +246,26 @@ layout("/layouts/platform_h5.html"){
</van-cell-group>
</section>
</van-tab>
<van-tab title="慰问对象" name="recipients">
<section class="form-section">
<h2 class="specialcondolence-card__title">慰问对象</h2>
<van-cell-group :border="false">
<div v-for="(person, index) in formData.recipients" :key="index">
<van-cell :title="'慰问对象 ' + (index + 1)"><van-button native-type="button" size="mini" @click="formData.recipients.splice(index, 1)">删除</van-button></van-cell>
<h5-user-select v-model="person.helpUserId" :display-name="person.helpUserName" api="/platform/special_condolence/apply/listUser" label="慰问对象" placeholder="点击选择本工会人员" required :name="'recipients.' + index + '.helpUserId'" :rules="mobileRecipientRules('helpUserId', person)" @selected="(user, id) => recipientUserChange(person, index, id, user)"></h5-user-select>
<van-field v-model="person.helpLoginName" label="工号" readonly placeholder="选人后带出,劳务派遣可空" :required="person.personType !== '劳务派遣人员'" :name="'recipients.' + index + '.helpLoginName'" :rules="mobileRecipientRules('helpLoginName', person)"></van-field>
<van-field v-model="person.idCard" label="身份证号码" maxlength="18" required :name="'recipients.' + index + '.idCard'" :rules="mobileRecipientRules('idCard', person)"></van-field>
<van-field v-model="person.bankOfDeposit" label="开户行" maxlength="100" required :name="'recipients.' + index + '.bankOfDeposit'" :rules="mobileRecipientRules('bankOfDeposit', person)"></van-field>
<van-field v-model="person.bankUserName" label="户名" maxlength="100" required :name="'recipients.' + index + '.bankUserName'" :rules="mobileRecipientRules('bankUserName', person)"></van-field>
<van-field v-model="person.bankCardNumber" label="收款账户" maxlength="30" required :name="'recipients.' + index + '.bankCardNumber'" :rules="mobileRecipientRules('bankCardNumber', person)"></van-field>
</div>
<van-field name="recipients" :value="recipientCount" :rules="[{ validator: value => Number(value) > 0, message: '请至少添加一位慰问对象' }]"><template #input><van-button native-type="button" size="small" type="info" plain @click="formData.recipients.push(newRecipient())">增加一行</van-button></template></van-field>
<van-cell title="慰问金额合计" :value="'¥ ' + recipientTotal + '(' + recipientCount + '人)'"></van-cell>
</van-cell-group>
</section>
</van-tab>
</van-tabs>
<!-- 提交按钮 -->
<div class="form-actions specialcondolence-apply-actions">
<van-button native-type="button" @click="onSave" round type="info" plain>保存申请</van-button>
@@ -443,7 +455,7 @@ layout("/layouts/platform_h5.html"){
}
})
})
}).catch(() => {})
}).catch(errors => this.showInvalidApplicationTab(errors))
},
async onSubmit() {
this.$refs.formRef.validate().then(() => {
@@ -462,7 +474,7 @@ layout("/layouts/platform_h5.html"){
}
})
})
})
}).catch(errors => this.showInvalidApplicationTab(errors))
},
async onFinishTask() {
this.$refs.formRef.validate().then(() => {
@@ -484,7 +496,7 @@ layout("/layouts/platform_h5.html"){
}
})
})
})
}).catch(errors => this.showInvalidApplicationTab(errors))
},
init() {
if (this.bizId) {
@@ -17,9 +17,12 @@ const specialcondolenceInfo = {
></van-nav-bar>
<div class="specialcondolence-full-popup__scroll">
<main class="specialcondolence-info-main">
<van-tabs v-model="activeInfoTab" :lazy-render="false">
<van-tab title="基础信息" name="form">
<section class="specialcondolence-info-card">
<h2 class="specialcondolence-info-card__title">基本信息</h2>
<van-cell-group :border="false">
<van-cell title="事项">{{ viewData.subject || '--' }}</van-cell>
<van-cell title="申请人姓名">{{ viewData.applyUserName || '--' }}</van-cell>
<van-cell title="申请人工号">{{ viewData.applyLoginName || '--' }}</van-cell>
<van-cell title="申请人单位">{{ viewData.applyUnitName || '--' }}</van-cell>
@@ -29,6 +32,28 @@ const specialcondolenceInfo = {
<van-cell title="每人慰问金额" :value="viewData.perMoney"></van-cell>
<van-cell title="慰问时间" :value="viewData.occurTime"></van-cell>
</template>
<van-cell title="申请事由">{{ viewData.remark || '暂无' }}</van-cell>
<van-cell class="specialcondolence-info-long-cell" title="附件">
<file-preview class="specialcondolence-attachments" :files="viewData.files" complete_result></file-preview>
</van-cell>
<van-cell class="specialcondolence-info-long-cell" title="签字">
<van-image
v-if="viewData.signature"
:src="viewData.signature"
class="specialcondolence-signature-image"
fit="contain"
></van-image>
<span v-else>暂无签字</span>
</van-cell>
</van-cell-group>
</section>
</van-tab>
<van-tab title="慰问对象" name="recipients">
<section class="specialcondolence-info-card">
<h2 class="specialcondolence-info-card__title">慰问对象</h2>
<van-cell-group :border="false">
<template v-for="(person, index) in viewData.recipients">
<van-cell :title="'慰问对象 ' + (index + 1)" :value="person.helpUserName"></van-cell>
<van-cell title="工号" :value="person.helpLoginName || '--'"></van-cell>
@@ -53,25 +78,12 @@ const specialcondolenceInfo = {
<van-cell title="出院时间">{{ viewData.leaveHospitalTime || '--' }}</van-cell>
<van-cell title="当年第几次住院(次)">{{ viewData.thisYearHospitalizationNum || '--' }}</van-cell>
</template>
<van-cell title="申请事由">
{{ viewData.remark || '暂无' }}
</van-cell>
</template>
<van-cell class="specialcondolence-info-long-cell" title="附件">
<file-preview class="specialcondolence-attachments" :files="viewData.files" complete_result></file-preview>
</van-cell>
<van-cell class="specialcondolence-info-long-cell" title="签字">
<van-image
v-if="viewData.signature"
:src="viewData.signature"
class="specialcondolence-signature-image"
fit="contain"
></van-image>
<span v-else>暂无签字</span>
</van-cell>
</van-cell-group>
</section>
</van-cell-group>
</section>
</van-tab>
<van-tab title="审核记录" name="records">
<van-empty v-if="!doneTasks.length" description="暂无审核记录"></van-empty>
<section
v-for="(task, index) in doneTasks"
:key="task.id || index"
@@ -110,6 +122,8 @@ const specialcondolenceInfo = {
</van-cell-group>
</section>
</van-tab>
</van-tabs>
<slot></slot>
</main>
</div>
@@ -125,6 +139,7 @@ const specialcondolenceInfo = {
},
data() {
return {
activeInfoTab: 'form',
visible: false,
popupTitle: "慰问详情",
viewData: {},
@@ -144,6 +159,7 @@ const specialcondolenceInfo = {
* row 传列表当前行,title 传顶部导航标题;无返回值。
*/
onOpen(row, title = "慰问详情") {
this.activeInfoTab = 'form'
this.$set(this, "row", row)
this.$set(this, "popupTitle", title)
this.$set(this, "viewData", {})
@@ -90,14 +90,13 @@ layout("/layouts/platform_h5.html"){
<template #header="{index,row}">
<div class="specialcondolence-card-header">
<div class="specialcondolence-card-heading">
<div class="specialcondolence-card-title">{{row.helpUserName || '--'}}</div>
<div class="specialcondolence-card-title">{{row.subject || '--'}}</div>
</div>
<enum-tag class="specialcondolence-card-status" v-if="row.instanceState" :value="row.instanceState"
name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="慰问对象">{{row.helpUserName}}</table-column>
<table-column label="申请人">{{row.applyUserName}}</table-column>
<table-column label="所属工会">{{row.applyUnionName}}</table-column>
<table-column label="所属单位">{{row.applyUnitName}}</table-column>
@@ -327,14 +327,13 @@ layout("/layouts/platform_h5.html"){
<template #header="{index,row}">
<div class="specialcondolence-card-header">
<div class="specialcondolence-card-heading">
<div class="specialcondolence-card-title">{{row.helpUserName || '--'}}</div>
<div class="specialcondolence-card-title">{{row.subject || '--'}}</div>
</div>
<enum-tag class="specialcondolence-card-status" v-if="row.instanceState" :value="row.instanceState"
name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="慰问对象">{{row.helpUserName}}</table-column>
<table-column label="申请人">{{row.applyUserName}}</table-column>
<table-column label="所属工会">{{row.applyUnionName}}</table-column>
<table-column label="所属单位">{{row.applyUnitName}}</table-column>
@@ -90,14 +90,13 @@ layout("/layouts/platform_h5.html"){
<template #header="{index,row}">
<div class="specialcondolence-card-header">
<div class="specialcondolence-card-heading">
<div class="specialcondolence-card-title">{{row.helpUserName || '--'}}</div>
<div class="specialcondolence-card-title">{{row.subject || '--'}}</div>
</div>
<enum-tag class="specialcondolence-card-status" v-if="row.instanceState" :value="row.instanceState"
name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="慰问对象">{{row.helpUserName}}</table-column>
<table-column label="申请人">{{row.applyUserName}}</table-column>
<table-column label="所属工会">{{row.applyUnionName}}</table-column>
<table-column label="所属单位">{{row.applyUnitName}}</table-column>
@@ -90,14 +90,13 @@ layout("/layouts/platform_h5.html"){
<template #header="{index,row}">
<div class="specialcondolence-card-header">
<div class="specialcondolence-card-heading">
<div class="specialcondolence-card-title">{{row.helpUserName || '--'}}</div>
<div class="specialcondolence-card-title">{{row.subject || '--'}}</div>
</div>
<enum-tag class="specialcondolence-card-status" v-if="row.instanceState" :value="row.instanceState"
name="ProcessInstanceStateEnum" label_key="message" size="small"></enum-tag>
</div>
</template>
<template v-slot="{index,row}">
<table-column label="慰问对象">{{row.helpUserName}}</table-column>
<table-column label="申请人">{{row.applyUserName}}</table-column>
<table-column label="所属工会">{{row.applyUnionName}}</table-column>
<table-column label="所属单位">{{row.applyUnitName}}</table-column>