diff --git a/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java b/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java index ee95445..4baca74 100644 --- a/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java +++ b/arap/src/private/nc/bs/pub/action/N_F3_SAVE.java @@ -17,7 +17,9 @@ import nc.vo.arap.pub.BillEnumCollection.ApproveStatus; import nc.vo.fipub.exception.ExceptionHandler; import nc.vo.pub.AggregatedValueObject; import nc.vo.pub.BusinessException; +import nc.vo.pub.CircularlyAccessibleValueObject; import nc.vo.pub.compiler.PfParameterVO; +import nc.vo.pub.lang.UFDouble; import nccloud.bs.arap.util.commit.ArapCommitUtil; import nccloud.pubitf.arap.arappub.IArapBillPubUtilService; @@ -63,6 +65,7 @@ public class N_F3_SAVE extends N_BASE_ACTION { this.setParameter("context", paraVo.m_preValueVos); this.beforeCheck(); String primaryKey = paraVo.m_preValueVos[0].getParentVO().getPrimaryKey(); + paraVo = this.def10Change(paraVo); if (this.hasBill(primaryKey)) { obj = this.runClass("nc.bs.arap.actions.PaybillEditSaveBatchBSAction", "updateVOs", "&context:nc.vo.pub.AggregatedValueObject[]", paraVo, this.m_keyHas); } else { @@ -104,10 +107,129 @@ public class N_F3_SAVE extends N_BASE_ACTION { private PfParameterVO def10Change(PfParameterVO paraVo) { for(AggregatedValueObject vo : paraVo.m_preValueVos) { - vo.getParentVO().setAttributeValue("approvestatus", ApproveStatus.NOSTATE.VALUE); + UFDouble money_de = UFDouble.ZERO_DBL; + for(CircularlyAccessibleValueObject childVO : vo.getChildrenVO()) { + money_de =money_de.add((UFDouble) childVO.getAttributeValue("money_de")) ; + } + vo.getParentVO().setAttributeValue("def10",toChineseAmount(money_de.toBigDecimal())); } return paraVo; } + // 数字大写汉字映射表 + private static final String[] CHINESE_CHARS = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + // 数位映射表 + private static final String[] DIGIT_UNITS = {"", "拾", "佰", "仟"}; + // 数映射表 + private static final String[] LARGE_NUMBERS = {"", "万", "亿", "万亿", "亿亿"}; + // 金额单位 + private static final String[] AMOUNT_UNITS = {"元", "角", "分"}; + // 特殊情况处理 + private static final String ZERO_YUAN = "零元整"; + + public static String toChineseAmount(BigDecimal number) { + if (number == null || number.compareTo(BigDecimal.ZERO) < 0) { + throw new IllegalArgumentException("请输入非负数字"); + } + + // 将数字分为整数部分和小数部分 + String numStr = number.stripTrailingZeros().toPlainString(); + String[] parts = numStr.split("\\."); + String integerPart = parts[0]; + String decimalPart = parts.length > 1 ? parts[1] : ""; + + // 处理整数部分 + StringBuilder chineseInteger = new StringBuilder(); + if ("0".equals(integerPart)) { + chineseInteger.append(CHINESE_CHARS[0]); + } else { + char[] intChars = integerPart.toCharArray(); + int len = intChars.length; + int index = 0; + for (int i = len - 1; i >= 0; i--) { + int digit = intChars[i] - '0'; + int digitPosition = len - i - 1; + int section = digitPosition / 4; + int positionInSection = digitPosition % 4; + + if (digit != 0) { + chineseInteger.insert(0, CHINESE_CHARS[digit]); + if (positionInSection > 0) { + chineseInteger.insert(0, DIGIT_UNITS[positionInSection]); + } + } + if (positionInSection == 0 && digit != 0) { + chineseInteger.insert(0, LARGE_NUMBERS[section]); + } + index++; + } + // 移除多余的零和重复的单位 + cleanUpChineseNumber(chineseInteger); + } + + // 处理小数部分 + StringBuilder chineseDecimal = new StringBuilder(); + if (!decimalPart.isEmpty()) { + int jiao = 0; + int fen = 0; + if (decimalPart.length() >= 1) { + jiao = Integer.parseInt(decimalPart.substring(0, 1)); + } + if (decimalPart.length() >= 2) { + fen = Integer.parseInt(decimalPart.substring(1, 2)); + } + if (jiao != 0) { + chineseDecimal.append(CHINESE_CHARS[jiao]).append(AMOUNT_UNITS[1]); + } + if (fen != 0) { + chineseDecimal.append(CHINESE_CHARS[fen]).append(AMOUNT_UNITS[2]); + } + } + + // 整合整数部分和小数部分 + if (chineseInteger.length() == 0) { + chineseInteger.append(CHINESE_CHARS[0]); + } + chineseInteger.append(AMOUNT_UNITS[0]); + if (chineseDecimal.length() == 0) { + chineseInteger.append("整"); + } else { + chineseInteger.append(chineseDecimal); + } + + // 特殊情况处理:零元整 + if (chineseInteger.toString().equals("零元")) { + return ZERO_YUAN; + } + + return chineseInteger.toString(); + } + + private static void cleanUpChineseNumber(StringBuilder sb) { + // 移除连续的零,只保留一个零 + while (sb.indexOf("零零") != -1) { + sb.replace(sb.indexOf("零零"), sb.indexOf("零零") + 2, "零"); + } + // 移除末尾的零 + if (sb.length() > 0 && sb.charAt(sb.length() - 1) == '零') { + sb.deleteCharAt(sb.length() - 1); + } + // 除单位前面的零 + for (String unit : DIGIT_UNITS) { + if (!unit.isEmpty()) { + while (sb.indexOf("零" + unit) != -1) { + sb.replace(sb.indexOf("零" + unit), sb.indexOf("零" + unit) + 2, unit); + } + } + } + // 移除大数单位前面的零 + for (String largeNum : LARGE_NUMBERS) { + if (!largeNum.isEmpty()) { + while (sb.indexOf("零" + largeNum) != -1) { + sb.replace(sb.indexOf("零" + largeNum), sb.indexOf("零" + largeNum) + 2, largeNum); + } + } + } + } }