package weaver.interfaces.workflow.action.javacode; import cn.wps.yun.StringUtil; import com.google.common.base.Charsets; import com.google.common.io.ByteSource; import com.icbc.api.internal.apache.http.impl.cookie.S; import org.apache.commons.compress.archivers.zip.ZipArchiveEntry; import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream; import org.apache.commons.lang3.StringUtils; import weaver.conn.RecordSet; import weaver.file.ImageFileManager; import weaver.general.Util; import weaver.hrm.User; import weaver.hrm.company.DepartmentComInfo; import weaver.interfaces.workflow.action.Action; import weaver.general.BaseBean; import weaver.soa.workflow.request.RequestInfo; import java.io.*; import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.text.SimpleDateFormat; import java.time.LocalDate; import java.time.format.DateTimeFormatter; import java.util.*; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; import static java.nio.charset.StandardCharsets.UTF_8; /** * Online custom action interface */ public class Action20231123035106 implements Action{ private static final BaseBean bb = new BaseBean(); private static final String postSQl = ""; private static final String receiptSQL = ""; private static final String queryDocIdSql = "select * from docimagefile docfile " + "left join docdetail doc on docfile.DOCID = doc.ID " + "left join imagefile file on docfile.IMAGEFILEID = file.IMAGEFILEID " + // "left join uf_tssjb tssjb on docfile.DOCID = tssjb.wdid " + "where (doc.docsubject like '%食品%' or doc.docsubject like '%专项%' ) "; private static final String dataEqualSql = "and doc.DOCCREATEDATE = ? "; private static final String dataRangeSql = "and doc.DOCCREATEDATE >= ? and doc.DOCCREATEDATE <= ? "; public String url = ""; public String queryType = ""; public String queryDate = ""; public String startDate = ""; public String endDate = ""; public String deptIds = ""; // public String userNames = ""; public String dirPath = "/opt/weaver/scjgw"; public String postSeccategory = ""; public String receiptSeccategory = ""; @Override public String execute(RequestInfo requestInfo) { writeLog("执行定时任务开始","PushCorn"); writeLog("url",url); writeLog("queryType",queryType); writeLog("queryDate",queryDate); writeLog("startDate",startDate); writeLog("endDate",endDate); writeLog("deptIds",deptIds); // writeLog("userNames",userNames); writeLog("dirPath",dirPath); writeLog("postSeccategory",postSeccategory); writeLog("receiptSeccategory",receiptSeccategory); try { System.setOut(new PrintStream(System.out, true, "UTF-8")); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } writeLog("new String(s.getBytes(UTF_8))",new String("通".getBytes(UTF_8))); writeLog("new String(s.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)", new String("通".getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)); writeLog("new String(s.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8)", new String("通".getBytes(StandardCharsets.UTF_8), Charset.forName("GBK"))); // 假设 s 是 UTF-8 编码的字符串 String s1 = "通"; // 将 s 从 UTF-8 转换为字节数组 byte[] utf8Bytes = s1.getBytes(StandardCharsets.UTF_8); // 将字节数组从 UTF-8 转换为 GBK String gbkString = new String(utf8Bytes, Charset.forName("GBK")); // 打印日志 writeLog("new String(s.getBytes(StandardCharsets.UTF_8), Charset.forName(\"GBK\"))", gbkString); writeLog("new String(s.getBytes(UTF_8))",new String("通报".getBytes(UTF_8))); writeLog("new String(s.getBytes(UTF_8))",new String("关于2023年天津市食品安全抽检监测任务完成情况的通报(第三期).zip".getBytes(UTF_8))); String x= "关于2023年天津市食品安全抽检监测任务完成情况的通报(第三期).zip"; writeLog("utf8Str===>",convertGbkToUtf8(x)); String querySql = queryDocIdSql; //生成人员map final HashMap useridNamemap = new HashMap<>(); RecordSet recordSet = new RecordSet(); // if (!StringUtil.isEmpty(deptIds)) { // querySql = querySql + "and doc.docdepartmentid in (" + deptIds + " )"; // // String[] deptids = deptIds.split(","); // // String[] usernames = deptIds.split(","); // // for (int i = 0; i < userids.length; i++) { // // useridNamemap.put(userids[i],usernames[i]); // // } // }else { // return; // } // List childNodeIds = getChildNodeIds(postSeccategory); // childNodeIds.add(postSeccategory); // List childNodeIds1 = getChildNodeIds(receiptSeccategory); // childNodeIds1.add(receiptSeccategory); // childNodeIds.addAll(childNodeIds1); //添加目录 // querySql = querySql + "and ( seccategory in ( "+ String.join(",",childNodeIds)+" ) )" ; //查询指定天的 // if ("0".equals(queryType)) { // writeLog("查询指定天的文档"); // querySql = querySql + dataEqualSql; // recordSet.executeQuery(querySql, queryDate); // } else if ("1".equals(queryType)) { // writeLog("查询指定范围的文档",startDate,endDate); // querySql = querySql + dataRangeSql; // recordSet.executeQuery(querySql, startDate, endDate); // } else if ("2".equals(queryType)) { // writeLog("查询昨天的文档"); // querySql = querySql + dataEqualSql; // recordSet.executeQuery(querySql, getYesterdayDateStr()); // } recordSet.executeQuery(querySql); writeLog("查询sql",querySql); writeLog("查询sql",recordSet.getExceptionMsg()); writeLog("查询数量", recordSet.getCounts()+""); //开始推送数据 //检查文件夹路径 checkAndCreateDir(); HashMap docid_docNameMap = new HashMap<>(); HashMap> docid_imagefilleIdMap = new HashMap<>(); HashMap> fileinfo = new HashMap<>(); while (recordSet.next()){ //文档id String docid = weaver.general.Util.null2String(recordSet.getString("DOCID")); //文档标题 String docsubject = weaver.general.Util.null2String(recordSet.getString("docsubject")); //附件id String imagefileid = weaver.general.Util.null2String(recordSet.getString("IMAGEFILEID")); //文档时间 String DOCCREATEDATE = weaver.general.Util.null2String(recordSet.getString("DOCCREATEDATE")); //目录 seccategory String seccategory = weaver.general.Util.null2String(recordSet.getString("seccategory")); String DOCCREATERID = weaver.general.Util.null2String(recordSet.getString("DOCCREATERID")); HashMap map = new HashMap<>(); map.put("DOCCREATEDATE",DOCCREATEDATE); map.put("seccategory",postSeccategory.equals(seccategory) ? "2" : "1"); map.put("DOCCREATERID",new User(Util.getIntValue(DOCCREATERID)).getLastname() ); docid_docNameMap.put(docid,docsubject); fileinfo.put(docid,map); List imagefilleIdList = docid_imagefilleIdMap.get(docid); if (imagefilleIdList == null){ ArrayList filleIdList = new ArrayList<>(); filleIdList.add(imagefileid); docid_imagefilleIdMap.put(docid,filleIdList); }else { imagefilleIdList.add(imagefileid); } } writeLog("需要推送的文档",docid_docNameMap.toString()); // 开始封装文件 String DateDirFile = ""; if(docid_docNameMap.keySet().size() > 0 ){ // 创建今天的文件夹 DateDirFile = checkAndCreateDir(getTodayDateStr()); }else { return ""; } String finalDateDirFile = DateDirFile; writeLog("今天的文件目录",DateDirFile); writeLog("docid_imagefilleIdMap",docid_imagefilleIdMap.toString()); docid_imagefilleIdMap.forEach((docid, filleIdList)->{ String FileDir = docid_docNameMap.get(docid); String FileDir2 = new String(FileDir.getBytes(UTF_8)); writeLog("编码修改前 FileDir",FileDir); writeLog("编码修改后 FileDir2",FileDir2); String zipFileName = finalDateDirFile + File.separator + docid +".zip"; //修改下编码 String zipFileName2 = new String(zipFileName.getBytes(StandardCharsets.UTF_8)); String zipFileName3 = null; try { // zipFileName.getBytes(UTF_8) zipFileName3 = new String(zipFileName.getBytes("GBK"), UTF_8); } catch (Exception e) { e.printStackTrace(); } writeLog("编码修改前 zipFileName",zipFileName); writeLog("编码修改后 zipFileName",zipFileName2); writeLog("编码修改后 zipFileName3",zipFileName3); File filezip = new File(new String(zipFileName.getBytes(UTF_8))); byte[] folderBytes = new byte[0]; // 假设原始编码是GBK try { folderBytes = zipFileName.getBytes("GBK"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } String encodedFolderName = new String(folderBytes, Charset.defaultCharset()); writeLog("编码修改后 encodedFolderName",encodedFolderName); ZipArchiveOutputStream zos =null; writeLog("filezip",zipFileName); try { zos = new ZipArchiveOutputStream( new FileOutputStream(filezip)); zos.setEncoding("UTF-8"); for (String filleId : filleIdList) { ImageFileManager ifm = new ImageFileManager(); ifm.getImageFileInfoById(Integer.parseInt(filleId)); InputStream imagefile = ifm.getInputStream(); // String s1 = ifm.getImageFileName().split(".")[0]; writeLog("压缩文件",ifm.getImageFileName()); addInputStreamToZip(imagefile,zos,FileDir+File.separator+ifm.getImageFileName()); } } catch (FileNotFoundException e) { writeLog("压缩文件异常",e.toString()); e.printStackTrace(); } catch (IOException e) { writeLog("压缩文件异常",e.toString()); e.printStackTrace(); }catch (Exception e){ writeLog("压缩文件异常",e.toString()); e.printStackTrace(); }finally { try { zos.close(); } catch (IOException e) { e.printStackTrace(); } } writeLog("压缩完文件名",filezip.getName()); String s = "通.zip"; String convertedString =""; try { byte[] bytes = StringUtils.getBytes(s, "UTF-8"); // 使用Guava转换编码 ByteSource byteSource = ByteSource.wrap(s.getBytes(Charsets.UTF_8)); byte[] gbkBytes = byteSource.asCharSource(Charsets.UTF_8).asByteSource(Charsets.UTF_8).read(); // String gbkString = new String(gbkBytes, "GBK"); } catch (UnsupportedEncodingException e) { } catch (IOException e) { e.printStackTrace(); } // filezip.renameTo(new File(convertedString)); // HashMap map = fileinfo.get(docid); //开始推送数据 // try { // String s = ApiClient.callApi(url, docid, docid_docNameMap.get(docid), map.get("DOCCREATEDATE"), // map.get("seccategory"), map.get("DOCCREATERID"), filezip); // writeLog("返回数据",s); // } catch (IOException e) { // e.printStackTrace(); // writeLog(e.getMessage()); // writeLog(e.getMessage()); // } }); return ""; } private static String getTodayDateStr() { // 获取当前日期 LocalDate today = LocalDate.now(); // 定义日期格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyyMMdd"); // 将昨天的日期格式化为字符串 return today.format(formatter); } private static String getYesterdayDateStr() { // 获取当前日期 LocalDate today = LocalDate.now(); // 减去一天得到前一天的日期 LocalDate yesterday = today.minusDays(1); // 定义日期格式 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); // 将昨天的日期格式化为字符串 return yesterday.format(formatter); } private static void writeLog(String... log) { StringBuilder logStr = new StringBuilder(); for (String s : log) { logStr.append("|").append(s); } bb.writeLog("PushCornTest.class"+"==>"+logStr); } private void checkAndCreateDir(){ // 创建File对象 File directory = new File(dirPath); // 检查路径是否存在 if (!directory.exists()) { // 不存在,尝试创建多级目录 boolean result = directory.mkdirs(); if (result) { writeLog("多级目录已创建成功:" + dirPath); } else { writeLog("目录创建失败,请检查路径是否正确,或者程序是否有相应的权限。"); } } else { writeLog("目录已存在:" + dirPath); } } private String checkAndCreateDir(String date){ // 创建File对象 File directory = new File(dirPath+File.separator+date); // 检查路径是否存在 if (!directory.exists()) { // 不存在,尝试创建多级目录 boolean result = directory.mkdirs(); if (result) { writeLog("多级目录已创建成功:" + dirPath+File.separator+date); } else { writeLog(dirPath+File.separator+date,"目录创建失败,请检查路径是否正确,或者程序是否有相应的权限。"); return "-1"; } } else { writeLog("目录已存在:" + dirPath+File.separator+date); } return dirPath+File.separator+date; } public void addInputStreamToZip(InputStream inputStream, ZipArchiveOutputStream zos, String entryName) throws IOException { writeLog("编码修改后 entryName",entryName); ZipArchiveEntry zipEntry = new ZipArchiveEntry(entryName); zos.putArchiveEntry(zipEntry); byte[] buffer = new byte[1024]; int length; while ((length = inputStream.read(buffer)) > 0) { zos.write(buffer, 0, length); } inputStream.close(); zos.closeArchiveEntry(); } public static List getChildNodeIds(String parentId) { String sql = "SELECT id FROM docseccategory WHERE parentid = ?"; List childIds = new ArrayList<>(); RecordSet rs = new RecordSet(); rs.executeQuery(sql , parentId); while (rs.next()) { String id = rs.getString("id"); childIds.add(id); childIds.addAll(getChildNodeIds(id)); // 递归调用以获取所有后代节点 } return childIds; } public static String convertGbkToUtf8(String gbkStr) { // 将GBK字符串转换为Unicode String unicodeStr = new String(gbkStr.getBytes(Charset.forName("GBK")), Charset.forName("UTF-8")); // 从Unicode转换为UTF-8 byte[] utf8Bytes = unicodeStr.getBytes(Charset.forName("UTF-8")); return new String(utf8Bytes, Charset.forName("UTF-8")); } public static String toUnicodeString(String str) { StringBuilder unicode = new StringBuilder(); for (int i = 0; i < str.length(); i++) { unicode.append(String.format("\\u%04X", (int) str.charAt(i))); } return unicode.toString(); } public static String unicodeToUtf8(String unicodeStr) { String stringFromUnicode = unicodeStr.replace("\\u", ""); byte[] utf8Bytes = new byte[stringFromUnicode.length() / 2]; for (int i = 0; i < stringFromUnicode.length(); i += 2) { int value = Integer.parseInt(stringFromUnicode.substring(i, i + 2), 16); utf8Bytes[i / 2] = (byte) value; } return new String(utf8Bytes, StandardCharsets.UTF_8); } }