package cn.com.goldenwater.dcproj.service.impl.offline; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.constValue.BisInspEnum; import cn.com.goldenwater.dcproj.dao.BisInspOffLineDao; import cn.com.goldenwater.dcproj.dao.BisInspPblmDao; import cn.com.goldenwater.dcproj.dao.GwComFileDao; import cn.com.goldenwater.dcproj.model.*; import cn.com.goldenwater.dcproj.param.BisInspOffLineParam; import cn.com.goldenwater.dcproj.param.GwComFileParam; import cn.com.goldenwater.dcproj.service.BisInspOffLineService; import cn.com.goldenwater.dcproj.service.GwComFileService; import cn.com.goldenwater.dcproj.utils.FileUtil; import cn.com.goldenwater.id.util.UuidUtil; import com.fasterxml.jackson.core.type.TypeReference; import com.fasterxml.jackson.databind.DeserializationFeature; import com.fasterxml.jackson.databind.ObjectMapper; import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; 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 org.springframework.web.multipart.MultipartFile; import java.io.*; import java.nio.charset.Charset; import java.util.Calendar; import java.util.Date; import java.util.List; import java.util.zip.ZipEntry; import java.util.zip.ZipInputStream; /** * @author lhc * @date 2019/11/18 11:28 */ @Service @Transactional public class BisInspOffLineServiceImpl extends AbstractCrudService implements BisInspOffLineService { private Logger logger = LoggerFactory.getLogger(getClass()); @Autowired BisInspOffLineDao bisInspOffLineDao; @Value("${off.line}") private String offLine; @Autowired BisInspOffLineFactory bisInspOffLineFactory; @Autowired GwComFileDao gwComFileDao; @Autowired BisInspPblmDao bisInspPblmDao; @Autowired private GwComFileService gwComFileService;//文件操作 @Value("${getFile.prefix}") public String prefix; public BisInspOffLineServiceImpl(BisInspOffLineDao bisInspOffLineDao) { super(bisInspOffLineDao); this.bisInspOffLineDao = bisInspOffLineDao; } @Override public int insert(BisInspOffLine bisInspOffLine) { return this.bisInspOffLineDao.insert(bisInspOffLine); } @Override public int update(BisInspOffLine bisInspOffLine) { return this.bisInspOffLineDao.update(bisInspOffLine); } @Override public int delete(String id) { return this.bisInspOffLineDao.delete(id); } @Override public BisInspOffLine uploadOffLine(MultipartFile file, BisInspOffLine bisInspOffLine) throws IOException, ClassNotFoundException { Calendar dat = Calendar.getInstance(); String dirPath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH); //上传文件 String uuid = UuidUtil.uuid(); bisInspOffLine.setId(uuid); bisInspOffLine.setIntm(new Date()); bisInspOffLine.setUptm(new Date()); bisInspOffLine.setDataStat("0"); //插入上传记录 this.insert(bisInspOffLine); String fileDir = offLine + File.separator + dirPath + File.separator + uuid; //解压文件 saveAndUnZip(uuid, fileDir, file.getOriginalFilename(), file); //读取文件目录 txt文件 File dirFiles = new File(fileDir); String[] filelist = FileUtil.getFileExt(dirFiles, ".txt"); for (int i = 0; i < filelist.length; i++) { //序列化对象 ObjectMapper mapper = new ObjectMapper(); mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); BisInspOffLineObj bisInspOffLineObj = mapper.readValue(new File(fileDir + File.separator + filelist[i]), BisInspOffLineObj.class); bisInspOffLineObj.setId(UuidUtil.uuid()); bisInspOffLineObj.setPersId(bisInspOffLine.getPersId()); bisInspOffLineObj.setOrgId(bisInspOffLine.getOrgId()); bisInspOffLineObj.setProvince(bisInspOffLine.getProvince()); bisInspOffLineObj.setOrgId(bisInspOffLine.getOrgId()); //调用工厂分发到不同对象处理 BisInspOffLineRet bisInspOffLineRet = bisInspOffLineFactory.CreateProcess(BisInspEnum.getEnumByType(bisInspOffLine.getPtype())).process(bisInspOffLineObj, fileDir); //统一处理问题 processPblm(bisInspOffLineRet, bisInspOffLineObj, fileDir); //统一处理 签名上传及视频 processSignFile(bisInspOffLineRet, bisInspOffLineObj, fileDir); } return bisInspOffLine; } /** * 插入签名的图片和视频 */ void processSignFile(BisInspOffLineRet bisInspOffLineRet, BisInspOffLineObj bisInspOffLineObj, String fileDir) throws IOException { ObjectMapper om = new ObjectMapper(); om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); if (bisInspOffLineObj.getSign() != null) { List gwComFileList = om.readValue(bisInspOffLineObj.getSign(), new TypeReference>() { }); if (gwComFileList != null) { for (GwComFile item : gwComFileList) { //插入图片信息 到通用表 修改bizId,并获取bizType //文件类型转换 String imgId = item.getId(); File file = new File(fileDir + File.separator + item.getId()); if (file.exists()) { MultipartFile multipartFile = FileUtil.fileToMultipartFile(file); //保存文件管理Id String uuid = UuidUtil.uuid(); // 生成uuid item.setId(uuid); String bizId = ""; if (item.getBizType().startsWith("signature")) { bizId = bisInspOffLineRet.getRegId() + bisInspOffLineObj.getOrgId(); } else { bizId = bisInspOffLineRet.getRegId(); } item.setBizId(bizId); Calendar dat = Calendar.getInstance(); if (null == item.getCreateDate()) { item.setCreateDate(Calendar.getInstance().getTime()); } if (multipartFile != null) { String originalFilename = multipartFile.getOriginalFilename(); item.setFileName(originalFilename); item.setFileTitle(StringUtils.isNotBlank(item.getFileTitle()) ? item.getFileTitle() : item.getFileName()); item.setFileSize((double) multipartFile.getSize()); item.setFileExt(originalFilename.substring(1 + originalFilename.lastIndexOf("."))); String filePath = prefix + dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH) + File.separator + uuid + "." + item.getFileExt(); item.setFilePath(filePath); } //写入文件 String filePath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH); boolean success = gwComFileService.writeFile(item, multipartFile, filePath); if (success) { int ret = 0; if (item.getBizType().startsWith("signature")) { //判断是否有,如果有就更新 GwComFileParam gwComFileParam = new GwComFileParam(); gwComFileParam.setBizId(item.getBizId()); gwComFileParam.setBizType(item.getBizType()); List gwComFiles = gwComFileService.findList(gwComFileParam); if (gwComFiles != null && gwComFiles.size() > 0) { gwComFileService.delete(item.getId()); ret = gwComFileService.insert(item); } else { ret = gwComFileService.insert(item); } } else { ret=gwComFileService.insert(item); } } } } } } } /** * 统一处理 插入问题信息 * * @param bisInspOffLineObj * @param fileDir * @param objId * @param om * @throws IOException * @Param bisInspOffLineRet 返回的登记ID objId */ void processPblm(BisInspOffLineRet bisInspOffLineRet, BisInspOffLineObj bisInspOffLineObj, String fileDir) throws IOException { ObjectMapper om = new ObjectMapper(); om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false); if (bisInspOffLineObj.getProblem() != null) { List bisInspPblmList = om.readValue(bisInspOffLineObj.getProblem(), new TypeReference>() { }); if (bisInspPblmList != null) { for (BisInspPblm bisInspPblm : bisInspPblmList) { String pblmId = UuidUtil.uuid(); bisInspPblm.setInspGroupId(bisInspOffLineObj.getGroupId()); bisInspPblm.setRegid(bisInspOffLineRet.getRegId()); bisInspPblm.setPblmId(pblmId); bisInspPblm.setObjId(bisInspOffLineRet.getObjId()); bisInspPblm.setUptm(new Date()); bisInspPblm.setCollTime(new Date()); bisInspPblmDao.insert(bisInspPblm); //插入附件信息 insertFile(bisInspPblm, fileDir, pblmId); } } } } void insertFile(BisInspPblm bisInspPblm, String fileDir, String pblmId) throws IOException { if (bisInspPblm.getGwComFiles() != null) { for (GwComFile gwComFile : bisInspPblm.getGwComFiles()) { //文件类型转换 String imgId = gwComFile.getId(); File file = new File(fileDir + File.separator + gwComFile.getId()); if (file.exists()) { MultipartFile multipartFile = FileUtil.fileToMultipartFile(file); //保存文件管理Id String uuid = UuidUtil.uuid(); // 生成uuid gwComFile.setId(uuid); gwComFile.setBizId(pblmId); Calendar dat = Calendar.getInstance(); if (null == gwComFile.getCreateDate()) { gwComFile.setCreateDate(Calendar.getInstance().getTime()); } if (multipartFile != null) { String originalFilename = multipartFile.getOriginalFilename(); gwComFile.setFileName(originalFilename); gwComFile.setFileTitle(StringUtils.isNotBlank(gwComFile.getFileTitle()) ? gwComFile.getFileTitle() : gwComFile.getFileName()); gwComFile.setFileSize((double) multipartFile.getSize()); gwComFile.setFileExt(originalFilename.substring(1 + originalFilename.lastIndexOf("."))); String filePath = prefix + dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH) + File.separator + uuid + "." + gwComFile.getFileExt(); gwComFile.setFilePath(filePath); } //写入文件 String filePath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH); boolean success = gwComFileService.writeFile(gwComFile, multipartFile, filePath); if (success) { int ret = gwComFileService.insert(gwComFile); } } } } } @Override public Object offLineRlation(BisInspOffLine bisInspOffLine) { return bisInspOffLineFactory.createBaseInfo(BisInspEnum.getEnumByType(bisInspOffLine.getPtype())).getBaseInfo(bisInspOffLine); } public void saveAndUnZip(String id, String dirPath, String fileName, MultipartFile file) throws IOException { File pathFile = new File(dirPath); if (!pathFile.exists()) { pathFile.mkdirs(); } //插入zip记录 GwComFile zipGwComFile = new GwComFile(); zipGwComFile.setId(UuidUtil.uuid()); zipGwComFile.setBizId(id); zipGwComFile.setCreateDate(Calendar.getInstance().getTime()); zipGwComFile.setFileTitle(fileName); zipGwComFile.setFileName(fileName); zipGwComFile.setFileSize((double) file.getSize()); zipGwComFile.setFileExt(fileName.substring(1 + fileName.lastIndexOf("."))); String filePath = zipGwComFile.getId() + "." + zipGwComFile.getFileExt(); zipGwComFile.setFilePath(filePath); gwComFileDao.insert(zipGwComFile); //保存zip FileUtils.copyInputStreamToFile(file.getInputStream(), new File(dirPath, id + "." + zipGwComFile.getFileExt())); //解压zip ZipInputStream zpIs = new ZipInputStream(file.getInputStream(), Charset.forName(cn.com.goldenwater.dcproj.utils.impexcel.FileUtil.getFilecharset(file))); ZipEntry ze = null; while ((ze = zpIs.getNextEntry()) != null) { if (ze.isDirectory() || ze.getName().endsWith("/")) { //暂时不处理压缩包里有文件夹这种形式 continue; } GwComFile gwComFile = cn.com.goldenwater.dcproj.utils.impexcel.FileUtil.getGwComFile(ze.getName(), (double) ze.getSize(), ""); ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); byte[] byte_s = new byte[1024]; int num = -1; while ((num = zpIs.read(byte_s, 0, byte_s.length)) > -1) {//通过read方法来读取文件内容 byteArrayOutputStream.write(byte_s, 0, num); } File outFile = new File(dirPath, gwComFile.getFileName()); FileOutputStream fileOutputStream = new FileOutputStream(outFile); fileOutputStream.write(byteArrayOutputStream.toByteArray()); byteArrayOutputStream.close(); fileOutputStream.close(); } zpIs.close(); } }