This commit is contained in:
=
2026-06-10 09:59:45 +08:00
13 changed files with 1600 additions and 13 deletions
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.appeal.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.Dict;
@@ -49,8 +50,14 @@ public class AppealAcceptController {
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/appeal/accept/index.html")
@SaCheckPermission("h5.appeal.accept")
public void h5Index() {
}
@At
@SaCheckPermission("appeal.accept")
@SaCheckPermission(value = {"appeal.accept", "h5.appeal.accept"}, mode = SaMode.OR)
public Result pageData(Integer pageNumber, Integer pageSize, String searchKeyword, String appealTypeId,
Integer year, boolean approval) {
Sql sql = listSql();
@@ -68,7 +75,7 @@ public class AppealAcceptController {
}
@At
@SaCheckPermission("appeal.accept")
@SaCheckPermission(value = {"appeal.accept", "h5.appeal.accept"}, mode = SaMode.OR)
@ApiOperation("查询受理任务")
public Result queryTask(@Param("taskId") Long taskId) {
Sql sql = listSql();
@@ -77,7 +84,7 @@ public class AppealAcceptController {
}
@At
@SaCheckPermission("appeal.accept")
@SaCheckPermission(value = {"appeal.accept", "h5.appeal.accept"}, mode = SaMode.OR)
@ApiOperation("受理申诉")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "申诉管理-受理", msg = "受理申诉")
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.appeal.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.bean.copier.CopyOptions;
import cn.hutool.core.lang.Dict;
@@ -49,8 +50,14 @@ public class AppealExecuteController {
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/appeal/execute/index.html")
@SaCheckPermission("h5.appeal.execute")
public void h5Index() {
}
@At
@SaCheckPermission("appeal.execute")
@SaCheckPermission(value = {"appeal.execute", "h5.appeal.execute"}, mode = SaMode.OR)
public Result pageData(Integer pageNumber, Integer pageSize, String searchKeyword, String appealTypeId,
Integer year, boolean approval) {
Sql sql = listSql();
@@ -68,7 +75,7 @@ public class AppealExecuteController {
}
@At
@SaCheckPermission("appeal.execute")
@SaCheckPermission(value = {"appeal.execute", "h5.appeal.execute"}, mode = SaMode.OR)
@ApiOperation("查询执行任务")
public Result queryTask(@Param("taskId") Long taskId) {
Sql sql = listSql();
@@ -77,7 +84,7 @@ public class AppealExecuteController {
}
@At
@SaCheckPermission("appeal.execute")
@SaCheckPermission(value = {"appeal.execute", "h5.appeal.execute"}, mode = SaMode.OR)
@ApiOperation("提交执行情况")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "申诉管理-执行", msg = "提交执行情况")
@@ -0,0 +1,19 @@
package com.budwk.app.zhgh.democratic.appeal.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import io.swagger.annotations.Api;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
@IocBean
@At("/platform/appeal")
@Api("申诉管理-H5入口")
public class AppealH5Controller {
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/appeal/index.html")
@SaCheckPermission("h5.appeal")
public void h5Index() {
}
}
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.appeal.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
@@ -38,8 +39,14 @@ public class AppealMineController {
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/appeal/mine/index.html")
@SaCheckPermission("h5.appeal.mine")
public void h5Index() {
}
@At
@SaCheckPermission("appeal.mine")
@SaCheckPermission(value = {"appeal.mine", "h5.appeal.mine"}, mode = SaMode.OR)
public Result pageData(Integer pageNumber, Integer pageSize, String searchKeyword, String appealTypeId, Integer year) {
Sql sql = Sqls.create("""
SELECT
@@ -72,7 +79,7 @@ public class AppealMineController {
}
@At
@SaCheckPermission("appeal.mine")
@SaCheckPermission(value = {"appeal.mine", "h5.appeal.mine"}, mode = SaMode.OR)
@Aop(TransAop.READ_COMMITTED)
@ApiOperation("删除申诉")
public Result delete(@Param("id") String id) {
@@ -1,6 +1,7 @@
package com.budwk.app.zhgh.democratic.appeal.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.dev33.satoken.annotation.SaMode;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
@@ -57,8 +58,14 @@ public class AppealWriteController {
public void index() {
}
@At("/h5")
@Ok("beetl:/platform/zhghh5/democratic/appeal/write/index.html")
@SaCheckPermission("h5.appeal.write")
public void h5Index() {
}
@At
@SaCheckPermission("appeal.write")
@SaCheckPermission(value = {"appeal.write", "h5.appeal.write"}, mode = SaMode.OR)
@ApiOperation("当前用户信息")
public Result currentUserInfo() {
View_user user = dao.fetch(View_user.class, Cnd.where("id", "=", SecurityUtil.getUserId()));
@@ -85,14 +92,14 @@ public class AppealWriteController {
}
@At
@SaCheckPermission("appeal.write")
@SaCheckPermission(value = {"appeal.write", "h5.appeal.write"}, mode = SaMode.OR)
@ApiOperation("获取申诉信息")
public Result info(@Param("id") String id) {
return Result.success(appealInfoService.fetch(id));
}
@At
@SaCheckPermission("appeal.write")
@SaCheckPermission(value = {"appeal.write", "h5.appeal.write"}, mode = SaMode.OR)
@ApiOperation("保存申诉")
@SLog(tag = "申诉管理-提交申诉", msg = "保存申诉")
public Result save(@Param("data") AppealInfo appealInfo) {
@@ -102,7 +109,7 @@ public class AppealWriteController {
}
@At
@SaCheckPermission("appeal.write")
@SaCheckPermission(value = {"appeal.write", "h5.appeal.write"}, mode = SaMode.OR)
@ApiOperation("提交申诉")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "申诉管理-提交申诉", msg = "提交申诉")
@@ -130,7 +137,7 @@ public class AppealWriteController {
}
@At
@SaCheckPermission("appeal.write")
@SaCheckPermission(value = {"appeal.write", "h5.appeal.write"}, mode = SaMode.OR)
@ApiOperation("重新提交申诉")
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "申诉管理-提交申诉", msg = "重新提交申诉")
@@ -0,0 +1,330 @@
-- 申诉管理初始化脚本
-- 说明:本脚本依赖系统基础表 sys_menu、sys_role 已存在;如 sys_role_menu 不存在会自动创建。
SET @now := CAST(UNIX_TIMESTAMP(NOW()) * 1000 AS UNSIGNED);
CREATE TABLE IF NOT EXISTS `appeal_type` (
`id` varchar(32) NOT NULL COMMENT 'ID',
`name` varchar(100) DEFAULT NULL COMMENT '类型名称',
`sort` int DEFAULT 0 COMMENT '排序',
`enabled` tinyint(1) DEFAULT 1 COMMENT '是否启用',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`createdBy` varchar(32) DEFAULT NULL COMMENT '创建人',
`createdAt` bigint DEFAULT NULL COMMENT '创建时间',
`updatedBy` varchar(32) DEFAULT NULL COMMENT '修改人',
`updatedAt` bigint DEFAULT NULL COMMENT '修改时间',
`delFlag` tinyint(1) DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `INDEX_APPEAL_TYPE_ENABLED` (`enabled`),
KEY `INDEX_APPEAL_TYPE_SORT` (`sort`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='申诉类型';
CREATE TABLE IF NOT EXISTS `appeal_info` (
`id` varchar(32) NOT NULL COMMENT 'ID',
`userId` varchar(32) DEFAULT NULL COMMENT '申诉人ID',
`userName` varchar(50) DEFAULT NULL COMMENT '申诉人姓名',
`loginName` varchar(50) DEFAULT NULL COMMENT '申诉人工号',
`sex` varchar(20) DEFAULT NULL COMMENT '性别',
`birthday` date DEFAULT NULL COMMENT '出生年月',
`political` varchar(100) DEFAULT NULL COMMENT '政治面貌',
`unitId` varchar(32) DEFAULT NULL COMMENT '所在单位ID',
`unitName` varchar(100) DEFAULT NULL COMMENT '所在单位',
`positionName` varchar(100) DEFAULT NULL COMMENT '岗位',
`address` varchar(300) DEFAULT NULL COMMENT '住址',
`mobile` varchar(100) DEFAULT NULL COMMENT '联系方式',
`appealTypeId` varchar(32) DEFAULT NULL COMMENT '申诉类型ID',
`appealTypeName` varchar(100) DEFAULT NULL COMMENT '申诉类型名称',
`defendantUnitId` varchar(32) DEFAULT NULL COMMENT '被申诉单位ID',
`defendantUnitName` varchar(100) DEFAULT NULL COMMENT '被申诉单位',
`defendantAddress` varchar(300) DEFAULT NULL COMMENT '被申诉单位地址',
`defendantContact` varchar(100) DEFAULT NULL COMMENT '被申诉单位联系方式',
`title` varchar(200) DEFAULT NULL COMMENT '申诉标题',
`appealMatter` text COMMENT '申诉事项',
`reason` text COMMENT '申诉理由',
`request` text COMMENT '申诉要求',
`applyDate` date DEFAULT NULL COMMENT '申请日期',
`signature` varchar(255) DEFAULT NULL COMMENT '申诉人签名',
`files` json COMMENT '附件',
`state` varchar(50) DEFAULT NULL COMMENT '业务状态',
`acceptUserId` varchar(32) DEFAULT NULL COMMENT '受理人ID',
`acceptUserName` varchar(50) DEFAULT NULL COMMENT '受理人姓名',
`acceptTime` datetime DEFAULT NULL COMMENT '受理时间',
`decisionContent` text COMMENT '处理决定',
`legalBasis` text COMMENT '事实理由及适用依据',
`decisionDate` date DEFAULT NULL COMMENT '作出决定日期',
`decisionFiles` json COMMENT '决定书附件',
`executeUserId` varchar(32) DEFAULT NULL COMMENT '执行人ID',
`executeUserName` varchar(50) DEFAULT NULL COMMENT '执行人姓名',
`executeTime` datetime DEFAULT NULL COMMENT '执行时间',
`executeContent` text COMMENT '执行情况',
`executeFiles` json COMMENT '执行附件',
`createdBy` varchar(32) DEFAULT NULL COMMENT '创建人',
`createdAt` bigint DEFAULT NULL COMMENT '创建时间',
`updatedBy` varchar(32) DEFAULT NULL COMMENT '修改人',
`updatedAt` bigint DEFAULT NULL COMMENT '修改时间',
`delFlag` tinyint(1) DEFAULT 0 COMMENT '删除标记',
PRIMARY KEY (`id`),
KEY `INDEX_APPEAL_INFO_USER` (`userId`),
KEY `INDEX_APPEAL_INFO_UNIT` (`unitId`),
KEY `INDEX_APPEAL_INFO_TYPE` (`appealTypeId`),
KEY `INDEX_APPEAL_INFO_DEFENDANT_UNIT` (`defendantUnitId`),
KEY `INDEX_APPEAL_INFO_STATE` (`state`),
KEY `INDEX_APPEAL_INFO_APPLY_DATE` (`applyDate`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='教职工申诉';
CREATE TABLE IF NOT EXISTS `sys_role_menu` (
`roleId` varchar(32) NOT NULL,
`menuId` varchar(32) NOT NULL,
KEY `INDEX_SYS_ROLE_MENU_ROLE` (`roleId`),
KEY `INDEX_SYS_ROLE_MENU_MENU` (`menuId`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='角色菜单关系';
INSERT INTO `sys_role` (`id`, `name`, `code`, `aliasName`, `disabled`, `unitid`, `note`, `sort`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c002000000000000000000000001', '申诉处理委员会成员', 'APPEAL_COMMITTEE_MEMBER', 'AppealCommitteeMember', 0, NULL, '申诉受理环节处理角色', 60, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `sys_role` WHERE `code` = 'APPEAL_COMMITTEE_MEMBER');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000001', '', '9901', '申诉管理', 'Appeal', 'menu', '', '', 'ti-comments', 1, 0, 'appeal', NULL, 9901, 1, '', @now, '', @now, 0, 'PC'
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal' OR `path` = '9901');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000002', parent.`id`, '99010001', '申诉类型', 'AppealType', 'menu', '/platform/appeal/type', 'data-pjax', '', 1, 0, 'appeal.type', NULL, 990101, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.type' OR `path` = '99010001');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000003', parent.`id`, '99010002', '提交申诉', 'AppealWrite', 'menu', '/platform/appeal/write', 'data-pjax', '', 1, 0, 'appeal.write', NULL, 990102, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.write' OR `path` = '99010002');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000004', parent.`id`, '99010003', '我的申诉', 'AppealMine', 'menu', '/platform/appeal/mine', 'data-pjax', '', 1, 0, 'appeal.mine', NULL, 990103, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.mine' OR `path` = '99010003');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000005', parent.`id`, '99010004', '申诉受理', 'AppealAccept', 'menu', '/platform/appeal/accept', 'data-pjax', '', 1, 0, 'appeal.accept', NULL, 990104, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.accept' OR `path` = '99010004');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000006', parent.`id`, '99010005', '申诉执行', 'AppealExecute', 'menu', '/platform/appeal/execute', 'data-pjax', '', 1, 0, 'appeal.execute', NULL, 990105, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.execute' OR `path` = '99010005');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `aliasName`, `type`, `href`, `target`, `icon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`)
SELECT 'a0e9c001000000000000000000000007', parent.`id`, '99010006', '查询统计', 'AppealQuery', 'menu', '/platform/appeal/query', 'data-pjax', '', 1, 0, 'appeal.query', NULL, 990106, 0, '', @now, '', @now, 0, 'PC'
FROM `sys_menu` parent
WHERE parent.`permission` = 'appeal'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'appeal.query' OR `path` = '99010006');
UPDATE `sys_menu`
SET `platform` = 'PC'
WHERE `permission` IN ('appeal', 'appeal.type', 'appeal.write', 'appeal.mine', 'appeal.accept', 'appeal.execute', 'appeal.query')
AND (`platform` IS NULL OR `platform` = '');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000001', '处分', 1, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '处分');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000002', '岗位聘用', 2, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '岗位聘用');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000003', '撤销奖励', 3, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '撤销奖励');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000004', '考核结果定为基本合格或不合格', 4, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '考核结果定为基本合格或不合格');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000005', '未按国家规定确定或扣减工资福利待遇', 5, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '未按国家规定确定或扣减工资福利待遇');
INSERT INTO `appeal_type` (`id`, `name`, `sort`, `enabled`, `remark`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c003000000000000000000000006', '法律法规和规章制度规定可以提出申诉的其他事项', 6, 1, NULL, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `appeal_type` WHERE `name` = '法律法规和规章制度规定可以提出申诉的其他事项');
/* todo 系统上线时手动录入工作流程
INSERT INTO `wf_process_category` (`id`, `name`, `picIcon`, `icon`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c004000000000000000000000001', '申诉管理', NULL, 'ti-comments', '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `wf_process_category` WHERE `id` = 'a0e9c004000000000000000000000001' OR `name` = '申诉管理');
SET @appeal_flow_json := '{
"name": "SSGL",
"displayName": "申诉管理",
"type": "appeal",
"category": "a0e9c004000000000000000000000001",
"description": "教职工申诉审核流程",
"instanceUrl": "/platform/appeal/write",
"instanceViewUrl": "/platform/appeal/mine",
"nodes": [
{
"id": "startTask",
"type": "snaker:start",
"x": 120,
"y": 160,
"text": {"value": "提交申诉"},
"properties": {"width": 90, "height": 50}
},
{
"id": "appealAccept",
"type": "snaker:task",
"x": 330,
"y": 160,
"text": {"value": "受理"},
"properties": {
"width": 120,
"height": 60,
"form": "/platform/appeal/accept",
"taskType": 0,
"performType": 0,
"assignmentHandler": "com.budwk.app.flow.handler.FlowAppealCommitteeAssignmentHandler"
}
},
{
"id": "appealExecute",
"type": "snaker:task",
"x": 560,
"y": 160,
"text": {"value": "执行"},
"properties": {
"width": 120,
"height": 60,
"form": "/platform/appeal/execute",
"taskType": 0,
"performType": 0,
"assignmentHandler": "com.budwk.app.flow.handler.FlowAppealDefendantUnitAssignmentHandler"
}
},
{
"id": "endTask",
"type": "snaker:end",
"x": 780,
"y": 160,
"text": {"value": "结束"},
"properties": {"width": 90, "height": 50}
}
],
"edges": [
{
"id": "edge_start_accept",
"type": "polyline",
"sourceNodeId": "startTask",
"targetNodeId": "appealAccept",
"properties": {},
"text": {"value": ""},
"startPoint": {"x": 165, "y": 160},
"endPoint": {"x": 270, "y": 160},
"pointsList": [{"x": 165, "y": 160}, {"x": 270, "y": 160}]
},
{
"id": "edge_accept_execute",
"type": "polyline",
"sourceNodeId": "appealAccept",
"targetNodeId": "appealExecute",
"properties": {"expr": "#submitType==1"},
"text": {"value": "受理"},
"startPoint": {"x": 390, "y": 160},
"endPoint": {"x": 500, "y": 160},
"pointsList": [{"x": 390, "y": 160}, {"x": 500, "y": 160}]
},
{
"id": "edge_accept_end",
"type": "polyline",
"sourceNodeId": "appealAccept",
"targetNodeId": "endTask",
"properties": {"expr": "#submitType==2"},
"text": {"value": "不予受理"},
"startPoint": {"x": 330, "y": 220},
"endPoint": {"x": 780, "y": 220},
"pointsList": [{"x": 330, "y": 220}, {"x": 780, "y": 220}, {"x": 780, "y": 185}]
},
{
"id": "edge_execute_end",
"type": "polyline",
"sourceNodeId": "appealExecute",
"targetNodeId": "endTask",
"properties": {},
"text": {"value": ""},
"startPoint": {"x": 620, "y": 160},
"endPoint": {"x": 735, "y": 160},
"pointsList": [{"x": 620, "y": 160}, {"x": 735, "y": 160}]
}
]
}';
INSERT INTO `wf_process_define` (`name`, `displayName`, `type`, `category`, `instanceUrl`, `instanceViewUrl`, `icon`, `state`, `content`, `version`, `pinyinName`, `description`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'SSGL', '申诉管理', 'appeal', 'a0e9c004000000000000000000000001', '/platform/appeal/write', '/platform/appeal/mine', 'ti-comments', 1, @appeal_flow_json, 1, 'S', '教职工申诉审核流程', '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `wf_process_define` WHERE `name` = 'SSGL');
UPDATE `wf_process_define`
SET `state` = 1,
`type` = 'appeal',
`category` = 'a0e9c004000000000000000000000001',
`pinyinName` = 'S',
`icon` = 'ti-comments',
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND (`state` IS NULL OR `state` <> 1 OR IFNULL(`type`, '') <> 'appeal' OR IFNULL(`category`, '') <> 'a0e9c004000000000000000000000001' OR IFNULL(`pinyinName`, '') <> 'S' OR IFNULL(`icon`, '') <> 'ti-comments');
UPDATE `wf_process_define`
SET `content` = @appeal_flow_json,
`displayName` = IFNULL(`displayName`, '申诉管理'),
`instanceUrl` = IFNULL(`instanceUrl`, '/platform/appeal/write'),
`instanceViewUrl` = IFNULL(`instanceViewUrl`, '/platform/appeal/mine'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND (`content` IS NULL OR `content` = '');*/
/*
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('appeal', 'appeal.write', 'appeal.mine')
WHERE r.`code` = 'MEMBER'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('appeal', 'appeal.accept', 'appeal.query')
WHERE r.`code` = 'APPEAL_COMMITTEE_MEMBER'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('appeal', 'appeal.execute', 'appeal.query')
WHERE r.`code` = 'BRANCH_UNION_ADMIN'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('appeal', 'appeal.type', 'appeal.write', 'appeal.mine', 'appeal.accept', 'appeal.execute', 'appeal.query')
WHERE r.`code` IN ('SYSADMIN', 'SCHOOL_UNION_ADMIN', 'SCHOOL_UNION_DC_ADMIN')
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
*/
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('appeal', 'appeal.type', 'appeal.write', 'appeal.mine', 'appeal.accept', 'appeal.execute', 'appeal.query')
WHERE r.`code` IN ('SYSADMIN')
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
@@ -0,0 +1,146 @@
-- 申诉管理手机端初始化脚本
-- 说明:PC端申诉模块已部署时,只需要执行本脚本新增手机端入口和权限。
SET @now := CAST(UNIX_TIMESTAMP(NOW()) * 1000 AS UNSIGNED);
INSERT INTO `sys_module` (`id`, `platform`, `name`, `icon`, `faIcon`, `sortNum`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`)
SELECT 'a0e9c005000000000000000000000001', 'H5', '民主管理', NULL, 'ti-comments', 9901, '', @now, '', @now, 0
FROM DUAL
WHERE NOT EXISTS (SELECT 1 FROM `sys_module` WHERE `id` = 'a0e9c005000000000000000000000001' OR (`platform` = 'H5' AND `name` = '民主管理'));
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `initialPinyinName`, `aliasName`, `type`, `href`, `target`, `icon`, `picIcon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`, `moduleId`, `isRecommendApp`, `isRecommendService`)
SELECT 'a0e9c006000000000000000000000001', '', 'H9901', '申诉管理', 'S', 'AppealH5', 'menu', '/platform/appeal/h5', 'data-pjax', 'comment-o', NULL, 1, 0, 'h5.appeal', NULL, 9901, 1, '', @now, '', @now, 0, 'H5', module.`id`, 0, 1
FROM `sys_module` module
WHERE module.`platform` = 'H5'
AND module.`name` = '民主管理'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'h5.appeal' OR `path` = 'H9901');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `initialPinyinName`, `aliasName`, `type`, `href`, `target`, `icon`, `picIcon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`, `moduleId`, `isRecommendApp`, `isRecommendService`)
SELECT 'a0e9c006000000000000000000000002', 'a0e9c006000000000000000000000001', 'H9901H9902', '提交申诉', 'T', 'AppealWriteH5', 'menu', '/platform/appeal/write/h5', 'data-pjax', 'edit', NULL, 1, 0, 'h5.appeal.write', NULL, 9902, 0, '', @now, '', @now, 0, 'H5', module.`id`, 0, 0
FROM `sys_module` module
WHERE module.`platform` = 'H5'
AND module.`name` = '民主管理'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'h5.appeal.write' OR `path` = 'H9902');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `initialPinyinName`, `aliasName`, `type`, `href`, `target`, `icon`, `picIcon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`, `moduleId`, `isRecommendApp`, `isRecommendService`)
SELECT 'a0e9c006000000000000000000000003', 'a0e9c006000000000000000000000001', 'H9901H9903', '我的申诉', 'W', 'AppealMineH5', 'menu', '/platform/appeal/mine/h5', 'data-pjax', 'records', NULL, 1, 0, 'h5.appeal.mine', NULL, 9903, 0, '', @now, '', @now, 0, 'H5', module.`id`, 0, 0
FROM `sys_module` module
WHERE module.`platform` = 'H5'
AND module.`name` = '民主管理'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'h5.appeal.mine' OR `path` = 'H9903');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `initialPinyinName`, `aliasName`, `type`, `href`, `target`, `icon`, `picIcon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`, `moduleId`, `isRecommendApp`, `isRecommendService`)
SELECT 'a0e9c006000000000000000000000004', 'a0e9c006000000000000000000000001', 'H9901H9904', '申诉受理', 'S', 'AppealAcceptH5', 'menu', '/platform/appeal/accept/h5', 'data-pjax', 'todo-list-o', NULL, 1, 0, 'h5.appeal.accept', NULL, 9904, 0, '', @now, '', @now, 0, 'H5', module.`id`, 0, 0
FROM `sys_module` module
WHERE module.`platform` = 'H5'
AND module.`name` = '民主管理'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'h5.appeal.accept' OR `path` = 'H9904');
INSERT INTO `sys_menu` (`id`, `parentId`, `path`, `name`, `initialPinyinName`, `aliasName`, `type`, `href`, `target`, `icon`, `picIcon`, `showit`, `disabled`, `permission`, `note`, `location`, `hasChildren`, `createdBy`, `createdAt`, `updatedBy`, `updatedAt`, `delFlag`, `platform`, `moduleId`, `isRecommendApp`, `isRecommendService`)
SELECT 'a0e9c006000000000000000000000005', 'a0e9c006000000000000000000000001', 'H9901H9905', '申诉执行', 'S', 'AppealExecuteH5', 'menu', '/platform/appeal/execute/h5', 'data-pjax', 'passed', NULL, 1, 0, 'h5.appeal.execute', NULL, 9905, 0, '', @now, '', @now, 0, 'H5', module.`id`, 0, 0
FROM `sys_module` module
WHERE module.`platform` = 'H5'
AND module.`name` = '民主管理'
AND NOT EXISTS (SELECT 1 FROM `sys_menu` WHERE `permission` = 'h5.appeal.execute' OR `path` = 'H9905');
UPDATE `sys_menu`
SET `href` = '/platform/appeal/h5',
`hasChildren` = 1,
`isRecommendService` = 1,
`updatedAt` = @now
WHERE `permission` = 'h5.appeal';
UPDATE `sys_menu`
SET `parentId` = 'a0e9c006000000000000000000000001',
`path` = CONCAT('H9901', RIGHT(`path`, 5)),
`isRecommendService` = 0,
`updatedAt` = @now
WHERE `permission` IN ('h5.appeal.write', 'h5.appeal.mine', 'h5.appeal.accept', 'h5.appeal.execute');
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('h5.appeal', 'h5.appeal.write', 'h5.appeal.mine', 'h5.appeal.accept', 'h5.appeal.execute')
WHERE r.`code` = 'SYSADMIN'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('h5.appeal', 'h5.appeal.write', 'h5.appeal.mine')
WHERE r.`code` IN ('SYSADMIN', 'MEMBER')
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('h5.appeal', 'h5.appeal.accept', 'h5.appeal.execute')
WHERE r.`code` = 'APPEAL_COMMITTEE_MEMBER'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);
/* 分工会管理员不需要权限
INSERT INTO `sys_role_menu` (`roleId`, `menuId`)
SELECT r.`id`, m.`id`
FROM `sys_role` r
JOIN `sys_menu` m ON m.`permission` IN ('h5.appeal', 'h5.appeal.execute')
WHERE r.`code` = 'BRANCH_UNION_ADMIN'
AND NOT EXISTS (SELECT 1 FROM `sys_role_menu` rm WHERE rm.`roleId` = r.`id` AND rm.`menuId` = m.`id`);*/
UPDATE `wf_process_define`
SET `content` = REPLACE(`content`, '"form": "/platform/appeal/accept",', '"form": "/platform/appeal/accept", "h5form": "/platform/appeal/accept/h5",'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND `content` LIKE '%"id": "appealAccept"%'
AND `content` LIKE '%"form": "/platform/appeal/accept"%'
AND `content` NOT LIKE '%"h5form": "/platform/appeal/accept/h5"%';
UPDATE `wf_process_define`
SET `content` = REPLACE(`content`, '"form":"/platform/appeal/accept",', '"form":"/platform/appeal/accept","h5form":"/platform/appeal/accept/h5",'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND `content` LIKE '%"id":"appealAccept"%'
AND `content` LIKE '%"form":"/platform/appeal/accept"%'
AND `content` NOT LIKE '%"h5form":"/platform/appeal/accept/h5"%'
AND `content` NOT LIKE '%"h5form": "/platform/appeal/accept/h5"%';
UPDATE `wf_process_define`
SET `content` = REPLACE(`content`, '"form": "/platform/appeal/execute",', '"form": "/platform/appeal/execute", "h5form": "/platform/appeal/execute/h5",'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND `content` LIKE '%"id": "appealExecute"%'
AND `content` LIKE '%"form": "/platform/appeal/execute"%'
AND `content` NOT LIKE '%"h5form": "/platform/appeal/execute/h5"%';
UPDATE `wf_process_define`
SET `content` = REPLACE(`content`, '"form":"/platform/appeal/execute",', '"form":"/platform/appeal/execute","h5form":"/platform/appeal/execute/h5",'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND `content` LIKE '%"id":"appealExecute"%'
AND `content` LIKE '%"form":"/platform/appeal/execute"%'
AND `content` NOT LIKE '%"h5form":"/platform/appeal/execute/h5"%'
AND `content` NOT LIKE '%"h5form": "/platform/appeal/execute/h5"%';
UPDATE `wf_process_define`
SET `h5InstanceUrl` = IFNULL(NULLIF(`h5InstanceUrl`, ''), '/platform/appeal/write/h5'),
`h5InstanceViewUrl` = IFNULL(NULLIF(`h5InstanceViewUrl`, ''), '/platform/appeal/mine/h5'),
`updatedAt` = @now
WHERE `name` = 'SSGL'
AND (IFNULL(`h5InstanceUrl`, '') = '' OR IFNULL(`h5InstanceViewUrl`, '') = '');
UPDATE `wf_process_task` t
JOIN `wf_process_instance` ins ON ins.`id` = t.`processInstanceId`
JOIN `wf_process_define` def ON def.`id` = ins.`processDefineId`
SET t.`h5FormKey` = '/platform/appeal/accept/h5',
t.`updatedAt` = @now
WHERE def.`name` = 'SSGL'
AND t.`taskName` = 'appealAccept'
AND IFNULL(t.`h5FormKey`, '') = '';
UPDATE `wf_process_task` t
JOIN `wf_process_instance` ins ON ins.`id` = t.`processInstanceId`
JOIN `wf_process_define` def ON def.`id` = ins.`processDefineId`
SET t.`h5FormKey` = '/platform/appeal/execute/h5',
t.`updatedAt` = @now
WHERE def.`name` = 'SSGL'
AND t.`taskName` = 'appealExecute'
AND IFNULL(t.`h5FormKey`, '') = '';
@@ -0,0 +1,252 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="申诉受理" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.searchKeyword"
:show-action="false"
input-align="left"
placeholder="请输入申诉标题搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.appealTypeId" :options="typeOptions" @change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val === '1'; this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/appeal/accept/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef" title="title">
<template v-slot="{row}">
<table-column label="申诉人">{{row.userName}}</table-column>
<table-column label="申诉类型">{{row.appealTypeName}}</table-column>
<table-column label="被申诉单位">{{row.defendantUnitName}}</table-column>
<table-column label="申请日期">{{formatDate(row.applyDate)}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onDeal(row)">
<i class="fa fa-edit"></i>
<span>审核</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
</template>
</table-list>
<appeal-info ref="appealInfoRef">
<div v-if="showApprovalForm" class="appeal-h5-audit-form">
<div class="process-title">受理申诉</div>
<van-form ref="formRef">
<van-field :value="formData.title" label="申诉标题" readonly></van-field>
<van-field
v-model="formData.decisionDate"
name="decisionDate"
label="决定日期"
placeholder="请选择决定日期"
:rules="[{ required: true, message: '请选择决定日期' }]"
required
readonly
is-link
@click="showDecisionDatePicker = true"
></van-field>
<van-popup v-model="showDecisionDatePicker" position="bottom">
<van-datetime-picker
v-model="decisionDateValue"
type="date"
title="选择决定日期"
@confirm="onDecisionDateConfirm"
@cancel="showDecisionDatePicker = false"
></van-datetime-picker>
</van-popup>
<van-field
v-model="formData.decisionContent"
name="decisionContent"
label="决定内容"
placeholder="请输入处理决定内容"
type="textarea"
rows="4"
maxlength="2000"
show-word-limit
:rules="[{ required: true, validator: validateText, message: '请输入处理决定内容' }]"
required
></van-field>
<van-field
v-model="formData.legalBasis"
name="legalBasis"
label="事实理由及依据"
placeholder="请输入事实理由及依据"
type="textarea"
rows="5"
maxlength="3000"
show-word-limit
:rules="[{ required: true, validator: validateText, message: '请输入事实理由及依据' }]"
required
></van-field>
<van-cell title="决定书附件" class="direction-column-cell">
<h5-file-upload :value.sync="formData.decisionFiles" :upload_number="5" upload_mode="file" upload_result_category="array" complete_result></h5-file-upload>
</van-cell>
</van-form>
<div class="h5-form-actions">
<van-button block @click="closeApprovalDialog">取消</van-button>
<van-button type="warning" block @click="doAccept(6)">退回修改</van-button>
<van-button type="danger" block @click="doAccept(2)">不予受理</van-button>
<van-button type="primary" block @click="doAccept(1)">受理并转执行</van-button>
</div>
</div>
</appeal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchKeyword: null,
appealTypeId: null,
year: null,
approvalText: "0",
approval: false
},
typeOptions: [{text: "全部类型", value: null}],
showApprovalForm: false,
showDecisionDatePicker: false,
decisionDateValue: new Date(),
formData: {},
currentTaskId: null
}
},
components: {
"appeal-info": appealInfo
},
methods: {
onReady() {
this.loadTypeOptions()
this.doSearch()
},
loadTypeOptions() {
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
if (res.code === 0) {
this.typeOptions = [{text: "全部类型", value: null}]
.concat((res.data || []).map((item) => ({text: item.name, value: item.id})))
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.appealInfoRef.onOpen(row)
},
closeApprovalDialog() {
this.showApprovalForm = false
this.currentTaskId = null
this.$refs.appealInfoRef.onClose()
},
onDeal(row) {
this.currentTaskId = row.taskId
this.$axios.post("/platform/appeal/accept/queryTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.formData = res.data || row
if (!this.formData.decisionDate) {
this.$set(this.formData, "decisionDate", this.$moment().format("YYYY-MM-DD"))
}
this.decisionDateValue = this.formData.decisionDate ? new Date(this.formData.decisionDate) : new Date()
this.showApprovalForm = true
this.$refs.appealInfoRef.onOpen(this.formData)
}
})
},
onDecisionDateConfirm(value) {
this.$set(this.formData, "decisionDate", this.$moment(value).format("YYYY-MM-DD"))
this.showDecisionDatePicker = false
},
async doAccept(submitType) {
if (submitType !== 6) {
try {
await this.$refs.formRef.validate()
} catch (error) {
return
}
}
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/platform/appeal/accept/accept", {
data: JSON.stringify(this.formData),
taskId: this.currentTaskId,
submitType
}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.closeApprovalDialog()
this.doSearch()
}
})
}).catch(() => {
})
},
onRevoke(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
validateText(value, rule) {
return !!((value || "").trim())
},
formatDate(value) {
return value ? this.$moment(value).format("YYYY-MM-DD") : ""
}
}
})
</script>
<style>
.appeal-h5-audit-form {
padding-bottom: 12px;
}
.h5-form-actions {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
padding: 10px;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,113 @@
const appealInfo = {
template: /*language=HTML*/ `
<van-action-sheet v-model="visible" title="申诉详情">
<div class="detail-container appeal-detail">
<van-cell-group title="申诉基础信息">
<van-cell title="申诉标题">{{ text(viewData.title) }}</van-cell>
<van-cell title="申诉人">{{ text(viewData.userName) }}</van-cell>
<van-cell title="性别">{{ text(viewData.sex) }}</van-cell>
<van-cell title="出生年月">{{ dateText(viewData.birthday) }}</van-cell>
<van-cell title="政治面貌">{{ text(viewData.political) }}</van-cell>
<van-cell title="工号">{{ text(viewData.loginName) }}</van-cell>
<van-cell title="所在单位">{{ text(viewData.unitName) }}</van-cell>
<van-cell title="岗位">{{ text(viewData.positionName) }}</van-cell>
<van-cell title="联系电话">{{ text(viewData.mobile) }}</van-cell>
<van-cell title="申请日期">{{ dateText(viewData.applyDate) }}</van-cell>
<van-cell title="业务状态">{{ text(viewData.state || '草稿') }}</van-cell>
<van-cell class="direction-column-cell" title="住址">{{ text(viewData.address) }}</van-cell>
<van-cell title="申诉类型">{{ text(viewData.appealTypeName) }}</van-cell>
<van-cell title="被申诉单位">{{ text(viewData.defendantUnitName) }}</van-cell>
<van-cell class="direction-column-cell" title="被申诉单位地址">{{ text(viewData.defendantAddress) }}</van-cell>
<van-cell title="被申诉单位电话">{{ text(viewData.defendantContact) }}</van-cell>
<van-cell class="direction-column-cell" title="申诉事项">{{ text(viewData.appealMatter) }}</van-cell>
<van-cell class="direction-column-cell" title="申诉理由">{{ text(viewData.reason) }}</van-cell>
<van-cell class="direction-column-cell" title="申诉要求">{{ text(viewData.request) }}</van-cell>
<van-cell class="direction-column-cell" title="申诉材料附件">
<template slot="default">
<div v-if="fileList(viewData.files).length">
<div v-for="(file,index) in fileList(viewData.files)" :key="index">
<a :href="file.url || file.path || file" target="_blank">{{ file.name || file.fileName || ('附件' + (index + 1)) }}</a>
</div>
</div>
<span v-else>暂无</span>
</template>
</van-cell>
<van-cell title="申诉人签名">
<van-image v-if="viewData.signature" :src="viewData.signature" class="signature-image"></van-image>
<span v-else>暂无</span>
</van-cell>
</van-cell-group>
<van-cell-group title="受理与处理决定" v-if="viewData.acceptTime || viewData.decisionContent">
<van-cell title="受理人">{{ text(viewData.acceptUserName) }}</van-cell>
<van-cell title="受理时间">{{ text(viewData.acceptTime) }}</van-cell>
<van-cell title="决定日期">{{ dateText(viewData.decisionDate) }}</van-cell>
<van-cell class="direction-column-cell" title="决定内容">{{ text(viewData.decisionContent) }}</van-cell>
<van-cell class="direction-column-cell" title="事实理由及依据">{{ text(viewData.legalBasis) }}</van-cell>
</van-cell-group>
<van-cell-group title="执行情况" v-if="viewData.executeTime || viewData.executeContent">
<van-cell title="执行人">{{ text(viewData.executeUserName) }}</van-cell>
<van-cell title="执行时间">{{ text(viewData.executeTime) }}</van-cell>
<van-cell class="direction-column-cell" title="执行情况">{{ text(viewData.executeContent) }}</van-cell>
</van-cell-group>
<template v-for="task in doneTasks">
<van-cell-group :title="task.displayName" :key="task.id">
<van-cell title="办理用户">
{{ task.taskFormData && task.taskFormData.userName ? task.taskFormData.userName : task.ext.initiatorName }}
</van-cell>
<van-cell title="办理时间">{{ task.finishTime }}</van-cell>
<van-cell title="办理结果">
<dict-tag :options="dict.type.PROCESS_TASK_SUBMIT_TYPE" :value="task.ext.submitType"></dict-tag>
</van-cell>
<van-cell title="办理意见" class="direction-column-cell" v-if="task.taskFormData && task.taskFormData.tf_opinion">
<div v-html="task.taskFormData.tf_opinion"></div>
</van-cell>
</van-cell-group>
</template>
</div>
<slot></slot>
</van-action-sheet>
`,
dicts: ["PROCESS_TASK_SUBMIT_TYPE"],
data() {
return {
visible: false,
viewData: {},
doneTasks: []
}
},
methods: {
onOpen(row) {
this.viewData = {...row}
this.visible = true
this.getDoneTasks()
},
getDoneTasks() {
if (!this.viewData.id) {
this.doneTasks = []
return
}
this.$axios.post("/flow/common/doneTasks", {bizId: this.viewData.id}).then((res) => {
if (res.code === 0) this.doneTasks = res.data || []
})
},
text(value) {
return value || "暂无"
},
dateText(value) {
return value ? this.$moment(value).format("YYYY-MM-DD") : "暂无"
},
fileList(value) {
if (!value) return []
if (Array.isArray(value)) return value
try {
const list = JSON.parse(value)
return Array.isArray(list) ? list : []
} catch (e) {
return []
}
}
}
}
@@ -0,0 +1,212 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar @click-left="historyBack" left-arrow left-text="返回" title="申诉执行" placeholder fixed></van-nav-bar>
<van-sticky offset-top="46px">
<van-search
v-model="pageForm.searchKeyword"
:show-action="false"
input-align="left"
placeholder="请输入申诉标题搜索"
@search="doSearch"
></van-search>
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<van-dropdown-item v-model="pageForm.appealTypeId" :options="typeOptions" @change="doSearch"></van-dropdown-item>
</van-dropdown-menu>
<van-tabs v-model="pageForm.approvalText"
@change="(val)=>{this.pageForm.approval = val === '1'; this.doSearch();}">
<van-tab title="已审核" name="1"></van-tab>
<van-tab title="未审核" name="0"></van-tab>
</van-tabs>
</van-sticky>
<table-list api="/platform/appeal/execute/pageData" :page_form.sync="pageForm" @ready="onReady"
ref="tableListRef" title="title">
<template v-slot="{row}">
<table-column label="申诉人">{{row.userName}}</table-column>
<table-column label="申诉类型">{{row.appealTypeName}}</table-column>
<table-column label="被申诉单位">{{row.defendantUnitName}}</table-column>
<table-column label="申请日期">{{formatDate(row.applyDate)}}</table-column>
<table-column label="当前节点">{{row.curTaskName}}</table-column>
</template>
<template #actions="{row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" v-if="row.taskState === 10" @click="onDeal(row)">
<i class="fa fa-edit"></i>
<span>审核</span>
</div>
<div class="action-btn delete" v-if="row.canRevoke" @click="onRevoke(row)">
<i class="fa fa-reply"></i>
<span>撤回</span>
</div>
</template>
</table-list>
<appeal-info ref="appealInfoRef">
<div v-if="showApprovalForm" class="appeal-h5-audit-form">
<div class="process-title">执行反馈</div>
<van-form ref="formRef">
<van-field :value="formData.title" label="申诉标题" readonly></van-field>
<van-field
v-model="formData.executeContent"
name="executeContent"
label="执行情况"
placeholder="请输入执行情况"
type="textarea"
rows="5"
maxlength="2000"
show-word-limit
:rules="[{ required: true, validator: validateText, message: '请输入执行情况' }]"
required
></van-field>
<van-cell title="执行附件" class="direction-column-cell">
<h5-file-upload :value.sync="formData.executeFiles" :upload_number="5" upload_mode="file" upload_result_category="array" complete_result></h5-file-upload>
</van-cell>
</van-form>
<div class="h5-form-actions">
<van-button block @click="closeApprovalDialog">取消</van-button>
<van-button type="primary" block @click="doExecute">提交</van-button>
</div>
</div>
</appeal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
const vue = new Vue({
el: "#app",
store,
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
searchKeyword: null,
appealTypeId: null,
year: null,
approvalText: "0",
approval: false
},
typeOptions: [{text: "全部类型", value: null}],
showApprovalForm: false,
formData: {},
currentTaskId: null
}
},
components: {
"appeal-info": appealInfo
},
methods: {
onReady() {
this.loadTypeOptions()
this.doSearch()
},
loadTypeOptions() {
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
if (res.code === 0) {
this.typeOptions = [{text: "全部类型", value: null}]
.concat((res.data || []).map((item) => ({text: item.name, value: item.id})))
}
})
},
onView(row) {
this.showApprovalForm = false
this.$refs.appealInfoRef.onOpen(row)
},
closeApprovalDialog() {
this.showApprovalForm = false
this.currentTaskId = null
this.$refs.appealInfoRef.onClose()
},
onDeal(row) {
this.currentTaskId = row.taskId
this.$axios.post("/platform/appeal/execute/queryTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.formData = res.data || row
this.showApprovalForm = true
this.$refs.appealInfoRef.onOpen(this.formData)
}
})
},
async doExecute() {
try {
await this.$refs.formRef.validate()
} catch (error) {
return
}
this.$dialog.confirm({
title: "提示",
message: "您确定要提交吗?"
}).then(() => {
this.$axios.post("/platform/appeal/execute/execute", {
data: JSON.stringify(this.formData),
taskId: this.currentTaskId
}).then((res) => {
if (res.code === 0) {
const finishedTaskId = this.currentTaskId
this.$toast.success(res.msg)
this.closeApprovalDialog()
this.removeTaskFromList(finishedTaskId)
setTimeout(() => this.doSearch(), 300)
}
})
}).catch(() => {
})
},
onRevoke(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.taskId}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
}
})
}).catch(() => {
})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
},
removeTaskFromList(taskId) {
const tableList = this.$refs.tableListRef
if (!tableList || !taskId) return
tableList.tableData = (tableList.tableData || []).filter((row) => row.taskId !== taskId)
tableList.localPageForm.totalCount = Math.max((tableList.localPageForm.totalCount || 1) - 1, 0)
},
validateText(value, rule) {
return !!((value || "").trim())
},
formatDate(value) {
return value ? this.$moment(value).format("YYYY-MM-DD") : ""
}
}
})
</script>
<style>
.appeal-h5-audit-form {
padding-bottom: 12px;
}
.h5-form-actions {
display: flex;
column-gap: 10px;
padding: 10px;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,142 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<div id="app" v-cloak>
<van-nav-bar title="申诉管理" fixed placeholder left-text="返回" left-arrow @click-left="historyBack"></van-nav-bar>
<div class="appeal-entry-list">
<div class="entry-card" v-if="$auth.hasPermission('h5.appeal.write')" @click="goPage('/platform/appeal/write/h5')">
<div class="entry-icon write-icon">
<van-icon name="edit"></van-icon>
</div>
<div class="entry-info">
<div class="entry-title">提交申诉</div>
<div class="entry-desc">填写并提交个人申诉申请</div>
</div>
<van-icon name="arrow" class="entry-arrow"></van-icon>
</div>
<div class="entry-card" v-if="$auth.hasPermission('h5.appeal.mine')" @click="goPage('/platform/appeal/mine/h5')">
<div class="entry-icon mine-icon">
<van-icon name="records"></van-icon>
</div>
<div class="entry-info">
<div class="entry-title">我的申诉</div>
<div class="entry-desc">查看本人申诉记录和办理进度</div>
</div>
<van-icon name="arrow" class="entry-arrow"></van-icon>
</div>
<div class="entry-card" v-if="$auth.hasPermission('h5.appeal.accept')" @click="goPage('/platform/appeal/accept/h5')">
<div class="entry-icon accept-icon">
<van-icon name="todo-list-o"></van-icon>
</div>
<div class="entry-info">
<div class="entry-title">申诉受理</div>
<div class="entry-desc">处理申诉受理环节任务</div>
</div>
<van-icon name="arrow" class="entry-arrow"></van-icon>
</div>
<div class="entry-card" v-if="$auth.hasPermission('h5.appeal.execute')" @click="goPage('/platform/appeal/execute/h5')">
<div class="entry-icon execute-icon">
<van-icon name="passed"></van-icon>
</div>
<div class="entry-info">
<div class="entry-title">申诉执行</div>
<div class="entry-desc">反馈申诉处理决定执行情况</div>
</div>
<van-icon name="arrow" class="entry-arrow"></van-icon>
</div>
</div>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
store,
methods: {
goPage(url) {
this.$pjaxReplace(url)
}
}
})
</script>
<style>
body {
background: #f7f8fa;
}
.appeal-entry-list {
padding: 12px;
}
.entry-card {
display: flex;
align-items: center;
min-height: 72px;
margin-bottom: 10px;
padding: 14px 12px;
background: #fff;
border-radius: 8px;
box-shadow: 0 1px 4px rgba(0, 0, 0, .04);
}
.entry-icon {
display: flex;
align-items: center;
justify-content: center;
width: 42px;
height: 42px;
border-radius: 8px;
color: #fff;
font-size: 23px;
flex-shrink: 0;
}
.write-icon {
background: #1989fa;
}
.mine-icon {
background: #07c160;
}
.accept-icon {
background: #ff976a;
}
.execute-icon {
background: #7232dd;
}
.entry-info {
flex: 1;
min-width: 0;
margin-left: 12px;
}
.entry-title {
color: #323233;
font-size: 16px;
font-weight: 600;
line-height: 22px;
}
.entry-desc {
margin-top: 4px;
color: #969799;
font-size: 13px;
line-height: 18px;
}
.entry-arrow {
color: #c8c9cc;
font-size: 18px;
flex-shrink: 0;
}
</style>
<!--#
}
#-->
@@ -0,0 +1,120 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style scoped>
.van-cell__value {
min-width: 62%;
}
</style>
<div id="app">
<van-nav-bar title="我的申诉" left-text="返回" right-text="提交" left-arrow @click-left="historyBack" @click-right="onWrite" fixed placeholder></van-nav-bar>
<van-sticky offset-top="46px">
<van-dropdown-menu :close-on-click-outside="false" :close-on-click-overlay="false">
<year-van-dropdown-item :num="5" @change="doSearch" v-model="pageForm.year"></year-van-dropdown-item>
</van-dropdown-menu>
</van-sticky>
<table-list api="/platform/appeal/mine/pageData" :page_form.sync="pageForm" ref="tableListRef" title="title" @ready="doSearch">
<template v-slot="{index,row}">
<table-column label="申诉类型">{{row.appealTypeName}}</table-column>
<table-column label="被申诉单位">{{row.defendantUnitName}}</table-column>
<table-column label="申请日期">{{row.applyDate}}</table-column>
<table-column label="业务状态">{{row.state || '草稿'}}</table-column>
<table-column label="当前节点">{{row.taskName}}</table-column>
</template>
<template #actions="{index,row}">
<div class="action-btn" @click="onView(row)">
<i class="fa fa-eye"></i>
<span>查看</span>
</div>
<div class="action-btn" @click="onEdit(row)" v-if="row.taskKey === 'startTask' || !row.instanceId">
<i class="fa fa-edit"></i>
<span>编辑</span>
</div>
<div class="action-btn delete" @click="onRevoke(row)" v-if="row.canRevoke">
<i class="fa fa-undo"></i>
<span>撤回</span>
</div>
<div class="action-btn delete" @click="onDelete(row)" v-if="row.taskKey === 'startTask' || !row.instanceId">
<i class="fa fa-trash"></i>
<span>删除</span>
</div>
</template>
</table-list>
<appeal-info ref="infoRef"></appeal-info>
</div>
<script nonce="${cspNonce!}">
<!--#include("../common/info.js"){}#-->
new Vue({
el: "#app",
store,
components: {
"appeal-info": appealInfo
},
data() {
return {
pageForm: {
pageNumber: 1,
pageSize: 10,
totalCount: 0,
year: new Date().getFullYear()
}
}
},
methods: {
onView(row) {
this.$refs.infoRef.onOpen(row)
},
onWrite() {
this.$pjaxReplace("/platform/appeal/write/h5")
},
onEdit(row) {
this.$pjaxReplace("/platform/appeal/write/h5?taskId=" + (row.startTaskId || "") + "&id=" + row.id)
},
onRevoke(row) {
this.$dialog.confirm({
title: "提示",
message: "您确定要撤回吗?"
}).then(() => {
this.$axios.post("/flow/common/revokeTask", {taskId: row.startTaskId}).then((res) => {
if (res.code === 0) {
this.$toast(res.msg)
this.doSearch()
}
})
})
},
onDelete(row) {
this.$dialog.confirm({
title: "提示",
message: "确定要删除此申诉吗?"
}).then(() => {
this.$axios.post("/platform/appeal/mine/delete", {id: row.id}).then((res) => {
if (res.code === 0) {
this.$toast.success(res.msg)
this.doSearch()
} else {
this.$toast.fail(res.msg)
}
})
}).catch(() => {})
},
doSearch() {
this.$nextTick(() => {
this.pageForm.pageNumber = 1
this.pageForm.totalCount = 0
this.$refs.tableListRef.doSearch()
})
}
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,225 @@
<!--#
layout("/layouts/platform_h5.html"){
#-->
<style scoped>
.appeal-actions {
display: flex;
gap: 10px;
padding: 14px 16px 24px;
background: #f7f8fa;
}
.appeal-actions .van-button {
flex: 1;
}
</style>
<div id="app">
<van-nav-bar title="提交申诉" left-text="返回" left-arrow @click-left="historyBack" fixed placeholder></van-nav-bar>
<van-form ref="formRef" class="form-container">
<van-cell-group title="申诉人基本信息" class="form-section">
<van-field label="申诉人" v-model="formData.userName" readonly required :rules="[{required:true}]"></van-field>
<van-field label="性别" v-model="formData.sex" placeholder="请输入性别" required :rules="[{required:true}]"></van-field>
<van-field label="出生年月" v-model="formData.birthday" type="date" placeholder="请选择出生年月" required :rules="[{required:true}]"></van-field>
<van-field label="政治面貌" v-model="formData.political" placeholder="请输入政治面貌" required :rules="[{required:true}]"></van-field>
<van-field label="工号" v-model="formData.loginName" readonly></van-field>
<van-field label="所在单位" v-model="formData.unitName" readonly></van-field>
<van-field label="岗位" v-model="formData.positionName" placeholder="请输入岗位" required :rules="[{required:true}]"></van-field>
<van-field label="联系电话" name="mobile" v-model="formData.mobile" placeholder="请输入手机或办公电话" required :rules="phoneRules"></van-field>
<van-field label="申请日期" v-model="formData.applyDate" type="date" placeholder="请选择申请日期" required :rules="[{required:true}]"></van-field>
<van-field class="direction-column-field" label="住址" v-model="formData.address" placeholder="请输入住址" required :rules="[{required:true}]" type="textarea" rows="2" autosize></van-field>
</van-cell-group>
<van-cell-group title="申诉事项" class="form-section">
<van-field
label="申诉类型"
v-model="formData.appealTypeName"
placeholder="请选择申诉类型"
required
readonly
is-link
:rules="[{required:true}]"
@click="showTypePopup = true"
></van-field>
<van-field label="申诉标题" v-model="formData.title" placeholder="请输入申诉标题" required :rules="[{required:true}]" maxlength="200"></van-field>
<van-field
label="被申诉单位"
v-model="formData.defendantUnitName"
placeholder="请选择被申诉单位"
required
readonly
is-link
:rules="[{required:true}]"
@click="showUnitPopup = true"
></van-field>
<van-field class="direction-column-field" label="被申诉单位地址" v-model="formData.defendantAddress" placeholder="请输入被申诉单位地址" required :rules="[{required:true}]" type="textarea" rows="2" autosize></van-field>
<van-field label="被申诉单位电话" name="defendantContact" v-model="formData.defendantContact" placeholder="请输入联系电话" required :rules="phoneRules"></van-field>
<van-field class="direction-column-field" label="申诉事项" v-model="formData.appealMatter" placeholder="请输入申诉事项" required :rules="[{required:true, validator: validateText}]" type="textarea" rows="4" maxlength="1000" show-word-limit autosize></van-field>
<van-field class="direction-column-field" label="申诉理由" v-model="formData.reason" placeholder="请输入申诉理由" required :rules="[{required:true, validator: validateText}]" type="textarea" rows="5" maxlength="2000" show-word-limit autosize></van-field>
<van-field class="direction-column-field" label="申诉要求" v-model="formData.request" placeholder="请输入申诉要求" required :rules="[{required:true, validator: validateText}]" type="textarea" rows="4" maxlength="1000" show-word-limit autosize></van-field>
</van-cell-group>
<van-cell-group title="申诉材料附件" class="form-section">
<van-field class="direction-column-field" label="" required :rules="[{validator: validateFiles, message:'请上传申诉材料附件'}]">
<template #input>
<h5-file-upload :value.sync="formData.files" :upload_number="5" upload_mode="file" upload_result_category="array" complete_result></h5-file-upload>
</template>
</van-field>
</van-cell-group>
<van-cell-group title="申诉人签名" class="form-section">
<van-field class="direction-column-field" label="" required :rules="[{validator: validateSignature, message:'请完成申诉人签名'}]">
<template #input>
<h5-signature v-model="formData.signature"></h5-signature>
</template>
</van-field>
</van-cell-group>
<div class="appeal-actions">
<van-button native-type="button" @click="onSave" round type="info" plain>保存</van-button>
<van-button native-type="button" @click="onSubmit" round type="info">{{ hasTaskId() ? '提交' : '提交申诉' }}</van-button>
</div>
</van-form>
<van-popup v-model="showTypePopup" position="bottom">
<van-picker show-toolbar :columns="typeOptions.map(i => i.name)" @confirm="onTypeConfirm" @cancel="showTypePopup = false"></van-picker>
</van-popup>
<van-popup v-model="showUnitPopup" position="bottom">
<van-picker show-toolbar :columns="unitOptions.map(i => i.name)" @confirm="onUnitConfirm" @cancel="showUnitPopup = false"></van-picker>
</van-popup>
</div>
<script nonce="${cspNonce!}">
new Vue({
el: "#app",
store,
data() {
return {
taskId: null,
formData: {
files: []
},
typeOptions: [],
unitOptions: [],
showTypePopup: false,
showUnitPopup: false,
phoneRules: [
{required: true, message: "请输入联系电话"},
{validator: this.validatePhone, message: "请输入正确的联系电话"}
]
}
},
methods: {
queryParam(name) {
return new URLSearchParams(window.location.search).get(name)
},
hasTaskId() {
return !!this.taskId && this.taskId !== "undefined" && this.taskId !== "null"
},
validatePhone(value) {
if (!value) return true
return /^((1[3-9]\d{9})|(0\d{2,3}-?\d{7,8})|(\d{6,12}))$/.test(String(value).trim())
},
validateText(value) {
return !!(value || "").trim()
},
validateFiles() {
return this.formData.files && this.formData.files.length > 0
},
validateSignature() {
return !!this.formData.signature
},
loadOptions() {
this.$axios.post("/platform/appeal/common/typeOptions").then((res) => {
if (res.code === 0) this.typeOptions = res.data || []
})
this.$axios.post("/platform/appeal/common/unitOptions").then((res) => {
if (res.code === 0) this.unitOptions = res.data || []
})
},
loadCurrentUser() {
this.$axios.post("/platform/appeal/write/currentUserInfo").then((res) => {
if (res.code === 0) {
this.formData = Object.assign({files: []}, res.data, this.formData)
this.normalizeDates()
}
})
},
loadInfo(id) {
this.$axios.post("/platform/appeal/write/info", {id}).then((res) => {
if (res.code === 0 && res.data) {
this.formData = Object.assign({files: []}, res.data)
this.normalizeDates()
}
})
},
normalizeDates() {
;["birthday", "applyDate"].forEach((key) => {
if (this.formData[key]) {
this.$set(this.formData, key, this.$moment(this.formData[key]).format("YYYY-MM-DD"))
}
})
},
onTypeConfirm(value, index) {
const item = this.typeOptions[index]
this.$set(this.formData, "appealTypeId", item ? item.id : "")
this.$set(this.formData, "appealTypeName", value || "")
this.showTypePopup = false
},
onUnitConfirm(value, index) {
const item = this.unitOptions[index]
this.$set(this.formData, "defendantUnitId", item ? item.id : "")
this.$set(this.formData, "defendantUnitName", value || "")
this.$set(this.formData, "defendantAddress", item ? item.address : this.formData.defendantAddress)
this.$set(this.formData, "defendantContact", item ? item.telephone : this.formData.defendantContact)
this.showUnitPopup = false
},
onSave() {
this.$dialog.confirm({
title: "提示",
message: "您确定保存吗?"
}).then(() => {
this.$axios.post("/platform/appeal/write/save", {data: JSON.stringify(this.formData)}).then((res) => {
if (res.code === 0) {
this.$toast(res.msg)
this.formData = Object.assign({files: []}, res.data)
this.normalizeDates()
}
})
})
},
onSubmit() {
this.$refs.formRef.validate().then(() => {
const url = this.hasTaskId() ? "/platform/appeal/write/submitAgain" : "/platform/appeal/write/submit"
this.$dialog.confirm({
title: "提示",
message: "您确定提交该申诉吗?"
}).then(() => {
this.$axios.post(url, {data: JSON.stringify(this.formData), taskId: this.taskId}).then((res) => {
if (res.code === 0) {
this.$toast(res.msg)
this.$pjaxReplace("/platform/appeal/mine/h5")
}
})
})
})
}
},
created() {
this.taskId = this.queryParam("taskId")
const id = this.queryParam("id")
this.loadOptions()
if (id) {
this.loadInfo(id)
} else {
this.loadCurrentUser()
}
}
})
</script>
<!--#
}
#-->