Browse Source

单证分组

wfg 2 months ago
parent
commit
fc5ad2cc78

+ 5 - 0
blade-service-api/blade-los-api/src/main/java/org/springblade/los/business/sea/entity/Bills.java

@@ -2382,6 +2382,11 @@ public class Bills implements Serializable {
 	private String payableAt;
 
 	/**
+	 * 船名航次
+	 */
+	@TableField(exist = false)
+	private String vesselVoyageNo;
+	/**
 	 * 业务来源 报表中 dictionaryConversion 函数更改了 srcType 值
 	 */
 	@TableField(exist = false)

+ 81 - 25
blade-service/blade-los/src/main/java/org/springblade/los/Util/BigDecimalUtils.java

@@ -8,54 +8,110 @@ import java.math.BigDecimal;
  */
 public class BigDecimalUtils {
 
+	private static final String[] units = {
+		"", "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"
+	};
+
 	/**
 	 * 数字转英文大写
 	 *
 	 * @param number 数字
 	 * @return 结果
 	 */
-	public static String convertToEnglish(BigDecimal number) {
+	public static String convertToEnglish(BigDecimal number, Boolean toUpper) {
 		BigDecimal integerPart = number.setScale(0, BigDecimal.ROUND_DOWN);
 		String decimal = number.toString();
+		String res = "";
 		if (decimal.indexOf(".") > 0) {
 			BigDecimal decimalAmount = new BigDecimal(decimal.substring(decimal.indexOf(".") + 1));
-			long integralPart = integerPart.longValue();
+			int integralPart = integerPart.intValue();
 			String uppercaseInteger = convert(integralPart).trim();
 			if (new BigDecimal("0.00").compareTo(decimalAmount) != 0) {
-				uppercaseInteger = uppercaseInteger + " POINT " + convert(decimalAmount.longValue()).trim();
+				uppercaseInteger = uppercaseInteger + " POINT " + convert(decimalAmount.intValue()).trim();
 			}
-			return uppercaseInteger;
+			res = uppercaseInteger;
 		} else {
-			long integralPart = integerPart.longValue();
-            return convert(integralPart).trim();
+			int integralPart = integerPart.intValue();
+			res = convert(integralPart).trim();
 		}
+
+		return  toUpper==true ? res.toUpperCase() : res;
 	}
 
-	private static String convert(long number) {
-		if (number == 0) return "ZERO";
+	public static String convertToEnglish(BigDecimal number) {
+		return convertToEnglish(number, true);
+	}
 
-		StringBuilder result = new StringBuilder();
+	// private static String convert(long number) {
+	// 	if (number == 0) return "ZERO";
+	//
+	// 	StringBuilder result = new StringBuilder();
+	//
+	// 	if ((number / 1000) > 0) {
+	// 		result.append(convert(number / 1000)).append(" THOUSAND ");
+	// 		number %= 1000;
+	// 	}
+	//
+	// 	if ((number / 100) > 0) {
+	// 		result.append(convert(number / 100)).append(" HUNDRED ");
+	// 		number %= 100;
+	// 	}
+	//
+	// 	if (number > 0) {
+	// 		if (number < 20) {
+	// 			result.append(MagicValues.units[(int) number]).append(" ");
+	// 		} else {
+	// 			result.append(MagicValues.tens[(int) number / 10]).append(" ");
+	// 			if (number % 10 > 0) {
+	// 				result.append(MagicValues.units[(int) number % 10]).append(" ");
+	// 			}
+	// 		}
+	// 	}
+	// 	return result.toString();
+	// }
 
-		if ((number / 1000) > 0) {
-			result.append(convert(number / 1000)).append(" THOUSAND ");
-			number %= 1000;
+	private static String convert(int number) {
+		if (number == 0) {
+			return "Zero";
 		}
 
-		if ((number / 100) > 0) {
-			result.append(convert(number / 100)).append(" HUNDRED ");
-			number %= 100;
+		return convertToWords(number, false).trim();
+	}
+
+	// 注意:此实现最多支持到十亿(Integer的最大值约为20亿,所以足够处理int范围的正数)。
+	// 如果需要处理更大的数字(如Long类型),可以扩展代码添加更大的单位(Trillion等)
+	private static String convertToWords(int number, Boolean pre) {
+		if (number < 0) {
+			return "Minus " + convertToWords(-number, pre);
 		}
 
-		if (number > 0) {
-			if (number < 20) {
-				result.append(MagicValues.units[(int) number]).append(" ");
-			} else {
-				result.append(MagicValues.tens[(int) number / 10]).append(" ");
-				if (number % 10 > 0) {
-					result.append(MagicValues.units[(int) number % 10]).append(" ");
-				}
-			}
+		if (number < 20) {
+			return units[number];
 		}
-		return result.toString();
+
+		if (number < 100) {
+			String S = tens[number / 10] + ((number % 10 != 0) ? " " + units[number % 10] : "");
+			return pre == true && !S.isEmpty() ? "And " + S : S;
+		}
+
+		if (number < 1000) {
+			return units[number / 100] + " Hundred" + ((number % 100 != 0) ? " " + convertToWords(number % 100, true) : "");
+		}
+
+		if (number < 1000000) {
+			return convertToWords(number / 1000, false) + " Thousand" + ((number % 1000 != 0) ? " " + convertToWords(number % 1000, false) : "");
+		}
+
+		if (number < 1000000000) {
+			return convertToWords(number / 1000000, false) + " Million" + ((number % 1000000 != 0) ? " " + convertToWords(number % 1000000, false) : "");
+		}
+
+		return convertToWords(number / 1000000000, false) + " Billion" + ((number % 1000000000 != 0) ? " " + convertToWords(number % 1000000000, false) : "");
 	}
 }

+ 16 - 31
blade-service/blade-los/src/main/java/org/springblade/los/basic/reports/service/impl/ReportsServiceImpl.java

@@ -1720,9 +1720,7 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 			if (bills != null) {
 				this.dictionaryConversion(bills);
 				this.assignmentSeaBillsDetail(bills);
-//				bills.setFM(MagicValues.FM);
-				bills.setCapitalLetters("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
-				bills.setVesselCnName(bills.getVesselEnName() + "/" + bills.getVoyageNo());
+
 				BigDecimal boxWeightSum = BigDecimal.ZERO;
 				List<ContainersReports> containersReportsList = new ArrayList<>();
 				List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
@@ -1765,6 +1763,9 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 						cntrSealNo.append(item.getCntrNo()).append("/").append(item.getSealNo()).append("  ");
 					}
 				}
+
+				PrepareBills(bills, preContainersList, reportParams);
+
 				bills.setCntryString(text.toString());
 				bills.setCntrSealNo(cntrSealNo.toString());
 				bills.setContainersReportsList(containersReportsList);
@@ -1798,13 +1799,6 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 
 				PrepareBills(bills, preContainersList, reportParams);
 
-//				bills.setFM(MagicValues.FM);
-				if("1".equals(bills.getCapitalLettersRule())){
-					bills.setCapitalLetters(bills.getQuantityCntrTypesDescr());
-				}else{
-					bills.setCapitalLetters("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
-				}
-
 				StringBuilder text1 = new StringBuilder();
 				text1.append(bills.getQuantity()).append(System.lineSeparator());
 				text1.append(bills.getPackingUnit()).append(System.lineSeparator());
@@ -3217,9 +3211,7 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 			if (bills != null) {
 				this.dictionaryConversion(bills);
 				this.assignmentSeaBillsDetail(bills);
-//				bills.setFM(MagicValues.FM);
-				bills.setCapitalLetters("SAY " + BigDecimalUtils.convertToEnglish(bills.getQuantity()) + " " + bills.getPackingUnit() + " ONLY.");
-				bills.setVesselCnName(bills.getVesselEnName() + "/" + bills.getVoyageNo());
+
 				BigDecimal boxWeightSum = BigDecimal.ZERO;
 				List<Containers> containersList = containersService.list(new LambdaQueryWrapper<Containers>()
 					.eq(Containers::getTenantId, AuthUtil.getTenantId())
@@ -3251,6 +3243,9 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 				}
 				bills.setCntryString(text.toString());
 				bills.setDept(dept);
+
+				PrepareBills(bills, preContainersList, reportParams);
+
 				map.put(MagicValues.DATA, bills);
 			} else {
 				map.put(MagicValues.DATA, null);
@@ -7609,31 +7604,21 @@ public class ReportsServiceImpl extends ServiceImpl<ReportsMapper, Reports> impl
 				if (cntrQtyInwords.length() > 0) {
 					cntrQtyInwords = new StringBuilder(cntrQtyInwords.substring(0, cntrQtyInwords.length() - 4));
 					cntrQtyInwords.append(" ONLY.");
-					bill.setQuantityCntrTypesDescr(cntrQtyInwords.toString());
+					bill.setQuantityCntrTypesDescr("SAY " + cntrQtyInwords.toString());
 				}else{
 					bill.setQuantityCntrTypesDescr("");
 				}
 			}
 
-			// 处理大唛头和大货描
-			/*
-			JsonNode jsMarks = RegularUtils.readJSONObject(reportParams, "marks");
-			if(ObjectUtils.isNotNull(jsMarks) && RegularUtils.readJSONBooleanValue(jsMarks, "enabled", false)){
-				String marks = ObjectUtils.isNotNull(bill.getMarks()) ? RegularUtils.trimRight(bill.getMarks()) : "";
-				List<String> marksList = null;
-				int lineLength = RegularUtils.readJSONIntValue(jsMarks, "lineLength", 0);
-				if(lineLength>0){
-					marksList = RegularUtils.reformatEDIText(marks, lineLength, false);
-				}else{
-					marksList = new ArrayList<>(Arrays.asList(marks.split("\n")));
-				}
-				int lineCount = RegularUtils.readJSONIntValue(jsMarks, "lineCount", 0);
-
+			if("1".equals(bill.getCapitalLettersRule())){
+				bill.setCapitalLetters(bill.getQuantityCntrTypesDescr());
+			}else{
+				bill.setCapitalLetters("SAY " + BigDecimalUtils.convertToEnglish(bill.getQuantity()) + " " + bill.getPackingUnit() + " ONLY.");
 			}
-			JsonNode jsGoodsDesc = RegularUtils.readJSONObject(reportParams, "goodsDesc,goodsDescr,CommodityDesc,CommodityDescr");
 
-			// bill.getCommodityDescr()
-			*/
+			String vslvoyNo = bill.getVesselEnName() + "/" + bill.getVoyageNo();
+			bill.setVesselCnName(vslvoyNo.trim());
+			bill.setVesselVoyageNo(vslvoyNo.trim());
 		}
 
 		return bill;

+ 3 - 2
blade-service/blade-los/src/main/java/org/springblade/los/business/sea/service/impl/BillsServiceImpl.java

@@ -542,7 +542,6 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 		BigDecimal teu = new BigDecimal("0.00");
 		StringBuilder boxTypeSum = new StringBuilder();
 		StringBuilder quantityCntrTypesDescr = new StringBuilder();
-		quantityCntrTypesDescr.append("SAY ");
 		if (ObjectUtils.isNull(bills.getCfsQuantity()) || bills.getCfsQuantity().compareTo(new BigDecimal("0.00")) == 0) {
 			if (ObjectUtils.isNotNull(bills.getPreContainersList())) {
 				bills.setCfsMeasurement(new BigDecimal("0.00"));
@@ -603,7 +602,9 @@ public class BillsServiceImpl extends ServiceImpl<BillsMapper, Bills> implements
 				if (quantityCntrTypesDescr.length() > 0) {
 					quantityCntrTypesDescr = new StringBuilder(quantityCntrTypesDescr.substring(0, quantityCntrTypesDescr.length() - 4));
 					quantityCntrTypesDescr.append(" ONLY.");
-					bills.setQuantityCntrTypesDescr(quantityCntrTypesDescr.toString());
+					bills.setQuantityCntrTypesDescr("SAY " + quantityCntrTypesDescr.toString());
+				}else{
+					bills.setQuantityCntrTypesDescr("");
 				}
 				preContainersService.saveOrUpdateBatch(bills.getPreContainersList());
 				List<Long> idList = bills.getPreContainersList().stream().map(PreContainers::getId).collect(Collectors.toList());