This commit is contained in:
Paidax
2025-10-17 15:49:02 +08:00
parent 1cb3ee9d58
commit ca2e204395
28 changed files with 1841 additions and 30 deletions
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.controller;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskBranchAuditController
* @Date 2025/10/15 10:48
* @注释
*/
public class CheckTaskBranchAuditController {
}
@@ -0,0 +1,139 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.constant.RoleConstant;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.param.PageForm;
import com.budwk.app.base.result.Result;
import com.budwk.app.sys.controller.SysRoleController;
import com.budwk.app.sys.models.Sys_role;
import com.budwk.app.sys.services.SysRoleService;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskBusinessConfig;
import com.budwk.app.zhgh.staffmanage.personnelcheck.service.CheckTaskCommonService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.nutz.dao.Chain;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.lang.Lang;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import javax.validation.Valid;
import java.util.List;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskTypeController
* @Date 2025/10/15 16:41
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api("业务配置管理")
@At("/platform/personnel/check/verification/config")
public class CheckTaskBusinessConfigController {
@Inject
private Dao dao;
@Inject
private SysRoleService sysRoleService;
@Inject
private CheckTaskCommonService checkTaskCommonService;
@At("/")
@SaCheckPermission("personnel.check.verification.config")
@Ok("beetl:/platform/zhgh/staffmanage/personnelcheck/config/index.html")
public void index() {
}
@At
@SaCheckPermission("personnel.check.verification.config")
public Result pageData(PageForm pageForm){
Sql sql = Sqls.create("select * from check_task_business_config $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("`name`", "like", "%" + pageForm.getSearchKeyword() + "%");
cnd.asc("sortNum");
sql.setCondition(cnd);
Pagination pagination = checkTaskCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@ApiOperation("添加或修改业务配置")
@SLog(tag = "业务配置", msg = "添加或修改业务配置")
@SaCheckPermission("personnel.check.verification.config")
public Result doAddOrModify(CheckTaskBusinessConfig config){
if (StrUtil.isBlank(config.getId())) {
int count = dao.count(CheckTaskBusinessConfig.class,
Cnd.where(Cnd.exps("code", "=", config.getCode())
.or("sortNum", "=", config.getSortNum())));
if (count > 0) {
return Result.error("业务编码或排序编号已存在");
}
config.setIsActive(true);
}
dao.insertOrUpdate(config);
return Result.success();
}
@At
@ApiOperation("修改业务配置状态")
@SaCheckPermission("personnel.check.verification.config")
public Result doUpdateActive(@Valid String id){
Sql sql = Sqls.create("update check_task_business_config set isActive = isActive ^ 1 where id = @id").setParam("id", id);
dao.execute(sql);
return Result.success();
}
@At
@ApiOperation("删除业务配置")
@SLog(tag = "业务配置", msg = "删除业务配置")
@SaCheckPermission("personnel.check.verification.config")
public Result onDelete(@Valid String id){
dao.delete(CheckTaskBusinessConfig.class, id);
return Result.success();
}
@At
@ApiOperation("根据查询业务配置")
@SaCheckPermission("personnel.check.verification.config")
public Result findOne(@Valid String id){
CheckTaskBusinessConfig fetch = dao.fetch(CheckTaskBusinessConfig.class, id);
return Result.success(fetch);
}
@At
@ApiOperation("查询所有业务配置")
@SaCheckPermission("personnel.check.verification.config")
public Result findAll() {
List<CheckTaskBusinessConfig> query = dao.query(CheckTaskBusinessConfig.class, Cnd.where(CheckTaskBusinessConfig::getIsActive, "=", true));
return Result.success(query);
}
@At
@Ok("json")
@ApiOperation("获取所有角色")
@SaCheckPermission("personnel.check.verification.config")
public Result listRoles() {
List<Sys_role> list = sysRoleService.query(Cnd.NEW().asc("sort"));
return Result.success(list);
}
}
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.controller;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskSchoolAuditController
* @Date 2025/10/15 10:48
* @注释
*/
public class CheckTaskSchoolAuditController {
}
@@ -0,0 +1,11 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.controller;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskSingleController
* @Date 2025/10/15 10:48
* @注释
*/
public class CheckTaskSingleController {
}
@@ -0,0 +1,116 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.controller;
import cn.dev33.satoken.annotation.SaCheckPermission;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import com.budwk.app.base.annotation.SLog;
import com.budwk.app.base.page.Pagination;
import com.budwk.app.base.result.Result;
import com.budwk.app.flow.engine.FlowEngine;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskBusinessConfig;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskFiledConfig;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskVerification;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskPersonnel;
import com.budwk.app.zhgh.staffmanage.personnelcheck.service.CheckTaskCommonService;
import com.budwk.app.zhgh.staffmanage.personnelcheck.vo.CheckTaskVerificationVO;
import com.budwk.app.zhgh.staffmanage.personnelcheck.vo.pageform.CheckTaskManagePageForm;
import io.swagger.annotations.Api;
import lombok.extern.slf4j.Slf4j;
import org.nutz.aop.interceptor.ioc.TransAop;
import org.nutz.dao.Cnd;
import org.nutz.dao.Dao;
import org.nutz.dao.Sqls;
import org.nutz.dao.sql.Sql;
import org.nutz.ioc.aop.Aop;
import org.nutz.ioc.loader.annotation.Inject;
import org.nutz.ioc.loader.annotation.IocBean;
import org.nutz.mvc.annotation.AdaptBy;
import org.nutz.mvc.annotation.At;
import org.nutz.mvc.annotation.Ok;
import org.nutz.mvc.annotation.Param;
import org.nutz.mvc.upload.TempFile;
import org.nutz.mvc.upload.UploadAdaptor;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskController
* @Date 2025/10/15 10:47
* @注释
*/
@Slf4j
@IocBean
@Ok("json:full")
@Api("核对任务")
@At("/platform/personnel/check/verification/manage")
public class CheckTaskVerificationController {
@Inject
private Dao dao;
@Inject
private FlowEngine flowEngine;
@Inject
private CheckTaskCommonService checkTaskCommonService;
@At("/")
@SaCheckPermission("personnel.check.verification.manage")
@Ok("beetl:/platform/zhgh/staffmanage/personnelcheck/manage/index.html")
public void index() {
}
@At
@SaCheckPermission("personnel.check.verification.manage")
public Result pageData(CheckTaskManagePageForm pageForm){
Sql sql = Sqls.create("SELECT * FROM check_task $condition");
Cnd cnd = Cnd.NEW();
cnd.andEX("YEAR(createTime)", "=", pageForm.getYear());
cnd.andEX("taskName", "like", "%" + pageForm.getSearchKeyword() + "%");
sql.setCondition(cnd);
Pagination pagination = checkTaskCommonService.listPageMap(pageForm.getPageNumber(), pageForm.getPageSize(), sql);
return Result.success(pagination);
}
@At
@Aop(TransAop.READ_COMMITTED)
@SLog(tag = "核对任务", msg = "添加核对任务")
@SaCheckPermission("personnel.check.verification.manage")
@AdaptBy(type = UploadAdaptor.class, args = {"ioc:fileUpload"})
public Result doAddOrModify(@Param("baseData") String data, TempFile file){
log.info("=================================主体数据:{}", data);
log.info("=================================导入文件:{}", file);
CheckTaskVerificationVO vo = JSONUtil.toBean(data, CheckTaskVerificationVO.class);
if (StrUtil.isNotBlank(vo.getId())) {
// 如果是修改,执行以下步骤
// 1.重新配置核对字段,filedConfigData
dao.clear(CheckTaskFiledConfig.class, Cnd.where("taskId", "=", vo.getId()));
// 2.重新设置待核对人员表,personnelData
// dao.clear(Check)
}
// 修改审核流程配置
dao.update(vo.getBusinessConfig());
log.info("=================================数据转换:{}", vo);
return Result.success();
}
@At
@Aop(TransAop.READ_COMMITTED)
@SaCheckPermission("personnel.check.verification.manage")
@SLog(tag = "核对任务", msg = "删除核对任务ID:${args[0]}")
public Result onDelete(String id){
dao.clear(CheckTaskVerification.class, Cnd.where("id", "=", id));
dao.clear(CheckTaskPersonnel.class, Cnd.where("taskId", "=", id));
flowEngine.processInstanceService().deleteProcessInstanceByBusinessKey(id);
return Result.success();
}
}
@@ -0,0 +1,60 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import org.nutz.lang.util.NutMap;
import java.util.List;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskBusinessConfig
* @Date 2025/10/16 10:41
* @注释
*/
@Data
@Table
@Comment("业务配置表")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskBusinessConfig extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("业务编码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String code;
@Column
@Comment("业务名称")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String name;
@Column
@Comment("排序编号")
@ColDefine(type = ColType.INT)
private String sortNum;
@Column
@Comment("目标表名")
@ColDefine(type = ColType.VARCHAR, width = 100)
private String targetTable;
@Column
@Comment("审核流程步骤数组")
@ColDefine(type = ColType.MYSQL_JSON)
private List<NutMap> workflowSteps;
@Column
@Comment("是否启用")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isActive;
}
@@ -0,0 +1,63 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskFiledConfig
* @Date 2025/10/16 11:39
* @注释 字段配置表
*/
@Data
@Table
@Comment("核对任务字段配置表")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskFiledConfig extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("任务Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String taskId;
@Column
@Comment("字段代码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String fieldCode;
@Column
@Comment("字段名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String fieldName;
@Column
@Default("string")
@Comment("数据类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String dataType;
@Column
@Comment("是否必填")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isRequired;
@Column
@Comment("是否在核对界面显示")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isVisible;
@Column
@Comment("排序")
@ColDefine(type = ColType.INT)
private Integer sortOrder;
}
@@ -0,0 +1,88 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskPersonnel
* @Date 2025/10/15 9:40
* @注释
*/
@Data
@Table
@Comment("待核对人员表")
@EqualsAndHashCode(callSuper = true)
@TableIndexes({
@Index(name = "IDX_LOGIN_NAME", fields = {"loginname"}, unique = false),
})
public class CheckTaskPersonnel extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("任务Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String taskId;
@Column
@Comment("工号")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String loginname;
@Column
@Comment("当前步骤")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String currentStep;
@Column
@Comment("当前状态")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String status;
@Column
@Comment("动态扩展字段(用户表其余列)")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> data;
@Column
@Comment("审核意见")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String remark;
@Column
@Default("0")
@Comment("是否已核对")
@ColDefine(type = ColType.BOOLEAN)
private Boolean isCheck;
@Column
@Comment("核对人Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String checkUserId;
@Column
@Comment("核对人Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String checkLoginname;
@Column
@Comment("核对人姓名")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String checkUsername;
@Column
@Comment("变更信息")
@ColDefine(type = ColType.MYSQL_JSON)
private String changeInfos;
}
@@ -0,0 +1,74 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.Date;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskVerification
* @Date 2025/10/15 9:40
* @注释
*/
@Data
@Table
@Comment("核对任务事项表")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskVerification extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("事项名称")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String title;
@Column
@Comment("唯一编码,用于标识")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String code;
@Column
@Comment("业务类型")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String businessType;
@Column
@Comment("核对年份")
@ColDefine(type = ColType.INT)
private Integer year;
@Column
@Comment("原文件名")
@ColDefine(type = ColType.VARCHAR, width = 255)
private String fileName;
@Column
@Comment("开始时间")
@ColDefine(type = ColType.DATETIME)
private Date startTime;
@Column
@Comment("结束时间")
@ColDefine(type = ColType.DATETIME)
private Date endTime;
@Column
@Comment("创建时间")
@ColDefine(type = ColType.DATETIME)
private Date createTime;
@Column
@Comment("当前状态")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String status;
}
@@ -0,0 +1,62 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskLog
* @Date 2025/10/15 9:41
* @注释
*/
@Data
@Table
@Comment("审核日志表")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskVerificationLog extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("任务Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String verificationId;
@Column
@Comment("待核对人员Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String pendingId;
@Column
@Comment("节点")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String fromStatus;
@Column
@Comment("节点")
@ColDefine(type = ColType.VARCHAR, width = 30)
private String toStatus;
@Column
@Comment("操作人")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String operator;
@Column
@Comment("状态(PASS/REJECT/ROLLBACK")
@ColDefine(type = ColType.VARCHAR, width = 20)
private String action;
@Column
@Comment("备注")
@ColDefine(type = ColType.TEXT)
private String remark;
}
@@ -0,0 +1,54 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.model;
import com.budwk.app.base.model.BaseModel;
import lombok.Data;
import lombok.EqualsAndHashCode;
import org.nutz.dao.entity.annotation.*;
import org.nutz.dao.interceptor.annotation.PrevInsert;
import java.util.List;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskWorkflowStep
* @Date 2025/10/16 11:30
* @注释 审核流程节点配置
*/
@Data
@Table
@Comment("审核流程节点配置表")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskWorkflowStep extends BaseModel {
@Name
@Comment("ID")
@ColDefine(type = ColType.VARCHAR, width = 32)
@PrevInsert(uu32 = true)
private String id;
@Column
@Comment("任务Id")
@ColDefine(type = ColType.VARCHAR, width = 32)
private String taskId;
@Column
@Comment("执行顺序")
@ColDefine(type = ColType.INT)
private Integer stepOrder;
@Column
@Comment("步骤代码")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String stepCode;
@Column
@Comment("步骤名称")
@ColDefine(type = ColType.VARCHAR, width = 50)
private String stepName;
@Column
@Comment("处理角色,可多选")
@ColDefine(type = ColType.MYSQL_JSON)
private List<String> assignRoles;
}
@@ -0,0 +1,14 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.service;
import com.budwk.app.base.service.BaseService;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskPersonnel;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskCommonService
* @Date 2025/10/15 14:41
* @注释
*/
public interface CheckTaskCommonService extends BaseService<CheckTaskPersonnel> {
}
@@ -0,0 +1,21 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.service.impl;
import com.budwk.app.base.service.impl.BaseServiceImpl;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskPersonnel;
import com.budwk.app.zhgh.staffmanage.personnelcheck.service.CheckTaskCommonService;
import org.nutz.dao.Dao;
import org.nutz.ioc.loader.annotation.IocBean;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskCommonServiceImpl
* @Date 2025/10/15 14:41
* @注释
*/
@IocBean(args = {"refer:dao"})
public class CheckTaskCommonServiceImpl extends BaseServiceImpl<CheckTaskPersonnel> implements CheckTaskCommonService {
public CheckTaskCommonServiceImpl(Dao dao) {
super(dao);
}
}
@@ -0,0 +1,44 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.vo;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskBusinessConfig;
import com.budwk.app.zhgh.staffmanage.personnelcheck.model.CheckTaskFiledConfig;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import java.util.Date;
import java.util.List;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskVerificationVO
* @Date 2025/10/17 14:16
* @注释
*/
@Data
@ApiModel("核对事项表")
public class CheckTaskVerificationVO {
@ApiModelProperty("主键Id")
private String id;
@ApiModelProperty("标题")
private String title;
@ApiModelProperty("业务标签")
private String businessType;
@ApiModelProperty("开始时间")
private Date startTime;
@ApiModelProperty("结束时间")
private Date endTime;
@ApiModelProperty("业务配置数据")
private CheckTaskBusinessConfig businessConfig;
@ApiModelProperty("字段配置数据")
private List<CheckTaskFiledConfig> fieldConfig;
}
@@ -0,0 +1,24 @@
package com.budwk.app.zhgh.staffmanage.personnelcheck.vo.pageform;
import com.budwk.app.base.param.PageForm;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
/**
* @version 1.0
* @Author FKY
* @nameCheckTaskManagePageForm
* @Date 2025/10/15 14:31
* @注释
*/
@Data
@ApiModel("核对任务")
@EqualsAndHashCode(callSuper = true)
public class CheckTaskManagePageForm extends PageForm {
@ApiModelProperty("年份")
private String year;
}
@@ -90,7 +90,7 @@ layout("/layouts/platform.html"){
{ prop: "unionName", label: "所属工会", sortable: true },
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "sign", label: "签字" },
{ prop: "taskName", label: "当前节点"},
{ prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
unions: [],
@@ -100,7 +100,7 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
@@ -74,7 +74,7 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
changeTypeData: [],
@@ -102,7 +102,7 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
@@ -100,7 +100,7 @@ layout("/layouts/platform.html"){
{ prop: "unitName", label: "所属单位", sortable: true },
{ prop: "changeTypes", label: "变更类型", sortable: true, width: 200 },
{ prop: "applyDateTime", label: "申请时间", sortable: true },
{ prop: "taskName", label: "当前节点"},
{ prop: "curTaskName", label: "当前节点"},
{ prop: "instanceState", label: "流程状态"}
],
@@ -0,0 +1,277 @@
<!--#
layout("/layouts/platform.html"){
#-->
<style scoped>
.drag-area {
border: 1px dashed #ddd;
padding: 10px;
margin-top: 10px;
min-height: 50px;
}
.drag-item {
background: #f5f5f5;
padding: 8px;
margin: 4px 0;
cursor: move;
}
.ghost {
opacity: 0.5;
}
</style>
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="业务名称">
<el-input v-model="pageForm.searchKeyword" placeholder="请输入业务名称"></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never" class="mt10">
<table-tool label="数据列表">
<el-button size="small" @click="openAdd" type="primary">添加</el-button>
</table-tool>
<el-table :data="tableData" style="width: 100%" stripe border :header-cell-style="{background:'#FAFAFA'}"
row-key="id" @sort-change="pageOrder">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:width="column.width"
:sortable="column.sortable"
>
<template scope="{row}" v-if="column.prop === 'isActive'">
<el-switch v-model="row.isActive" @change="doUpdateActive(row)"></el-switch>
</template>
</el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="200px" fixed="right">
<template scope="{row}">
<el-button size="mini" @click="openEdit(row)" type="primary">编辑</el-button>
<el-button size="mini" @click="onDelete(row)" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #edit>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="120px">
<el-form-item label="业务名称" prop="name">
<el-input v-model="formData.name" placeholder="请输入业务名称"></el-input>
</el-form-item>
<el-form-item label="业务编码" prop="code">
<el-input v-model="formData.code" placeholder="请输入业务编码"></el-input>
</el-form-item>
<el-form-item label="排序编号" prop="sortNum">
<el-input-number v-model="formData.sortNum" placeholder="请输入排序编号" style="width: 100%"></el-input-number>
</el-form-item>
<el-form-item label="审核流程步骤" prop="workflowSteps">
<!-- 1. 步骤多选池 -->
<el-checkbox-group v-model="selectedSteps" @change="onCheckChange">
<el-checkbox
v-for="opt in stepOptions"
:key="opt.value"
:label="opt.value">
{{ opt.label }}
</el-checkbox>
</el-checkbox-group>
<!-- 2. 已选步骤(可拖拽排序) -->
<draggable
v-model="formData.workflowSteps"
handle=".handle"
class="drag-area"
ghost-class="ghost">
<div v-for="(step, idx) in formData.workflowSteps" :key="step.stepCode" class="drag-item handle">
<i class="el-icon-menu"></i>
<el-tag size="small" style="width: 15%">{{ '第' + (idx + 1) + '步' }}. {{ step.stepName }}</el-tag>
<el-select
v-if="!step.stepName.includes('核对')"
v-model="step.assignRole"
multiple
filterable
clearable
placeholder="处理角色"
size="mini"
style="width: 30%; margin:0 8px">
<el-option v-for="role in roles" :key="role.code"
:label="role.name" :value="role.code"></el-option>
</el-select>
<el-button type="danger" icon="el-icon-delete" size="mini" circle @click="removeStep(idx)"></el-button>
</div>
</draggable>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="doSave">提交配置</el-button>
</el-form-item>
</el-form>
</template>
</guava>
</div>
<script>
new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return{
pageForm: {},
tableData: [],
tableColumns: [
{ prop: "name", label: "业务名称", sortable: true },
{ prop: "code", label: "业务编码", sortable: true },
{ prop: "sortNum", label: "排序编号", sortable: true },
{ prop: "isActive", label: "是否启用" }
],
formData: {
name: '',
code: '',
targetTable: '',
workflowSteps: []
},
formRules: {
name: [{ required: true, message: '请输入业务名称', trigger: ['blur', 'change'] }],
code: [{ required: true, message: '请输入业务编码', trigger: ['blur', 'change'] }],
sortNum: [{ required: true, message: '请输入排序编号', trigger: ['blur', 'change'] }],
workflowSteps: [{ required: true, message: '请填写审核流程步骤', trigger: ['blur', 'change'] }]
},
selectedSteps: [],
stepOptions: [
{ value: 'personal', label: '个人核对' },
{ value: 'unionGroupCheck', label: '工会小组核对' },
{ value: 'branchUnionCheck', label: '分工会核对' },
{ value: 'schoolUnionCheck', label: '校工会核对' },
{ value: 'unionGroupAudit', label: '工会小组审核' },
{ value: 'branchUnionAudit', label: '分工会审核' },
{ value: 'schoolUnionAudit', label: '校工会审核' },
],
roles: []
}
},
methods: {
openAdd() {
this.$refs.guava.edit()
},
doSave() {
if (!this.formData.workflowSteps) {
this.$message.error('请配置审核流程步骤')
}
this.$refs.formRef.validate(valid => {
if (valid) {
this.$confirm("您确定要提交吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
const formData = clone(this.formData)
formData.workflowSteps = JSON.stringify(this.formData.workflowSteps)
this.$axios.post('/platform/personnel/check/verification/config/doAddOrModify', formData)
.then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.pageData()
this.$refs.guava.index()
} else {
this.$message.error(res.msg)
}
})
})
}
})
},
doUpdateActive(row) {
this.$axios.post('/platform/personnel/check/verification/config/doUpdateActive', {id: row.id})
.then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
} else {
this.$message.error(res.msg)
}
})
},
openEdit(row) {
this.$axios.post('/platform/personnel/check/verification/config/findOne', {id: row.id})
.then(res => {
if (res.code === 0) {
this.formData = res.data
this.selectedSteps = res.data.workflowSteps.map(v => v.stepCode)
this.$refs.guava.edit()
} else {
this.$message.error(res.msg)
}
})
},
onDelete(row) {
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/personnel/check/verification/config/onDelete', {id: row.id})
.then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
})
},
onCheckChange(codes) {
// 先删掉已取消的
this.formData.workflowSteps = this.formData.workflowSteps
.filter(s => codes.includes(s.stepCode))
// 再追加新勾选的
const existCodes = this.formData.workflowSteps.map(s => s.stepCode)
codes.forEach(code => {
if (!existCodes.includes(code)) {
const data = this.stepOptions.find(opt => opt.value === code)
this.formData.workflowSteps.push({
stepName: data.label,
stepCode: data.value,
assignRole: []
})
}
})
},
removeStep(idx) {
const code = this.formData.workflowSteps[idx].stepCode
this.formData.workflowSteps.splice(idx, 1)
// 同步 checkbox
this.selectedSteps = this.selectedSteps.filter(c => c !== code)
},
async listRoles() {
const resp = await this.$axios.post('/platform/personnel/check/verification/config/listRoles')
if (resp.code === 0) {
this.roles = resp.data
}
}
},
created() {
this.pageData()
this.listRoles()
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,83 @@
const basicInfoForm = {
template: /*language=HTML*/ `
<div>
<el-form :model="formData" ref="formRef" :rules="formRules" label-width="120px">
<el-form-item label="事项名称" prop="title">
<el-input v-model="formData.title" placeholder="请输入事项名称"></el-input>
</el-form-item>
<el-form-item label="业务类型" prop="businessType">
<el-select v-model="formData.businessType" @change="setConfig" placeholder="请选择业务类型" style="width: 100%">
<el-option
v-for="item in businessList"
:key="item.code"
:label="item.name"
:value="item.code">
</el-option>
</el-select>
</el-form-item>
<el-form-item label="开始时间" prop="startTime">
<el-date-picker
v-model="formData.startTime"
type="datetime"
placeholder="选择开始时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item label="结束时间" prop="endTime">
<el-date-picker
v-model="formData.endTime"
type="datetime"
placeholder="选择结束时间"
value-format="yyyy-MM-dd HH:mm:ss"
style="width: 100%;">
</el-date-picker>
</el-form-item>
<el-form-item style="text-align: right">
<el-button type="primary" @click="doSubmit">下一步:配置流程</el-button>
</el-form-item>
</el-form>
</div>
`,
data() {
return {
businessList: [],
formData: {},
formRules: {
title: [{ required: true, message: '请输入事项名称', trigger: ['blur', 'change'] }],
businessType: [{ required: true, message: '请选择业务类型', trigger: ['blur', 'change'] }],
startTime: [{ required: true, message: '请选择开始时间', trigger: ['blur', 'change'] }],
endTime: [{ required: true, message: '请选择结束时间', trigger: ['blur', 'change'] }]
}
}
},
methods: {
async listBusiness() {
const resp = await this.$axios.post('/platform/personnel/check/verification/config/findAll')
if (resp.code === 0) {
this.businessList = resp.data
}
},
setConfig(val){
if (val) {
this.formData.businessConfig = this.businessList.find(item => item.code === val)
} else {
this.formData.businessConfig = {}
}
},
doSubmit() {
this.$refs.formRef.validate(valid => {
if (valid) {
this.$emit('next', { ...this.formData })
}
})
}
},
async created() {
await this.listBusiness()
}
}
@@ -0,0 +1,294 @@
const importAndMap = {
template: /*language=HTML*/ `
<div>
<h3>导入人员数据并配置字段</h3>
<div style="margin-top: 15px">
<!-- 文件上传 -->
<div class="upload-area">
<el-upload
drag
class="upload-box"
action="#"
:auto-upload="false"
:on-change="handleFileChange"
:file-list="fileList"
accept=".xlsx,.xls"
>
<i class="el-icon-upload"></i>
<div class="el-upload__text">将 Excel 文件拖到此处,或<em>点击上传</em></div>
<div style="color: darkred">支持 .xlsx、.xls 格式,文件大小不超过 20MB,第一行必须为表头且表头中必须包含【工号】字段</div>
</el-upload>
</div>
<!-- 表头选择区域 -->
<div v-if="headers.length > 0" class="field-selection" style="margin-top: 20px;">
<h4>请选择需要核对的字段:</h4>
<p style="color: #999; margin-bottom: 10px;">
已从文件中读取到 {{ headers.length }} 个字段,勾选后将在审核流程中允许修改。
<br>
<small style="color: green">💡 提示:下方数据预览显示全部字段,用于核对数据准确性。</small>
</p>
<!-- 全选 / 反选 -->
<div style="margin-bottom: 10px;">
<el-button size="small" @click="selectAll">全选</el-button>
<el-button size="small" @click="deselectAll">取消全选</el-button>
</div>
<!-- 字段列表 -->
<el-table :data="headerList" size="small" max-height="500" :show-header="false" style="width: 100%">
<el-table-column width="60">
<template slot-scope="scope">
<el-checkbox v-model="scope.row.selected"></el-checkbox>
</template>
</el-table-column>
<el-table-column label="字段名称" prop="name">
<template slot-scope="scope">
<strong>{{ scope.row.name }}</strong>
</template>
</el-table-column>
<el-table-column label="示例值" prop="sample">
<template slot-scope="scope">
<span style="color: #666;">{{ scope.row.sample || '空' }}</span>
</template>
</el-table-column>
</el-table>
<!-- 数据预览 -->
<div style="margin-top: 20px;">
<h4>数据预览(前 5 条)</h4>
<div v-if="previewData.length === 0" style="color:#999; font-style:italic;">
暂无预览数据,请检查文件内容
</div>
<el-table v-else :data="previewData" border max-height="300" style="width: 100%">
<el-table-column
v-for="col in allPreviewColumns"
:key="col"
:prop="col"
:label="col"
/>
</el-table>
</div>
</div>
</div>
<!-- 操作按钮 -->
<div class="actions" style="margin-top: 30px; text-align: right;">
<el-button @click="$emit('prev')">上一步</el-button>
<el-button type="primary" @click="submitTask" :disabled="!canSubmit"
:loading="submitting">完成创建并导入数据</el-button>
</div>
</div>
`,
props: {
baseData: {type: Object}
},
data() {
return {
fileList: [],
workbook: null,
headers: [], // 原始表头数组
rawData: [], // 解析出的原始二维数组
headerList: [], // { name, sample, selected }
previewData: [], // 对象数组,用于预览
submitting: false
}
},
computed: {
allPreviewColumns() {
return this.headers
},
selectedHeaders() {
return this.headerList.filter(h => h.selected).map(h => h.name)
},
canSubmit() {
return this.selectedHeaders.length > 0 && this.rawData.length > 0
}
},
methods: {
handleFileChange(file, fileList) {
this.fileList = fileList.map(item => {
// 确保 item.raw 存在(即用户选择的原始 File 对象)
if (item.raw) {
return item;
} else {
// 兼容已有文件
return { ...item, raw: item.url ? null : item.response?.data?.file };
}
});
// 只处理 .xlsx .xls 文件
const allowedTypes = ['application/vnd.ms-excel', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet']
if (!allowedTypes.includes(file.raw.type)) {
this.$message.error('请上传 Excel 文件(.xls 或 .xlsx')
this.fileList = this.fileList.filter(f => f.uid !== file.uid) // 移除无效文件
return
}
// 读取文件内容
this.readExcel(file.raw)
},
async readExcel(rawFile) {
try {
const reader = new FileReader()
reader.onload = (e) => {
const data = new Uint8Array(e.target.result)
const workbook = XLSX.read(data, { type: 'array' })
const firstSheet = workbook.Sheets[workbook.SheetNames[0]]
const jsonData = XLSX.utils.sheet_to_json(firstSheet, { header: 1 })
if (jsonData.length < 2) {
this.$message.warning('数据为空或缺少表头')
return
}
this.headers = jsonData[0].filter(h => h)
this.rawData = jsonData.slice(1)
// 初始化字段选择列表(所有字段默认可编辑?或让用户选)
this.headerList = this.headers.map((h, idx) => ({
name: h,
sample: this.rawData[0] ? this.rawData[0][idx] : '',
selected: true // 默认都允许修改,也可以让用户决定
}))
this.$message.success('成功加载 ' + this.rawData.length + ' 条数据,共 ' + this.headers.length + ' 个字段')
this.generatePreview()
}
reader.readAsArrayBuffer(rawFile)
} catch (err) {
this.$message.error('文件解析失败')
console.error(err)
}
},
resetState() {
this.headers = []
this.rawData = []
this.headerList = []
this.previewData = []
this.fileList = []
},
generatePreview() {
try {
this.previewData = this.rawData.slice(0, 5).map(row => {
const obj = {}
this.headers.forEach((header, idx) => {
const cleanHeader = (header || '').trim()
if (!cleanHeader) return
obj[cleanHeader] = row[idx] == null ? '' : String(row[idx]).trim()
})
return obj
})
} catch (err) {
console.error('生成预览失败', err)
this.previewData = []
}
},
selectAll() {
this.headerList.forEach(h => h.selected = true)
},
deselectAll() {
this.headerList.forEach(h => h.selected = false)
},
gridFormatter(row, column) {
const val = row[column.property]
return val == null ? '-' : String(val)
},
async submitTask() {
if (!this.canSubmit) {
this.$message.warning('请至少选择一个字段')
return
}
this.submitting = true
try {
this.baseData.fieldConfig = this.headerList
.map(h => ({
fieldCode: h.name,
fieldName: h.name,
isRequired: h.selected,
sortOrder: this.headers.indexOf(h.name)
}))
const formData = new FormData()
formData.append('file', this.fileList[0].raw)
formData.append('baseData', JSON.stringify(this.baseData))
console.log(formData)
this.$emit('finish', formData)
} catch (err) {
this.$message.error('提交失败:' + (err.message || '未知错误'))
} finally {
this.submitting = false
}
}
},
mounted() {
const s = document.createElement("script")
s.type = "text/javascript"
s.src = "/assets/platform/plugins/xlsx/xlsx.full.min.js"
document.body.appendChild(s)
},
style: /*language=CSS*/ `
/deep/ .upload-area {
border: 2px dashed #d9d9d9;
border-radius: 8px;
padding: 4px;
text-align: center;
background: #fafafa;
transition: all 0.3s ease;
margin-bottom: 15px;
}
/deep/ .upload-area:hover {
border-color: #409eff;
background: #f0f9ff;
}
/deep/ .el-upload-dragger{
background: none !important;
border: none !important;
}
/deep/ .import-and-map {
padding: 20px;
background: #fff;
border-radius: 8px;
box-shadow: 0 2px 12px rgba(0,0,0,0.05);
}
/deep/ .upload-box {
width: 100%;
margin: 0 auto;
}
/deep/ .field-selection {
padding: 15px;
border: 1px solid #eee;
border-radius: 6px;
background: #f9f9f9;
}
/deep/ .actions {
text-align: right;
}
/deep/ .el-table th {
font-weight: bold;
color: #333;
}
`
}
@@ -0,0 +1,79 @@
<!--#include("basicInfoForm.js"){}#-->
<!--#include("workflowConfig.js"){}#-->
<!--#include("importAndMap.js"){}#-->
const Manage = {
template: /*language=HTML*/ `
<div class="create-task-page">
<!-- 步骤条 -->
<el-steps :active="currentStep" finish-status="success" align-center style="margin: 20px 0;">
<el-step title="基本信息"></el-step>
<el-step title="配置流程"></el-step>
<el-step title="导入数据 & 映射字段"></el-step>
</el-steps>
<div class="form-container">
<!-- 基本信息 -->
<div v-show="currentStep === 0">
<basicInfoForm ref="basicInfoFormRef" @next="gotoNext"/>
</div>
<!-- 流程配置 -->
<div v-show="currentStep === 1">
<workflowConfig ref="workflowConfigRef" :base-data.sync="formData" @prev="currentStep--" @next="gotoNext"/>
</div>
<!-- 导入 + 字段映射 -->
<div v-show="currentStep === 2">
<importAndMap
ref="importAndMapRef"
:base-data.sync="formData"
@finish="onFinish"
@prev="currentStep--"
/>
</div>
</div>
</div>
`,
data() {
return {
currentStep: 0,
newTaskId: '',
formData: {
businessConfig: {}
}
}
},
components: {
basicInfoForm,
workflowConfig,
importAndMap
},
methods: {
gotoNext(formData) {
this.formData = formData
this.currentStep++
if (this.currentStep === 1) {
this.$nextTick(() => {
this.$refs.workflowConfigRef.init()
})
}
},
onFinish(formData) {
this.$confirm('确定要提交吗?', '提示', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
}).then(async () => {
const resp = await this.$axios.post('/platform/personnel/check/verification/manage/doAddOrModify', formData)
if (resp.code === 0){
this.$message.success(resp.msg)
}
})
},
},
style: /*language=CSS*/ `
`
}
@@ -0,0 +1,128 @@
const workflowConfig = {
template: /*language=HTML*/ `
<div>
<h3>配置审核流程(勾选添加审核步骤,拖拽调整顺序,点击删除)</h3>
<div style="margin-top: 15px">
<el-checkbox-group v-model="selectedSteps" @change="onCheckChange">
<el-checkbox
v-for="opt in stepOptions"
:key="opt.value"
:label="opt.value">
{{ opt.label }}
</el-checkbox>
</el-checkbox-group>
<draggable
v-model="baseData.businessConfig.workflowSteps"
handle=".handle"
class="drag-area"
ghost-class="ghost">
<div v-for="(step, idx) in baseData.businessConfig.workflowSteps" :key="step.stepCode" class="drag-item handle">
<i class="el-icon-menu"></i>
<el-tag size="small" style="width: 15%">{{ '第' + (idx + 1) + '步' }}. {{ step.stepName }}
</el-tag>
<el-select
v-if="!step.stepName.includes('核对')"
v-model="step.assignRole"
multiple
filterable
clearable
placeholder="处理角色"
size="mini"
style="width: 30%; margin:0 8px">
<el-option v-for="role in roles" :key="role.code"
:label="role.name" :value="role.code"></el-option>
</el-select>
<el-button type="danger" icon="el-icon-delete" size="mini" circle
@click="removeStep(idx)"></el-button>
</div>
</draggable>
</div>
<div style="margin-top: 20px;text-align: right">
<el-button @click="$emit('prev')">上一步</el-button>
<el-button type="primary" @click="$emit('next', baseData)">下一步:导入数据</el-button>
</div>
</div>
`,
props: {
baseData: {type: Object}
},
data() {
return {
selectedSteps: [],
stepOptions: [
{ value: 'personal', label: '个人核对' },
{ value: 'unionGroupCheck', label: '工会小组核对' },
{ value: 'branchUnionCheck', label: '分工会核对' },
{ value: 'schoolUnionCheck', label: '校工会核对' },
{ value: 'unionGroupAudit', label: '工会小组审核' },
{ value: 'branchUnionAudit', label: '分工会审核' },
{ value: 'schoolUnionAudit', label: '校工会审核' },
],
roles: []
}
},
methods: {
onCheckChange(codes) {
// 先删掉已取消的
this.baseData.businessConfig.workflowSteps = this.baseData.businessConfig.workflowSteps
.filter(s => codes.includes(s.stepCode))
// 再追加新勾选的
const existCodes = this.baseData.businessConfig.workflowSteps.map(s => s.stepCode)
codes.forEach(code => {
if (!existCodes.includes(code)) {
const data = this.stepOptions.find(opt => opt.value === code)
this.baseData.businessConfig.workflowSteps.push({
stepName: data.label,
stepCode: data.value,
assignRole: []
})
}
})
},
removeStep(idx) {
const code = this.baseData.businessConfig.workflowSteps[idx].stepCode
this.baseData.businessConfig.workflowSteps.splice(idx, 1)
// 同步 checkbox
this.selectedSteps = this.selectedSteps.filter(c => c !== code)
},
async listRoles() {
const resp = await this.$axios.post('/platform/personnel/check/verification/config/listRoles')
if (resp.code === 0) {
this.roles = resp.data
}
},
init() {
this.selectedSteps = this.baseData.businessConfig.workflowSteps.map(s => s.stepCode)
}
},
created() {
this.listRoles()
},
style: /*language=CSS*/ `
/deep/ .drag-area {
border: 1px dashed #ddd;
padding: 10px;
margin-top: 10px;
min-height: 50px;
}
/deep/ .drag-item {
background: #f5f5f5;
padding: 8px;
margin: 4px 0;
cursor: move;
}
/deep/ .ghost {
opacity: 0.5;
}
`
}
@@ -0,0 +1,126 @@
<!--#
layout("/layouts/platform.html"){
#-->
<div id="app" v-cloak>
<guava ref="guava">
<el-card shadow="never">
<search @search="doSearch">
<search-item label="年度">
<el-date-picker
@change="doSearch"
placeholder="请选择年度"
type="year"
style="width: 100%"
v-model="pageForm.year"
value-format="yyyy"
></el-date-picker>
</search-item>
<search-item label="任务名称">
<el-input
@keyup.enter.native="doSearch"
clearable
placeholder="请输入任务名称"
clearable
style="width: 100%"
v-model="pageForm.searchKeyword"
></el-input>
</search-item>
</search>
</el-card>
<el-card shadow="never">
<table-tool label="数据列表">
<el-button size="small" @click="openAdd" type="primary">新建</el-button>
</table-tool>
<el-table :data="tableData" style="width: 100%" stripe border :header-cell-style="{background:'#FAFAFA'}"
row-key="id" @sort-change="pageOrder">
<el-table-column :index="indexMethod" align="center" header-align="center"
label="序号" type="index" width="80px"></el-table-column>
<el-table-column
align="center"
header-align="center"
v-for="column in tableColumns"
show-overflow-tooltip
:label="column.label"
:prop="column.prop"
:width="column.width"
:sortable="column.sortable"
></el-table-column>
<el-table-column align="center" header-align="center" label="操作" width="200px" fixed="right">
<template scope="{row}">
<el-button size="mini" @click="openView(row)" type="primary">查看</el-button>
<el-button size="mini" @click="openEdit(row)" type="primary">编辑</el-button>
<el-button size="mini" @click="onDelete(row)" type="danger">删除</el-button>
</template>
</el-table-column>
</el-table>
<!--#include("/layouts/pagination.html"){}#-->
</el-card>
<template #view>
<info ref="infoRef"></info>
</template>
<template #edit>
<manage ref="manageRef"></manage>
</template>
</guava>
</div>
<script>
<!--#include("add/manage.js"){}#-->
<!--#include("info.js"){}#-->
new Vue({
el: '#app',
mixins: [initTableMixins],
data() {
return{
tableColumns: [
{ prop: "taskName", label: "任务名称", sortable: true },
{ prop: "fileName", label: "导入文件名称", sortable: true },
{ prop: "startTime", label: "开始时间", sortable: true },
{ prop: "endTime", label: "结束时间", sortable: true },
{ prop: "status", label: "当前状态" }
],
}
},
components: {
'info': INFO,
'manage': Manage,
},
methods: {
openAdd(){
this.$refs.guava.edit()
},
openView(row){
},
openEdit(row){
},
onDelete(row){
this.$confirm("您确定要删除吗, 是否继续?", "提示", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(() => {
this.$axios.post('/platform/personnel/check/manage/onDelete', {id: row.id})
.then(res => {
if (res.code === 0) {
this.$message.success(res.msg)
this.doSearch()
} else {
this.$message.error(res.msg)
}
})
})
}
},
created() {
}
})
</script>
<!--#
}
#-->
@@ -0,0 +1,16 @@
const INFO = {
template: /*language=HTML*/ `
`,
data() {
return {
}
},
methods: {
},
created() {
}
}