Commit b5c8c19d by xieshaohua

工单修改

parent 91fdf5aa
package com.keymobile.governworkorder;
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
\ No newline at end of file
......@@ -14,49 +14,66 @@ import lombok.Data;
public class WorkOrderDataVO {
/**
* 资产id
* id
*/
@Schema(description = "id")
private String id;
/**
* 工单id
*/
@Schema(description = "工单id")
private String workOrderId;
@Schema(description = "关联资产id")
private String dataId;
/**
* 资产名称
*/
@Schema(description = "资产名称")
private String name;
/**
* 资产编号
*/
@Schema(description = "资产编号")
private String code;
/**
* 资产描述
*/
@Schema(description = "资产描述")
private String desc;
/**
* 处理意见
*/
@Schema(description = "处理意见")
private String opinion;
/**
* 工单类型 资产属性变更、资产下架、资产新增等 待讨论 资产转移
*/
@Schema(description = "工单类型 资产属性变更、资产下架、资产新增等 待讨论 资产转移")
private String type;
/**
* 资产类型 数据指标、数据资产
* 资产类型 数据指标、数据资产、元数据、标准
*/
@Schema(description = "资产类型 数据指标、数据资产、元数据、标准")
private String dataType;
/**
* 处理状态 是、否
*/
@Schema(description = "处理状态 是、否")
private String handleStatus;
/**
* 确认状态 是、否
*/
@Schema(description = "确认状态 是、否")
private String confirmStatus;
@Schema(description = "创建时间")
private String createTime;
@Schema(description = "更新时间")
private String updateTime;
}
package com.keymobile.governworkorder.common.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
......@@ -12,80 +13,120 @@ import java.util.List;
*/
@Data
@Schema(description = "工单信息")
public class WorkOrderInfoVO {
/**
* id
*/
@Schema(description = "id")
private String id;
private String name;
/**
* 工单标题
*/
@Schema(description = "工单标题")
private String title;
/**
* 工单描述
*/
@Schema(description = "工单描述")
private String desc;
/**
* 工单级别
*/
@Schema(description = "工单级别")
private String level;
/**
* 工单状态 待处理、处理中
*/
@Schema(description = "工单状态 待处理、处理中")
private String status;
/**
* 流程环节 发起人、处理人、审批人
*/
@Schema(description = "流程环节 发起人、处理人、审批人")
private String stage;
/**
* 工单创建时间
*/
@Schema(description = "工单创建时间")
private String createTime;
/**
* 创建毫秒
*/
@Schema(description = "创建毫秒")
private long createTimeMill;
/**
* 工单类型 资产变更、资产下架、资产新增等 待讨论 资产转移
*/
@Schema(description = "工单类型 资产变更、资产下架、资产新增等 待讨论 资产转移")
private String type;
/**
* 资产类型 数据指标、数据资产
* 资产类型 数据指标、数据资产、元数据、数据标准
*/
@Schema(description = "资产类型 数据指标、数据资产、元数据、数据标准")
private String dataType;
/**
* 处理人
*/
@Schema(description = "处理人")
private String handleUserName;
/**
* 处理人展示名
*/
private String handleUserDName;
@Schema(description = "处理人展示名")
private String handleUserDname;
/**
* 下一步操作人展示名
*/
private String nextUserDName;
@Schema(description = "下一步操作人展示名")
private String nextUserDname;
/**
* 下一步操作人账号
*/
@Schema(description = "下一步操作人账号")
private String nextUserName;
/**
* 创建人展示名
*/
private String createUserDName;
@Schema(description = "创建人展示名")
private String createUserDname;
/**
* 创建人账号
*/
@Schema(description = "创建人账号")
private String createUserName;
/**
* 文件id
*/
@Schema(description = "文件id")
private String fileId;
/**
* 结束时间
*/
@Schema(description = "结束时间")
private String endTime;
/**
* 结束时间毫秒
*/
@Schema(description = "结束时间毫秒")
private String endTimeMill;
/**
* 期望结束时间
*/
@Schema(description = "结束时间")
private String expectedEndTime;
/**
* 更新时间
*/
@Schema(description = "更新时间")
private String updateTime;
@Schema(description = "关联资产数据")
private List<WorkOrderDataVO> data;
@Schema(description = "关联审批数据")
private List<WorkOrderProcessVO> process;
}
package com.keymobile.governworkorder.common.bo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/14
* @desc
* @desc 流程审批信息
*/
@Data
@Schema(description = "工单信息")
public class WorkOrderProcessVO {
@Schema(description = "id")
private String id;
/**
* 工单id
*/
@Schema(description = "工单id")
private String workOrderId;
/**
* 流程环节 发起人、处理人、审批人
*/
@Schema(description = "流程环节 发起人、处理人、审批人")
private String stage;
/**
* 类型 通过、驳回
*/
@Schema(description = "类型 通过、驳回")
private String type;
/**
* 处理意见
*/
@Schema(description = "处理意见")
private String content;
/**
* 处理人账号
*/
@Schema(description = "处理人账号")
private String userName;
/**
* 处理人展示名
*/
private String userDName;
@Schema(description = "处理人展示名")
private String userDname;
/**
* 下一步处理人
*/
@Schema(description = "下一步处理人")
private String nextUserName;
/**
* 下一步处理人展示名
*/
private String nextUserDName;
@Schema(description = "下一步处理人展示名")
private String nextUserDname;
/**
* 创建时间
*/
@Schema(description = "createTime")
private String createTime;
......
......@@ -3,10 +3,6 @@ package com.keymobile.governworkorder.common.type;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Arrays;
import java.util.Map;
import java.util.stream.Collectors;
@JsonFormat(shape = JsonFormat.Shape.OBJECT)
public enum OrderDataTypeEnum {
......
......@@ -13,7 +13,8 @@ public enum OrderMessageTypeEnum {
MSG_CREATE("create", "工单创建"),
MSG_UPDATE("update", "工单更新"),
MSG_DELETE("delete", "工单删除"),
MSG_FINISH("finish", "工单完成");
MSG_FINISH("finish", "工单完成"),
MSG_INVALIDATE("invalidate", "工单失效");
public static final String[] ARRAYS = Arrays.stream(values()).map(OrderMessageTypeEnum::getType).toArray(String[]::new);
......
package com.keymobile.governworkorder.common.type;
/**
* @author xiesh
* @version 1.0.0
* @date 2025/8/15
* @desc
*/
public enum OrderProcessStageTypeEnum {
PROCESS_CREATE("发起人"),
PROCESS_HANDLER("处理人"),
PROCESS_APPROVER("审批人");
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
private String name;
OrderProcessStageTypeEnum() {
}
OrderProcessStageTypeEnum(String name) {
this.name = name;
}
}
......@@ -4,7 +4,8 @@ public enum OrderStatusTypeEnum {
STATUS_TO_BE_START("待发起"),
STATUS_PROCESSING("处理中"),
STATUS_DONE("工单关闭");
STATUS_DONE("工单关闭"),
STATUS_INVALIDATE("工单失效");
public String getName() {
return name;
......
......@@ -97,7 +97,10 @@ public class WorkOrderApi {
}
@RequestMapping(value = "/checkCreate", method = {RequestMethod.GET})
@Operation(summary = "校验是否具有创建工单的权限", description = "")
public boolean checkCreatePermission(@RequestParam(required = false) String userName) {
return workOrderService.checkCreatePermission(userName);
}
}
package com.keymobile.governworkorder.core.dto;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import org.springframework.data.domain.Sort;
......@@ -10,20 +11,32 @@ import org.springframework.data.domain.Sort;
* @desc
*/
@Data
@Schema(description = "工单查询条件")
public class WorkOrdeQueryDto {
@Schema(description = "分页页数")
private int page = 1;
@Schema(description = "分页大小")
private int size = 10;
@Schema(description = "排序字段")
private String sort = "createTime";
@Schema(description = "排序 DESC 降序、ASC 升序")
private Sort.Direction direction = Sort.Direction.DESC;
@Schema(description = "工单级别")
private String level;
@Schema(description = "工单状态")
private String status;
@Schema(description = "工单类型")
private String type;
@Schema(description = "关键字")
private String keyword;
@Schema(description = "创建开始时间")
private String startTime;
@Schema(description = "创建结束时间")
private String endTime;
/**
* 待办已办类型: 1待办、2待办
* 待办已办类型: 1待办、2待办
*/
@Schema(description = "待办已办类型: 1待办、2待办")
private String doType;
}
......@@ -28,25 +28,12 @@ public class WorkOrderMessageService {
@Autowired
private FanoutExchange exchange;
public void create(WorkOrderInfoVO vo) {
public void sendMsg(String type, WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_CREATE.getType(), vo);
String content = toMessage(type, vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
public void delete(WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_DELETE.getType(), vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
public void finsh(WorkOrderInfoVO vo) {
CorrelationData correlationId = new CorrelationData(UUID.randomUUID().toString());
String content = toMessage(OrderMessageTypeEnum.MSG_FINISH.getType(), vo);
log.info("sendMessage.exchange:{},content:{}", exchange.getName(), content);
this.rabbitTemplate.convertAndSend(exchange.getName(), null, content, correlationId);
}
private String toMessage(String type, WorkOrderInfoVO vo) {
......
......@@ -23,6 +23,11 @@ public class WorkOrderData {
private String workOrderId;
/**
* 资产id
*/
private String dataId;
/**
* 资产名称
*/
private String name;
......
......@@ -23,7 +23,6 @@ public class WorkOrderInfo {
@Id
private String id;
private String name;
/**
* 工单标题
*/
......@@ -41,6 +40,10 @@ public class WorkOrderInfo {
*/
private String status;
/**
* 流程环节 发起人、处理人、审批人
*/
private String stage;
/**
* 工单创建时间
*/
private String createTime;
......@@ -65,11 +68,11 @@ public class WorkOrderInfo {
/**
* 处理人展示名
*/
private String handleUserDName;
private String handleUserDname;
/**
* 下一步操作人展示名
*/
private String nextUserDName;
private String nextUserDname;
/**
* 下一步操作人账号
*/
......@@ -77,18 +80,33 @@ public class WorkOrderInfo {
/**
* 创建人展示名
*/
private String createUserDName;
private String createUserDname;
/**
* 创建人账号
*/
private String createUserName;
/**
* 文件id
*/
private String fileId;
/**
* 结束时间
*/
private String endTime;
/**
* 结束时间毫秒
*/
private String endTimeMill;
/**
* 期望结束时间
*/
private String expectedEndTime;
/**
* 更新时间
*/
private String updateTime;
private String fileId;
@Transient
private List<WorkOrderData> data;
......
......@@ -22,6 +22,10 @@ public class WorkOrderProcess {
*/
private String workOrderId;
/**
* 环节
*/
private String stage;
/**
* 类型 通过、驳回
*/
private String type;
......@@ -36,7 +40,7 @@ public class WorkOrderProcess {
/**
* 处理人展示名
*/
private String userDName;
private String userDname;
/**
* 下一步处理人
......@@ -45,7 +49,7 @@ public class WorkOrderProcess {
/**
* 下一步处理人展示名
*/
private String nextUserDName;
private String nextUserDname;
/**
* 创建时间
*/
......
package com.keymobile.governworkorder.core.remote;
import com.keymobile.governworkorder.core.remote.user.User;
import com.keymobile.governworkorder.core.remote.user.UserGroup;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import java.util.List;
@FeignClient(name = "AuthService")
public interface AuthService {
@GetMapping(value = "/users")
List<User> getUserList();
@GetMapping(value = "/userGroups")
List<UserGroup> getUserGroups();
@GetMapping(value = "/userGroups/{userGroupId}/users")
List<User> getUserListByGroupId(@PathVariable("userGroupId") Long userGroupId);
}
package com.keymobile.governworkorder.core.remote.user;
import lombok.Data;
import java.io.Serializable;
@Data
public class User implements Serializable {
private Long id;
private String name;
private String dname;
}
\ No newline at end of file
package com.keymobile.governworkorder.core.remote.user;
import lombok.Data;
import java.io.Serializable;
@Data
public class UserGroup implements Serializable {
private Long id;
private String name;
private String desc;
private Integer membersCount;
}
\ No newline at end of file
......@@ -36,4 +36,6 @@ public interface WorkOrderService {
WorkOrderInfoVO getById(String workOrderId);
boolean checkCreatePermission(String userName);
}
......@@ -3,14 +3,15 @@ package com.keymobile.governworkorder.core.service.impl;
import com.keymobile.governworkorder.common.bo.WorkOrderDataVO;
import com.keymobile.governworkorder.common.bo.WorkOrderInfoVO;
import com.keymobile.governworkorder.common.bo.WorkOrderProcessVO;
import com.keymobile.governworkorder.common.type.OrderApprovalTypeEnum;
import com.keymobile.governworkorder.common.type.OrderStatusTypeEnum;
import com.keymobile.governworkorder.common.type.OrderTypeEnum;
import com.keymobile.governworkorder.common.type.*;
import com.keymobile.governworkorder.core.dto.WorkOrdeQueryDto;
import com.keymobile.governworkorder.core.messaging.WorkOrderMessageService;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderProcess;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderData;
import com.keymobile.governworkorder.core.persistence.model.WorkOrderInfo;
import com.keymobile.governworkorder.core.remote.AuthService;
import com.keymobile.governworkorder.core.remote.user.User;
import com.keymobile.governworkorder.core.remote.user.UserGroup;
import com.keymobile.governworkorder.core.service.FileService;
import com.keymobile.governworkorder.core.service.WorkOrderService;
import com.keymobile.governworkorder.core.util.*;
......@@ -18,6 +19,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.bson.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
......@@ -31,8 +33,10 @@ import org.springframework.util.CollectionUtils;
import java.time.LocalDate;
import java.time.ZoneId;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
/**
......@@ -51,6 +55,15 @@ public class WorkOrderServiceImpl implements WorkOrderService {
private WorkOrderMessageService messageService;
@Autowired
private FileService fileService;
@Autowired
private AuthService authService;
@Value("${process.createGroup:治理工单创建组}")
private String createGroup;
@Value("${process.approvalGroup:治理工单审批组}")
private String approvalGroup;
@Value("${process.superAdmin:root}")
private String superAdmin;
public Page<WorkOrderInfoVO> page(WorkOrdeQueryDto param) {
Pageable pageable = PageRequest.of(param.getPage() - 1, param.getSize(),
......@@ -69,8 +82,8 @@ public class WorkOrderServiceImpl implements WorkOrderService {
query.addCriteria(new Criteria().orOperator(
Criteria.where("desc").regex(param.getKeyword()),
Criteria.where("name").regex(param.getKeyword()),
Criteria.where("userDName").regex(param.getKeyword()),
Criteria.where("handleUserDName").regex(param.getKeyword()),
Criteria.where("userDname").regex(param.getKeyword()),
Criteria.where("handleUserDname").regex(param.getKeyword()),
Criteria.where("title").regex(param.getKeyword())));
}
......@@ -105,9 +118,10 @@ public class WorkOrderServiceImpl implements WorkOrderService {
}
String userName = LogManager.getUserName();
//待办、已办
//待办
if (StringUtils.equals(param.getDoType(), "1")) {
query.addCriteria(Criteria.where("nextUserName").is(userName));
query.addCriteria(Criteria.where("nextUserName").regex("(^|,)"+userName+"(,|$)"));
//已办
} else if (StringUtils.equals(param.getDoType(), "2")) {
Query processQuery = new Query();
processQuery.addCriteria(Criteria.where("userName").is(userName));
......@@ -117,9 +131,28 @@ public class WorkOrderServiceImpl implements WorkOrderService {
return PageableExecutionUtils.getPage(Collections.emptyList(), pageable, () -> 0);
}
List<String> workOrderIds = processDocs.stream().map(e -> e.getString("workOrderId")).collect(Collectors.toList());
query.addCriteria(Criteria.where("workOrderId").in(workOrderIds));
query.addCriteria(Criteria.where("_id").in(workOrderIds));
} else {
//如果非待办和已办,则根据账号权限查询关联数据。 自理工单创建组成员可以查看所有数据,其他则只能查看自己相关数据(待办、已办)
boolean createUserFlag = checkCreatePermission(userName);
if (!createUserFlag) {
Query processQuery = new Query();
processQuery.addCriteria(Criteria.where("userName").is(userName));
processQuery.fields().include("workOrderId");
List<Document> processDocs = mongoTemplate.findDistinct(processQuery, "workOrderId", WorkOrderInfo.class, Document.class);
if (CollectionUtils.isEmpty(processDocs)) {
query.addCriteria(Criteria.where("nextUserName").regex("(^|,)" + userName + "(,|$)"));
} else {
List<String> workOrderIds = processDocs.stream().map(e -> e.getString("workOrderId")).collect(Collectors.toList());
query.addCriteria(Criteria.where("workOrderId").in(workOrderIds));
query.addCriteria(new Criteria().orOperator(
Criteria.where("nextUserName").regex("(^|,)" + userName + "(,|$)"),
Criteria.where("_id").in(workOrderIds)));
}
}
}
long count = mongoTemplate.count(query, WorkOrderInfo.class);
query.with(pageable);
List<WorkOrderInfo> list = mongoTemplate.find(query, WorkOrderInfo.class);
List<WorkOrderInfoVO> voList = list.stream().map(e -> BeanUtil.map(e, WorkOrderInfoVO.class))
.collect(Collectors.toList());
......@@ -144,7 +177,11 @@ public class WorkOrderServiceImpl implements WorkOrderService {
fillWorkOrderData(workOrder, data);
mongoTemplate.save(data);
}
return BeanUtil.map(workOrder, WorkOrderInfoVO.class);
//启动流程
startProcess(workOrder.getId());
return getById(workOrder.getId());
}
@Override
......@@ -169,13 +206,9 @@ public class WorkOrderServiceImpl implements WorkOrderService {
Assert.notNull(workOrder, "找不到对应工单");
WorkOrderData workOrderData = mongoTemplate.findById(workOrderDataId, WorkOrderData.class);
Assert.notNull(workOrderData, "找不到对应数据");
//非发起人和处理人无法操作
if (!StringUtils.equals(LogManager.getUserName(), workOrder.getCreateUserName())) {
throw new RuntimeException("非发起人无法确认");
}
//非当前审批人无法确认数据
if (!StringUtils.equals(LogManager.getUserName(), workOrder.getNextUserName())) {
throw new RuntimeException("非当前审批人无法确认数据");
if (!StringUtils.equals(OrderProcessStageTypeEnum.PROCESS_APPROVER.getName(), workOrder.getStage())
|| contains(workOrder.getNextUserName(), LogManager.getUserName())) {
throw new RuntimeException("非审批人无法确认工单");
}
workOrderData.setConfirmStatus(confirmStatus);
mongoTemplate.save(workOrderData);
......@@ -197,7 +230,7 @@ public class WorkOrderServiceImpl implements WorkOrderService {
//发送消息
WorkOrderInfoVO messageVO = convertMessage(workOrder);
messageService.delete(messageVO);
messageService.sendMsg(OrderMessageTypeEnum.MSG_DELETE.getType(), messageVO);
//删除关联数据
String fileId = workOrder.getFileId();
......@@ -207,8 +240,6 @@ public class WorkOrderServiceImpl implements WorkOrderService {
mongoTemplate.remove(query, WorkOrderData.class);
mongoTemplate.remove(Query.query(Criteria.where("_id").is(workOrderId)), WorkOrderInfo.class);
}
@Override
......@@ -238,11 +269,11 @@ public class WorkOrderServiceImpl implements WorkOrderService {
List<WorkOrderProcess> processList = mongoTemplate.find(query, WorkOrderProcess.class);
WorkOrderInfoVO workOrderVO = BeanUtil.map(workOrder, WorkOrderInfoVO.class);
if(!CollectionUtils.isEmpty(dataList)){
if (!CollectionUtils.isEmpty(dataList)) {
List<WorkOrderDataVO> dataVOList = dataList.stream().map(e -> BeanUtil.map(e, WorkOrderDataVO.class)).collect(Collectors.toList());
workOrderVO.setData(dataVOList);
}
if(!CollectionUtils.isEmpty(processList)){
if (!CollectionUtils.isEmpty(processList)) {
List<WorkOrderProcessVO> dataVOList = processList.stream().map(e -> BeanUtil.map(e, WorkOrderProcessVO.class)).collect(Collectors.toList());
workOrderVO.setProcess(dataVOList);
}
......@@ -250,33 +281,58 @@ public class WorkOrderServiceImpl implements WorkOrderService {
}
@Override
public boolean checkCreatePermission(String userName) {
String userNameTemp;
if (StringUtils.isBlank(userName)) {
userNameTemp = LogManager.getUserName();
} else {
userNameTemp = userName;
}
if (checkSuperAdmin(userNameTemp)) {
return true;
}
List<User> users = getUserNameByGroup(createGroup);
User user = users.stream().filter(e -> StringUtils.equals(userNameTemp, e.getName())).findFirst().orElse(null);
return !(user == null);
}
private boolean checkSuperAdmin(String userName) {
return StringUtils.equals(superAdmin, userName);
}
@Override
public void startProcess(String workOrderId) {
WorkOrderInfo workOrder = mongoTemplate.findById(workOrderId, WorkOrderInfo.class);
Assert.notNull(workOrder, "找不到对应工单");
if (!StringUtils.equals(LogManager.getUserName(), workOrder.getCreateUserName())) {
throw new RuntimeException("非本人无法发起工单流程");
}
if (!StringUtils.equals(OrderStatusTypeEnum.STATUS_TO_BE_START.getName(), workOrder.getStatus())) {
throw new RuntimeException("非待发起的工单无法启动流程");
}
WorkOrderProcess process = new WorkOrderProcess();
process.setId(IdUtil.generateId());
process.setUserName(LogManager.getUserName());
process.setUserDName(LogManager.getDUserName());
process.setUserDname(LogManager.getDUserName());
process.setStage(OrderProcessStageTypeEnum.PROCESS_CREATE.getName());
process.setContent("发起流程");
process.setType(OrderApprovalTypeEnum.APPROVAL_PASS.getName());
process.setNextUserName(workOrder.getHandleUserName());
process.setNextUserDName(workOrder.getHandleUserDName());
process.setNextUserDname(workOrder.getHandleUserDname());
process.setCreateTime(DateUtil.getDateTime());
process.setWorkOrderId(workOrder.getId());
mongoTemplate.save(process);
workOrder.setStatus(OrderStatusTypeEnum.STATUS_PROCESSING.getName());
workOrder.setStage(OrderProcessStageTypeEnum.PROCESS_CREATE.getName());
workOrder.setUpdateTime(DateUtil.getDateTime());
workOrder.setNextUserName(workOrder.getHandleUserName());
workOrder.setNextUserDName(workOrder.getHandleUserDName());
workOrder.setNextUserDname(workOrder.getHandleUserDname());
mongoTemplate.save(workOrder);
//发送消息
WorkOrderInfoVO messageVO = convertMessage(workOrder);
messageService.create(messageVO);
messageService.sendMsg(OrderMessageTypeEnum.MSG_CREATE.getType(), messageVO);
}
......@@ -284,62 +340,88 @@ public class WorkOrderServiceImpl implements WorkOrderService {
log.debug("workOrderId:{},process:{}", workOrderId, ObjectUtil.toJson(processVO));
WorkOrderInfo workOrder = mongoTemplate.findById(workOrderId, WorkOrderInfo.class);
Assert.notNull(workOrder, "找不到对应工单");
if (!StringUtils.equals(LogManager.getUserName(), workOrder.getCreateUserName())) {
throw new RuntimeException("无权限发起审批");
}
if (StringUtils.equals(OrderStatusTypeEnum.STATUS_DONE.getName(), workOrder.getStatus())) {
throw new RuntimeException("工单已关闭,无法审批");
if (!StringUtils.equals(OrderStatusTypeEnum.STATUS_PROCESSING.getName(), workOrder.getStatus())) {
throw new RuntimeException(workOrder.getStatus() + ",无法审批");
}
if (StringUtils.equals(OrderStatusTypeEnum.STATUS_TO_BE_START.getName(), workOrder.getStatus())) {
throw new RuntimeException("流程待发起,无法审批");
if (!contains(workOrder.getNextUserName(), LogManager.getUserName())) {
throw new RuntimeException("无权限发起审批");
}
//处理人无法驳回
if (StringUtils.equals(LogManager.getUserName(), workOrder.getHandleUserName())
if (StringUtils.equals(OrderProcessStageTypeEnum.PROCESS_HANDLER.getName(), workOrder.getStage())
&& StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_PASS.getName(), processVO.getType())) {
throw new RuntimeException("处理人不能驳回");
throw new RuntimeException("处理人无法驳回");
}
WorkOrderProcess process = BeanUtil.map(processVO, WorkOrderProcess.class);
process.setId(IdUtil.generateId());
process.setUserName(LogManager.getUserName());
process.setUserDName(LogManager.getDUserName());
process.setUserDname(LogManager.getDUserName());
process.setStage(workOrder.getStage());
process.setCreateTime(DateUtil.getDateTime());
process.setWorkOrderId(workOrder.getId());
if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_REJECT.getName(), processVO.getType())
&& StringUtils.equals(LogManager.getUserName(), workOrder.getCreateUserName())) {
process.setNextUserName(workOrder.getHandleUserName());
process.setNextUserDName(workOrder.getHandleUserDName());
workOrder.setNextUserName(workOrder.getHandleUserName());
workOrder.setNextUserDName(workOrder.getHandleUserDName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
} else if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_PASS.getName(), processVO.getType())
&& StringUtils.equals(LogManager.getUserName(), workOrder.getCreateUserName())) {
process.setNextUserName(null);
process.setNextUserDName(null);
workOrder.setNextUserName(null);
workOrder.setNextUserDName(null);
workOrder.setStatus(OrderStatusTypeEnum.STATUS_DONE.getName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
WorkOrderInfoVO messageVO = convertMessage(workOrder);
messageService.finsh(messageVO);
} else if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_PASS.getName(), processVO.getType())
&& StringUtils.equals(LogManager.getUserName(), workOrder.getHandleUserName())) {
process.setNextUserName(workOrder.getCreateUserName());
process.setNextUserDName(workOrder.getCreateUserDName());
workOrder.setNextUserName(workOrder.getCreateUserName());
workOrder.setNextUserDName(workOrder.getCreateUserDName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
//驳回
if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_REJECT.getName(), processVO.getType())) {
//资产变更工单审批人驳回返回处理人处理,否则工单失效
if (StringUtils.equals(OrderTypeEnum.DATA_UPDATE.getName(), workOrder.getType())) {
process.setNextUserName(workOrder.getHandleUserName());
process.setNextUserDname(workOrder.getHandleUserDname());
workOrder.setNextUserName(workOrder.getHandleUserName());
workOrder.setNextUserDname(workOrder.getHandleUserDname());
workOrder.setStage(OrderProcessStageTypeEnum.PROCESS_HANDLER.getName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
} else {
process.setNextUserName(null);
process.setNextUserDname(null);
workOrder.setNextUserName(null);
workOrder.setNextUserDname(null);
workOrder.setStage(null);
workOrder.setStatus(OrderStatusTypeEnum.STATUS_INVALIDATE.getName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
WorkOrderInfoVO messageVO = convertMessage(workOrder);
messageService.sendMsg(OrderMessageTypeEnum.MSG_INVALIDATE.getType(), messageVO);
}
//通过
} else {
//审批人通过,工单结束,发送消息
if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_PASS.getName(), processVO.getType())
&& StringUtils.equals(OrderProcessStageTypeEnum.PROCESS_APPROVER.getName(), workOrder.getStage())) {
process.setNextUserName(null);
process.setNextUserDname(null);
workOrder.setNextUserName(null);
workOrder.setNextUserDname(null);
workOrder.setStage(null);
workOrder.setStatus(OrderStatusTypeEnum.STATUS_DONE.getName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
WorkOrderInfoVO messageVO = convertMessage(workOrder);
messageService.sendMsg(OrderMessageTypeEnum.MSG_FINISH.getType(), messageVO);
//处理人通过,发送审批人审批
} else if (StringUtils.equals(OrderApprovalTypeEnum.APPROVAL_PASS.getName(), processVO.getType())
&& StringUtils.equals(OrderProcessStageTypeEnum.PROCESS_HANDLER.getName(), workOrder.getStage())) {
List<User> users = getUserNameByGroup(approvalGroup);
Assert.notEmpty(users, "未配置用户组:" + approvalGroup);
List<String> userNameList = users.stream().map(User::getName).collect(Collectors.toUnmodifiableList());
List<String> userDnameList = users.stream().map(User::getDname).collect(Collectors.toUnmodifiableList());
String userNameStr = StringUtils.join(userNameList,",");
String userDnameStr = StringUtils.join(userDnameList,",");
process.setNextUserName(userNameStr);
process.setNextUserDname(userDnameStr);
workOrder.setNextUserName(userNameStr);
workOrder.setNextUserDname(userDnameStr);
workOrder.setStage(OrderProcessStageTypeEnum.PROCESS_APPROVER.getName());
mongoTemplate.save(process);
mongoTemplate.save(workOrder);
}
}
......@@ -369,7 +451,7 @@ public class WorkOrderServiceImpl implements WorkOrderService {
workOrder.setUpdateTime(DateUtil.getDateTime());
workOrder.setCreateTime(DateUtil.getDateTime());
workOrder.setCreateUserName(LogManager.getUserName());
workOrder.setCreateUserDName(LogManager.getDUserName());
workOrder.setCreateUserDname(LogManager.getDUserName());
workOrder.setCreateTimeMill(System.currentTimeMillis());
if (StringUtils.isBlank(workOrder.getId())) {
workOrder.setId(IdUtil.generateId());
......@@ -406,4 +488,23 @@ public class WorkOrderServiceImpl implements WorkOrderService {
return workOrderVo;
}
private List<User> getUserNameByGroup(String groupName) {
List<UserGroup> groupList = authService.getUserGroups();
UserGroup group = groupList.stream().filter(e -> StringUtils.equals(groupName, e.getName())).findFirst().orElse(null);
if (group == null) {
return new ArrayList<>();
}
List<User> userList = authService.getUserListByGroupId(group.getId());
if (CollectionUtils.isEmpty(userList)) {
return new ArrayList<>();
}
return userList;
}
private boolean contains(String nextUsers, String userName) {
return Pattern.compile("(^|,)" + userName + "(,|$)").matcher(nextUsers).find();
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment