From 0d8e87ec9e5041c2732bae29d52e74033b750c88 Mon Sep 17 00:00:00 2001 From: gongbiao Date: Tue, 21 May 2019 19:40:54 +0800 Subject: [PATCH] =?UTF-8?q?[=E5=95=86=E5=BA=97=E8=B4=A6=E5=8D=95][?= =?UTF-8?q?=E4=BF=AE=E6=94=B9][=E7=94=9F=E6=88=90=E5=82=AC=E7=BC=B4?= =?UTF-8?q?=E5=8D=95]?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/iformall/domain/vo/WxBillAllVo.java | 1 + .../service/impl/WxBillAllServiceImpl.java | 140 +++++++++++- .../impl/WxRentContractServiceImpl.java | 212 ++---------------- .../java/com/iformall/utils/DownFileUtil.java | 51 ++++- .../java/com/iformall/utils/PriceUtil.java | 154 +++++++++++++ .../java/com/iformall/utils/WordUtil.java | 87 +++++++ .../contract-word-template/bill_owe.docx | Bin 0 -> 45393 bytes .../contract-word-template/owe_bill.docx | Bin 8400 -> 0 bytes .../main/resources/mapper/WxBillAllMapper.xml | 12 + 9 files changed, 457 insertions(+), 200 deletions(-) create mode 100644 mallinkService/src/main/java/com/iformall/utils/PriceUtil.java create mode 100644 mallinkService/src/main/java/com/iformall/utils/WordUtil.java create mode 100644 mallinkService/src/main/resources/contract-word-template/bill_owe.docx delete mode 100644 mallinkService/src/main/resources/contract-word-template/owe_bill.docx diff --git a/mallinkService/src/main/java/com/iformall/domain/vo/WxBillAllVo.java b/mallinkService/src/main/java/com/iformall/domain/vo/WxBillAllVo.java index 37bd3c4b2..f8e680f4f 100644 --- a/mallinkService/src/main/java/com/iformall/domain/vo/WxBillAllVo.java +++ b/mallinkService/src/main/java/com/iformall/domain/vo/WxBillAllVo.java @@ -63,6 +63,7 @@ public class WxBillAllVo { private String shopInfo; + private String name; public String getReceivePayStr() { if(getReceivePay()!=null) { diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java index 4ecde8e9f..7c945831d 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxBillAllServiceImpl.java @@ -7,15 +7,15 @@ import com.iformall.common.ErrorCode; import com.iformall.common.ResultData; import com.iformall.domain.po.*; import com.iformall.domain.po.msg.MailMsg; -import com.iformall.domain.vo.OweMerchantVo; -import com.iformall.domain.vo.WaitMerchantVo; -import com.iformall.domain.vo.WxBillAll; -import com.iformall.domain.vo.WxBillAllVo; +import com.iformall.domain.vo.*; import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.mq.MqBaseProducer; import com.iformall.service.*; +import com.iformall.utils.DateUtils; +import com.iformall.utils.PriceUtil; +import com.iformall.utils.WordUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.commons.collections.map.HashedMap; import org.apache.commons.lang3.StringUtils; @@ -98,6 +98,15 @@ public class WxBillAllServiceImpl implements WxBillAllService { @Autowired WxMallMapper wxMallMapper; + @Autowired + WxMerchantMapper wxMerchantMapper; + + @Autowired + private String fmUploadDir; + + @Autowired + private WxPayAccountBillMapper wxPayAccountBillMapper; + @Override public Map listAsPage(WxBillAll record, Integer pageIndex, Integer pageSize) { //更新各账单状态 @@ -587,8 +596,127 @@ public class WxBillAllServiceImpl implements WxBillAllService { public void exportOweBill(WxBillAll wxBillAll, HttpServletRequest request, HttpServletResponse response) { //商场名称 WxMall wxMall = wxMallMapper.getByTenantId(wxBillAll.getTenantId()); - //账单总数 - List> data = wxBillAllMapper.getOweBillAsPage(wxBillAll); + //映射结果 + Map result = new HashMap<>(); + result.put("mall", wxMall.getName()); + + //付款方式 + WxPayAccountBill wxPayAccountBill = new WxPayAccountBill(); + wxPayAccountBill.setTenantId(wxBillAll.getTenantId()); + wxPayAccountBill = wxPayAccountBillMapper.selectOne(wxPayAccountBill); + if (wxPayAccountBill == null) { + result.put("accountNumber", wxPayAccountBill.getBankCardId()); + result.put("accountName", wxPayAccountBill.getBankAccountName()); + } else { + result.put("accountNumber", " "); + result.put("accountName", " "); + } + + //账单时间段 + result.put("starttime", wxBillAll.getStarttime()); + result.put("endtime", wxBillAll.getEndtime().substring(0, 10)); + + //编号 + String number = "JF" + DateUtils.getSystemTime("yyyyMMddHHmmss"); + result.put("number", number); + //数据 + List list = wxBillAllMapper.list(wxBillAll); + if (!list.isEmpty()) { + //租金总额 + Long rentSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //物业总额 + Long propertySum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //押金总额 + Long depositSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || + b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.ATHER_DEPOSIT.getCode())) + .collect(Collectors.summingLong(b -> b.getOwe())); + //水费 + Long waterSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.WATER.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //电费 + Long powerSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.POWER.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //空调费 + Long airConditioningSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.AIR_CONDITIONING.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //其他费用 + Long otherSum = list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())).collect(Collectors.summingLong(b -> b.getOwe())); + //押金明细 + StringBuffer depositDetail = new StringBuffer(); + list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.RENT_DEPOSIT.getCode()) || + b.getBillTypeValue().equals(EnumBillTypeParam.PROPERTY_DEPOSIT.getCode()) || b.getBillTypeValue().equals(EnumBillTypeParam.ATHER_DEPOSIT.getCode())) + .forEach(b -> { + BigDecimal owe = new BigDecimal(b.getOwe()).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + depositDetail.append(b.getName()).append(":[").append(owe.toPlainString()).append("] "); + }); + + //其他费用明细 + StringBuffer otherDetail = new StringBuffer(); + list.parallelStream().filter(b -> b.getBillTypeValue().equals(EnumBillTypeParam.ROUTINE.getCode())) + .forEach(b -> { + BigDecimal owe = new BigDecimal(b.getOwe()).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + otherDetail.append(b.getName()).append(":[").append(owe.toPlainString()).append("] "); + }); + //总计 + Long summarySum = rentSum + propertySum + depositSum + waterSum + powerSum + airConditioningSum + otherSum; + BigDecimal rent = new BigDecimal(rentSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal property = new BigDecimal(propertySum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal deposit = new BigDecimal(depositSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal water = new BigDecimal(waterSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal power = new BigDecimal(powerSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal airConditioning = new BigDecimal(airConditioningSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal other = new BigDecimal(otherSum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + BigDecimal summary = new BigDecimal(summarySum).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); + String summaryUpper = PriceUtil.number2CNMontrayUnit(summary); + + result.put("rent", rent.toPlainString()); + result.put("property", property.toPlainString()); + result.put("deposit", deposit.toPlainString()); + result.put("water", water.toPlainString()); + result.put("power", power.toPlainString()); + result.put("airConditioning", airConditioning.toPlainString()); + result.put("other", other.toPlainString()); + result.put("summary", summary.toPlainString()); + result.put("summaryUpper", summaryUpper); + + result.put("depositDetail", StringUtils.isNotEmpty(depositDetail.toString()) ? depositDetail.toString() : " "); + result.put("otherDetail", StringUtils.isNotEmpty(otherDetail.toString()) ? otherDetail.toString() : " "); + + WxMerchantVo wxMerchantVo = new WxMerchantVo(); + wxMerchantVo.setId(wxBillAll.getMerchantId()); + List listCVo = wxMerchantMapper.findListCVo(wxMerchantVo); + wxMerchantVo = listCVo.get(0); + result.put("merchant", wxMerchantVo.getMerchantName()); + WxShopVo wxShopVo = wxMerchantVo.getShopVoList().parallelStream().filter(s -> StringUtils.isNotEmpty(s.getLinkPhone())).findAny().orElse(null); + if (wxShopVo != null) { + result.put("linkPerson", wxShopVo.getLinkPerson()); + result.put("linkPhone", wxShopVo.getLinkPhone()); + } else { + result.put("linkPerson", " "); + result.put("linkPhone", " "); + } + + } else { + result.put("merchant", " "); + result.put("rent", " "); + result.put("property", " "); + result.put("deposit", " "); + result.put("water", " "); + result.put("power", " "); + result.put("airConditioning", " "); + result.put("other", " "); + result.put("summary", " "); + result.put("summaryUpper", " "); + + result.put("depositDetail", " "); + result.put("otherDetail", " "); + } + + String createtime = DateUtils.getSystemTime("yyyy-MM-dd"); + result.put("createtime", createtime); + + String templatePath = "contract-word-template/bill_owe.docx"; + String filepath = fmUploadDir; + String filename = UUID.randomUUID() + ".docx"; + String exportFileName = "催缴单.docx"; + WordUtil.exportWord(templatePath, filepath, filename, exportFileName, result, request, response); } diff --git a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java index 93bf26bbb..265c05f24 100644 --- a/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java +++ b/mallinkService/src/main/java/com/iformall/service/impl/WxRentContractServiceImpl.java @@ -1,6 +1,5 @@ package com.iformall.service.impl; -import cn.afterturn.easypoi.word.WordExportUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.github.pagehelper.PageHelper; @@ -14,14 +13,12 @@ import com.iformall.enums.*; import com.iformall.exception.MallinkException; import com.iformall.mapper.*; import com.iformall.service.*; -import com.iformall.utils.Constant; -import com.iformall.utils.DataUtil; import com.iformall.utils.DateUtils; -import me.chanjar.weixin.common.util.DataUtils; +import com.iformall.utils.DownFileUtil; +import com.iformall.utils.PriceUtil; +import com.iformall.utils.WordUtil; import org.apache.commons.collections.map.HashedMap; -import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.xwpf.usermodel.XWPFDocument; import org.apache.shiro.SecurityUtils; import org.flowable.engine.RuntimeService; import org.flowable.engine.TaskService; @@ -31,19 +28,16 @@ import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; -import org.springframework.util.Assert; import org.springframework.util.CollectionUtils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.*; +import java.io.File; +import java.io.IOException; import java.math.BigDecimal; import java.math.RoundingMode; -import java.net.HttpURLConnection; -import java.net.URL; import java.text.DecimalFormat; import java.text.SimpleDateFormat; -import java.time.*; import java.util.*; /** @@ -1172,8 +1166,8 @@ public class WxRentContractServiceImpl implements WxRentContractService { } try { String exportFileName = wxRentContract.getFilename(); - downLoadFromUrl(wxRentContract.getFilepath(), filename, filepath); - downFile(destPath, wxRentContract.getFilename(), exportFileName, response, request); + DownFileUtil.downLoadFromUrl(wxRentContract.getFilepath(), filename, filepath); + DownFileUtil.downFile(destPath, exportFileName, response, request); org.apache.commons.io.FileUtils.forceDelete(dest); } catch (IOException e) { logger.info("创建本地文件失败" + e.getMessage()); @@ -1325,74 +1319,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { } } - public static void downLoadFromUrl(String urlStr, String fileName, String savePath) throws IOException { - URL url = new URL(urlStr); - HttpURLConnection conn = (HttpURLConnection) url.openConnection(); - //设置超时间为3秒 - conn.setConnectTimeout(3 * 1000); - //防止屏蔽程序抓取而返回403错误 - conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); - - //得到输入流 - InputStream inputStream = conn.getInputStream(); - //获取自己数组 - byte[] getData = readInputStream(inputStream); - - //文件保存位置 - File saveDir = new File(savePath); - if (!saveDir.exists()) { - saveDir.mkdir(); - } - File file = new File(saveDir + File.separator + fileName); - FileOutputStream fos = new FileOutputStream(file); - fos.write(getData); - if (fos != null) { - fos.close(); - } - if (inputStream != null) { - inputStream.close(); - } - - - System.out.println("info:" + url + " download success"); - - } - - public static byte[] readInputStream(InputStream inputStream) throws IOException { - byte[] buffer = new byte[1024]; - int len = 0; - ByteArrayOutputStream bos = new ByteArrayOutputStream(); - while ((len = inputStream.read(buffer)) != -1) { - bos.write(buffer, 0, len); - } - bos.close(); - return bos.toByteArray(); - } - - public void downFile(String filePath, String filename, String exportFileName, HttpServletResponse response, - HttpServletRequest req) { - try { - response.reset(); - response.setContentType("bin"); - String agent = req.getHeader("user-agent"); - if (agent.contains("Firefox")) { - response.setHeader("Content-disposition", "attachment; filename=" + new String(exportFileName.getBytes("GB2312"), "ISO-8859-1")); - } else { - response.setHeader("Content-disposition", "attachment; filename=" + java.net.URLEncoder.encode(exportFileName, "UTF-8")); - } - // 循环取出流中的数据 - byte[] b = new byte[1024]; - int len; - InputStream inStream = new FileInputStream(filePath); - while ((len = inStream.read(b)) > 0) - response.getOutputStream().write(b, 0, len); - inStream.close(); - } catch (Exception e) { - logger.info("下载合同失败" + e.getMessage()); - e.printStackTrace(); - } - } - @Override public void exportContract(HttpServletRequest request, HttpServletResponse response, String tenantId, Long id) { String contracType = "0"; @@ -1417,7 +1343,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { String filepath = fmUploadDir; String filename = UUID.randomUUID() + ".docx"; String exportFileName = result.get("merchantName").toString() + "合同.docx"; - exportWord(templatePath, filepath, filename, exportFileName, result, request, response); + WordUtil.exportWord(templatePath, filepath, filename, exportFileName, result, request, response); } @Override @@ -1617,15 +1543,15 @@ public class WxRentContractServiceImpl implements WxRentContractService { .divide(new BigDecimal(100)) .setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("unitPriceRent", unitPrice); - result.put("priceRentUpper", digitUppercase(priceRent)); - result.put("unitPriceRentUpper", digitUppercase(unitPrice)); + result.put("priceRentUpper", PriceUtil.digitUppercase(priceRent)); + result.put("unitPriceRentUpper", PriceUtil.digitUppercase(unitPrice)); //租赁保证金 int cashDepositMonthRent = 3; double cashDepositRent = new BigDecimal(wxRentContract.getPrice()).multiply(new BigDecimal(cashDepositMonthRent)) .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("cashDepositMonthRent", cashDepositMonthRent); result.put("cashDepositRent", cashDepositRent); - result.put("cashDepositRentUpper", digitUppercase(cashDepositRent)); + result.put("cashDepositRentUpper", PriceUtil.digitUppercase(cashDepositRent)); result.put("type", wxRentContract.getType()); int extralease = lease % 12; int extracount = extralease > 0 ? 1 : 0; @@ -1638,10 +1564,10 @@ public class WxRentContractServiceImpl implements WxRentContractService { double revenue = new BigDecimal(wxRentContract.getRevenue()) .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("revenue", revenue); - result.put("revenueUpper", digitUppercase(revenue)); + result.put("revenueUpper", PriceUtil.digitUppercase(revenue)); } else { result.put("revenue", 0); - result.put("revenueUpper", digitUppercase(0)); + result.put("revenueUpper", PriceUtil.digitUppercase(0)); } if (!wxRentContract.getType().equals(EnumRentContractType.RENT_BY_JOINT.getCode())) { areaWay(wxRentContract, result, lease, extralease, extracount, paycount, index, count, rentPrice); @@ -1672,8 +1598,8 @@ public class WxRentContractServiceImpl implements WxRentContractService { .divide(new BigDecimal(wxRentContract.getRentArea()), 2, RoundingMode.HALF_EVEN) .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("unitPriceProperty", unitPriceProperty); - result.put("pricePropertyUpper", digitUppercase(priceProperty)); - result.put("unitPricePropertyUpper", digitUppercase(unitPriceProperty)); + result.put("pricePropertyUpper", PriceUtil.digitUppercase(priceProperty)); + result.put("unitPricePropertyUpper", PriceUtil.digitUppercase(unitPriceProperty)); //首期物业费 Calendar instance = Calendar.getInstance(); instance.setTime(wxRentContract.getRentalStartDate()); @@ -1699,7 +1625,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { .multiply(new BigDecimal(receivePeriodProperty)) .setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("pricePropertyFirst", pricePropertyFirst); - result.put("pricePropertyFirstUpper", digitUppercase(pricePropertyFirst)); + result.put("pricePropertyFirstUpper", PriceUtil.digitUppercase(pricePropertyFirst)); //物业保证金 @@ -1708,7 +1634,7 @@ public class WxRentContractServiceImpl implements WxRentContractService { .divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN).doubleValue(); result.put("cashDepositMonthProperty", cashDepositMonthProperty); result.put("cashDepositProperty", cashDepositProperty); - result.put("cashDepositPropertyUpper", digitUppercase(cashDepositProperty)); + result.put("cashDepositPropertyUpper", PriceUtil.digitUppercase(cashDepositProperty)); } else { @@ -1887,13 +1813,13 @@ public class WxRentContractServiceImpl implements WxRentContractService { if (wxRentContract.getRentShopType().equals(EnumRentShopType.SHOP.getCode())) { rentPrice = new BigDecimal(priceArrs[i]).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); - result.put("priceRentUpper" + i, digitUppercase(rentPrice.doubleValue())); + result.put("priceRentUpper" + i, PriceUtil.digitUppercase(rentPrice.doubleValue())); result.put("priceRent" + i, rentPrice.doubleValue()); result.put("adjustRatio" + i, adjustRatioList.get(i)); } else { rentPrice = rentPrice.multiply(new BigDecimal(adjustRatioList.get(i))) .add(rentPrice).setScale(2, RoundingMode.HALF_EVEN); - result.put("priceRentUpper" + i, digitUppercase(rentPrice.doubleValue())); + result.put("priceRentUpper" + i, PriceUtil.digitUppercase(rentPrice.doubleValue())); result.put("priceRent" + i, rentPrice.doubleValue()); result.put("adjustRatio" + i, adjustRatioList.get(i)); } @@ -1926,12 +1852,12 @@ public class WxRentContractServiceImpl implements WxRentContractService { if (wxRentContract.getRentShopType().equals(EnumRentShopType.SHOP.getCode())) { rentPrice = new BigDecimal(priceArrs[count]).divide(new BigDecimal(100)).setScale(2, RoundingMode.HALF_EVEN); - result.put("priceRentUpper" + count, digitUppercase(rentPrice.doubleValue())); + result.put("priceRentUpper" + count, PriceUtil.digitUppercase(rentPrice.doubleValue())); result.put("priceRent" + count, rentPrice.doubleValue()); } else { rentPrice = rentPrice.multiply(new BigDecimal(adjustRatioList.get(count))) .add(rentPrice).setScale(2, RoundingMode.HALF_EVEN); - result.put("priceRentUpper" + count, digitUppercase(rentPrice.doubleValue())); + result.put("priceRentUpper" + count, PriceUtil.digitUppercase(rentPrice.doubleValue())); result.put("priceRent" + count, rentPrice.doubleValue()); } @@ -1954,102 +1880,6 @@ public class WxRentContractServiceImpl implements WxRentContractService { } } - /** - * 导出word - *

第一步生成替换后的word文件,只支持docx

- *

第二步下载生成的文件

- *

第三步删除生成的临时文件

- * 模版变量中变量格式:{{foo}} - * - * @param templatePath word模板地址 - * @param temDir 生成临时文件存放地址 - * @param fileName 文件名 - * @param params 替换的参数 - * @param request HttpServletRequest - * @param response HttpServletResponse - */ - public void exportWord(String templatePath, String temDir, String fileName, String exportFileName, Map params, HttpServletRequest request, HttpServletResponse response) { - Assert.notNull(templatePath, "模板路径不能为空"); - Assert.notNull(temDir, "临时文件路径不能为空"); - Assert.notNull(exportFileName, "导出文件名不能为空"); - Assert.isTrue(exportFileName.endsWith(".docx"), "word导出请使用docx格式"); - if (!temDir.endsWith("/")) { - temDir = temDir + File.separator; - } - File dir = new File(temDir); - if (!dir.exists()) { - dir.mkdirs(); - } - try { -// String userAgent = request.getHeader("user-agent").toLowerCase(); -// if (userAgent.contains("msie") || userAgent.contains("like gecko")) { -// exportFileName = URLEncoder.encode(exportFileName, "UTF-8"); -// } else { -// exportFileName = new String(exportFileName.getBytes("utf-8"), "ISO-8859-1"); -// } - - - XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); - String tmpPath = temDir + fileName; - FileOutputStream fos = new FileOutputStream(tmpPath); - doc.write(fos); - // 设置强制下载不打开 - response.setContentType("application/force-download"); - // 设置文件名 - response.addHeader("Content-Disposition", "attachment;fileName=" + exportFileName); - String userAgent = request.getHeader("user-agent"); - if (userAgent.contains("Firefox")) { - response.setHeader("Content-disposition", - "attachment; filename=" - + new String(exportFileName.getBytes("GB2312"), - "ISO-8859-1")); - } else { - response - .setHeader("Content-disposition", - "attachment; filename=" - + java.net.URLEncoder.encode(exportFileName, - "UTF-8")); - } - OutputStream out = response.getOutputStream(); - doc.write(out); - out.close(); - FileUtils.forceDelete(new File(tmpPath)); - } catch (Exception e) { - e.printStackTrace(); - } - - } - - /** - * 数字金额大写转换,思想先写个完整的然后将如零拾替换成零 要用到正则表达式 - */ - 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("^整$", "零元整"); - } @Override public void updateApplyStatus(WxRentContract wxRentContract) { diff --git a/mallinkService/src/main/java/com/iformall/utils/DownFileUtil.java b/mallinkService/src/main/java/com/iformall/utils/DownFileUtil.java index 047602078..362b72ed6 100644 --- a/mallinkService/src/main/java/com/iformall/utils/DownFileUtil.java +++ b/mallinkService/src/main/java/com/iformall/utils/DownFileUtil.java @@ -2,9 +2,9 @@ package com.iformall.utils; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.FileInputStream; -import java.io.IOException; -import java.io.InputStream; +import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; /** * @author luozukai @@ -37,4 +37,49 @@ public class DownFileUtil { response.getOutputStream().write(b, 0, len); inStream.close(); } + + public static void downLoadFromUrl(String urlStr, String fileName, String savePath) throws IOException { + URL url = new URL(urlStr); + HttpURLConnection conn = (HttpURLConnection) url.openConnection(); + //设置超时间为3秒 + conn.setConnectTimeout(3 * 1000); + //防止屏蔽程序抓取而返回403错误 + conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt)"); + + //得到输入流 + InputStream inputStream = conn.getInputStream(); + //获取自己数组 + byte[] getData = readInputStream(inputStream); + + //文件保存位置 + File saveDir = new File(savePath); + if (!saveDir.exists()) { + saveDir.mkdir(); + } + File file = new File(saveDir + File.separator + fileName); + FileOutputStream fos = new FileOutputStream(file); + fos.write(getData); + if (fos != null) { + fos.close(); + } + if (inputStream != null) { + inputStream.close(); + } + + + System.out.println("info:" + url + " download success"); + + } + + public static byte[] readInputStream(InputStream inputStream) throws IOException { + byte[] buffer = new byte[1024]; + int len = 0; + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + while ((len = inputStream.read(buffer)) != -1) { + bos.write(buffer, 0, len); + } + bos.close(); + return bos.toByteArray(); + } + } diff --git a/mallinkService/src/main/java/com/iformall/utils/PriceUtil.java b/mallinkService/src/main/java/com/iformall/utils/PriceUtil.java new file mode 100644 index 000000000..3a4b1a27d --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/PriceUtil.java @@ -0,0 +1,154 @@ +package com.iformall.utils; + +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.math.BigDecimal; + +public class PriceUtil { + + private static final Logger logger = LoggerFactory.getLogger(PriceUtil.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 = "负"; + /** + * 金额的精度,默认值为2 + */ + private static final int MONEY_PRECISION = 2; + /** + * 特殊字符:零元整 + */ + private static final String CN_ZEOR_FULL = "零元" + CN_FULL; + + /** + * 把输入的金额转换为汉语中人民币的大写 + * + * @param numberOfMoney 输入的金额 + * @return 对应的汉语大写 + */ + public static String number2CNMontrayUnit(BigDecimal numberOfMoney) { + StringBuffer sb = new StringBuffer(); + // -1, 0, or 1 as the value of this BigDecimal is negative, zero, or + // positive. + int signum = numberOfMoney.signum(); + // 零元整的情况 + if (signum == 0) { + return CN_ZEOR_FULL; + } + //这里会进行金额的四舍五入 + long number = numberOfMoney.movePointRight(MONEY_PRECISION) + .setScale(0, 4).abs().longValue(); + // 得到小数点后两位值 + long scale = number % 100; + int numUnit = 0; + int numIndex = 0; + boolean getZero = false; + // 判断最后两位数,一共有四中情况:00 = 0, 01 = 1, 10, 11 + if (!(scale > 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(); + } + + +} \ No newline at end of file diff --git a/mallinkService/src/main/java/com/iformall/utils/WordUtil.java b/mallinkService/src/main/java/com/iformall/utils/WordUtil.java new file mode 100644 index 000000000..1439defc9 --- /dev/null +++ b/mallinkService/src/main/java/com/iformall/utils/WordUtil.java @@ -0,0 +1,87 @@ +package com.iformall.utils; + +import cn.afterturn.easypoi.word.WordExportUtil; +import org.apache.commons.io.FileUtils; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.util.Assert; + +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.File; +import java.io.FileOutputStream; +import java.io.OutputStream; +import java.util.Map; + +public class WordUtil { + + private static final Logger logger = LoggerFactory.getLogger(WordUtil.class); + + /** + * 导出word + *

第一步生成替换后的word文件,只支持docx

+ *

第二步下载生成的文件

+ *

第三步删除生成的临时文件

+ * 模版变量中变量格式:{{foo}} + * + * @param templatePath word模板地址 + * @param temDir 生成临时文件存放地址 + * @param fileName 文件名 + * @param params 替换的参数 + * @param request HttpServletRequest + * @param response HttpServletResponse + */ + public static void exportWord(String templatePath, String temDir, String fileName, String exportFileName, Map params, HttpServletRequest request, HttpServletResponse response) { + Assert.notNull(templatePath, "模板路径不能为空"); + Assert.notNull(temDir, "临时文件路径不能为空"); + Assert.notNull(exportFileName, "导出文件名不能为空"); + Assert.isTrue(exportFileName.endsWith(".docx"), "word导出请使用docx格式"); + if (!temDir.endsWith("/")) { + temDir = temDir + File.separator; + } + File dir = new File(temDir); + if (!dir.exists()) { + dir.mkdirs(); + } + try { +// String userAgent = request.getHeader("user-agent").toLowerCase(); +// if (userAgent.contains("msie") || userAgent.contains("like gecko")) { +// exportFileName = URLEncoder.encode(exportFileName, "UTF-8"); +// } else { +// exportFileName = new String(exportFileName.getBytes("utf-8"), "ISO-8859-1"); +// } + + + XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params); + String tmpPath = temDir + fileName; + FileOutputStream fos = new FileOutputStream(tmpPath); + doc.write(fos); + // 设置强制下载不打开 + response.setContentType("application/force-download"); + // 设置文件名 + response.addHeader("Content-Disposition", "attachment;fileName=" + exportFileName); + String userAgent = request.getHeader("user-agent"); + if (userAgent.contains("Firefox")) { + response.setHeader("Content-disposition", + "attachment; filename=" + + new String(exportFileName.getBytes("GB2312"), + "ISO-8859-1")); + } else { + response + .setHeader("Content-disposition", + "attachment; filename=" + + java.net.URLEncoder.encode(exportFileName, + "UTF-8")); + } + OutputStream out = response.getOutputStream(); + doc.write(out); + out.close(); + FileUtils.forceDelete(new File(tmpPath)); + } catch (Exception e) { + e.printStackTrace(); + } + + } + +} \ No newline at end of file diff --git a/mallinkService/src/main/resources/contract-word-template/bill_owe.docx b/mallinkService/src/main/resources/contract-word-template/bill_owe.docx new file mode 100644 index 0000000000000000000000000000000000000000..13b6c090d3353aa6f823f93cb51f66a4a9502f2f GIT binary patch literal 45393 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

)G}EST-%ZfWc5^93@{bqF7nR3Q5sZ=Efw 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%0AsXnR_ z&s+^opdEF1srS*2%QFNXs-BODmQ01Tztz0km7z-Iw6uoW@MjrjawU-{d?Mk)w(Z zAUaiYNRG5H*xGY^bvOYUZS0K8ue2S(ZoRP*UZ(o=ve*5n0HDhILWX&v)N9H)S?b%U z|6tbF$`AY~$k2*^4jWZYVl@PaI~@x&1ka2VR9s11>c_M&HTlG`6{}FdrykhA7kpAb zoKnf&q^=@MfkSknKH@*)iM*bpxF~LN!|Fs)t{f%BOc?4QRgFww&&J7xA+7)@!(){2 ziIEqYDV3N7h+Jj|hikzKV zMDOZNb2lo{88Kh28YCeBr`4Ub2Fa!4^_r2UA=)!rUGEfooeO6sJa1vP$c!5li4#33 z_c=}YDoWfDTOrgnJ9b&1&k9m4fq{~pGPP=>h|UiNZ|A^o2){-8&pgSo>bXrBK@1Kx z=5`cQ8t?i9qTe{ZP1$?;HOfx4X|ZPDwt+-saMk-pUl&RYV5C9*%Jr zcuZ&_VoytY3XO=i?tN7Rz}W3VvD9DZg05)++lkUZTtBIQMysL65MFK5*m_AxfNzih zkY3gd93Vhqll%2bzWe|H2!Qi)ohkU&b^U4J-#6wTneS)&u|@A@|CQrj5BfS2{=obk z6f);8%pd=i{~GM43qPPg25YwYXHNJp+>hQr+mAcJ+<)T!+A4pK(d%sT1O3xoyMICd zo?Bi|{WVwcm#wYeX7IO_*9KnG^nMvAwEgE)ekbkyS3n?snE0dp6`Ge6@CV=Te?2X) zYvcSt{ftBn zSmDJ_swzMLlppAq_S1Xfm%G2cw>7de(=pdJHl=bfGx)E-f&5|N$K^-h-iZ8}M*j=) z|TY8+x-dujaK;@|61$s7hYTQZ~WiNf3MN61wntIomKxt|6~3?(f_{D z{l1JcPJg2RBBA}heY~cj{TkNgci=Bl+H22WYbpOSaj)>_*#A^kehq(JUgj5^@UMsV zSFxG@`@A2t{~Y@-O}pRc{aV%T*Qf+KzX5+~+)0Uo{E39-% literal 0 HcmV?d00001 diff --git a/mallinkService/src/main/resources/contract-word-template/owe_bill.docx b/mallinkService/src/main/resources/contract-word-template/owe_bill.docx deleted file mode 100644 index 7dddd89eed88c2ccef55395c33d2d6e93cae3f5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8400 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 b4ESGBOGO?5@vq0wpr2dlHfbmQ>+b&mrdyf8 diff --git a/mallinkService/src/main/resources/mapper/WxBillAllMapper.xml b/mallinkService/src/main/resources/mapper/WxBillAllMapper.xml index 5bf2491e8..180887a0b 100644 --- a/mallinkService/src/main/resources/mapper/WxBillAllMapper.xml +++ b/mallinkService/src/main/resources/mapper/WxBillAllMapper.xml @@ -32,6 +32,9 @@ + + + @@ -103,6 +106,15 @@ and bill.receive_date between #{starttime} and #{endtime} + + and bill.merchant_id=#{merchantId} + + + and bill.`status` in + + #{status} + + order by ${sortColumns} order by bill.id desc,bill.merchant_id,bill.status,bill.receive_date desc