package cn.com.goldenwater.dcproj.service.impl.travel; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.constValue.SplitValue; import cn.com.goldenwater.dcproj.dao.BisInspAllDao; import cn.com.goldenwater.dcproj.dao.BisInspTravelPlanDao; import cn.com.goldenwater.dcproj.dao.BisInspTravelPlanPointDao; import cn.com.goldenwater.dcproj.dao.GeneralInfoDao; import cn.com.goldenwater.dcproj.model.AttInteBase; import cn.com.goldenwater.dcproj.model.BisInspAll; import cn.com.goldenwater.dcproj.model.BisInspTravelPlan; import cn.com.goldenwater.dcproj.model.BisInspTravelPlanPoint; import cn.com.goldenwater.dcproj.param.BisInspTravelPlanParam; import cn.com.goldenwater.dcproj.param.BisInspTravelPlanPointParam; import cn.com.goldenwater.dcproj.service.BisInspTravelPlanService; import cn.com.goldenwater.id.util.UuidUtil; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.TemplateException; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.io.*; import java.nio.charset.StandardCharsets; import java.text.SimpleDateFormat; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author lhc * @date 2019-9-17 */ @Service @Transactional public class BisInspTravelPlanServiceImpl extends AbstractCrudService implements BisInspTravelPlanService { @Autowired private BisInspTravelPlanDao bisInspTravelPlanDao; @Autowired private BisInspTravelPlanPointDao bisInspTravelPlanPointDao; @Autowired private GeneralInfoDao generalInfoDao; @Autowired private BisInspAllDao bisInspAllDao; @Value("${export.templatePath}" + "/") private String templatePath; private static final String TEMP_FILE_NAME = "travel.ftl"; @Value("${export.basePath.docx}" + "/") private String tempFilePath; private Configuration configuration; public BisInspTravelPlanServiceImpl(BisInspTravelPlanDao bisInspTravelPlanDao) { super(bisInspTravelPlanDao); this.bisInspTravelPlanDao = bisInspTravelPlanDao; configuration = new Configuration(Configuration.DEFAULT_INCOMPATIBLE_IMPROVEMENTS); configuration.setDefaultEncoding("utf-8"); } @Override public List getMyTravelPlan(String persId) { return bisInspTravelPlanDao.getMyTravelPlan(persId); } @Override public List getTravelByPlanId(String planId) { return bisInspTravelPlanDao.getTravelByPlanId(planId); } @Override public Integer sharePoint(String persId, String travelPlanId) { Integer row = 0; //获取行程下的点标注 BisInspTravelPlanPointParam bisInspTravelPlanPointParam = new BisInspTravelPlanPointParam(); bisInspTravelPlanPointParam.setTravelPlanId(travelPlanId); List bisInspTravelPlanPoints = bisInspTravelPlanPointDao.findList(bisInspTravelPlanPointParam); //插入标注点到收藏点 SimpleDateFormat sdf = new SimpleDateFormat(SplitValue.TIME_SPLIT_SEC); for (BisInspTravelPlanPoint bisInspTravelPlanPoint : bisInspTravelPlanPoints ) { AttInteBase attInteBase = new AttInteBase(); attInteBase.setId(UuidUtil.uuid()); attInteBase.setLgtd(bisInspTravelPlanPoint.getLgtd()); attInteBase.setLttd(bisInspTravelPlanPoint.getLttd()); attInteBase.setInteName(bisInspTravelPlanPoint.getName()); attInteBase.setInteTime(sdf.format(new Date())); attInteBase.setPersid(persId); generalInfoDao.insertInte(attInteBase); row++; } //更新路书已经被收藏 BisInspTravelPlan bisInspTravelPlan = new BisInspTravelPlan(); bisInspTravelPlan.setId(travelPlanId); bisInspTravelPlan.setIsCollect("1"); bisInspTravelPlanDao.update(bisInspTravelPlan); return row; } @Override public String getTravelPlanInfo(String travelPlanId) throws IOException { BisInspTravelPlan bisInspTravelPlan = bisInspTravelPlanDao.getTravelPlanInfo(travelPlanId); Map dataMap = new HashMap<>(); String fileName = UuidUtil.uuid() + ".doc"; String filePath = tempFilePath + "/" + fileName; //获取信息的业务逻辑 dataMap = this.getDataMap(dataMap, bisInspTravelPlan); /* 替换模板 dataMap 要填入模本的数据文件 设置模本装置方法和路径,FreeMarker支持多种模板装载方法。可以从servlet,classpath,数据库装载, 这里我们的模板是放在template包下面 */ configuration.setDirectoryForTemplateLoading(new File(templatePath)); // 通过模板名称获取模板 Template template = configuration.getTemplate(TEMP_FILE_NAME); // 开始装载并输出 if (template != null) { //输出文档路径及名称 File outFile = new File(filePath); Writer out = null; FileOutputStream fos = null; try { fos = new FileOutputStream(outFile); OutputStreamWriter oWriter = new OutputStreamWriter(fos, StandardCharsets.UTF_8); //这个地方对流的编码不可或缺,使用main()单独调用时,应该可以,但是如果是web请求导出时导出后word文档就会打不开,并且包XML文件错误。主要是编码格式不正确,无法解析。 //out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile))); out = new BufferedWriter(oWriter); //向模板里替换数据 template.process(dataMap, out); } catch (FileNotFoundException | TemplateException e) { e.printStackTrace(); } finally { if (out != null) { out.close(); } if (fos != null) { fos.close(); } } } //输出文件到指定路径 return fileName; //return bisInspTravelPlan; } @Override public Integer cancelTravelPlan(String travelPlanId) throws IOException { /** * 取出路书关联的督查组,设置督查组关联路书状态为未关联,再更新路书的计划id和名称为空 * */ BisInspTravelPlan bisInspTravelPlan = bisInspTravelPlanDao.get(travelPlanId); if (StringUtils.isNotBlank(bisInspTravelPlan.getPlanId())) { BisInspAll bisInspAll = new BisInspAll(); bisInspAll.setId(bisInspTravelPlan.getPlanId()); bisInspAll.setIsTravel("0"); bisInspAllDao.update(bisInspAll); } return bisInspTravelPlanDao.cancelTravelPlan(travelPlanId); } private Map getDataMap(Map dataMap, BisInspTravelPlan bisInspTravelPlan) { dataMap.put("title", bisInspTravelPlan.getTitle()); dataMap.put("dayList", bisInspTravelPlan.getBisInspTravelPlanDayList()); dataMap.put("sttm", bisInspTravelPlan.getSttm()); dataMap.put("entm", bisInspTravelPlan.getEntm()); /*List> planDayList = new ArrayList>(); for (BisInspTravelPlanDay bisInspTravelPlanDay : bisInspTravelPlan.getBisInspTravelPlanDayList() ) { Map map = new HashMap(); map.put("dayTitle", bisInspTravelPlanDay.getTitle()); planDayList.add(map); List> planPointList = new ArrayList>(); for (BisInspTravelPlanPoint bisInspTravelPlanPoint : bisInspTravelPlanDay.getBisInspTravelPlanPoints()) { Map mapPoint = new HashMap(); mapPoint.put("pointTitle", bisInspTravelPlanPoint.getName()); mapPoint.put("sttm", bisInspTravelPlanPoint.getSttm() == null ? "" : bisInspTravelPlanPoint.getSttm().toString()); mapPoint.put("entm", bisInspTravelPlanPoint.getEntm() == null ? "" : bisInspTravelPlanPoint.getEntm().toInstant()); planPointList.add(mapPoint); } dataMap.put("pointList", planPointList); } dataMap.put("dayList", planDayList); */ return dataMap; } @Override public int update(BisInspTravelPlan bisInspTravelPlan) { bisInspTravelPlan.setUptm(new Date()); //如果督查组不为空则设置 计划列表对象关联到路书 if (null != bisInspTravelPlan.getPlanId()) { BisInspAll bisInspAll = new BisInspAll(); bisInspAll.setId(bisInspTravelPlan.getPlanId()); bisInspAll.setIsTravel("1"); bisInspAllDao.update(bisInspAll); } return bisInspTravelPlanDao.update(bisInspTravelPlan); } @Override public int delete(String id) { return bisInspTravelPlanDao.delete(id); } @Override public int insert(BisInspTravelPlan bisInspTravelPlan) { /** * 设置时间及其他参数 */ bisInspTravelPlan.setIntm(new Date()); bisInspTravelPlan.setUptm(new Date()); bisInspTravelPlan.setId(UuidUtil.uuid()); bisInspTravelPlan.setDataStat("0"); if (null == bisInspTravelPlan.getSttm()) { bisInspTravelPlan.setSttm(new Date()); } if (null == bisInspTravelPlan.getDayCount()) { bisInspTravelPlan.setDayCount(1); } return bisInspTravelPlanDao.insert(bisInspTravelPlan); } }