调整代码结构,增加我的发起流程列表

This commit is contained in:
wanggeng 2022-07-18 17:25:00 +08:00
parent 588696174b
commit 057d717432
18 changed files with 414 additions and 11 deletions

View File

@ -146,4 +146,17 @@ public class OaController extends DefaultBaseController {
return new SuccessResultData<>(count);
}
@ApiOperation(value = "我的发起分页列表", notes = "我的发起分页列表接口")
@ApiImplicitParams({
@ApiImplicitParam(name = "page", value = "当前页码", paramType = "query", dataType = "int", defaultValue = "1"),
@ApiImplicitParam(name = "rows", value = "显示数量", paramType = "query", dataType = "int", defaultValue = "20"),
})
@GetMapping("listpage-start-of-mine")
public SuccessResultList<List<OaStartedInstanceDTO>> listPageStartOfMine(ListPage page) {
Map<String, Object> requestParams = requestParams();
page.setParams(requestParams);
return oaCcService.listPageStartOfMine(page);
}
}

View File

@ -76,4 +76,11 @@ public class OaRouteController extends DefaultBaseController {
oaFormReportRouteService.updateRead(formCode, formVersion, ccId, httpSession, httpServletRequest, httpServletResponse);
}
@GetMapping("list-start-of-mine")
public ModelAndView listStartOfMine() {
ModelAndView mv = new ModelAndView("oa/list-start-of-mine");
return mv;
}
}

View File

