完成OA表单转交历史记录

This commit is contained in:
wanggeng 2022-05-10 16:48:02 +08:00
parent cfcf647d47
commit 6a50ad627f
14 changed files with 260 additions and 25 deletions

View File

@ -114,10 +114,12 @@ public class OaFormReportController extends DefaultBaseController {
@ApiImplicitParam(name = "processInstanceId", value = "流程实例ID", paramType = "path"),
@ApiImplicitParam(name = "taskId", value = "当前任务ID", paramType = "path")
})
@PutMapping("update-assignee/task-id/{taskId}")
@PutMapping("update-assignee/process-instance-id/{processInstanceId}/task-id/{taskId}")
@CheckRequestBodyAnnotation
public synchronized SuccessResult updateAssignee(@PathVariable("taskId") String taskId, @RequestBody UpdateTaskAssigneeVO updateTaskAssigneeVO) {
oaFormReportService.updateTaskAssignee(taskId, updateTaskAssigneeVO.getAssignee());
public synchronized SuccessResult updateAssignee(@PathVariable("processInstanceId") String processInstanceId,
@PathVariable("taskId") String taskId,
@RequestBody UpdateTaskAssigneeVO updateTaskAssigneeVO) {
oaFormReportService.updateTaskAssignee(processInstanceId, taskId, updateTaskAssigneeVO);
return new SuccessResult();
}

View File

@ -11,7 +11,8 @@ public enum TaskCommentTypeEnum {
SIGN("sign", "签批"),
JOINTLY_SIGN("jointlySign", "会签"),
GO_BACK("goBack", "回退"),
FORCED_END("forcedEnd", "强制结束");
FORCED_END("forcedEnd", "强制结束"),
TRANSFER("transfer", "转交");
private String value;
private String text;

View File

@ -0,0 +1,76 @@
package ink.wgink.module.activiti.pojo.bos.oa;
import ink.wgink.module.activiti.enums.oa.TaskCommentTypeEnum;
/**
* @ClassName: TaskTransferCommentBO
* @Description: 任务转交批注
* @Author: wanggeng
* @Date: 2022/4/28 22:46
* @Version: 1.0
*/
public class TaskTransferCommentBO {
private TaskCommentTypeEnum type;
private String userId;
private String userName;
private String content;
private String time;
public TaskCommentTypeEnum getType() {
return type;
}
public void setType(TaskCommentTypeEnum type) {
this.type = type;
}
public String getUserId() {
return userId == null ? "" : userId.trim();
}
public void setUserId(String userId) {
this.userId = userId;
}
public String getUserName() {
return userName == null ? "" : userName.trim();
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getContent() {
return content == null ? "" : content.trim();
}
public void setContent(String content) {
this.content = content;
}
public String getTime() {
return time == null ? "" : time.trim();
}
public void setTime(String time) {
this.time = time;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"type\":")
.append(type);
sb.append(",\"userId\":\"")
.append(userId).append('\"');
sb.append(",\"userName\":\"")
.append(userName).append('\"');
sb.append(",\"content\":\"")
.append(content).append('\"');
sb.append(",\"time\":\"")
.append(time).append('\"');
sb.append('}');
return sb.toString();
}
}

View File

@ -32,6 +32,8 @@ public class NodeButtonDTO {
private Integer btnPrint;
@ApiModelProperty(name = "btnCc", value = "抄送")
private Integer btnCc;
@ApiModelProperty(name = "btnTransfer", value = "转交")
private Integer btnTransfer;
public String getNodeButtonId() {
return nodeButtonId == null ? "" : nodeButtonId.trim();
@ -112,4 +114,12 @@ public class NodeButtonDTO {
public void setBtnCc(Integer btnCc) {
this.btnCc = btnCc;
}
public Integer getBtnTransfer() {
return btnTransfer == null ? 0 : btnTransfer;
}
public void setBtnTransfer(Integer btnTransfer) {
this.btnTransfer = btnTransfer;
}
}

View File

@ -1,8 +1,11 @@
package ink.wgink.module.activiti.pojo.dtos.oa;
import ink.wgink.module.activiti.pojo.bos.oa.TaskCommentBO;
import ink.wgink.module.activiti.pojo.bos.oa.TaskTransferCommentBO;
import io.swagger.annotations.ApiModel;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
/**
@ -26,6 +29,7 @@ public class OaProcessLogDTO {
private Map<String, Object> taskVariables;
private Map<String, Object> processVariables;
private TaskCommentBO comment;
private List<TaskTransferCommentBO> transferComments;
public String getTaskId() {
@ -116,6 +120,14 @@ public class OaProcessLogDTO {
this.comment = comment;
}
public List<TaskTransferCommentBO> getTransferComments() {
return transferComments == null ? new ArrayList() : transferComments;
}
public void setTransferComments(List<TaskTransferCommentBO> transferComments) {
this.transferComments = transferComments;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
@ -141,6 +153,8 @@ public class OaProcessLogDTO {
.append(processVariables);
sb.append(",\"comment\":")
.append(comment);
sb.append(",\"transferComments\":")
.append(transferComments);
sb.append('}');
return sb.toString();
}

View File

@ -17,6 +17,9 @@ public class UpdateTaskAssigneeVO {
@ApiModelProperty(name = "assignee", value = "代理人")
@CheckEmptyAnnotation(name = "代理人")
private String assignee;
@ApiModelProperty(name = "reason", value = "原因")
@CheckEmptyAnnotation(name = "原因")
private String reason;
public String getAssignee() {
return assignee == null ? "" : assignee.trim();
@ -26,11 +29,21 @@ public class UpdateTaskAssigneeVO {
this.assignee = assignee;
}
public String getReason() {
return reason == null ? "" : reason.trim();
}
public void setReason(String reason) {
this.reason = reason;
}
@Override
public String toString() {
final StringBuilder sb = new StringBuilder("{");
sb.append("\"assignee\":\"")
.append(assignee).append('\"');
sb.append(",\"reason\":\"")
.append(reason).append('\"');
sb.append('}');
return sb.toString();
}

View File

@ -17,6 +17,7 @@ public class FormButtonVO {
private Integer btnPrint;
private Integer btnCc;
private Integer btnGoBack;
private Integer btnTransfer;
private List<GoBackUserTaskVO> goBackUserTasks;
public Integer getBtnAttachment() {
@ -59,6 +60,14 @@ public class FormButtonVO {
this.btnGoBack = btnGoBack;
}
public Integer getBtnTransfer() {
return btnTransfer == null ? 0 : btnTransfer;
}
public void setBtnTransfer(Integer btnTransfer) {
this.btnTransfer = btnTransfer;
}
public List<GoBackUserTaskVO> getGoBackUserTasks() {
return goBackUserTasks == null ? new ArrayList() : goBackUserTasks;
}

View File

@ -1,5 +1,6 @@
package ink.wgink.module.activiti.service.oa;
import ink.wgink.module.activiti.pojo.vos.oa.UpdateTaskAssigneeVO;
import ink.wgink.pojo.ListPage;
import ink.wgink.pojo.result.SuccessResultList;
@ -133,10 +134,11 @@ public interface IOaFormReportService {
/**
* 更新任务
*
* @param processInstanceId
* @param taskId
* @param assignee
* @param updateTaskAssigneeVO
*/
void updateTaskAssignee(String taskId, String assignee);
void updateTaskAssignee(String processInstanceId, String taskId, UpdateTaskAssigneeVO updateTaskAssigneeVO);
/**
* 表单详情

View File

@ -212,6 +212,7 @@ public class OaFormReportRouteServiceImpl extends DefaultBaseService implements
formButtonVO.setBtnAttachment(nodeButtonDTO.getBtnAttachment());
formButtonVO.setBtnCc(nodeButtonDTO.getBtnCc());
formButtonVO.setBtnPrint(nodeButtonDTO.getBtnPrint());
formButtonVO.setBtnTransfer(nodeButtonDTO.getBtnTransfer());
if (StringUtils.isBlank(currentTaskId)) {
formButtonVO.setBtnGoBack(0);
formButtonVO.setBtnForcedEnd(0);

View File

@ -13,6 +13,7 @@ import ink.wgink.module.activiti.enums.oa.field.FieldEditRecordEnum;
import ink.wgink.module.activiti.pojo.bos.oa.OaFormReportUnWantedValueBO;
import ink.wgink.module.activiti.pojo.bos.oa.TaskCommentBO;
import ink.wgink.module.activiti.pojo.vos.oa.OaFormReportRecordFieldVO;
import ink.wgink.module.activiti.pojo.vos.oa.UpdateTaskAssigneeVO;
import ink.wgink.module.activiti.service.activiti.IActivitiModelService;
import ink.wgink.module.activiti.service.oa.IOaCcService;
import ink.wgink.module.activiti.service.oa.IOaFormReportService;
@ -338,8 +339,20 @@ public class OaFormReportServiceImpl extends DefaultBaseService implements IOaFo
}
@Override
public void updateTaskAssignee(String taskId, String assignee) {
taskService.setAssignee(taskId, assignee);
public void updateTaskAssignee(String processInstanceId, String taskId, UpdateTaskAssigneeVO updateTaskAssigneeVO) {
UserInfoBO currentUser = securityComponent.getCurrentUser();
String userId = currentUser.getUserId();
String userName = currentUser.getUserName();
taskService.setAssignee(taskId, updateTaskAssigneeVO.getAssignee());
TaskCommentBO taskCommentBO = new TaskCommentBO();
taskCommentBO.setUserId(userId);
taskCommentBO.setUserName(userName);
taskCommentBO.setContent(updateTaskAssigneeVO.getReason());
taskCommentBO.setTime(DateUtil.getTime());
taskCommentBO.setType(TaskCommentTypeEnum.TRANSFER);
taskService.addComment(taskId, processInstanceId, TaskCommentTypeEnum.TRANSFER.getValue(), JSONObject.toJSONString(taskCommentBO));
}
/**

View File

@ -6,7 +6,9 @@ import ink.wgink.interfaces.department.IDepartmentBaseService;
import ink.wgink.interfaces.department.IDepartmentUserBaseService;
import ink.wgink.interfaces.user.IUserBaseService;
import ink.wgink.module.activiti.enums.oa.ProcessTaskStatusEnum;
import ink.wgink.module.activiti.enums.oa.TaskCommentTypeEnum;
import ink.wgink.module.activiti.pojo.bos.oa.TaskCommentBO;
import ink.wgink.module.activiti.pojo.bos.oa.TaskTransferCommentBO;
import ink.wgink.module.activiti.pojo.dtos.oa.OaHistoryTaskDTO;
import ink.wgink.module.activiti.pojo.dtos.oa.OaProcdefDTO;
import ink.wgink.module.activiti.pojo.dtos.oa.OaProcessLogDTO;
@ -242,12 +244,8 @@ public class OaServiceImpl extends DefaultBaseService implements IOaService {
oaProcessLogDTO.setEndTime(DateUtil.getDateTime(historicTaskInstance.getEndTime()));
oaProcessLogDTO.setUsedTime(DateUtil.getUsedTime(historicTaskInstance.getDurationInMillis()));
for (Comment comment : processInstanceComments) {
if (StringUtils.equals(comment.getTaskId(), historicTaskInstance.getId())) {
oaProcessLogDTO.setComment(JSONObject.parseObject(comment.getFullMessage(), TaskCommentBO.class));
break;
}
}
setTaskTransferComment(processInstanceComments, historicTaskInstance.getId(), oaProcessLogDTO);
setTaskComment(processInstanceComments, historicTaskInstance.getId(), oaProcessLogDTO);
oaProcessLogDTOs.add(oaProcessLogDTO);
});
// 待办
@ -264,6 +262,9 @@ public class OaServiceImpl extends DefaultBaseService implements IOaService {
oaProcessLogDTO.setUserIds(userIdString);
oaProcessLogDTO.setUserNames(userIdString);
oaProcessLogDTO.setStartTime(DateUtil.getDateTime(task.getCreateTime()));
setTaskTransferComment(processInstanceComments, task.getId(), oaProcessLogDTO);
setTaskComment(processInstanceComments, task.getId(), oaProcessLogDTO);
oaProcessLogDTOs.add(oaProcessLogDTO);
});
// 查询用户
@ -278,6 +279,44 @@ public class OaServiceImpl extends DefaultBaseService implements IOaService {
return oaProcessLogDTOs;
}
/**
* 转交批注单独处理
*
* @param processInstanceComments
* @param taskId
* @param oaProcessLogDTO
*/
private void setTaskTransferComment(List<Comment> processInstanceComments, String taskId, OaProcessLogDTO oaProcessLogDTO) {
for (Comment comment : processInstanceComments) {
if (!StringUtils.equals(comment.getTaskId(), taskId)) {
continue;
}
if (!StringUtils.equals(TaskCommentTypeEnum.TRANSFER.getValue(), comment.getType())) {
continue;
}
List<TaskTransferCommentBO> transferComments = oaProcessLogDTO.getTransferComments();
transferComments.add(JSONObject.parseObject(comment.getFullMessage(), TaskTransferCommentBO.class));
oaProcessLogDTO.setTransferComments(transferComments);
}
}
/**
* 非转交批注因不存在持续添加取当前即可
*
* @param processInstanceComments
* @param taskId
* @param oaProcessLogDTO
*/
private void setTaskComment(List<Comment> processInstanceComments, String taskId, OaProcessLogDTO oaProcessLogDTO) {
for (Comment comment : processInstanceComments) {
if (!StringUtils.equals(comment.getTaskId(), taskId)) {
continue;
}
oaProcessLogDTO.setComment(JSONObject.parseObject(comment.getFullMessage(), TaskCommentBO.class));
break;
}
}
/**
* 用户列表
*

View File

@ -13,6 +13,7 @@
<result column="btn_forced_end" property="btnForcedEnd"/>
<result column="btn_print" property="btnPrint"/>
<result column="btn_cc" property="btnCc"/>
<result column="btn_transfer" property="btnTransfer"/>
</resultMap>
<!-- 建表 -->

View File

@ -113,6 +113,15 @@ function OaFormUtil(layui) {
commentText = '动作:强制结束。批注:' + comment.content + '。时间:' + comment.time;
}
}
// 转交记录
var transferCommentText = '';
var transferComments = item.transferComments;
for(var j = transferComments.length, transferComment; transferComment = transferComments[--j];) {
if(transferCommentText) {
transferCommentText += '\n'
}
transferCommentText += (transferComments.length - j) +'. 转交人:'+ transferComment.userName +'。原因:'+ transferComment.content +'。时间:'+ transferComment.time;
}
var li = [
'<li class="layui-timeline-item">',
' <i class="layui-icon layui-timeline-axis">&#xe63f;</i>',
@ -134,19 +143,23 @@ function OaFormUtil(layui) {
' </tr>',
' <tr>',
' <td class="row-title">结束时间</td>',
' <td>' + item.endTime + '</td>',
' <td>' + (item.endTime ? item.endTime : '-') + '</td>',
' </tr>',
' <tr>',
' <td class="row-title">耗时</td>',
' <td>' + item.usedTime + '</td>',
' <td>' + (item.usedTime ? item.usedTime : '0秒') + '</td>',
' </tr>',
' <tr>',
' <td class="row-title">处理人</td>',
' <td>' + item.userNames + '</td>',
' <td>' + (item.userNames == '1' ? '管理员' : item.userNames) + '</td>',
' </tr>',
' <tr>',
' <td class="row-title">备注</td>',
' <td>' + commentText + '</td>',
' <td>' + (commentText ? commentText : '无') + '</td>',
' </tr>',
' <tr>',
' <td class="row-title">转交记录</td>',
' <td>' + (transferCommentText ? '<pre>'+ transferCommentText +'</pre>' : '无') + '</td>',
' </tr>',
' </tbody>',
' </table>',
@ -331,7 +344,7 @@ function OaFormUtil(layui) {
buttons += '<button id="ccBtn" type="button" class="layui-btn layui-btn-xs layui-btn-normal confirm-btn">抄送</button>';
}
if(formButton.btnTransfer) {
buttons += '<button id="transferBtn" type="button" class="layui-btn layui-btn-xs layui-btn-normal confirm-btn">转交</button>';
buttons += '<button id="transferBtn" type="button" class="layui-btn layui-btn-xs layui-btn-primary confirm-btn">转交</button>';
}
if (formButton.btnAttachment) {
buttons += '<button id="attachmentBtn" type="button" class="layui-btn layui-btn-xs layui-btn-default confirm-btn">上传附件</button>';
@ -556,11 +569,12 @@ function OaFormUtil(layui) {
reason: reason
}, null, function (code, data) {
layer.msg('回退成功');
formButton.btnAttachment = 0;
}, function (code, data) {
$('.confirm-btn, .go-back-btn').show();
$('.confirm-btn, .go-back-btn, .delete-btn').show();
layer.msg(data.msg);
}, function () {
$('.confirm-btn, .go-back-btn').hide();
$('.confirm-btn, .go-back-btn, .delete-btn').hide();
loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
layer.close(loadLayerIndex);
@ -582,11 +596,12 @@ function OaFormUtil(layui) {
reason: reason
}, null, function (code, data) {
layer.msg('结束成功');
formButton.btnAttachment = 0;
}, function (code, data) {
$('.confirm-btn').show();
$('.confirm-btn, .go-back-btn').show();
layer.msg(data.msg);
}, function () {
$('.confirm-btn').hide();
$('.confirm-btn, .go-back-btn').hide();
loadLayerIndex = layer.msg('提交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
layer.close(loadLayerIndex);
@ -632,6 +647,45 @@ function OaFormUtil(layui) {
});
osUserSelect.open();
})
// 转交
$(document.body).on('click', '#transferBtn', function() {
var osUserSelect = new OaUserSelect(layui, {
isApp: isApp,
headers: headers,
departmentRootId: 0,
selectType: 'radio',
onConfirm: function(selectedUserArray) {
if(selectedUserArray.length == 0) {
return;
}
layer.confirm('确定转交吗?', function (confirmLayerIndex) {
layer.close(confirmLayerIndex);
layer.prompt({title: '请输入转交原因', formType: 2}, function (reason, promptIndex) {
layer.close(promptIndex);
var loadLayerIndex;
restAjax.put(restAjax.path('api/oa-form-report/update-assignee/process-instance-id/{processInstanceId}/task-id/{taskId}', [processInstanceId, taskId]), {
assignee: selectedUserArray[0].userId,
reason: reason
}, null, function (code, data) {
layer.msg('转交成功');
formButton.btnAttachment = 0;
}, function (code, data) {
$('.confirm-btn, .go-back-btn, .delete-btn').show();
layer.msg(data.msg);
}, function () {
$('.confirm-btn, .go-back-btn, .delete-btn').hide();
loadLayerIndex = layer.msg('转交中...', {icon: 16, time: 0, shade: 0.3});
}, function () {
layer.close(loadLayerIndex);
});
});
});
}
});
osUserSelect.open();
})
}
initButton();

View File

@ -332,10 +332,10 @@ function OaUserSelect(layui, opt) {
var layerHeight;
if(isApp) {
layerWidth = winWidth;
layerHeight = winHeight * 0.8;
layerHeight = winHeight * 0.6;
} else {
layerWidth = winWidth > 400 ? 400 : winWidth;
layerHeight = winHeight > 500 ? 500 : winHeight * 0.8
layerHeight = winHeight > 400 ? 400 : winHeight * 0.8
}
Properties.containerWidth = layerWidth +'px';