Ver Fonte

1.报表打印数字转大写问题修改

纪新园 há 2 semanas atrás
pai
commit
2201c773ff

+ 54 - 71
blade-service/blade-los/src/main/java/org/springblade/los/Util/BigDecimalUtils.java

@@ -8,17 +8,10 @@ import java.math.BigDecimal;
  */
 public class BigDecimalUtils {
 
-	private static final String[] LESS_THAN_20 = {
-		"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
-		"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen",
-		"seventeen", "eighteen", "nineteen"
-	};
-	private static final String[] TENS = {
-		"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
-	};
-	private static final String[] THOUSANDS = {
-		"", "thousand", "million", "billion"
-	};
+	private static final String[] LESS_THAN_20 = {"", "ONE", "TWO", "THREE", "FOUR", "FIVE", "SIX", "SEVEN", "EIGHT", "NINE", "TEN", "ELEVEN", "TWELVE", "THIRTEEN", "FOURTEEN", "FIFTEEN", "SIXTEEN", "SEVENTEEN", "EIGHTEEN", "NINETEEN"};
+	private static final String[] TENS = {"", "TEN", "TWENTY", "THIRTY", "FORTY", "FIFTY", "SIXTY", "SEVENTY", "EIGHTY", "NINETY"};
+	private static final String[] THOUSANDS = {"", "THOUSAND", "MILLION", "BILLION"};
+
 
 	/**
 	 * 数字转英文大写
@@ -46,82 +39,72 @@ public class BigDecimalUtils {
 			}
 			return data;
 		}*/
-		if (amount.compareTo(BigDecimal.ZERO) == 0) return "zero dollars";
-
-		String[] parts = amount.toString().split("\\.");
+		if (amount.compareTo(BigDecimal.ZERO) == 0) return "ZERO";
+		String[] parts = amount.toPlainString().split("\\.");
 		String integerPart = parts[0];
-		String fractionalPart = parts.length > 1 ? parts[1] : "00";
-
+		String decimalPart = parts.length > 1 ? parts[1] : "";
 		StringBuilder result = new StringBuilder();
-		result.append(convertIntegerPart(integerPart)).append(" dollars");
-		if (!fractionalPart.equals("00")) {
-			result.append(" and ").append(convertFractionalPart(fractionalPart)).append(" cents");
-		}
-		return result.toString();
-	}
-
-	private static String convertIntegerPart(String number) {
-		if (number.isEmpty()) return "";
-
-		StringBuilder result = new StringBuilder();
-		int length = number.length();
-		for (int i = 0; i < length; i++) {
-			if (length - i > 3) {
-				result.append(convertThreeDigits(number.substring(i, i + 3))).append(" ");
-				i += 2;
-			} else {
-				result.append(convertThreeDigits(number.substring(i)));
+		result.append(numberToWords(Integer.parseInt(integerPart)));
+		if (!decimalPart.isEmpty()) {
+			result.append(" POINT ");
+			for (char c : decimalPart.toCharArray()) {
+				result.append(LESS_THAN_20[Character.getNumericValue(c)]).append(" ");
 			}
 		}
-		return result.toString().trim();
-	}
-
-	private static String convertThreeDigits(String number) {
-		if (number.isEmpty()) return "";
-
-		StringBuilder result = new StringBuilder();
-		if (number.length() == 3) {
-			int hundreds = Character.getNumericValue(number.charAt(0));
-			if (hundreds > 0) {
-				result.append(LESS_THAN_20[hundreds]).append(" hundred ");
+		String data = result.toString().trim().substring(result.toString().trim().lastIndexOf("AND"));
+		if ("AND".equals(data)) {
+			data = result.toString().trim().substring(0,result.toString().trim().lastIndexOf("AND"));
+			if (data.trim().lastIndexOf("AND") >= 0){
+				String data1 = data.trim().substring(data.trim().lastIndexOf("AND"));
+				if ("AND".equals(data1)){
+					data = data.trim().substring(0,data.trim().lastIndexOf("AND"));
+				}
 			}
-		}
-		if (number.length() >= 2) {
-			int tens = Character.getNumericValue(number.charAt(number.length() - 2));
-			if (tens > 1) {
-				result.append(TENS[tens]).append(" ");
-			} else if (tens == 1) {
-				int teens = Character.getNumericValue(number.charAt(number.length() - 1));
-				result.append(LESS_THAN_20[10 + teens]).append(" ");
+			data = data.trim();
+			if (data.lastIndexOf("-")>= 0){
+				String data2 = data.substring(data.lastIndexOf("-"));
+				if ("-".equals(data2)){
+					data = data.substring(0,data.lastIndexOf("-"));
+				}
+			}
+			return data;
+		}else{
+			String data2 = result.toString().trim().substring(result.toString().trim().lastIndexOf("-"));
+			if ("-".equals(data2)){
+				data2 = result.toString().trim().substring(0,result.toString().trim().lastIndexOf("-"));
+				return data2;
+			}else{
 				return result.toString().trim();
 			}
 		}
-		int ones = Character.getNumericValue(number.charAt(number.length() - 1));
-		if (ones > 0) {
-			result.append(LESS_THAN_20[ones]).append(" ");
-		}
-		return result.toString().trim();
 	}
 
-	private static String convertFractionalPart(String number) {
-		if (number.isEmpty()) return "";
-
+	private static String numberToWords(int num) {
+		if (num == 0) return " ";
 		StringBuilder result = new StringBuilder();
-		if (number.length() == 1) {
-			result.append(LESS_THAN_20[Character.getNumericValue(number.charAt(0))]).append(" cent");
-		} else {
-			int tens = Character.getNumericValue(number.charAt(0));
-			int ones = Character.getNumericValue(number.charAt(1));
-			if (tens > 0) {
-				result.append(TENS[tens]).append(" ");
-			}
-			if (ones > 0) {
-				result.append(LESS_THAN_20[ones]).append(" ");
+		int i = 0;
+		while (num > 0) {
+			if (num % 1000 != 0) {
+				if ("THOUSAND".equals(THOUSANDS[i])) {
+					result.insert(0, helper(num % 1000) + THOUSANDS[i] + " ");
+				} else {
+					result.insert(0, helper(num % 1000) + THOUSANDS[i] + " AND ");
+				}
 			}
+			num /= 1000;
+			i++;
 		}
 		return result.toString().trim();
 	}
 
+
+	private static String helper(int num) {
+		if (num == 0) return " ";
+		else if (num < 20) return LESS_THAN_20[num] + " ";
+		else if (num < 100) return TENS[num / 10] + "-" + helper(num % 10);
+		else return LESS_THAN_20[num / 100] + " HUNDRED AND " + helper(num % 100);
+	}
+
 	private static String convert(long number) {
 		if (number == 0) {
 			return "ZERO";

+ 2 - 1
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/mapper/BillsMapper.xml

@@ -298,9 +298,10 @@
         <if test='data.changeOrderStatus != null and data.changeOrderStatus != "" and data.changeOrderStatus == "已退单"'>
             and box_packing_amount = 0
             and change_order_status = '已换单'
+            and retreat_box_packing_date is null
         </if>
         <if test='data.changeOrderStatus != null and data.changeOrderStatus != "" and data.changeOrderStatus == "已退押"'>
-            and harvest_box_packing_date is not null
+            and retreat_box_packing_date is not null
             and change_order_status = '已换单'
         </if>
         <if test='data.deliveryNoteStatus != null and data.deliveryNoteStatus != ""'>