package com.mossle.pim.web; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.mossle.api.store.StoreConnector; import com.mossle.api.store.StoreDTO; import com.mossle.api.tenant.TenantHolder; import com.mossle.core.auth.CurrentUserHolder; import com.mossle.core.export.Exportor; import com.mossle.core.export.TableModel; import com.mossle.core.mapper.BeanMapper; import com.mossle.core.mapper.JsonMapper; import com.mossle.core.page.Page; import com.mossle.core.query.PropertyFilter; import com.mossle.core.spring.MessageHelper; import com.mossle.core.store.MultipartFileDataSource; import com.mossle.core.util.ServletUtils; import com.mossle.pim.persistence.domain.WorkReportAttachment; import com.mossle.pim.persistence.domain.WorkReportInfo; import com.mossle.pim.persistence.manager.WorkReportAttachmentManager; import com.mossle.pim.persistence.manager.WorkReportInfoManager; import org.apache.commons.io.IOUtils; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.ModelAttribute; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.multipart.MultipartFile; import org.springframework.web.servlet.mvc.support.RedirectAttributes; @Controller @RequestMapping("pim") public class WorkReportInfoController { private WorkReportInfoManager workReportInfoManager; private WorkReportAttachmentManager workReportAttachmentManager; private MessageHelper messageHelper; private Exportor exportor; private BeanMapper beanMapper = new BeanMapper(); private JsonMapper jsonMapper = new JsonMapper(); private CurrentUserHolder currentUserHolder; private TenantHolder tenantHolder; private StoreConnector storeConnector; @RequestMapping("work-report-info-list") public String list(@ModelAttribute Page page, @RequestParam Map<String, Object> parameterMap, Model model) { String userId = currentUserHolder.getUserId(); List<PropertyFilter> propertyFilters = PropertyFilter .buildFromMap(parameterMap); propertyFilters.add(new PropertyFilter("EQS_userId", userId)); page = workReportInfoManager.pagedQuery(page, propertyFilters); model.addAttribute("page", page); return "pim/work-report-info-list"; } @RequestMapping("work-report-info-input") public String input(@RequestParam(value = "id", required = false) Long id, Model model) { if (id != null) { WorkReportInfo workReportInfo = workReportInfoManager.get(id); model.addAttribute("model", workReportInfo); } return "pim/work-report-info-input"; } @RequestMapping("work-report-info-save") public String save( @ModelAttribute WorkReportInfo workReportInfo, @RequestParam(value = "attachmentIds", required = false) List<Long> attachmentIds, RedirectAttributes redirectAttributes) { String userId = currentUserHolder.getUserId(); String tenantId = tenantHolder.getTenantId(); Long id = workReportInfo.getId(); WorkReportInfo dest = null; if (id != null) { dest = workReportInfoManager.get(id); beanMapper.copy(workReportInfo, dest); } else { dest = workReportInfo; dest.setUserId(userId); dest.setCreateTime(new Date()); } workReportInfoManager.save(dest); dest = workReportInfoManager.get(dest.getId()); List<Long> requestIds = null; if (attachmentIds == null) { requestIds = new ArrayList<Long>(); } else { requestIds = attachmentIds; } List<Long> existIds = new ArrayList<Long>(); for (WorkReportAttachment workReportAttachment : workReportAttachmentManager .findBy("workReportInfo", dest)) { existIds.add(workReportAttachment.getId()); } List<Long> inserted = new ArrayList<Long>(); List<Long> removed = new ArrayList<Long>(); for (Long theId : requestIds) { if (!existIds.contains(theId)) { inserted.add(theId); } } for (Long theId : existIds) { if (!requestIds.contains(theId)) { removed.add(theId); } } for (Long theId : removed) { WorkReportAttachment workReportAttachment = workReportAttachmentManager .get(theId); workReportAttachment.setWorkReportInfo(null); dest.getWorkReportAttachments().remove(workReportAttachment); workReportAttachmentManager.remove(workReportAttachment); } for (Long theId : inserted) { WorkReportAttachment workReportAttachment = workReportAttachmentManager .get(theId); workReportAttachment.setWorkReportInfo(dest); workReportAttachmentManager.save(workReportAttachment); } messageHelper.addFlashMessage(redirectAttributes, "core.success.save", "保存成功"); return "redirect:/pim/work-report-info-list.do"; } @RequestMapping("work-report-info-remove") public String remove(@RequestParam("selectedItem") List<Long> selectedItem, RedirectAttributes redirectAttributes) { List<WorkReportInfo> workReportInfos = workReportInfoManager .findByIds(selectedItem); workReportInfoManager.removeAll(workReportInfos); messageHelper.addFlashMessage(redirectAttributes, "core.success.delete", "删除成功"); return "redirect:/pim/work-report-info-list.do"; } @RequestMapping("work-report-info-export") public void export(@ModelAttribute Page page, @RequestParam Map<String, Object> parameterMap, HttpServletRequest request, HttpServletResponse response) throws Exception { String userId = currentUserHolder.getUserId(); List<PropertyFilter> propertyFilters = PropertyFilter .buildFromMap(parameterMap); propertyFilters.add(new PropertyFilter("EQS_userId", userId)); page = workReportInfoManager.pagedQuery(page, propertyFilters); List<WorkReportInfo> workReportInfos = (List<WorkReportInfo>) page .getResult(); TableModel tableModel = new TableModel(); tableModel.setName("pim info"); tableModel.addHeaders("id", "name"); tableModel.setData(workReportInfos); exportor.export(request, response, tableModel); } @RequestMapping("work-report-info-download") @ResponseBody public String download(@RequestParam("id") Long id) throws Exception { List<WorkReportAttachment> workReportAttachments = workReportAttachmentManager .findBy("workReportInfo.id", id); Map<String, Object> data = new HashMap<String, Object>(); List<Map<String, Object>> files = new ArrayList<Map<String, Object>>(); data.put("files", files); for (WorkReportAttachment workReportAttachment : workReportAttachments) { Map<String, Object> map = new HashMap<String, Object>(); files.add(map); map.put("name", workReportAttachment.getName()); map.put("url", "work-report-info-image.do?id=" + workReportAttachment.getId()); // map.put("thumbnailUrl", "./rs/cms/image?key=" + storeDto.getKey()); } return jsonMapper.toJson(data); } @RequestMapping("work-report-info-upload") @ResponseBody public String upload(@RequestParam("id") Long id, @RequestParam("files[]") MultipartFile attachment) throws Exception { String tenantId = tenantHolder.getTenantId(); StoreDTO storeDto = storeConnector.saveStore("workReport/attachment", new MultipartFileDataSource(attachment), tenantId); WorkReportInfo workReportInfo = null; if (id != null) { workReportInfo = workReportInfoManager.get(id); } WorkReportAttachment workReportAttachment = new WorkReportAttachment(); workReportAttachment.setWorkReportInfo(workReportInfo); workReportAttachment.setName(attachment.getOriginalFilename()); workReportAttachment.setRef(storeDto.getKey()); workReportAttachmentManager.save(workReportAttachment); Map<String, Object> data = new HashMap<String, Object>(); List<Map<String, Object>> files = new ArrayList<Map<String, Object>>(); data.put("files", files); Map<String, Object> map = new HashMap<String, Object>(); files.add(map); map.put("id", workReportAttachment.getId()); map.put("name", attachment.getOriginalFilename()); // map.put("url", "../rs/cms/image?key=" + storeDto.getKey()); map.put("url", "work-report-info-image.do?id=" + workReportAttachment.getId()); // map.put("thumbnailUrl", "./rs/cms/image?key=" + storeDto.getKey()); return jsonMapper.toJson(data); } @RequestMapping("work-report-info-attachment") public void attachment(@RequestParam("id") Long id, HttpServletRequest request, HttpServletResponse response) throws Exception { String tenantId = tenantHolder.getTenantId(); WorkReportAttachment workReportAttachment = workReportAttachmentManager .get(id); StoreDTO storeDto = storeConnector.getStore("workReport/attachment", workReportAttachment.getRef(), tenantId); ServletUtils.setFileDownloadHeader(request, response, workReportAttachment.getName()); IOUtils.copy(storeDto.getDataSource().getInputStream(), response.getOutputStream()); } // ~ ====================================================================== @Resource public void setWorkReportInfoManager( WorkReportInfoManager workReportInfoManager) { this.workReportInfoManager = workReportInfoManager; } @Resource public void setWorkReportAttachmentManager( WorkReportAttachmentManager workReportAttachmentManager) { this.workReportAttachmentManager = workReportAttachmentManager; } @Resource public void setMessageHelper(MessageHelper messageHelper) { this.messageHelper = messageHelper; } @Resource public void setExportor(Exportor exportor) { this.exportor = exportor; } @Resource public void setCurrentUserHolder(CurrentUserHolder currentUserHolder) { this.currentUserHolder = currentUserHolder; } @Resource public void setTenantHolder(TenantHolder tenantHolder) { this.tenantHolder = tenantHolder; } @Resource public void setStoreConnector(StoreConnector storeConnector) { this.storeConnector = storeConnector; } }