提交代码
parent
497177d521
commit
dd887b0496
|
@ -0,0 +1,246 @@
|
||||||
|
##全部,根据finishTime判断代办,已办
|
||||||
|
DROP view vw_flow_all;
|
||||||
|
CREATE VIEW vw_flow_all AS (
|
||||||
|
SELECT
|
||||||
|
RES.ID_ AS procInsId,
|
||||||
|
DEF.DEPLOYMENT_ID_ AS deployId,
|
||||||
|
RES.START_TIME_ AS createTime,
|
||||||
|
RES.END_TIME_ AS finishTime,
|
||||||
|
CASE
|
||||||
|
WHEN RES.END_TIME_ IS NULL THEN
|
||||||
|
TIMESTAMPDIFF(
|
||||||
|
MINUTE,
|
||||||
|
RES.START_TIME_,
|
||||||
|
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')
|
||||||
|
)
|
||||||
|
ELSE
|
||||||
|
TIMESTAMPDIFF(
|
||||||
|
MINUTE,
|
||||||
|
RES.START_TIME_,
|
||||||
|
RES.END_TIME_
|
||||||
|
)
|
||||||
|
END AS duration,
|
||||||
|
DEF.NAME_ AS procDefName,
|
||||||
|
DEF.VERSION_ AS procDefVersion,
|
||||||
|
DEF.CATEGORY_ AS category,
|
||||||
|
DEF.KEY_ AS procDefKey,
|
||||||
|
v1.TEXT_ AS startUserId,
|
||||||
|
v2.TEXT_ AS startUserName,
|
||||||
|
v3.TEXT_ AS startDeptName,
|
||||||
|
v4.TEXT_ AS startComId,
|
||||||
|
v5.TEXT_ AS startComName,
|
||||||
|
v6.TEXT_ AS startProId,
|
||||||
|
v7.TEXT_ AS startProName,
|
||||||
|
v8.TEXT_ AS businessKey,
|
||||||
|
RES.PROC_INST_ID_,
|
||||||
|
IFNULL(hr.ID_,ht.taskId) as taskId,
|
||||||
|
IFNULL(hr.NAME_,ht.taskName) as taskName,
|
||||||
|
IF(hr.ID_ IS NULL, ht.assigneeId, tu.user_id) as assigneeId,
|
||||||
|
IF(hr.ID_ IS NULL, ht.assigneeName, tu.nick_name) as assigneeName,
|
||||||
|
IF(hr.ID_ IS NULL, ht.assigneeDeptName, td.dept_name) as assigneeDeptName,
|
||||||
|
IF(hr.ID_ IS NULL, ht.taskComType, 0) as taskComType
|
||||||
|
FROM
|
||||||
|
ACT_HI_PROCINST RES
|
||||||
|
LEFT JOIN ACT_RE_PROCDEF DEF ON RES.PROC_DEF_ID_ = DEF.ID_
|
||||||
|
LEFT JOIN act_hi_varinst v1 ON v1.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v1.NAME_ = 'INITIATOR'
|
||||||
|
LEFT JOIN act_hi_varinst v2 ON v2.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v2.NAME_ = 'userName'
|
||||||
|
LEFT JOIN act_hi_varinst v3 ON v3.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v3.NAME_ = 'userDeptName'
|
||||||
|
LEFT JOIN act_hi_varinst v4 ON v4.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v4.NAME_ = 'comId'
|
||||||
|
LEFT JOIN act_hi_varinst v5 ON v5.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v5.NAME_ = 'comName'
|
||||||
|
LEFT JOIN act_hi_varinst v6 ON v6.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v6.NAME_ = 'proId'
|
||||||
|
LEFT JOIN act_hi_varinst v7 ON v7.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v7.NAME_ = 'proName'
|
||||||
|
LEFT JOIN act_hi_varinst v8 ON v8.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v8.NAME_ = 'businessKey'
|
||||||
|
LEFT JOIN act_ru_task hr ON hr.PROC_INST_ID_ = RES.PROC_INST_ID_
|
||||||
|
LEFT JOIN act_ru_actinst ra ON ra.TASK_ID_ = hr.ID_ AND ra.PROC_INST_ID_ = RES.PROC_INST_ID_
|
||||||
|
LEFT JOIN sys_user tu ON tu.user_id = ra.ASSIGNEE_
|
||||||
|
LEFT JOIN sys_dept td ON td.dept_id = tu.dept_id
|
||||||
|
LEFT JOIN (
|
||||||
|
SELECT
|
||||||
|
ht.ID_ AS taskId,
|
||||||
|
ht.NAME_ AS taskName,
|
||||||
|
tu.user_id AS assigneeId,
|
||||||
|
tu.nick_name AS assigneeName,
|
||||||
|
td.dept_name AS assigneeDeptName,
|
||||||
|
ht.PROC_INST_ID_,
|
||||||
|
ahc.TYPE_ as taskComType
|
||||||
|
FROM
|
||||||
|
act_hi_taskinst ht
|
||||||
|
LEFT JOIN sys_user tu ON tu.user_id = ht.ASSIGNEE_
|
||||||
|
LEFT JOIN sys_dept td ON td.dept_id = tu.dept_id
|
||||||
|
left join act_hi_comment ahc on ahc.TASK_ID_ = ht.ID_ AND ahc.PROC_INST_ID_ is not NULL
|
||||||
|
WHERE
|
||||||
|
ht.ID_ IN (
|
||||||
|
SELECT
|
||||||
|
MAX(ID_)
|
||||||
|
FROM
|
||||||
|
act_hi_taskinst
|
||||||
|
GROUP BY
|
||||||
|
PROC_INST_ID_
|
||||||
|
)
|
||||||
|
GROUP BY ht.PROC_INST_ID_
|
||||||
|
) ht ON ht.PROC_INST_ID_ = RES.PROC_INST_ID_
|
||||||
|
)
|
||||||
|
|
||||||
|
##待办
|
||||||
|
DROP view vw_flow_await;
|
||||||
|
CREATE VIEW vw_flow_await AS (
|
||||||
|
SELECT
|
||||||
|
RES.ID_ AS taskId,
|
||||||
|
RES.NAME_ AS taskName,
|
||||||
|
re.ID_ AS procInsId,
|
||||||
|
DEF.DEPLOYMENT_ID_ AS deployId,
|
||||||
|
DATE_FORMAT(re.START_TIME_, '%Y-%m-%d %H:%i:%S') AS createTime,
|
||||||
|
TIMESTAMPDIFF(
|
||||||
|
MINUTE,
|
||||||
|
re.START_TIME_,
|
||||||
|
DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%S')
|
||||||
|
) AS duration,
|
||||||
|
DEF.NAME_ AS procDefName,
|
||||||
|
DEF.VERSION_ AS procDefVersion,
|
||||||
|
DEF.CATEGORY_ AS category,
|
||||||
|
DEF.KEY_ AS procDefKey,
|
||||||
|
v1.TEXT_ AS startUserId,
|
||||||
|
v2.TEXT_ AS startUserName,
|
||||||
|
v3.TEXT_ AS startDeptName,
|
||||||
|
v4.TEXT_ AS startComId,
|
||||||
|
v5.TEXT_ AS startComName,
|
||||||
|
v6.TEXT_ AS startProId,
|
||||||
|
v7.TEXT_ AS startProName,
|
||||||
|
v8.TEXT_ AS businessKey,
|
||||||
|
RES.SUSPENSION_STATE_,
|
||||||
|
RES.ASSIGNEE_,
|
||||||
|
LINK.USER_ID_,
|
||||||
|
LINK.GROUP_ID_
|
||||||
|
FROM
|
||||||
|
ACT_RU_TASK RES
|
||||||
|
LEFT JOIN act_ru_execution re ON re.PARENT_ID_ IS NULL AND re.PROC_INST_ID_ = RES.PROC_INST_ID_
|
||||||
|
LEFT OUTER JOIN ACT_RE_PROCDEF DEF ON re.PROC_DEF_ID_ = DEF.ID_
|
||||||
|
LEFT JOIN act_hi_varinst v1 ON v1.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v1.NAME_ = 'INITIATOR'
|
||||||
|
LEFT JOIN act_hi_varinst v2 ON v2.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v2.NAME_ = 'userName'
|
||||||
|
LEFT JOIN act_hi_varinst v3 ON v3.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v3.NAME_ = 'userDeptName'
|
||||||
|
LEFT JOIN act_hi_varinst v4 ON v4.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v4.NAME_ = 'comId'
|
||||||
|
LEFT JOIN act_hi_varinst v5 ON v5.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v5.NAME_ = 'comName'
|
||||||
|
LEFT JOIN act_hi_varinst v6 ON v6.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v6.NAME_ = 'proId'
|
||||||
|
LEFT JOIN act_hi_varinst v7 ON v7.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v7.NAME_ = 'proName'
|
||||||
|
LEFT JOIN act_hi_varinst v8 ON v8.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v8.NAME_ = 'businessKey'
|
||||||
|
LEFT JOIN ACT_RU_IDENTITYLINK LINK on LINK.TASK_ID_ = RES.ID_ AND LINK.TYPE_ = 'candidate'
|
||||||
|
WHERE
|
||||||
|
RES.SUSPENSION_STATE_ = 1)
|
||||||
|
##下面是当前登录人代办查询条件
|
||||||
|
-- AND (
|
||||||
|
-- RES.ASSIGNEE_ = 1
|
||||||
|
-- OR (
|
||||||
|
-- RES.ASSIGNEE_ IS NULL
|
||||||
|
-- AND EXISTS (
|
||||||
|
-- SELECT
|
||||||
|
-- LINK.ID_
|
||||||
|
-- FROM
|
||||||
|
-- ACT_RU_IDENTITYLINK LINK
|
||||||
|
-- WHERE
|
||||||
|
-- LINK.TASK_ID_ = RES.ID_
|
||||||
|
-- AND LINK.TYPE_ = 'candidate'
|
||||||
|
-- AND (
|
||||||
|
-- LINK.USER_ID_ = 1
|
||||||
|
-- OR (
|
||||||
|
-- LINK.GROUP_ID_ IN (1, 42, 45, 46)
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
-- )
|
||||||
|
|
||||||
|
##审批意见
|
||||||
|
DROP view vw_flow_comment;
|
||||||
|
CREATE VIEW vw_flow_comment AS (
|
||||||
|
SELECT
|
||||||
|
hc.ID_ AS commentId,
|
||||||
|
hc.TYPE_ AS commentType,
|
||||||
|
ht.ID_ AS taskId,
|
||||||
|
ht.NAME_ AS taskName,
|
||||||
|
ht.REV_ AS rev,
|
||||||
|
CASE
|
||||||
|
WHEN hc.TYPE_ = 1 and ht.NAME_ !='提交申请' THEN
|
||||||
|
'通过'
|
||||||
|
WHEN hc.TYPE_ = 2 THEN
|
||||||
|
'退回'
|
||||||
|
WHEN hc.TYPE_ = 3 THEN
|
||||||
|
'驳回'
|
||||||
|
WHEN hc.TYPE_ = 4 THEN
|
||||||
|
'委派'
|
||||||
|
WHEN hc.TYPE_ = 5 THEN
|
||||||
|
'转办'
|
||||||
|
WHEN hc.TYPE_ = 6 THEN
|
||||||
|
'终止'
|
||||||
|
WHEN hc.TYPE_ = 7 THEN
|
||||||
|
'撤回'
|
||||||
|
END AS commentResult,
|
||||||
|
ht.PROC_INST_ID_ AS procInstId,
|
||||||
|
ht.TASK_DEF_KEY_ AS taskDefKey,
|
||||||
|
ht.EXECUTION_ID_ AS executionId,
|
||||||
|
ht.DELETE_REASON_ AS deleteReason,
|
||||||
|
DATE_FORMAT(
|
||||||
|
ht.START_TIME_,
|
||||||
|
'%Y-%m-%d %H:%i:%S'
|
||||||
|
) AS startTime,
|
||||||
|
DATE_FORMAT(
|
||||||
|
ht.END_TIME_,
|
||||||
|
'%Y-%m-%d %H:%i:%S'
|
||||||
|
) AS endTime,
|
||||||
|
ht.DURATION_ AS duration,
|
||||||
|
hc.MESSAGE_ AS message,
|
||||||
|
ru.nick_name AS assigneeName,
|
||||||
|
IF(ru.dept_id IS NOT NULL, rd.dept_name, ru.remark) as deptName,
|
||||||
|
sr.role_name as candidate
|
||||||
|
FROM
|
||||||
|
act_hi_taskinst ht
|
||||||
|
LEFT JOIN act_hi_comment hc ON hc.TASK_ID_ = ht.ID_ or (hc.TASK_ID_ is null and hc.PROC_INST_ID_ = ht.PROC_INST_ID_)
|
||||||
|
LEFT JOIN act_hi_identitylink hi on hi.TASK_ID_ = ht.ID_ and hi.TYPE_ = 'candidate'
|
||||||
|
left JOIN sys_role sr on sr.role_id = hi.group_Id_
|
||||||
|
LEFT JOIN sys_user ru ON ru.user_id = ht.ASSIGNEE_
|
||||||
|
LEFT JOIN sys_dept rd ON rd.dept_id = ru.dept_id
|
||||||
|
where hc.TYPE_ is null or hc.TYPE_!='event')
|
||||||
|
|
||||||
|
##已办
|
||||||
|
DROP view vw_flow_finished;
|
||||||
|
CREATE VIEW vw_flow_finished AS (
|
||||||
|
SELECT
|
||||||
|
RES.ID_ AS taskId,
|
||||||
|
RES.NAME_ AS taskName,
|
||||||
|
RES.PROC_INST_ID_ AS procInsId,
|
||||||
|
pd.DEPLOYMENT_ID_ as deployId,
|
||||||
|
DATE_FORMAT(RES.START_TIME_, '%Y-%m-%d %H:%i:%S') AS createTime,
|
||||||
|
DATE_FORMAT(RES.END_TIME_, '%Y-%m-%d %H:%i:%S') AS endTime,
|
||||||
|
TIMESTAMPDIFF(
|
||||||
|
MINUTE,
|
||||||
|
res.START_TIME_,
|
||||||
|
RES.END_TIME_
|
||||||
|
) AS duration,
|
||||||
|
DEF.END_TIME_ as finishTime,
|
||||||
|
pd.NAME_ AS procDefName,
|
||||||
|
pd.CATEGORY_ AS category,
|
||||||
|
pd.KEY_ AS procDefKey,
|
||||||
|
v1.TEXT_ AS startUserId,
|
||||||
|
v2.TEXT_ AS startUserName,
|
||||||
|
v3.TEXT_ AS startDeptName,
|
||||||
|
v4.TEXT_ AS startComId,
|
||||||
|
v5.TEXT_ AS startComName,
|
||||||
|
v6.TEXT_ AS startProId,
|
||||||
|
v7.TEXT_ AS startProName,
|
||||||
|
v8.TEXT_ AS businessKey,
|
||||||
|
RES.ASSIGNEE_,
|
||||||
|
ahc.TYPE_ as taskComType
|
||||||
|
FROM
|
||||||
|
act_hi_taskinst RES
|
||||||
|
LEFT OUTER JOIN act_hi_procinst DEF ON RES.PROC_INST_ID_ = DEF.PROC_INST_ID_
|
||||||
|
LEFT OUTER join act_re_procdef pd on RES.PROC_DEF_ID_ = pd.ID_
|
||||||
|
LEFT JOIN act_hi_varinst v1 ON v1.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v1.NAME_ = 'INITIATOR'
|
||||||
|
LEFT JOIN act_hi_varinst v2 ON v2.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v2.NAME_ = 'userName'
|
||||||
|
LEFT JOIN act_hi_varinst v3 ON v3.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v3.NAME_ = 'userDeptName'
|
||||||
|
LEFT JOIN act_hi_varinst v4 ON v4.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v4.NAME_ = 'comId'
|
||||||
|
LEFT JOIN act_hi_varinst v5 ON v5.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v5.NAME_ = 'comName'
|
||||||
|
LEFT JOIN act_hi_varinst v6 ON v6.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v6.NAME_ = 'proId'
|
||||||
|
LEFT JOIN act_hi_varinst v7 ON v7.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v7.NAME_ = 'proName'
|
||||||
|
LEFT JOIN act_hi_varinst v8 ON v8.PROC_INST_ID_ = RES.PROC_INST_ID_ AND v8.NAME_ = 'businessKey'
|
||||||
|
left join act_hi_comment ahc on ahc.TASK_ID_ = RES.ID_ AND ahc.PROC_INST_ID_ is not NULL
|
||||||
|
WHERE
|
||||||
|
RES.ASSIGNEE_ is not null and RES.END_TIME_ is not null)
|
|
@ -3,6 +3,7 @@ package com.yanzhu.system.api;
|
||||||
import com.yanzhu.common.core.constant.SecurityConstants;
|
import com.yanzhu.common.core.constant.SecurityConstants;
|
||||||
import com.yanzhu.common.core.constant.ServiceNameConstants;
|
import com.yanzhu.common.core.constant.ServiceNameConstants;
|
||||||
import com.yanzhu.common.core.domain.R;
|
import com.yanzhu.common.core.domain.R;
|
||||||
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
import com.yanzhu.system.api.domain.SysUser;
|
import com.yanzhu.system.api.domain.SysUser;
|
||||||
import com.yanzhu.system.api.factory.RemoteFileFallbackFactory;
|
import com.yanzhu.system.api.factory.RemoteFileFallbackFactory;
|
||||||
import org.springframework.cloud.openfeign.FeignClient;
|
import org.springframework.cloud.openfeign.FeignClient;
|
||||||
|
@ -38,4 +39,14 @@ public interface RemoteProService
|
||||||
*/
|
*/
|
||||||
@GetMapping("/proProjectInfoUsers/projects/{userId}")
|
@GetMapping("/proProjectInfoUsers/projects/{userId}")
|
||||||
public R<List<Map<String, Object>>> getProjects(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
public R<List<Map<String, Object>>> getProjects(@PathVariable("userId") Long userId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分包人员审批通过信息同步
|
||||||
|
*
|
||||||
|
* @param busKey 业务主键
|
||||||
|
* @param source 请求来源
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
@GetMapping("/proProjectInfoSubdeptsUsers/approveSubDeptsUser/{busKey}")
|
||||||
|
public R<AjaxResult> approveSubDeptsUser(@PathVariable("busKey") Long busKey, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package com.yanzhu.system.api.factory;
|
package com.yanzhu.system.api.factory;
|
||||||
|
|
||||||
import com.yanzhu.common.core.domain.R;
|
import com.yanzhu.common.core.domain.R;
|
||||||
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
import com.yanzhu.system.api.RemoteProService;
|
import com.yanzhu.system.api.RemoteProService;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
|
@ -37,6 +38,12 @@ public class RemoteProFallbackFactory implements FallbackFactory<RemoteProServic
|
||||||
{
|
{
|
||||||
return R.fail("获取用户项目信息失败:" + throwable.getMessage());
|
return R.fail("获取用户项目信息失败:" + throwable.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public R<AjaxResult> approveSubDeptsUser(Long busKey, String source)
|
||||||
|
{
|
||||||
|
return R.fail("审批通过信息同步失败:" + throwable.getMessage());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -56,7 +56,7 @@ public class BaseEntity implements Serializable
|
||||||
/** 选中项目 */
|
/** 选中项目 */
|
||||||
private String activeProjectName;
|
private String activeProjectName;
|
||||||
|
|
||||||
/** 选中页签 */
|
/** 选中用户 */
|
||||||
private Long currentUserId;
|
private Long currentUserId;
|
||||||
|
|
||||||
/** 数据来源 */
|
/** 数据来源 */
|
||||||
|
|
|
@ -19,9 +19,6 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
|
|
||||||
private String businessKey;
|
private String businessKey;
|
||||||
|
|
||||||
@ApiModelProperty("业务名称")
|
|
||||||
private String businessKeyName;
|
|
||||||
|
|
||||||
@ApiModelProperty("任务编号")
|
@ApiModelProperty("任务编号")
|
||||||
private String taskId;
|
private String taskId;
|
||||||
|
|
||||||
|
@ -40,9 +37,6 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
@ApiModelProperty("部门名称")
|
@ApiModelProperty("部门名称")
|
||||||
private String deptName;
|
private String deptName;
|
||||||
|
|
||||||
@ApiModelProperty("流程发起人部门名称")
|
|
||||||
private String startDeptName;
|
|
||||||
|
|
||||||
@ApiModelProperty("任务执行人名称")
|
@ApiModelProperty("任务执行人名称")
|
||||||
private String assigneeName;
|
private String assigneeName;
|
||||||
|
|
||||||
|
@ -55,6 +49,9 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
@ApiModelProperty("流程发起人名称")
|
@ApiModelProperty("流程发起人名称")
|
||||||
private String startUserName;
|
private String startUserName;
|
||||||
|
|
||||||
|
@ApiModelProperty("流程发起人单位")
|
||||||
|
private String startDeptName;
|
||||||
|
|
||||||
@ApiModelProperty("流程类型")
|
@ApiModelProperty("流程类型")
|
||||||
private String category;
|
private String category;
|
||||||
|
|
||||||
|
@ -91,10 +88,6 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
@ApiModelProperty("候选执行人")
|
@ApiModelProperty("候选执行人")
|
||||||
private String candidate;
|
private String candidate;
|
||||||
|
|
||||||
@ApiModelProperty("任务创建时间")
|
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
|
||||||
private Date createTime;
|
|
||||||
|
|
||||||
@ApiModelProperty("任务完成时间")
|
@ApiModelProperty("任务完成时间")
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
|
||||||
private Date finishTime;
|
private Date finishTime;
|
||||||
|
@ -102,38 +95,24 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
@ApiModelProperty("任务完成类型")
|
@ApiModelProperty("任务完成类型")
|
||||||
private String taskComType;
|
private String taskComType;
|
||||||
|
|
||||||
private long deptId;
|
@ApiModelProperty("公司主键")
|
||||||
private long projectId;
|
private String startComId;
|
||||||
|
|
||||||
|
@ApiModelProperty("公司名称")
|
||||||
|
private String startComName;
|
||||||
|
|
||||||
|
@ApiModelProperty("项目单位")
|
||||||
|
private String startProId;
|
||||||
|
|
||||||
|
@ApiModelProperty("项目单位名称")
|
||||||
|
private String startProName;
|
||||||
|
|
||||||
@ApiModelProperty("单位祖籍列表")
|
@ApiModelProperty("单位祖籍列表")
|
||||||
private String deptAncestors;
|
private String deptAncestors;
|
||||||
|
|
||||||
public long getDeptId() {
|
@ApiModelProperty("角色列表")
|
||||||
return deptId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setDeptId(long deptId) {
|
|
||||||
this.deptId = deptId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public long getProjectId() {
|
|
||||||
return projectId;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setProjectId(long projectId) {
|
|
||||||
this.projectId = projectId;
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Long> roleIds;
|
private List<Long> roleIds;
|
||||||
|
|
||||||
public String getBusinessKeyName() {
|
|
||||||
return businessKeyName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void setBusinessKeyName(String businessKeyName) {
|
|
||||||
this.businessKeyName = businessKeyName;
|
|
||||||
}
|
|
||||||
|
|
||||||
public String getTaskId() {
|
public String getTaskId() {
|
||||||
return taskId;
|
return taskId;
|
||||||
}
|
}
|
||||||
|
@ -318,16 +297,6 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
this.candidate = candidate;
|
this.candidate = candidate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public Date getCreateTime() {
|
|
||||||
return createTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setCreateTime(Date createTime) {
|
|
||||||
this.createTime = createTime;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Date getFinishTime() {
|
public Date getFinishTime() {
|
||||||
return finishTime;
|
return finishTime;
|
||||||
}
|
}
|
||||||
|
@ -360,6 +329,38 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
this.taskComType = taskComType;
|
this.taskComType = taskComType;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getStartComId() {
|
||||||
|
return startComId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartComId(String startComId) {
|
||||||
|
this.startComId = startComId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStartComName() {
|
||||||
|
return startComName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartComName(String startComName) {
|
||||||
|
this.startComName = startComName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStartProId() {
|
||||||
|
return startProId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartProId(String startProId) {
|
||||||
|
this.startProId = startProId;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getStartProName() {
|
||||||
|
return startProName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setStartProName(String startProName) {
|
||||||
|
this.startProName = startProName;
|
||||||
|
}
|
||||||
|
|
||||||
public String getDeptAncestors() {
|
public String getDeptAncestors() {
|
||||||
return deptAncestors;
|
return deptAncestors;
|
||||||
}
|
}
|
||||||
|
@ -367,4 +368,6 @@ public class FlowTaskEntity extends BaseEntity {
|
||||||
public void setDeptAncestors(String deptAncestors) {
|
public void setDeptAncestors(String deptAncestors) {
|
||||||
this.deptAncestors = deptAncestors;
|
this.deptAncestors = deptAncestors;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,9 +14,15 @@ import lombok.Data;
|
||||||
@ApiModel("工作流任务相关--请求参数")
|
@ApiModel("工作流任务相关--请求参数")
|
||||||
public class FlowQueryVo {
|
public class FlowQueryVo {
|
||||||
|
|
||||||
|
@ApiModelProperty("项目单位")
|
||||||
|
private String proName;
|
||||||
|
|
||||||
@ApiModelProperty("流程名称")
|
@ApiModelProperty("流程名称")
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
|
@ApiModelProperty("流程分类")
|
||||||
|
private String category;
|
||||||
|
|
||||||
@ApiModelProperty("开始时间")
|
@ApiModelProperty("开始时间")
|
||||||
private String startTime;
|
private String startTime;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package com.yanzhu.flowable.mapper;
|
package com.yanzhu.flowable.mapper;
|
||||||
|
|
||||||
import com.yanzhu.flowable.domain.my.FlowTaskEntity;
|
import com.yanzhu.flowable.domain.my.FlowTaskEntity;
|
||||||
import org.apache.ibatis.annotations.Param;
|
|
||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -25,13 +24,6 @@ public interface FlowBusinessKeyMapper {
|
||||||
*/
|
*/
|
||||||
public FlowTaskEntity findFlowTaskByProcInsId(String procInsId);
|
public FlowTaskEntity findFlowTaskByProcInsId(String procInsId);
|
||||||
|
|
||||||
/**
|
|
||||||
* 查询项目信息
|
|
||||||
* @param proId
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public Map<String,Object> selectSurProjectById(Long proId);
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 根据流程Id查询操作日志
|
* 根据流程Id查询操作日志
|
||||||
* @param procInsId
|
* @param procInsId
|
||||||
|
@ -74,39 +66,4 @@ public interface FlowBusinessKeyMapper {
|
||||||
*/
|
*/
|
||||||
public List<Map<String, Object>> selectMyFinishedFlowTask(FlowTaskEntity flowTaskEntity);
|
public List<Map<String, Object>> selectMyFinishedFlowTask(FlowTaskEntity flowTaskEntity);
|
||||||
|
|
||||||
public List<FlowTaskEntity> groupByCategory(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> groupByUnit(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> listByUnit(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> listByState(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> groupByUnitTotal(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> groupByUnitFinish(FlowTaskEntity where);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> groupByProject(@Param("deptId")long deptId,@Param("proType")String proType);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 根据条件查询安全类作业工作流列表
|
|
||||||
* @param flowTaskEntity
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public List<FlowTaskEntity> findSafetyWorkList(FlowTaskEntity flowTaskEntity);
|
|
||||||
|
|
||||||
public List<FlowTaskEntity> listByCategory(FlowTaskEntity where);
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 工程管理-分包单位占比
|
|
||||||
* @param where
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public List<FlowTaskEntity> groupFlowBySubDeptType(FlowTaskEntity where);
|
|
||||||
/**
|
|
||||||
* 工程管理-分包单位资质审批明细
|
|
||||||
* @param where
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public List<FlowTaskEntity> listFlowBySubDeptType(FlowTaskEntity where);
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,12 +77,18 @@ public class BusTrainingVideoUser extends BaseEntity
|
||||||
private String trainTitle;
|
private String trainTitle;
|
||||||
|
|
||||||
/** 培训类型 */
|
/** 培训类型 */
|
||||||
@Excel(name = "培训类型")
|
|
||||||
private String trainType;
|
private String trainType;
|
||||||
|
|
||||||
|
/** 培训类型 */
|
||||||
|
@Excel(name = "培训类型")
|
||||||
|
private String trainTypeName;
|
||||||
|
|
||||||
|
/** 培训级别 */
|
||||||
|
private String trainLevel;
|
||||||
|
|
||||||
/** 培训级别 */
|
/** 培训级别 */
|
||||||
@Excel(name = "培训级别")
|
@Excel(name = "培训级别")
|
||||||
private String trainLevel;
|
private String trainLevelName;
|
||||||
|
|
||||||
/** 培训文件地址 */
|
/** 培训文件地址 */
|
||||||
@Excel(name = "培训文件地址")
|
@Excel(name = "培训文件地址")
|
||||||
|
@ -253,6 +259,22 @@ public class BusTrainingVideoUser extends BaseEntity
|
||||||
this.playDates = playDates;
|
this.playDates = playDates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getTrainTypeName() {
|
||||||
|
return trainTypeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrainTypeName(String trainTypeName) {
|
||||||
|
this.trainTypeName = trainTypeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTrainLevelName() {
|
||||||
|
return trainLevelName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setTrainLevelName(String trainLevelName) {
|
||||||
|
this.trainLevelName = trainLevelName;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
|
|
|
@ -78,19 +78,19 @@ public class ProProjectInfoSubdepts extends BaseEntity
|
||||||
@Excel(name = "合同承包内容")
|
@Excel(name = "合同承包内容")
|
||||||
private String contractInfos;
|
private String contractInfos;
|
||||||
|
|
||||||
/** 进场时间 */
|
/** 进入场地时间 */
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
@Excel(name = "进场时间")
|
@Excel(name = "进入场地时间")
|
||||||
private Date useDates;
|
private Date useDates;
|
||||||
|
|
||||||
/** 进场时间 */
|
/** 计划开工时间 */
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
@Excel(name = "进场时间")
|
@Excel(name = "计划开工时间")
|
||||||
private Date startWorkDates;
|
private Date startWorkDates;
|
||||||
|
|
||||||
/** 进场时间 */
|
/** 计划完工时间 */
|
||||||
@JsonFormat(pattern = "yyyy-MM-dd")
|
@JsonFormat(pattern = "yyyy-MM-dd")
|
||||||
@Excel(name = "进场时间")
|
@Excel(name = "计划完工时间")
|
||||||
private Date endWorkDates;
|
private Date endWorkDates;
|
||||||
|
|
||||||
/** 进场状态 */
|
/** 进场状态 */
|
||||||
|
|
|
@ -57,6 +57,7 @@ public class ProProjectInfoSubdeptsUsers extends BaseEntity
|
||||||
/** 单位类型 */
|
/** 单位类型 */
|
||||||
|
|
||||||
private String subDeptType;
|
private String subDeptType;
|
||||||
|
private String subDeptTypeName;
|
||||||
|
|
||||||
/** 用户主键 */
|
/** 用户主键 */
|
||||||
|
|
||||||
|
@ -139,6 +140,9 @@ public class ProProjectInfoSubdeptsUsers extends BaseEntity
|
||||||
/** 劳务人员学历 */
|
/** 劳务人员学历 */
|
||||||
private String degreeGrade;
|
private String degreeGrade;
|
||||||
|
|
||||||
|
/** 劳务人员学历 */
|
||||||
|
private String degreeGradeName;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 用户岗位
|
* 用户岗位
|
||||||
*/
|
*/
|
||||||
|
@ -483,6 +487,22 @@ public class ProProjectInfoSubdeptsUsers extends BaseEntity
|
||||||
this.qrCode = qrCode;
|
this.qrCode = qrCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getSubDeptTypeName() {
|
||||||
|
return subDeptTypeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setSubDeptTypeName(String subDeptTypeName) {
|
||||||
|
this.subDeptTypeName = subDeptTypeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getDegreeGradeName() {
|
||||||
|
return degreeGradeName;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setDegreeGradeName(String degreeGradeName) {
|
||||||
|
this.degreeGradeName = degreeGradeName;
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
|
||||||
|
|
|
@ -4,47 +4,23 @@
|
||||||
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
||||||
<mapper namespace="com.yanzhu.flowable.mapper.FlowBusinessKeyMapper">
|
<mapper namespace="com.yanzhu.flowable.mapper.FlowBusinessKeyMapper">
|
||||||
|
|
||||||
<!-- fa.procInsId,-->
|
|
||||||
<!-- fa.deployId,-->
|
|
||||||
<!-- fa.createTime,-->
|
|
||||||
<!-- fa.finishTime,-->
|
|
||||||
<!-- fa.duration,-->
|
|
||||||
<!-- fa.procDefKey,-->
|
|
||||||
<!-- fa.procDefName,-->
|
|
||||||
<!-- fa.procDefVersion,-->
|
|
||||||
<!-- fa.category,-->
|
|
||||||
<!-- fa.businessKey,-->
|
|
||||||
<!-- fa.businessDeptId,-->
|
|
||||||
<!-- fa.businessKeyName,-->
|
|
||||||
<!-- fa.startUserId,-->
|
|
||||||
<!-- fa.startUserName,-->
|
|
||||||
<!-- fa.startDeptName,-->
|
|
||||||
<!-- fa.taskId,-->
|
|
||||||
<!-- fa.taskName,-->
|
|
||||||
<!-- fa.assigneeId,-->
|
|
||||||
<!-- fa.assigneeName,-->
|
|
||||||
<!-- fa.assigneeDeptName-->
|
|
||||||
<select id="selectAllFlowTaskByParams" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
<select id="selectAllFlowTaskByParams" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
||||||
SELECT * FROM
|
SELECT * FROM vw_flow_all fa
|
||||||
vw_flow_all fa
|
|
||||||
<where>
|
<where>
|
||||||
<if test="taskName != null and taskName != ''"> and fa.taskName like concat('%', #{taskName}, '%')</if>
|
<if test="taskName != null and taskName != ''"> and fa.taskName like concat('%', #{taskName}, '%')</if>
|
||||||
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
||||||
<if test="procDefKey != null and procDefKey != ''"> and fa.procDefKey = #{procDefKey}</if>
|
<if test="procDefKey != null and procDefKey != ''"> and fa.procDefKey = #{procDefKey}</if>
|
||||||
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
||||||
<if test="startDeptName != null and startDeptName != ''"> and fa.startDeptName like concat('%', #{startDeptName}, '%')</if>
|
<if test="startUserId != null and startUserId != ''"> and fa.startUserId = #{startUserId}</if>
|
||||||
<if test="startUserName != null and startUserName != ''"> and fa.startUserName like concat('%', #{startUserName}, '%')</if>
|
<if test="startUserName != null and startUserName != ''"> and fa.startUserName like concat('%', #{startUserName}, '%')</if>
|
||||||
<if test="businessKeyName != null and businessKeyName != ''"> and fa.businessKeyName like concat('%', #{businessKeyName}, '%')</if>
|
<if test="startDeptName != null and startDeptName != ''"> and fa.startDeptName like concat('%', #{startDeptName}, '%')</if>
|
||||||
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
||||||
<if test="params.beginDate != null and params.beginDate != '' and params.endDate != null and params.endDate != ''"> and fa.createTime between #{params.beginDate} and #{params.endDate}</if>
|
<if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''"> and date(fa.createTime) between #{params.beginTime} and #{params.endTime}</if>
|
||||||
<!-- 查询条件-项目部门 -->
|
<!-- 查询条件-项目部门 -->
|
||||||
<if test="projectDeptId != null "> and fa.businessDeptId = #{projectDeptId}</if>
|
<if test="startComId != null and startComId != ''"> and fa.startComId = #{startComId}</if>
|
||||||
<!--子部门数据-->
|
<if test="startComName != null and startComName != ''"> and fa.startComName like concat('%', #{startComName}, '%')</if>
|
||||||
<if test='nowRole == "4"'> and fa.businessDeptId = #{nowDept}</if>
|
<if test="startProId != null and startProId != ''"> and fa.startProId = #{startProId}</if>
|
||||||
<!--监理单位/总包公司/分包单位查询当前关联数据-->
|
<if test="startProName != null and startProName != ''"> and fa.startProName like concat('%', #{startProName}, '%')</if>
|
||||||
<if test='nowRole == "5" or nowRole == "6" or nowRole == "7"'> and fa.businessKey in (select DISTINCT projectId from sur_project_unit_info where unitId=#{nowDept} and del_flag=0)</if>
|
|
||||||
<!--普通用户查询项目人员-->
|
|
||||||
<if test='nowRole == "15" or nowRole == "16" or nowRole == "17" or nowRole == "99"'> and fa.startUserId = #{nowUser}</if>
|
|
||||||
<if test='activeTags == "await"'> and fa.finishTime is null</if>
|
<if test='activeTags == "await"'> and fa.finishTime is null</if>
|
||||||
<if test='activeTags == "finished"'> and fa.finishTime is not null</if>
|
<if test='activeTags == "finished"'> and fa.finishTime is not null</if>
|
||||||
</where>
|
</where>
|
||||||
|
@ -53,47 +29,46 @@
|
||||||
|
|
||||||
<!--查询工作流任务-->
|
<!--查询工作流任务-->
|
||||||
<select id="findFlowTaskByProcInsId" parameterType="string" resultType="FlowTaskEntity">
|
<select id="findFlowTaskByProcInsId" parameterType="string" resultType="FlowTaskEntity">
|
||||||
select vf.* as startUserPhone from vw_flow_all vf
|
select * from vw_flow_all where procInsId = #{procInsId}
|
||||||
where vf.procInsId = #{procInsId}
|
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--查询工作流操作日志-->
|
<!--查询工作流操作日志-->
|
||||||
<select id="selectCommentByProcInsId" parameterType="string" resultType="map">
|
<select id="selectCommentByProcInsId" parameterType="string" resultType="Map">
|
||||||
select * from vw_flow_comment where procInstId = #{procInstId} order by startTime DESC
|
select * from vw_flow_comment where procInstId = #{procInstId} order by startTime DESC
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="selectLastCommentByProcInsId" parameterType="string" resultType="map">
|
<select id="selectLastCommentByProcInsId" parameterType="string" resultType="Map">
|
||||||
select * from vw_flow_comment where procInstId = #{procInstId} order by startTime DESC limit 1
|
select * from vw_flow_comment where procInstId = #{procInstId} order by startTime DESC limit 1
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--查询工作流携带的参数-->
|
<!--查询工作流携带的参数-->
|
||||||
<select id="selectFormDatasByProcInsId" parameterType="string" resultType="map">
|
<select id="selectFormDatasByProcInsId" parameterType="string" resultType="Map">
|
||||||
select hv.NAME_ as `name`,hv.TEXT_ as text from act_hi_varinst hv where hv.PROC_INST_ID_ = #{procInstId}
|
select hv.NAME_ as `name`,hv.TEXT_ as text from act_hi_varinst hv where hv.PROC_INST_ID_ = #{procInstId}
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--查询我的代办任务-->
|
<!--查询我的代办任务-->
|
||||||
<select id="selectMyAwaitFlowTask" parameterType="FlowTaskEntity" resultType="map">
|
<select id="selectMyAwaitFlowTask" parameterType="FlowTaskEntity" resultType="Map">
|
||||||
select fa.* from vw_flow_await fa
|
select fa.* from vw_flow_await fa
|
||||||
where
|
where
|
||||||
1=1
|
fa.taskName != '申请人提交'
|
||||||
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
||||||
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
||||||
<if test="businessKeyName != null and businessKeyName != ''"> and fa.businessKeyName like concat('%', #{businessKeyName}, '%')</if>
|
<if test="startUserId != null and startUserId != ''"> and fa.startUserId = #{startUserId}</if>
|
||||||
|
<if test="startUserName != null and startUserName != ''"> and fa.startUserName like concat('%', #{startUserName}, '%')</if>
|
||||||
|
<if test="startDeptName != null and startDeptName != ''"> and fa.startDeptName like concat('%', #{startDeptName}, '%')</if>
|
||||||
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
||||||
<if test="params.beginDate != null and params.beginDate != '' and params.endDate != null and params.endDate != ''"> and fa.createTime between #{params.beginDate} and #{params.endDate}</if>
|
<if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''"> and date(fa.createTime) between #{params.beginTime} and #{params.endTime}</if>
|
||||||
<!-- 查询条件-项目部门 -->
|
<!-- 查询条件-项目部门 -->
|
||||||
<if test="projectDeptId != null "> and fa.businessDeptId = #{projectDeptId}</if>
|
<if test="startComId != null and startComId != ''"> and fa.startComId = #{startComId}</if>
|
||||||
<!--子部门数据-->
|
<if test="startComName != null and startComName != ''"> and fa.startComName like concat('%', #{startComName}, '%')</if>
|
||||||
<if test='nowRole == "4"'> and fa.businessDeptId = #{nowDept}</if>
|
<if test="startProId != null and startProId != ''"> and fa.startProId = #{startProId}</if>
|
||||||
<!--监理单位/总包公司/分包单位查询当前关联数据-->
|
<if test="startProName != null and startProName != ''"> and fa.startProName like concat('%', #{startProName}, '%')</if>
|
||||||
<if test='nowRole == "5" or nowRole == "6" or nowRole == "7"'> and fa.businessKey in (select DISTINCT projectId from sur_project_unit_info where unitId=#{nowDept} and del_flag=0)</if>
|
<if test="assigneeId != null and roleIds != null and roleIds.size()>0">
|
||||||
<!--普通用户查询项目人员-->
|
AND (fa.ASSIGNEE_ = #{assigneeId}
|
||||||
<if test='nowRole == "15" or nowRole == "16" or nowRole == "17" or nowRole == "99"'> and fa.businessKey in (select DISTINCT project_id from sur_project_userinfo where user_id=#{nowUser} and is_del=0)</if>
|
|
||||||
AND (fa.ASSIGNEE_ = #{nowUser}
|
|
||||||
OR (
|
OR (
|
||||||
fa.ASSIGNEE_ IS NULL
|
fa.ASSIGNEE_ IS NULL
|
||||||
AND (
|
AND (
|
||||||
fa.USER_ID_ = #{nowUser}
|
fa.USER_ID_ = #{assigneeId}
|
||||||
OR (
|
OR (
|
||||||
fa.GROUP_ID_ IN
|
fa.GROUP_ID_ IN
|
||||||
<foreach collection="roleIds" item="roleId" open="(" separator="," close=")">
|
<foreach collection="roleIds" item="roleId" open="(" separator="," close=")">
|
||||||
|
@ -103,31 +78,28 @@
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
</if>
|
||||||
order by fa.createTime desc
|
order by fa.createTime desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--根据条件查询我的代办分组数量统计-->
|
<!--根据条件查询我的代办分组数量统计-->
|
||||||
<select id="findAwaitCountGroupByCategory" parameterType="FlowTaskEntity" resultType="map">
|
<select id="findAwaitCountGroupByCategory" parameterType="FlowTaskEntity" resultType="Map">
|
||||||
select fa.category,count(1) as total from vw_flow_await fa
|
select fa.category, count(1) as total from vw_flow_await fa where 1=1
|
||||||
where
|
|
||||||
1=1
|
|
||||||
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
||||||
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
||||||
<if test="businessKeyName != null and businessKeyName != ''"> and fa.businessKeyName like concat('%', #{businessKeyName}, '%')</if>
|
<if test="startUserId != null and startUserId != ''"> and fa.startUserId = #{startUserId}</if>
|
||||||
<if test="params.beginDate != null and params.beginDate != '' and params.endDate != null and params.endDate != ''"> and fa.createTime between #{params.beginDate} and #{params.endDate}</if>
|
<if test="startUserName != null and startUserName != ''"> and fa.startUserName like concat('%', #{startUserName}, '%')</if>
|
||||||
|
<if test="startDeptName != null and startDeptName != ''"> and fa.startDeptName like concat('%', #{startDeptName}, '%')</if>
|
||||||
|
<if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''"> and date(fa.createTime) between #{params.beginTime} and #{params.endTime}</if>
|
||||||
<!-- 查询条件-项目部门 -->
|
<!-- 查询条件-项目部门 -->
|
||||||
<if test="projectDeptId != null "> and fa.businessDeptId = #{projectDeptId}</if>
|
<if test="startComId != null and startComId != ''"> and fa.startComId = #{startComId}</if>
|
||||||
<!--子部门数据-->
|
<if test="startComName != null and startComName != ''"> and fa.startComName like concat('%', #{startComName}, '%')</if>
|
||||||
<if test='nowRole == "4"'> and fa.businessDeptId = #{nowDept}</if>
|
<if test="startProId != null and startProId != ''"> and fa.startProId = #{startProId}</if>
|
||||||
<!--监理单位/总包公司/分包单位查询当前关联数据-->
|
<if test="startProName != null and startProName != ''"> and fa.startProName like concat('%', #{startProName}, '%')</if>
|
||||||
<if test='nowRole == "5" or nowRole == "6" or nowRole == "7"'> and fa.businessKey in (select DISTINCT projectId from sur_project_unit_info where unitId=#{nowDept} and del_flag=0)</if>
|
AND (fa.ASSIGNEE_ = #{assigneeId}
|
||||||
<!--普通用户查询项目人员-->
|
|
||||||
<if test='nowRole == "15" or nowRole == "16" or nowRole == "17" or nowRole == "99"'> and fa.businessKey in (select DISTINCT project_id from sur_project_userinfo where user_id=#{nowUser} and is_del=0)</if>
|
|
||||||
AND (fa.ASSIGNEE_ = #{nowUser}
|
|
||||||
OR (
|
OR (
|
||||||
fa.ASSIGNEE_ IS NULL
|
fa.ASSIGNEE_ IS NULL
|
||||||
AND (
|
AND ( fa.USER_ID_ = #{assigneeId}
|
||||||
fa.USER_ID_ = #{nowUser}
|
|
||||||
OR (
|
OR (
|
||||||
fa.GROUP_ID_ IN
|
fa.GROUP_ID_ IN
|
||||||
<foreach collection="roleIds" item="roleId" open="(" separator="," close=")">
|
<foreach collection="roleIds" item="roleId" open="(" separator="," close=")">
|
||||||
|
@ -141,493 +113,22 @@
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<!--查询我的已办任务-->
|
<!--查询我的已办任务-->
|
||||||
<select id="selectMyFinishedFlowTask" parameterType="FlowTaskEntity" resultType="map">
|
<select id="selectMyFinishedFlowTask" parameterType="FlowTaskEntity" resultType="Map">
|
||||||
select fa.* from vw_flow_finished fa
|
select fa.* from vw_flow_finished fa
|
||||||
where
|
where
|
||||||
fa.ASSIGNEE_=#{nowUser}
|
fa.ASSIGNEE_=#{assigneeId}
|
||||||
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
<if test="procDefName != null and procDefName != ''"> and fa.procDefName like concat('%', #{procDefName}, '%')</if>
|
||||||
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
||||||
<if test="businessKeyName != null and businessKeyName != ''"> and fa.businessKeyName like concat('%', #{businessKeyName}, '%')</if>
|
<if test="startUserId != null and startUserId != ''"> and fa.startUserId = #{startUserId}</if>
|
||||||
|
<if test="startUserName != null and startUserName != ''"> and fa.startUserName like concat('%', #{startUserName}, '%')</if>
|
||||||
|
<if test="startDeptName != null and startDeptName != ''"> and fa.startDeptName like concat('%', #{startDeptName}, '%')</if>
|
||||||
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
<if test="category != null and category != ''"> and fa.category = #{category}</if>
|
||||||
<if test="params.beginDate != null and params.beginDate != '' and params.endDate != null and params.endDate != ''"> and fa.endTime between #{params.beginDate} and #{params.endDate}</if>
|
<if test="startComId != null and startComId != ''"> and fa.startComId = #{startComId}</if>
|
||||||
|
<if test="startComName != null and startComName != ''"> and fa.startComName like concat('%', #{startComName}, '%')</if>
|
||||||
|
<if test="startProId != null and startProId != ''"> and fa.startProId = #{startProId}</if>
|
||||||
|
<if test="startProName != null and startProName != ''"> and fa.startProName like concat('%', #{startProName}, '%')</if>
|
||||||
|
<if test="params.beginTime != null and params.beginTime != '' and params.endTime != null and params.endTime != ''"> and fa.endTime between #{params.beginTime} and #{params.endTime}</if>
|
||||||
order by fa.endTime desc
|
order by fa.endTime desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="groupByCategory" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT a.dict_label taskName,b.cnt assigneeId,c.cnt procDefVersion FROM
|
|
||||||
( SELECT * FROM sys_dict_data WHERE dict_type = 'sys_process_category') a
|
|
||||||
LEFT JOIN (SELECT category,COUNT(1) cnt FROM vw_flow_all WHERE finishTime IS NOT NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
GROUP BY category) b ON a.dict_value=b.category
|
|
||||||
LEFT JOIN (SELECT category,COUNT(1) cnt FROM vw_flow_all WHERE finishTime IS NULL and taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
|
|
||||||
GROUP BY category) c ON a.dict_value=c.category
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="groupByUnit" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT cat taskName, COUNT(1) assigneeId FROM (
|
|
||||||
SELECT *,'总包单位' cat FROM vw_flow_all WHERE finishTime IS NULL AND taskName LIKE '总包%'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'监理单位' cat FROM vw_flow_all WHERE finishTime IS NULL AND taskName LIKE '监理%'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'设计单位' cat FROM vw_flow_all WHERE finishTime IS NULL AND taskName LIKE '设计%'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'甲方代表' cat FROM vw_flow_all WHERE finishTime IS NULL AND taskName LIKE '甲方%'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'子公司' cat FROM vw_flow_all WHERE finishTime IS NULL AND taskName LIKE '工程%'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
) a
|
|
||||||
GROUP BY cat
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="groupByUnitFinish" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT cat taskName, COUNT(1) assigneeId FROM (
|
|
||||||
SELECT *,'总包单位' cat FROM vw_flow_all WHERE taskName LIKE '总包%' AND taskName!='提交申请' and finishTime IS not NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'监理单位' cat FROM vw_flow_all WHERE taskName LIKE '监理%' AND taskName!='提交申请' and finishTime IS not NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'设计单位' cat FROM vw_flow_all WHERE taskName LIKE '设计%' AND taskName!='提交申请' and finishTime IS not NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'甲方代表' cat FROM vw_flow_all WHERE taskName LIKE '甲方%' AND taskName!='提交申请' and finishTime IS not NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'子公司' cat FROM vw_flow_all WHERE taskName LIKE '工程%' AND taskName!='提交申请' and finishTime IS not NULL
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
) a
|
|
||||||
GROUP BY cat
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="groupByUnitTotal" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT cat taskName, COUNT(1) assigneeId FROM (
|
|
||||||
SELECT *,'总包单位' cat FROM vw_flow_all WHERE taskName LIKE '总包%' AND taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'监理单位' cat FROM vw_flow_all WHERE taskName LIKE '监理%' AND taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'设计单位' cat FROM vw_flow_all WHERE taskName LIKE '设计%' AND taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'甲方代表' cat FROM vw_flow_all WHERE taskName LIKE '甲方%' AND taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
UNION
|
|
||||||
SELECT *,'子公司' cat FROM vw_flow_all WHERE taskName LIKE '工程%' AND taskName!='提交申请'
|
|
||||||
<if test="projectDeptId !=null and projectDeptId!=''">and businessDeptId=#{projectDeptId}</if>
|
|
||||||
<if test="businessKey !=null and businessKey!=''">and businessKey=#{businessKey}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
) a
|
|
||||||
GROUP BY cat
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="listByCategory" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT * FROM vw_flow_all
|
|
||||||
<where>
|
|
||||||
<if test="category != null and category != ''"> and category = #{category}</if>
|
|
||||||
<if test="deptId !=null and deptId>0">and businessDeptId=#{deptId}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="projectId !=null and projectId>0">and businessKey=#{projectId}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="listByUnit" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT * FROM vw_flow_all WHERE finishTime IS NULL
|
|
||||||
<if test="taskId!=null">
|
|
||||||
<if test="taskId==1"> AND taskName LIKE '总包%' </if>
|
|
||||||
<if test="taskId==2"> AND taskName LIKE '监理%' </if>
|
|
||||||
<if test="taskId==3"> AND taskName LIKE '设计%' </if>
|
|
||||||
<if test="taskId==4"> AND taskName LIKE '甲方%' </if>
|
|
||||||
<if test="taskId==5"> AND taskName LIKE '工程%' </if>
|
|
||||||
</if>
|
|
||||||
<if test="deptId !=null and deptId>0">and businessDeptId=#{deptId}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="projectId !=null and projectId>0">and businessKey=#{projectId}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="listByState" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT * FROM vw_flow_all
|
|
||||||
<where>
|
|
||||||
<if test="taskId!=null">
|
|
||||||
<if test="taskId==1"> AND taskName!='提交申请' </if>
|
|
||||||
<if test="taskId==2"> AND finishTime IS NULL AND taskName!='提交申请' </if>
|
|
||||||
<if test="taskId==3"> AND finishTime IS NOT NULL </if>
|
|
||||||
</if>
|
|
||||||
<if test="deptId !=null and deptId>0">and businessDeptId=#{deptId}</if>
|
|
||||||
<if test="projectId !=null and projectId>0">and businessKey=#{projectId}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="groupByProject" resultType="FlowTaskEntity" parameterType="long">
|
|
||||||
SELECT a.businessKey,a.cnt duration ,b.projectName businessKeyName FROM (
|
|
||||||
SELECT businessKey,COUNT(1) cnt FROM vw_flow_all WHERE taskName!='提交申请'
|
|
||||||
<if test="deptId !=null and deptId>0">and businessDeptId=#{deptId}</if>
|
|
||||||
<if test="proType != null and proType != ''"> and businessType = #{proType}</if>
|
|
||||||
GROUP BY businessKey ) a,sur_project b WHERE a.businessKey=b.id
|
|
||||||
ORDER BY a.cnt DESC
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="findSafetyWorkList" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT
|
|
||||||
fa.procInsId,
|
|
||||||
fa.deployId,
|
|
||||||
fa.createTime,
|
|
||||||
fa.finishTime,
|
|
||||||
fa.duration,
|
|
||||||
fa.procDefKey,
|
|
||||||
fa.procDefName,
|
|
||||||
fa.procDefVersion,
|
|
||||||
fa.category,
|
|
||||||
fa.businessKey,
|
|
||||||
fa.businessDeptId,
|
|
||||||
fa.businessKeyName,
|
|
||||||
fa.startUserId,
|
|
||||||
fa.startUserName,
|
|
||||||
fa.startDeptName,
|
|
||||||
fa.taskId,
|
|
||||||
fa.taskName,
|
|
||||||
fa.assigneeId,
|
|
||||||
fa.assigneeName,
|
|
||||||
fa.assigneeDeptName
|
|
||||||
FROM
|
|
||||||
vw_flow_all fa
|
|
||||||
<where>
|
|
||||||
<if test="proType != null and proType != ''"> and fa.businessType = #{proType}</if>
|
|
||||||
<if test="procDefKey != null and procDefKey != ''"> and fa.procDefKey = #{procDefKey}</if>
|
|
||||||
<if test="businessKey != null and businessKey != ''"> and fa.businessKey = #{businessKey}</if>
|
|
||||||
<!-- 查询条件-项目部门 -->
|
|
||||||
<if test="projectDeptId != null and projectDeptId != ''"> and fa.businessDeptId = #{projectDeptId}</if>
|
|
||||||
</where>
|
|
||||||
order by fa.createTime desc
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectSurProjectById" parameterType="Long" resultType="Map">
|
|
||||||
select * from sur_project where id = #{proId}
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="groupFlowBySubDeptType" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
select x.dict_label taskName,y.taskId from (
|
|
||||||
select dict_value,dict_label
|
|
||||||
from sys_dict_data where dict_type='flow_sub_dept_type'
|
|
||||||
) x left join (
|
|
||||||
SELECT d.dict_value, d.dict_label,count(1) taskId FROM
|
|
||||||
vw_flow_all a
|
|
||||||
LEFT JOIN act_hi_varinst b ON a.procInsId=b.PROC_INST_ID_ AND b.NAME_='subDeptType'
|
|
||||||
LEFT JOIN act_hi_varinst c ON a.procInsId=c.PROC_INST_ID_ AND c.NAME_='subDeptName'
|
|
||||||
LEFT JOIN sys_dict_data D ON b.TEXT_=d.dict_value and d.dict_type='flow_sub_dept_type'
|
|
||||||
left join sur_project sp on a.businesskey=sp.id
|
|
||||||
where a.procDefKey='flow_fbzzsp_fbszzsp'
|
|
||||||
AND (A.finishTime is null OR (A.finishTime is not null and A.taskComType =1))
|
|
||||||
and sp.progressVisible=0 and sp.isDel=0
|
|
||||||
<if test="deptId !=null and deptId>0">and a.businessDeptId=#{deptId}</if>
|
|
||||||
<if test="projectId !=null and projectId>0">and a.businessKey=#{projectId}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and a.businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
<if test="proType != null and proType != ''"> and sp.projectType = #{proType}</if>
|
|
||||||
group by d.dict_value,d.dict_label
|
|
||||||
) y on x.dict_value=y.dict_value
|
|
||||||
</select>
|
|
||||||
<select id="listFlowBySubDeptType" parameterType="FlowTaskEntity" resultType="FlowTaskEntity">
|
|
||||||
SELECT a.procInsId,a.deployId,a.createTime,a.finishTime,a.businessKey,a.businessKeyName,a.startDeptName,b.TEXT_ as taskId, c.TEXT_ as deptName,d.dict_label taskName FROM
|
|
||||||
vw_flow_all a
|
|
||||||
LEFT JOIN act_hi_varinst b ON a.procInsId=b.PROC_INST_ID_ AND b.NAME_='subDeptType'
|
|
||||||
LEFT JOIN act_hi_varinst c ON a.procInsId=c.PROC_INST_ID_ AND c.NAME_='subDeptName'
|
|
||||||
LEFT JOIN sys_dict_data D ON b.TEXT_=d.dict_value and d.dict_type='flow_sub_dept_type'
|
|
||||||
left join sur_project sp on a.businesskey=sp.id
|
|
||||||
where a.procDefKey='flow_fbzzsp_fbszzsp'
|
|
||||||
AND (A.finishTime is null OR (A.finishTime is not null and A.taskComType =1))
|
|
||||||
and sp.progressVisible=0 and sp.isDel=0
|
|
||||||
<if test="deptId !=null and deptId>0">and a.businessDeptId=#{deptId}</if>
|
|
||||||
<if test="projectId !=null and projectId>0">and a.businessKey=#{projectId}</if>
|
|
||||||
<if test="prjIds !=null and prjIds.size()>0">
|
|
||||||
and a.businessKey in
|
|
||||||
<foreach collection="prjIds" item="item" index="index" open="(" close=")" separator=",">
|
|
||||||
#{item}
|
|
||||||
</foreach>
|
|
||||||
</if>
|
|
||||||
<if test="proType != null and proType != ''"> and sp.projectType = #{proType}</if>
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectDeployList" resultType="FlowProcDefDto">
|
|
||||||
SELECT
|
|
||||||
rp.id_ as id,
|
|
||||||
rp.deployment_id_ as deploymentId,
|
|
||||||
rd.name_ as name,
|
|
||||||
rd.category_ as category,
|
|
||||||
rp.key_ as flowKey,
|
|
||||||
rp.version_ as version,
|
|
||||||
rp.suspension_state_ as suspensionState,
|
|
||||||
rd.deploy_time_ as deploymentTime,
|
|
||||||
rpd.DEPT_ID_ as deptId,
|
|
||||||
sd.dept_name as deptName,
|
|
||||||
rpd.PROJ_ID_ as projectId,
|
|
||||||
spi.project_name as projectName
|
|
||||||
FROM
|
|
||||||
act_re_procdef rp
|
|
||||||
LEFT JOIN act_re_deployment rd ON rp.deployment_id_ = rd.id_
|
|
||||||
left join act_re_procdef_dept rpd on rp.id_ = rpd.PROCDEF_ID_
|
|
||||||
left join sys_dept sd on sd.dept_id = rpd.DEPT_ID_
|
|
||||||
left join pro_project_info spi on spi.id = rpd.PROJ_ID_
|
|
||||||
<where>
|
|
||||||
rp.SUSPENSION_STATE_ = 1
|
|
||||||
<if test="deptId != null">
|
|
||||||
and rpd.DEPT_ID_ = #{deptId}
|
|
||||||
</if>
|
|
||||||
<if test="deptName != null and deptName != ''">
|
|
||||||
and sd.dept_name like concat('%', #{deptName}, '%')
|
|
||||||
</if>
|
|
||||||
<if test="projectId != null">
|
|
||||||
and rpd.PROJ_ID_ = #{projectId}
|
|
||||||
</if>
|
|
||||||
<if test="projectName != null and projectName != ''">
|
|
||||||
and spi.project_name like concat('%', #{projectName}, '%')
|
|
||||||
</if>
|
|
||||||
<if test="name != null and name != ''">
|
|
||||||
and rd.name_ like concat('%', #{name}, '%')
|
|
||||||
</if>
|
|
||||||
<if test="category != null and category != ''">
|
|
||||||
and rd.category_ = #{category}
|
|
||||||
</if>
|
|
||||||
<if test="flowKey != null and flowKey != ''">
|
|
||||||
and rd.key_ = #{flowKey}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
order by rpd.SORT_
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<select id="selectMyDeployList" resultType="FlowProcDefDto">
|
|
||||||
SELECT * FROM (
|
|
||||||
SELECT
|
|
||||||
rp.id_ as id,
|
|
||||||
rp.deployment_id_ as deploymentId,
|
|
||||||
rd.name_ as name,
|
|
||||||
rd.category_ as category,
|
|
||||||
sdd.dict_label as categoryName,
|
|
||||||
rp.key_ as flowKey,
|
|
||||||
rp.version_ as version,
|
|
||||||
rp.suspension_state_ as suspensionState,
|
|
||||||
rd.deploy_time_ as deploymentTime,
|
|
||||||
ROW_NUMBER () OVER (
|
|
||||||
PARTITION BY rp.key_
|
|
||||||
ORDER BY
|
|
||||||
rp.version_ DESC
|
|
||||||
) AS rn
|
|
||||||
FROM
|
|
||||||
act_re_procdef rp
|
|
||||||
LEFT JOIN act_re_deployment rd ON rp.deployment_id_ = rd.id_
|
|
||||||
left join sys_dict_data sdd on sdd.dict_type='sys_process_category' and sdd.dict_value = rd.category_
|
|
||||||
left join act_re_procdef_role rpr on rp.key_ = rpr.PROCDEF_KEY_
|
|
||||||
left join sys_user_role sur on sur.role_id = rpr.ROLE_ID_
|
|
||||||
left join sys_user su on su.user_id = sur.user_id
|
|
||||||
<where>
|
|
||||||
rp.SUSPENSION_STATE_ = 1 and su.user_name = #{username}
|
|
||||||
<if test="name != null and name != ''">
|
|
||||||
and rd.name_ like concat('%', #{name}, '%')
|
|
||||||
</if>
|
|
||||||
<if test="category != null and category != ''">
|
|
||||||
and rd.category_ = #{category}
|
|
||||||
</if>
|
|
||||||
</where>
|
|
||||||
order by rd.deploy_time_ desc
|
|
||||||
) v WHERE v.rn = 1
|
|
||||||
</select>
|
|
||||||
|
|
||||||
<delete id="deleteDeployByRoleId" parameterType="string">
|
|
||||||
delete from act_re_procdef_role where ROLE_ID_ = #{roleId}
|
|
||||||
</delete>
|
|
||||||
|
|
||||||
<insert id="batchDeployRoleRole">
|
|
||||||
insert into act_re_procdef_role( PROCDEF_KEY_, ROLE_ID_) values
|
|
||||||
<foreach item="item" index="index" collection="list" separator=",">
|
|
||||||
( #{item.key}, #{item.roleId})
|
|
||||||
</foreach>
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
<update id="updateProcKeyRoleSort">
|
|
||||||
update act_re_procdef_role set SORT_=#{sort} where PROCDEF_KEY_=#{key} and ROLE_ID_=#{roleId}
|
|
||||||
</update>
|
|
||||||
|
|
||||||
<!--新增项目单位流程关系-->
|
|
||||||
<insert id="insertActReProcdefDept" parameterType="FlowDeptVo">
|
|
||||||
insert into act_re_procdef_dept
|
|
||||||
<trim prefix="(" suffix=")" suffixOverrides=",">
|
|
||||||
<if test="procdefId != null">PROCDEF_ID_,</if>
|
|
||||||
<if test="prtype != null">TYPE_,</if>
|
|
||||||
<if test="deptId != null">DEPT_ID_,</if>
|
|
||||||
<if test="projId != null">PROJ_ID_,</if>
|
|
||||||
<if test="sort != null">SORT_,</if>
|
|
||||||
</trim>
|
|
||||||
<trim prefix="values (" suffix=")" suffixOverrides=",">
|
|
||||||
<if test="procdefId != null">#{procdefId},</if>
|
|
||||||
<if test="prtype != null">#{prtype},</if>
|
|
||||||
<if test="deptId != null">#{deptId},</if>
|
|
||||||
<if test="projId != null">#{projId},</if>
|
|
||||||
<if test="sort != null">#{sort},</if>
|
|
||||||
</trim>
|
|
||||||
</insert>
|
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
|
@ -16,7 +16,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<result property="videoId" column="video_id" />
|
<result property="videoId" column="video_id" />
|
||||||
<result property="trainTitle" column="train_title" />
|
<result property="trainTitle" column="train_title" />
|
||||||
<result property="trainType" column="train_type" />
|
<result property="trainType" column="train_type" />
|
||||||
|
<result property="trainTypeName" column="train_type_name" />
|
||||||
<result property="trainLevel" column="train_level" />
|
<result property="trainLevel" column="train_level" />
|
||||||
|
<result property="trainLevelName" column="train_level_name" />
|
||||||
<result property="trainFilePath" column="train_file_path" />
|
<result property="trainFilePath" column="train_file_path" />
|
||||||
<result property="trainFileImage" column="train_file_image" />
|
<result property="trainFileImage" column="train_file_image" />
|
||||||
<result property="playTimes" column="play_times" />
|
<result property="playTimes" column="play_times" />
|
||||||
|
@ -33,12 +35,14 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
|
|
||||||
<sql id="selectBusTrainingVideoUserVo">
|
<sql id="selectBusTrainingVideoUserVo">
|
||||||
select btvu.id, btvu.com_id, sd.dept_name as com_name, btvu.project_id, pi.project_name, btvu.user_id, su.nick_name as user_nick, su.user_name, btvu.video_id, btv.train_title,
|
select btvu.id, btvu.com_id, sd.dept_name as com_name, btvu.project_id, pi.project_name, btvu.user_id, su.nick_name as user_nick, su.user_name, btvu.video_id, btv.train_title,
|
||||||
btv.train_type, btv.train_level, btv.train_file_path, btv.train_file_image, btvu.play_times, btvu.play_dates,
|
btv.train_type, dic1.dict_label as train_type_name, btv.train_level, dic2.dict_label as train_level_name, btv.train_file_path, btv.train_file_image, btvu.play_times, btvu.play_dates,
|
||||||
btvu.play_status, btvu.sort_by, btvu.is_del, btvu.create_by, btvu.create_time, btvu.update_by, btvu.update_time, btvu.remark from bus_training_video_user btvu
|
btvu.play_status, btvu.sort_by, btvu.is_del, btvu.create_by, btvu.create_time, btvu.update_by, btvu.update_time, btvu.remark from bus_training_video_user btvu
|
||||||
left join bus_training_video btv on btv.id = btvu.video_id
|
left join bus_training_video btv on btv.id = btvu.video_id
|
||||||
left join pro_project_info pi on pi.id = btvu.project_id
|
left join pro_project_info pi on pi.id = btvu.project_id
|
||||||
left join sys_dept sd on sd.com_id = btvu.com_id
|
left join sys_dept sd on sd.com_id = btvu.com_id
|
||||||
left join sys_user su on su.user_id = btvu.user_id
|
left join sys_user su on su.user_id = btvu.user_id
|
||||||
|
left join sys_dict_data dic1 ON btv.train_type = dic1.`dict_value` AND dic1.`dict_type`='edu_train_type'
|
||||||
|
left join sys_dict_data dic2 ON btv.train_level = dic2.`dict_value` AND dic2.`dict_type`='edu_train_level'
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectBusTrainingVideoUserList" parameterType="BusTrainingVideoUser" resultMap="BusTrainingVideoUserResult">
|
<select id="selectBusTrainingVideoUserList" parameterType="BusTrainingVideoUser" resultMap="BusTrainingVideoUserResult">
|
||||||
|
|
|
@ -13,6 +13,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<result property="projectName" column="project_name" />
|
<result property="projectName" column="project_name" />
|
||||||
<result property="subDeptId" column="sub_dept_id" />
|
<result property="subDeptId" column="sub_dept_id" />
|
||||||
<result property="subDeptType" column="sub_dept_type" />
|
<result property="subDeptType" column="sub_dept_type" />
|
||||||
|
<result property="subDeptTypeName" column="sub_dept_type_name" />
|
||||||
<result property="subDeptName" column="sub_dept_name" />
|
<result property="subDeptName" column="sub_dept_name" />
|
||||||
<result property="subDeptPowerPath" column="sub_dept_power_path" />
|
<result property="subDeptPowerPath" column="sub_dept_power_path" />
|
||||||
<result property="userId" column="user_id" />
|
<result property="userId" column="user_id" />
|
||||||
|
@ -42,6 +43,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<result property="admitGuid" column="admitGuid"/>
|
<result property="admitGuid" column="admitGuid"/>
|
||||||
<result property="remark" column="remark" />
|
<result property="remark" column="remark" />
|
||||||
<result property="degreeGrade" column="degree_grade" />
|
<result property="degreeGrade" column="degree_grade" />
|
||||||
|
<result property="degreeGradeName" column="degree_grade_name" />
|
||||||
<association property="user" javaType="com.yanzhu.system.api.domain.SysUser" resultMap="ProSysUserResult"></association>
|
<association property="user" javaType="com.yanzhu.system.api.domain.SysUser" resultMap="ProSysUserResult"></association>
|
||||||
</resultMap>
|
</resultMap>
|
||||||
|
|
||||||
|
@ -67,10 +69,10 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
<result property="loginDate" column="login_date" />
|
<result property="loginDate" column="login_date" />
|
||||||
</resultMap>
|
</resultMap>
|
||||||
<sql id="selectProProjectInfoSubdeptsUsersVo">
|
<sql id="selectProProjectInfoSubdeptsUsersVo">
|
||||||
SELECT psu.id, psu.par_id, psu.com_id, psu.project_id, pi.project_name, psu.sub_dept_id, psu.sub_dept_type, psu.sub_dept_name, psu.sub_dept_power_path, psu.user_id, psu.sub_dept_group,
|
SELECT psu.id, psu.par_id, psu.com_id, psu.project_id, pi.project_name, psu.sub_dept_id, psu.sub_dept_type, dic3.dict_label as sub_dept_type_name, psu.sub_dept_name, psu.sub_dept_power_path, psu.user_id, psu.sub_dept_group,
|
||||||
psu.sub_dept_group_name, psu.user_post, psu.craft_type, psu.craft_post, psu.edu_status, psu.edu_file_path, psu.edu_sign_path, psu.edu_date, psu.approve_status,
|
psu.sub_dept_group_name, psu.user_post, psu.craft_type, psu.craft_post, psu.edu_status, psu.edu_file_path, psu.edu_sign_path, psu.edu_date, psu.approve_status,
|
||||||
psu.use_status, psu.qr_code, psu.sub_step, psu.illness_status, psu.sup_illness_status, psu.is_del, psu.create_by, psu.create_time, psu.update_by, psu.update_time,
|
psu.use_status, psu.qr_code, psu.sub_step, psu.illness_status, psu.sup_illness_status, psu.is_del, psu.create_by, psu.create_time, psu.update_by, psu.update_time,
|
||||||
psu.remark, psu.degree_grade, su.`user_name`,su.`nick_name`,su.`user_type`,su.`card_type`,su.`card_code`,su.admitGuid,su.admitGuid usAdmitGuid,
|
psu.remark, psu.degree_grade, dic4.dict_label as degree_grade_name, su.`user_name`,su.`nick_name`,su.`user_type`,su.`card_type`,su.`card_code`,su.admitGuid,su.admitGuid usAdmitGuid,
|
||||||
dic1.dict_label craft_type_name,dic2.dict_label craft_post_name,psu.enter_state,sd.dept_name comName,
|
dic1.dict_label craft_type_name,dic2.dict_label craft_post_name,psu.enter_state,sd.dept_name comName,
|
||||||
su.`user_picture`, su.`card_img_inv`,su.`card_img_pos`,su.`user_infos`,su.`email`,su.`phonenumber`,su.`sex`,su.`avatar`,su.`login_ip`,su.`login_date`
|
su.`user_picture`, su.`card_img_inv`,su.`card_img_pos`,su.`user_infos`,su.`email`,su.`phonenumber`,su.`sex`,su.`avatar`,su.`login_ip`,su.`login_date`
|
||||||
FROM pro_project_info_subdepts_users psu
|
FROM pro_project_info_subdepts_users psu
|
||||||
|
@ -79,6 +81,8 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
LEFT JOIN sys_dept sd ON sd.dept_id = pi.com_id
|
LEFT JOIN sys_dept sd ON sd.dept_id = pi.com_id
|
||||||
LEFT JOIN sys_dict_data dic1 ON psu.`craft_type`=dic1.`dict_value` AND dic1.`dict_type`='pro_craft_type'
|
LEFT JOIN sys_dict_data dic1 ON psu.`craft_type`=dic1.`dict_value` AND dic1.`dict_type`='pro_craft_type'
|
||||||
LEFT JOIN sys_dict_data dic2 ON psu.`craft_post`=dic2.`dict_value` AND dic2.`dict_type`='pro_craft_post'
|
LEFT JOIN sys_dict_data dic2 ON psu.`craft_post`=dic2.`dict_value` AND dic2.`dict_type`='pro_craft_post'
|
||||||
|
LEFT JOIN sys_dict_data dic3 ON psu.`sub_dept_type`=dic3.`dict_value` AND dic3.`dict_type`='sub_dept_type'
|
||||||
|
LEFT JOIN sys_dict_data dic4 ON psu.`degree_grade`=dic4.`dict_value` AND dic4.`dict_type`='educational_type'
|
||||||
</sql>
|
</sql>
|
||||||
|
|
||||||
<select id="selectProProjectInfoSubdeptsUsersList" parameterType="ProProjectInfoSubdeptsUsers" resultMap="ProProjectInfoSubdeptsUsersResult">
|
<select id="selectProProjectInfoSubdeptsUsersList" parameterType="ProProjectInfoSubdeptsUsers" resultMap="ProProjectInfoSubdeptsUsersResult">
|
||||||
|
@ -305,7 +309,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
<select id="findActReProcdefDept" resultType="Map">
|
<select id="findActReProcdefDept" resultType="Map">
|
||||||
select * from act_re_procdef_dept where PROJ_ID_ = #{proId} and TYPE_ = #{defType} order by SORT_ desc
|
select * from act_re_procdef rp
|
||||||
|
left join act_re_procdef_dept rpd on rpd.PROCDEF_ID_ = rp.ID_
|
||||||
|
where rp.SUSPENSION_STATE_ = 1 and PROJ_ID_ = #{proId} and TYPE_ = #{defType} order by SORT_ desc
|
||||||
</select>
|
</select>
|
||||||
|
|
||||||
</mapper>
|
</mapper>
|
|
@ -103,6 +103,16 @@ public class SecurityUtils
|
||||||
return getLoginUser().getRoles().contains("gsAdmin");
|
return getLoginUser().getRoles().contains("gsAdmin");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否为项目管理员
|
||||||
|
*
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static boolean isXMAdmin()
|
||||||
|
{
|
||||||
|
return getLoginUser().getRoles().contains("xmAdmin");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 是否为公司管理员
|
* 是否为公司管理员
|
||||||
*
|
*
|
||||||
|
|
|
@ -16,7 +16,8 @@ public enum FlowComment {
|
||||||
REJECT("3", "驳回意见"),
|
REJECT("3", "驳回意见"),
|
||||||
DELEGATE("4", "委派意见"),
|
DELEGATE("4", "委派意见"),
|
||||||
ASSIGN("5", "转办意见"),
|
ASSIGN("5", "转办意见"),
|
||||||
STOP("6", "终止流程");
|
STOP("6", "终止流程"),
|
||||||
|
REVOKE("7", "撤回流程");
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 类型
|
* 类型
|
||||||
|
|
|
@ -33,7 +33,6 @@ public class FlowableGlobalListenerConfig implements ApplicationListener<Context
|
||||||
* PROCESS_COMPLETED 流程完成
|
* PROCESS_COMPLETED 流程完成
|
||||||
* 流程创建、任务创建、任务完成、流程完成
|
* 流程创建、任务创建、任务完成、流程完成
|
||||||
*/
|
*/
|
||||||
dispatcher.addEventListener(globalEventListener,FlowableEngineEventType.TASK_CREATED);
|
|
||||||
dispatcher.addEventListener(globalEventListener,FlowableEngineEventType.PROCESS_COMPLETED);
|
dispatcher.addEventListener(globalEventListener,FlowableEngineEventType.PROCESS_COMPLETED);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package com.yanzhu.flowable.constant;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 工作流常量
|
||||||
|
*/
|
||||||
|
public class FlowCacheConstants {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 微信消息推送单位名称
|
||||||
|
*/
|
||||||
|
public static final String STOP_PROCESS = "STOP.PROCESS::";
|
||||||
|
}
|
|
@ -1,12 +1,15 @@
|
||||||
package com.yanzhu.flowable.controller;
|
package com.yanzhu.flowable.controller;
|
||||||
|
|
||||||
|
import com.yanzhu.common.core.text.Convert;
|
||||||
|
import com.yanzhu.common.core.utils.StringUtils;
|
||||||
import com.yanzhu.common.core.web.controller.BaseController;
|
import com.yanzhu.common.core.web.controller.BaseController;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
import com.yanzhu.common.core.web.page.TableDataInfo;
|
import com.yanzhu.common.core.web.page.TableDataInfo;
|
||||||
import com.yanzhu.common.security.utils.SecurityUtils;
|
import com.yanzhu.common.security.utils.SecurityUtils;
|
||||||
import com.yanzhu.flowable.domain.my.FlowTaskEntity;
|
import com.yanzhu.flowable.domain.my.FlowTaskEntity;
|
||||||
import com.yanzhu.flowable.service.IFlowBusinessKeyService;
|
import com.yanzhu.flowable.service.IFlowBusinessKeyService;
|
||||||
import com.yanzhu.system.api.domain.SysUser;
|
import com.yanzhu.system.api.domain.SysRole;
|
||||||
|
import com.yanzhu.system.api.model.LoginUser;
|
||||||
import io.swagger.annotations.Api;
|
import io.swagger.annotations.Api;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.apache.commons.collections4.CollectionUtils;
|
import org.apache.commons.collections4.CollectionUtils;
|
||||||
|
@ -15,9 +18,7 @@ import org.springframework.web.bind.annotation.GetMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestMapping;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -28,8 +29,8 @@ import java.util.stream.Collectors;
|
||||||
* @author JiangYuQi
|
* @author JiangYuQi
|
||||||
* @date 2024-04-03
|
* @date 2024-04-03
|
||||||
*/
|
*/
|
||||||
@Slf4j
|
|
||||||
@Api(tags = "业务工作流程")
|
@Api(tags = "业务工作流程")
|
||||||
|
@Slf4j
|
||||||
@RestController
|
@RestController
|
||||||
@RequestMapping("/businessKey")
|
@RequestMapping("/businessKey")
|
||||||
public class FlowBusinessKeyController extends BaseController {
|
public class FlowBusinessKeyController extends BaseController {
|
||||||
|
@ -44,10 +45,26 @@ public class FlowBusinessKeyController extends BaseController {
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/allList")
|
@GetMapping(value = "/allList")
|
||||||
public TableDataInfo allList(FlowTaskEntity flowTaskEntity) {
|
public TableDataInfo allList(FlowTaskEntity flowTaskEntity) {
|
||||||
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
|
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||||
//超管查询所有数据
|
if(SecurityUtils.isAdmin(loginUser.getUserid())){
|
||||||
if(!SecurityUtils.isAdmin(sysUser.getUserId())){
|
// TODO:超管查询所有申请...
|
||||||
flowTaskEntity.setDeptAncestors(sysUser.getDept().getAncestors());
|
if(Objects.nonNull(loginUser.getProjectDeptId())){
|
||||||
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
|
}
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isGSAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isXMAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}else{
|
||||||
|
flowTaskEntity.setStartUserId(Convert.toStr(loginUser.getUserid()));
|
||||||
}
|
}
|
||||||
startPage();
|
startPage();
|
||||||
return getDataTable(flowBusinessKeyService.selectAllFlowTaskByParams(flowTaskEntity));
|
return getDataTable(flowBusinessKeyService.selectAllFlowTaskByParams(flowTaskEntity));
|
||||||
|
@ -60,10 +77,26 @@ public class FlowBusinessKeyController extends BaseController {
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/queryCount")
|
@GetMapping(value = "/queryCount")
|
||||||
public AjaxResult queryCount(FlowTaskEntity flowTaskEntity) {
|
public AjaxResult queryCount(FlowTaskEntity flowTaskEntity) {
|
||||||
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
|
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||||
//超管查询所有数据
|
if(SecurityUtils.isAdmin(loginUser.getUserid())){
|
||||||
if(!SecurityUtils.isAdmin(sysUser.getUserId())){
|
// TODO:超管查询所有申请...
|
||||||
flowTaskEntity.setDeptAncestors(sysUser.getDept().getAncestors());
|
if(Objects.nonNull(loginUser.getProjectDeptId())){
|
||||||
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
|
}
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isGSAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isXMAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}else{
|
||||||
|
flowTaskEntity.setStartUserId(Convert.toStr(loginUser.getUserid()));
|
||||||
}
|
}
|
||||||
return success(flowBusinessKeyService.quueryCount(flowTaskEntity));
|
return success(flowBusinessKeyService.quueryCount(flowTaskEntity));
|
||||||
}
|
}
|
||||||
|
@ -95,12 +128,27 @@ public class FlowBusinessKeyController extends BaseController {
|
||||||
*/
|
*/
|
||||||
@GetMapping(value = "/myAwaitFlowTaskList")
|
@GetMapping(value = "/myAwaitFlowTaskList")
|
||||||
public TableDataInfo myAwaitFlowTaskList(FlowTaskEntity flowTaskEntity) {
|
public TableDataInfo myAwaitFlowTaskList(FlowTaskEntity flowTaskEntity) {
|
||||||
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
|
LoginUser loginUser = SecurityUtils.getLoginUser();
|
||||||
//超管查询所有数据
|
if(SecurityUtils.isAdmin(loginUser.getUserid())){
|
||||||
if(!SecurityUtils.isAdmin(sysUser.getUserId())){
|
// TODO:超管查询所有申请...
|
||||||
flowTaskEntity.setAssigneeId(sysUser.getUserId());
|
if(Objects.nonNull(loginUser.getProjectDeptId())){
|
||||||
flowTaskEntity.setDeptAncestors(sysUser.getDept().getAncestors()+","+sysUser.getDeptId());
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
flowTaskEntity.setRoleIds(sysUser.getRoles().stream().map(role -> role.getRoleId()).collect(Collectors.toList()));
|
}
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isGSAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartComId(Convert.toStr(loginUser.getProjectDeptId()));
|
||||||
|
if(Objects.nonNull(loginUser.getProjectId())){
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}
|
||||||
|
}else if(SecurityUtils.isXMAdmin()){
|
||||||
|
// 公司管理员查询公司内的所有申请...
|
||||||
|
flowTaskEntity.setStartProId(Convert.toStr(loginUser.getProjectId()));
|
||||||
|
}else{
|
||||||
|
flowTaskEntity.setAssigneeId(SecurityUtils.getUserId());
|
||||||
|
flowTaskEntity.setRoleIds(Arrays.asList(SecurityUtils.getLoginUser().getSysUser().getRoleIds()));
|
||||||
}
|
}
|
||||||
startPage();
|
startPage();
|
||||||
return getDataTable(flowBusinessKeyService.selectMyAwaitFlowTask(flowTaskEntity));
|
return getDataTable(flowBusinessKeyService.selectMyAwaitFlowTask(flowTaskEntity));
|
||||||
|
@ -125,22 +173,24 @@ public class FlowBusinessKeyController extends BaseController {
|
||||||
@GetMapping(value = "/findMyTask")
|
@GetMapping(value = "/findMyTask")
|
||||||
public AjaxResult findMyTask() {
|
public AjaxResult findMyTask() {
|
||||||
FlowTaskEntity flowTaskEntity = new FlowTaskEntity();
|
FlowTaskEntity flowTaskEntity = new FlowTaskEntity();
|
||||||
SysUser sysUser = SecurityUtils.getLoginUser().getSysUser();
|
flowTaskEntity.setAssigneeId(SecurityUtils.getUserId());
|
||||||
//超管查询所有数据
|
List<SysRole> roles = SecurityUtils.getLoginUser().getSysUser().getRoles();
|
||||||
if(!SecurityUtils.isAdmin(sysUser.getUserId())){
|
if(StringUtils.isNotEmpty(roles)){
|
||||||
flowTaskEntity.setAssigneeId(sysUser.getUserId());
|
List<Long> roleIds = roles.stream().map(SysRole::getRoleId).collect(Collectors.toList());
|
||||||
flowTaskEntity.setDeptAncestors(sysUser.getDept().getAncestors()+","+sysUser.getDeptId());
|
flowTaskEntity.setRoleIds(roleIds);
|
||||||
flowTaskEntity.setRoleIds(sysUser.getRoles().stream().map(role -> role.getRoleId()).collect(Collectors.toList()));
|
}else{
|
||||||
|
List<Long> roleIds = new ArrayList<>();
|
||||||
|
roleIds.add(0L);
|
||||||
|
flowTaskEntity.setRoleIds(roleIds);
|
||||||
}
|
}
|
||||||
List<Map<String, Object>> list = flowBusinessKeyService.selectMyAwaitFlowTask(flowTaskEntity);
|
List<Map<String, Object>> list = flowBusinessKeyService.selectMyAwaitFlowTask(flowTaskEntity);
|
||||||
Map<String,Object> data = new HashMap<>();
|
Map<String,Object> data = new HashMap<>();
|
||||||
if(CollectionUtils.isNotEmpty(list)){
|
if(CollectionUtils.isNotEmpty(list)){
|
||||||
data.put("todo",list.size());
|
data.put("todo",list.size());
|
||||||
}else{
|
}else{
|
||||||
data.put("todo",0);
|
data.put("todo",5);
|
||||||
}
|
}
|
||||||
return success(data);
|
return success(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,373 @@
|
||||||
|
package com.yanzhu.flowable.flow;
|
||||||
|
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
|
import cn.hutool.core.util.StrUtil;
|
||||||
|
import org.flowable.bpmn.converter.BpmnXMLConverter;
|
||||||
|
import org.flowable.bpmn.model.Process;
|
||||||
|
import org.flowable.bpmn.model.*;
|
||||||
|
import org.flowable.common.engine.impl.util.io.StringStreamSource;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author KonBAI
|
||||||
|
* @createTime 2022/3/26 19:04
|
||||||
|
*/
|
||||||
|
public class ModelUtils {
|
||||||
|
|
||||||
|
private static final BpmnXMLConverter bpmnXMLConverter = new BpmnXMLConverter();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* xml转bpmnModel对象
|
||||||
|
*
|
||||||
|
* @param xml xml
|
||||||
|
* @return bpmnModel对象
|
||||||
|
*/
|
||||||
|
public static BpmnModel getBpmnModel(String xml) {
|
||||||
|
return bpmnXMLConverter.convertToBpmnModel(new StringStreamSource(xml), false, false);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bpmnModel转xml字符串
|
||||||
|
*
|
||||||
|
* @deprecated 存在会丢失 bpmn 连线问题
|
||||||
|
* @param bpmnModel bpmnModel对象
|
||||||
|
* @return xml字符串
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static String getBpmnXmlStr(BpmnModel bpmnModel) {
|
||||||
|
return StrUtil.utf8Str(getBpmnXml(bpmnModel));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* bpmnModel转xml对象
|
||||||
|
*
|
||||||
|
* @deprecated 存在丢失 bpmn 连线问题
|
||||||
|
* @param bpmnModel bpmnModel对象
|
||||||
|
* @return xml
|
||||||
|
*/
|
||||||
|
@Deprecated
|
||||||
|
public static byte[] getBpmnXml(BpmnModel bpmnModel) {
|
||||||
|
return bpmnXMLConverter.convertToXML(bpmnModel);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据节点,获取入口连线
|
||||||
|
*
|
||||||
|
* @param source 起始节点
|
||||||
|
* @return 入口连线列表
|
||||||
|
*/
|
||||||
|
public static List<SequenceFlow> getElementIncomingFlows(FlowElement source) {
|
||||||
|
List<SequenceFlow> sequenceFlows = new ArrayList<>();
|
||||||
|
if (source instanceof FlowNode) {
|
||||||
|
sequenceFlows = ((FlowNode) source).getIncomingFlows();
|
||||||
|
}
|
||||||
|
return sequenceFlows;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 根据节点,获取出口连线
|
||||||
|
*
|
||||||
|
* @param source 起始节点
|
||||||
|
* @return 出口连线列表
|
||||||
|
*/
|
||||||
|
public static List<SequenceFlow> getElementOutgoingFlows(FlowElement source) {
|
||||||
|
List<SequenceFlow> sequenceFlows = new ArrayList<>();
|
||||||
|
if (source instanceof FlowNode) {
|
||||||
|
sequenceFlows = ((FlowNode) source).getOutgoingFlows();
|
||||||
|
}
|
||||||
|
return sequenceFlows;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取开始节点
|
||||||
|
*
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @return 开始节点(未找到开始节点,返回null)
|
||||||
|
*/
|
||||||
|
public static StartEvent getStartEvent(BpmnModel model) {
|
||||||
|
Process process = model.getMainProcess();
|
||||||
|
FlowElement startElement = process.getInitialFlowElement();
|
||||||
|
if (startElement instanceof StartEvent) {
|
||||||
|
return (StartEvent) startElement;
|
||||||
|
}
|
||||||
|
return getStartEvent(process.getFlowElements());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取开始节点
|
||||||
|
*
|
||||||
|
* @param flowElements 流程元素集合
|
||||||
|
* @return 开始节点(未找到开始节点,返回null)
|
||||||
|
*/
|
||||||
|
public static StartEvent getStartEvent(Collection<FlowElement> flowElements) {
|
||||||
|
for (FlowElement flowElement : flowElements) {
|
||||||
|
if (flowElement instanceof StartEvent) {
|
||||||
|
return (StartEvent) flowElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取结束节点
|
||||||
|
*
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @return 结束节点(未找到开始节点,返回null)
|
||||||
|
*/
|
||||||
|
public static EndEvent getEndEvent(BpmnModel model) {
|
||||||
|
Process process = model.getMainProcess();
|
||||||
|
return getEndEvent(process.getFlowElements());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取结束节点
|
||||||
|
*
|
||||||
|
* @param flowElements 流程元素集合
|
||||||
|
* @return 结束节点(未找到开始节点,返回null)
|
||||||
|
*/
|
||||||
|
public static EndEvent getEndEvent(Collection<FlowElement> flowElements) {
|
||||||
|
for (FlowElement flowElement : flowElements) {
|
||||||
|
if (flowElement instanceof EndEvent) {
|
||||||
|
return (EndEvent) flowElement;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UserTask getUserTaskByKey(BpmnModel model, String taskKey) {
|
||||||
|
Process process = model.getMainProcess();
|
||||||
|
FlowElement flowElement = process.getFlowElement(taskKey);
|
||||||
|
if (flowElement instanceof UserTask) {
|
||||||
|
return (UserTask) flowElement;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取流程元素信息
|
||||||
|
*
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @param flowElementId 元素ID
|
||||||
|
* @return 元素信息
|
||||||
|
*/
|
||||||
|
public static FlowElement getFlowElementById(BpmnModel model, String flowElementId) {
|
||||||
|
Process process = model.getMainProcess();
|
||||||
|
return process.getFlowElement(flowElementId);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取元素表单Key(限开始节点和用户节点可用)
|
||||||
|
*
|
||||||
|
* @param flowElement 元素
|
||||||
|
* @return 表单Key
|
||||||
|
*/
|
||||||
|
public static String getFormKey(FlowElement flowElement) {
|
||||||
|
if (flowElement != null) {
|
||||||
|
if (flowElement instanceof StartEvent) {
|
||||||
|
return ((StartEvent) flowElement).getFormKey();
|
||||||
|
} else if (flowElement instanceof UserTask) {
|
||||||
|
return ((UserTask) flowElement).getFormKey();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取开始节点属性值
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @param name 属性名
|
||||||
|
* @return 属性值
|
||||||
|
*/
|
||||||
|
public static String getStartEventAttributeValue(BpmnModel model, String name) {
|
||||||
|
StartEvent startEvent = getStartEvent(model);
|
||||||
|
return getElementAttributeValue(startEvent, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取结束节点属性值
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @param name 属性名
|
||||||
|
* @return 属性值
|
||||||
|
*/
|
||||||
|
public static String getEndEventAttributeValue(BpmnModel model, String name) {
|
||||||
|
EndEvent endEvent = getEndEvent(model);
|
||||||
|
return getElementAttributeValue(endEvent, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户任务节点属性值
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @param taskKey 任务Key
|
||||||
|
* @param name 属性名
|
||||||
|
* @return 属性值
|
||||||
|
*/
|
||||||
|
public static String getUserTaskAttributeValue(BpmnModel model, String taskKey, String name) {
|
||||||
|
UserTask userTask = getUserTaskByKey(model, taskKey);
|
||||||
|
return getElementAttributeValue(userTask, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取元素属性值
|
||||||
|
* @param baseElement 流程元素
|
||||||
|
* @param name 属性名
|
||||||
|
* @return 属性值
|
||||||
|
*/
|
||||||
|
public static String getElementAttributeValue(BaseElement baseElement, String name) {
|
||||||
|
if (baseElement != null) {
|
||||||
|
List<ExtensionAttribute> attributes = baseElement.getAttributes().get(name);
|
||||||
|
if (attributes != null && !attributes.isEmpty()) {
|
||||||
|
attributes.iterator().next().getValue();
|
||||||
|
Iterator<ExtensionAttribute> attrIterator = attributes.iterator();
|
||||||
|
if(attrIterator.hasNext()) {
|
||||||
|
ExtensionAttribute attribute = attrIterator.next();
|
||||||
|
return attribute.getValue();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean isMultiInstance(BpmnModel model, String taskKey) {
|
||||||
|
UserTask userTask = getUserTaskByKey(model, taskKey);
|
||||||
|
if (ObjectUtil.isNotNull(userTask)) {
|
||||||
|
return userTask.hasMultiInstanceLoopCharacteristics();
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有用户任务节点
|
||||||
|
*
|
||||||
|
* @param model bpmnModel对象
|
||||||
|
* @return 用户任务节点列表
|
||||||
|
*/
|
||||||
|
public static Collection<UserTask> getAllUserTaskEvent(BpmnModel model) {
|
||||||
|
Process process = model.getMainProcess();
|
||||||
|
Collection<FlowElement> flowElements = process.getFlowElements();
|
||||||
|
return getAllUserTaskEvent(flowElements, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取所有用户任务节点
|
||||||
|
* @param flowElements 流程元素集合
|
||||||
|
* @param allElements 所有流程元素集合
|
||||||
|
* @return 用户任务节点列表
|
||||||
|
*/
|
||||||
|
public static Collection<UserTask> getAllUserTaskEvent(Collection<FlowElement> flowElements, Collection<UserTask> allElements) {
|
||||||
|
allElements = allElements == null ? new ArrayList<>() : allElements;
|
||||||
|
for (FlowElement flowElement : flowElements) {
|
||||||
|
if (flowElement instanceof UserTask) {
|
||||||
|
allElements.add((UserTask) flowElement);
|
||||||
|
}
|
||||||
|
if (flowElement instanceof SubProcess) {
|
||||||
|
// 继续深入子流程,进一步获取子流程
|
||||||
|
allElements = getAllUserTaskEvent(((SubProcess) flowElement).getFlowElements(), allElements);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return allElements;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找起始节点下一个用户任务列表列表
|
||||||
|
* @param source 起始节点
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static List<UserTask> findNextUserTasks(FlowElement source) {
|
||||||
|
return findNextUserTasks(source, null, null);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 查找起始节点下一个用户任务列表列表
|
||||||
|
* @param source 起始节点
|
||||||
|
* @param hasSequenceFlow 已经经过的连线的 ID,用于判断线路是否重复
|
||||||
|
* @param userTaskList 用户任务列表
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static List<UserTask> findNextUserTasks(FlowElement source, Set<String> hasSequenceFlow, List<UserTask> userTaskList) {
|
||||||
|
hasSequenceFlow = Optional.ofNullable(hasSequenceFlow).orElse(new HashSet<>());
|
||||||
|
userTaskList = Optional.ofNullable(userTaskList).orElse(new ArrayList<>());
|
||||||
|
// 获取出口连线
|
||||||
|
List<SequenceFlow> sequenceFlows = getElementOutgoingFlows(source);
|
||||||
|
if (!sequenceFlows.isEmpty()) {
|
||||||
|
for (SequenceFlow sequenceFlow : sequenceFlows) {
|
||||||
|
// 如果发现连线重复,说明循环了,跳过这个循环
|
||||||
|
if (hasSequenceFlow.contains(sequenceFlow.getId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 添加已经走过的连线
|
||||||
|
hasSequenceFlow.add(sequenceFlow.getId());
|
||||||
|
FlowElement targetFlowElement = sequenceFlow.getTargetFlowElement();
|
||||||
|
if (targetFlowElement instanceof UserTask) {
|
||||||
|
// 若节点为用户任务,加入到结果列表中
|
||||||
|
userTaskList.add((UserTask) targetFlowElement);
|
||||||
|
} else {
|
||||||
|
// 若节点非用户任务,继续递归查找下一个节点
|
||||||
|
findNextUserTasks(targetFlowElement, hasSequenceFlow, userTaskList);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return userTaskList;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 迭代从后向前扫描,判断目标节点相对于当前节点是否是串行
|
||||||
|
* 不存在直接回退到子流程中的情况,但存在从子流程出去到父流程情况
|
||||||
|
* @param source 起始节点
|
||||||
|
* @param target 目标节点
|
||||||
|
* @param visitedElements 已经经过的连线的 ID,用于判断线路是否重复
|
||||||
|
* @return 结果
|
||||||
|
*/
|
||||||
|
public static boolean isSequentialReachable(FlowElement source, FlowElement target, Set<String> visitedElements) {
|
||||||
|
visitedElements = visitedElements == null ? new HashSet<>() : visitedElements;
|
||||||
|
if (source instanceof StartEvent && isInEventSubprocess(source)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据类型,获取入口连线
|
||||||
|
List<SequenceFlow> sequenceFlows = getElementIncomingFlows(source);
|
||||||
|
if (sequenceFlows != null && sequenceFlows.size() > 0) {
|
||||||
|
// 循环找到目标元素
|
||||||
|
for (SequenceFlow sequenceFlow: sequenceFlows) {
|
||||||
|
// 如果发现连线重复,说明循环了,跳过这个循环
|
||||||
|
if (visitedElements.contains(sequenceFlow.getId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 添加已经走过的连线
|
||||||
|
visitedElements.add(sequenceFlow.getId());
|
||||||
|
FlowElement sourceFlowElement = sequenceFlow.getSourceFlowElement();
|
||||||
|
// 这条线路存在目标节点,这条线路完成,进入下个线路
|
||||||
|
if (target.getId().equals(sourceFlowElement.getId())) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
// 如果目标节点为并行网关,则不继续
|
||||||
|
if (sourceFlowElement instanceof ParallelGateway) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// 否则就继续迭代
|
||||||
|
boolean isSequential = isSequentialReachable(sourceFlowElement, target, visitedElements);
|
||||||
|
if (!isSequential) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static boolean isInEventSubprocess(FlowElement flowElement) {
|
||||||
|
FlowElementsContainer flowElementsContainer = flowElement.getParentContainer();
|
||||||
|
while (flowElementsContainer != null) {
|
||||||
|
if (flowElementsContainer instanceof EventSubProcess) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (flowElementsContainer instanceof FlowElement) {
|
||||||
|
flowElementsContainer = ((FlowElement) flowElementsContainer).getParentContainer();
|
||||||
|
} else {
|
||||||
|
flowElementsContainer = null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,13 +1,19 @@
|
||||||
package com.yanzhu.flowable.listener;
|
package com.yanzhu.flowable.listener;
|
||||||
|
|
||||||
|
import com.yanzhu.common.core.constant.SecurityConstants;
|
||||||
|
import com.yanzhu.common.core.text.Convert;
|
||||||
import com.yanzhu.common.redis.service.RedisService;
|
import com.yanzhu.common.redis.service.RedisService;
|
||||||
|
import com.yanzhu.flowable.constant.FlowCacheConstants;
|
||||||
|
import com.yanzhu.system.api.RemoteProService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
|
import org.flowable.common.engine.api.delegate.event.FlowableEngineEntityEvent;
|
||||||
import org.flowable.engine.RepositoryService;
|
import org.flowable.engine.RepositoryService;
|
||||||
import org.flowable.engine.RuntimeService;
|
import org.flowable.engine.RuntimeService;
|
||||||
import org.flowable.engine.TaskService;
|
|
||||||
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
|
import org.flowable.engine.delegate.event.AbstractFlowableEngineEventListener;
|
||||||
|
import org.flowable.engine.repository.ProcessDefinition;
|
||||||
|
import org.flowable.engine.runtime.ProcessInstance;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
|
import org.springframework.context.annotation.Lazy;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -23,10 +29,11 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener {
|
||||||
private RedisService redisService;
|
private RedisService redisService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private TaskService taskService;
|
private RuntimeService runtimeService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RuntimeService runtimeService;
|
@Lazy
|
||||||
|
private RemoteProService remoteProService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private RepositoryService repositoryService;
|
private RepositoryService repositoryService;
|
||||||
|
@ -35,6 +42,16 @@ public class GlobalEventListener extends AbstractFlowableEngineEventListener {
|
||||||
protected void processCompleted(FlowableEngineEntityEvent event) {
|
protected void processCompleted(FlowableEngineEntityEvent event) {
|
||||||
log.info("任务流程审批完成...{}",event.getProcessInstanceId());
|
log.info("任务流程审批完成...{}",event.getProcessInstanceId());
|
||||||
super.processCompleted(event);
|
super.processCompleted(event);
|
||||||
|
Boolean isCompleted = Convert.toBool(redisService.getCacheObject(FlowCacheConstants.STOP_PROCESS+event.getProcessInstanceId()),true);
|
||||||
|
if(isCompleted){
|
||||||
|
// 获取流程定义对象
|
||||||
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(event.getProcessInstanceId()).singleResult();
|
||||||
|
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionId(event.getProcessDefinitionId()).singleResult();
|
||||||
|
log.info("同步修改审批信息...Category...{}...BusinessKey...{}",processDefinition.getCategory(),processInstance.getBusinessKey());
|
||||||
|
if(Convert.toInt(processDefinition.getCategory())<5){
|
||||||
|
remoteProService.approveSubDeptsUser(Convert.toLong(processInstance.getBusinessKey()), SecurityConstants.INNER);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -40,7 +40,7 @@ public interface IFlowBusinessKeyService {
|
||||||
public Map<String, Object> selectFormDatasByProcInsId(String procInsId);
|
public Map<String, Object> selectFormDatasByProcInsId(String procInsId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询我的代办任务
|
* 统计我的代办任务
|
||||||
* @param flowTaskEntity
|
* @param flowTaskEntity
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -19,8 +19,8 @@ import java.util.Map;
|
||||||
* @author Tony
|
* @author Tony
|
||||||
* @date 2021-04-03
|
* @date 2021-04-03
|
||||||
*/
|
*/
|
||||||
@Service
|
|
||||||
@Slf4j
|
@Slf4j
|
||||||
|
@Service
|
||||||
public class FlowBusinessKeyServiceImpl implements IFlowBusinessKeyService {
|
public class FlowBusinessKeyServiceImpl implements IFlowBusinessKeyService {
|
||||||
|
|
||||||
@Resource
|
@Resource
|
||||||
|
|
|
@ -32,7 +32,6 @@ public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlow
|
||||||
@Override
|
@Override
|
||||||
public void stopProcessInstance(FlowTaskVo vo) {
|
public void stopProcessInstance(FlowTaskVo vo) {
|
||||||
String taskId = vo.getTaskId();
|
String taskId = vo.getTaskId();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -63,7 +62,6 @@ public class FlowInstanceServiceImpl extends FlowServiceFactory implements IFlow
|
||||||
@Override
|
@Override
|
||||||
@Transactional(rollbackFor = Exception.class)
|
@Transactional(rollbackFor = Exception.class)
|
||||||
public void delete(String instanceId, String deleteReason) {
|
public void delete(String instanceId, String deleteReason) {
|
||||||
|
|
||||||
// 查询历史数据
|
// 查询历史数据
|
||||||
HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId);
|
HistoricProcessInstance historicProcessInstance = getHistoricProcessInstanceById(instanceId);
|
||||||
if (historicProcessInstance.getEndTime() != null) {
|
if (historicProcessInstance.getEndTime() != null) {
|
||||||
|
|
|
@ -1,14 +1,18 @@
|
||||||
package com.yanzhu.flowable.service.impl;
|
package com.yanzhu.flowable.service.impl;
|
||||||
|
|
||||||
|
import cn.hutool.core.collection.CollUtil;
|
||||||
|
import cn.hutool.core.util.ObjectUtil;
|
||||||
import com.alibaba.fastjson2.JSON;
|
import com.alibaba.fastjson2.JSON;
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.alibaba.fastjson2.TypeReference;
|
import com.alibaba.fastjson2.TypeReference;
|
||||||
import com.github.pagehelper.PageInfo;
|
import com.github.pagehelper.PageInfo;
|
||||||
import com.yanzhu.common.core.exception.base.BaseException;
|
import com.yanzhu.common.core.exception.base.BaseException;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
|
import com.yanzhu.common.redis.service.RedisService;
|
||||||
import com.yanzhu.common.security.utils.SecurityUtils;
|
import com.yanzhu.common.security.utils.SecurityUtils;
|
||||||
import com.yanzhu.flowable.common.constant.ProcessConstants;
|
import com.yanzhu.flowable.common.constant.ProcessConstants;
|
||||||
import com.yanzhu.flowable.common.enums.FlowComment;
|
import com.yanzhu.flowable.common.enums.FlowComment;
|
||||||
|
import com.yanzhu.flowable.constant.FlowCacheConstants;
|
||||||
import com.yanzhu.flowable.domain.SysForm;
|
import com.yanzhu.flowable.domain.SysForm;
|
||||||
import com.yanzhu.flowable.domain.dto.FlowCommentDto;
|
import com.yanzhu.flowable.domain.dto.FlowCommentDto;
|
||||||
import com.yanzhu.flowable.domain.dto.FlowNextDto;
|
import com.yanzhu.flowable.domain.dto.FlowNextDto;
|
||||||
|
@ -20,6 +24,7 @@ import com.yanzhu.flowable.factory.FlowServiceFactory;
|
||||||
import com.yanzhu.flowable.flow.CustomProcessDiagramGenerator;
|
import com.yanzhu.flowable.flow.CustomProcessDiagramGenerator;
|
||||||
import com.yanzhu.flowable.flow.FindNextNodeUtil;
|
import com.yanzhu.flowable.flow.FindNextNodeUtil;
|
||||||
import com.yanzhu.flowable.flow.FlowableUtils;
|
import com.yanzhu.flowable.flow.FlowableUtils;
|
||||||
|
import com.yanzhu.flowable.flow.ModelUtils;
|
||||||
import com.yanzhu.flowable.rpc.RemoteSystemService;
|
import com.yanzhu.flowable.rpc.RemoteSystemService;
|
||||||
import com.yanzhu.flowable.service.IFlowTaskService;
|
import com.yanzhu.flowable.service.IFlowTaskService;
|
||||||
import com.yanzhu.flowable.service.ISysDeployFormService;
|
import com.yanzhu.flowable.service.ISysDeployFormService;
|
||||||
|
@ -35,6 +40,7 @@ import org.flowable.bpmn.model.Process;
|
||||||
import org.flowable.bpmn.model.*;
|
import org.flowable.bpmn.model.*;
|
||||||
import org.flowable.common.engine.api.FlowableException;
|
import org.flowable.common.engine.api.FlowableException;
|
||||||
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
|
import org.flowable.common.engine.api.FlowableObjectNotFoundException;
|
||||||
|
import org.flowable.common.engine.impl.identity.Authentication;
|
||||||
import org.flowable.engine.ProcessEngineConfiguration;
|
import org.flowable.engine.ProcessEngineConfiguration;
|
||||||
import org.flowable.engine.history.HistoricActivityInstance;
|
import org.flowable.engine.history.HistoricActivityInstance;
|
||||||
import org.flowable.engine.history.HistoricProcessInstance;
|
import org.flowable.engine.history.HistoricProcessInstance;
|
||||||
|
@ -52,6 +58,7 @@ import org.flowable.task.api.Task;
|
||||||
import org.flowable.task.api.TaskQuery;
|
import org.flowable.task.api.TaskQuery;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstance;
|
import org.flowable.task.api.history.HistoricTaskInstance;
|
||||||
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
import org.flowable.task.api.history.HistoricTaskInstanceQuery;
|
||||||
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
|
@ -61,6 +68,7 @@ import java.lang.reflect.Field;
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.TimeUnit;
|
||||||
import java.util.function.Function;
|
import java.util.function.Function;
|
||||||
import java.util.function.Predicate;
|
import java.util.function.Predicate;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -73,13 +81,18 @@ import java.util.stream.Collectors;
|
||||||
@Slf4j
|
@Slf4j
|
||||||
public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService {
|
public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTaskService {
|
||||||
|
|
||||||
@Resource
|
@Autowired
|
||||||
private RemoteSystemService remoteSystemService;
|
private RedisService redisService;
|
||||||
@Resource
|
|
||||||
private ISysDeployFormService sysInstanceFormService;
|
|
||||||
@Resource
|
@Resource
|
||||||
private ISysFormService sysFormService;
|
private ISysFormService sysFormService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private RemoteSystemService remoteSystemService;
|
||||||
|
|
||||||
|
@Resource
|
||||||
|
private ISysDeployFormService sysInstanceFormService;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 完成任务
|
* 完成任务
|
||||||
*
|
*
|
||||||
|
@ -92,13 +105,18 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
|
||||||
if (Objects.isNull(task)) {
|
if (Objects.isNull(task)) {
|
||||||
return AjaxResult.error("任务不存在");
|
return AjaxResult.error("任务不存在");
|
||||||
}
|
}
|
||||||
|
String userId = taskVo.getUserId();
|
||||||
if (DelegationState.PENDING.equals(task.getDelegationState())) {
|
if (DelegationState.PENDING.equals(task.getDelegationState())) {
|
||||||
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment());
|
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.DELEGATE.getType(), taskVo.getComment());
|
||||||
taskService.resolveTask(taskVo.getTaskId(), taskVo.getVariables());
|
taskService.resolveTask(taskVo.getTaskId(), taskVo.getVariables());
|
||||||
} else {
|
} else {
|
||||||
|
if(StringUtils.isNotEmpty(taskVo.getComment())){
|
||||||
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
|
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
|
||||||
Long userId = SecurityUtils.getLoginUser().getUserid();
|
}else{
|
||||||
taskService.setAssignee(taskVo.getTaskId(), userId.toString());
|
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getAssignee()+"重新提交流程申请!!");
|
||||||
|
}
|
||||||
|
taskService.addComment(taskVo.getTaskId(), taskVo.getInstanceId(), FlowComment.NORMAL.getType(), taskVo.getComment());
|
||||||
|
taskService.setAssignee(taskVo.getTaskId(), userId);
|
||||||
taskService.complete(taskVo.getTaskId(), taskVo.getVariables());
|
taskService.complete(taskVo.getTaskId(), taskVo.getVariables());
|
||||||
}
|
}
|
||||||
return AjaxResult.success();
|
return AjaxResult.success();
|
||||||
|
@ -577,6 +595,8 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public AjaxResult stopProcess(FlowTaskVo flowTaskVo) {
|
public AjaxResult stopProcess(FlowTaskVo flowTaskVo) {
|
||||||
|
// 将终止的实例加入到缓存
|
||||||
|
redisService.setCacheObject(FlowCacheConstants.STOP_PROCESS+flowTaskVo.getInstanceId(),false,2L, TimeUnit.MINUTES);
|
||||||
List<Task> task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list();
|
List<Task> task = taskService.createTaskQuery().processInstanceId(flowTaskVo.getInstanceId()).list();
|
||||||
if (CollectionUtils.isEmpty(task)) {
|
if (CollectionUtils.isEmpty(task)) {
|
||||||
throw new BaseException("流程未启动或已执行完成,取消申请失败");
|
throw new BaseException("流程未启动或已执行完成,取消申请失败");
|
||||||
|
@ -590,12 +610,10 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
|
||||||
Process process = bpmnModel.getMainProcess();
|
Process process = bpmnModel.getMainProcess();
|
||||||
List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false);
|
List<EndEvent> endNodes = process.findFlowElementsOfType(EndEvent.class, false);
|
||||||
if (CollectionUtils.isNotEmpty(endNodes)) {
|
if (CollectionUtils.isNotEmpty(endNodes)) {
|
||||||
// TODO 取消流程为什么要设置流程发起人?
|
// 设置流程终止人
|
||||||
// SysUser loginUser = SecurityUtils.getLoginUser().getUser();
|
Authentication.setAuthenticatedUserId(flowTaskVo.getUserId());
|
||||||
// Authentication.setAuthenticatedUserId(loginUser.getUserId().toString());
|
taskService.addComment(flowTaskVo.getTaskId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(),
|
||||||
|
StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment());
|
||||||
// taskService.addComment(task.getId(), processInstance.getProcessInstanceId(), FlowComment.STOP.getType(),
|
|
||||||
// StringUtils.isBlank(flowTaskVo.getComment()) ? "取消申请" : flowTaskVo.getComment());
|
|
||||||
// 获取当前流程最后一个节点
|
// 获取当前流程最后一个节点
|
||||||
String endId = endNodes.get(0).getId();
|
String endId = endNodes.get(0).getId();
|
||||||
List<Execution> executions = runtimeService.createExecutionQuery()
|
List<Execution> executions = runtimeService.createExecutionQuery()
|
||||||
|
@ -619,50 +637,64 @@ public class FlowTaskServiceImpl extends FlowServiceFactory implements IFlowTask
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public AjaxResult revokeProcess(FlowTaskVo flowTaskVo) {
|
public AjaxResult revokeProcess(FlowTaskVo flowTaskVo) {
|
||||||
Task task = taskService.createTaskQuery()
|
String procInsId = flowTaskVo.getInstanceId();
|
||||||
.processInstanceId(flowTaskVo.getInstanceId())
|
String taskId = flowTaskVo.getTaskId();
|
||||||
|
// 校验流程是否结束
|
||||||
|
ProcessInstance processInstance = runtimeService.createProcessInstanceQuery()
|
||||||
|
.processInstanceId(procInsId)
|
||||||
|
.active()
|
||||||
.singleResult();
|
.singleResult();
|
||||||
if (task == null) {
|
if(ObjectUtil.isNull(processInstance)) {
|
||||||
throw new BaseException("流程未启动或已执行完成,无法撤回");
|
throw new RuntimeException("流程已结束或已挂起,无法执行撤回操作");
|
||||||
}
|
}
|
||||||
|
// 获取待撤回任务实例
|
||||||
|
HistoricTaskInstance currTaskIns = historyService.createHistoricTaskInstanceQuery()
|
||||||
|
.taskId(taskId)
|
||||||
|
.taskAssignee(flowTaskVo.getUserId())
|
||||||
|
.singleResult();
|
||||||
|
if (ObjectUtil.isNull(currTaskIns)) {
|
||||||
|
throw new RuntimeException("当前任务无法执行撤回操作或不存在。");
|
||||||
|
}
|
||||||
|
// 获取 bpmn 模型
|
||||||
|
BpmnModel bpmnModel = repositoryService.getBpmnModel(currTaskIns.getProcessDefinitionId());
|
||||||
|
UserTask currUserTask = ModelUtils.getUserTaskByKey(bpmnModel, currTaskIns.getTaskDefinitionKey());
|
||||||
|
// 查找下一级用户任务列表
|
||||||
|
List<UserTask> nextUserTaskList = ModelUtils.findNextUserTasks(currUserTask);
|
||||||
|
List<String> nextUserTaskKeys = nextUserTaskList.stream().map(UserTask::getId).collect(Collectors.toList());
|
||||||
|
|
||||||
SysUser loginUser = SecurityUtils.getLoginUser().getSysUser();
|
// 获取当前节点之后已完成的流程历史节点
|
||||||
List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery()
|
List<HistoricTaskInstance> finishedTaskInsList = historyService.createHistoricTaskInstanceQuery()
|
||||||
.processInstanceId(task.getProcessInstanceId())
|
.processInstanceId(procInsId)
|
||||||
.orderByTaskCreateTime()
|
.taskCreatedAfter(currTaskIns.getEndTime())
|
||||||
.asc()
|
.finished()
|
||||||
.list();
|
.list();
|
||||||
String myTaskId = null;
|
for (HistoricTaskInstance finishedTaskInstance : finishedTaskInsList) {
|
||||||
for (HistoricTaskInstance hti : htiList) {
|
// 检查已完成流程历史节点是否存在下一级中
|
||||||
if (loginUser.getUserId().toString().equals(hti.getAssignee())) {
|
if (CollUtil.contains(nextUserTaskKeys, finishedTaskInstance.getTaskDefinitionKey())) {
|
||||||
myTaskId = hti.getId();
|
throw new RuntimeException("下一流程已处理,无法执行撤回操作");
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (null == myTaskId) {
|
// 获取所有激活的任务节点,找到需要撤回的任务
|
||||||
throw new BaseException("该任务非当前用户提交,无法撤回");
|
List<Task> activateTaskList = taskService.createTaskQuery().processInstanceId(procInsId).list();
|
||||||
}
|
List<String> revokeExecutionIds = new ArrayList<>();
|
||||||
List<HistoricTaskInstance> historicTaskInstanceList = historyService
|
for (Task task : activateTaskList) {
|
||||||
.createHistoricTaskInstanceQuery()
|
// 检查激活的任务节点是否存在下一级中,如果存在,则加入到需要撤回的节点
|
||||||
.processInstanceId(task.getProcessInstanceId())
|
if (CollUtil.contains(nextUserTaskKeys, task.getTaskDefinitionKey())) {
|
||||||
.orderByHistoricTaskInstanceStartTime()
|
// 添加撤回审批信息
|
||||||
.asc()
|
taskService.setAssignee(task.getId(), flowTaskVo.getUserId());
|
||||||
.list();
|
taskService.addComment(task.getId(), task.getProcessInstanceId(), FlowComment.REVOKE.getType(), flowTaskVo.getAssignee() + "撤回流程审批");
|
||||||
Iterator<HistoricTaskInstance> it = historicTaskInstanceList.iterator();
|
revokeExecutionIds.add(task.getExecutionId());
|
||||||
//循环节点,获取当前节点的上一节点的key
|
|
||||||
String tarKey = "";
|
|
||||||
while (it.hasNext()) {
|
|
||||||
HistoricTaskInstance his = it.next();
|
|
||||||
if (!task.getTaskDefinitionKey().equals(his.getTaskDefinitionKey())) {
|
|
||||||
tarKey = his.getTaskDefinitionKey();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 跳转节点
|
try {
|
||||||
runtimeService.createChangeActivityStateBuilder()
|
runtimeService.createChangeActivityStateBuilder()
|
||||||
.processInstanceId(flowTaskVo.getInstanceId())
|
.processInstanceId(procInsId)
|
||||||
.moveActivityIdTo(task.getTaskDefinitionKey(), tarKey)
|
.moveExecutionsToSingleActivityId(revokeExecutionIds, currTaskIns.getTaskDefinitionKey()).changeState();
|
||||||
.changeState();
|
} catch (FlowableObjectNotFoundException e) {
|
||||||
|
throw new RuntimeException("未找到流程实例,流程可能已发生变化");
|
||||||
|
} catch (FlowableException e) {
|
||||||
|
throw new RuntimeException("执行撤回操作失败");
|
||||||
|
}
|
||||||
return AjaxResult.success();
|
return AjaxResult.success();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.yanzhu.manage.controller;
|
package com.yanzhu.manage.controller;
|
||||||
|
|
||||||
|
import com.yanzhu.common.core.utils.StringUtils;
|
||||||
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
||||||
import com.yanzhu.common.core.web.controller.BaseController;
|
import com.yanzhu.common.core.web.controller.BaseController;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
|
@ -63,6 +64,22 @@ public class BusExamUserController extends BaseController
|
||||||
return success(busExamUserService.selectBusExamUserById(id));
|
return success(busExamUserService.selectBusExamUserById(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户试卷详细信息
|
||||||
|
* @RequiresPermissions("manage:busExamUser:query")
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/last/{userId}")
|
||||||
|
public AjaxResult findBusExamUserList(@PathVariable("userId") Long userId)
|
||||||
|
{
|
||||||
|
BusExamUser query = new BusExamUser();
|
||||||
|
query.setUserId(userId);
|
||||||
|
List<BusExamUser> list = busExamUserService.selectBusExamUserList(query);
|
||||||
|
if(StringUtils.isNotEmpty(list)){
|
||||||
|
return success(busExamUserService.selectBusExamUserById(list.get(0).getId()));
|
||||||
|
}
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 修改用户试卷
|
* 修改用户试卷
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -63,6 +63,18 @@ public class BusTrainingVideoUserController extends BaseController
|
||||||
return success(busTrainingVideoUserService.selectBusTrainingVideoUserById(id));
|
return success(busTrainingVideoUserService.selectBusTrainingVideoUserById(id));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 获取用户培训视频详细信息
|
||||||
|
* @RequiresPermissions("manage:busTrainingVideoUser:query")
|
||||||
|
*/
|
||||||
|
@GetMapping(value = "/last/{userId}")
|
||||||
|
public AjaxResult findBusTrainingVideoUserLast(@PathVariable("userId") Long userId)
|
||||||
|
{
|
||||||
|
BusTrainingVideoUser query = new BusTrainingVideoUser();
|
||||||
|
query.setUserId(userId);
|
||||||
|
return success(busTrainingVideoUserService.selectBusTrainingVideoUserList(query));
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 新增用户培训视频
|
* 新增用户培训视频
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -55,8 +55,8 @@ public class ProProjectInfoSubdeptsController extends BaseController
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取分包单位详细信息
|
* 获取分包单位详细信息
|
||||||
|
* @RequiresPermissions("manage:proProjectInfoSubdepts:query")
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("manage:proProjectInfoSubdepts:query")
|
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/{id}")
|
||||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,14 +1,13 @@
|
||||||
package com.yanzhu.manage.controller;
|
package com.yanzhu.manage.controller;
|
||||||
|
|
||||||
import com.alibaba.fastjson2.JSONObject;
|
import com.alibaba.fastjson2.JSONObject;
|
||||||
import com.alibaba.nacos.shaded.org.checkerframework.checker.units.qual.A;
|
|
||||||
import com.yanzhu.common.core.utils.DateUtils;
|
|
||||||
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
import com.yanzhu.common.core.utils.poi.ExcelUtil;
|
||||||
import com.yanzhu.common.core.web.controller.BaseController;
|
import com.yanzhu.common.core.web.controller.BaseController;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
import com.yanzhu.common.core.web.domain.AjaxResult;
|
||||||
import com.yanzhu.common.core.web.page.TableDataInfo;
|
import com.yanzhu.common.core.web.page.TableDataInfo;
|
||||||
import com.yanzhu.common.log.annotation.Log;
|
import com.yanzhu.common.log.annotation.Log;
|
||||||
import com.yanzhu.common.log.enums.BusinessType;
|
import com.yanzhu.common.log.enums.BusinessType;
|
||||||
|
import com.yanzhu.common.security.annotation.InnerAuth;
|
||||||
import com.yanzhu.common.security.annotation.RequiresPermissions;
|
import com.yanzhu.common.security.annotation.RequiresPermissions;
|
||||||
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
||||||
import com.yanzhu.manage.service.IProProjectInfoSubdeptsUsersService;
|
import com.yanzhu.manage.service.IProProjectInfoSubdeptsUsersService;
|
||||||
|
@ -18,7 +17,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.util.Calendar;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -97,8 +95,8 @@ public class ProProjectInfoSubdeptsUsersController extends BaseController
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 获取分包单位工人详细信息
|
* 获取分包单位工人详细信息
|
||||||
|
* @RequiresPermissions("manage:proProjectInfoSubdeptsUsers:query")
|
||||||
*/
|
*/
|
||||||
@RequiresPermissions("manage:proProjectInfoSubdeptsUsers:query")
|
|
||||||
@GetMapping(value = "/{id}")
|
@GetMapping(value = "/{id}")
|
||||||
public AjaxResult getInfo(@PathVariable("id") Long id)
|
public AjaxResult getInfo(@PathVariable("id") Long id)
|
||||||
{
|
{
|
||||||
|
@ -137,6 +135,24 @@ public class ProProjectInfoSubdeptsUsersController extends BaseController
|
||||||
{
|
{
|
||||||
return toAjax(proProjectInfoSubdeptsUsersService.deleteProProjectInfoSubdeptsUsersByIds(ids));
|
return toAjax(proProjectInfoSubdeptsUsersService.deleteProProjectInfoSubdeptsUsersByIds(ids));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分包人员审批通过信息同步
|
||||||
|
*/
|
||||||
|
@InnerAuth
|
||||||
|
@GetMapping("/approveSubDeptsUser/{busKey}")
|
||||||
|
public AjaxResult approveSubDeptsUser(@PathVariable("busKey") Long busKey)
|
||||||
|
{
|
||||||
|
proProjectInfoSubdeptsUsersService.approveSubDeptsUser(busKey);
|
||||||
|
return success();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 修改人员进场状态
|
||||||
|
* @param ids
|
||||||
|
* @param state
|
||||||
|
* @return
|
||||||
|
*/
|
||||||
@RequiresPermissions("manage:proProjectInfoSubdeptsUsers:remove")
|
@RequiresPermissions("manage:proProjectInfoSubdeptsUsers:remove")
|
||||||
@PostMapping("/enterState/{state}")
|
@PostMapping("/enterState/{state}")
|
||||||
public AjaxResult updateEnterState(@RequestBody List<Long> ids,@PathVariable int state){
|
public AjaxResult updateEnterState(@RequestBody List<Long> ids,@PathVariable int state){
|
||||||
|
|
|
@ -188,4 +188,14 @@ public class WxController extends BaseController {
|
||||||
{
|
{
|
||||||
return success(proProjectInfoSubdeptsUsersService.submitUserSignets(signetFileVo));
|
return success(proProjectInfoSubdeptsUsersService.submitUserSignets(signetFileVo));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确认签署承诺书
|
||||||
|
*/
|
||||||
|
@GetMapping("/v1/startFlowableProcess")
|
||||||
|
public AjaxResult startFlowableProcess()
|
||||||
|
{
|
||||||
|
proProjectInfoSubdeptsUsersService.startFlowableProcess();
|
||||||
|
return success();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -77,4 +77,5 @@ public interface IBusTrainingVideoUserService
|
||||||
* @param id 用户培训视频主键
|
* @param id 用户培训视频主键
|
||||||
*/
|
*/
|
||||||
public int finishEduVideo(Long id);
|
public int finishEduVideo(Long id);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,6 +13,7 @@ import com.yanzhu.manage.domain.ProProjectInfoSubdepts;
|
||||||
*/
|
*/
|
||||||
public interface IProProjectInfoSubdeptsService
|
public interface IProProjectInfoSubdeptsService
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询分包单位
|
* 查询分包单位
|
||||||
*
|
*
|
||||||
|
|
|
@ -1,11 +1,10 @@
|
||||||
package com.yanzhu.manage.service;
|
package com.yanzhu.manage.service;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
||||||
import com.yanzhu.manage.domain.SignetFileVo;
|
import com.yanzhu.manage.domain.SignetFileVo;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 分包单位工人Service接口
|
* 分包单位工人Service接口
|
||||||
*
|
*
|
||||||
|
@ -14,6 +13,7 @@ import com.yanzhu.manage.domain.SignetFileVo;
|
||||||
*/
|
*/
|
||||||
public interface IProProjectInfoSubdeptsUsersService
|
public interface IProProjectInfoSubdeptsUsersService
|
||||||
{
|
{
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 查询分包单位工人
|
* 查询分包单位工人
|
||||||
*
|
*
|
||||||
|
@ -93,6 +93,17 @@ public interface IProProjectInfoSubdeptsUsersService
|
||||||
*/
|
*/
|
||||||
public ProProjectInfoSubdeptsUsers submitUserSignets(SignetFileVo signetFileVo);
|
public ProProjectInfoSubdeptsUsers submitUserSignets(SignetFileVo signetFileVo);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动工作流【演示...】
|
||||||
|
*/
|
||||||
|
public void startFlowableProcess();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分包人员审批通过信息同步
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
public void approveSubDeptsUser(Long id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 大屏-项目详情-在岗人员统计
|
* 大屏-项目详情-在岗人员统计
|
||||||
* @param proProjectInfoSubdeptsUsers
|
* @param proProjectInfoSubdeptsUsers
|
||||||
|
|
|
@ -235,7 +235,6 @@ public class BusExamUserServiceImpl implements IBusExamUserService
|
||||||
busExamUser.setCreateTime(DateUtils.getNowDate());
|
busExamUser.setCreateTime(DateUtils.getNowDate());
|
||||||
busExamUser.setFullMark(findExamInfo.getFullMark());
|
busExamUser.setFullMark(findExamInfo.getFullMark());
|
||||||
busExamUser.setPassMark(findExamInfo.getPassMark());
|
busExamUser.setPassMark(findExamInfo.getPassMark());
|
||||||
busExamUser.setUseTimes(DateUtils.getTime());
|
|
||||||
busExamUserMapper.insertBusExamUser(busExamUser);
|
busExamUserMapper.insertBusExamUser(busExamUser);
|
||||||
|
|
||||||
List<BusExamUserResult> busExamUserResultList = new ArrayList<>();
|
List<BusExamUserResult> busExamUserResultList = new ArrayList<>();
|
||||||
|
@ -442,6 +441,9 @@ public class BusExamUserServiceImpl implements IBusExamUserService
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
busExamUser.setUserMark(mark);
|
busExamUser.setUserMark(mark);
|
||||||
|
long stimes = busExamUser.getCreateTime().getTime();
|
||||||
|
long etimes = DateUtils.getNowDate().getTime();
|
||||||
|
busExamUser.setUseTimes(Convert.toStr(etimes-stimes));
|
||||||
if(busExamUser.getPassMark()>mark){
|
if(busExamUser.getPassMark()>mark){
|
||||||
busExamUser.setResStatus(ShiFouEnums.FOU.getCode());
|
busExamUser.setResStatus(ShiFouEnums.FOU.getCode());
|
||||||
}else{
|
}else{
|
||||||
|
|
|
@ -1,27 +1,21 @@
|
||||||
package com.yanzhu.manage.service.impl;
|
package com.yanzhu.manage.service.impl;
|
||||||
|
|
||||||
import com.alibaba.fastjson.JSON;
|
|
||||||
import com.deepoove.poi.data.PictureRenderData;
|
|
||||||
import com.yanzhu.common.core.constant.SecurityConstants;
|
import com.yanzhu.common.core.constant.SecurityConstants;
|
||||||
import com.yanzhu.common.core.domain.R;
|
|
||||||
import com.yanzhu.common.core.enums.*;
|
import com.yanzhu.common.core.enums.*;
|
||||||
import com.yanzhu.common.core.exception.ServiceException;
|
import com.yanzhu.common.core.exception.ServiceException;
|
||||||
import com.yanzhu.common.core.text.Convert;
|
import com.yanzhu.common.core.text.Convert;
|
||||||
import com.yanzhu.common.core.utils.DateUtils;
|
import com.yanzhu.common.core.utils.DateUtils;
|
||||||
import com.yanzhu.common.core.utils.StringUtils;
|
import com.yanzhu.common.core.utils.StringUtils;
|
||||||
import com.yanzhu.common.core.web.domain.AjaxResult;
|
|
||||||
import com.yanzhu.common.security.utils.DictUtils;
|
import com.yanzhu.common.security.utils.DictUtils;
|
||||||
import com.yanzhu.common.security.utils.SecurityUtils;
|
import com.yanzhu.common.security.utils.SecurityUtils;
|
||||||
import com.yanzhu.manage.config.ProfileConfig;
|
import com.yanzhu.manage.config.ProfileConfig;
|
||||||
import com.yanzhu.manage.domain.BasTemplate;
|
import com.yanzhu.manage.domain.*;
|
||||||
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsGroup;
|
|
||||||
import com.yanzhu.manage.domain.ProProjectInfoSubdeptsUsers;
|
|
||||||
import com.yanzhu.manage.domain.SignetFileVo;
|
|
||||||
import com.yanzhu.manage.enums.CraftTypeEnums;
|
import com.yanzhu.manage.enums.CraftTypeEnums;
|
||||||
import com.yanzhu.manage.enums.SignetKeyEnums;
|
import com.yanzhu.manage.enums.SignetKeyEnums;
|
||||||
import com.yanzhu.manage.enums.UserPostEnums;
|
import com.yanzhu.manage.enums.UserPostEnums;
|
||||||
import com.yanzhu.manage.mapper.BasTemplateMapper;
|
import com.yanzhu.manage.mapper.BasTemplateMapper;
|
||||||
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsGroupMapper;
|
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsGroupMapper;
|
||||||
|
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsMapper;
|
||||||
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsUsersMapper;
|
import com.yanzhu.manage.mapper.ProProjectInfoSubdeptsUsersMapper;
|
||||||
import com.yanzhu.manage.service.IProProjectInfoSubdeptsUsersService;
|
import com.yanzhu.manage.service.IProProjectInfoSubdeptsUsersService;
|
||||||
import com.yanzhu.manage.service.IUniService;
|
import com.yanzhu.manage.service.IUniService;
|
||||||
|
@ -38,8 +32,6 @@ import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.*;
|
import java.util.*;
|
||||||
|
|
||||||
|
@ -69,11 +61,14 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
private RemoteFlowService remoteFlowService;
|
private RemoteFlowService remoteFlowService;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProProjectInfoSubdeptsUsersMapper proProjectInfoSubdeptsUsersMapper;
|
private ProProjectInfoSubdeptsMapper proProjectInfoSubdeptsMapper;
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ProProjectInfoSubdeptsGroupMapper proProjectInfoSubdeptsGroupMapper;
|
private ProProjectInfoSubdeptsGroupMapper proProjectInfoSubdeptsGroupMapper;
|
||||||
|
|
||||||
|
@Autowired
|
||||||
|
private ProProjectInfoSubdeptsUsersMapper proProjectInfoSubdeptsUsersMapper;
|
||||||
|
|
||||||
private static final Logger log = LoggerFactory.getLogger(ProProjectInfoSubdeptsUsersServiceImpl.class);
|
private static final Logger log = LoggerFactory.getLogger(ProProjectInfoSubdeptsUsersServiceImpl.class);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -212,6 +207,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
user.setSex(StringUtils.judgeGender(user.getCardCode()));
|
user.setSex(StringUtils.judgeGender(user.getCardCode()));
|
||||||
user.setCreateBy(DataSourceEnuns.APP.getInfo());
|
user.setCreateBy(DataSourceEnuns.APP.getInfo());
|
||||||
user.setCreateTime(DateUtils.getNowDate());
|
user.setCreateTime(DateUtils.getNowDate());
|
||||||
|
user.setRemark(proProjectInfoSubdeptsUsers.getSubDeptName());
|
||||||
Long userId = remoteUserService.registerUserInfo(user, SecurityConstants.INNER).getData();
|
Long userId = remoteUserService.registerUserInfo(user, SecurityConstants.INNER).getData();
|
||||||
proProjectInfoSubdeptsUsers.setUserId(userId);
|
proProjectInfoSubdeptsUsers.setUserId(userId);
|
||||||
proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
proProjectInfoSubdeptsUsersMapper.insertProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
|
@ -352,6 +348,7 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
user.setSex(StringUtils.judgeGender(user.getCardCode()));
|
user.setSex(StringUtils.judgeGender(user.getCardCode()));
|
||||||
user.setUpdateBy(DataSourceEnuns.APP.getInfo());
|
user.setUpdateBy(DataSourceEnuns.APP.getInfo());
|
||||||
user.setUpdateTime(DateUtils.getNowDate());
|
user.setUpdateTime(DateUtils.getNowDate());
|
||||||
|
user.setRemark(proProjectInfoSubdeptsUsers.getSubDeptName());
|
||||||
Long userId = remoteUserService.registerUserInfo(user, SecurityConstants.INNER).getData();
|
Long userId = remoteUserService.registerUserInfo(user, SecurityConstants.INNER).getData();
|
||||||
proProjectInfoSubdeptsUsers.setUserId(userId);
|
proProjectInfoSubdeptsUsers.setUserId(userId);
|
||||||
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
|
@ -482,12 +479,56 @@ public class ProProjectInfoSubdeptsUsersServiceImpl implements IProProjectInfoSu
|
||||||
Map<String, Object> variables = new HashMap<>();
|
Map<String, Object> variables = new HashMap<>();
|
||||||
variables.put("INITIATOR",proSubdeptsUser.getUserId());
|
variables.put("INITIATOR",proSubdeptsUser.getUserId());
|
||||||
variables.put("userName",proSubdeptsUser.getUser().getNickName());
|
variables.put("userName",proSubdeptsUser.getUser().getNickName());
|
||||||
|
variables.put("userDeptName",proSubdeptsUser.getSubDeptName());
|
||||||
|
variables.put("comId",proSubdeptsUser.getComId());
|
||||||
|
variables.put("comName",proSubdeptsUser.getComName());
|
||||||
|
variables.put("proId",proSubdeptsUser.getProjectId());
|
||||||
|
variables.put("proName",proSubdeptsUser.getProjectName());
|
||||||
variables.put("businessKey",proSubdeptsUser.getId());
|
variables.put("businessKey",proSubdeptsUser.getId());
|
||||||
remoteFlowService.startDefinitionByParams(procDefId,variables,SecurityConstants.INNER);
|
remoteFlowService.startDefinitionByParams(procDefId,variables,SecurityConstants.INNER);
|
||||||
}
|
}
|
||||||
return proSubdeptsUser;
|
return proSubdeptsUser;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 启动工作流【演示...】
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void startFlowableProcess(){
|
||||||
|
String procDefId = Convert.toStr("flow_bg7gh1jg:1:102504");
|
||||||
|
// 启动工作流审批节点...
|
||||||
|
Map<String, Object> variables = new HashMap<>();
|
||||||
|
variables.put("INITIATOR",17);
|
||||||
|
variables.put("userName","姜玉琦_TEST");
|
||||||
|
variables.put("userDeptName","中国西电集团_TEST");
|
||||||
|
variables.put("comId","101");
|
||||||
|
variables.put("comName","建安公司");
|
||||||
|
variables.put("proId","116");
|
||||||
|
variables.put("proName","泾河新城");
|
||||||
|
variables.put("businessKey",12);
|
||||||
|
remoteFlowService.startDefinitionByParams(procDefId,variables,SecurityConstants.INNER);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 分包人员审批通过信息同步
|
||||||
|
* @param id
|
||||||
|
*/
|
||||||
|
@Override
|
||||||
|
public void approveSubDeptsUser(Long id){
|
||||||
|
ProProjectInfoSubdeptsUsers proProjectInfoSubdeptsUsers = proProjectInfoSubdeptsUsersMapper.selectProProjectInfoSubdeptsUsersById(id);
|
||||||
|
if(Objects.equals(proProjectInfoSubdeptsUsers.getUserPost(),UserPostEnums.WTDL.getCode())){
|
||||||
|
ProProjectInfoSubdepts proProjectInfoSubdepts = proProjectInfoSubdeptsMapper.selectProProjectInfoSubdeptsById(proProjectInfoSubdeptsUsers.getSubDeptId());
|
||||||
|
proProjectInfoSubdepts.setApproveStatus(ApproveStatus.exempt.getCode());
|
||||||
|
proProjectInfoSubdeptsMapper.updateProProjectInfoSubdepts(proProjectInfoSubdepts);
|
||||||
|
}else if(Objects.equals(proProjectInfoSubdeptsUsers.getUserPost(),UserPostEnums.BZZ.getCode())){
|
||||||
|
ProProjectInfoSubdeptsGroup proProjectInfoSubdeptsGroup = proProjectInfoSubdeptsGroupMapper.selectProProjectInfoSubdeptsGroupById(proProjectInfoSubdeptsUsers.getSubDeptGroup());
|
||||||
|
proProjectInfoSubdeptsGroup.setApproveStatus(ApproveStatus.exempt.getCode());
|
||||||
|
proProjectInfoSubdeptsGroupMapper.updateProProjectInfoSubdeptsGroup(proProjectInfoSubdeptsGroup);
|
||||||
|
}
|
||||||
|
proProjectInfoSubdeptsUsers.setApproveStatus(ApproveStatus.exempt.getCode());
|
||||||
|
proProjectInfoSubdeptsUsersMapper.updateProProjectInfoSubdeptsUsers(proProjectInfoSubdeptsUsers);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 封装用户文件参数...
|
* 封装用户文件参数...
|
||||||
* @return
|
* @return
|
||||||
|
|
|
@ -135,7 +135,7 @@ Page({
|
||||||
console.log(options);
|
console.log(options);
|
||||||
if (options && options.SIGID && options.QRPID) {
|
if (options && options.SIGID && options.QRPID) {
|
||||||
this.getDictCache(options.SIGID);
|
this.getDictCache(options.SIGID);
|
||||||
//this.getMaOpenId();
|
this.getMaOpenId();
|
||||||
this.getProjectInfo(options.QRPID);
|
this.getProjectInfo(options.QRPID);
|
||||||
if (options.PARID) {
|
if (options.PARID) {
|
||||||
this.setData({
|
this.setData({
|
||||||
|
@ -179,9 +179,6 @@ Page({
|
||||||
userPostList: _userPostList,
|
userPostList: _userPostList,
|
||||||
"form.projectId": options.QRPID,
|
"form.projectId": options.QRPID,
|
||||||
});
|
});
|
||||||
this.getPhoneNumber({
|
|
||||||
'data': '18189138538'
|
|
||||||
});
|
|
||||||
} else {
|
} else {
|
||||||
app.toast("请求参数异常,请重新扫码...");
|
app.toast("请求参数异常,请重新扫码...");
|
||||||
// wx.redirectTo({
|
// wx.redirectTo({
|
||||||
|
@ -272,17 +269,16 @@ Page({
|
||||||
* @param {*} e
|
* @param {*} e
|
||||||
*/
|
*/
|
||||||
getPhoneNumber(e) {
|
getPhoneNumber(e) {
|
||||||
// if (e.detail.code) {
|
if (e.detail.code) {
|
||||||
// let data = {
|
let data = {
|
||||||
// openId: getOpenId(),
|
openId: getOpenId(),
|
||||||
// sessionKey: getSessionKey(),
|
sessionKey: getSessionKey(),
|
||||||
// iv: e.detail.iv,
|
iv: e.detail.iv,
|
||||||
// encryptedData: e.detail.encryptedData
|
encryptedData: e.detail.encryptedData
|
||||||
// }
|
}
|
||||||
// getMaPhoneNumber(data).then(res => {
|
getMaPhoneNumber(data).then(res => {
|
||||||
// if (res.code == 200) {
|
if (res.code == 200) {
|
||||||
//let phoneNumber = res.data;
|
let phoneNumber = res.data;
|
||||||
let phoneNumber = e.data;
|
|
||||||
//使用手机号码查询详情
|
//使用手机号码查询详情
|
||||||
if (this.data.userPost == "1") {
|
if (this.data.userPost == "1") {
|
||||||
findProSubDeptsInfo(this.data.proId, phoneNumber).then(deptRes => {
|
findProSubDeptsInfo(this.data.proId, phoneNumber).then(deptRes => {
|
||||||
|
@ -386,12 +382,12 @@ Page({
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
// }
|
}
|
||||||
// })
|
})
|
||||||
// } else {
|
} else {
|
||||||
// //用户决绝授权
|
//用户决绝授权
|
||||||
// app.toast("请允许微信手机号一键登录");
|
app.toast("请允许微信手机号一键登录");
|
||||||
// }
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -1051,7 +1047,7 @@ Page({
|
||||||
onChageCraftType(e) {
|
onChageCraftType(e) {
|
||||||
//设置工种岗位
|
//设置工种岗位
|
||||||
let craftPostList = [];
|
let craftPostList = [];
|
||||||
console.log("this.data.craftPostAllOrginList",this.data.craftPostAllOrginList)
|
console.log("this.data.craftPostAllOrginList", this.data.craftPostAllOrginList)
|
||||||
this.data.craftPostAllOrginList.forEach(item => {
|
this.data.craftPostAllOrginList.forEach(item => {
|
||||||
if (item.remark == e.detail.id) {
|
if (item.remark == e.detail.id) {
|
||||||
craftPostList.push({
|
craftPostList.push({
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
{
|
{
|
||||||
"name": "pages/project_qr/index",
|
"name": "pages/project_qr/index",
|
||||||
"pathName": "pages/project_qr/index",
|
"pathName": "pages/project_qr/index",
|
||||||
"query": "QRPID=116&SIGID=3&PARID=16",
|
"query": "QRPID=116&SIGID=1",
|
||||||
"launchMode": "default",
|
"launchMode": "default",
|
||||||
"scene": null
|
"scene": null
|
||||||
},
|
},
|
||||||
|
|
|
@ -23,4 +23,47 @@ onMounted(() => {
|
||||||
right: 20px;
|
right: 20px;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
.el-sub-menu__title{
|
||||||
|
position: relative;
|
||||||
|
.todo_num_tips{
|
||||||
|
top:20px;
|
||||||
|
position: absolute;
|
||||||
|
right: 36px;
|
||||||
|
background-color: #f56c6c;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: #fff;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 12px;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
padding: 0 6px;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
border: 1px solid #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
top: 16px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.nest-menu{
|
||||||
|
position: relative;
|
||||||
|
.todo_num_tips{
|
||||||
|
position: absolute;
|
||||||
|
right: 18px;
|
||||||
|
background-color: #f56c6c;
|
||||||
|
border-radius: 10px;
|
||||||
|
color: #fff;
|
||||||
|
display: inline-block;
|
||||||
|
font-size: 12px;
|
||||||
|
height: 18px;
|
||||||
|
line-height: 18px;
|
||||||
|
padding: 0 6px;
|
||||||
|
text-align: center;
|
||||||
|
white-space: nowrap;
|
||||||
|
border: 1px solid #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
top: 16px;
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
</style>
|
</style>
|
|
@ -0,0 +1,64 @@
|
||||||
|
import request from '@/utils/request'
|
||||||
|
|
||||||
|
// 查询业务流程列表
|
||||||
|
export function allList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/allList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统计业务流程列表
|
||||||
|
export function queryCount(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/queryCount',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 统计业务流程列表
|
||||||
|
export function findMyTasks() {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/findMyTask',
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据业务流程查询操作日志
|
||||||
|
export function findCommentByProcInsId(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/findCommentByProcInsId',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据业务流程查询表单数据
|
||||||
|
export function findFormDatasByProcInsId(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/findFormDatasByProcInsId',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据条件查询我的代办任务
|
||||||
|
export function myAwaitFlowTaskList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/myAwaitFlowTaskList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// 根据条件查询我的已办任务
|
||||||
|
export function myFinishedFlowTaskList(query) {
|
||||||
|
return request({
|
||||||
|
url: '/flowable/businessKey/myFinishedFlowTaskList',
|
||||||
|
method: 'get',
|
||||||
|
params: query
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
|
@ -17,6 +17,14 @@ export function getBusExamUser(id) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询用户试卷详细
|
||||||
|
export function getBusExamUserLast(userId) {
|
||||||
|
return request({
|
||||||
|
url: '/manage/busExamUser/last/' + userId,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 新增用户试卷
|
// 新增用户试卷
|
||||||
export function addBusExamUser(data) {
|
export function addBusExamUser(data) {
|
||||||
return request({
|
return request({
|
||||||
|
|
|
@ -17,6 +17,14 @@ export function getBusTrainingVideoUser(id) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 查询用户培训视频详细
|
||||||
|
export function getBusTrainingVideoUserLast(id) {
|
||||||
|
return request({
|
||||||
|
url: '/manage/busTrainingVideoUser/last/' + id,
|
||||||
|
method: 'get'
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
// 新增用户培训视频
|
// 新增用户培训视频
|
||||||
export function addBusTrainingVideoUser(data) {
|
export function addBusTrainingVideoUser(data) {
|
||||||
return request({
|
return request({
|
||||||
|
|
|
@ -59,7 +59,8 @@ const userStore = useUserStore()
|
||||||
const settingsStore = useSettingsStore()
|
const settingsStore = useSettingsStore()
|
||||||
|
|
||||||
function toggleSideBar() {
|
function toggleSideBar() {
|
||||||
appStore.toggleSideBar()
|
appStore.toggleSideBar();
|
||||||
|
userStore.getTasks(); // 动态获取用户代办任务
|
||||||
}
|
}
|
||||||
|
|
||||||
function handleCommand(command) {
|
function handleCommand(command) {
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
|
<app-link v-if="onlyOneChild.meta" :to="resolvePath(onlyOneChild.path, onlyOneChild.query)">
|
||||||
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
|
<el-menu-item :index="resolvePath(onlyOneChild.path)" :class="{ 'submenu-title-noDropdown': !isNest }">
|
||||||
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
|
<svg-icon :icon-class="onlyOneChild.meta.icon || (item.meta && item.meta.icon)"/>
|
||||||
|
<span v-if="onlyOneChild.name && taskMenus.includes(onlyOneChild.name)" :class="'todo_num_tips tips_'+onlyOneChild.name">0</span>
|
||||||
<template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
|
<template #title><span class="menu-title" :title="hasTitle(onlyOneChild.meta.title)">{{ onlyOneChild.meta.title }}</span></template>
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
</app-link>
|
</app-link>
|
||||||
|
@ -12,6 +13,7 @@
|
||||||
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
|
<el-sub-menu v-else ref="subMenu" :index="resolvePath(item.path)" popper-append-to-body>
|
||||||
<template v-if="item.meta" #title>
|
<template v-if="item.meta" #title>
|
||||||
<svg-icon :icon-class="item.meta && item.meta.icon" />
|
<svg-icon :icon-class="item.meta && item.meta.icon" />
|
||||||
|
<span v-if="item.name && taskMenus.includes(item.name)" :class="'todo_num_tips tips_'+item.name">0</span>
|
||||||
<span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
|
<span class="menu-title" :title="hasTitle(item.meta.title)">{{ item.meta.title }}</span>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -49,6 +51,7 @@ const props = defineProps({
|
||||||
})
|
})
|
||||||
|
|
||||||
const onlyOneChild = ref({});
|
const onlyOneChild = ref({});
|
||||||
|
const taskMenus = ref(['Task','Todo']);
|
||||||
|
|
||||||
function hasOneShowingChild(children = [], parent) {
|
function hasOneShowingChild(children = [], parent) {
|
||||||
if (!children) {
|
if (!children) {
|
||||||
|
|
|
@ -24,7 +24,7 @@ import elementIcons from '@/components/SvgIcon/svgicon'
|
||||||
import './permission' // permission control
|
import './permission' // permission control
|
||||||
|
|
||||||
import { useDict } from '@/utils/dict'
|
import { useDict } from '@/utils/dict'
|
||||||
import { parseTime, resetForm, addDateRange, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
|
import { parseTime, resetForm, addDateRange, formatDuraDate, formatDuraTime, handleTree, selectDictLabel, selectDictLabels } from '@/utils/ruoyi'
|
||||||
|
|
||||||
// 分页组件
|
// 分页组件
|
||||||
import Pagination from '@/components/Pagination'
|
import Pagination from '@/components/Pagination'
|
||||||
|
@ -55,6 +55,8 @@ app.config.globalProperties.parseTime = parseTime
|
||||||
app.config.globalProperties.resetForm = resetForm
|
app.config.globalProperties.resetForm = resetForm
|
||||||
app.config.globalProperties.handleTree = handleTree
|
app.config.globalProperties.handleTree = handleTree
|
||||||
app.config.globalProperties.addDateRange = addDateRange
|
app.config.globalProperties.addDateRange = addDateRange
|
||||||
|
app.config.globalProperties.formatDuraDate = formatDuraDate
|
||||||
|
app.config.globalProperties.formatDuraTime = formatDuraTime
|
||||||
app.config.globalProperties.selectDictLabel = selectDictLabel
|
app.config.globalProperties.selectDictLabel = selectDictLabel
|
||||||
app.config.globalProperties.selectDictLabels = selectDictLabels
|
app.config.globalProperties.selectDictLabels = selectDictLabels
|
||||||
app.config.globalProperties.$tryToJson=(str,df)=>{
|
app.config.globalProperties.$tryToJson=(str,df)=>{
|
||||||
|
|
|
@ -31,9 +31,10 @@ router.beforeEach((to, from, next) => {
|
||||||
// 根据roles权限生成可访问的路由表
|
// 根据roles权限生成可访问的路由表
|
||||||
accessRoutes.forEach(route => {
|
accessRoutes.forEach(route => {
|
||||||
if (!isHttp(route.path)) {
|
if (!isHttp(route.path)) {
|
||||||
router.addRoute(route) // 动态添加可访问路由表
|
router.addRoute(route); // 动态添加可访问路由表
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
useUserStore().getTasks(); // 动态获取用户代办任务
|
||||||
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
|
next({ ...to, replace: true }) // hack方法 确保addRoutes已完成
|
||||||
})
|
})
|
||||||
}).catch(err => {
|
}).catch(err => {
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { login, logout, getInfo } from '@/api/login'
|
import { login, logout, getInfo } from '@/api/login'
|
||||||
|
import { findMyTasks } from '@/api/flowable/businessKey'
|
||||||
import { getToken, setToken, removeToken } from '@/utils/auth'
|
import { getToken, setToken, removeToken } from '@/utils/auth'
|
||||||
import defAva from '@/assets/images/profile.jpg'
|
import defAva from '@/assets/images/profile.jpg'
|
||||||
|
|
||||||
|
@ -7,7 +8,9 @@ const useUserStore = defineStore(
|
||||||
{
|
{
|
||||||
state: () => ({
|
state: () => ({
|
||||||
token: getToken(),
|
token: getToken(),
|
||||||
|
uid: '',
|
||||||
name: '',
|
name: '',
|
||||||
|
nickName: '',
|
||||||
avatar: '',
|
avatar: '',
|
||||||
compInfo:{},
|
compInfo:{},
|
||||||
roles: [],
|
roles: [],
|
||||||
|
@ -48,7 +51,9 @@ const useUserStore = defineStore(
|
||||||
} else {
|
} else {
|
||||||
this.roles = ['ROLE_DEFAULT']
|
this.roles = ['ROLE_DEFAULT']
|
||||||
}
|
}
|
||||||
|
this.uid = user.userId;
|
||||||
this.name = user.userName;
|
this.name = user.userName;
|
||||||
|
this.nickName = user.nickName;
|
||||||
this.compInfo=user.comp;
|
this.compInfo=user.comp;
|
||||||
this.avatar = avatar;
|
this.avatar = avatar;
|
||||||
this.currentComId = user.activeComId;
|
this.currentComId = user.activeComId;
|
||||||
|
@ -61,6 +66,38 @@ const useUserStore = defineStore(
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
|
// 获取用户代办
|
||||||
|
getTasks(){
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
findMyTasks().then(response => {
|
||||||
|
let todos = document.querySelectorAll(".tips_Todo");
|
||||||
|
let tasks = document.querySelectorAll(".tips_Task");
|
||||||
|
if (todos.length > 0) {
|
||||||
|
todos.forEach(el => {
|
||||||
|
el.innerHTML = response.data.todo;
|
||||||
|
if (response.data.todo > 0) {
|
||||||
|
el.style.display = "inline";
|
||||||
|
} else {
|
||||||
|
el.style.display = "none";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
if (tasks.length > 0) {
|
||||||
|
tasks.forEach(el => {
|
||||||
|
el.innerHTML = response.data.todo;
|
||||||
|
if (response.data.todo > 0) {
|
||||||
|
el.style.display = "inline";
|
||||||
|
} else {
|
||||||
|
el.style.display = "none";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
resolve(response)
|
||||||
|
}).catch(error => {
|
||||||
|
reject(error)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
},
|
||||||
// 退出系统
|
// 退出系统
|
||||||
logOut() {
|
logOut() {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
|
|
@ -201,6 +201,85 @@ export function handleTree(data, id, parentId, children) {
|
||||||
return tree;
|
return tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间格式化为时间差
|
||||||
|
* @param {*} duration 时间分钟
|
||||||
|
*/
|
||||||
|
export function formatDuraDate(duration){
|
||||||
|
let day = 0;
|
||||||
|
let hours = 0;
|
||||||
|
let min = parseInt(duration);
|
||||||
|
if (min > 1440) {
|
||||||
|
day = parseInt(min / 1440);
|
||||||
|
min = min % 1440;
|
||||||
|
if (min > 60) {
|
||||||
|
hours = parseInt(min / 60);
|
||||||
|
min = min % 60;
|
||||||
|
}
|
||||||
|
} else if (min > 60) {
|
||||||
|
hours = parseInt(min / 60);
|
||||||
|
min = min % 60;
|
||||||
|
}
|
||||||
|
if (day > 0) {
|
||||||
|
if (day < 10) day = "0" + day;
|
||||||
|
if (hours < 10) hours = "0" + hours;
|
||||||
|
if (min < 10) min = "0" + min;
|
||||||
|
return day + "天" + hours + "小时" + min + "分钟";
|
||||||
|
}
|
||||||
|
if (hours > 0) {
|
||||||
|
if (hours < 10) hours = "0" + hours;
|
||||||
|
if (min < 10) min = "0" + min;
|
||||||
|
return hours + "小时" + min + "分钟";
|
||||||
|
}
|
||||||
|
if (min > 0) {
|
||||||
|
if (min < 10) min = "0" + min;
|
||||||
|
return min + "分钟";
|
||||||
|
}
|
||||||
|
if (min == 0) {
|
||||||
|
return "1分钟";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 时间格式化为时间差
|
||||||
|
* @param {*} val 时间
|
||||||
|
*/
|
||||||
|
export function formatDuraTime(val){
|
||||||
|
// 计算出相差天数
|
||||||
|
let days = Math.floor(val / (24 * 3600 * 1000));
|
||||||
|
// 计算出小时数
|
||||||
|
let leave1 = val % (24 * 3600 * 1000); // 计算天数后剩余的毫秒数
|
||||||
|
let hours = Math.floor(leave1 / (3600 * 1000));
|
||||||
|
// 计算相差分钟数
|
||||||
|
let leave2 = leave1 % (3600 * 1000); // 计算小时数后剩余的毫秒数
|
||||||
|
let minutes = Math.floor(leave2 / (60 * 1000));
|
||||||
|
// 计算相差秒数
|
||||||
|
let leave3 = leave2 % (60 * 1000); // 计算分钟数后剩余的毫秒数
|
||||||
|
let seconds = Math.round(leave3 / 1000);
|
||||||
|
if (days > 0) {
|
||||||
|
if (days < 10) days = "0" + days;
|
||||||
|
if (hours < 10) hours = "0" + hours;
|
||||||
|
if (minutes < 10) minutes = "0" + minutes;
|
||||||
|
if (seconds < 10) seconds = "0" + seconds;
|
||||||
|
return days + "天" + hours + "小时" + minutes + "分钟" + seconds + "秒";
|
||||||
|
}
|
||||||
|
if (hours > 0) {
|
||||||
|
if (hours < 10) hours = "0" + hours;
|
||||||
|
if (minutes < 10) minutes = "0" + minutes;
|
||||||
|
if (seconds < 10) seconds = "0" + seconds;
|
||||||
|
return hours + "小时" + minutes + "分钟" + seconds + "秒";
|
||||||
|
}
|
||||||
|
if (minutes > 0) {
|
||||||
|
if (minutes < 10) minutes = "0" + minutes;
|
||||||
|
if (seconds < 10) seconds = "0" + seconds;
|
||||||
|
return minutes + "分钟" + seconds + "秒";
|
||||||
|
}
|
||||||
|
if (seconds > 0) {
|
||||||
|
if (seconds < 10) seconds = "0" + seconds;
|
||||||
|
return seconds + "秒";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 参数处理
|
* 参数处理
|
||||||
* @param {*} params 参数
|
* @param {*} params 参数
|
||||||
|
|
|
@ -17,7 +17,7 @@
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-form-item label="流程分类" prop="category" v-if="false">
|
<el-form-item label="流程分类" prop="category">
|
||||||
<el-select v-model="queryParams.category" placeholder="请选择流程分类" clearable>
|
<el-select v-model="queryParams.category" placeholder="请选择流程分类" clearable>
|
||||||
<el-option
|
<el-option
|
||||||
v-for="dict in sys_process_category"
|
v-for="dict in sys_process_category"
|
||||||
|
@ -284,6 +284,10 @@ function handleSelectionChange(selection) {
|
||||||
|
|
||||||
/** 跳转到流程设计页面 */
|
/** 跳转到流程设计页面 */
|
||||||
function handleLoadXml(row){
|
function handleLoadXml(row){
|
||||||
|
if(!userStore.currentProId){
|
||||||
|
proxy.$modal.msgWarning("请切换到项目数据!!!");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
router.push({ path: '/flowable/definition/model',query: { deployId: row.deploymentId }})
|
router.push({ path: '/flowable/definition/model',query: { deployId: row.deploymentId }})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="88px">
|
||||||
<el-form-item label="名称" prop="name">
|
<el-form-item label="表达式名称" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.name"
|
v-model="queryParams.name"
|
||||||
placeholder="请输入表达式名称"
|
placeholder="请输入表达式名称"
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryRef" :inline="true" v-show="showSearch" label-width="88px">
|
||||||
<el-form-item label="名称" prop="name">
|
<el-form-item label="监听器名称" prop="name">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.name"
|
v-model="queryParams.name"
|
||||||
placeholder="请输入名称"
|
placeholder="请输入监听器名称"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
|
|
|
@ -1,21 +1,51 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="名称" prop="name">
|
<el-form-item label="项目名称" prop="startProName" v-if="!userStore.currentProId">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.name"
|
v-model="queryParams.startProName"
|
||||||
placeholder="请输入名称"
|
placeholder="请输入项目名称"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="流程名称" prop="procDefName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.procDefName"
|
||||||
|
placeholder="请输入流程名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="流程分类" prop="category">
|
||||||
|
<el-select v-model="queryParams.category" placeholder="请选择流程分类" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in sys_process_category"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="daterangeTimes"
|
||||||
|
type="daterange"
|
||||||
|
unlink-panels
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
:shortcuts="shortcuts"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8" v-if="false">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
|
@ -29,28 +59,45 @@
|
||||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="finishedListData" border @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="finishedListData" border>
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
<el-table-column label="任务编号" align="center" prop="taskId" width="88"/>
|
||||||
<el-table-column label="任务编号" align="center" prop="taskId" :show-overflow-tooltip="true"/>
|
<!-- <el-table-column label="所属公司" align="center" prop="startComName" :show-overflow-tooltip="true"/> -->
|
||||||
|
<el-table-column label="项目单位" align="center" prop="startProName" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="流程名称" align="center" prop="procDefName" :show-overflow-tooltip="true"/>
|
<el-table-column label="流程名称" align="center" prop="procDefName" :show-overflow-tooltip="true"/>
|
||||||
|
<el-table-column label="流程分类" align="center" prop="category" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag
|
||||||
|
:options="sys_process_category"
|
||||||
|
:value="scope.row.category"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="任务节点" align="center" prop="taskName" />
|
<el-table-column label="任务节点" align="center" prop="taskName" />
|
||||||
<el-table-column label="流程发起人" align="center">
|
<el-table-column label="流程发起人" align="center" width="220">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<label>{{scope.row.startUserName}} <el-tag type="info" size="small">{{scope.row.startDeptName}}</el-tag></label>
|
<label>{{scope.row.startUserName}} <el-tag type="info" size="small">{{scope.row.startDeptName}}</el-tag></label>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="接收时间" align="center" prop="createTime" width="180"/>
|
<el-table-column label="接收时间" align="center" prop="createTime" width="160"/>
|
||||||
<el-table-column label="审批时间" align="center" prop="finishTime" width="180"/>
|
<el-table-column label="审批时间" align="center" prop="finishTime" width="160">
|
||||||
<el-table-column label="耗时" align="center" prop="duration" width="180"/>
|
<template #default="scope">
|
||||||
<el-table-column label="操作" width="150" fixed="right" class-name="small-padding fixed-width">
|
<span>{{ parseTime(scope.row.finishTime, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="流程耗时" align="center" prop="duration" width="120">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ formatDuraTime(scope.row.duration) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="操作" width="150" align="center" fixed="right" class-name="small-padding fixed-width">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
size="small"
|
size="small"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="Tickets"
|
icon="Warning"
|
||||||
@click="handleFlowRecord(scope.row)"
|
@click="handleFlowRecord(scope.row)"
|
||||||
>流转记录</el-button>
|
>详情</el-button>
|
||||||
<el-button
|
<el-button
|
||||||
link
|
link
|
||||||
size="small"
|
size="small"
|
||||||
|
@ -70,14 +117,23 @@
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<detailProcess ref="detailProcessRef"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Finished">
|
<script setup name="Finished">
|
||||||
import { finishedList, delDeployment, revokeProcess } from "@/api/flowable/finished";
|
import { finishedList, delDeployment, revokeProcess } from "@/api/flowable/finished";
|
||||||
|
import { myFinishedFlowTaskList } from "@/api/flowable/businessKey";
|
||||||
import router from "@/router";
|
import router from "@/router";
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
|
import detailProcess from "@/views/flowable/task/myProcess/detail/indexDrawer.vue";
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
|
const { sys_process_category } = proxy.useDict('sys_process_category');
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const detailProcessRef = ref("");
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
// 选中数组
|
// 选中数组
|
||||||
|
@ -92,17 +148,48 @@ const showSearch = ref(true);
|
||||||
const total = ref(0);
|
const total = ref(0);
|
||||||
// 流程待办任务表格数据
|
// 流程待办任务表格数据
|
||||||
const finishedListData = ref([]);
|
const finishedListData = ref([]);
|
||||||
|
const daterangeTimes = ref([]);
|
||||||
// 弹出层标题
|
// 弹出层标题
|
||||||
const title = ref("");
|
const title = ref("");
|
||||||
// 是否显示弹出层
|
// 是否显示弹出层
|
||||||
const open = ref(false);
|
const open = ref(false);
|
||||||
|
const shortcuts = [
|
||||||
|
{
|
||||||
|
text: '最近一周',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近一个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近三个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
// 查询参数
|
// 查询参数
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
name: null
|
startProName: null,
|
||||||
|
procDefName: null,
|
||||||
|
category: null
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -111,7 +198,7 @@ const { queryParams } = toRefs(data);
|
||||||
/** 查询流程定义列表 */
|
/** 查询流程定义列表 */
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
finishedList(queryParams.value).then(response => {
|
myFinishedFlowTaskList(proxy.addDateRange(queryParams.value, daterangeTimes.value)).then(response => {
|
||||||
finishedListData.value = response.rows;
|
finishedListData.value = response.rows;
|
||||||
total.value = response.total;
|
total.value = response.total;
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
|
@ -139,22 +226,36 @@ function handleSelectionChange(selection) {
|
||||||
|
|
||||||
/** 流程流转记录 */
|
/** 流程流转记录 */
|
||||||
function handleFlowRecord(row){
|
function handleFlowRecord(row){
|
||||||
router.push({ path: '/flowable/task/finished/detail/index',
|
detailProcessRef.value.show(row);
|
||||||
query: {
|
// router.push({ path: '/flowable/task/finished/detail/index',
|
||||||
procInsId: row.procInsId,
|
// query: {
|
||||||
deployId: row.deployId,
|
// procInsId: row.procInsId,
|
||||||
taskId: row.taskId,
|
// deployId: row.deployId,
|
||||||
}})
|
// taskId: row.taskId,
|
||||||
|
// }})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 撤回任务 */
|
/** 撤回任务 */
|
||||||
function handleRevoke(row){
|
function handleRevoke(row){
|
||||||
const params = {
|
const params = {
|
||||||
instanceId: row.procInsId
|
procInsId: row.procInsId,
|
||||||
|
instanceId: row.procInsId,
|
||||||
|
taskId:row.taskId,
|
||||||
|
userId:userStore.uid,
|
||||||
|
assignee:userStore.nickName
|
||||||
}
|
}
|
||||||
revokeProcess(params).then( res => {
|
proxy.$confirm('是否确认撤回任务流程编号为"' + row.taskId + '"的数据项?', "警告", {
|
||||||
proxy.$modal.msgSuccess(res.msg);
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
}).then(function() {
|
||||||
|
loading.value = true;
|
||||||
|
return revokeProcess(params);
|
||||||
|
}).then(() => {
|
||||||
getList();
|
getList();
|
||||||
|
proxy.$modal.msgSuccess("撤回成功");
|
||||||
|
}).catch(() => {
|
||||||
|
loading.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,834 @@
|
||||||
|
<template>
|
||||||
|
<div class="app-detailDrawer">
|
||||||
|
<el-drawer v-model="onOpen" :show-close="true" size="80%">
|
||||||
|
<template #header>
|
||||||
|
<h4>流程详情 【{{ title }}】 - 当前进度【{{ jdtitle }}】<span v-if="showjd">
|
||||||
|
- 当前节点【{{ dataOptions.taskName }}】</span
|
||||||
|
></h4>
|
||||||
|
</template>
|
||||||
|
<div class="drawer">
|
||||||
|
<div class="drawerLeft">
|
||||||
|
<div class="block containers">
|
||||||
|
<div class="canvas" ref="flowCanvas"></div>
|
||||||
|
<div class="maskLayer" />
|
||||||
|
</div>
|
||||||
|
<el-timeline style="padding: 5px;">
|
||||||
|
<el-timeline-item
|
||||||
|
v-for="(item, index) in flowRecordList"
|
||||||
|
:key="index"
|
||||||
|
:icon="setIcon(item)"
|
||||||
|
:color="setColor(item)"
|
||||||
|
>
|
||||||
|
<p style="font-weight: 700">
|
||||||
|
{{ getSort(index) }}{{ item.taskName }}{{ item.commentResult }}
|
||||||
|
</p>
|
||||||
|
<el-card style="margin-top: 5px;">
|
||||||
|
<el-descriptions class="margin-top" :column="1" size="small" border>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.assigneeName"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><User /></el-icon>办理人</div>
|
||||||
|
</template>
|
||||||
|
{{ item.assigneeName }}
|
||||||
|
<el-tag type="info" size="small">{{ item.deptName }}</el-tag>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.candidate"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><UserFilled /></el-icon>候选办理</div>
|
||||||
|
</template>
|
||||||
|
{{ item.candidate }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.deleteReason"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Operation /></el-icon>驳回节点</div>
|
||||||
|
</template>
|
||||||
|
{{ getDeleteReason(item.deleteReason) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Clock /></el-icon>接收时间</div>
|
||||||
|
</template>
|
||||||
|
{{ item.startTime }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.endTime"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Clock /></el-icon>处理时间</div>
|
||||||
|
</template>
|
||||||
|
{{ item.endTime }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.duration"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Timer /></el-icon>处理耗时</div>
|
||||||
|
</template>
|
||||||
|
{{ formatDuraTime(item.duration) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.message"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Warning /></el-icon>处理意见</div>
|
||||||
|
</template>
|
||||||
|
{{ item.message }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</el-card>
|
||||||
|
</el-timeline-item>
|
||||||
|
</el-timeline>
|
||||||
|
</div>
|
||||||
|
<div class="drawerRight">
|
||||||
|
<el-tabs v-model="activeName" type="card" class="demo-tabs">
|
||||||
|
<el-tab-pane label="单位信息" name="base" v-if="dataOptions.category=='1'">
|
||||||
|
<el-form label-width="100px" size="small" >
|
||||||
|
<el-form-item label="单位类型">
|
||||||
|
<el-tag effect="dark">{{ initData.subDeptTypeName }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="单位名称">
|
||||||
|
{{ initData.subDeptName }} <el-tag type="info">{{ parData.subDeptCode }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="进入场地时间" v-if="dataOptions.category=='1'">
|
||||||
|
{{ parseTime(parData.useDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-row v-if="dataOptions.category=='1'">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划开工时间">
|
||||||
|
{{ parseTime(parData.startWorkDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划完工时间">
|
||||||
|
{{ parseTime(parData.endWorkDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="营业执照">
|
||||||
|
<ImagePreview :src="parData.businessLicensePath" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="合同约定范围">
|
||||||
|
{{ parData.contractInfos }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人身份证">
|
||||||
|
<ImagePreview :src="parData.subDeptInfos.legalPersonCardImgPos" :width="120" :height="70"/>
|
||||||
|
<ImagePreview :src="parData.subDeptInfos.legalPersonCardImgInv" :width="120" :height="70" style="margin-left: 20px;"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人姓名">
|
||||||
|
{{ parData.subDeptInfos.legalPerson }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人身份证号">
|
||||||
|
{{ parData.subDeptInfos.legalPersonCard }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="人员信息" name="users" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-form label-width="100px" size="small" >
|
||||||
|
<el-form-item label="代理人身份证" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.user.cardImgPos" :width="120" :height="70"/>
|
||||||
|
<ImagePreview :src="initData.user.cardImgInv" :width="120" :height="70" style="margin-left: 20px;"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="入场肖像近照" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.user.userPicture" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="单位委托证明" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.subDeptPowerPath" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="委托人姓名" v-if="dataOptions.category=='1'">
|
||||||
|
{{ initData.user.nickName }} <el-tag type="info">{{ initData.user.cardCode }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="联系电话">
|
||||||
|
{{ initData.user.userName }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="文化程度">
|
||||||
|
<el-tag effect="dark">{{ initData.degreeGradeName }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="身体健康问题">
|
||||||
|
<el-tag effect="dark" :type="initData.illnessStatus==0?'success':'danger'">{{ initData.illnessStatus==0?'无':'有' }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="严重疾病情况">
|
||||||
|
<el-tag effect="dark" :type="initData.supIllnessStatus==0?'success':'danger'">{{ initData.supIllnessStatus==0?'无':'有' }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="安全培训承诺书">
|
||||||
|
<el-button link type="primary" icon="Link" @click="handleDownloadEduFile(initData.eduFilePath)">点击下载安全培训安全承诺书</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="视频培训" name="video" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-table :data="userEduVideoList">
|
||||||
|
<el-table-column label="播放时间" align="center" prop="playDates" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ parseTime(scope.row.playDates, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="播放时长" align="center" prop="playTimes" width="100">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ (scope.row.playTimes/1000).toFixed(2)+' 秒' }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="培训名称" align="center" prop="trainTitle" :show-overflow-tooltip="true"/>
|
||||||
|
<el-table-column label="培训类型" align="center" prop="trainTypeName"/>
|
||||||
|
<el-table-column label="培训级别" align="center" prop="trainLevelName"/>
|
||||||
|
</el-table>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="考试情况" name="exams" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-row class="task_panel">
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #409eff" :size="12">
|
||||||
|
<InfoFilled />
|
||||||
|
</el-icon>
|
||||||
|
<strong>考试结果</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '0'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399; font-weight: 800;">未提交</strong>
|
||||||
|
</div>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '1'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #67c23a; font-weight: 800;">已通过</strong>
|
||||||
|
</div>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '2'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #f56c6c; font-weight: 800;">不通过</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #67c23a" :size="12">
|
||||||
|
<TrendCharts />
|
||||||
|
</el-icon>
|
||||||
|
<strong>考试分数</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399">{{userEduExamInfos.userMark!=null?userEduExamInfos.userMark:'-'}}</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #409eff" :size="12">
|
||||||
|
<InfoFilled />
|
||||||
|
</el-icon>
|
||||||
|
<strong>答题耗时</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399" v-if="userEduExamInfos.useTimes">{{formatDuraTime(userEduExamInfos.useTimes)}}</strong>
|
||||||
|
<strong style="font-size: 16px; color: #909399" v-if="!userEduExamInfos.useTimes"> - </strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px" :size="12">
|
||||||
|
<Calendar />
|
||||||
|
</el-icon>
|
||||||
|
答题时间
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong>{{ parseTime(userEduExamInfos.createTime, "{y}-{m}-{d} {h}:{i}") }}</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<div class="startExamination">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(item,idx) in userEduQuestionList" :key="item.id">
|
||||||
|
<div class="topicTilte" style="font-weight: bold" ref="topicTilte">
|
||||||
|
{{ idx + 1 }}、<span class="score">[{{ item.questionType==1?'单选题':(item.questionType==2?'多选题':'判断题')}}]</span>{{ item.questionTitle }}
|
||||||
|
</div>
|
||||||
|
<template v-if="item.questionType === 1">
|
||||||
|
<el-radio-group v-model="item.userAnswer" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="(option,ox) in item.questionOption" class="Selected_item">
|
||||||
|
<el-radio :label="option.opt" disabled> {{ option.result }} </el-radio>
|
||||||
|
</div>
|
||||||
|
</el-radio-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-if="item.questionType === 2">
|
||||||
|
<el-checkbox-group v-model="item.userAnswerValues" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="option in item.questionOption" class="Selected_item">
|
||||||
|
<el-checkbox :label="option.opt" disabled> {{ option.result }} </el-checkbox>
|
||||||
|
</div>
|
||||||
|
</el-checkbox-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-if="item.questionType === 3">
|
||||||
|
<el-checkbox-group v-model="item.userAnswerValues" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="option in item.questionOption" class="Selected_item">
|
||||||
|
<el-checkbox :label="option.opt" disabled> {{ option.result }} </el-checkbox>
|
||||||
|
</div>
|
||||||
|
</el-checkbox-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="myProcessDrawer">
|
||||||
|
import { flowXmlAndNode } from "@/api/flowable/definition";
|
||||||
|
import { CustomViewer as BpmnViewer } from "@/components/Process/common";
|
||||||
|
import { Clock, Select, CloseBold } from '@element-plus/icons-vue'
|
||||||
|
import {
|
||||||
|
findCommentByProcInsId,
|
||||||
|
} from "@/api/flowable/businessKey";
|
||||||
|
import { getProProjectInfoSubdepts } from "@/api/manage/proProjectInfoSubdepts";
|
||||||
|
import { getProProjectInfoSubdeptsUsers } from "@/api/manage/proProjectInfoSubdeptsUsers";
|
||||||
|
import { getBusExamUserLast } from "@/api/manage/busExamUser";
|
||||||
|
import { getBusTrainingVideoUserLast } from "@/api/manage/busTrainingVideoUser";
|
||||||
|
|
||||||
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
|
const onOpen = ref(false);
|
||||||
|
const bpmnViewer = ref(null);
|
||||||
|
const title = ref("");
|
||||||
|
const jdtitle = ref("");
|
||||||
|
const showjd = ref(false);
|
||||||
|
const dataOptions = ref({});
|
||||||
|
const activeName = ref("");
|
||||||
|
const flowRecordList = ref([]);
|
||||||
|
const userEduVideoList = ref([]);
|
||||||
|
const userEduExamInfos = ref({});
|
||||||
|
const userEduQuestionList = ref([]);
|
||||||
|
const data = reactive({
|
||||||
|
parData: {
|
||||||
|
subDeptInfos:{}
|
||||||
|
},
|
||||||
|
initData: {
|
||||||
|
user: {}
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
const { parData, initData } = toRefs(data);
|
||||||
|
|
||||||
|
/** 获取节点图标 */
|
||||||
|
const setIcon = (row) => {
|
||||||
|
if (row.endTime) {
|
||||||
|
if (row.commentResult == "驳回") {
|
||||||
|
return CloseBold;
|
||||||
|
} else {
|
||||||
|
return Select;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Clock;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取节点颜色 */
|
||||||
|
const setColor = (row) => {
|
||||||
|
if (row.endTime) {
|
||||||
|
if (row.commentResult == "驳回") {
|
||||||
|
return "#f56c6c";
|
||||||
|
} else {
|
||||||
|
return "#2bc418";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "#409eff";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取节点排序 */
|
||||||
|
const getSort = (i) => {
|
||||||
|
let num = flowRecordList.value.length - i;
|
||||||
|
if (num < 10) {
|
||||||
|
num = "0" + num;
|
||||||
|
}
|
||||||
|
return num + ". ";
|
||||||
|
};
|
||||||
|
|
||||||
|
const doCanel = () => {
|
||||||
|
onOpen.value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 显示流程详情 */
|
||||||
|
const show = (options) => {
|
||||||
|
dataOptions.value = options;
|
||||||
|
title.value = options.procDefName;
|
||||||
|
onOpen.value = true;
|
||||||
|
showjd.value = false;
|
||||||
|
if (options.finishTime == null) {
|
||||||
|
jdtitle.value = "进行中";
|
||||||
|
showjd.value = true;
|
||||||
|
} else if (options.finishTime!= null && options.assigneeId == null) {
|
||||||
|
jdtitle.value = "已终止";
|
||||||
|
} else {
|
||||||
|
jdtitle.value = "已完成";
|
||||||
|
}
|
||||||
|
activeName.value = "base";
|
||||||
|
initFormValues();
|
||||||
|
getFlowRecordList(options.procInsId, options.deployId);
|
||||||
|
flowXmlAndNode({ procInsId: options.procInsId, deployId: options.deployId }).then(
|
||||||
|
(res) => {
|
||||||
|
initFlowImage(res.data);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 初始化工作流 */
|
||||||
|
const initFlowImage = async (data) => {
|
||||||
|
try {
|
||||||
|
bpmnViewer.value && bpmnViewer.value.destroy();
|
||||||
|
bpmnViewer.value = new BpmnViewer({
|
||||||
|
container: proxy.$refs.flowCanvas,
|
||||||
|
height: '90px',
|
||||||
|
});
|
||||||
|
await bpmnViewer.value.importXML(data.xmlData);
|
||||||
|
// 自适应
|
||||||
|
bpmnViewer.value.get("canvas").zoom("fit-viewport", "auto");
|
||||||
|
// 流程线高亮设置
|
||||||
|
if (data.nodeData !== undefined && data.nodeData.length > 0) {
|
||||||
|
await fillColor(data.nodeData);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message, err.warnings);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取流程节点 */
|
||||||
|
const getFlowRecordList = (procInsId, deployId) => {
|
||||||
|
const params = { procInsId: procInsId };
|
||||||
|
findCommentByProcInsId(params)
|
||||||
|
.then((res) => {
|
||||||
|
flowRecordList.value = res.data;
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
console.error("数据异常,请联系管理员...");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取表单数据 */
|
||||||
|
const initFormValues = () => {
|
||||||
|
let category = parseInt(dataOptions.value.category);
|
||||||
|
if(category==1 || category==2 || category==3 || category==4){
|
||||||
|
getProProjectInfoSubdeptsUsers(dataOptions.value.businessKey).then(res =>{
|
||||||
|
if(res.data.user.userInfos){
|
||||||
|
res.data.user.userInfos = JSON.parse(res.data.user.userInfos);
|
||||||
|
}
|
||||||
|
initData.value = res.data ;
|
||||||
|
getProProjectInfoSubdepts(res.data.subDeptId).then(parRes =>{
|
||||||
|
if(parRes.data.subDeptInfos){
|
||||||
|
parRes.data.subDeptInfos = JSON.parse(parRes.data.subDeptInfos);
|
||||||
|
}
|
||||||
|
parData.value = parRes.data;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
findEduVideos();
|
||||||
|
findEduExams();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 用户视频培训 */
|
||||||
|
function findEduVideos(){
|
||||||
|
getBusTrainingVideoUserLast(dataOptions.value.startUserId).then(res =>{
|
||||||
|
userEduVideoList.value = res.data||[]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 用户考试情况 */
|
||||||
|
function findEduExams(){
|
||||||
|
getBusExamUserLast(dataOptions.value.startUserId).then(res =>{
|
||||||
|
if(res.code==200 && res.data){
|
||||||
|
userEduExamInfos.value = res.data;
|
||||||
|
let list = res.data.busExamUserResultList;
|
||||||
|
list.forEach(item => {
|
||||||
|
if(item.questionType===2){
|
||||||
|
if(item.userAnswer==null){
|
||||||
|
item.userAnswer = "";
|
||||||
|
}
|
||||||
|
item.userAnswerValues = item.userAnswer.split(',');
|
||||||
|
}
|
||||||
|
item.questionOption = JSON.parse(item.questionOption);
|
||||||
|
});
|
||||||
|
userEduQuestionList.value = list;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 下载培训承诺书 */
|
||||||
|
function handleDownloadEduFile(filePath){
|
||||||
|
proxy.$download.resource(filePath);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 设置高亮颜色的 */
|
||||||
|
function fillColor(nodeData) {
|
||||||
|
const canvas = bpmnViewer.value.get('canvas')
|
||||||
|
bpmnViewer.value.getDefinitions().rootElements[0].flowElements.forEach(n => {
|
||||||
|
const completeTask = nodeData.find(m => m.key === n.id)
|
||||||
|
const todoTask = nodeData.find(m => !m.completed)
|
||||||
|
const endTask = nodeData[nodeData.length - 1]
|
||||||
|
if (n.$type === 'bpmn:UserTask') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
if (todoTask && completeTask.key === todoTask.key && !todoTask.completed){
|
||||||
|
canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}else {
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 排他网关
|
||||||
|
else if (n.$type === 'bpmn:ExclusiveGateway') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 并行网关
|
||||||
|
else if (n.$type === 'bpmn:ParallelGateway') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (n.$type === 'bpmn:StartEvent') {
|
||||||
|
n.outgoing.forEach(nn => {
|
||||||
|
const completeTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(nn.id, 'highlight')
|
||||||
|
canvas.addMarker(n.id, 'highlight')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else if (n.$type === 'bpmn:EndEvent') {
|
||||||
|
if (endTask.key === n.id && endTask.completed) {
|
||||||
|
canvas.addMarker(n.id, 'highlight')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 获取审批节点 */
|
||||||
|
const getDeleteReason = (val) => {
|
||||||
|
val = val.replace("Change activity to ", "");
|
||||||
|
let flowRecordList = this.flowRecordList;
|
||||||
|
for (let i = 0; i < flowRecordList.length; i++) {
|
||||||
|
if (flowRecordList[i].taskDefKey == val) {
|
||||||
|
return "驳回至" + flowRecordList[i].taskName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 暴露组件 */
|
||||||
|
defineExpose({
|
||||||
|
show
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.app-detailDrawer {
|
||||||
|
.el-drawer__header{
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
.drawer {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
.drawerLeft {
|
||||||
|
width: 50%;
|
||||||
|
min-width: 280px;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
border-right: 1px solid #dcdfe6;
|
||||||
|
overflow-y: scroll;
|
||||||
|
padding-right: 20px;
|
||||||
|
.bjs-powered-by {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.maskLayer {
|
||||||
|
width: 50%;
|
||||||
|
height: 90px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
top: 77px;
|
||||||
|
}
|
||||||
|
.el-timeline-item{
|
||||||
|
.el-timeline-item__node{
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin-top: -4px;
|
||||||
|
.el-timeline-item__icon{
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.drawerRight {
|
||||||
|
width: 50%;
|
||||||
|
min-width: 400px;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
padding-left: 20px;
|
||||||
|
|
||||||
|
.el-link_div {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.el-form-item__content{
|
||||||
|
.el-tag--info{
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.containers {
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
.canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
.panel {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 50px;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
.load {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.el-form-item__label {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.djs-palette {
|
||||||
|
left: 0px !important;
|
||||||
|
top: 0px;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.djs-container svg {
|
||||||
|
min-height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight.djs-shape .djs-visual > :nth-child(1) {
|
||||||
|
fill: green !important;
|
||||||
|
stroke: green !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-shape .djs-visual > :nth-child(2) {
|
||||||
|
fill: green !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-shape .djs-visual > path {
|
||||||
|
fill: green !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
stroke: green !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-connection > .djs-visual > path {
|
||||||
|
stroke: green !important;
|
||||||
|
}
|
||||||
|
.highlight-todo.djs-connection > .djs-visual > path {
|
||||||
|
stroke: orange !important;
|
||||||
|
stroke-dasharray: 4px !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.highlight-todo.djs-shape .djs-visual > :nth-child(1) {
|
||||||
|
fill: orange !important;
|
||||||
|
stroke: orange !important;
|
||||||
|
stroke-dasharray: 4px !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.overlays-div {
|
||||||
|
font-size: 10px;
|
||||||
|
color: red;
|
||||||
|
width: 100px;
|
||||||
|
top: -20px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.mytags{
|
||||||
|
float:left;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
.d-it-label{
|
||||||
|
width: 150px;
|
||||||
|
.my-label{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.el-icon{
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-divider__text{
|
||||||
|
color: #409eff;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
.task_panel {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.statistic_div {
|
||||||
|
.el-statistic__content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.startExamination {
|
||||||
|
padding: 0px 20px;
|
||||||
|
ul {
|
||||||
|
margin: 30px 0;
|
||||||
|
li {
|
||||||
|
list-style: none;
|
||||||
|
margin-top: 10px;
|
||||||
|
.Selected_item_radio {
|
||||||
|
display: block;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
.topicTilte {
|
||||||
|
.score {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.Selected_item_fill {
|
||||||
|
height: 45px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.answer {
|
||||||
|
height: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid #e1f3d8;
|
||||||
|
color: #67c23a;
|
||||||
|
padding: 0 15px;
|
||||||
|
//margin: 10px 20px 10px 0;
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.error {
|
||||||
|
height: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 15px;
|
||||||
|
//margin: 10px 20px 10px 0;
|
||||||
|
background: #fdf6ec;
|
||||||
|
border: 1px solid #faecd8;
|
||||||
|
color: #f56c6c;
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.CompletionAnswer {
|
||||||
|
height: 80px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid #e1f3d8;
|
||||||
|
color: #67c23a;
|
||||||
|
padding: 0 15px;
|
||||||
|
margin: 10px 20px 10px 0;
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
.CompletionAnswerIndex {
|
||||||
|
width: 50px;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border-right: 1px solid #e1f3d8;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.CompletionError {
|
||||||
|
height: 80px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 15px;
|
||||||
|
margin: 10px 20px 10px 0;
|
||||||
|
background: #fdf6ec;
|
||||||
|
border: 1px solid #faecd8;
|
||||||
|
color: #f56c6c;
|
||||||
|
.CompletionAnswerIndex {
|
||||||
|
width: 25px;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border-right: 1px solid #faecd8;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
.correctAnswer {
|
||||||
|
height: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-alert {
|
||||||
|
margin: 20px 0 0;
|
||||||
|
}
|
||||||
|
.el-alert:first-child {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,21 +1,51 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="名称" prop="name">
|
<el-form-item label="项目名称" prop="startProName" v-if="!userStore.currentProId">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.name"
|
v-model="queryParams.startProName"
|
||||||
placeholder="请输入名称"
|
placeholder="请输入项目名称"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="流程名称" prop="procDefName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.procDefName"
|
||||||
|
placeholder="请输入流程名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="流程分类" prop="category">
|
||||||
|
<el-select v-model="queryParams.category" placeholder="请选择流程分类" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in sys_process_category"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="申请时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="daterangeTimes"
|
||||||
|
type="daterange"
|
||||||
|
unlink-panels
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
:shortcuts="shortcuts"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8" v-if="false">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button
|
||||||
type="primary"
|
type="primary"
|
||||||
|
@ -38,35 +68,60 @@
|
||||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="myProcessData" border @selection-change="handleSelectionChange">
|
<el-tabs
|
||||||
<el-table-column type="selection" width="55" align="center" />
|
v-model="queryParams.activeTags"
|
||||||
<el-table-column label="流程编号" align="center" prop="procInsId" :show-overflow-tooltip="true"/>
|
type="card"
|
||||||
|
class="demo-tabs"
|
||||||
|
@tab-change="getList"
|
||||||
|
>
|
||||||
|
<el-tab-pane :label="'全部申请(' + tabs.all + ')'" name="all"></el-tab-pane>
|
||||||
|
<el-tab-pane :label="'进行中(' + tabs.await + ')'" name="await"></el-tab-pane>
|
||||||
|
<el-tab-pane :label="'已完成(' + tabs.finished + ')'" name="finished"></el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<el-table v-loading="loading" :data="myProcessData" border >
|
||||||
|
<el-table-column label="流程编号" align="center" prop="procInsId" width="88px" :show-overflow-tooltip="true"/>
|
||||||
|
<!-- <el-table-column label="所属公司" align="center" prop="startComName" :show-overflow-tooltip="true"/> -->
|
||||||
|
<el-table-column label="项目单位" align="center" prop="startProName" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="流程名称" align="center" prop="procDefName" :show-overflow-tooltip="true"/>
|
<el-table-column label="流程名称" align="center" prop="procDefName" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="流程类别" align="center" prop="category" width="100px" />
|
<el-table-column label="流程分类" align="center" prop="category" width="150px" >
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag :options="sys_process_category" :value="scope.row.category"/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="流程版本" align="center" width="80px">
|
<el-table-column label="流程版本" align="center" width="80px">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag size="small" >v{{ scope.row.procDefVersion }}</el-tag>
|
<el-tag size="small" >v{{ scope.row.procDefVersion }}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="提交时间" align="center" prop="createTime" width="180"/>
|
<el-table-column label="提交时间" align="center" prop="createTime" width="150">
|
||||||
<el-table-column label="流程状态" align="center" width="100">
|
<template #default="scope">
|
||||||
|
<span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="流程状态" align="center" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag v-if="scope.row.finishTime == null" size="small">进行中</el-tag>
|
<el-tag v-if="scope.row.finishTime == null" size="small">进行中</el-tag>
|
||||||
<el-tag type="success" v-if="scope.row.finishTime != null" size="small">已完成</el-tag>
|
<el-tag type="success" v-if="scope.row.finishTime != null && scope.row.assigneeId != null" size="small">已完成</el-tag>
|
||||||
|
<el-tag type="danger" v-if="scope.row.finishTime != null && scope.row.assigneeId == null" size="small">已终止</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="耗时" align="center" prop="duration" width="180"/>
|
<el-table-column label="耗时" align="center" prop="duration" width="150">
|
||||||
<el-table-column label="当前节点" align="center" prop="taskName"/>
|
<template #default="scope">
|
||||||
<el-table-column label="办理人" align="center">
|
<span>{{ formatDuraDate(scope.row.duration) }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="当前节点" align="center" prop="taskName" width="120" :show-overflow-tooltip="true"/>
|
||||||
|
<el-table-column label="办理人" align="center" width="200">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<label v-if="scope.row.assigneeName">{{scope.row.assigneeName}} <el-tag type="info" size="small">{{scope.row.assigneeDeptName}}</el-tag></label>
|
<label v-if="scope.row.assigneeName">{{scope.row.assigneeName}} <el-tag type="info" size="small">{{scope.row.assigneeDeptName}}</el-tag></label>
|
||||||
<!-- <label v-if="scope.row.candidate">{{scope.row.candidate}}</label>-->
|
<!--<label v-if="scope.row.candidate">{{scope.row.candidate}}</label>-->
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="操作" width="200" fixed="right" class-name="small-padding fixed-width">
|
<el-table-column label="操作" width="160" align="center" fixed="right" class-name="small-padding fixed-width">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
|
<!-- <el-button v-if="getActivate(scope.row)" @click="handleFlowRecord(scope.row)" link type="primary" size="small">处理</el-button> -->
|
||||||
<el-button @click="handleFlowRecord(scope.row)" link type="primary" size="small">详情</el-button>
|
<el-button @click="handleFlowRecord(scope.row)" link type="primary" size="small">详情</el-button>
|
||||||
<el-button @click="handleStop(scope.row)" link type="primary" size="small">取消申请</el-button>
|
<el-button @click="handleStop(scope.row)" link type="primary" size="small">终止</el-button>
|
||||||
<el-button @click="handleDelete(scope.row)" link type="primary" size="small" v-hasPermi="['system:deployment:remove']">删除</el-button>
|
<el-button @click="handleDelete(scope.row)" link type="primary" size="small" v-hasPermi="['system:deployment:remove']">删除</el-button>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
|
@ -124,6 +179,27 @@
|
||||||
/>
|
/>
|
||||||
</el-dialog>
|
</el-dialog>
|
||||||
|
|
||||||
|
<!-- 中止流程 -->
|
||||||
|
<el-dialog :title="stopTitle" v-model="stopOpen" width="680" append-to-body>
|
||||||
|
<el-form :model="stopProcessForm" ref="stopProcessFormRef" :rules="stopProcessRules" label-width="88px">
|
||||||
|
<el-form-item label="终止原因" prop="comment">
|
||||||
|
<el-input
|
||||||
|
v-model="stopProcessForm.comment"
|
||||||
|
placeholder="请输入流程终止原因"
|
||||||
|
type="textarea"
|
||||||
|
rows="5"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
<template #footer>
|
||||||
|
<div class="dialog-footer">
|
||||||
|
<el-button type="primary" icon="Finished" @click="handleProcessStop">确 认 中 止</el-button>
|
||||||
|
<el-button @click="stopOpen=false">取 消</el-button>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-dialog>
|
||||||
|
|
||||||
|
<detailProcess ref="detailProcessRef"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
@ -131,10 +207,16 @@
|
||||||
import { delDeployment, flowRecord } from "@/api/flowable/finished";
|
import { delDeployment, flowRecord } from "@/api/flowable/finished";
|
||||||
import { myProcessList,stopProcess } from "@/api/flowable/process";
|
import { myProcessList,stopProcess } from "@/api/flowable/process";
|
||||||
import { listDefinition } from "@/api/flowable/definition";
|
import { listDefinition } from "@/api/flowable/definition";
|
||||||
|
import { allList, queryCount } from "@/api/flowable/businessKey";
|
||||||
import router from "@/router";
|
import router from "@/router";
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
|
import detailProcess from "@/views/flowable/task/myProcess/detail/indexDrawer.vue";
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
const { sys_process_category } = proxy.useDict('sys_process_category');
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const detailProcessRef = ref("");
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
const processLoading = ref(true);
|
const processLoading = ref(true);
|
||||||
|
@ -155,22 +237,65 @@ const myProcessData = ref([]);
|
||||||
const title = ref("");
|
const title = ref("");
|
||||||
// 是否显示弹出层
|
// 是否显示弹出层
|
||||||
const open = ref(false);
|
const open = ref(false);
|
||||||
const src = ref("");
|
|
||||||
const definitionList = ref([]);
|
const definitionList = ref([]);
|
||||||
|
const daterangeTimes = ref([]);
|
||||||
|
const tabs = ref({
|
||||||
|
all:0,
|
||||||
|
await:0,
|
||||||
|
finished:0
|
||||||
|
});
|
||||||
|
const shortcuts = [
|
||||||
|
{
|
||||||
|
text: '最近一周',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近一个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近三个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
|
// 终止弹出层标题
|
||||||
|
const stopTitle = ref("终止流程申请");
|
||||||
|
// 终止显示弹出层
|
||||||
|
const stopOpen = ref(false);
|
||||||
|
// 终止流程的表单
|
||||||
|
const stopProcessForm = ref({});
|
||||||
|
const stopProcessRules = ref({
|
||||||
|
comment: [{ required: true, message: "流程终止原因不能为空", trigger: "blur" },
|
||||||
|
{
|
||||||
|
max: 500,
|
||||||
|
message: "终止原因最多输入500字",
|
||||||
|
trigger: "blur",
|
||||||
|
}]
|
||||||
|
});
|
||||||
|
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
name: null,
|
startProName: null,
|
||||||
|
procDefName: null,
|
||||||
category: null,
|
category: null,
|
||||||
key: null,
|
activeTags: "await"
|
||||||
tenantId: null,
|
|
||||||
deployTime: null,
|
|
||||||
derivedFrom: null,
|
|
||||||
derivedFromRoot: null,
|
|
||||||
parentDeploymentId: null,
|
|
||||||
engineVersion: null
|
|
||||||
},
|
},
|
||||||
// 查询参数
|
// 查询参数
|
||||||
queryProcessParams: {
|
queryProcessParams: {
|
||||||
|
@ -193,13 +318,31 @@ const { queryParams, queryProcessParams } = toRefs(data);
|
||||||
/** 查询流程定义列表 */
|
/** 查询流程定义列表 */
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
myProcessList(queryParams.value).then(response => {
|
getQueryCount();
|
||||||
|
allList(proxy.addDateRange(queryParams.value, daterangeTimes.value)).then((response) => {
|
||||||
myProcessData.value = response.rows;
|
myProcessData.value = response.rows;
|
||||||
total.value = response.total;
|
total.value = response.total;
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 统计流程定义数量 */
|
||||||
|
function getQueryCount() {
|
||||||
|
queryCount(proxy.addDateRange(queryParams.value, daterangeTimes.value)).then((response) => {
|
||||||
|
let _tabs = {
|
||||||
|
all:0,
|
||||||
|
await:0,
|
||||||
|
finished:0
|
||||||
|
}
|
||||||
|
if(response.code==200){
|
||||||
|
_tabs.all = parseInt(response.data.await) + parseInt(response.data.finished);
|
||||||
|
_tabs.await = response.data.await;
|
||||||
|
_tabs.finished = response.data.finished;
|
||||||
|
}
|
||||||
|
tabs.value = _tabs;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
function handleQuery() {
|
function handleQuery() {
|
||||||
queryParams.value.pageNum = 1;
|
queryParams.value.pageNum = 1;
|
||||||
|
@ -258,23 +401,51 @@ function handleStartProcess(row){
|
||||||
|
|
||||||
/** 取消流程申请 */
|
/** 取消流程申请 */
|
||||||
function handleStop(row){
|
function handleStop(row){
|
||||||
const params = {
|
stopProcessForm.value.taskId = row.taskId;
|
||||||
instanceId: row.procInsId
|
stopProcessForm.value.userId = userStore.uid;
|
||||||
}
|
stopProcessForm.value.instanceId = row.procInsId;
|
||||||
stopProcess(params).then( res => {
|
stopOpen.value = true;
|
||||||
proxy.$modal.msgSuccess(res.msg);
|
}
|
||||||
|
|
||||||
|
/** 中止流程申请 */
|
||||||
|
function handleProcessStop(){
|
||||||
|
proxy.$refs["stopProcessFormRef"].validate(valid => {
|
||||||
|
if (valid) {
|
||||||
|
proxy.$confirm('是否确认终止流程定义编号为"' + stopProcessForm.value.instanceId + '"的数据项?', "警告", {
|
||||||
|
confirmButtonText: "确定",
|
||||||
|
cancelButtonText: "取消",
|
||||||
|
type: "warning"
|
||||||
|
}).then(() => {
|
||||||
|
loading.value = true;
|
||||||
|
stopOpen.value = false;
|
||||||
|
return stopProcess(stopProcessForm.value);
|
||||||
|
}).then(() => {
|
||||||
|
stopProcessForm.value.comment="";
|
||||||
getList();
|
getList();
|
||||||
|
proxy.$modal.msgSuccess("终止成功");
|
||||||
|
})
|
||||||
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 判断是否继续办理 */
|
||||||
|
function getActivate(row) {
|
||||||
|
if (row.taskName == "提交申请" && row.assigneeId == userStore.uid) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/** 流程流转记录 */
|
/** 流程流转记录 */
|
||||||
function handleFlowRecord(row){
|
function handleFlowRecord(row){
|
||||||
router.push({ path: '/flowable/task/myProcess/detail/index',
|
detailProcessRef.value.show(row);
|
||||||
query: {
|
// router.push({ path: '/flowable/task/myProcess/detail/index',
|
||||||
procInsId: row.procInsId,
|
// query: {
|
||||||
deployId: row.deployId,
|
// procInsId: row.procInsId,
|
||||||
taskId: row.taskId
|
// deployId: row.deployId,
|
||||||
}})
|
// taskId: row.taskId
|
||||||
|
// }})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 删除按钮操作 */
|
/** 删除按钮操作 */
|
||||||
|
|
|
@ -0,0 +1,990 @@
|
||||||
|
<template>
|
||||||
|
<div class="app-detailDrawer">
|
||||||
|
<el-drawer v-model="onOpen" :show-close="true" size="80%">
|
||||||
|
<template #header>
|
||||||
|
<h4>流程详情 【{{ title }}】 - 当前进度【{{ jdtitle }}】<span v-if="showjd">
|
||||||
|
- 当前节点【{{ dataOptions.taskName }}】</span
|
||||||
|
></h4>
|
||||||
|
</template>
|
||||||
|
<div class="drawer" v-loading="loading">
|
||||||
|
<div class="drawerLeft">
|
||||||
|
<div class="block containers">
|
||||||
|
<div class="canvas" ref="flowCanvas"></div>
|
||||||
|
<div class="maskLayer" />
|
||||||
|
</div>
|
||||||
|
<el-timeline style="padding: 5px;">
|
||||||
|
<el-timeline-item
|
||||||
|
v-for="(item, index) in flowRecordList"
|
||||||
|
:key="index"
|
||||||
|
:icon="setIcon(item)"
|
||||||
|
:color="setColor(item)"
|
||||||
|
>
|
||||||
|
<p style="font-weight: 700">
|
||||||
|
{{ getSort(index) }}{{ item.taskName }}{{ item.commentResult }}
|
||||||
|
</p>
|
||||||
|
<el-card style="margin-top: 5px;">
|
||||||
|
<el-descriptions class="margin-top" :column="1" size="small" border>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.assigneeName"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><User /></el-icon>办理人</div>
|
||||||
|
</template>
|
||||||
|
{{ item.assigneeName }}
|
||||||
|
<el-tag type="info" size="small">{{ item.deptName }}</el-tag>
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.candidate"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><UserFilled /></el-icon>候选办理</div>
|
||||||
|
</template>
|
||||||
|
{{ item.candidate }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.deleteReason"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Operation /></el-icon>驳回节点</div>
|
||||||
|
</template>
|
||||||
|
{{ getDeleteReason(item.deleteReason) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Clock /></el-icon>接收时间</div>
|
||||||
|
</template>
|
||||||
|
{{ item.startTime }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.endTime"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Clock /></el-icon>处理时间</div>
|
||||||
|
</template>
|
||||||
|
{{ item.endTime }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.duration"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Timer /></el-icon>处理耗时</div>
|
||||||
|
</template>
|
||||||
|
{{ formatDuraTime(item.duration) }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
<el-descriptions-item
|
||||||
|
v-if="item.message"
|
||||||
|
label-class-name="d-it-label"
|
||||||
|
>
|
||||||
|
<template #label>
|
||||||
|
<div class="my-label"><el-icon><Warning /></el-icon>处理意见</div>
|
||||||
|
</template>
|
||||||
|
{{ item.message }}
|
||||||
|
</el-descriptions-item>
|
||||||
|
</el-descriptions>
|
||||||
|
</el-card>
|
||||||
|
</el-timeline-item>
|
||||||
|
</el-timeline>
|
||||||
|
</div>
|
||||||
|
<div class="drawerRight">
|
||||||
|
<el-tabs v-model="activeName" type="card" class="demo-tabs">
|
||||||
|
<el-tab-pane label="单位信息" name="base" v-if="dataOptions.category=='1'">
|
||||||
|
<el-form label-width="100px" size="small" >
|
||||||
|
<el-form-item label="单位类型">
|
||||||
|
<el-tag effect="dark">{{ initData.subDeptTypeName }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="单位名称">
|
||||||
|
{{ initData.subDeptName }} <el-tag type="info">{{ parData.subDeptCode }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="进入场地时间" v-if="dataOptions.category=='1'">
|
||||||
|
{{ parseTime(parData.useDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-row v-if="dataOptions.category=='1'">
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划开工时间">
|
||||||
|
{{ parseTime(parData.startWorkDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="计划完工时间">
|
||||||
|
{{ parseTime(parData.endWorkDates, '{y}-{m}-{d}') }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="营业执照">
|
||||||
|
<ImagePreview :src="parData.businessLicensePath" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="合同约定范围">
|
||||||
|
{{ parData.contractInfos }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人身份证">
|
||||||
|
<ImagePreview :src="parData.subDeptInfos.legalPersonCardImgPos" :width="120" :height="70"/>
|
||||||
|
<ImagePreview :src="parData.subDeptInfos.legalPersonCardImgInv" :width="120" :height="70" style="margin-left: 20px;"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人姓名">
|
||||||
|
{{ parData.subDeptInfos.legalPerson }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="法人身份证号">
|
||||||
|
{{ parData.subDeptInfos.legalPersonCard }}
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="人员信息" name="users" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-form label-width="100px" size="small" >
|
||||||
|
<el-form-item label="代理人身份证" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.user.cardImgPos" :width="120" :height="70"/>
|
||||||
|
<ImagePreview :src="initData.user.cardImgInv" :width="120" :height="70" style="margin-left: 20px;"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="入场肖像近照" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.user.userPicture" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="单位委托证明" v-if="dataOptions.category=='1'">
|
||||||
|
<ImagePreview :src="initData.subDeptPowerPath" :width="120" :height="70"/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="委托人姓名" v-if="dataOptions.category=='1'">
|
||||||
|
{{ initData.user.nickName }} <el-tag type="info">{{ initData.user.cardCode }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="联系电话">
|
||||||
|
{{ initData.user.userName }}
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="文化程度">
|
||||||
|
<el-tag effect="dark">{{ initData.degreeGradeName }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
<el-row>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="身体健康问题">
|
||||||
|
<el-tag effect="dark" :type="initData.illnessStatus==0?'success':'danger'">{{ initData.illnessStatus==0?'无':'有' }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="12">
|
||||||
|
<el-form-item label="严重疾病情况">
|
||||||
|
<el-tag effect="dark" :type="initData.supIllnessStatus==0?'success':'danger'">{{ initData.supIllnessStatus==0?'无':'有' }}</el-tag>
|
||||||
|
</el-form-item>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<el-form-item label="安全培训承诺书">
|
||||||
|
<el-button link type="primary" icon="Link" @click="handleDownloadEduFile(initData.eduFilePath)">点击下载安全培训安全承诺书</el-button>
|
||||||
|
</el-form-item>
|
||||||
|
</el-form>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="视频培训" name="video" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-table :data="userEduVideoList">
|
||||||
|
<el-table-column label="播放时间" align="center" prop="playDates" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ parseTime(scope.row.playDates, '{y}-{m}-{d} {h}:{i}:{s}') }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="播放时长" align="center" prop="playTimes" width="100">
|
||||||
|
<template #default="scope">
|
||||||
|
<span>{{ (scope.row.playTimes/1000).toFixed(2)+' 秒' }}</span>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
|
<el-table-column label="培训名称" align="center" prop="trainTitle" :show-overflow-tooltip="true"/>
|
||||||
|
<el-table-column label="培训类型" align="center" prop="trainTypeName"/>
|
||||||
|
<el-table-column label="培训级别" align="center" prop="trainLevelName"/>
|
||||||
|
</el-table>
|
||||||
|
</el-tab-pane>
|
||||||
|
<el-tab-pane label="考试情况" name="exams" v-if="dataOptions.category=='1' || dataOptions.category=='2' || dataOptions.category=='3' || dataOptions.category=='4'">
|
||||||
|
<el-row class="task_panel">
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #409eff" :size="12">
|
||||||
|
<InfoFilled />
|
||||||
|
</el-icon>
|
||||||
|
<strong>考试结果</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '0'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399; font-weight: 800;">未提交</strong>
|
||||||
|
</div>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '1'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #67c23a; font-weight: 800;">已通过</strong>
|
||||||
|
</div>
|
||||||
|
<div v-if="userEduExamInfos.resStatus == '2'" class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #f56c6c; font-weight: 800;">不通过</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #67c23a" :size="12">
|
||||||
|
<TrendCharts />
|
||||||
|
</el-icon>
|
||||||
|
<strong>考试分数</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399">{{userEduExamInfos.userMark!=null?userEduExamInfos.userMark:'-'}}</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px; color: #409eff" :size="12">
|
||||||
|
<InfoFilled />
|
||||||
|
</el-icon>
|
||||||
|
<strong>答题耗时</strong>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong style="font-size: 16px; color: #909399" v-if="userEduExamInfos.useTimes">{{formatDuraTime(userEduExamInfos.useTimes)}}</strong>
|
||||||
|
<strong style="font-size: 16px; color: #909399" v-if="!userEduExamInfos.useTimes"> - </strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
<el-col :span="6">
|
||||||
|
<el-statistic class="statistic_div">
|
||||||
|
<template #title>
|
||||||
|
<div style="display: inline-flex; align-items: center">
|
||||||
|
<el-icon style="margin-right: 4px" :size="12">
|
||||||
|
<Calendar />
|
||||||
|
</el-icon>
|
||||||
|
答题时间
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</el-statistic>
|
||||||
|
<div class="countdown-footer">
|
||||||
|
<strong>{{ parseTime(userEduExamInfos.createTime, "{y}-{m}-{d} {h}:{i}") }}</strong>
|
||||||
|
</div>
|
||||||
|
</el-col>
|
||||||
|
</el-row>
|
||||||
|
<div class="startExamination">
|
||||||
|
<ul>
|
||||||
|
<li v-for="(item,idx) in userEduQuestionList" :key="item.id">
|
||||||
|
<div class="topicTilte" style="font-weight: bold" ref="topicTilte">
|
||||||
|
{{ idx + 1 }}、<span class="score">[{{ item.questionType==1?'单选题':(item.questionType==2?'多选题':'判断题')}}]</span>{{ item.questionTitle }}
|
||||||
|
</div>
|
||||||
|
<template v-if="item.questionType === 1">
|
||||||
|
<el-radio-group v-model="item.userAnswer" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="(option,ox) in item.questionOption" class="Selected_item">
|
||||||
|
<el-radio :label="option.opt" disabled> {{ option.result }} </el-radio>
|
||||||
|
</div>
|
||||||
|
</el-radio-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-if="item.questionType === 2">
|
||||||
|
<el-checkbox-group v-model="item.userAnswerValues" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="option in item.questionOption" class="Selected_item">
|
||||||
|
<el-checkbox :label="option.opt" disabled> {{ option.result }} </el-checkbox>
|
||||||
|
</div>
|
||||||
|
</el-checkbox-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<template v-if="item.questionType === 3">
|
||||||
|
<el-checkbox-group v-model="item.userAnswerValues" class="ml-4 Selected_item_radio" style="width: 100%">
|
||||||
|
<div v-for="option in item.questionOption" class="Selected_item">
|
||||||
|
<el-checkbox :label="option.opt" disabled> {{ option.result }} </el-checkbox>
|
||||||
|
</div>
|
||||||
|
</el-checkbox-group>
|
||||||
|
<div :class="item.answer == item.userAnswer?'answer':'error'">
|
||||||
|
<div class="correctAnswer">正确答案:{{ item.answer }}</div>
|
||||||
|
<div class="testAnswers">试卷答案:{{ item.userAnswer }}</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</el-tab-pane>
|
||||||
|
</el-tabs>
|
||||||
|
<el-form ref="approveProcessRef" :model="form" :rules="rules" label-width="100px" size="small" >
|
||||||
|
<el-form-item label="审批意见" prop="comment">
|
||||||
|
<el-input
|
||||||
|
type="textarea"
|
||||||
|
v-model="form.comment"
|
||||||
|
placeholder="请输入审批意见(最多500字)"
|
||||||
|
:rows="5"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<div style="text-align: center">
|
||||||
|
<el-button
|
||||||
|
v-if="returnTaskBtn"
|
||||||
|
icon="CircleCloseFilled"
|
||||||
|
type="danger"
|
||||||
|
size="small"
|
||||||
|
@click="handleReturn"
|
||||||
|
>驳回申请</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
icon="WarningFilled"
|
||||||
|
type="warning"
|
||||||
|
size="small"
|
||||||
|
@click="handleReject"
|
||||||
|
>驳回上级</el-button
|
||||||
|
>
|
||||||
|
<el-button
|
||||||
|
icon="Finished"
|
||||||
|
type="success"
|
||||||
|
size="small"
|
||||||
|
@click="handlePass"
|
||||||
|
>审批通过</el-button
|
||||||
|
>
|
||||||
|
</div>
|
||||||
|
</el-form>
|
||||||
|
<div class="page-warning">
|
||||||
|
<p v-if="returnTaskBtn">
|
||||||
|
<strong style="color: #f56c6c">“驳回申请”</strong>
|
||||||
|
操作后,代表您对当前任务不满意,任务退回给申请人处理。
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong style="color: #e6a23c">“驳回上级”</strong>
|
||||||
|
操作后,代表您对当前任务不满意,任务退回到上一阶段继续处理。
|
||||||
|
</p>
|
||||||
|
<p>
|
||||||
|
<strong style="color: #67c23a">“审批通过”</strong>
|
||||||
|
操作后,代表您对当前任务满意,任务进入下一阶段。
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</el-drawer>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script setup name="approveProcessDrawer">
|
||||||
|
import { flowXmlAndNode } from "@/api/flowable/definition";
|
||||||
|
import { CustomViewer as BpmnViewer } from "@/components/Process/common";
|
||||||
|
import { Clock, Select, CloseBold } from '@element-plus/icons-vue';
|
||||||
|
import { complete, rejectTask, returnTask, returnList } from "@/api/flowable/todo";
|
||||||
|
import {
|
||||||
|
findCommentByProcInsId,
|
||||||
|
} from "@/api/flowable/businessKey";
|
||||||
|
import { getProProjectInfoSubdepts } from "@/api/manage/proProjectInfoSubdepts";
|
||||||
|
import { getProProjectInfoSubdeptsUsers } from "@/api/manage/proProjectInfoSubdeptsUsers";
|
||||||
|
import { getBusExamUserLast } from "@/api/manage/busExamUser";
|
||||||
|
import { getBusTrainingVideoUserLast } from "@/api/manage/busTrainingVideoUser";
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
|
|
||||||
|
const { proxy } = getCurrentInstance();
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const onOpen = ref(false);
|
||||||
|
const loading = ref(false);
|
||||||
|
const bpmnViewer = ref(null);
|
||||||
|
const title = ref("");
|
||||||
|
const jdtitle = ref("");
|
||||||
|
const showjd = ref(false);
|
||||||
|
const dataOptions = ref({});
|
||||||
|
const activeName = ref("");
|
||||||
|
const returnTaskBtn = ref(false);
|
||||||
|
const flowRecordList = ref([]);
|
||||||
|
const userEduVideoList = ref([]);
|
||||||
|
const userEduExamInfos = ref({});
|
||||||
|
const userEduQuestionList = ref([]);
|
||||||
|
const data = reactive({
|
||||||
|
parData: {
|
||||||
|
subDeptInfos:{}
|
||||||
|
},
|
||||||
|
initData: {
|
||||||
|
user: {}
|
||||||
|
},
|
||||||
|
form: {
|
||||||
|
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
comment: [{ required: true, message: "审批意见不能为空", trigger: "blur" },
|
||||||
|
{
|
||||||
|
max: 500,
|
||||||
|
message: "审批意见最多输入500字",
|
||||||
|
trigger: "blur",
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
const { parData, initData, form, rules } = toRefs(data);
|
||||||
|
|
||||||
|
const emit = defineEmits(["handle"]);
|
||||||
|
|
||||||
|
/** 获取节点图标 */
|
||||||
|
const setIcon = (row) => {
|
||||||
|
if (row.endTime) {
|
||||||
|
if (row.commentResult == "驳回") {
|
||||||
|
return CloseBold;
|
||||||
|
} else {
|
||||||
|
return Select;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return Clock;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取节点颜色 */
|
||||||
|
const setColor = (row) => {
|
||||||
|
if (row.endTime) {
|
||||||
|
if (row.commentResult == "驳回") {
|
||||||
|
return "#f56c6c";
|
||||||
|
} else {
|
||||||
|
return "#2bc418";
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
return "#409eff";
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取节点排序 */
|
||||||
|
const getSort = (i) => {
|
||||||
|
let num = flowRecordList.value.length - i;
|
||||||
|
if (num < 10) {
|
||||||
|
num = "0" + num;
|
||||||
|
}
|
||||||
|
return num + ". ";
|
||||||
|
};
|
||||||
|
|
||||||
|
const doCanel = () => {
|
||||||
|
onOpen.value = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 审批通过 */
|
||||||
|
function handlePass() {
|
||||||
|
proxy.$refs["approveProcessRef"].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
loading.value = true;
|
||||||
|
proxy.$modal.confirm('是否确认审批通过流程编号为"' + dataOptions.value.taskId + '"的数据项?').then(function() {
|
||||||
|
return complete(form.value);
|
||||||
|
}).then(() => {
|
||||||
|
doCanel();
|
||||||
|
emit('handle');
|
||||||
|
proxy.$modal.msgSuccess("审批成功");
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 驳回上级 */
|
||||||
|
function handleReject() {
|
||||||
|
proxy.$refs["approveProcessRef"].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
loading.value = true;
|
||||||
|
proxy.$modal.confirm('是否确认审批驳回流程编号为"' + dataOptions.value.taskId + '"的数据项?').then(function() {
|
||||||
|
return rejectTask(form.value);
|
||||||
|
}).then(() => {
|
||||||
|
doCanel();
|
||||||
|
emit('handle');
|
||||||
|
proxy.$modal.msgSuccess("审批成功");
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 驳回申请 */
|
||||||
|
function handleReturn() {
|
||||||
|
proxy.$refs["approveProcessRef"].validate((valid) => {
|
||||||
|
if (valid) {
|
||||||
|
loading.value = true;
|
||||||
|
proxy.$modal.confirm('是否确认审批驳回流程编号为"' + dataOptions.value.taskId + '"的数据项至申请人?').then(function() {
|
||||||
|
return returnTask(form.value);
|
||||||
|
}).then(() => {
|
||||||
|
doCanel();
|
||||||
|
emit('handle');
|
||||||
|
proxy.$modal.msgSuccess("审批成功");
|
||||||
|
}).catch(() => {});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 显示流程详情 */
|
||||||
|
const show = (options) => {
|
||||||
|
dataOptions.value = options;
|
||||||
|
title.value = options.procDefName;
|
||||||
|
onOpen.value = true;
|
||||||
|
showjd.value = false;
|
||||||
|
if (options.finishTime == null) {
|
||||||
|
jdtitle.value = "进行中";
|
||||||
|
showjd.value = true;
|
||||||
|
} else if (options.finishTime!= null && options.assigneeId == null) {
|
||||||
|
jdtitle.value = "已终止";
|
||||||
|
} else {
|
||||||
|
jdtitle.value = "已完成";
|
||||||
|
}
|
||||||
|
activeName.value = "base";
|
||||||
|
initFormDate();
|
||||||
|
initFormValues();
|
||||||
|
getFlowRecordList(options.procInsId, options.deployId);
|
||||||
|
flowXmlAndNode({ procInsId: options.procInsId, deployId: options.deployId }).then(
|
||||||
|
(res) => {
|
||||||
|
initFlowImage(res.data);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 初始化表单数据 */
|
||||||
|
const initFormDate = () => {
|
||||||
|
form.value.taskId = dataOptions.value.taskId;
|
||||||
|
form.value.taskName = dataOptions.value.taskName;
|
||||||
|
form.value.userId = userStore.uid;
|
||||||
|
form.value.deployId = dataOptions.value.deployId;
|
||||||
|
form.value.procInsId = dataOptions.value.procInsId;
|
||||||
|
form.value.instanceId = dataOptions.value.procInsId;
|
||||||
|
form.value.executionId = dataOptions.value.procInsId;
|
||||||
|
form.value.comment = "";
|
||||||
|
returnTaskBtn.value = true;
|
||||||
|
loading.value = false;
|
||||||
|
initReturnList();
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化流程节点 */
|
||||||
|
const initReturnList = () => {
|
||||||
|
returnList(form.value).then((res) => {
|
||||||
|
//退回节点>1时,可显示退回按钮
|
||||||
|
if (res.data.length == 0) {
|
||||||
|
returnTaskBtn.value = false;
|
||||||
|
}else{
|
||||||
|
form.value.targetKey = res.data[0].id;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 初始化工作流 */
|
||||||
|
const initFlowImage = async (data) => {
|
||||||
|
try {
|
||||||
|
bpmnViewer.value && bpmnViewer.value.destroy();
|
||||||
|
bpmnViewer.value = new BpmnViewer({
|
||||||
|
container: proxy.$refs.flowCanvas,
|
||||||
|
height: '90px',
|
||||||
|
});
|
||||||
|
await bpmnViewer.value.importXML(data.xmlData);
|
||||||
|
// 自适应
|
||||||
|
bpmnViewer.value.get("canvas").zoom("fit-viewport", "auto");
|
||||||
|
// 流程线高亮设置
|
||||||
|
if (data.nodeData !== undefined && data.nodeData.length > 0) {
|
||||||
|
await fillColor(data.nodeData);
|
||||||
|
}
|
||||||
|
} catch (err) {
|
||||||
|
console.error(err.message, err.warnings);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取流程节点 */
|
||||||
|
const getFlowRecordList = (procInsId, deployId) => {
|
||||||
|
const params = { procInsId: procInsId };
|
||||||
|
findCommentByProcInsId(params)
|
||||||
|
.then((res) => {
|
||||||
|
flowRecordList.value = res.data;
|
||||||
|
})
|
||||||
|
.catch((res) => {
|
||||||
|
console.error("数据异常,请联系管理员...");
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 获取表单数据 */
|
||||||
|
const initFormValues = () => {
|
||||||
|
let category = parseInt(dataOptions.value.category);
|
||||||
|
if(category==1 || category==2 || category==3 || category==4){
|
||||||
|
getProProjectInfoSubdeptsUsers(dataOptions.value.businessKey).then(res =>{
|
||||||
|
if(res.data.user.userInfos){
|
||||||
|
res.data.user.userInfos = JSON.parse(res.data.user.userInfos);
|
||||||
|
}
|
||||||
|
initData.value = res.data ;
|
||||||
|
getProProjectInfoSubdepts(res.data.subDeptId).then(parRes =>{
|
||||||
|
if(parRes.data.subDeptInfos){
|
||||||
|
parRes.data.subDeptInfos = JSON.parse(parRes.data.subDeptInfos);
|
||||||
|
}
|
||||||
|
parData.value = parRes.data;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
findEduVideos();
|
||||||
|
findEduExams();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 用户视频培训 */
|
||||||
|
function findEduVideos(){
|
||||||
|
getBusTrainingVideoUserLast(dataOptions.value.startUserId).then(res =>{
|
||||||
|
userEduVideoList.value = res.data||[]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 用户考试情况 */
|
||||||
|
function findEduExams(){
|
||||||
|
getBusExamUserLast(dataOptions.value.startUserId).then(res =>{
|
||||||
|
if(res.code==200 && res.data){
|
||||||
|
userEduExamInfos.value = res.data;
|
||||||
|
let list = res.data.busExamUserResultList;
|
||||||
|
list.forEach(item => {
|
||||||
|
if(item.questionType===2){
|
||||||
|
if(item.userAnswer==null){
|
||||||
|
item.userAnswer = "";
|
||||||
|
}
|
||||||
|
item.userAnswerValues = item.userAnswer.split(',');
|
||||||
|
}
|
||||||
|
item.questionOption = JSON.parse(item.questionOption);
|
||||||
|
});
|
||||||
|
userEduQuestionList.value = list;
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 下载培训承诺书 */
|
||||||
|
function handleDownloadEduFile(filePath){
|
||||||
|
proxy.$download.resource(filePath);
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 设置高亮颜色的 */
|
||||||
|
function fillColor(nodeData) {
|
||||||
|
const canvas = bpmnViewer.value.get('canvas')
|
||||||
|
bpmnViewer.value.getDefinitions().rootElements[0].flowElements.forEach(n => {
|
||||||
|
const completeTask = nodeData.find(m => m.key === n.id)
|
||||||
|
const todoTask = nodeData.find(m => !m.completed)
|
||||||
|
const endTask = nodeData[nodeData.length - 1]
|
||||||
|
if (n.$type === 'bpmn:UserTask') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
if (todoTask && completeTask.key === todoTask.key && !todoTask.completed){
|
||||||
|
canvas.addMarker(nn.id, todoTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, todoTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}else {
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 排他网关
|
||||||
|
else if (n.$type === 'bpmn:ExclusiveGateway') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 并行网关
|
||||||
|
else if (n.$type === 'bpmn:ParallelGateway') {
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(n.id, completeTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
n.outgoing?.forEach(nn => {
|
||||||
|
const targetTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (targetTask) {
|
||||||
|
canvas.addMarker(nn.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
canvas.addMarker(nn.targetRef.id, targetTask.completed ? 'highlight' : 'highlight-todo')
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (n.$type === 'bpmn:StartEvent') {
|
||||||
|
n.outgoing.forEach(nn => {
|
||||||
|
const completeTask = nodeData.find(m => m.key === nn.targetRef.id)
|
||||||
|
if (completeTask) {
|
||||||
|
canvas.addMarker(nn.id, 'highlight')
|
||||||
|
canvas.addMarker(n.id, 'highlight')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
else if (n.$type === 'bpmn:EndEvent') {
|
||||||
|
if (endTask.key === n.id && endTask.completed) {
|
||||||
|
canvas.addMarker(n.id, 'highlight')
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
/** 获取审批节点 */
|
||||||
|
const getDeleteReason = (val) => {
|
||||||
|
val = val.replace("Change activity to ", "");
|
||||||
|
let flowRecordList = this.flowRecordList;
|
||||||
|
for (let i = 0; i < flowRecordList.length; i++) {
|
||||||
|
if (flowRecordList[i].taskDefKey == val) {
|
||||||
|
return "驳回至" + flowRecordList[i].taskName;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/** 暴露组件 */
|
||||||
|
defineExpose({
|
||||||
|
show
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
<style lang="scss">
|
||||||
|
.app-detailDrawer {
|
||||||
|
.el-drawer__header{
|
||||||
|
margin-bottom: 0 !important;
|
||||||
|
}
|
||||||
|
.drawer {
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 20px;
|
||||||
|
padding-right: 20px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
.drawerLeft {
|
||||||
|
width: 50%;
|
||||||
|
min-width: 280px;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
border-right: 1px solid #dcdfe6;
|
||||||
|
overflow-y: scroll;
|
||||||
|
padding-right: 20px;
|
||||||
|
.bjs-powered-by {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
.maskLayer {
|
||||||
|
width: 50%;
|
||||||
|
height: 90px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 9999;
|
||||||
|
top: 77px;
|
||||||
|
}
|
||||||
|
.el-timeline-item{
|
||||||
|
.el-timeline-item__node{
|
||||||
|
width: 20px;
|
||||||
|
height: 20px;
|
||||||
|
margin-top: -4px;
|
||||||
|
.el-timeline-item__icon{
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.drawerRight {
|
||||||
|
width: 50%;
|
||||||
|
min-width: 400px;
|
||||||
|
height: 100%;
|
||||||
|
float: left;
|
||||||
|
padding-left: 20px;
|
||||||
|
|
||||||
|
.el-link_div {
|
||||||
|
width: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.el-form-item__content{
|
||||||
|
.el-tag--info{
|
||||||
|
margin-left: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.containers {
|
||||||
|
width: 100%;
|
||||||
|
height: 90px;
|
||||||
|
.canvas {
|
||||||
|
width: 100%;
|
||||||
|
height: 100px;
|
||||||
|
}
|
||||||
|
.panel {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 50px;
|
||||||
|
width: 300px;
|
||||||
|
}
|
||||||
|
.load {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.el-form-item__label {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.djs-palette {
|
||||||
|
left: 0px !important;
|
||||||
|
top: 0px;
|
||||||
|
border-top: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.djs-container svg {
|
||||||
|
min-height: 90px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.highlight.djs-shape .djs-visual > :nth-child(1) {
|
||||||
|
fill: green !important;
|
||||||
|
stroke: green !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-shape .djs-visual > :nth-child(2) {
|
||||||
|
fill: green !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-shape .djs-visual > path {
|
||||||
|
fill: green !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
stroke: green !important;
|
||||||
|
}
|
||||||
|
.highlight.djs-connection > .djs-visual > path {
|
||||||
|
stroke: green !important;
|
||||||
|
}
|
||||||
|
.highlight-todo.djs-connection > .djs-visual > path {
|
||||||
|
stroke: orange !important;
|
||||||
|
stroke-dasharray: 4px !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.highlight-todo.djs-shape .djs-visual > :nth-child(1) {
|
||||||
|
fill: orange !important;
|
||||||
|
stroke: orange !important;
|
||||||
|
stroke-dasharray: 4px !important;
|
||||||
|
fill-opacity: 0.2 !important;
|
||||||
|
}
|
||||||
|
.overlays-div {
|
||||||
|
font-size: 10px;
|
||||||
|
color: red;
|
||||||
|
width: 100px;
|
||||||
|
top: -20px !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.mytags{
|
||||||
|
float:left;
|
||||||
|
margin-right: 6px;
|
||||||
|
}
|
||||||
|
.d-it-label{
|
||||||
|
width: 150px;
|
||||||
|
.my-label{
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
.el-icon{
|
||||||
|
margin-right: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-divider__text{
|
||||||
|
color: #409eff;
|
||||||
|
font-weight: 800;
|
||||||
|
}
|
||||||
|
.task_panel {
|
||||||
|
text-align: center;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.statistic_div {
|
||||||
|
.el-statistic__content {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.startExamination {
|
||||||
|
padding: 0px 20px;
|
||||||
|
ul {
|
||||||
|
margin: 30px 0;
|
||||||
|
li {
|
||||||
|
list-style: none;
|
||||||
|
margin-top: 10px;
|
||||||
|
.Selected_item_radio {
|
||||||
|
display: block;
|
||||||
|
flex: none;
|
||||||
|
}
|
||||||
|
.topicTilte {
|
||||||
|
.score {
|
||||||
|
display: inline-block;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.Selected_item_fill {
|
||||||
|
height: 45px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.answer {
|
||||||
|
height: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid #e1f3d8;
|
||||||
|
color: #67c23a;
|
||||||
|
padding: 0 15px;
|
||||||
|
//margin: 10px 20px 10px 0;
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.error {
|
||||||
|
height: 30px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 15px;
|
||||||
|
//margin: 10px 20px 10px 0;
|
||||||
|
background: #fdf6ec;
|
||||||
|
border: 1px solid #faecd8;
|
||||||
|
color: #f56c6c;
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.CompletionAnswer {
|
||||||
|
height: 80px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border: 1px solid #e1f3d8;
|
||||||
|
color: #67c23a;
|
||||||
|
padding: 0 15px;
|
||||||
|
margin: 10px 20px 10px 0;
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
.CompletionAnswerIndex {
|
||||||
|
width: 50px;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border-right: 1px solid #e1f3d8;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
.correctAnswer {
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.CompletionError {
|
||||||
|
height: 80px;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 0 15px;
|
||||||
|
margin: 10px 20px 10px 0;
|
||||||
|
background: #fdf6ec;
|
||||||
|
border: 1px solid #faecd8;
|
||||||
|
color: #f56c6c;
|
||||||
|
.CompletionAnswerIndex {
|
||||||
|
width: 25px;
|
||||||
|
height: 100%;
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
border-right: 1px solid #faecd8;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
.correctAnswer {
|
||||||
|
height: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.el-alert {
|
||||||
|
margin: 20px 0 0;
|
||||||
|
}
|
||||||
|
.el-alert:first-child {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.page-warning {
|
||||||
|
padding: 8px 16px;
|
||||||
|
background-color: #f0f9eb;
|
||||||
|
border-radius: 4px;
|
||||||
|
border-left: 5px solid #67c23a;
|
||||||
|
margin: 20px 0;
|
||||||
|
font-size: 13px;
|
||||||
|
margin-top: 30px;
|
||||||
|
color: darkkhaki;
|
||||||
|
p{
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
|
@ -1,21 +1,51 @@
|
||||||
<template>
|
<template>
|
||||||
<div class="app-container">
|
<div class="app-container">
|
||||||
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
<el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
|
||||||
<el-form-item label="名称" prop="name">
|
<el-form-item label="项目名称" prop="startProName" v-if="!userStore.currentProId">
|
||||||
<el-input
|
<el-input
|
||||||
v-model="queryParams.name"
|
v-model="queryParams.startProName"
|
||||||
placeholder="请输入名称"
|
placeholder="请输入项目名称"
|
||||||
clearable
|
clearable
|
||||||
@keyup.enter="handleQuery"
|
@keyup.enter="handleQuery"
|
||||||
/>
|
/>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
|
<el-form-item label="流程名称" prop="procDefName">
|
||||||
|
<el-input
|
||||||
|
v-model="queryParams.procDefName"
|
||||||
|
placeholder="请输入流程名称"
|
||||||
|
clearable
|
||||||
|
@keyup.enter="handleQuery"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="流程分类" prop="category">
|
||||||
|
<el-select v-model="queryParams.category" placeholder="请选择流程分类" clearable>
|
||||||
|
<el-option
|
||||||
|
v-for="dict in sys_process_category"
|
||||||
|
:key="dict.value"
|
||||||
|
:label="dict.label"
|
||||||
|
:value="dict.value"
|
||||||
|
/>
|
||||||
|
</el-select>
|
||||||
|
</el-form-item>
|
||||||
|
<el-form-item label="接受时间">
|
||||||
|
<el-date-picker
|
||||||
|
v-model="daterangeTimes"
|
||||||
|
type="daterange"
|
||||||
|
unlink-panels
|
||||||
|
range-separator="-"
|
||||||
|
start-placeholder="开始日期"
|
||||||
|
end-placeholder="结束日期"
|
||||||
|
value-format="YYYY-MM-DD"
|
||||||
|
:shortcuts="shortcuts"
|
||||||
|
/>
|
||||||
|
</el-form-item>
|
||||||
<el-form-item>
|
<el-form-item>
|
||||||
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
<el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
||||||
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
<el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
</el-form>
|
</el-form>
|
||||||
|
|
||||||
<el-row :gutter="10" class="mb8">
|
<el-row :gutter="10" class="mb8" v-if="false">
|
||||||
<el-col :span="1.5">
|
<el-col :span="1.5">
|
||||||
<el-button
|
<el-button
|
||||||
type="danger"
|
type="danger"
|
||||||
|
@ -30,17 +60,26 @@
|
||||||
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
<right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
|
||||||
</el-row>
|
</el-row>
|
||||||
|
|
||||||
<el-table v-loading="loading" :data="todoListData" border @selection-change="handleSelectionChange">
|
<el-table v-loading="loading" :data="todoListData" border>
|
||||||
<el-table-column type="selection" width="55" align="center"/>
|
<el-table-column label="任务编号" align="center" prop="taskId" width="88px" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="任务编号" align="center" prop="taskId" :show-overflow-tooltip="true"/>
|
<!-- <el-table-column label="所属公司" align="center" prop="startComName" :show-overflow-tooltip="true"/> -->
|
||||||
|
<el-table-column label="项目单位" align="center" prop="startProName" :show-overflow-tooltip="true"/>
|
||||||
<el-table-column label="流程名称" align="center" prop="procDefName"/>
|
<el-table-column label="流程名称" align="center" prop="procDefName"/>
|
||||||
|
<el-table-column label="流程分类" align="center" prop="category" width="180">
|
||||||
|
<template #default="scope">
|
||||||
|
<dict-tag
|
||||||
|
:options="sys_process_category"
|
||||||
|
:value="scope.row.category"
|
||||||
|
/>
|
||||||
|
</template>
|
||||||
|
</el-table-column>
|
||||||
<el-table-column label="当前节点" align="center" prop="taskName"/>
|
<el-table-column label="当前节点" align="center" prop="taskName"/>
|
||||||
<el-table-column label="流程版本" align="center">
|
<el-table-column label="流程版本" align="center" width="80">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<el-tag size="small" >v{{scope.row.procDefVersion}}</el-tag>
|
<el-tag size="small" >v{{scope.row.procDefVersion}}</el-tag>
|
||||||
</template>
|
</template>
|
||||||
</el-table-column>
|
</el-table-column>
|
||||||
<el-table-column label="流程发起人" align="center">
|
<el-table-column label="流程发起人" align="center" width="220">
|
||||||
<template #default="scope">
|
<template #default="scope">
|
||||||
<label>{{scope.row.startUserName}} <el-tag type="info" size="small">{{scope.row.startDeptName}}</el-tag></label>
|
<label>{{scope.row.startUserName}} <el-tag type="info" size="small">{{scope.row.startDeptName}}</el-tag></label>
|
||||||
</template>
|
</template>
|
||||||
|
@ -52,7 +91,7 @@
|
||||||
link
|
link
|
||||||
size="small"
|
size="small"
|
||||||
type="primary"
|
type="primary"
|
||||||
icon="Pointer"
|
icon="Finished"
|
||||||
@click="handleProcess(scope.row)"
|
@click="handleProcess(scope.row)"
|
||||||
>处理
|
>处理
|
||||||
</el-button>
|
</el-button>
|
||||||
|
@ -67,15 +106,23 @@
|
||||||
v-model:limit="queryParams.pageSize"
|
v-model:limit="queryParams.pageSize"
|
||||||
@pagination="getList"
|
@pagination="getList"
|
||||||
/>
|
/>
|
||||||
|
|
||||||
|
<approveProcess ref="approveProcessRef" @handle="handleSuccess"/>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script setup name="Todo">
|
<script setup name="Todo">
|
||||||
import { todoList, delDeployment } from "@/api/flowable/todo";
|
import { todoList, delDeployment } from "@/api/flowable/todo";
|
||||||
|
import { myAwaitFlowTaskList } from "@/api/flowable/businessKey";
|
||||||
|
import useUserStore from '@/store/modules/user'
|
||||||
import router from "@/router";
|
import router from "@/router";
|
||||||
|
import approveProcess from "@/views/flowable/task/todo/detail/indexDrawer.vue";
|
||||||
|
|
||||||
const { proxy } = getCurrentInstance();
|
const { proxy } = getCurrentInstance();
|
||||||
|
const { sys_process_category } = proxy.useDict('sys_process_category');
|
||||||
|
|
||||||
|
const userStore = useUserStore()
|
||||||
|
const approveProcessRef = ref("");
|
||||||
// 遮罩层
|
// 遮罩层
|
||||||
const loading = ref(true);
|
const loading = ref(true);
|
||||||
// 选中数组
|
// 选中数组
|
||||||
|
@ -94,13 +141,44 @@ const todoListData = ref([]);
|
||||||
const title = ref("");
|
const title = ref("");
|
||||||
// 是否显示弹出层
|
// 是否显示弹出层
|
||||||
const open = ref(false);
|
const open = ref(false);
|
||||||
|
const daterangeTimes = ref([]);
|
||||||
|
|
||||||
|
const shortcuts = [
|
||||||
|
{
|
||||||
|
text: '最近一周',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 7)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近一个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 30)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
text: '最近三个月',
|
||||||
|
value: () => {
|
||||||
|
const end = new Date()
|
||||||
|
const start = new Date()
|
||||||
|
start.setTime(start.getTime() - 3600 * 1000 * 24 * 90)
|
||||||
|
return [start, end]
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
||||||
const data = reactive({
|
const data = reactive({
|
||||||
// 查询参数
|
// 查询参数
|
||||||
queryParams: {
|
queryParams: {
|
||||||
pageNum: 1,
|
pageNum: 1,
|
||||||
pageSize: 10,
|
pageSize: 10,
|
||||||
name: null,
|
startProName: null,
|
||||||
|
procDefName: null,
|
||||||
category: null
|
category: null
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
@ -110,24 +188,31 @@ const { queryParams } = toRefs(data);
|
||||||
/** 查询流程定义列表 */
|
/** 查询流程定义列表 */
|
||||||
function getList() {
|
function getList() {
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
todoList(queryParams.value).then(response => {
|
myAwaitFlowTaskList(proxy.addDateRange(queryParams.value, daterangeTimes.value)).then(response => {
|
||||||
todoListData.value = response.rows;
|
todoListData.value = response.rows;
|
||||||
total.value = response.total;
|
total.value = response.total;
|
||||||
loading.value = false;
|
loading.value = false;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/** 处理成功 */
|
||||||
|
function handleSuccess(){
|
||||||
|
getList();
|
||||||
|
userStore.getTasks(); // 动态获取用户代办任务
|
||||||
|
}
|
||||||
|
|
||||||
/** 跳转到流程处理页面 */
|
/** 跳转到流程处理页面 */
|
||||||
function handleProcess(row){
|
function handleProcess(row){
|
||||||
router.push({ path: '/flowable/task/todo/detail/index',
|
approveProcessRef.value.show(row);
|
||||||
query: {
|
// router.push({ path: '/flowable/task/todo/detail/index',
|
||||||
procInsId: row.procInsId,
|
// query: {
|
||||||
executionId: row.executionId,
|
// procInsId: row.procInsId,
|
||||||
deployId: row.deployId,
|
// executionId: row.executionId,
|
||||||
taskId: row.taskId,
|
// deployId: row.deployId,
|
||||||
taskName: row.taskName,
|
// taskId: row.taskId,
|
||||||
startUser: row.startUserName + '-' + row.startDeptName,
|
// taskName: row.taskName,
|
||||||
}})
|
// startUser: row.startUserName + '-' + row.startDeptName,
|
||||||
|
// }})
|
||||||
}
|
}
|
||||||
|
|
||||||
/** 搜索按钮操作 */
|
/** 搜索按钮操作 */
|
||||||
|
|
|
@ -206,7 +206,8 @@
|
||||||
</template>
|
</template>
|
||||||
</el-statistic>
|
</el-statistic>
|
||||||
<div class="countdown-footer">
|
<div class="countdown-footer">
|
||||||
<strong style="font-size: 16px; color: #909399">{{form.useTimes?form.useTimes:'-'}}</strong>
|
<strong style="font-size: 16px; color: #909399" v-if="form.useTimes">{{formatDuraTime(form.useTimes)}}</strong>
|
||||||
|
<strong style="font-size: 16px; color: #909399" v-if="!form.useTimes"> - </strong>
|
||||||
</div>
|
</div>
|
||||||
</el-col>
|
</el-col>
|
||||||
<el-col :span="6">
|
<el-col :span="6">
|
||||||
|
@ -409,7 +410,6 @@ function handleDetail(row) {
|
||||||
}
|
}
|
||||||
item.questionOption = JSON.parse(item.questionOption);
|
item.questionOption = JSON.parse(item.questionOption);
|
||||||
});
|
});
|
||||||
console.log("LIST",list);
|
|
||||||
useQuestionList.value = list;
|
useQuestionList.value = list;
|
||||||
form.value = response.data;
|
form.value = response.data;
|
||||||
open.value = true;
|
open.value = true;
|
||||||
|
|
Loading…
Reference in New Issue