Merge branch 'fix_职工慰问' into release_20261030问题整改
This commit is contained in:
+21
@@ -14,6 +14,8 @@ import com.budwk.app.base.utils.PageUtil;
|
||||
import com.budwk.app.flow.entity.ProcessInstance;
|
||||
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;
|
||||
import com.budwk.app.zhgh.staffbenefit.condolence.model.Condolence;
|
||||
import com.budwk.app.zhgh.staffbenefit.condolence.service.CondolenceService;
|
||||
import io.swagger.annotations.Api;
|
||||
@@ -96,6 +98,7 @@ public class CondolenceReadController {
|
||||
cnd.andEX("YEAR(info.createTime)", "=", year);
|
||||
cnd.andEX("info.applyUnionId", "=", unionId);
|
||||
cnd.andEX("info.applyUnitId", "=", unitId);
|
||||
applyReadScope(cnd, "info");
|
||||
|
||||
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
|
||||
SqlExpressionGroup seg = new SqlExpressionGroup();
|
||||
@@ -142,6 +145,7 @@ public class CondolenceReadController {
|
||||
cnd.andEX("YEAR(con.createTime)", "=", year);
|
||||
cnd.andEX("con.applyUnionId", "=", unionId);
|
||||
cnd.andEX("con.applyUnitId", "=", unitId);
|
||||
applyReadScope(cnd, "con");
|
||||
if (StrUtil.isNotBlank(pageForm.getSearchKeyword())) {
|
||||
SqlExpressionGroup seg = new SqlExpressionGroup();
|
||||
seg.or("con.helpUserName", "like", "%" + pageForm.getSearchKeyword() + "%");
|
||||
@@ -166,4 +170,21 @@ public class CondolenceReadController {
|
||||
Workbook workbook = ExcelExportUtil.exportExcel(exportParams, exportEntities, list);
|
||||
CommonDownloadUtil.download("申报人汇总.xlsx", workbook, response);
|
||||
}
|
||||
|
||||
private void applyReadScope(Cnd cnd, String alias) {
|
||||
if (AuthUtil.hasPermission("all_school")) {
|
||||
return;
|
||||
}
|
||||
if (AuthUtil.hasPermission("branch_union")) {
|
||||
String unionId = SecurityUtil.getUnionId();
|
||||
if (StrUtil.isNotBlank(unionId)) {
|
||||
cnd.and(alias + ".applyUnionId", "=", unionId);
|
||||
return;
|
||||
}
|
||||
} else if (AuthUtil.hasPermission("self")) {
|
||||
cnd.and(alias + ".createdBy", "=", SecurityUtil.getUserId());
|
||||
return;
|
||||
}
|
||||
cnd.and("1", "=", 0);
|
||||
}
|
||||
}
|
||||
|
||||
+6
-9
@@ -83,7 +83,7 @@ public class SpecialCondolenceApplyController {
|
||||
public Result save(@Param("data") SpecialCondolence specialcondolence) {
|
||||
if(StrUtil.isBlank(specialcondolence.getId())) specialcondolence.setCreateTime(DateUtil.now());
|
||||
prepareApplication(specialcondolence);
|
||||
specialcondolenceService.saveApplication(specialcondolence);
|
||||
specialcondolenceService.saveDraftApplication(specialcondolence);
|
||||
return Result.success();
|
||||
}
|
||||
|
||||
@@ -213,23 +213,20 @@ public class SpecialCondolenceApplyController {
|
||||
for (int r = 1; r <= sheet.getLastRowNum(); r++) {
|
||||
org.apache.poi.ss.usermodel.Row excelRow = sheet.getRow(r);
|
||||
if (excelRow == null) continue;
|
||||
String prefix = "慰问对象" + (result.size() + 1) + " ";
|
||||
cn.hutool.json.JSONObject row = new cn.hutool.json.JSONObject();
|
||||
boolean empty = true;
|
||||
for (int c = 0; c < fields.length; c++) {
|
||||
org.apache.poi.ss.usermodel.Cell cell = excelRow.getCell(c);
|
||||
String value = formatter.formatCellValue(cell).trim();
|
||||
if (c != 1 && cell != null && cell.getCellType() == org.apache.poi.ss.usermodel.CellType.FORMULA) throw new com.budwk.app.base.exception.BaseException("第" + (r + 1) + "行不支持公式,请填写实际值");
|
||||
if ((c == 2 || c == 5) && cell != null && cell.getCellType() == org.apache.poi.ss.usermodel.CellType.NUMERIC) throw new com.budwk.app.base.exception.BaseException("第" + (r + 1) + "行工号、身份证和收款账户请使用文本格式,避免数字失真");
|
||||
if (c != 1 && cell != null && cell.getCellType() == org.apache.poi.ss.usermodel.CellType.FORMULA) throw new com.budwk.app.base.exception.BaseException(prefix + "不支持公式,请填写实际值");
|
||||
if ((c == 2 || c == 5) && cell != null && cell.getCellType() == org.apache.poi.ss.usermodel.CellType.NUMERIC) throw new com.budwk.app.base.exception.BaseException(prefix + "工号、身份证和收款账户请使用文本格式,避免数字失真");
|
||||
row.set(fields[c], value);
|
||||
empty = empty && value.isEmpty();
|
||||
}
|
||||
if (empty) continue;
|
||||
for (int c = 0; c < fields.length; c++) {
|
||||
if (c != 1 && row.getStr(fields[c]).isEmpty()) throw new com.budwk.app.base.exception.BaseException("第" + (r + 1) + "行:请填写" + headers[c]);
|
||||
}
|
||||
if (!com.budwk.app.zhgh.staffbenefit.specialcondolence.service.SpecialCondolenceRecipients.validIdCard(row.getStr("idCard"))) throw new com.budwk.app.base.exception.BaseException("第" + (r + 1) + "行身份证号码格式不正确");
|
||||
if (!row.getStr("bankCardNumber").matches("[0-9]{6,30}")) throw new com.budwk.app.base.exception.BaseException("第" + (r + 1) + "行收款账户格式不正确");
|
||||
com.budwk.app.zhgh.staffbenefit.specialcondolence.service.SpecialCondolenceRecipients.resolveUser(row, dao, "第" + (r + 1) + "行:");
|
||||
if (!com.budwk.app.zhgh.staffbenefit.specialcondolence.service.SpecialCondolenceRecipients.validIdCard(row.getStr("idCard"))) throw new com.budwk.app.base.exception.BaseException(prefix + "身份证号码格式不正确");
|
||||
if (!row.getStr("bankCardNumber").matches("[0-9]{6,30}")) throw new com.budwk.app.base.exception.BaseException(prefix + "收款账户格式不正确");
|
||||
result.add(row);
|
||||
}
|
||||
}
|
||||
|
||||
+1
@@ -71,6 +71,7 @@ public class SpecialCondolenceReadController {
|
||||
Sql sql = Sqls.create("""
|
||||
SELECT
|
||||
info.*,
|
||||
(SELECT COUNT(*) FROM special_condolence_recipient recipient WHERE recipient.applyId = info.id AND recipient.delFlag = false) AS recipientCount,
|
||||
ins.id AS instanceId,
|
||||
type.name as typeName,
|
||||
ins.state instanceState,
|
||||
|
||||
+18
-15
@@ -32,7 +32,7 @@ public final class SpecialCondolenceRecipients {
|
||||
row.set("type", info.getType());
|
||||
row.set("money", info.getPerMoney().toPlainString());
|
||||
row.set("occurTime", info.getOccurTime());
|
||||
resolveUser(row, dao, prefix);
|
||||
if (cn.hutool.core.util.StrUtil.isNotBlank(row.getStr("helpUserId"))) resolveUser(row, dao, prefix);
|
||||
String[] fields = {"helpUserName", "type", "idCard", "bankOfDeposit", "bankUserName", "bankCardNumber", "money", "occurTime"};
|
||||
for (String field : fields) {
|
||||
String value = row.getStr(field);
|
||||
@@ -80,24 +80,27 @@ public final class SpecialCondolenceRecipients {
|
||||
if (cn.hutool.core.util.StrUtil.isNotBlank(userId)) {
|
||||
user = dao.fetch(com.budwk.app.sys.views.View_user.class, org.nutz.dao.Cnd.where("id", "=", userId));
|
||||
} else {
|
||||
org.nutz.dao.Cnd identity = org.nutz.dao.Cnd.where("unionId", "=", unionId)
|
||||
.and("idCard", "=", row.getStr("idCard")).and("username", "=", row.getStr("helpUserName"));
|
||||
java.util.List<com.budwk.app.sys.views.View_user> dispatched = dao.query(com.budwk.app.sys.views.View_user.class,
|
||||
identity.and("personType", "=", "劳务派遣人员"));
|
||||
if (dispatched.size() > 1) throw new BaseException(prefix + "劳务派遣人员身份重复,请核对档案");
|
||||
if (dispatched.size() == 1) {
|
||||
user = dispatched.get(0);
|
||||
} else {
|
||||
if (cn.hutool.core.util.StrUtil.isBlank(row.getStr("helpLoginName"))) throw new BaseException(prefix + "普通人员必须填写工号");
|
||||
java.util.List<com.budwk.app.sys.views.View_user> users = dao.query(com.budwk.app.sys.views.View_user.class,
|
||||
org.nutz.dao.Cnd.where("unionId", "=", unionId).and("loginname", "=", row.getStr("helpLoginName"))
|
||||
.and("username", "=", row.getStr("helpUserName")).and("idCard", "=", row.getStr("idCard")));
|
||||
if (users.size() != 1) throw new BaseException(prefix + "工号、姓名、身份证不匹配或不属于申请人本工会");
|
||||
user = users.get(0);
|
||||
java.util.List<com.budwk.app.sys.views.View_user> users = dao.query(com.budwk.app.sys.views.View_user.class,
|
||||
org.nutz.dao.Cnd.where("idCard", "=", row.getStr("idCard"))
|
||||
.and("username", "=", row.getStr("helpUserName")));
|
||||
if (users.isEmpty()) throw new BaseException(prefix + "姓名、身份证与人员档案不匹配");
|
||||
java.util.List<com.budwk.app.sys.views.View_user> members = users.stream()
|
||||
.filter(member -> java.util.Objects.equals(member.getUnionId(), unionId))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
if (members.isEmpty()) throw new BaseException(prefix + "只能选择申请人本工会人员");
|
||||
String loginName = row.getStr("helpLoginName");
|
||||
if (cn.hutool.core.util.StrUtil.isNotBlank(loginName)) {
|
||||
members = members.stream().filter(member -> "劳务派遣人员".equals(member.getPersonType())
|
||||
|| java.util.Objects.equals(member.getLoginname(), loginName))
|
||||
.collect(java.util.stream.Collectors.toList());
|
||||
}
|
||||
if (members.isEmpty()) throw new BaseException(prefix + "工号与慰问对象不一致");
|
||||
if (members.size() > 1) throw new BaseException(prefix + "人员身份重复,请核对档案");
|
||||
user = members.get(0);
|
||||
}
|
||||
if (user == null) throw new BaseException(prefix + "慰问对象不存在");
|
||||
if (!java.util.Objects.equals(user.getUnionId(), unionId)) throw new BaseException(prefix + "只能选择申请人本工会人员");
|
||||
if (!"劳务派遣人员".equals(user.getPersonType()) && cn.hutool.core.util.StrUtil.isBlank(row.getStr("helpLoginName"))) throw new BaseException(prefix + "普通人员必须填写工号");
|
||||
if (!"劳务派遣人员".equals(user.getPersonType()) && (cn.hutool.core.util.StrUtil.isBlank(row.getStr("helpLoginName")) || !java.util.Objects.equals(user.getLoginname(), row.getStr("helpLoginName")))) throw new BaseException(prefix + "工号与慰问对象不一致");
|
||||
if (cn.hutool.core.util.StrUtil.isNotBlank(user.getIdCard()) && !user.getIdCard().equalsIgnoreCase(row.getStr("idCard"))) throw new BaseException(prefix + "身份证号码与所选人员不一致");
|
||||
row.set("helpUserId", user.getId());
|
||||
|
||||
+1
@@ -12,6 +12,7 @@ import com.budwk.app.zhgh.staffbenefit.specialcondolence.model.SpecialCondolence
|
||||
*/
|
||||
public interface SpecialCondolenceService extends BaseService<SpecialCondolence> {
|
||||
void saveApplication(SpecialCondolence info);
|
||||
void saveDraftApplication(SpecialCondolence info);
|
||||
SpecialCondolence loadApplication(String id);
|
||||
void deleteApplication(String id);
|
||||
}
|
||||
|
||||
+32
-9
@@ -3,6 +3,7 @@ package com.budwk.app.zhgh.staffbenefit.specialcondolence.service.impl;
|
||||
import com.budwk.app.base.service.impl.BaseServiceImpl;
|
||||
import com.budwk.app.zhgh.staffbenefit.specialcondolence.model.SpecialCondolenceRecipient;
|
||||
import com.budwk.app.zhgh.staffbenefit.specialcondolence.service.SpecialCondolenceRecipients;
|
||||
import cn.hutool.core.util.StrUtil;
|
||||
import cn.hutool.json.JSONObject;
|
||||
import cn.hutool.json.JSONUtil;
|
||||
import org.nutz.ioc.aop.Aop;
|
||||
@@ -35,6 +36,28 @@ public class SpecialCondolenceServiceImpl extends BaseServiceImpl<SpecialCondole
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void saveApplication(SpecialCondolence info) {
|
||||
SpecialCondolenceRecipients.prepare(info, dao());
|
||||
persistApplication(info);
|
||||
}
|
||||
|
||||
@Override
|
||||
@Aop(TransAop.READ_COMMITTED)
|
||||
public void saveDraftApplication(SpecialCondolence info) {
|
||||
if (info.getRecipients() == null) info.setRecipients(new ArrayList<>());
|
||||
info.getRecipients().removeIf(row -> row == null || java.util.stream.Stream.of(
|
||||
"helpUserId", "helpUserName", "helpLoginName", "idCard", "bankOfDeposit", "bankUserName", "bankCardNumber")
|
||||
.allMatch(field -> StrUtil.isBlank(row.getStr(field))));
|
||||
for (JSONObject row : info.getRecipients()) {
|
||||
row.set("type", info.getType());
|
||||
row.set("typeCode", info.getTypeCode());
|
||||
row.set("way", info.getWay());
|
||||
row.set("money", info.getPerMoney());
|
||||
row.set("occurTime", info.getOccurTime());
|
||||
}
|
||||
info.setMoney(info.getPerMoney() == null ? null : info.getPerMoney().multiply(BigDecimal.valueOf(info.getRecipients().size())).doubleValue());
|
||||
persistApplication(info);
|
||||
}
|
||||
|
||||
private void persistApplication(SpecialCondolence info) {
|
||||
dao().insertOrUpdate(info);
|
||||
dao().clear(SpecialCondolenceRecipient.class,
|
||||
Cnd.where("applyId", "=", info.getId()));
|
||||
@@ -42,20 +65,20 @@ public class SpecialCondolenceServiceImpl extends BaseServiceImpl<SpecialCondole
|
||||
for (JSONObject row : info.getRecipients()) {
|
||||
SpecialCondolenceRecipient person = new SpecialCondolenceRecipient();
|
||||
person.setApplyId(info.getId());
|
||||
person.setHelpUserName(row.getStr("helpUserName"));
|
||||
person.setHelpUserId(row.getStr("helpUserId"));
|
||||
person.setHelpUserName(row.getStr("helpUserName", ""));
|
||||
person.setHelpUserId(row.getStr("helpUserId", ""));
|
||||
person.setHelpLoginName(row.getStr("helpLoginName"));
|
||||
person.setPersonType(row.getStr("personType"));
|
||||
person.setType(row.getStr("type"));
|
||||
person.setType(row.getStr("type", ""));
|
||||
person.setTypeName(row.getStr("typeName"));
|
||||
person.setTypeCode(row.getStr("typeCode"));
|
||||
person.setWay(row.getStr("way"));
|
||||
person.setIdCard(row.getStr("idCard"));
|
||||
person.setBankOfDeposit(row.getStr("bankOfDeposit"));
|
||||
person.setBankUserName(row.getStr("bankUserName"));
|
||||
person.setBankCardNumber(row.getStr("bankCardNumber"));
|
||||
person.setMoney(new BigDecimal(row.getStr("money")));
|
||||
person.setOccurTime(row.getStr("occurTime"));
|
||||
person.setIdCard(row.getStr("idCard", ""));
|
||||
person.setBankOfDeposit(row.getStr("bankOfDeposit", ""));
|
||||
person.setBankUserName(row.getStr("bankUserName", ""));
|
||||
person.setBankCardNumber(row.getStr("bankCardNumber", ""));
|
||||
person.setMoney(row.getBigDecimal("money", BigDecimal.ZERO));
|
||||
person.setOccurTime(row.getStr("occurTime", ""));
|
||||
person.setSortNum(sort++);
|
||||
dao().insert(person);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, processKey, platform, moduleId, isQuickEntry, picIcon, initialPinyinName, isRecommendApp, isRecommendService) VALUES ('184d56fd537041caa2bde800d0d32436', '90bf20d9065e4e11864952ea18544c25', '009000040003', '个人范围', null, 'data', null, null, null, false, false, 'self', null, 1027, false, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331288, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331288, false, null, 'PC', null, false, null, null, false, false);
|
||||
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, processKey, platform, moduleId, isQuickEntry, picIcon, initialPinyinName, isRecommendApp, isRecommendService) VALUES ('df87d83ed3184019b3872139c15b53ec', '90bf20d9065e4e11864952ea18544c25', '009000040002', '分工会范围', null, 'data', null, null, null, false, false, 'branch_union', null, 1026, false, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331286, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331286, false, null, 'PC', null, false, null, null, false, false);
|
||||
INSERT INTO sys_menu (id, parentId, path, name, aliasName, type, href, target, icon, showit, disabled, permission, note, location, hasChildren, createdBy, createdAt, updatedBy, updatedAt, delFlag, processKey, platform, moduleId, isQuickEntry, picIcon, initialPinyinName, isRecommendApp, isRecommendService) VALUES ('f2a75d2494724978b5325075815808c9', '90bf20d9065e4e11864952ea18544c25', '009000040001', '全校范围', null, 'data', null, null, null, false, false, 'all_school', null, 1025, false, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331280, '17a7f8ad3ee947b4a26175049a9c253d', 1793418331280, false, null, 'PC', null, false, null, null, false, false);
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES ('fd753e8a8c5a404e8e00ef8e0b0c69da', 'df87d83ed3184019b3872139c15b53ec');
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES ('494ac71eb8b44d0e99e19b7fde6bd469', 'f2a75d2494724978b5325075815808c9');
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES ('6aece46b946e4fb9ac4cb15c0cd8c3e6', 'f2a75d2494724978b5325075815808c9');
|
||||
INSERT INTO sys_role_menu (roleId, menuId) VALUES ('b3854469e6f44901b22bb791cb538431', 'f2a75d2494724978b5325075815808c9');
|
||||
+1
-1
@@ -7,7 +7,7 @@
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="慰问金额" :span="2">
|
||||
<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-input v-model="formData.perMoney" readonly style="width:100%" placeholder="根据慰问类型自动带出"></el-input>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
<el-descriptions-item label="慰问时间" :span="2">
|
||||
|
||||
+18
-9
@@ -51,7 +51,7 @@ layout("/layouts/platform.html"){
|
||||
</el-descriptions-item>
|
||||
|
||||
<el-descriptions-item label="签字" :span="6">
|
||||
<el-form-item prop="signature" label="签字">
|
||||
<el-form-item prop="signature" label="签字" class="special-condolence-signature-item">
|
||||
<pc-signature v-model="formData.signature"></pc-signature>
|
||||
</el-form-item>
|
||||
</el-descriptions-item>
|
||||
@@ -205,8 +205,6 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
},
|
||||
onSave() {
|
||||
this.$refs.formRef.validate((valid, invalidFields) => {
|
||||
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
|
||||
this.$confirm("您确定保存吗?", "提示", {
|
||||
confirmButtonText: "确定",
|
||||
cancelButtonText: "取消",
|
||||
@@ -219,11 +217,23 @@ layout("/layouts/platform.html"){
|
||||
}
|
||||
})
|
||||
})
|
||||
})
|
||||
},
|
||||
async validateApplication(callback) {
|
||||
const form = this.$refs.formRef
|
||||
const fields = form.fields.filter(field => field.prop && !field.prop.startsWith('recipients'))
|
||||
const results = await Promise.all(fields.map(field => new Promise(resolve => {
|
||||
field.validate('', message => resolve(!message))
|
||||
})))
|
||||
if (results.some(valid => !valid)) {
|
||||
this.activeApplicationTab = 'form'
|
||||
this.$message.error('请完善基础信息的必填信息')
|
||||
return
|
||||
}
|
||||
if (!this.ensureApplicationRecipients()) return
|
||||
form.validate(callback)
|
||||
},
|
||||
onSubmit() {
|
||||
if (!this.ensureApplicationRecipients()) return
|
||||
this.$refs.formRef.validate((valid, invalidFields) => {
|
||||
this.validateApplication((valid, invalidFields) => {
|
||||
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
|
||||
if (valid) {
|
||||
this.$confirm("您确定要提交吗?", "提示", {
|
||||
@@ -244,8 +254,7 @@ layout("/layouts/platform.html"){
|
||||
})
|
||||
},
|
||||
onFinishTask() {
|
||||
if (!this.ensureApplicationRecipients()) return
|
||||
this.$refs.formRef.validate((valid, invalidFields) => {
|
||||
this.validateApplication((valid, invalidFields) => {
|
||||
if (!valid) { this.showInvalidApplicationTab(invalidFields); return }
|
||||
if (valid) {
|
||||
this.$confirm("您确定要提交吗?", "提示", {
|
||||
@@ -275,7 +284,7 @@ layout("/layouts/platform.html"){
|
||||
this.selectQueryUser(this.formData.helpLoginName, this.helpUserOptions)
|
||||
this.selectQueryUser(this.formData.certifierLoginName, this.certifierUserOptions)
|
||||
this.selectQueryUser(this.formData.handlerLoginName, this.handlerUserOptions)
|
||||
this.chooseType = this.typeOptions.find(o => o.id === this.formData.type)
|
||||
this.chooseType = this.typeOptions.find(o => o.id === this.formData.type) || {}
|
||||
}
|
||||
})
|
||||
} else {
|
||||
|
||||
+2
@@ -65,3 +65,5 @@
|
||||
.special-condolence-apply .flow-task-form .el-form-item__error { color: #f56c6c !important; }
|
||||
.special-condolence-apply .el-form-item.is-error .el-input__inner,
|
||||
.special-condolence-apply .el-form-item.is-error .el-textarea__inner { border-color: #f56c6c; }
|
||||
|
||||
.special-condolence-apply .flow-task-form .special-condolence-signature-item .el-form-item__error { position: static; padding-top: 6px; line-height: 20px; white-space: normal; }
|
||||
|
||||
+2
-2
@@ -8,8 +8,8 @@
|
||||
<el-form-item prop="recipients" label-width="0" class="special-condolence-table-item">
|
||||
<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>
|
||||
<el-table-column label="慰问对象" width="200" fixed="left"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + (s.row.helpUserId ? '.helpUserId' : '.helpUserName')" :rules="recipientRules.helpUserId"><el-input v-if="!s.row.helpUserId && s.row.helpUserName" size="small" :value="s.row.helpUserName" readonly></el-input><user-select v-else 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.helpUserId || 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>
|
||||
<el-table-column label="身份证号码" min-width="205"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + '.idCard'" :rules="recipientRules.idCard"><el-input size="small" v-model="s.row.idCard" maxlength="18" placeholder="请输入18位身份证号"></el-input></el-form-item></template></el-table-column>
|
||||
<el-table-column label="开户行" min-width="190"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + '.bankOfDeposit'" :rules="recipientRules.bankOfDeposit"><el-input size="small" v-model="s.row.bankOfDeposit" maxlength="100" placeholder="请输入开户银行及支行"></el-input></el-form-item></template></el-table-column>
|
||||
<el-table-column label="户名" min-width="140"><template slot-scope="s"><el-form-item :prop="'recipients.' + s.$index + '.bankUserName'" :rules="recipientRules.bankUserName"><el-input size="small" v-model="s.row.bankUserName" maxlength="100" placeholder="请输入账户户名"></el-input></el-form-item></template></el-table-column>
|
||||
|
||||
+7
-4
@@ -34,7 +34,7 @@ const specialCondolenceRecipients = {
|
||||
},
|
||||
ensureApplicationRecipients() {
|
||||
const rows = this.formData.recipients
|
||||
if (!Array.isArray(rows) || rows.length === 0 || rows.some(row => !row || !String(row.helpUserId || '').trim())) {
|
||||
if (!Array.isArray(rows) || rows.length === 0 || rows.some(row => !row || !String(row.helpUserId || row.helpUserName || '').trim())) {
|
||||
this.activeApplicationTab = 'recipients'
|
||||
this.notifyRecipientError('请先选择慰问对象,并填写完整信息')
|
||||
return false
|
||||
@@ -95,15 +95,18 @@ const specialCondolenceRecipients = {
|
||||
try {
|
||||
const data = new FormData()
|
||||
data.append('file', request.file)
|
||||
const result = await this.$axios.post('/platform/special_condolence/apply/importRecipients', data)
|
||||
const response = await axios.post('/platform/special_condolence/apply/importRecipients', data, {
|
||||
headers: { 'x-requested-with': 'XMLHttpRequest' }
|
||||
})
|
||||
const result = response.data
|
||||
if (result.code === 0) {
|
||||
const rows = this.formData.recipients.filter(r => r.helpUserName || r.type || r.idCard || r.bankCardNumber || r.bankUserName || r.bankOfDeposit || r.money)
|
||||
this.$set(this.formData, 'recipients', rows.concat(result.data))
|
||||
this.importVisible = false
|
||||
this.$message.success('导入成功,共' + result.data.length + '人')
|
||||
} else this.$message.error(result.msg || '导入失败')
|
||||
} else this.$message.error('导入失败:' + (result.msg || '请检查文件内容后重试'))
|
||||
} catch (error) {
|
||||
this.$message.error('导入失败,请检查文件内容后重试')
|
||||
this.$message.error('导入失败:' + (error.response?.data?.msg || error.msg || '请检查文件内容后重试'))
|
||||
} finally {
|
||||
this.importLoading = false
|
||||
}
|
||||
|
||||
+1
-1
@@ -110,7 +110,7 @@ layout("/layouts/platform.html"){
|
||||
{prop: 'applyUnionName', label: '所属工会'},
|
||||
{prop: 'applyUnitName', label: '所属单位'},
|
||||
{prop: 'typeName', label: '慰问类型'},
|
||||
{prop: 'taskName', label: '当前节点'},
|
||||
{prop: 'recipientCount', label: '慰问人数'},
|
||||
{prop: 'instanceState', label: '流程状态'},
|
||||
],
|
||||
unionList: [],
|
||||
|
||||
+4
-6
@@ -197,7 +197,7 @@ layout("/layouts/platform_h5.html"){
|
||||
|
||||
<van-field :value="chooseType.name || formData.typeName" name="type" label="慰问类型" readonly clickable is-link required placeholder="请选择慰问类型" :rules="[{ validator: () => !!formData.type, message: '请选择慰问类型' }]" @click="showTypePickerClick"></van-field>
|
||||
<van-popup v-model="showTypePicker" position="bottom" round get-container="body"><van-picker :columns="typeColumns" :default-index="typeDefaultIndex" show-toolbar @confirm="onTypeConfirm" @cancel="showTypePicker = false"></van-picker></van-popup>
|
||||
<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.perMoney" name="perMoney" label="慰问金额" type="number" readonly 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-if="showTimePicker" v-model="formData.occurDate" type="date" :min-date="minDate" :max-date="maxDate" title="请选择慰问时间" @confirm="confirmOccurTime" @cancel="showTimePicker = false"></van-datetime-picker></van-popup>
|
||||
<van-field
|
||||
@@ -258,7 +258,7 @@ layout("/layouts/platform_h5.html"){
|
||||
<div v-for="(person, index) in formData.recipients" :key="index">
|
||||
<van-cell :title="'慰问对象 ' + (index + 1)" :title-style="{ fontWeight: 'bold' }"><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.helpLoginName" label="工号" readonly placeholder="选人后带出,劳务派遣可空" :required="!!person.helpUserId && 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>
|
||||
@@ -340,8 +340,8 @@ layout("/layouts/platform_h5.html"){
|
||||
},
|
||||
mobileRecipientRules(field, person) {
|
||||
const names = { helpUserId: '慰问对象', helpLoginName: '工号', idCard: '身份证号码', bankOfDeposit: '开户行', bankUserName: '户名', bankCardNumber: '收款账户' }
|
||||
if (field === 'helpLoginName') return [{ validator: value => person.personType === '劳务派遣人员' || !!String(value || '').trim(), message: '普通人员工号不能为空' }]
|
||||
if (field === 'helpUserId') return [{ validator: () => !!person.helpUserId, message: '请选择慰问对象' }]
|
||||
if (field === 'helpLoginName') return [{ validator: value => !person.helpUserId || person.personType === '劳务派遣人员' || !!String(value || '').trim(), message: '请完善慰问对象信息(工号不能为空)' }]
|
||||
if (field === 'helpUserId') return [{ validator: () => !!(person.helpUserId || person.helpUserName), message: '请选择慰问对象' }]
|
||||
const rules = [{ validator: value => !!String(value || '').trim(), message: '请填写' + names[field] }]
|
||||
if (field === 'idCard') rules.push({ validator: value => this.validRecipientIdCard(value), message: '身份证号码不正确' })
|
||||
if (field === 'bankCardNumber') rules.push({ pattern: /^[0-9]{6,30}$/, message: '收款账户须为6至30位数字' })
|
||||
@@ -464,7 +464,6 @@ layout("/layouts/platform_h5.html"){
|
||||
this.showTypePicker = false
|
||||
},
|
||||
onSave() {
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
this.$dialog.confirm({
|
||||
title: "提示",
|
||||
message: "您确定保存吗?"
|
||||
@@ -476,7 +475,6 @@ layout("/layouts/platform_h5.html"){
|
||||
}
|
||||
})
|
||||
})
|
||||
}).catch(errors => this.showInvalidApplicationTab(errors))
|
||||
},
|
||||
async onSubmit() {
|
||||
this.$refs.formRef.validate().then(() => {
|
||||
|
||||
Reference in New Issue
Block a user