This commit is contained in:
@jyuhsin
2025-12-22 17:05:23 +08:00
parent 5c75104efd
commit 43913ae3a0
9 changed files with 431 additions and 380 deletions
@@ -30,7 +30,7 @@ public class CspProcessor extends AbstractProcessor {
"style-src * 'unsafe-inline' data:; " +
"img-src 'self' data: https:; " +
"font-src * data: https:; " +
"connect-src 'self' https:; " +
"connect-src 'self' https: webpack:; " +
"frame-ancestors 'self'; " +
"object-src 'self';";
@@ -37,6 +37,7 @@ import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.dao.util.cri.SqlExpressionGroup;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
@@ -65,232 +66,235 @@ import java.util.*;
@At("/platform/activityDeclare/mine")
public class ActivityDeclareMineController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityDeclareService activityDeclareService;
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private SysOfficeTemplateUtil sysOfficeTemplateUtil;
@Inject
private ActivityDeclareService activityDeclareService;
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At("")
@SaCheckPermission("activityDeclare.mine")
@Ok("beetl:/platform/zhgh/activity/declarereimbursement/declare/mine/index.html")
public void index() {
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
activity_declare_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
if (AuthUtil.hasRole(RoleConstant.BRANCH_UNION_CHAIRMAN.name())) {
cnd.and("info.unionId", "=", SecurityUtil.getUnionId());
} else {
cnd.and("info.userId", "=", SecurityUtil.getUserId());
}
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动申报,我的申请列表")
@SaCheckPermission("activityDeclare.mine")
public Result pageData(CommonPageParam pageParam) {
Sql sql = Sqls.create("""
SELECT
info.id,
info.userName,
info.mobile,
info.loginName,
info.applyTime,
info.activityName,
info.activityAddress,
info.planStartTime,
info.planEndTime,
info.declareUnitName,
info.activityType,
info.activityContent,
info.activityNumber,
ins.id AS instanceId,
ins.businessNo,
ins.state instanceState,
ins.variable instanceVariable,
ins.processDefineId instanceProcessDefineId,
t.id taskId,
t.taskName AS taskKey,
t.displayName taskName,
t.taskType,
t.performType taskPerformType,
t.taskState,
t.finishTime,
t.taskParentId,
t.variable taskVariable,
IF((SELECT taskName FROM wf_process_task tt WHERE tt.id = t.taskParentId) = 'startTask', 1, 0) canRevoke,
(select MAX(id) from wf_process_task where processInstanceId = ins.id and taskName = 'startTask' AND taskState in (10,20)) AS startTaskId
FROM
activity_declare_info info
LEFT JOIN `wf_process_instance` ins ON ins.businessNo = info.id
LEFT JOIN wf_process_task t ON t.processInstanceId = ins.id AND t.taskState = 10
LEFT JOIN wf_process_task_actor ta ON ta.processTaskId = t.id
$condition
""");
Cnd cnd = Cnd.NEW();
pageParam.buildSearch(cnd, "info.");
if (!AuthUtil.hasRoleOr(RoleConstant.SYSADMIN.name(), RoleConstant.SCHOOL_UNION_MEMBER_ADMIN.name())) {
SqlExpressionGroup group = new SqlExpressionGroup();
if (AuthUtil.hasRoleOr(RoleConstant.BRANCH_UNION_CHAIRMAN.name(), RoleConstant.BRANCH_UNION_WENTI_SPORTS.name())) {
group.or("info.unionId", "=", SecurityUtil.getUnionId());
}
if (AuthUtil.hasRole(RoleConstant.CLUB_PRESIDENT.name(), RoleConstant.CLUB_OPERATOR.name())) {
group.or("info.userId", "=", SecurityUtil.getUserId());
}
cnd.and(group);
}
if (StrUtil.isAllBlank(pageParam.getPageOrderName(), pageParam.getPageOrderBy())) {
cnd.desc("info.applyTime");
} else {
cnd.orderBy("info." + pageParam.getPageOrderName(), PageUtil.getOrder(pageParam.getPageOrderBy()));
}
sql.setCondition(cnd);
Pagination<NutMap> pagination = activityDeclareService.listPageMap(pageParam.getPageNumber(), pageParam.getPageSize(), sql);
return Result.success().addData(pagination);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("活动申报,查看活动申报")
@SaCheckPermission("activityDeclare")
public Result findOne(@Valid String id) {
ActivityDeclareInfo info = dao.fetch(ActivityDeclareInfo.class, id);
return Result.success().addData(info);
}
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
@At
@ApiOperation("删除活动申报")
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "删除活动申报id: ${args[0]}")
public Result onDelete(@Valid String id) {
dao.clear(ActivityDeclareInfo.class, Cnd.where("id", "=", id));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
// 如果有报销的流程,也一并删除
ActivityReimbursementInfo reimbursementInfo = dao.fetch(ActivityReimbursementInfo.class, Cnd.where("declareId", "=", id));
if (Lang.isNotEmpty(reimbursementInfo)) {
dao.clear(ActivityReimbursementInfo.class, Cnd.where("id", "=", reimbursementInfo.getId()));
// 删除流程相关
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(reimbursementInfo.getId());
}
return Result.success();
}
@At
@Ok("void")
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
@At
@Ok("void")
@SaCheckPermission("activityDeclare.mine")
@SLog(tag = "活动申报", msg = "导出活动申报表")
public void doExportDeclare(@Valid String id, HttpServletResponse response) {
HashMap<String, Object> docData = new HashMap<>();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
Sql sql = Sqls.create("""
SELECT
info.*,
ins.id AS instanceId
FROM
`activity_declare_info` info
LEFT JOIN wf_process_instance ins ON ins.businessNo = info.id
WHERE
ins.state = 20 AND info.id = @id
""").setParam("id", id);
sql.setCallback(Sqls.callback.map());
dao.execute(sql);
NutMap info = (NutMap) sql.getResult();
String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
String activityContent = info.getString("activityContent");
info.put("activityContent", sysOfficeTemplateUtil.convertRichTextToDocText(activityContent));
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
docData.put("schoolName", Globals.AppName);
docData.put("info", info);
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
List<ProcessTaskVO> doneTaskVos = new ArrayList<>();
List<ProcessTask> doneTaskList = flowEngine.processTaskService().getDoneTaskList(info.getLong("instanceId"), null);
for (ProcessTask doneTask : doneTaskList) {
ProcessTaskVO taskVO = flowEngine.processTaskService().findById(doneTask.getId());
doneTaskVos.add(taskVO);
}
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 分工会审核
doneTaskVos.stream().filter(task -> "分工会审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("fgh", approval);
});
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 协会负责人审核
doneTaskVos.stream().filter(task -> "协会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xh", approval);
});
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 校工会负责人审核
doneTaskVos.stream().filter(task -> "校工会负责人审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xfzr", approval);
});
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
// 校工会主席审核
doneTaskVos.stream().filter(task -> "校工会主席审核".equals(task.getDisplayName()))
.max(Comparator.comparing(ProcessTaskVO::getCreatedAt))
.ifPresent(v -> {
Dict taskFormData = v.getTaskFormData();
HashMap<String, Object> approval = new HashMap<>();
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
approval.put("date", DateUtil.format(v.getFinishTime(), "yyyy年MM月dd日"));
approval.put("user", taskFormData.getStr("tf_userName"));
if (StrUtil.isNotBlank(taskFormData.getStr("tf_sign"))) {
approval.put("sign", sysOfficeTemplateUtil.createPictureRenderData(taskFormData.getStr("tf_sign")));
}
approval.put("opinion", taskFormData.getStr("tf_opinion"));
docData.put("xzx", approval);
});
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
String budgetsStr = info.getString("budgets");
List<ActivityBudgetVO> list = JSONUtil.parseArray(budgetsStr).toList(ActivityBudgetVO.class);
for (int i = 0; i < list.size(); i++) {
list.get(i).setRanking(i + 1);
}
docData.put("budgets", list);
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
LoopRowTableRenderPolicy policy = new LoopRowTableRenderPolicy();
Configure config = Configure.builder()
.bind("budgets", policy)
.build();
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
String fileName = Globals.AppName + "" + info.getString("activityName") + "】申报表.docx";
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) {
XWPFTemplate.compile(sysOfficeTemplateUtil.getTemplate("activity_declare"), config).render(docData).writeAndClose(byteArrayOutputStream);
CommonDownloadUtil.download(fileName, byteArrayOutputStream.toByteArray(), response);
} catch (IOException e) {
log.error("活动申报表导出失败,id:{},错误信息:{}", id, e.getMessage());
}
}
}
+21 -18
View File
@@ -67,15 +67,15 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-header {
padding: 0 0 20px 0;
padding: 0 0 10px 0;
border-bottom: 1px solid #eee;
margin-bottom: 20px;
margin-bottom: 10px;
}
.apps-search-container {
display: flex;
align-items: center;
margin-bottom: 20px;
/*margin-bottom: 20px;*/
}
.apps-search {
@@ -103,13 +103,16 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-filter {
margin-top: 20px;
margin-top: 10px;
display: flex;
align-items: flex-end;
}
.apps-filter-title {
color: #666;
font-size: 14px;
margin-bottom: 5px;
margin-right: 5px;
}
.apps-filter-tags {
@@ -356,20 +359,20 @@ layout("/layouts/v4/baseLayout.html"){
</div>
<!-- 字母过滤 -->
<!-- <div class="apps-filter">-->
<!-- <div class="apps-filter-title">首字母:</div>-->
<!-- <div class="apps-filter-tags alphabet-filter">-->
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>-->
<!-- <div-->
<!-- v-for="letter in alphabets"-->
<!-- :key="letter"-->
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"-->
<!-- @click="changeAlphabet(letter)"-->
<!-- >-->
<!-- {{ letter }}-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="apps-filter">
<div class="apps-filter-title">首字母:</div>
<div class="apps-filter-tags alphabet-filter">
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">全部</div>
<div
v-for="letter in alphabets"
:key="letter"
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
@click="changeAlphabet(letter)"
>
{{ letter }}
</div>
</div>
</div>
</div>
<!-- 应用网格 -->
@@ -71,7 +71,7 @@
<script src="https://vxeui.com/umd/xe-utils@3.5.30/dist/xe-utils.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-pc-ui@3.1.25/lib/index.umd.min.js"></script>
<script src="https://vxeui.com/umd/vxe-table@3.9.0/lib/index.umd.min.js"></script>
l
<!-- 引入 form-create 和 designer -->
<script src="${base!}/assets/platform/plugins/form-create/form-create.min.js"></script>
<script src="${base!}/assets/platform/plugins/form-create/index.umd.js"></script>
@@ -80,7 +80,7 @@
<script src="${base!}/assets/platform/plugins/swiper/swiper-bundle.js"></script>
<link rel="stylesheet" href="${base!}/assets/platform/plugins/swiper/swiper-bundle.min.css"></link>
<!-- <script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.min.js"></script>-->
<!--<script src="${base!}/assets/platform/plugins/snaker/SnakerflowDesigner.umd.js"></script>-->
<script src="${base!}/components/plugins/sysDict/DictData.js"></script>
<script src="${base!}/assets/platform/js/util/commonUtil.js"></script>
@@ -351,6 +351,16 @@
Vue.prototype.$auth = commonUtil.authService()
Vue.prototype.$axios = commonUtil.axiosService()
Vue.prototype.$downLoad = commonUtil.downLoadService
Vue.prototype.$processStatusMap = {
10: {text: "进行中", class: "doing"},
20: {text: "已完成", class: "finished"},
30: {text: "已撤回", class: "withdraw"},
40: {text: "强行终止", class: "interrupt"},
45: {text: "已拒绝", class: "reject"},
50: {text: "挂起", class: "pending"},
99: {text: "已废弃", class: "abandon"}
}
</script>
<!--vue全局组件-->
@@ -676,7 +686,7 @@
</a>
</div>
</header>
<div style="height: 45px"></div>
<div style="height: 64px"></div>
<main class="v4-content">
<!-- 页面内容区域 -->
+23 -20
View File
@@ -63,15 +63,15 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-header {
padding: 0 0 20px 0;
padding: 0 0 10px 0;
border-bottom: 1px solid #eee;
margin-bottom: 20px;
margin-bottom: 10px;
}
.apps-search-container {
display: flex;
align-items: center;
margin-bottom: 20px;
/*margin-bottom: 20px;*/
}
.apps-search {
@@ -99,13 +99,16 @@ layout("/layouts/v4/baseLayout.html"){
}
.apps-filter {
margin-top: 20px;
margin-top: 10px;
display: flex;
align-items: flex-end;
}
.apps-filter-title {
color: #666;
font-size: 14px;
margin-bottom: 5px;
margin-right: 5px;
}
.apps-filter-tags {
@@ -351,22 +354,22 @@ layout("/layouts/v4/baseLayout.html"){
</div>
<!-- 字母过滤 -->
<!-- <div class="apps-filter">-->
<!-- <div class="apps-filter-title">首字母:</div>-->
<!-- <div class="apps-filter-tags alphabet-filter">-->
<!-- <div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">-->
<!-- 全部-->
<!-- </div>-->
<!-- <div-->
<!-- v-for="letter in alphabets"-->
<!-- :key="letter"-->
<!-- :class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"-->
<!-- @click="changeAlphabet(letter)"-->
<!-- >-->
<!-- {{ letter }}-->
<!-- </div>-->
<!-- </div>-->
<!-- </div>-->
<div class="apps-filter">
<div class="apps-filter-title">首字母:</div>
<div class="apps-filter-tags alphabet-filter">
<div :class="['filter-tag', activeAlphabet === '' ? 'active' : '']" @click="changeAlphabet('')">
全部
</div>
<div
v-for="letter in alphabets"
:key="letter"
:class="['alphabet-item', activeAlphabet === letter ? 'active' : '']"
@click="changeAlphabet(letter)"
>
{{ letter }}
</div>
</div>
</div>
</div>
<!-- 应用网格 -->
@@ -59,6 +59,10 @@
</head>
<body>
<div id="app" v-cloak>
<van-notice-bar
left-icon="volume-o"
text="请选择完文件后,一次性上传。"
></van-notice-bar>
<h1>文件上传</h1>
<van-uploader
v-model="fileList"
@@ -1,6 +1,13 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style>
.write-dialog .el-dialog__body {
padding: 0;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
@@ -219,8 +226,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog>
</div>
@@ -1,6 +1,6 @@
const write = {
template: /*language=HTML*/ `
<div class="container-x1">
<div class="container-x1" style="padding: 0">
<div class="form-container">
<header class="header-x">
@@ -59,140 +59,132 @@ const write = {
>
<div class="form-section">
<h3 class="section-title">基本信息</h3>
<div class="form-grid">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="工号" prop="loginName">
<el-input v-model="formData.loginName" readonly></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label=""></el-radio>
<el-radio border label="女">女</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
v-model="formData.birthday"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 100%"
></el-date-picker>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族"
code="USER_NATION"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="政治面貌" prop="political">
<el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属工会">
<el-input
v-model="formData.unionName"
readonly
placeholder="请输入所属工会"
clearable
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="所属单位">
<el-input
v-model="formData.unitName"
readonly
placeholder="请输入所属单位"
clearable
></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="职称" prop="professionalTitle">
<dict-select v-model="formData.professionalTitle" style="width: 100%"
placeholder="请选择职称"
code="technical_title_level"></dict-select>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否聘用制" prop="employ">
<el-radio-group v-model="formData.employ" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否高级职称" prop="seniorTeacher">
<el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio border :label="true"></el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<div class="form-grid custom-grid">
<div class="grid-item">
<el-form-item label="姓名" prop="userName">
<el-input v-model="formData.userName" readonly></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="工号" prop="loginName">
<el-input v-model="formData.loginName" readonly></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="性别" prop="sex">
<el-radio-group v-model="formData.sex" size="small">
<el-radio border label="男">男</el-radio>
<el-radio border label=""></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="出生年月" prop="birthday">
<el-date-picker
v-model="formData.birthday"
type="date"
placeholder="选择日期"
value-format="yyyy-MM-dd"
style="width: 100%"
></el-date-picker>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="民族" prop="nation">
<dict-select v-model="formData.nation" style="width: 100%"
placeholder="请选择民族"
code="USER_NATION"></dict-select>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="政治面貌" prop="political">
<el-input maxlength="100" placeholder="政治面貌"
v-model="formData.political"></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="所属工会">
<el-input
v-model="formData.unionName"
readonly
placeholder="请输入所属工会"
clearable
></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="所属单位">
<el-input
v-model="formData.unitName"
readonly
placeholder="请输入所属单位"
clearable
></el-input>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="职称" prop="professionalTitle">
<dict-select v-model="formData.professionalTitle" style="width: 100%"
placeholder="请选择职称"
code="technical_title_level"></dict-select>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否聘用制" prop="employ">
<el-radio-group v-model="formData.employ" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否高级职称" prop="seniorTeacher">
<el-radio-group v-model="formData.seniorTeacher" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false"></el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否中级职称及以下" prop="intermediateBelow">
<el-radio-group v-model="formData.intermediateBelow" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否干部" prop="cadre">
<el-radio-group v-model="formData.cadre" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="是否工人" prop="worker">
<el-radio-group v-model="formData.worker" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="校级领导" prop="schoolLeader">
<el-radio-group v-model="formData.schoolLeader" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</div>
<div class="grid-item">
<el-form-item label="中层领导" prop="middleLevelLeader">
<el-radio-group v-model="formData.middleLevelLeader" size="small">
<el-radio border :label="true">是</el-radio>
<el-radio border :label="false">否</el-radio>
</el-radio-group>
</el-form-item>
</div>
</div>
<div class="form-grid">
@@ -206,7 +198,7 @@ const write = {
</div>
</div>
<div v-if="formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
<div v-if="!dialog && formData && ['53ff0c2a-ba93-45e9-a9fd-db51cdab3080','97b0846b-22c6-4d34-9002-a6b67d592944'].includes(formData.taskKey)"
class="form-actions">
<el-button @click="onSave">保存草稿</el-button>
<el-button type="primary" @click="onSubmit">提交信息</el-button>
@@ -270,7 +262,12 @@ const write = {
type: Boolean,
required: false,
default: false
}
},
dialog: {
type: Boolean,
required: false,
default: null
},
},
data() {
return {
@@ -628,6 +625,19 @@ const write = {
::v-deep .hidden {
display: none !important;
}
::v-deep .custom-grid {
display: flex;
flex-wrap: wrap;
gap: 16px;
margin: 0 -8px 16px;
}
::v-deep .grid-item {
flex: 1 1 calc(50% - 16px);
min-width: 200px; /* 防止在窄屏过度压缩 */
padding: 0 8px;
}
`
}
@@ -142,8 +142,13 @@ layout("/layouts/platform.html"){
<div style="max-height: 75vh;overflow-y: auto">
<formal-write ref="formalWriteRef" :is_read="isRead" :user_id="userId"
:session_id="pageForm.sessionId"
:dialog="true"
@refresh="writeDialog=false;doSearch()"></formal-write>
</div>
<div slot="footer" class="dialog-footer">
<el-button @click="$refs.formalWriteRef.onSave()">保存草稿</el-button>
<el-button type="primary" @click="$refs.formalWriteRef.onSubmit()">提交信息</el-button>
</div>
</el-dialog>