package com.sobey.cmop.mvc.service.resource; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.domain.Page; import org.springframework.data.domain.PageRequest; import org.springframework.data.jpa.domain.Specification; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.sobey.cmop.mvc.comm.BaseSevcie; import com.sobey.cmop.mvc.constant.RedmineConstant; import com.sobey.cmop.mvc.constant.ResourcesConstant; import com.sobey.cmop.mvc.dao.ServiceTagDao; import com.sobey.cmop.mvc.entity.Apply; import com.sobey.cmop.mvc.entity.RedmineIssue; import com.sobey.cmop.mvc.entity.Resources; import com.sobey.cmop.mvc.entity.ServiceTag; import com.sobey.cmop.mvc.entity.User; import com.sobey.cmop.mvc.service.redmine.RedmineService; import com.sobey.framework.utils.DynamicSpecifications; import com.sobey.framework.utils.Identities; import com.sobey.framework.utils.SearchFilter; import com.sobey.framework.utils.SearchFilter.Operator; import com.taskadapter.redmineapi.RedmineManager; import com.taskadapter.redmineapi.bean.Issue; import com.taskadapter.redmineapi.bean.Tracker; /** * 服务标签相关的管理类. * * @author liukai */ @Service @Transactional(readOnly = true) public class ServiceTagService extends BaseSevcie { private static Logger logger = LoggerFactory.getLogger(ServiceTagService.class); private static String TAG_IDENTIFIER = "TAG"; @Resource private ServiceTagDao serviceTagDao; public ServiceTag getServiceTag(Integer id) { return serviceTagDao.findOne(id); } /** * 保存,修改服务标签ServiceTag * * @param serviceTag * @return */ @Transactional(readOnly = false) public ServiceTag saveOrUpdate(ServiceTag serviceTag) { return serviceTagDao.save(serviceTag); } /** * 更新serviceTag,并将更新的数据同步至oneCMDB中. * * @param serviceTag * @return */ @Transactional(readOnly = false) public ServiceTag updateServiceTagAndOneCMDB(ServiceTag serviceTag) { comm.oneCmdbUtilService.saveServiceTagToOneCMDB(serviceTag); return serviceTagDao.save(serviceTag); } /** * 删除服务标签,并删除oneCMDB中的数据. * * @param id */ @Transactional(readOnly = false) public void delete(Integer id) { // 删除oneCMDB中数据. comm.oneCmdbUtilService.deleteServiceTagToOneCMDB(this.getServiceTag(id)); serviceTagDao.delete(id); } /** * 根据服务标签名name 和创建人 userId 获得服务标签对象 * * @param name * @param userId * @return */ public ServiceTag findServiceTagByNameAndUserId(String name, Integer userId) { return serviceTagDao.findByNameAndUserId(name, userId); } /** * 当前用户拥有的服务标签ServiceTag * * @return */ public List<ServiceTag> getServiceTagList() { return serviceTagDao.findByUserId(getCurrentUserId()); } /** * 资源变更页面可选择的服务标签列表. 该服务标签是可用的,没有在审批流程中的服务标签. * * <pre> * -1-未变更 * 0-已变更(未提交) * 3-已退回 * 6-已创建 * </pre> * * @return */ public List<ServiceTag> getServiceTagToResourcesList() { List<Integer> status = new ArrayList<Integer>(); status.add(ResourcesConstant.Status.未变更.toInteger()); status.add(ResourcesConstant.Status.已变更.toInteger()); status.add(ResourcesConstant.Status.已退回.toInteger()); status.add(ResourcesConstant.Status.已创建.toInteger()); return serviceTagDao.findByUserIdAndStatusInOrderByIdDesc(getCurrentUserId(), status); } /** * 新增服务标签ServiceTag * * <pre> * 1.如果ServiceTag的name在数据库中不存在,返回一个新创建的ServiceTag. * 如果存在,则返回已存在的ServiceTag * * 2.数据插入库后,也要将数据同步至oneCMDB中, * 即也要调用API将新建serviceTag插入oneCMDB. * * <pre> * * @param apply * @return */ @Transactional(readOnly = false) public ServiceTag saveServiceTag(Apply apply) { ServiceTag serviceTag = null; serviceTag = this.findServiceTagByNameAndUserId(apply.getServiceTag(), apply.getUser().getId()); if (serviceTag == null) { serviceTag = new ServiceTag(); serviceTag.setIdentifier(TAG_IDENTIFIER + "-" + Identities.randomBase62(8)); serviceTag.setUser(apply.getUser()); serviceTag.setName(apply.getServiceTag()); serviceTag.setPriority(apply.getPriority()); serviceTag.setDescription(apply.getDescription()); serviceTag.setServiceStart(apply.getServiceStart()); serviceTag.setServiceEnd(apply.getServiceEnd()); serviceTag.setCreateTime(new Date()); serviceTag.setStatus(ResourcesConstant.Status.未变更.toInteger()); this.saveOrUpdate(serviceTag); // 插入oneCMDB comm.oneCmdbUtilService.saveServiceTagToOneCMDB(serviceTag); } return serviceTag; } /** * 迁移时,通过资源的服务标签名判断迁移目标用户是否有该服务标签. 如果有,直接返回查询出来的服务标签.如果没有,在目标用户下创建新的服务标签. * * @param resources * @param user * @return */ @Transactional(readOnly = false) public ServiceTag saveServiceTag(Resources resources, User user) { ServiceTag serviceTag = comm.serviceTagService.findServiceTagByNameAndUserId(resources.getServiceTag() .getName(), user.getId()); if (serviceTag == null) { serviceTag = new ServiceTag(); serviceTag.setIdentifier(TAG_IDENTIFIER + "-" + Identities.randomBase62(8)); serviceTag.setUser(user); serviceTag.setName(resources.getServiceTag().getName()); serviceTag.setPriority(resources.getServiceTag().getPriority()); serviceTag.setDescription(resources.getServiceTag().getDescription()); serviceTag.setServiceStart(resources.getServiceTag().getServiceStart()); serviceTag.setServiceEnd(resources.getServiceTag().getServiceEnd()); serviceTag.setCreateTime(new Date()); serviceTag.setStatus(ResourcesConstant.Status.未变更.toInteger()); this.saveOrUpdate(serviceTag); // 插入oneCMDB comm.oneCmdbUtilService.saveServiceTagToOneCMDB(serviceTag); } return serviceTag; } /** * 新增服务标签(如果这个标签名存在,则略过),并同步至oneCMDB * * @param serviceTag * @return */ @Transactional(readOnly = false) public ServiceTag saveServiceTag(ServiceTag serviceTag) { serviceTag.setIdentifier(TAG_IDENTIFIER + "-" + Identities.randomBase62(8)); serviceTag.setUser(comm.accountService.getCurrentUser()); serviceTag.setStatus(ResourcesConstant.Status.未变更.toInteger()); serviceTag.setCreateTime(new Date()); this.saveOrUpdate(serviceTag); // 插入oneCMDB comm.oneCmdbUtilService.saveServiceTagToOneCMDB(serviceTag); return serviceTag; } /** * 提交服务标签ServiceTag的分页(status为 0.已变更 的数据) * * 资源变更后,资源本身和其所属的服务标签的状态都会变更为 0.已变更. 即此服务标签下有变更后等待提交的资源. * * @param searchParams * 页面传递过来的参数 * @param pageNumber * @param pageSize * @return */ public Page<ServiceTag> getCommitServiceTagPageable(Map<String, Object> searchParams, int pageNumber, int pageSize) { PageRequest pageRequest = buildPageRequest(pageNumber, pageSize); Map<String, SearchFilter> filters = SearchFilter.parse(searchParams); filters.put("serviceTag.status", new SearchFilter("status", Operator.EQ, ResourcesConstant.Status.已变更.toInteger())); filters.put("serviceTag.user.id", new SearchFilter("user.id", Operator.EQ, getCurrentUserId())); Specification<ServiceTag> spec = DynamicSpecifications.bySearchFilter(filters.values(), ServiceTag.class); return serviceTagDao.findAll(spec, pageRequest); } /** * 提交服务标签ServiceTag的分页 * * @param searchParams * 页面传递过来的参数 * @param pageNumber * @param pageSize * @return */ public Page<ServiceTag> getServiceTagPageable(Map<String, Object> searchParams, int pageNumber, int pageSize) { PageRequest pageRequest = buildPageRequest(pageNumber, pageSize); Map<String, SearchFilter> filters = SearchFilter.parse(searchParams); filters.put("serviceTag.user.id", new SearchFilter("user.id", Operator.EQ, getCurrentUserId())); Specification<ServiceTag> spec = DynamicSpecifications.bySearchFilter(filters.values(), ServiceTag.class); return serviceTagDao.findAll(spec, pageRequest); } /** * 提交变更,向第一位审批人发起审批邮件 * * * @param serviceTag * @return */ @Transactional(readOnly = false) public String saveAuditByServiceTag(ServiceTag serviceTag) { String message = ""; // 如果有上级领导存在,则发送邮件,否则返回字符串提醒用户没有上级领导存在. List<Resources> resourcesList = comm.resourcesService.getCommitingResourcesListByServiceTagId(serviceTag .getId()); try { serviceTag.setStatus(ResourcesConstant.Status.待审批.toInteger()); this.saveOrUpdate(serviceTag); message = "服务标签 " + serviceTag.getName() + " 提交审批成功"; String description = comm.redmineUtilService.resourcesRedmineDesc(serviceTag); // 写入工单Issue到Redmine Issue issue = new Issue(); Integer trackerId = RedmineConstant.Tracker.支持.toInteger(); Tracker tracker = new Tracker(trackerId, RedmineConstant.Tracker.get(trackerId)); issue.setTracker(tracker); issue.setSubject(comm.applyService.generateTitle(serviceTag.getUser().getLoginName(), "change")); issue.setPriorityId(serviceTag.getPriority()); issue.setDescription(description); Integer projectId = RedmineConstant.Project.SobeyCloud运营.toInteger(); // 初始化第一接收人 RedmineManager mgr = RedmineService.FIRST_REDMINE_ASSIGNEE_REDMINEMANAGER; boolean isCreated = RedmineService.createIssue(issue, projectId.toString(), mgr); logger.info("--->资源变更Resource Redmine isCreated?" + isCreated); if (isCreated) { // 写入Redmine成功 Integer assignee = RedmineService.FIRST_REDMINE_ASSIGNEE; issue = RedmineService.getIssueBySubject(issue.getSubject(), mgr); RedmineIssue redmineIssue = new RedmineIssue(); redmineIssue.setProjectId(projectId); redmineIssue.setTrackerId(issue.getTracker().getId()); redmineIssue.setSubject(issue.getSubject()); redmineIssue.setAssignee(assignee); redmineIssue.setStatus(RedmineConstant.Status.新建.toInteger()); redmineIssue.setIssueId(issue.getId()); redmineIssue.setServiceTagId(serviceTag.getId()); comm.operateService.saveOrUpdate(redmineIssue); // 指派人的User User assigneeUser = comm.accountService.findUserByRedmineUserId(assignee); // 发送工单处理邮件 comm.templateMailService.sendResourcesOperateNotificationMail(serviceTag, assigneeUser); for (Resources resources : resourcesList) { // 写入redmine成功后,资源状态也随之改变为 4.已审批 resources.setStatus(ResourcesConstant.Status.已审批.toInteger()); comm.resourcesService.saveOrUpdate(resources); } } else { message = "工单创建失败,请联系系统管理员"; } } catch (Exception e) { message = "工单创建失败,请联系系统管理员"; e.printStackTrace(); } return message; } }