基于DDD的微服务落地( 三 )

服务的组合和编排
应用层的应用服务主要完成领域服务的组合与编排 。
@Servicepublic class LeaveApplicationService {@AutowiredLeaveDomainService leaveDomainService;@AutowiredPersonDomainService personDomainService;@AutowiredApprovalRuleDomainService approvalRuleDomainService;/*** 创建一个请假申请并为审批人生成任务* @param leave*/public void createLeaveInfo(Leave leave){int leaderMaxLevel = approvalRuleDomainService.getLeaderMaxLevel(leave.getApplicant().getPersonType(), leave.getType().toString(), leave.getDuration());Person approver = personDomainService.findFirstApprover(leave.getApplicant().getPersonId(), leaderMaxLevel);leaveDomainService.createLeave(leave, leaderMaxLevel, Approver.fromPerson(approver));}/*** 更新请假单基本信息* @param leave*/public void updateLeaveInfo(Leave leave){leaveDomainService.updateLeaveInfo(leave);}/*** 提交审批 , 更新请假单信息* @param leave*/public void submitApproval(Leave leave){//find next approverPerson approver = personDomainService.findNextApprover(leave.getApprover().getPersonId(), leave.getLeaderMaxLevel());leaveDomainService.submitApproval(leave, Approver.fromPerson(approver));}public Leave getLeaveInfo(String leaveId){return leaveDomainService.getLeaveInfo(leaveId);}public List<Leave> queryLeaveInfosByApplicant(String applicantId){return leaveDomainService.queryLeaveInfosByApplicant(applicantId);}public List<Leave> queryLeaveInfosByApprover(String approverId){return leaveDomainService.queryLeaveInfosByApprover(approverId);}}服务接口的提供
facade门面接口主要抽象出Controller Api作为OpenFeign调用的接口门面类 。
/*** @author lyonardo* @Description* @createTime 2020年03月08日 15:06:00*/@FeignClient(name = "leave-service", path = "/leave")public interface LeaveFeignClient {@PostMapping("/submit")Response submitApproval(LeaveDTO leaveDTO);@PostMapping("/{leaveId}")Response findById(@PathVariable String leaveId);/*** 根据申请人查询所有请假单* @param applicantId* @return*/@PostMapping("/query/applicant/{applicantId}")Response queryByApplicant(@PathVariable String applicantId);/*** 根据审批人id查询待审批请假单(待办任务)* @param approverId* @return*/@PostMapping("/query/approver/{approverId}")Response queryByApprover(@PathVariable String approverId)();}实现类
@RestController@RequestMapping("/leave")@Slf4jpublic class LeaveApi {@AutowiredLeaveApplicationService leaveApplicationService;@PostMapping("/create")public Response createLeaveInfo(LeaveDTO leaveDTO){Leave leave = LeaveAssembler.toDO(leaveDTO);leaveApplicationService.createLeaveInfo(leave);return Response.ok();}@PutMapping("/update")public Response updateLeaveInfo(LeaveDTO leaveDTO){Leave leave = LeaveAssembler.toDO(leaveDTO);leaveApplicationService.updateLeaveInfo(leave);return Response.ok();}@PostMapping("/submit")public Response submitApproval(LeaveDTO leaveDTO){Leave leave = LeaveAssembler.toDO(leaveDTO);leaveApplicationService.submitApproval(leave);return Response.ok();}@PostMapping("/{leaveId}")public Response findById(@PathVariable String leaveId){Leave leave = leaveApplicationService.getLeaveInfo(leaveId);return Response.ok(LeaveAssembler.toDTO(leave));}/*** 根据申请人查询所有请假单* @param applicantId* @return*/@PostMapping("/query/applicant/{applicantId}")public Response queryByApplicant(@PathVariable String applicantId){List<Leave> leaveList = leaveApplicationService.queryLeaveInfosByApplicant(applicantId);List<LeaveDTO> leaveDTOList = leaveList.stream().map(leave -> LeaveAssembler.toDTO(leave)).collect(Collectors.toList());return Response.ok(leaveDTOList);}/*** 根据审批人id查询待审批请假单(待办任务)* @param approverId* @return*/@PostMapping("/query/approver/{approverId}")public Response queryByApprover(@PathVariable String approverId){List<Leave> leaveList = leaveApplicationService.queryLeaveInfosByApprover(approverId);List<LeaveDTO> leaveDTOList = leaveList.stream().map(leave -> LeaveAssembler.toDTO(leave)).collect(Collectors.toList());return Response.ok(leaveDTOList);}}数据组装层
LeaveAssembler
//可使用MapStruct做对象转换和组装
public class LeaveAssembler { public static LeaveDTO toDTO(Leave leave){LeaveDTO dto = new LeaveDTO();dto.setLeaveId(leave.getId());dto.setLeaveType(leave.getType().toString());dto.setStatus(leave.getStatus().toString());dto.setStartTime(DateUtil.formatDateTime(leave.getStartTime()));dto.setEndTime(DateUtil.formatDateTime(leave.getEndTime()));dto.setCurrentApprovalInfoDTO(ApprovalInfoAssembler.toDTO(leave.getCurrentApprovalInfo()));List<ApprovalInfoDTO> historyApprovalInfoDTOList = leave.getHistoryApprovalInfos().stream().map(historyApprovalInfo -> ApprovalInfoAssembler.toDTO(leave.getCurrentApprovalInfo())).collect(Collectors.toList());dto.setHistoryApprovalInfoDTOList(historyApprovalInfoDTOList);dto.setDuration(leave.getDuration());return dto; } public static Leave toDO(LeaveDTO dto){Leave leave = new Leave();leave.setId(dto.getLeaveId());leave.setApplicant(ApplicantAssembler.toDO(dto.getApplicantDTO()));leave.setApprover(ApproverAssembler.toDO(dto.getApproverDTO()));leave.setCurrentApprovalInfo(ApprovalInfoAssembler.toDO(dto.getCurrentApprovalInfoDTO()));List<ApprovalInfo> historyApprovalInfoDTOList = dto.getHistoryApprovalInfoDTOList().stream().map(ApprovalInfoAssembler::toDO).collect(Collectors.toList());leave.setHistoryApprovalInfos(historyApprovalInfoDTOList);return leave; }}


推荐阅读