e54b8aa0fdec4ad5353000bfdaf789e80c5e48d5.svn-base 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. package cn.com.goldenwater.dcproj.service.impl.offline;
  2. import cn.com.goldenwater.core.service.AbstractCrudService;
  3. import cn.com.goldenwater.dcproj.constValue.BisInspEnum;
  4. import cn.com.goldenwater.dcproj.dao.BisInspOffLineDao;
  5. import cn.com.goldenwater.dcproj.dao.BisInspPblmDao;
  6. import cn.com.goldenwater.dcproj.dao.GwComFileDao;
  7. import cn.com.goldenwater.dcproj.model.*;
  8. import cn.com.goldenwater.dcproj.param.BisInspOffLineParam;
  9. import cn.com.goldenwater.dcproj.param.GwComFileParam;
  10. import cn.com.goldenwater.dcproj.service.BisInspOffLineService;
  11. import cn.com.goldenwater.dcproj.service.GwComFileService;
  12. import cn.com.goldenwater.dcproj.utils.FileUtil;
  13. import cn.com.goldenwater.id.util.UuidUtil;
  14. import com.fasterxml.jackson.core.type.TypeReference;
  15. import com.fasterxml.jackson.databind.DeserializationFeature;
  16. import com.fasterxml.jackson.databind.ObjectMapper;
  17. import org.apache.commons.io.FileUtils;
  18. import org.apache.commons.lang3.StringUtils;
  19. import org.slf4j.Logger;
  20. import org.slf4j.LoggerFactory;
  21. import org.springframework.beans.factory.annotation.Autowired;
  22. import org.springframework.beans.factory.annotation.Value;
  23. import org.springframework.stereotype.Service;
  24. import org.springframework.transaction.annotation.Transactional;
  25. import org.springframework.web.multipart.MultipartFile;
  26. import java.io.*;
  27. import java.nio.charset.Charset;
  28. import java.util.Calendar;
  29. import java.util.Date;
  30. import java.util.List;
  31. import java.util.zip.ZipEntry;
  32. import java.util.zip.ZipInputStream;
  33. /**
  34. * @author lhc
  35. * @date 2019/11/18 11:28
  36. */
  37. @Service
  38. @Transactional
  39. public class BisInspOffLineServiceImpl extends AbstractCrudService<BisInspOffLine, BisInspOffLineParam> implements BisInspOffLineService {
  40. private Logger logger = LoggerFactory.getLogger(getClass());
  41. @Autowired
  42. BisInspOffLineDao bisInspOffLineDao;
  43. @Value("${off.line}")
  44. private String offLine;
  45. @Autowired
  46. BisInspOffLineFactory bisInspOffLineFactory;
  47. @Autowired
  48. GwComFileDao gwComFileDao;
  49. @Autowired
  50. BisInspPblmDao bisInspPblmDao;
  51. @Autowired
  52. private GwComFileService gwComFileService;//文件操作
  53. @Value("${getFile.prefix}")
  54. public String prefix;
  55. public BisInspOffLineServiceImpl(BisInspOffLineDao bisInspOffLineDao) {
  56. super(bisInspOffLineDao);
  57. this.bisInspOffLineDao = bisInspOffLineDao;
  58. }
  59. @Override
  60. public int insert(BisInspOffLine bisInspOffLine) {
  61. return this.bisInspOffLineDao.insert(bisInspOffLine);
  62. }
  63. @Override
  64. public int update(BisInspOffLine bisInspOffLine) {
  65. return this.bisInspOffLineDao.update(bisInspOffLine);
  66. }
  67. @Override
  68. public int delete(String id) {
  69. return this.bisInspOffLineDao.delete(id);
  70. }
  71. @Override
  72. public BisInspOffLine uploadOffLine(MultipartFile file, BisInspOffLine bisInspOffLine) throws IOException, ClassNotFoundException {
  73. Calendar dat = Calendar.getInstance();
  74. String dirPath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH);
  75. //上传文件
  76. String uuid = UuidUtil.uuid();
  77. bisInspOffLine.setId(uuid);
  78. bisInspOffLine.setIntm(new Date());
  79. bisInspOffLine.setUptm(new Date());
  80. bisInspOffLine.setDataStat("0");
  81. //插入上传记录
  82. this.insert(bisInspOffLine);
  83. String fileDir = offLine + File.separator + dirPath + File.separator + uuid;
  84. //解压文件
  85. saveAndUnZip(uuid, fileDir, file.getOriginalFilename(), file);
  86. //读取文件目录 txt文件
  87. File dirFiles = new File(fileDir);
  88. String[] filelist = FileUtil.getFileExt(dirFiles, ".txt");
  89. for (int i = 0; i < filelist.length; i++) {
  90. //序列化对象
  91. ObjectMapper mapper = new ObjectMapper();
  92. mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  93. BisInspOffLineObj bisInspOffLineObj = mapper.readValue(new File(fileDir + File.separator + filelist[i]), BisInspOffLineObj.class);
  94. bisInspOffLineObj.setId(UuidUtil.uuid());
  95. bisInspOffLineObj.setPersId(bisInspOffLine.getPersId());
  96. bisInspOffLineObj.setOrgId(bisInspOffLine.getOrgId());
  97. bisInspOffLineObj.setProvince(bisInspOffLine.getProvince());
  98. bisInspOffLineObj.setOrgId(bisInspOffLine.getOrgId());
  99. //调用工厂分发到不同对象处理
  100. BisInspOffLineRet bisInspOffLineRet = bisInspOffLineFactory.CreateProcess(BisInspEnum.getEnumByType(bisInspOffLine.getPtype())).process(bisInspOffLineObj, fileDir);
  101. //统一处理问题
  102. processPblm(bisInspOffLineRet, bisInspOffLineObj, fileDir);
  103. //统一处理 签名上传及视频
  104. processSignFile(bisInspOffLineRet, bisInspOffLineObj, fileDir);
  105. }
  106. return bisInspOffLine;
  107. }
  108. /**
  109. * 插入签名的图片和视频
  110. */
  111. void processSignFile(BisInspOffLineRet bisInspOffLineRet, BisInspOffLineObj bisInspOffLineObj, String fileDir) throws IOException {
  112. ObjectMapper om = new ObjectMapper();
  113. om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  114. if (bisInspOffLineObj.getSign() != null) {
  115. List<GwComFile> gwComFileList = om.readValue(bisInspOffLineObj.getSign(), new TypeReference<List<GwComFile>>() {
  116. });
  117. if (gwComFileList != null) {
  118. for (GwComFile item : gwComFileList) {
  119. //插入图片信息 到通用表 修改bizId,并获取bizType
  120. //文件类型转换
  121. String imgId = item.getId();
  122. File file = new File(fileDir + File.separator + item.getId());
  123. if (file.exists()) {
  124. MultipartFile multipartFile = FileUtil.fileToMultipartFile(file);
  125. //保存文件管理Id
  126. String uuid = UuidUtil.uuid(); // 生成uuid
  127. item.setId(uuid);
  128. String bizId = "";
  129. if (item.getBizType().startsWith("signature")) {
  130. bizId = bisInspOffLineRet.getRegId() + bisInspOffLineObj.getOrgId();
  131. } else {
  132. bizId = bisInspOffLineRet.getRegId();
  133. }
  134. item.setBizId(bizId);
  135. Calendar dat = Calendar.getInstance();
  136. if (null == item.getCreateDate()) {
  137. item.setCreateDate(Calendar.getInstance().getTime());
  138. }
  139. if (multipartFile != null) {
  140. String originalFilename = multipartFile.getOriginalFilename();
  141. item.setFileName(originalFilename);
  142. item.setFileTitle(StringUtils.isNotBlank(item.getFileTitle()) ? item.getFileTitle() : item.getFileName());
  143. item.setFileSize((double) multipartFile.getSize());
  144. item.setFileExt(originalFilename.substring(1 + originalFilename.lastIndexOf(".")));
  145. 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();
  146. item.setFilePath(filePath);
  147. }
  148. //写入文件
  149. String filePath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH);
  150. boolean success = gwComFileService.writeFile(item, multipartFile, filePath);
  151. if (success) {
  152. int ret = 0;
  153. if (item.getBizType().startsWith("signature")) {
  154. //判断是否有,如果有就更新
  155. GwComFileParam gwComFileParam = new GwComFileParam();
  156. gwComFileParam.setBizId(item.getBizId());
  157. gwComFileParam.setBizType(item.getBizType());
  158. List<GwComFile> gwComFiles = gwComFileService.findList(gwComFileParam);
  159. if (gwComFiles != null && gwComFiles.size() > 0) {
  160. gwComFileService.delete(item.getId());
  161. ret = gwComFileService.insert(item);
  162. } else {
  163. ret = gwComFileService.insert(item);
  164. }
  165. } else {
  166. ret=gwComFileService.insert(item);
  167. }
  168. }
  169. }
  170. }
  171. }
  172. }
  173. }
  174. /**
  175. * 统一处理 插入问题信息
  176. *
  177. * @param bisInspOffLineObj
  178. * @param fileDir
  179. * @param objId
  180. * @param om
  181. * @throws IOException
  182. * @Param bisInspOffLineRet 返回的登记ID objId
  183. */
  184. void processPblm(BisInspOffLineRet bisInspOffLineRet, BisInspOffLineObj bisInspOffLineObj, String fileDir) throws
  185. IOException {
  186. ObjectMapper om = new ObjectMapper();
  187. om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
  188. if (bisInspOffLineObj.getProblem() != null) {
  189. List<BisInspPblm> bisInspPblmList = om.readValue(bisInspOffLineObj.getProblem(), new TypeReference<List<BisInspPblm>>() {
  190. });
  191. if (bisInspPblmList != null) {
  192. for (BisInspPblm bisInspPblm : bisInspPblmList) {
  193. String pblmId = UuidUtil.uuid();
  194. bisInspPblm.setInspGroupId(bisInspOffLineObj.getGroupId());
  195. bisInspPblm.setRegid(bisInspOffLineRet.getRegId());
  196. bisInspPblm.setPblmId(pblmId);
  197. bisInspPblm.setObjId(bisInspOffLineRet.getObjId());
  198. bisInspPblm.setUptm(new Date());
  199. bisInspPblm.setCollTime(new Date());
  200. bisInspPblmDao.insert(bisInspPblm);
  201. //插入附件信息
  202. insertFile(bisInspPblm, fileDir, pblmId);
  203. }
  204. }
  205. }
  206. }
  207. void insertFile(BisInspPblm bisInspPblm, String fileDir, String pblmId) throws IOException {
  208. if (bisInspPblm.getGwComFiles() != null) {
  209. for (GwComFile gwComFile : bisInspPblm.getGwComFiles()) {
  210. //文件类型转换
  211. String imgId = gwComFile.getId();
  212. File file = new File(fileDir + File.separator + gwComFile.getId());
  213. if (file.exists()) {
  214. MultipartFile multipartFile = FileUtil.fileToMultipartFile(file);
  215. //保存文件管理Id
  216. String uuid = UuidUtil.uuid(); // 生成uuid
  217. gwComFile.setId(uuid);
  218. gwComFile.setBizId(pblmId);
  219. Calendar dat = Calendar.getInstance();
  220. if (null == gwComFile.getCreateDate()) {
  221. gwComFile.setCreateDate(Calendar.getInstance().getTime());
  222. }
  223. if (multipartFile != null) {
  224. String originalFilename = multipartFile.getOriginalFilename();
  225. gwComFile.setFileName(originalFilename);
  226. gwComFile.setFileTitle(StringUtils.isNotBlank(gwComFile.getFileTitle()) ? gwComFile.getFileTitle() : gwComFile.getFileName());
  227. gwComFile.setFileSize((double) multipartFile.getSize());
  228. gwComFile.setFileExt(originalFilename.substring(1 + originalFilename.lastIndexOf(".")));
  229. 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();
  230. gwComFile.setFilePath(filePath);
  231. }
  232. //写入文件
  233. String filePath = dat.get(Calendar.YEAR) + File.separator + (dat.get(Calendar.MONTH) + 1) + File.separator + dat.get(Calendar.DAY_OF_MONTH);
  234. boolean success = gwComFileService.writeFile(gwComFile, multipartFile, filePath);
  235. if (success) {
  236. int ret = gwComFileService.insert(gwComFile);
  237. }
  238. }
  239. }
  240. }
  241. }
  242. @Override
  243. public Object offLineRlation(BisInspOffLine bisInspOffLine) {
  244. return bisInspOffLineFactory.createBaseInfo(BisInspEnum.getEnumByType(bisInspOffLine.getPtype())).getBaseInfo(bisInspOffLine);
  245. }
  246. public void saveAndUnZip(String id, String dirPath, String fileName, MultipartFile file) throws IOException {
  247. File pathFile = new File(dirPath);
  248. if (!pathFile.exists()) {
  249. pathFile.mkdirs();
  250. }
  251. //插入zip记录
  252. GwComFile zipGwComFile = new GwComFile();
  253. zipGwComFile.setId(UuidUtil.uuid());
  254. zipGwComFile.setBizId(id);
  255. zipGwComFile.setCreateDate(Calendar.getInstance().getTime());
  256. zipGwComFile.setFileTitle(fileName);
  257. zipGwComFile.setFileName(fileName);
  258. zipGwComFile.setFileSize((double) file.getSize());
  259. zipGwComFile.setFileExt(fileName.substring(1 + fileName.lastIndexOf(".")));
  260. String filePath = zipGwComFile.getId() + "." + zipGwComFile.getFileExt();
  261. zipGwComFile.setFilePath(filePath);
  262. gwComFileDao.insert(zipGwComFile);
  263. //保存zip
  264. FileUtils.copyInputStreamToFile(file.getInputStream(), new File(dirPath, id + "." + zipGwComFile.getFileExt()));
  265. //解压zip
  266. ZipInputStream zpIs = new ZipInputStream(file.getInputStream(), Charset.forName(cn.com.goldenwater.dcproj.utils.impexcel.FileUtil.getFilecharset(file)));
  267. ZipEntry ze = null;
  268. while ((ze = zpIs.getNextEntry()) != null) {
  269. if (ze.isDirectory() || ze.getName().endsWith("/")) {
  270. //暂时不处理压缩包里有文件夹这种形式
  271. continue;
  272. }
  273. GwComFile gwComFile = cn.com.goldenwater.dcproj.utils.impexcel.FileUtil.getGwComFile(ze.getName(), (double) ze.getSize(), "");
  274. ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
  275. byte[] byte_s = new byte[1024];
  276. int num = -1;
  277. while ((num = zpIs.read(byte_s, 0, byte_s.length)) > -1) {//通过read方法来读取文件内容
  278. byteArrayOutputStream.write(byte_s, 0, num);
  279. }
  280. File outFile = new File(dirPath, gwComFile.getFileName());
  281. FileOutputStream fileOutputStream = new FileOutputStream(outFile);
  282. fileOutputStream.write(byteArrayOutputStream.toByteArray());
  283. byteArrayOutputStream.close();
  284. fileOutputStream.close();
  285. }
  286. zpIs.close();
  287. }
  288. }