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