From 3a816e7bdab03254710e2bdf872e113757c19638 Mon Sep 17 00:00:00 2001 From: winter Date: Mon, 18 Mar 2024 17:07:03 +0800 Subject: [PATCH] fix --- .../market/WxSettleMerchantController.java | 4 +- .../service/WxSettleMerchantService.java | 2 +- .../impl/WxSettleMerchantServiceImpl.java | 55 ++++-- .../java/com/iformall/utils/PriceUtilV2.java | 161 ++++++++++++++++++ 4 files changed, 206 insertions(+), 16 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/utils/PriceUtilV2.java diff --git a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxSettleMerchantController.java b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxSettleMerchantController.java index ea2b8045f..571ac537b 100644 --- a/mallinkAdmin/src/main/java/com/iformall/controller/market/WxSettleMerchantController.java +++ b/mallinkAdmin/src/main/java/com/iformall/controller/market/WxSettleMerchantController.java @@ -65,13 +65,13 @@ public class WxSettleMerchantController extends BaseController { if (null == wxSettleMerchant) { return new ResultData(Result.ERROR,"参数错误"); } - return new ResultData(wxSettleMerchantService.getMapDetail(wxSettleMerchant)); + return new ResultData(wxSettleMerchantService.getMapDetail(wxSettleMerchant,false)); } @ApiOperation("计算周期性费用") @GetMapping("/calcute") public ResultData calcutePeriodicity(@ModelAttribute WxSettleMerchant wxSettleMerchant) { - return new ResultData(wxSettleMerchantService.getMapDetail(wxSettleMerchant)); + return new ResultData(wxSettleMerchantService.getMapDetail(wxSettleMerchant,true)); } @ApiOperation("导出") diff --git a/mallinkService/src/main/java/com/iformall/service/WxSettleMerchantService.java b/mallinkService/src/main/java/com/iformall/service/WxSettleMerchantService.java index afd085850..2c8f36f34 100644 --- a/mallinkService/src/main/java/com/iformall/service/WxSettleMerchantService.java +++ b/mallinkService/src/main/java/com/iformall/service/WxSettleMerchantService.java @@ -27,7 +27,7 @@ public interface WxSettleMerchantService { * @return */ WxSettleMerchant getById(TenantEntity tenantEntity,Long id); - Map getMapDetail(WxSettleMerchant record); + Map getMapDetail(WxSettleMerchant record,boolean needCalcute); /** diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxSettleMerchantServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxSettleMerchantServiceImpl.java index 8c629ade3..572bae3bc 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxSettleMerchantServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxSettleMerchantServiceImpl.java @@ -10,6 +10,9 @@ import com.iformall.mapper.WxSettleMerchantMapper; import com.iformall.service.WxSettleMerchantService; import com.iformall.utils.DateUtils; import com.iformall.utils.ExcelExportUtils; +import com.iformall.utils.PriceUtil; +import com.iformall.utils.PriceUtilV2; + import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; @@ -40,7 +43,7 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ } @Override - public Map getMapDetail(WxSettleMerchant record) { + public Map getMapDetail(WxSettleMerchant record,boolean needCalcute) { Map valueMap = new HashMap(); valueMap.put("beginTime", DateUtils.format(record.getBeginTime())); valueMap.put("endTime", DateUtils.format(record.getEndTime())); @@ -49,7 +52,15 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ valueMap.put("merchantCode", record.getMerchantCode()); valueMap.put("merchantPerson", record.getMerchantPerson()); valueMap.put("merchantPhone", record.getMerchantPhone()); - valueMap.put("totalMoney", record.getTotalMoney()); + + if (needCalcute) { + record.setCardMoney(calcuteByMoneyAndRate(record.getCardSaleMoney(),record.getCardRate())); + record.setZfbMoney(calcuteByMoneyAndRate(record.getZfbSaleMoney(),record.getZfbRate())); + record.setUnionMoney(calcuteByMoneyAndRate(record.getUnionSaleMoney(),record.getUnionRate())); + record.setWxMoney(calcuteByMoneyAndRate(record.getWxSaleMoney(),record.getWxRate())); + record.setEraseZeroMoney(calcuteByMoneyAndRate(record.getEraseZeroSaleMoney(),record.getEraseZeroRate())); + record.setCashMoney(calcuteByMoneyAndRate(record.getCashSaleMoney(),record.getCashRate())); + } valueMap.put("cardSaleMoney", handleExcelData(record.getCardSaleMoney())); @@ -70,10 +81,12 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ valueMap.put("cashSaleMoney", handleExcelData(record.getCashSaleMoney())); valueMap.put("cashRate", handleExcelData(record.getCashRate())); valueMap.put("cashMoney", handleExcelData(record.getCashMoney())); - valueMap.put("totalSaleMoney", calcuteAdd(record.getCardSaleMoney(),record.getZfbSaleMoney(),record.getUnionSaleMoney(), - record.getWxSaleMoney(),record.getEraseZeroSaleMoney(),record.getCashSaleMoney())); - valueMap.put("totalReduceMoney", calcuteAdd(record.getCardMoney(),record.getZfbMoney(),record.getUnionMoney(),record.getWxMoney(), - record.getEraseZeroMoney(),record.getCashMoney())); + BigDecimal totalSaleMoney = calcuteAdd(record.getCardSaleMoney(),record.getZfbSaleMoney(),record.getUnionSaleMoney(), + record.getWxSaleMoney(),record.getEraseZeroSaleMoney(),record.getCashSaleMoney()); + valueMap.put("totalSaleMoney", totalSaleMoney); + BigDecimal totalReduceMoney = calcuteAdd(record.getCardMoney(),record.getZfbMoney(),record.getUnionMoney(),record.getWxMoney(), + record.getEraseZeroMoney(),record.getCashMoney()); + valueMap.put("totalReduceMoney", totalReduceMoney); valueMap.put("rentMoney", handleExcelData(record.getRentMoney())); @@ -85,13 +98,24 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ valueMap.put("otherMoney", handleExcelData(record.getOtherMoney())); valueMap.put("lastRemaining", handleExcelData(record.getLastRemaining())); valueMap.put("pointsRate", handleExcelData(record.getPointsRate())); + if (needCalcute) { + record.setPointsMoney(calcuteByMoneyAndRate(totalSaleMoney,record.getPointsRate())); + } valueMap.put("pointsMoney", handleExcelData(record.getPointsMoney())); - valueMap.put("totalTempMoney", calcuteAdd(record.getRentMoney(),record.getRentContractMoney(),record.getEmployeeManageMoney(),record.getSalesSlipMoney(), - record.getSalary(),record.getEarnestMoney(),record.getOtherMoney(),record.getLastRemaining(),record.getPointsMoney())); + BigDecimal totalTempMoney = calcuteAdd(record.getRentMoney(),record.getRentContractMoney(),record.getEmployeeManageMoney(),record.getSalesSlipMoney(), + record.getSalary(),record.getEarnestMoney(),record.getOtherMoney(),record.getLastRemaining(),record.getPointsMoney()); + valueMap.put("totalTempMoney", totalTempMoney); - valueMap.put("totalMoneyDX", valueMap); - valueMap.put("actualMoneyDX", valueMap); + if (needCalcute) { + record.setTotalMoney(totalSaleMoney.subtract(calcuteAdd(totalReduceMoney,totalTempMoney))); + } + + valueMap.put("totalMoney", record.getTotalMoney()); valueMap.put("actualMoney", record.getActualMoney()); + valueMap.put("totalMoneyDX", PriceUtilV2.number2CNMontrayUnit(record.getTotalMoney())); + if (null != record.getActualMoney()) { + valueMap.put("actualMoneyDX", PriceUtilV2.number2CNMontrayUnit(record.getActualMoney())); + } valueMap.put("accountName", record.getAccountName()); valueMap.put("accountBank", record.getAccountBank()); @@ -99,6 +123,13 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ return valueMap; } + private BigDecimal calcuteByMoneyAndRate(BigDecimal saleMoney,BigDecimal rate) { + if (null == saleMoney || null == rate) { + return new BigDecimal(0); + } + return saleMoney.multiply(rate).setScale(3,BigDecimal.ROUND_HALF_UP); + } + private BigDecimal calcuteAdd(BigDecimal... args) { BigDecimal result = new BigDecimal(0); for (int i = 0 ; i < args.length ; i ++) { @@ -138,10 +169,8 @@ public class WxSettleMerchantServiceImpl implements WxSettleMerchantService{ @Override public void exportData(WxSettleMerchant record, HttpServletRequest request, HttpServletResponse response) { - Map valueMap = getMapDetail(record); + Map valueMap = getMapDetail(record,false); ExcelExportUtils.exportByModel("excel/settle.xlsx","供应商结算单_"+record.getMerchantName(),"供应商结算单", valueMap,request,response); - - } diff --git a/mallinkService/src/main/java/com/iformall/utils/PriceUtilV2.java b/mallinkService/src/main/java/com/iformall/utils/PriceUtilV2.java new file mode 100644 index 000000000..dac725bc8 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/PriceUtilV2.java @@ -0,0 +1,161 @@ +package com.iformall.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; + +public class PriceUtilV2 { + + private static final Logger logger = LoggerFactory.getLogger(PriceUtilV2.class); + + /** + * 数字金额大写转换,思想先写个完整的然后将如零拾替换成零 要用到正则表达式 + */ + public static String digitUppercase(double n) { + String fraction[] = {"角", "分"}; + String digit[] = {"零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"}; + String unit[][] = {{"圆", "万", "亿"}, {"", "拾", "佰", "仟"}}; + + String head = n < 0 ? "负" : ""; + n = Math.abs(n); + + String s = ""; + for (int i = 0; i < fraction.length; i++) { + s += (digit[(int) (Math.floor(n * 10 * Math.pow(10, i)) % 10)] + fraction[i]).replaceAll("(零.)+", ""); + } + if (s.length() < 1) { + s = "整"; + } + int integerPart = (int) Math.floor(n); + + for (int i = 0; i < unit[0].length && integerPart > 0; i++) { + String p = ""; + for (int j = 0; j < unit[1].length && n > 0; j++) { + p = digit[integerPart % 10] + unit[1][j] + p; + integerPart = integerPart / 10; + } + s = p.replaceAll("(零.)*零$", "").replaceAll("^$", "零") + unit[0][i] + s; + } + return head + s.replaceAll("(零.)*零元", "元").replaceFirst("(零.)+", "").replaceAll("(零.)+", "零").replaceAll("^整$", "零元整"); + } + + + /** + * 汉语中数字大写 + */ + private static final String[] CN_UPPER_NUMBER = {"零", "壹", "贰", "叁", "肆", + "伍", "陆", "柒", "捌", "玖"}; + /** + * 汉语中货币单位大写,这样的设计类似于占位符 + */ + private static final String[] CN_UPPER_MONETRAY_UNIT = {"厘","分", "角", "元", + "拾", "佰", "仟", "万", "拾", "佰", "仟", "亿", "拾", "佰", "仟", "兆", "拾", + "佰", "仟"}; + /** + * 特殊字符:整 + */ + private static final String CN_FULL = "整"; + /** + * 特殊字符:负 + */ + private static final String CN_NEGATIVE = "负"; + /** + * 特殊字符:零元整 + */ + private static final String CN_ZEOR_FULL = "零元" + CN_FULL; + + /** + * 把输入的金额转换为汉语中人民币的大写 + * + * @param numberOfMoney 输入的金额 + * @return 对应的汉语大写 + */ + public static String number2CNMontrayUnit(BigDecimal numberOfMoney) { + StringBuilder sb = new StringBuilder(); + int signum = numberOfMoney.signum(); + // 零元整的情况 + if (numberOfMoney.compareTo(new BigDecimal(0)) == 0) { + return CN_ZEOR_FULL; + }else if (numberOfMoney.compareTo(new BigDecimal(0)) < 0) { + sb.append(CN_NEGATIVE); + } + + //这里会进行金额的四舍五入 + long number = numberOfMoney.movePointRight(3).setScale(0, BigDecimal.ROUND_HALF_UP).abs().longValue(); + // 得到小数点后两位值 + long scale = number % 1000; + int numUnit = 0; + int numIndex = 0; + boolean getZero = false; + // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11 + if (!(scale > 0)) { + numIndex = 3; + number = number / 1000; + getZero = true; + } + if ((scale > 0) && (!(scale % 100 > 0))) { + numIndex = 2; + number = number / 100; + getZero = true; + } + if ((scale > 0) && (!(scale % 10 > 0))) { + numIndex = 1; + number = number / 10; + getZero = true; + } + int zeroSize = 0; + while (true) { + if (number <= 0) { + break; + } + // 每次获取到最后一个数 + numUnit = (int) (number % 10); + if (numUnit > 0) { + if ((numIndex == 9) && (zeroSize >= 3)) { + sb.insert(0, CN_UPPER_MONETRAY_UNIT[6]); + } + if ((numIndex == 13) && (zeroSize >= 3)) { + sb.insert(0, CN_UPPER_MONETRAY_UNIT[10]); + } + sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); + sb.insert(0, CN_UPPER_NUMBER[numUnit]); + getZero = false; + zeroSize = 0; + } else { + ++zeroSize; + if (!(getZero)) { + sb.insert(0, CN_UPPER_NUMBER[numUnit]); + } + if (numIndex == 2) { + if (number > 0) { + sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); + } + } else if (((numIndex - 2) % 4 == 0) && (number % 1000 > 0)) { + sb.insert(0, CN_UPPER_MONETRAY_UNIT[numIndex]); + } + getZero = true; + } + // 让number每次都去掉最后一个数 + number = number / 10; + ++numIndex; + } + // 如果signum == -1,则说明输入的数字为负数,就在最前面追加特殊字符:负 + if (signum == -1) { + sb.insert(0, CN_NEGATIVE); + } + // 输入的数字小数点后两位为"00"的情况,则要在最后追加特殊字符:整 + if (!(scale > 0)) { + sb.append(CN_FULL); + } + return sb.toString(); + } + + + public static void main(String[] args) { + BigDecimal numberOfMoney = new BigDecimal(432342341231.906); + System.out.println(numberOfMoney.toString()); + System.out.println(number2CNMontrayUnit(numberOfMoney)); + } + +} \ No newline at end of file