| | |
| | | import com.alibaba.fastjson.parser.Feature; |
| | | import com.java110.core.component.BaseComponentSMO; |
| | | import com.java110.core.context.IPageData; |
| | | import com.java110.core.factory.Java110ThreadPoolFactory; |
| | | import com.java110.entity.component.ComponentValidateResult; |
| | | import com.java110.front.smo.assetExport.IExportFeeManualCollectionSMO; |
| | | import com.java110.utils.constant.ServiceConstant; |
| | | import com.java110.utils.util.Assert; |
| | | import com.java110.utils.util.Base64Convert; |
| | | import com.java110.utils.util.DateUtil; |
| | | import org.apache.poi.ss.usermodel.Cell; |
| | | import org.apache.poi.ss.usermodel.CellStyle; |
| | | import org.apache.poi.ss.usermodel.Row; |
| | | import org.apache.poi.ss.usermodel.Sheet; |
| | | import org.apache.poi.ss.usermodel.Workbook; |
| | | import com.java110.utils.util.Money2ChineseUtil; |
| | | import org.apache.poi.ss.usermodel.*; |
| | | import org.apache.poi.ss.util.CellRangeAddress; |
| | | import org.apache.poi.xssf.usermodel.XSSFClientAnchor; |
| | | import org.apache.poi.xssf.usermodel.XSSFWorkbook; |
| | | import org.slf4j.Logger; |
| | | import org.slf4j.LoggerFactory; |
| | |
| | | import java.io.ByteArrayOutputStream; |
| | | import java.io.IOException; |
| | | import java.math.BigDecimal; |
| | | import java.util.HashMap; |
| | | import java.util.List; |
| | | import java.util.Map; |
| | | |
| | | /** |
| | | * @ClassName AssetImportSmoImpl |
| | |
| | | } |
| | | // 保存数据 |
| | | return new ResponseEntity<Object>(context, headers, HttpStatus.OK); |
| | | } |
| | | |
| | | @Override |
| | | public ResponseEntity<Object> downloadCollectionLetterOrder(IPageData pd) { |
| | | ComponentValidateResult result = this.validateStoreStaffCommunityRelationship(pd, restTemplate); |
| | | |
| | | Assert.hasKeyAndValue(JSONObject.parseObject(pd.getReqData()), "communityId", "请求中未包含小区"); |
| | | |
| | | Workbook workbook = null; //工作簿 |
| | | //工作表 |
| | | workbook = new XSSFWorkbook(); |
| | | //获取楼信息 |
| | | getRoomOweFees(pd, result, workbook); |
| | | |
| | | |
| | | ByteArrayOutputStream os = new ByteArrayOutputStream(); |
| | | MultiValueMap headers = new HttpHeaders(); |
| | | headers.add("content-type", "application/octet-stream;charset=UTF-8"); |
| | | headers.add("Content-Disposition", "attachment;filename=downloadCollectionLetterOrder_" + DateUtil.getyyyyMMddhhmmssDateString() + ".xlsx"); |
| | | headers.add("Pargam", "no-cache"); |
| | | headers.add("Cache-Control", "no-cache"); |
| | | //headers.add("Content-Disposition", "attachment; filename=" + outParam.getString("fileName")); |
| | | headers.add("Accept-Ranges", "bytes"); |
| | | byte[] context = null; |
| | | try { |
| | | workbook.write(os); |
| | | context = os.toByteArray(); |
| | | |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | // 保存数据 |
| | | return new ResponseEntity<Object>("导出失败", HttpStatus.INTERNAL_SERVER_ERROR); |
| | | } finally { |
| | | try { |
| | | os.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | try { |
| | | workbook.close(); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | // 保存数据 |
| | | return new ResponseEntity<Object>(context, headers, HttpStatus.OK); |
| | | } |
| | | |
| | | /** |
| | | * 查询房屋欠费 |
| | | * |
| | | * @param pd |
| | | * @param result |
| | | * @param workbook |
| | | */ |
| | | private void getRoomOweFees(IPageData pd, ComponentValidateResult result, Workbook workbook) { |
| | | Sheet sheet = workbook.createSheet("催缴单"); |
| | | Drawing patriarch = sheet.createDrawingPatriarch(); |
| | | String apiUrl = ""; |
| | | ResponseEntity<String> responseEntity = null; |
| | | JSONObject reqJson = JSONObject.parseObject(pd.getReqData()); |
| | | apiUrl = ServiceConstant.SERVICE_API_URL + "/api/feeApi/listAllRoomOweFees" + mapToUrlParam(reqJson); |
| | | responseEntity = this.callCenterService(restTemplate, pd, "", apiUrl, HttpMethod.GET); |
| | | |
| | | if (responseEntity.getStatusCode() != HttpStatus.OK) { //跳过 保存单元信息 |
| | | return; |
| | | } |
| | | |
| | | JSONObject savedRoomInfoResults = JSONObject.parseObject(responseEntity.getBody(), Feature.OrderedField); |
| | | |
| | | |
| | | if (!savedRoomInfoResults.containsKey("data")) { |
| | | return; |
| | | } |
| | | |
| | | |
| | | JSONArray rooms = savedRoomInfoResults.getJSONArray("data"); |
| | | |
| | | if (rooms == null || rooms.size() < 1) { |
| | | return; |
| | | } |
| | | |
| | | //查询催缴单二维码 |
| | | JSONObject feePrint = null; |
| | | apiUrl = ServiceConstant.SERVICE_API_URL + "/api/feePrintSpec/queryFeePrintSpec?page=1&row=1&specCd=1010&communityId=" + result.getCommunityId(); |
| | | responseEntity = this.callCenterService(restTemplate, pd, "", apiUrl, HttpMethod.GET); |
| | | if (responseEntity.getStatusCode() == HttpStatus.OK) { |
| | | JSONObject feePrintResults = JSONObject.parseObject(responseEntity.getBody(), Feature.OrderedField); |
| | | if (feePrintResults.containsKey("data")) { |
| | | JSONArray feePrints = feePrintResults.getJSONArray("data"); |
| | | if (feePrints != null && feePrints.size() > 0) { |
| | | feePrint = feePrints.getJSONObject(0); |
| | | } |
| | | } |
| | | |
| | | } |
| | | |
| | | |
| | | int line = 0; |
| | | double totalPageHeight = 0; |
| | | for (int roomIndex = 0; roomIndex < rooms.size(); roomIndex++) { |
| | | Map<String, Object> info = generatorRoomOweFee(sheet, workbook, rooms.getJSONObject(roomIndex), line, totalPageHeight, patriarch, feePrint); |
| | | line = Integer.parseInt(info.get("line").toString()) + 1; |
| | | totalPageHeight = Double.parseDouble(info.get("totalPageHeight").toString()); |
| | | } |
| | | } |
| | | |
| | | private Map<String, Object> generatorRoomOweFee(Sheet sheet, Workbook workbook, JSONObject room, int line, double totalPageHeight, Drawing patriarch, JSONObject feePrint) { |
| | | JSONArray fees = room.getJSONArray("fees"); |
| | | String[] feePrintRemarks = null; |
| | | if (feePrint != null) { |
| | | feePrintRemarks = feePrint.getString("content").toLowerCase().replace("</br>", "").split("\n"); |
| | | } |
| | | int defaultRowHeight = 280; |
| | | //计算当前单子的高度 |
| | | int titleHeight = defaultRowHeight * 3; |
| | | int subTitleHeight = defaultRowHeight * 5; |
| | | int totalHeight = titleHeight + subTitleHeight + defaultRowHeight * 3 + fees.size() * defaultRowHeight; |
| | | //备注,加上打印配置内容 |
| | | if (feePrintRemarks != null && feePrintRemarks.length > 0) { |
| | | totalHeight += (feePrintRemarks.length * defaultRowHeight); |
| | | } |
| | | double A4_lengthways_pageSize = defaultRowHeight * 57;//15960 |
| | | |
| | | //当前页 已经占用的高度 |
| | | double curPageHeight = totalPageHeight % A4_lengthways_pageSize; |
| | | //当前页空闲高度 |
| | | double freePageHeight = A4_lengthways_pageSize - curPageHeight; |
| | | if (freePageHeight < totalHeight && curPageHeight != 0) { |
| | | line += Math.ceil(freePageHeight / defaultRowHeight); |
| | | totalPageHeight += freePageHeight; |
| | | } |
| | | |
| | | totalPageHeight += totalHeight; |
| | | |
| | | |
| | | sheet.setColumnWidth(0, 8 * 256 * 2); |
| | | sheet.setColumnWidth(1, 8 * 256 * 1); |
| | | sheet.setColumnWidth(2, 8 * 256 * 1); |
| | | sheet.setColumnWidth(3, 8 * 256 * 3); |
| | | sheet.setColumnWidth(4, 8 * 256 * 1); |
| | | sheet.setColumnWidth(5, 8 * 256 * 1); |
| | | sheet.setColumnWidth(6, 8 * 256 * 1); |
| | | |
| | | //通用样式 |
| | | CellStyle cellStyle = workbook.createCellStyle(); |
| | | //设置样式对象,这里仅设置了边框属性 |
| | | cellStyle.setBorderBottom(BorderStyle.THIN); //下边框 |
| | | cellStyle.setBorderLeft(BorderStyle.THIN);//左边框 |
| | | cellStyle.setBorderTop(BorderStyle.THIN);//上边框 |
| | | cellStyle.setBorderRight(BorderStyle.THIN);//右边框 |
| | | cellStyle.setAlignment(HorizontalAlignment.CENTER); |
| | | |
| | | // 标题 |
| | | Row row = sheet.createRow(0 + line); |
| | | Cell cell0 = row.createCell(0); |
| | | //cell0.setCellValue("缴费通知单totalHeight:" + totalHeight + "-totalPageHeight:" + totalPageHeight + "-curPageHeight:" + curPageHeight + "-freePageHeight:" + freePageHeight + "-line:" + line); |
| | | cell0.setCellValue("缴费通知单"); |
| | | //标题设置字体 |
| | | Font font = workbook.createFont(); |
| | | font.setFontName("黑体"); |
| | | font.setFontHeightInPoints((short) 26); |
| | | CellStyle titleCellStyle = workbook.createCellStyle(); |
| | | titleCellStyle.setFont(font); |
| | | titleCellStyle.setAlignment(HorizontalAlignment.CENTER); |
| | | cell0.setCellStyle(titleCellStyle); |
| | | row.setHeight((short) (titleHeight)); |
| | | |
| | | //合并标题 |
| | | CellRangeAddress region = new CellRangeAddress(0 + line, 0 + line, 0, 6); |
| | | sheet.addMergedRegion(region); |
| | | |
| | | |
| | | //子标题 |
| | | if (feePrint != null) { |
| | | XSSFClientAnchor anchor = new XSSFClientAnchor(0, 0, 0, 0, (short) 0, 1 + line, (short) 1, 1 + line + 1); |
| | | anchor.setAnchorType(ClientAnchor.AnchorType.MOVE_AND_RESIZE);//设置图片随单元移动调整大小 |
| | | try { |
| | | String qrImg = feePrint.getString("qrImg").replace("data:image/webp;base64,", "") |
| | | .replace("data:image/png;base64,", "") |
| | | .replace("data:image/jpeg;base64,", ""); |
| | | patriarch.createPicture(anchor, workbook.addPicture(Base64Convert.base64ToByte(qrImg), XSSFWorkbook.PICTURE_TYPE_JPEG)); |
| | | } catch (IOException e) { |
| | | e.printStackTrace(); |
| | | } |
| | | } |
| | | CellStyle subTitleCellStyle = workbook.createCellStyle(); |
| | | subTitleCellStyle.setAlignment(HorizontalAlignment.CENTER); |
| | | subTitleCellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM); |
| | | row = sheet.createRow(1 + line); |
| | | |
| | | Cell cell1 = row.createCell(1); |
| | | cell1.setCellValue("房号:" + room.getString("floorNum") |
| | | + "-" + room.getString("unitNum") |
| | | + "-" + room.getString("roomNum")); |
| | | cell1.setCellStyle(subTitleCellStyle); |
| | | |
| | | row.createCell(2).setCellValue(""); |
| | | row.createCell(3).setCellValue(""); |
| | | row.createCell(4).setCellValue(""); |
| | | Cell cell5 = row.createCell(5); |
| | | cell5.setCellValue(DateUtil.getNow(DateUtil.DATE_FORMATE_STRING_B)); |
| | | cell5.setCellStyle(subTitleCellStyle); |
| | | CellStyle rowCellStyle = workbook.createCellStyle(); |
| | | rowCellStyle.setVerticalAlignment(VerticalAlignment.BOTTOM); |
| | | row.setRowStyle(rowCellStyle); |
| | | |
| | | //设置表头之上 |
| | | region = new CellRangeAddress(1 + line, 1 + line, 1, 3); |
| | | sheet.addMergedRegion(region); |
| | | region = new CellRangeAddress(1 + line, 1 + line, 5, 6); |
| | | sheet.addMergedRegion(region); |
| | | //子标题高度 |
| | | row.setHeight((short) (subTitleHeight)); |
| | | |
| | | |
| | | row = sheet.createRow(2 + line); |
| | | cell0 = row.createCell(0); |
| | | cell0.setCellValue("收费名称"); |
| | | cell0.setCellStyle(cellStyle); |
| | | cell1 = row.createCell(1); |
| | | cell1.setCellValue("收费标准"); |
| | | cell1.setCellStyle(cellStyle); |
| | | Cell cell2 = row.createCell(2); |
| | | cell2.setCellValue("数量/面积"); |
| | | cell2.setCellStyle(cellStyle); |
| | | Cell cell3 = row.createCell(3); |
| | | cell3.setCellValue("欠费时间"); |
| | | cell3.setCellStyle(cellStyle); |
| | | Cell cell4 = row.createCell(4); |
| | | cell4.setCellValue("应缴金额(元)"); |
| | | cell4.setCellStyle(cellStyle); |
| | | cell5 = row.createCell(5); |
| | | cell5.setCellValue("违约金(元)"); |
| | | cell5.setCellStyle(cellStyle); |
| | | Cell cell6 = row.createCell(6); |
| | | cell6.setCellValue("备注"); |
| | | cell6.setCellStyle(cellStyle); |
| | | row.setHeight((short) (defaultRowHeight)); |
| | | |
| | | |
| | | BigDecimal totalPrice = new BigDecimal(0); |
| | | String startTime = ""; |
| | | String endTime = ""; |
| | | for (int feeIndex = 0; feeIndex < fees.size(); feeIndex++) { |
| | | JSONObject feeObj = fees.getJSONObject(feeIndex); |
| | | row = sheet.createRow(line + feeIndex + 3); |
| | | startTime = feeObj.getString("endTime").length() > 10 ? feeObj.getString("endTime").substring(0, 10) : feeObj.getString("endTime"); |
| | | endTime = feeObj.getString("deadlineTime").length() > 10 ? feeObj.getString("deadlineTime").substring(0, 10) : feeObj.getString("deadlineTime"); |
| | | |
| | | cell0 = row.createCell(0); |
| | | cell0.setCellValue(feeObj.getString("feeName")); |
| | | cell0.setCellStyle(cellStyle); |
| | | cell1 = row.createCell(1); |
| | | cell1.setCellValue(feeObj.getString("squarePrice")); |
| | | cell1.setCellStyle(cellStyle); |
| | | cell2 = row.createCell(2); |
| | | cell2.setCellValue(room.getString("builtUpArea")); |
| | | cell2.setCellStyle(cellStyle); |
| | | cell3 = row.createCell(3); |
| | | cell3.setCellValue(startTime + "至" + endTime); |
| | | cell3.setCellStyle(cellStyle); |
| | | cell4 = row.createCell(4); |
| | | cell4.setCellValue(feeObj.getString("feePrice")); |
| | | cell4.setCellStyle(cellStyle); |
| | | cell5 = row.createCell(5); |
| | | cell5.setCellValue("0"); |
| | | cell5.setCellStyle(cellStyle); |
| | | cell6 = row.createCell(6); |
| | | cell6.setCellValue(""); |
| | | cell6.setCellStyle(cellStyle); |
| | | row.setHeight((short) (defaultRowHeight)); |
| | | totalPrice = totalPrice.add(new BigDecimal(feeObj.getString("feePrice"))); |
| | | } |
| | | |
| | | row = sheet.createRow(line + fees.size() + 3); |
| | | |
| | | cell0 = row.createCell(0); |
| | | cell0.setCellValue("合计(大写)"); |
| | | cell0.setCellStyle(cellStyle); |
| | | cell1 = row.createCell(1); |
| | | cell1.setCellValue(Money2ChineseUtil.toChineseChar(totalPrice.doubleValue())); |
| | | cell1.setCellStyle(cellStyle); |
| | | cell2 = row.createCell(2); |
| | | cell2.setCellValue(""); |
| | | cell2.setCellStyle(cellStyle); |
| | | cell3 = row.createCell(3); |
| | | cell3.setCellValue(""); |
| | | cell3.setCellStyle(cellStyle); |
| | | cell4 = row.createCell(4); |
| | | cell4.setCellValue(totalPrice.doubleValue()); |
| | | cell4.setCellStyle(cellStyle); |
| | | cell5 = row.createCell(5); |
| | | cell5.setCellValue(""); |
| | | cell5.setCellStyle(cellStyle); |
| | | cell6 = row.createCell(6); |
| | | cell6.setCellValue(""); |
| | | cell6.setCellStyle(cellStyle); |
| | | row.setHeight((short) (defaultRowHeight)); |
| | | |
| | | |
| | | //合计 合并 |
| | | region = new CellRangeAddress(line + fees.size() + 3, line + fees.size() + 3, 1, 3); |
| | | sheet.addMergedRegion(region); |
| | | |
| | | if (feePrintRemarks != null && feePrintRemarks.length > 0) { |
| | | for (int remarkIndex = 0; remarkIndex < feePrintRemarks.length; remarkIndex++) { |
| | | row = sheet.createRow(line + fees.size() + 4 + remarkIndex); |
| | | row.createCell(0).setCellValue(feePrintRemarks[remarkIndex]); |
| | | row.setHeight((short) (defaultRowHeight)); |
| | | } |
| | | } |
| | | row = sheet.createRow(line + fees.size() + 4 + feePrintRemarks.length); |
| | | row.createCell(0).setCellValue(""); |
| | | row.setHeight((short) (defaultRowHeight)); |
| | | Map info = new HashMap(); |
| | | info.put("line", line + fees.size() + 4 + feePrintRemarks.length); |
| | | info.put("totalPageHeight", totalPageHeight); |
| | | return info; |
| | | } |
| | | |
| | | |
| | |
| | | row.createCell(dataKeyIndex).setCellValue(dataObj.getString(key)); |
| | | dataKeyIndex++; |
| | | } |
| | | row.createCell(dataKeyIndex+2).setCellValue(""); |
| | | row.createCell(dataKeyIndex + 2).setCellValue(""); |
| | | } |
| | | |
| | | row = sheet.createRow(rooms.size() + 2); |
| | | cell0 = row.createCell(0); |
| | | cell0.setCellValue("注:此《欠费统计表》交由厦门维度智临科技有限公司进行催收"); |
| | | |
| | | CellRangeAddress region = new CellRangeAddress(0, 0, 0, dataKeyIndex); |
| | | sheet.addMergedRegion(region); |
| | | region = new CellRangeAddress(rooms.size() + 2, rooms.size() + 2, 0, dataKeyIndex); |
| | | sheet.addMergedRegion(region); |
| | | } |
| | | |
| | |
| | | public void setRestTemplate(RestTemplate restTemplate) { |
| | | this.restTemplate = restTemplate; |
| | | } |
| | | |
| | | public static void main(String[] args) { |
| | | Java110ThreadPoolFactory<String> pool = Java110ThreadPoolFactory.getInstance().createThreadPool(20); |
| | | for (int i = 21; i > 0; i--) { |
| | | Integer data = i; |
| | | pool.submit(() -> { |
| | | //这个地方可以写一个函数,参数可以从外层传入 |
| | | System.out.println("网络操作开始" + data); |
| | | Thread.sleep(data * 1000); |
| | | System.out.println("网络操作结束" + data); |
| | | return data + ""; |
| | | }); |
| | | } |
| | | List<String> users = pool.get(); |
| | | for (String u : users) { |
| | | System.out.println(u); |
| | | } |
| | | pool.stop(); |
| | | } |
| | | } |