package com.sobey.cmop.mvc.service.failure; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import org.apache.commons.lang3.StringUtils; 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 org.springframework.web.multipart.MultipartFile; import com.sobey.cmop.mvc.comm.BaseSevcie; import com.sobey.cmop.mvc.constant.RedmineConstant; import com.sobey.cmop.mvc.dao.AttachmentDao; import com.sobey.cmop.mvc.dao.FailureDao; import com.sobey.cmop.mvc.entity.Attachment; import com.sobey.cmop.mvc.entity.ComputeItem; import com.sobey.cmop.mvc.entity.CpItem; import com.sobey.cmop.mvc.entity.Failure; import com.sobey.cmop.mvc.entity.MdnItem; import com.sobey.cmop.mvc.entity.MonitorCompute; import com.sobey.cmop.mvc.entity.MonitorElb; import com.sobey.cmop.mvc.entity.MonitorMail; import com.sobey.cmop.mvc.entity.MonitorPhone; import com.sobey.cmop.mvc.entity.NetworkDnsItem; import com.sobey.cmop.mvc.entity.NetworkEipItem; import com.sobey.cmop.mvc.entity.NetworkElbItem; import com.sobey.cmop.mvc.entity.RedmineIssue; import com.sobey.cmop.mvc.entity.Resources; import com.sobey.cmop.mvc.entity.StorageItem; import com.sobey.cmop.mvc.entity.User; import com.sobey.cmop.mvc.service.redmine.RedmineService; import com.sobey.cmop.mvc.web.failure.UploadedFile; import com.sobey.framework.utils.DynamicSpecifications; 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; /** * 故障申报Failure相关的管理类. * * @author liukai */ @Service @Transactional(readOnly = true) public class FailureService extends BaseSevcie { private static Logger logger = LoggerFactory.getLogger(FailureService.class); /** * 附件保存位置 */ private static String UPLOAD_DIRECTORY = CONFIG_LOADER.getProperty("UPLOAD_DIRECTORY"); @Resource private FailureDao failureDao; @Resource private AttachmentDao attachmentDao; public Failure getFailure(Integer id) { return failureDao.findOne(id); } /** * 新增,保存故障申报Failure */ @Transactional(readOnly = true) public Failure saveOrUpdate(Failure failure) { return failureDao.save(failure); } /** * 提交一个故障申报 * * @param failure * @param fileNames * 上传附件名 * @param fileNames * 上传附件说明 * @return */ @Transactional(readOnly = true) public boolean saveFailure(Failure failure, String fileNames, String fileDescs) { logger.info("--->故障申报处理..."); boolean result = false; try { String description = ""; List<Resources> resourcesList = new ArrayList<Resources>(); List<ComputeItem> computeItems = new ArrayList<ComputeItem>(); List<StorageItem> storageItems = new ArrayList<StorageItem>(); List<NetworkElbItem> elbItems = new ArrayList<NetworkElbItem>(); List<NetworkEipItem> eipItems = new ArrayList<NetworkEipItem>(); List<NetworkDnsItem> dnsItems = new ArrayList<NetworkDnsItem>(); List<MonitorMail> monitorMails = new ArrayList<MonitorMail>(); List<MonitorPhone> monitorPhones = new ArrayList<MonitorPhone>(); List<MonitorCompute> monitorComputes = new ArrayList<MonitorCompute>(); List<MonitorElb> monitorElbs = new ArrayList<MonitorElb>(); List<MdnItem> mdnItems = new ArrayList<MdnItem>(); List<CpItem> cpItems = new ArrayList<CpItem>(); if (StringUtils.isNotBlank(failure.getRelatedId())) { String[] resourcesIds = failure.getRelatedId().split(","); for (String resourcesId : resourcesIds) { Resources resources = comm.resourcesService.getResources(Integer.valueOf(resourcesId)); resourcesList.add(resources); } } /* 封装各个资源对象 */ comm.resourcesService.wrapBasicUntilListByResources(resourcesList, computeItems, storageItems, elbItems, eipItems, dnsItems, monitorComputes, monitorElbs, mdnItems, cpItems); logger.info("--->拼装邮件内容..."); // 拼装Redmine内容 description = comm.redmineUtilService.failureResourcesRedmineDesc(failure, computeItems, storageItems, elbItems, eipItems, dnsItems, monitorMails, monitorPhones, monitorComputes, monitorElbs, mdnItems, cpItems); Issue issue = new Issue(); Integer trackerId = RedmineConstant.Tracker.错误.toInteger(); Tracker tracker = new Tracker(trackerId, RedmineConstant.Tracker.get(trackerId)); issue.setTracker(tracker); issue.setSubject(failure.getTitle()); issue.setPriorityId(failure.getLevel()); issue.setDescription(description); Integer projectId = RedmineConstant.Project.SobeyCloud问题库.toInteger(); // 初始化第一接收人 RedmineManager mgr = new RedmineManager(RedmineService.HOST, RedmineConstant.REDMINE_ASSIGNEE_KEY_MAP.get(failure.getAssignee())); boolean isCreated = RedmineService.createIssue(issue, projectId.toString(), mgr); logger.info("--->Redmine isCreated?" + isCreated); if (isCreated) { // 写入Redmine成功 result = true; issue = RedmineService.getIssueBySubject(issue.getSubject(), mgr); logger.info("--->创建RedmineIssue..."); RedmineIssue redmineIssue = new RedmineIssue(); redmineIssue.setProjectId(projectId); redmineIssue.setTrackerId(issue.getTracker().getId()); redmineIssue.setSubject(issue.getSubject()); redmineIssue.setAssignee(failure.getAssignee()); redmineIssue.setStatus(issue.getStatusId()); redmineIssue.setIssueId(issue.getId()); comm.operateService.saveOrUpdate(redmineIssue); logger.info("--->写入故障申报表..."); failure.setRedmineIssue(redmineIssue); this.saveOrUpdate(failure); logger.info("--->故障申报表保存成功"); // 插入附件信息 if (fileNames != null) { String[] fileNameArray = fileNames.split(","); String[] fileDescArray = fileDescs.split(","); for (int i = 0; i < fileNameArray.length; i++) { Attachment attachment = new Attachment(fileNameArray[i], fileDescArray[i], new Date(), redmineIssue); attachmentDao.save(attachment); } } // 指派人的User User assigneeUser = comm.accountService.findUserByRedmineUserId(failure.getAssignee()); // 发送工单处理邮件 comm.templateMailService.sendFailureResourcesNotificationMail(failure, computeItems, storageItems, elbItems, eipItems, dnsItems, monitorComputes, monitorElbs, mdnItems, cpItems, assigneeUser); } return result; } catch (Exception e) { logger.error("--->故障申报处理失败:" + e.getMessage()); return result; } } /** * 故障申报Failure的分页查询. * * @param searchParams * 页面传递过来的参数 * @param pageNumber * @param pageSize * @return */ public Page<Failure> getFailurePageable(Map<String, Object> searchParams, int pageNumber, int pageSize) { PageRequest pageRequest = buildPageRequest(pageNumber, pageSize); Map<String, SearchFilter> filters = SearchFilter.parse(searchParams); filters.put("Failure.user.id", new SearchFilter("user.id", Operator.EQ, getCurrentUserId())); Specification<Failure> spec = DynamicSpecifications.bySearchFilter(filters.values(), Failure.class); return failureDao.findAll(spec, pageRequest); } /** * AJAX上传附件 * * @param request * @param file * @return */ @Transactional(readOnly = true) public List<UploadedFile> saveUploadByAjax(HttpServletRequest request, MultipartFile file) { // 得到文件保存目录的真实路径 String pathDir = request.getSession().getServletContext().getRealPath(UPLOAD_DIRECTORY); UploadedFile uploadFile = new UploadedFile(); uploadFile.setName(file.getOriginalFilename()); uploadFile.setSize(Long.valueOf(file.getSize()).intValue()); uploadFile.setDeleteUrl("delete/?fileName=" + file.getOriginalFilename()); List<UploadedFile> uploadedFiles = new ArrayList<UploadedFile>(); try { this.saveFileFromInputStream(file.getInputStream(), pathDir, file.getOriginalFilename()); uploadedFiles.add(uploadFile); } catch (IOException e) { e.printStackTrace(); logger.info("上传附件失败!"); } return uploadedFiles; } /** * AJAX删除页面上已经上传的附件. * * @param request * @param fileName * @return */ @Transactional(readOnly = true) public boolean deleteUploadByAjax(HttpServletRequest request, String fileName) { boolean result = false; // 得到文件保存目录的真实路径 String pathDir = request.getSession().getServletContext().getRealPath(UPLOAD_DIRECTORY); fileName = pathDir + File.separator + fileName; try { File file = new File(fileName); if (file.isFile() && file.exists()) { file.delete(); logger.info("删除文件(" + fileName + ")成功!"); } else { logger.info("此文件(" + fileName + ")不存在!"); } result = true; } catch (Exception e) { logger.info("删除附件失败!"); } return result; } /** * 将上传附件保存至指定硬盘位置. * * @param stream * 文件输入流 * @param path * 保存路径 * @param filename * 文件名 * @throws IOException */ @SuppressWarnings("unused") public void saveFileFromInputStream(InputStream stream, String path, String filename) throws IOException { File file = new File(path); if (!file.exists()) { file.mkdir(); } logger.info(path + File.separator + filename); FileOutputStream fs = new FileOutputStream(path + File.separator + filename); byte[] buffer = new byte[1024 * 1024]; int bytesum = 0; int byteread = 0; while ((byteread = stream.read(buffer)) != -1) { bytesum += byteread; fs.write(buffer, 0, byteread); fs.flush(); } fs.close(); stream.close(); } }