@ -9,7 +9,8 @@ package ink.wgink.module.activiti.enums.oa.assignee;
*/
public enum AssigneeTypeEnum {
APPOINT("appoint", "手动指定"),
AUTO("auto", "自动获取");
AUTO("auto", "自动获取"),
FORM("form", "表单");
private String value;
private String text;

View File

@ -1,4 +1,4 @@
package ink.wgink.module.activiti.handler;
package ink.wgink.module.activiti.handler.task;
import org.activiti.engine.delegate.DelegateTask;

View File

@ -1,4 +1,4 @@
package ink.wgink.module.activiti.handler;
package ink.wgink.module.activiti.handler.task;
import org.activiti.engine.delegate.DelegateTask;

View File

@ -1,4 +1,4 @@
package ink.wgink.module.activiti.handler;
package ink.wgink.module.activiti.handler.task;
import org.activiti.engine.delegate.DelegateTask;

View File

@ -1,4 +1,4 @@
package ink.wgink.module.activiti.handler;
package ink.wgink.module.activiti.handler.task;
import org.activiti.engine.delegate.DelegateTask;

View File

@ -1,6 +1,6 @@
package ink.wgink.module.activiti.listener.task;
import ink.wgink.module.activiti.handler.IOaUserTaskAssignmentHandler;
import ink.wgink.module.activiti.handler.task.IOaUserTaskAssignmentHandler;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate;

View File

@ -1,6 +1,6 @@
package ink.wgink.module.activiti.listener.task;
import ink.wgink.module.activiti.handler.IOaUserTaskCompleteHandler;
import ink.wgink.module.activiti.handler.task.IOaUserTaskCompleteHandler;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate;

View File

@ -1,6 +1,6 @@
package ink.wgink.module.activiti.listener.task;
import ink.wgink.module.activiti.handler.IOaUserTaskCreateHandler;
import ink.wgink.module.activiti.handler.task.IOaUserTaskCreateHandler;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate;

View File

@ -1,6 +1,6 @@
package ink.wgink.module.activiti.listener.task;
import ink.wgink.module.activiti.handler.IOaUserTaskDeleteHandler;
import ink.wgink.module.activiti.handler.task.IOaUserTaskDeleteHandler;
import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import org.activiti.engine.delegate.JavaDelegate;

View File

@ -0,0 +1,129 @@
package ink.wgink.module.activiti.pojo.dtos.oa;
/**
* @ClassName: OaStartedInstanceDTO
* @Description: OA已经启动实例
* @Author: wanggeng
* @Date: 2022/7/18 16:25
* @Version: 1.0
*/
public class OaStartedInstanceDTO {
private String deploymentId;
private String processDefinitionId;
private String processDefinitionKey;
private String processDefinitionName;
private Integer processDefinitionVersion;
private String processInstanceId;
private String startActivityId;
private String startTime;
private String endTime;
private String startUserId;
private String formCode;
private Integer formVersion;
private String reportUid;
public String getDeploymentId() {
return deploymentId == null ? "" : deploymentId.trim();
}
public void setDeploymentId(String deploymentId) {
this.deploymentId = deploymentId;
}
public String getProcessDefinitionId() {
return processDefinitionId == null ? "" : processDefinitionId.trim();
}
public void setProcessDefinitionId(String processDefinitionId) {
this.processDefinitionId = processDefinitionId;
}
public String getProcessDefinitionKey() {
return processDefinitionKey == null ? "" : processDefinitionKey.trim();
}
public void setProcessDefinitionKey(String processDefinitionKey) {
this.processDefinitionKey = processDefinitionKey;
}
public String getProcessDefinitionName() {
return processDefinitionName == null ? "" : processDefinitionName.trim();
}
public void setProcessDefinitionName(String processDefinitionName) {
this.processDefinitionName = processDefinitionName;
}
public Integer getProcessDefinitionVersion() {
return processDefinitionVersion == null ? 0 : processDefinitionVersion;
}
public void setProcessDefinitionVersion(Integer processDefinitionVersion) {
this.processDefinitionVersion = processDefinitionVersion;
}
public String getProcessInstanceId() {
return processInstanceId == null ? "" : processInstanceId.trim();
}
public void setProcessInstanceId(String processInstanceId) {
this.processInstanceId = processInstanceId;
}
public String getStartActivityId() {
return startActivityId == null ? "" : startActivityId.trim();
}
public void setStartActivityId(String startActivityId) {
this.startActivityId = startActivityId;
}
public String getStartTime() {
return startTime == null ? "" : startTime.trim();
}
public void setStartTime(String startTime) {
this.startTime = startTime;
}
public String getEndTime() {
return endTime == null ? "" : endTime.trim();
}
public void setEndTime(String endTime) {
this.endTime = endTime;
}
public String getStartUserId() {
return startUserId == null ? "" : startUserId.trim();
}
public void setStartUserId(String startUserId) {
this.startUserId = startUserId;
}
public String getFormCode() {
return formCode == null ? "" : formCode.trim();
}
public void setFormCode(String formCode) {
this.formCode = formCode;
}
public Integer getFormVersion() {
return formVersion == null ? 0 : formVersion;
}
public void setFormVersion(Integer formVersion) {
this.formVersion = formVersion;
}
public String getReportUid() {
return reportUid == null ? "" : reportUid.trim();
}
public void setReportUid(String reportUid) {
this.reportUid = reportUid;
}
}

View File

@ -1,6 +1,7 @@
package ink.wgink.module.activiti.service.oa;
import ink.wgink.module.activiti.pojo.dtos.oa.OaCcDTO;
import ink.wgink.module.activiti.pojo.dtos.oa.OaStartedInstanceDTO;
import ink.wgink.module.activiti.pojo.pos.oa.OaCcPO;
import ink.wgink.module.activiti.pojo.vos.oa.OaCcVO;
import ink.wgink.pojo.ListPage;
@ -174,5 +175,28 @@ public interface IOaCcService {
*/
Integer countReadByUserId(String userId, int isRead);
/**
* 用户的发起列表
*
* @return
*/
List<OaStartedInstanceDTO> listStartByUserId(String userId);
/**
* 用户的发起分页列表
*
* @param userId\
* @param page
* @return
*/
SuccessResultList<List<OaStartedInstanceDTO>> listPageStartByUserId(String userId, ListPage page);
/**
* 我的发起分页列表
*
* @param page
* @return
*/
SuccessResultList<List<OaStartedInstanceDTO>> listPageStartOfMine(ListPage page);
}

View File

@ -26,6 +26,7 @@ import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -211,6 +212,11 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode
LOG.debug("assigneeType -> auto");
return auto(processInstanceId, currentAssignee, oaNodeAssigneePO);
}
// 代理人来源于表单直接返回空
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.FORM.getValue())) {
LOG.debug("assigneeType -> form");
return new ArrayList<>();
}
throw new OaNodeException("节点 assigneeType 配置错误");
}
@ -238,6 +244,11 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode
LOG.debug("assigneeType -> auto");
return auto(processInstanceId, currentAssignee, oaNodeAssigneePO);
}
// 代理人来源于表单直接返回空
if (StringUtils.equals(oaNodeAssigneePO.getAssigneeType(), AssigneeTypeEnum.FORM.getValue())) {
LOG.debug("assigneeType -> form");
return new ArrayList<>();
}
throw new OaNodeException("节点 assigneeType 配置错误");
}
@ -352,7 +363,7 @@ public class NodeAssigneeServiceImpl extends DefaultBaseService implements INode
List<String> roleUserIds = roleUserBaseService.listUserIdByRoleIdsAndUserIds(Arrays.asList(roleIds.split(",")), departmentUserIds);
return listRoleCandidateUser(roleUserIds, positionIds);
}
if(!StringUtils.isBlank(positionIds)) {
if (!StringUtils.isBlank(positionIds)) {
LOG.debug("查询职位用户");
List<String> positionUserIds = positionUserBaseService.listUserIdByPositionIdsAndUserIds(Arrays.asList(positionIds.split(",")), departmentUserIds);
return listPositionCandidateUser(positionUserIds);

View File

@ -3,12 +3,15 @@ package ink.wgink.module.activiti.service.oa.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import ink.wgink.common.base.DefaultBaseService;
import ink.wgink.interfaces.consts.ISystemConstant;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.module.activiti.dao.oa.IOaCcDao;
import ink.wgink.module.activiti.pojo.dtos.oa.OaCcDTO;
import ink.wgink.module.activiti.pojo.dtos.oa.OaStartedInstanceDTO;
import ink.wgink.module.activiti.pojo.pos.oa.OaCcPO;
import ink.wgink.module.activiti.pojo.vos.oa.OaCcVO;
import ink.wgink.module.activiti.service.oa.IOaCcService;
import ink.wgink.module.activiti.service.oa.IOaFormReportService;
import ink.wgink.module.form.service.design.IFormDesignService;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.dtos.user.UserDTO;
@ -18,11 +21,16 @@ import ink.wgink.util.UUIDUtil;
import ink.wgink.util.map.HashMapUtil;
import org.activiti.engine.HistoryService;
import org.activiti.engine.history.HistoricProcessInstance;
import org.activiti.engine.history.HistoricProcessInstanceQuery;
import org.apache.commons.lang3.StringUtils;
import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
* @ClassName: FormCcServiceImpl
@ -204,6 +212,64 @@ public class OaCcServiceImpl extends DefaultBaseService implements IOaCcService
return oaCcDao.count(params);
}
@Override
public List<OaStartedInstanceDTO> listStartByUserId(String userId) {
return listOaStartedInstance(historyService.createHistoricProcessInstanceQuery()
.includeProcessVariables()
.startedBy(userId)
.orderByProcessInstanceStartTime()
.desc()
.list());
}
@Override
public SuccessResultList<List<OaStartedInstanceDTO>> listPageStartByUserId(String userId, ListPage page) {
HistoricProcessInstanceQuery historicProcessInstanceQuery = historyService.createHistoricProcessInstanceQuery()
.startedBy(userId);
long count = historicProcessInstanceQuery.count();
List<HistoricProcessInstance> historicProcessInstances = historicProcessInstanceQuery
.includeProcessVariables()
.orderByProcessInstanceStartTime()
.desc()
.listPage((page.getPage() - 1) * page.getRows(), page.getRows());
return new SuccessResultList<>(listOaStartedInstance(historicProcessInstances), page.getPage(), count);
}
@Override
public SuccessResultList<List<OaStartedInstanceDTO>> listPageStartOfMine(ListPage page) {
return listPageStartByUserId(securityComponent.getCurrentUser().getUserId(), page);
}
private List<OaStartedInstanceDTO> listOaStartedInstance(List<HistoricProcessInstance> historicProcessInstances) {
SimpleDateFormat sdfTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sdfTime.setTimeZone(TimeZone.getTimeZone("Asia/Shanghai"));
return historicProcessInstances.stream().map(historicProcessInstance -> {
OaStartedInstanceDTO oaStartedInstanceDTO = new OaStartedInstanceDTO();
oaStartedInstanceDTO.setDeploymentId(historicProcessInstance.getDeploymentId());
oaStartedInstanceDTO.setProcessDefinitionId(historicProcessInstance.getProcessDefinitionId());
oaStartedInstanceDTO.setProcessDefinitionKey(historicProcessInstance.getProcessDefinitionKey());
oaStartedInstanceDTO.setProcessDefinitionName(historicProcessInstance.getProcessDefinitionName());
oaStartedInstanceDTO.setProcessDefinitionVersion(historicProcessInstance.getProcessDefinitionVersion());
oaStartedInstanceDTO.setProcessInstanceId(historicProcessInstance.getId());
oaStartedInstanceDTO.setStartActivityId(historicProcessInstance.getStartActivityId());
DateTime startDateTime = new DateTime(historicProcessInstance.getStartTime().getTime());
startDateTime = startDateTime.minusHours(8);
DateTime endDateTime = null;
if (historicProcessInstance.getEndTime() != null) {
endDateTime = new DateTime(historicProcessInstance.getEndTime().getTime());
endDateTime = endDateTime.minusHours(8);
}
oaStartedInstanceDTO.setStartTime(startDateTime.toString(DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)));
oaStartedInstanceDTO.setEndTime(endDateTime == null ? null : endDateTime.toString(DateTimeFormat.forPattern(ISystemConstant.DATE_FORMATTER_YYYY_MM_DD_HH_MM_SS)));
oaStartedInstanceDTO.setStartUserId(historicProcessInstance.getStartUserId());
Map<String, Object> processVariables = historicProcessInstance.getProcessVariables();
oaStartedInstanceDTO.setFormCode((String) processVariables.get(IOaFormReportService.KEY_FORM_CODE));
oaStartedInstanceDTO.setFormVersion((Integer) processVariables.get(IOaFormReportService.KEY_FORM_VERSION));
oaStartedInstanceDTO.setReportUid((String) processVariables.get(IOaFormReportService.KEY_REPORT_UID));
return oaStartedInstanceDTO;
}).collect(Collectors.toList());
}
/**
* 设置主标题
*

View File

@ -524,6 +524,9 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
updateAssignee();
return;
}
if (assignee.assigneeType === 'form') {
updateAssignee()
}
return;
}
@ -614,7 +617,6 @@ var OaNodeManagePopupCtrl = ['$scope', '$timeout', '$http', function ($scope, $t
}
}
$scope.property.value = {};
$scope.property.value = $scope.oaNodeManage;
$scope.updatePropertyInModel($scope.property);

View File

@ -113,6 +113,9 @@
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeType" type="radio" name="assigneeType" value="auto"> 自动获取
</label>
<label class="radio-inline">
<input ng-model="oaNodeManage.assignee.assigneeType" type="radio" name="assigneeType" value="form"> 表单
</label>
</div>
</td>
</tr>

View File

@ -0,0 +1,147 @@
<!doctype html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<base th:href="${#request.getContextPath() + '/'} ">
<meta charset="utf-8">
<meta name="renderer" content="webkit">
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
<link rel="stylesheet" href="assets/fonts/font-awesome/css/font-awesome.css"/>
<link rel="stylesheet" href="assets/layuiadmin/layui/css/layui.css" media="all">
<link rel="stylesheet" href="assets/layuiadmin/style/admin.css" media="all">
<link rel="stylesheet" type="text/css" href="assets/js/vendor/viewer/viewer.min.css">
</head>
<body>
<div class="layui-fluid layui-anim layui-anim-fadein">
<div class="layui-row">
<div class="layui-col-md12">
<div class="layui-card">
<div class="layui-card-body">
<table class="layui-hide" id="dataTable" lay-filter="dataTable"></table>
</div>
</div>
</div>
</div>
</div>
<script src="assets/layuiadmin/layui/layui.js"></script>
<script src="assets/js/vendor/viewer/viewer.min.js"></script>
<script>
layui.config({
base: 'assets/layuiadmin/'
}).extend({
index: 'lib/index'
}).use(['index', 'table', 'laydate', 'common'], function() {
var $ = layui.$;
var $win = $(window);
var table = layui.table;
var admin = layui.admin;
var laydate = layui.laydate;
var common = layui.common;
var resizeTimeout = null;
var tableUrl = 'api/oa/listpage-start-of-mine';
// 初始化表格
function initTable() {
table.render({
elem: '#dataTable',
id: 'dataTable',
url: top.restAjax.path(tableUrl, []),
width: admin.screen() > 1 ? '100%' : '',
height: $win.height() - 50,
limit: 20,
limits: [20, 40, 60, 80, 100, 200],
request: {
pageName: 'page',
limitName: 'rows'
},
cols: [
[
{field:'rowNum', width:80, title: '序号', fixed: 'left', align:'center', templet: '<span>{{d.LAY_INDEX}}</span>'},
{field:'processDefinitionName', width:200, title: '流程名称', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field:'startTime', width:200, title: '发起时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field:'endTime', width:180, title: '结束时间', align:'center',
templet: function(row) {
var rowData = row[this.field];
if(typeof(rowData) === 'undefined' || rowData == null || rowData == '') {
return '-';
}
return rowData;
}
},
{field: 'form', width: 100, title: '操作', align:'center', fixed: 'right',
templet: function(row) {
return '<div class="layui-btn-group">' +
'<button class="layui-btn layui-btn-xs layui-btn-primary" lay-event="logEvent">流转日志</button>'+
'</div>';
}
}
]
],
page: true,
parseData: function(data) {
return {
'code': 0,
'msg': '',
'count': data.total,
'data': data.rows
};
}
});
}
// 重载表格
function reloadTable(currentPage) {
table.reload('dataTable', {
url: top.restAjax.path(tableUrl, []),
where: {},
page: {
curr: currentPage
},
height: $win.height() - 50,
});
}
initTable();
// 事件 - 页面变化
$win.on('resize', function() {
clearTimeout(resizeTimeout);
resizeTimeout = setTimeout(function() {
reloadTable();
}, 500);
});
// 事件 - 搜索
$(document).on('click', '#search', function() {
reloadTable(1);
});
table.on('tool(dataTable)', function(obj) {
var data = obj.data;
var layEvent = obj.event;
if(layEvent === 'logEvent') {
top.dialog.open({
url: top.restAjax.path('route/oa-form-report/show/code/{formCode}/version/{formVersion}?uid={reportUid}&processInstanceId={processInstanceId}', [data.formCode, data.formVersion, data.reportUid, data.processInstanceId]),
title: '详情',
width: '800px',
height: '80%',
onClose: function() {}
});
}
});
});
</script>
</body>
</html>