diff --git a/yxt-common/yxt-common-base/pom.xml b/yxt-common/yxt-common-base/pom.xml index a7cc522..ff5d339 100644 --- a/yxt-common/yxt-common-base/pom.xml +++ b/yxt-common/yxt-common-base/pom.xml @@ -12,6 +12,7 @@ com.yxt yxt-common-base 0.0.1 + yxt-common-base @@ -175,8 +176,36 @@ jacob 1.18 - + + javax.xml.bind + jaxb-api + 2.3.0 + + + com.sun.xml.bind + jaxb-impl + 2.3.0 + + + org.glassfish.jaxb + jaxb-runtime + 2.3.0 + + + javax.activation + activation + 1.1.1 + - + + + nexus-releases + http://nexus3.yyundong.com/repository/yxt-mvn-releases/ + + + nexus-snapshots + http://nexus3.yyundong.com/repository/yxt-mvn-snapshot/ + + \ No newline at end of file diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/ImageUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/ImageUtils.java index aa3837f..32c65d6 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/ImageUtils.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/ImageUtils.java @@ -1,9 +1,8 @@ package com.yxt.common.base.config.captcha; - +import cn.hutool.core.codec.Base64; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import sun.misc.BASE64Decoder; import java.io.*; @@ -89,12 +88,12 @@ public class ImageUtils { return false; } - BASE64Decoder decoder = new BASE64Decoder(); +// BASE64Decoder decoder = new BASE64Decoder(); OutputStream out = null; try { out = new FileOutputStream(imgFilePath); // Base64解码 - byte[] b = decoder.decodeBuffer(imgData); + byte[] b = Base64.decode(imgData); for (int i = 0; i < b.length; ++i) { // 调整异常数据 if (b[i] < 0) { diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/AbstractCaptcha.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/AbstractCaptcha.java index f65b502..79bc25f 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/AbstractCaptcha.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/AbstractCaptcha.java @@ -1,10 +1,10 @@ package com.yxt.common.base.config.captcha.factory.impl; +import cn.hutool.core.codec.Base64; import com.yxt.common.base.config.captcha.CaptchaBaseParam; import com.yxt.common.base.config.captcha.CaptchaException; import com.yxt.common.core.vo.CaptchaBaseVO; import org.apache.commons.lang3.StringUtils; -import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import java.awt.*; @@ -75,8 +75,7 @@ public abstract class AbstractCaptcha { throw new CaptchaException("ImageIO.write is error", e); } byte[] bytes = baos.toByteArray(); - BASE64Encoder encoder = new sun.misc.BASE64Encoder(); - return encoder.encodeBuffer(bytes).trim(); + return Base64.encode(bytes).trim(); } public String getJigsawUrlOrPath() { diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/BlockPuzzleCaptcha.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/BlockPuzzleCaptcha.java index 615b556..e7fea2e 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/BlockPuzzleCaptcha.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/captcha/factory/impl/BlockPuzzleCaptcha.java @@ -1,12 +1,12 @@ package com.yxt.common.base.config.captcha.factory.impl; +import cn.hutool.core.codec.Base64; import com.alibaba.fastjson.JSON; import com.yxt.common.base.config.captcha.CaptchaBaseParam; import com.yxt.common.base.config.captcha.CaptchaException; import com.yxt.common.core.vo.BlockPuzzleCaptchaVO; import com.yxt.common.core.vo.CaptchaBaseVO; import org.apache.commons.lang3.StringUtils; -import sun.misc.BASE64Encoder; import javax.imageio.ImageIO; import java.awt.*; @@ -87,10 +87,9 @@ public class BlockPuzzleCaptcha extends AbstractCaptcha { // 源图生成遮罩 byte[] oriCopyImages = DealOriPictureByTemplate(originalImage, jigsawImage, x, 0); - BASE64Encoder encoder = new sun.misc.BASE64Encoder(); - dataVO.setOriginalImageBase64(encoder.encode(oriCopyImages)); + dataVO.setOriginalImageBase64(Base64.encode(oriCopyImages)); dataVO.setPoint(point); - dataVO.setJigsawImageBase64(encoder.encode(jigsawImages)); + dataVO.setJigsawImageBase64(Base64.encode(jigsawImages)); return dataVO; } catch (Exception e){ throw new CaptchaException(e); diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java index 0b9e8e6..505ec44 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/DocPdfComponent.java @@ -1,5 +1,7 @@ package com.yxt.common.base.config.component; +import cn.hutool.core.codec.Base64; +import cn.hutool.core.date.DateUtil; import com.jacob.activeX.ActiveXComponent; import com.jacob.com.Dispatch; import com.yxt.common.base.utils.DateUtils; @@ -10,7 +12,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; -import sun.misc.BASE64Encoder; import java.io.*; import java.util.Date; @@ -37,13 +38,14 @@ public class DocPdfComponent { /** * 根据ftl模板生成word * - * @param map 数据 - * @param typeName 模板名称 - * @param fileName 文件名 + * @param map 数据 + * @param typeName 模板名称 + * @param fileName 文件名 * @return 返回word文件路径和链接路径 */ public Map creatWord(Map map, String typeName, String fileName) { - String dateStr = DateUtils.dateConvertStr(new Date(), "yyyyMMdd"); +// String dateStr = DateUtils.dateConvertStr(new Date(), "yyyyMMdd"); + String dateStr = DateUtil.format(new Date(), "yyyyMMdd"); String targetPath = uploadTemplateUrl + dateStr; try { //Configuration 用于读取ftl文件 @@ -77,6 +79,7 @@ public class DocPdfComponent { /** * 图片文件转换 + * * @param imgPath * @return */ @@ -92,12 +95,12 @@ public class DocPdfComponent { } catch (Exception e) { e.printStackTrace(); } - BASE64Encoder encoder = new BASE64Encoder(); - return encoder.encode(data); + return Base64.encode(data); } /** * word转换为pdf + * * @param wordFile word的路径 * @param pdfName pdf名称 * @return 返回pdf文件路径和链接路径 @@ -128,8 +131,10 @@ public class DocPdfComponent { Dispatch.call(document, "SaveAs", pdfFile, 17); // 关闭文档 Dispatch.call(document, "Close", false); - String prefixUrl = prefixTemplateUrl + pdfFile.replace(uploadTemplateUrl, ""); +// String prefixUrl = prefixTemplateUrl + pdfFile.replace(uploadTemplateUrl, ""); resultMap.put("uploadTemplateUrl", pdfFile); // 文件路径 + pdfFile = targetPath + "/" + pdfName; + String prefixUrl = prefixTemplateUrl + pdfFile.replace(uploadTemplateUrl, ""); resultMap.put("prefixTemplateUrl", prefixUrl); // 链接路径 } catch (Exception e) { log.error("转换失败" + e.getMessage()); @@ -142,6 +147,7 @@ public class DocPdfComponent { /** * 根据ftl模板生成word并转为pdf + * * @param map * @param typeName * @param docName diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileBatchUploadComponent.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileBatchUploadComponent.java index de54149..bb31f12 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileBatchUploadComponent.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileBatchUploadComponent.java @@ -76,6 +76,7 @@ public class FileBatchUploadComponent { String fileName = file.getOriginalFilename(); // 后缀名 String suffixName = fileName.substring(fileName.lastIndexOf(".")); + suffixName = suffixName.toLowerCase(); if (suffixName.equals(".pdf")) { // pdf文件 ResultBean resultBean = fileUploadComponent.uploadFile(file); FileUploadResult uploadResult = resultBean.getData(); diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileUploadComponent.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileUploadComponent.java index 789efaa..271348e 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileUploadComponent.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/config/component/FileUploadComponent.java @@ -205,7 +205,7 @@ public class FileUploadComponent { return uploadFile(file, false, relativePath); } - private String dateFileName() { + public String dateFileName() { return DateUtil.format(new Date(), "yyyyMMddHHmmssSSS") + RandomUtil.randomNumbers(3); } diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/HanZiConverterPinYin.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/HanZiConverterPinYin.java new file mode 100644 index 0000000..bc61687 --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/HanZiConverterPinYin.java @@ -0,0 +1,209 @@ +package com.yxt.common.base.utils; + +import cn.hutool.extra.pinyin.PinyinUtil; +import lombok.AllArgsConstructor; +import lombok.Data; +import org.apache.commons.lang3.StringUtils; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @Author dimengzhe + * @Date 2022/9/28 15:54 + * @Description + */ +public class HanZiConverterPinYin { + + public HanZiConverterPinYin() { + // 初始化汉字拼音字母对照表 + initChinesePinyinComparisonMapList(); + } + + /** + * 汉字拼音字母对照表 + */ + private List chinesePinyinComparisonMapList; + + /** + * 初始化汉字拼音字母对照表 + */ + private void initChinesePinyinComparisonMapList() { + chinesePinyinComparisonMapList = new ArrayList(); + + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20319, -20284, 'A')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-20283, -19776, 'B')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19775, -19219, 'C')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-19218, -18711, 'D')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18710, -18527, 'E')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18526, -18240, 'F')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-18239, -17923, 'G')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17922, -17418, 'H')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-17417, -16475, 'J')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16474, -16213, 'K')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-16212, -15641, 'L')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15640, -15166, 'M')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-15165, -14923, 'N')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14922, -14915, 'O')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14914, -14631, 'P')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14630, -14150, 'Q')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14149, -14091, 'R')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-14090, -13319, 'S')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-13318, -12839, 'T')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12838, -12557, 'W')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-12556, -11848, 'X')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11847, -11056, 'Y')); + chinesePinyinComparisonMapList.add(new ChinesePinyinComparisonMap(-11055, -10247, 'Z')); + } + + /** + * 遍历获取首字母 + */ + public char getPY(char c) throws Exception { + byte[] bytes = String.valueOf(c).getBytes("GBK"); + + //双字节汉字处理 + if (bytes.length == 2) { + + int hightByte = 256 + bytes[0]; + int lowByte = 256 + bytes[1]; + int asc = (256 * hightByte + lowByte) - 256 * 256; + + // 遍历转换 + for (ChinesePinyinComparisonMap map : this.chinesePinyinComparisonMapList) { + if (asc >= map.getSAscll() && asc <= map.getEAscll()) { + return map.getCode(); + } + } + } + + // 单字节或其他直接输入,不执行编码 + return c; + } + + /** + * 获取汉字拼音 + */ + public String getHanZiPY(String str) { + try { + StringBuilder pyStrBd = new StringBuilder(); + + for (char c : str.toCharArray()) { + pyStrBd.append(getPY(c)); + } + + return pyStrBd.toString(); + } catch (Exception e) { + e.printStackTrace(); + } + + return null; + } + + + /** + * 汉字拼音字母对照类 + */ + @Data + @AllArgsConstructor + private class ChinesePinyinComparisonMap { + // 区间开头 + private int sAscll; + + // 区间结尾 + private int eAscll; + + // 对应字母 + private char code; + } + + private static final Map DYZMAP = setDYZMap(); + + private static Map setDYZMap() { + Map map = new HashMap<>(); + map.put("仇", "QIU"); + map.put("柏", "BO"); + map.put("牟", "MU"); + map.put("颉", "XIE"); + map.put("解", "XIE"); + map.put("尉", "YU"); + map.put("奇", "JI"); + map.put("单", "SHAN"); + map.put("谌", "SHEN"); + map.put("乐", "YUE"); + map.put("召", "SHAO"); + map.put("朴", "PIAO"); + map.put("区", "OU"); + map.put("查", "ZHA"); + map.put("曾", "ZENG"); + map.put("缪", "MIAO"); + map.put("晟", "CHENG"); + map.put("员", "YUN"); + map.put("贠", "YUN"); + map.put("黑", "HE"); + map.put("重", "CHONG"); + map.put("秘", "BI"); + map.put("冼", "XIAN"); + map.put("折", "SHE"); + map.put("翟", "ZHAI"); + map.put("盖", "GE"); + map.put("万俟", "MOQI"); + map.put("尉迟", "YUCHI"); + return map; + } + + public static String getPinYinFirst(String str) { + HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin(); + char firstChar = str.toCharArray()[0]; + String firstString = ""; + if (Character.toString(firstChar).matches("^[\u4e00-\u9fa5]+$")) { // 为中文 + char[] charPinYinChar = PinYinUtils.getCharPinYinChar(firstChar); + String result = ""; + if (DYZMAP.containsKey(Character.toString(firstChar))) { + result = DYZMAP.get(Character.toString(firstChar)).toString().substring(0, 1); + } else { + result = StringUtils.join(charPinYinChar[0]); + } + firstString = result.toUpperCase(); + } else if (Character.toString(firstChar).matches("^[a-zA-Z]")) { // 为英文字母 + firstString = Character.toString(firstChar).toUpperCase(); + } + +// String code = hanZiConverterPinYin.getHanZiPY(str); + String code = PinyinUtil.getFirstLetter(str, ""); + StringBuffer buffer = new StringBuffer(code); + code = buffer.replace(0, 1, firstString).toString(); + code = code.toUpperCase(); + System.out.println(code); + return code; + } + + //测试 + public static void main(String[] args) { + HanZiConverterPinYin hanZiConverterPinYin = new HanZiConverterPinYin(); + String str = "王佳琪"; + char firstChar = str.toCharArray()[0]; + String firstString = ""; + if (Character.toString(firstChar).matches("^[\u4e00-\u9fa5]+$")) { // 为中文 + char[] charPinYinChar = PinYinUtils.getCharPinYinChar(firstChar); + String result = ""; + if (DYZMAP.containsKey(Character.toString(firstChar))) { + result = DYZMAP.get(Character.toString(firstChar)).toString().substring(0, 1); + } else { + result = StringUtils.join(charPinYinChar[0]); + } + firstString = result.toUpperCase(); + } else if (Character.toString(firstChar).matches("^[a-zA-Z]")) { // 为英文字母 + firstString = Character.toString(firstChar).toUpperCase(); + } + +// String code = hanZiConverterPinYin.getHanZiPY(str); + String code = PinyinUtil.getFirstLetter("王佳琪", ""); //c-s + StringBuffer buffer = new StringBuffer(code); + code = buffer.replace(0, 1, firstString).toString(); + code = code.toUpperCase(); + System.out.println(code); + } +} diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/MoneyToChineseUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/MoneyToChineseUtils.java new file mode 100644 index 0000000..75cdfed --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/MoneyToChineseUtils.java @@ -0,0 +1,220 @@ +package com.yxt.common.base.utils; + +import java.math.BigDecimal; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @Author dimengzhe + * @Date 2022/8/17 11:26 + * @Description + */ +public class MoneyToChineseUtils { + + /** + * 不考虑分隔符的正确性 + */ + private static final Pattern AMOUNT_PATTERN = Pattern.compile("^(0|[1-9]\\d{0,11})\\.(\\d\\d)$"); + private static final char[] RMB_NUMS = "零壹贰叁肆伍陆柒捌玖".toCharArray(); + private static final String[] UNITS = {"元", "角", "分", "整"}; + private static final String[] U1 = {"", "拾", "佰", "仟"}; + private static final String[] U2 = {"", "万", "亿"}; + + /** + * 将金额(整数部分等于或少于12位,小数部分2位)转换为中文大写形式. + * + * @param money 金额数字 + * @return 中文大写 + */ + public static String convert(Double money) { + money = Math.abs(money); + if (Double.valueOf(0).equals(money)) { + return "零元整"; + } + String amount = moneyFormat(money); + // 去掉分隔符 + amount = amount.replace(",", ""); + // 验证金额正确性 + + Matcher matcher = AMOUNT_PATTERN.matcher(amount); + if (!matcher.find()) { + + } + // 整数部分 + String integer = matcher.group(1); + // 小数部分 + String fraction = matcher.group(2); + + String result = ""; + if (!integer.equals("0")) { + // 整数部分 + result += integer2rmb(integer) + UNITS[0]; + } + if (fraction.equals("00")) { + // 添加[整] + result += UNITS[3]; + } else if (fraction.startsWith("0") && integer.equals("0")) { + // 去掉分前面的[零] + result += fraction2rmb(fraction).substring(1); + } else { + // 小数部分 + result += fraction2rmb(fraction); + } + return result; + } + + /** + * 将金额小数部分转换为中文大写 + */ + private static String fraction2rmb(String fraction) { + // 角 + char jiao = fraction.charAt(0); + // 分 + char fen = fraction.charAt(1); + return (RMB_NUMS[jiao - '0'] + (jiao > '0' ? UNITS[1] : "")) + (fen > '0' ? RMB_NUMS[fen - '0'] + UNITS[2] : ""); + } + + /** + * 将金额整数部分转换为中文大写 + * + * @param integer + * @return + */ + private static String integer2rmb(String integer) { + StringBuilder buffer = new StringBuilder(); + // 从个位数开始转换 + int i, j; + for (i = integer.length() - 1, j = 0; i >= 0; i--, j++) { + char n = integer.charAt(i); + if (n == '0') { + // 当n是0且n的右边一位不是0时,插入[零] + if (i < integer.length() - 1 && integer.charAt(i + 1) != '0') { + buffer.append(RMB_NUMS[0]); + } + // 插入[万]或者[亿] + if (j % 4 == 0) { + if (i > 0 && integer.charAt(i - 1) != '0' + || i > 1 && integer.charAt(i - 2) != '0' + || i > 2 && integer.charAt(i - 3) != '0') { + buffer.append(U2[j / 4]); + } + } + } else { + if (j % 4 == 0) { + // 插入[万]或者[亿] + buffer.append(U2[j / 4]); + } + // 插入[拾]、[佰]或[仟] + buffer.append(U1[j % 4]); + // 插入数字 + buffer.append(RMB_NUMS[n - '0']); + } + } + return buffer.reverse().toString(); + } + + /** + * 对金额的格式调整到分 + * + * @param preMoney + * @return + */ + public static String moneyFormat(Double preMoney) { + //23->23.00 + String money = preMoney.toString(); + StringBuffer sb = new StringBuffer(); + if (money == null) { + return "0.00"; + } + int index = money.indexOf("."); + if (index == -1) { + return money + ".00"; + } else { + //整数部分 + String s0 = money.substring(0, index); + //小数部分 + String s1 = money.substring(index + 1); + if (s1.length() == 1) { + //小数点后一位 + s1 = s1 + "0"; + } else if (s1.length() > 2) { + //如果超过3位小数,截取2位就可以了 + s1 = s1.substring(0, 2); + } + sb.append(s0); + sb.append("."); + sb.append(s1); + } + return sb.toString(); + } + + /** + * 对金额的格式调整到分 + * + * @param preMoney + * @return + */ + public static String moneyFormat(BigDecimal preMoney) { + //23->23.00 + String money = preMoney.toString(); + StringBuffer sb = new StringBuffer(); + if (money == null) { + return "0.00"; + } + int index = money.indexOf("."); + if (index == -1) { + return money + ".00"; + } else { + //整数部分 + String s0 = money.substring(0, index); + //小数部分 + String s1 = money.substring(index + 1); + if (s1.length() == 1) { + //小数点后一位 + s1 = s1 + "0"; + } else if (s1.length() > 2) { + //如果超过3位小数,截取2位就可以了 + s1 = s1.substring(0, 2); + } + sb.append(s0); + sb.append("."); + sb.append(s1); + } + return sb.toString(); + } + + /** + * 对金额的格式调整到分 + * + * @param preMoney + * @return + */ + public static String moneyFormat(String preMoney) { + //23->23.00 + String money = preMoney; + StringBuffer sb = new StringBuffer(); + if (money == null) { + return "0.00"; + } + int index = money.indexOf("."); + if (index == -1) { + return money + ".00"; + } else { + //整数部分 + String s0 = money.substring(0, index); + //小数部分 + String s1 = money.substring(index + 1); + if (s1.length() == 1) { + //小数点后一位 + s1 = s1 + "0"; + } else if (s1.length() > 2) { + //如果超过3位小数,截取2位就可以了 + s1 = s1.substring(0, 2); + } + sb.append(s0); + sb.append("."); + sb.append(s1); + } + return sb.toString(); + } +} diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java new file mode 100644 index 0000000..dbef38f --- /dev/null +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordConvertUtils.java @@ -0,0 +1,101 @@ +package com.yxt.common.base.utils; + +import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.ComThread; +import com.jacob.com.Dispatch; +import freemarker.template.Configuration; +import freemarker.template.Template; +import freemarker.template.Version; + +import java.io.*; +import java.util.Date; +import java.util.Map; + +/** + * @Author dimengzhe + * @Date 2022/10/18 17:11 + * @Description + */ +public class WordConvertUtils { + + /** + * 根据ftl模板生成word + * + * @param map 数据 + * @param typeName 模板名称 + * @param sourcePath 模板路径 + * @param targetPath 保存目标路径 + * @param fileName 文件名 + */ + public static void creatWord(Map map, File file, String targetPath, String fileName, String dir) { + String curDate = DateUtils.dateConvertStr(new Date(), "yyyy年MM月dd日"); + try { + //Configuration 用于读取ftl文件 + Configuration configuration = new Configuration(new Version("2.3.0")); + configuration.setDefaultEncoding("utf-8"); + //指定路径的第二种方式 + configuration.setDirectoryForTemplateLoading(new File(dir)); + //输出文档路径及名称 + File targetFile = new File(targetPath); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + targetPath = targetPath + fileName; + File outFile = new File(targetPath); + //以utf-8的编码读取ftl文件 + Template template = configuration.getTemplate(file.getName(), "utf-8"); + Writer out = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outFile), "utf-8"), 10240); + template.process(map, out); + out.close(); + } catch (Exception e) { + e.printStackTrace(); + } + } + + /** + * word转换为pdf + * + * @param wordFile word的路径 + * @param pdfPath pdf的路径 + * @param pdfName pdf名称 + */ + public static void doc2pdf(String wordFile, String pdfPath, String pdfName) { + ActiveXComponent app = null; + System.out.println("开始转换..."); + long start = System.currentTimeMillis(); + Dispatch document = null; + try { + ComThread.InitSTA(); + // 打开word + app = new ActiveXComponent("Word.Application"); + // 获得word中所有打开的文档 + Dispatch documents = app.getProperty("Documents").toDispatch(); + // 打开文档 + document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); + // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在 + File targetFile = new File(pdfPath); + if (!targetFile.exists()) { + targetFile.mkdirs(); + } + String pdfFile = pdfPath + pdfName; + File target = new File(pdfFile); + if (target.exists()) { + target.delete(); + } + Dispatch.call(document, "SaveAs", pdfFile, 17); + long end = System.currentTimeMillis(); + System.out.println("转换完成..用时:" + (end - start) + "ms."); + } catch (Exception e) { + System.out.println("转换失败" + e.getMessage()); + } finally { + // 关闭文档 + Dispatch.call(document, "Close", false); + // 关闭office + app.invoke("Quit", 0); + System.out.println("关闭文档"); + // 如果没有这句话,winword.exe进程将不会关闭 + ComThread.Release(); + } + + } +} diff --git a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java index f69f674..15a7bae 100644 --- a/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java +++ b/yxt-common/yxt-common-base/src/main/java/com/yxt/common/base/utils/WordUtils.java @@ -1,11 +1,12 @@ package com.yxt.common.base.utils; +import cn.hutool.core.codec.Base64; import com.jacob.activeX.ActiveXComponent; +import com.jacob.com.ComThread; import com.jacob.com.Dispatch; import freemarker.template.Configuration; import freemarker.template.Template; import freemarker.template.Version; -import sun.misc.BASE64Encoder; import java.io.*; import java.util.*; @@ -72,8 +73,7 @@ public class WordUtils { } catch (Exception e) { e.printStackTrace(); } - BASE64Encoder encoder = new BASE64Encoder(); - return encoder.encode(data); + return Base64.encode(data); } /** @@ -86,13 +86,16 @@ public class WordUtils { public static void doc2pdf(String wordFile, String pdfPath, String pdfName) { ActiveXComponent app = null; System.out.println("开始转换..."); + long start = System.currentTimeMillis(); + Dispatch document = null; try { + ComThread.InitSTA(); // 打开word app = new ActiveXComponent("Word.Application"); // 获得word中所有打开的文档 Dispatch documents = app.getProperty("Documents").toDispatch(); // 打开文档 - Dispatch document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); + document = Dispatch.call(documents, "Open", wordFile, false, true).toDispatch(); // 如果文件存在的话,不会覆盖,会直接报错,所以我们需要判断文件是否存在 File targetFile = new File(pdfPath); if (!targetFile.exists()) { @@ -104,14 +107,22 @@ public class WordUtils { target.delete(); } Dispatch.call(document, "SaveAs", pdfFile, 17); - // 关闭文档 - Dispatch.call(document, "Close", false); + long end = System.currentTimeMillis(); + System.out.println("转换完成..用时:" + (end - start) + "ms."); } catch (Exception e) { System.out.println("转换失败" + e.getMessage()); } finally { + // 关闭文档 + Dispatch.call(document, "Close", false); // 关闭office app.invoke("Quit", 0); + System.out.println("关闭文档"); +// if (app != null) +// app.invoke("Quit", new Variant[]{}); + // 如果没有这句话,winword.exe进程将不会关闭 + ComThread.Release(); } + } diff --git a/yxt-common/yxt-common-core/pom.xml b/yxt-common/yxt-common-core/pom.xml index 6c478d1..d4f5d4f 100644 --- a/yxt-common/yxt-common-core/pom.xml +++ b/yxt-common/yxt-common-core/pom.xml @@ -13,6 +13,7 @@ com.yxt yxt-common-core 0.0.1 + yxt-common-core===test00bbbbb @@ -55,4 +56,15 @@ 1.2.73 + + + + nexus-releases + http://nexus3.yyundong.com/repository/yxt-mvn-releases/ + + + nexus-snapshots + http://nexus3.yyundong.com/repository/yxt-mvn-snapshot/ + + \ No newline at end of file diff --git a/yxt-parent/pom.xml b/yxt-parent/pom.xml index 7eb7984..58a8876 100644 --- a/yxt-parent/pom.xml +++ b/yxt-parent/pom.xml @@ -9,7 +9,7 @@ 0.0.1 pom 根项目yxt-parent - 宇信通框架的根项目,用来维护使用到依赖库的版本。各子项目或独立项目都应 + 宇信通框架的根项目,用来维护使用到依赖库的版本。各子项目或独立项目都应统一版本 @@ -55,7 +55,7 @@ 2.9.2 2.0.5 - + 3.17 @@ -69,7 +69,7 @@ 5.4.0 6.0.20.Final - 1.18.12 + 1.18.24 3.1.0 3.10.1 2.2.9.RELEASE @@ -127,11 +127,11 @@ - - com.auth0 - java-jwt - ${java-jwt.version} - + + com.auth0 + java-jwt + ${java-jwt.version} + redis.clients @@ -185,7 +185,7 @@ - + io.springfox springfox-swagger2 ${swagger.fox.version} @@ -202,21 +202,21 @@ pom import - + org.apache.poi @@ -401,49 +401,56 @@ - - - - - - aliyun-central - https://maven.aliyun.com/repository/central - - - aliyun-public - https://maven.aliyun.com/repository/public - - - aliyun-google - https://maven.aliyun.com/repository/google - - - aliyun-spring - https://maven.aliyun.com/repository/spring - - - - - aliyun-central - https://maven.aliyun.com/repository/central - - - aliyun-public - https://maven.aliyun.com/repository/public - - - aliyun-google - https://maven.aliyun.com/repository/google - - - aliyun-spring - https://maven.aliyun.com/repository/spring - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + nexus-releases + http://nexus3.yyundong.com/repository/yxt-mvn-releases/ + + + nexus-snapshots + http://nexus3.yyundong.com/repository/yxt-mvn-snapshot/ + + \ No newline at end of file