본문 바로가기
Java

[java] xml 생성

by Yeoseungwon 2024. 6. 19.
728x90
public String signInsertToXml(@ModelAttribute("searchVO") UserVO vo,Model model, HttpServletRequest request) throws Exception {
		logger.info("CALL /signInsertToXml.do");

		//xml생성
		String base64Code = "";
		// 현재 시간
		String currentTime = DateUtil.getCurrentDateTime();
		String signKeyNm="";
		String xmlNm = "_sign_".concat(currentTime);
		//XML 파일 경로
		String SRC = "";
		//firstPdf + 이미지 합쳐진 최종 pdf파일
		UserMembershipVO resultList = new UserMembershipVO();

		String message = "";
		String returnUrl = "/sign.do";
		String storePathString = "";

		try {


			//계약서에 입력될 회원정보 select
			UserMembershipVO mVO = new UserMembershipVO();
			mVO.setSignKey(vo.getSignKey());
			mVO.setSign(vo.getSign());
			mVO.setMembershipNo(vo.getMembershipNo());
			resultList = signService.selectPdfSignInfo(mVO); //membershipNo , signKey

			if(null != resultList && "S3".equals(resultList.getStep())) {
				message = "이미 서명한 계약서입니다.";
				model.addAttribute("message", message);
				return "reservation/sign/result";
			}

			vo.setStep("S3"); // 서명완료

			// 사인 이미지 base64 insert (USER_INFO_MEMBERSHIP_SIGN)
			int resultCnt = signService.signInsert(vo);

			logger.info("resultCnt={}",resultCnt);
			if (resultCnt == 1) {

				message = "서명 완료되었습니다.";

				// 사인 완료된 계약서 xml로 저장
				String signType = resultList.getSignType();
				logger.info("signType={}", signType);

				String signYear = resultList.getSignYear();
				String signMonth = resultList.getSignMonth();
				String signDay = resultList.getSignDay();


				String payYear = "";
				String payMonth = "";
				String payDay= "";

				if(signType.equals("TYPE2")) {

					vo.setOrderId(resultList.getOrderId());
					UserVO orderMasterResult = signService.orderMasterResult(vo); //orderId

					// 회원권정보
					List<UserVO> orderDetailList = signService.orderDetailList(vo);
					String memberTicket = "";
					for (UserVO orderDetail : orderDetailList) {
						memberTicket += orderDetail.getCategoryNm() + " ";
						memberTicket += orderDetail.getTicketNm() + " ";
						memberTicket += orderDetail.getStartDate() + " ~ ";
						memberTicket += orderDetail.getEndDate() + "";
					}
					logger.info("memberTicket={}", memberTicket);

					String payMentDay = orderMasterResult.getPaymentDate(); // "1999-01-01"과 같은 형식의 문자열
					payMentDay = payMentDay.replace("-", ""); // "19990101"
					payYear = payMentDay.substring(0, 4); // 연도 추출 (0부터 4까지의 문자열)
					payMonth = payMentDay.substring(4, 6); // 월 추출 (4부터 6까지의 문자열)
					payDay = payMentDay.substring(6); // 일 추출 (6부터 끝까지의 문자열)
				}
				// groupId 로 Code조회
				GroupVO gvo = new GroupVO();
				gvo.setGroupId(vo.getGroupId());
				GroupVO groupInfo = groupService.selectInfo(gvo);
				String groupNm = groupInfo.getGroupNm();
				logger.info("groupNm={}",groupNm);

				// 회원권정보
				Map reservationMap = signService.selectOrderInfo(vo);
				List<Map> itemList = (List) reservationMap.get("select_item_info_list");
				logger.info("itemList={}", itemList);

				//파일저장경로 fileStorePath = file.upload-dir =/home/reservation/uploads/

				signKeyNm = vo.getSignKey();
				logger.info("signKeyNm={}", signKeyNm);
				// XML 파일 이름
				// 파일이 저장될 폴더경로
				storePathString = groupInfo.getGroupCode() + "/" +signType;
				logger.info("storePathString={}",storePathString);

				SRC = fileStorePath + storePathString+"/"+xmlNm+".xml";
				logger.info("SRC = {}",SRC);
				File saveFolder = new File(WebUtil.filePathBlackList(fileStorePath + storePathString));

				if (!saveFolder.exists() || saveFolder.isFile()) {
					logger.info("saveFolder create");
					saveFolder.mkdirs();
				}

				File signFile = new File(WebUtil.filePathBlackList(SRC));
				if (signFile.exists()) {
					logger.info("################## SLEEP #################");
					Thread.sleep(3);
				}


				String gender = "";
				if(resultList.getMemberGender().equals("W")) {
					gender = "여";
				}else if(resultList.getMemberGender().equals("M")) {
					gender = "남";
				}
				logger.info("MemberGender={}", resultList.getMemberGender());
				logger.info("gender={}", gender);
				base64Code = vo.getSign();
				logger.info("base64Code={}", base64Code);


				String memberBirthday = resultList.getMemberBirthday(); // "19990101"과 같은 형식의 문자열
				String birthYear = memberBirthday.substring(0, 4); // 연도 추출 (0부터 4까지의 문자열)
				String birthMonth = memberBirthday.substring(4, 6); // 월 추출 (4부터 6까지의 문자열)
				String birthDay = memberBirthday.substring(6); // 일 추출 (6부터 끝까지의 문자열)



				// XML 파일 작성
				StringBuilder xmlBuilder = new StringBuilder();

				xmlBuilder.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
				xmlBuilder.append("<?xml-stylesheet type=\"text/xsl\" href=\"./employeesfo.xsl\"?>\n");
				xmlBuilder.append("<root xmlns:dc=\"http://purl.org/dc/elements/1.1/\" xmlns:dcterms=\"http://purl.org/dc/terms/\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:noNamespaceSchemaLocation=\"bx_Dublin.xsd\" >\n");
				xmlBuilder.append("<contents>\n");
				xmlBuilder.append("<userInfo>\n");
				xmlBuilder.append("<userName>").append(resultList.getMemberName()).append("</userName>\n");
				xmlBuilder.append("<phoneNumber>").append(resultList.getMemberTel()).append("</phoneNumber>\n");
				xmlBuilder.append("<sex>").append(gender).append("</sex>\n");
				xmlBuilder.append("<birth>\n");
				xmlBuilder.append("<year>").append(birthYear).append("</year>\n");
				xmlBuilder.append("<month>").append(birthMonth).append("</month>\n");
				xmlBuilder.append("<day>").append(birthDay).append("</day>\n");
				xmlBuilder.append("</birth>\n");
				xmlBuilder.append("</userInfo>\n");

				if(signType.equals("TYPE1")) { //TYPE1 : 회원가입 신청서

					for (Map item : itemList) {
						xmlBuilder.append("<sign>\n");
						xmlBuilder.append("<signDate>\n");
						xmlBuilder.append("<year>").append(signYear).append("</year>\n");
						xmlBuilder.append("<month>").append(signMonth).append("</month>\n");
						xmlBuilder.append("<day>").append(signDay).append("</day>\n");
						xmlBuilder.append("</signDate>\n");

						xmlBuilder.append("<userSign>").append(base64Code).append("</userSign>\n");
						// 회원 서명 이미지 (base64 인코딩된 서명 이미지 포함하지 않음)
						xmlBuilder.append("</sign>\n");
						xmlBuilder.append("</contents>\n");
						xmlBuilder.append("</root>\n");
					}

				}else if(signType.equals("TYPE2")) {//TYPE2 : 회원권 구매 후 서명받는 서류

					xmlBuilder.append("<membershipInfo>\n");
					xmlBuilder.append("<payDate>\n");
					xmlBuilder.append("<year>").append(payYear).append("</year>\n");
					xmlBuilder.append("<month>").append(payMonth).append("</month>\n");
					xmlBuilder.append("<day>").append(payDay).append("</day>\n");
					xmlBuilder.append("</payDate>\n");
					xmlBuilder.append("<payType>").append("신규/재등록").append("</payType>\n");

					for (Map item : itemList) {
						Map map = (Map) item.get("item_ticket_info");
						String pageNm = SF_StringUtil.isNullToString(item.get("page_nm"));
						String categoryNm = SF_StringUtil.isNullToString(item.get("category_nm"));
						String itemNm = SF_StringUtil.isNullToString(item.get("item_nm"));
						String ticketNm = SF_StringUtil.isNullToString(map.get("ticket_nm"));
						String startDate = "";
						String endDate = "";
						String lessonYn = SF_StringUtil.isNullToString(map.get("lesson_yn"));
						if (lessonYn.equals("Y")) {
							Map lessonMap = (Map) item.get("lesson_info");
							startDate = SF_StringUtil.isNullToString(lessonMap.get("lesson_start_date"));
							endDate = SF_StringUtil.isNullToString(lessonMap.get("lesson_end_date"));
						} else {
							startDate = SF_StringUtil.isNullToString(item.get("start_date"));
							endDate = SF_StringUtil.isNullToString(item.get("end_date"));
						}

						xmlBuilder.append("<membership>").append(ticketNm).append("</membership>\n");
						xmlBuilder.append("<locker>").append("").append("</locker>\n");
						xmlBuilder.append("<memo>").append(reservationMap.get("memo")).append("</memo>\n");
						xmlBuilder.append("</membershipInfo>\n");
						xmlBuilder.append("<priceInfo>\n");

						DecimalFormat formatter = new DecimalFormat("###,###,###,###");
						String totalPrice = formatter.format(SF_Utils.convertInteger(resultList.getTotalPrice()));
						xmlBuilder.append("<total>").append(totalPrice).append("</total>\n");
						xmlBuilder.append("</priceInfo>\n");

						xmlBuilder.append("<sign>\n");
						xmlBuilder.append("<signDate>\n");
						xmlBuilder.append("<year>").append(signYear).append("</year>\n");
						xmlBuilder.append("<month>").append(signMonth).append("</month>\n");
						xmlBuilder.append("<day>").append(signDay).append("</day>\n");
						xmlBuilder.append("</signDate>\n");

						xmlBuilder.append("<userSign>").append(base64Code).append("</userSign>\n");
						// 회원 서명 이미지 (base64 인코딩된 서명 이미지 포함하지 않음)
						xmlBuilder.append("</sign>\n");
						xmlBuilder.append("</contents>\n");
						xmlBuilder.append("</root>\n");

					}

				}
				try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(SRC), "UTF-8"))) {
					writer.write(xmlBuilder.toString());
				}

				System.out.printf("XML 파일이 성공적으로 생성되었습니다.");
			} else {
				message = "서명 실패하였습니다.";
			}
		} catch (Exception  e) {
			logger.error(e.getMessage(), e);
		}

		model.addAttribute("message", message);
		model.addAttribute("returnUrl", returnUrl);
		return "reservation/sign/result";

	}
728x90