|
@@ -384,12 +384,10 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
JSONObject reqParam = new JSONObject();
|
|
|
reqParam.put("auth_corpid", corpInfo.getCorpid());
|
|
|
reqParam.put("permanent_code", corpInfo.getPermanentCode());
|
|
|
-
|
|
|
- System.out.println("SuiteAccessToken为:"+getSuiteAccessToken());
|
|
|
- System.out.println("CompanyId为:"+corpInfo.getCompanyId());
|
|
|
- System.out.println("Corpid为:"+corpInfo.getCorpid());
|
|
|
- System.out.println("PermanentCode"+corpInfo.getPermanentCode());
|
|
|
-
|
|
|
+// System.out.println("SuiteAccessToken为:"+getSuiteAccessToken());
|
|
|
+// System.out.println("CompanyId为:"+corpInfo.getCompanyId());
|
|
|
+// System.out.println("Corpid为:"+corpInfo.getCorpid());
|
|
|
+// System.out.println("PermanentCode为:"+corpInfo.getPermanentCode());
|
|
|
HttpEntity<String> requestEntity = new HttpEntity<String>(reqParam.toJSONString(), headers);
|
|
|
ResponseEntity<String> responseEntity = this.restTemplate.exchange(url,
|
|
|
HttpMethod.POST, requestEntity, String.class);
|
|
@@ -1134,13 +1132,201 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
}
|
|
|
}
|
|
|
|
|
|
- //查询某时间段的微信请假审批单号及详情
|
|
|
+ //查询微信请假单详情
|
|
|
+ private List<LeaveSheet> wxLeaveDetail(String startTime,String endTime,List<String> fail,String accessToken,WxCorpInfo wxCorpInfo){
|
|
|
+ String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
|
|
|
+ String detailUrl = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
|
|
|
+ HttpHeaders headers = new HttpHeaders();
|
|
|
+ RestTemplate restTemplate = new RestTemplate();
|
|
|
+ ArrayList<LeaveSheet> result = new ArrayList<>();
|
|
|
+ MediaType type = MediaType.parseMediaType("application/json; charset=UTF-8");
|
|
|
+ headers.setContentType(type);
|
|
|
+ headers.add("Accept", MediaType.APPLICATION_JSON.toString());
|
|
|
+ //批量获取审批单号
|
|
|
+ ArrayList<HashMap> list = new ArrayList<>();
|
|
|
+ HashMap<String, String> record_type = new HashMap<>();
|
|
|
+ list.add(record_type);
|
|
|
+ record_type.put("key", "record_type");
|
|
|
+ record_type.put("value", "1");
|
|
|
+ JSONObject requestMap = new JSONObject();
|
|
|
+ requestMap.put("starttime", startTime);
|
|
|
+ requestMap.put("endtime", endTime);
|
|
|
+ requestMap.put("cursor", 0);
|
|
|
+ requestMap.put("size", 100);
|
|
|
+ requestMap.put("filters", list);
|
|
|
+ HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
|
|
|
+ ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
|
|
|
+ if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
+ String resp = ResponseEntity.getBody();
|
|
|
+ JSONObject json = JSONObject.parseObject(resp);
|
|
|
+ Object[] sp_no_lists = json.getJSONArray("sp_no_list").toArray();
|
|
|
+ //查询每个审批号审批详情
|
|
|
+ for (int i = 0; i < sp_no_lists.length; i++) {
|
|
|
+ detailUrl = detailUrl.replace("ACCESS_TOKEN", accessToken);
|
|
|
+ JSONObject detailMap = new JSONObject();
|
|
|
+ detailMap.put("sp_no", sp_no_lists[i]);
|
|
|
+ HttpEntity<JSONObject> detailEntity = new HttpEntity<>(detailMap, headers);
|
|
|
+ ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(detailUrl, detailEntity, String.class);
|
|
|
+ if(ResponseEntity.getStatusCode() == HttpStatus.OK){
|
|
|
+ //封装请假单数据
|
|
|
+ String detailResp = detailResponseEntity.getBody();
|
|
|
+ JSONObject infoJson = JSONObject.parseObject(detailResp).getJSONObject("info");
|
|
|
+ //审核状态
|
|
|
+ Integer sp_status = infoJson.getInteger("sp_status");
|
|
|
+ switch (sp_status){
|
|
|
+ //审批中
|
|
|
+ case 1:
|
|
|
+ sp_status=1;
|
|
|
+ break;
|
|
|
+ //已通过
|
|
|
+ case 2:
|
|
|
+ sp_status=0;
|
|
|
+ break;
|
|
|
+ //已驳回
|
|
|
+ case 3:
|
|
|
+ sp_status=2;
|
|
|
+ break;
|
|
|
+ //已撤销
|
|
|
+ case 4:
|
|
|
+ sp_status=3;
|
|
|
+ break;
|
|
|
+ //通过后撤销
|
|
|
+ case 5:
|
|
|
+ sp_status=5;
|
|
|
+ break;
|
|
|
+ //通过后撤销
|
|
|
+ case 6:
|
|
|
+ sp_status=6;
|
|
|
+ break;
|
|
|
+ //7-已删除
|
|
|
+ case 7:
|
|
|
+ sp_status=7;
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ sp_status=8;
|
|
|
+ }
|
|
|
+ //审批申请提交时间,Unix时间戳
|
|
|
+ LocalDateTime applyTime = LocalDateTime.ofEpochSecond(Long.parseLong(infoJson.getString("apply_time")), 0, ZoneOffset.ofHours(8));
|
|
|
+ //申请人姓名
|
|
|
+ String applyer = infoJson.getString("applyer");
|
|
|
+ String userId = JSONObject.parseObject(applyer).getString("userid");
|
|
|
+ User user = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", userId));
|
|
|
+ String name = user==null?userId:user.getName();
|
|
|
+ //审批人姓名
|
|
|
+ String approverUserId = infoJson.getJSONArray("sp_record").getJSONObject(0)
|
|
|
+ .getJSONArray("details").getJSONObject(0)
|
|
|
+ .getJSONObject("approver").getString("userid");
|
|
|
+ User approverUser = new User();
|
|
|
+ if (approverUserId!=null&&approverUserId!=""){
|
|
|
+ approverUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", approverUserId));
|
|
|
+ }
|
|
|
+ String approverName = approverUser==null?approverUserId:approverUser.getName();
|
|
|
+ JSONArray contents = infoJson.getJSONObject("apply_data")
|
|
|
+ .getJSONArray("contents");
|
|
|
+ //请假类型
|
|
|
+ JSONObject vacation = contents.getJSONObject(0)
|
|
|
+ .getJSONObject("value")
|
|
|
+ .getJSONObject("vacation");
|
|
|
+ String text = vacation.getJSONObject("selector")
|
|
|
+ .getJSONArray("options").getJSONObject(0)
|
|
|
+ .getJSONArray("value").getJSONObject(0)
|
|
|
+ .getString("text");
|
|
|
+ //请假事由
|
|
|
+ String remark = contents.getJSONObject(1).getJSONObject("value").getString("text");
|
|
|
+ Integer leave_type = 0;
|
|
|
+ switch (text){
|
|
|
+ case "事假":
|
|
|
+ leave_type = 0;
|
|
|
+ break;
|
|
|
+ case "病假":
|
|
|
+ leave_type = 1;
|
|
|
+ break;
|
|
|
+ case "年假":
|
|
|
+ leave_type = 2;
|
|
|
+ break;
|
|
|
+ case "产假":
|
|
|
+ leave_type = 3;
|
|
|
+ break;
|
|
|
+ case "婚假":
|
|
|
+ leave_type = 4;
|
|
|
+ break;
|
|
|
+ case "丧假":
|
|
|
+ leave_type = 5;
|
|
|
+ break;
|
|
|
+ case "调休假":
|
|
|
+ leave_type = 6;
|
|
|
+ break;
|
|
|
+ case "陪产假":
|
|
|
+ leave_type = 7;
|
|
|
+ break;
|
|
|
+ case "其他":
|
|
|
+ leave_type = 8;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ //请假开始时间
|
|
|
+ JSONObject date_range = vacation.getJSONObject("attendance")
|
|
|
+ .getJSONObject("date_range");
|
|
|
+ String startDate =date_range.getString("new_begin");
|
|
|
+ SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
|
|
|
+ long startDateTemp = Long.valueOf(startDate);
|
|
|
+ String startDateString = sdf.format(new Date(startDateTemp * 1000L));
|
|
|
+ DateTimeFormatter startfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ LocalDate sDate = LocalDate.parse(startDateString, startfmt);
|
|
|
+ //请假结束时间
|
|
|
+ String endDate = date_range.getString("new_end");
|
|
|
+ long endDatetemp = Long.valueOf(endDate);
|
|
|
+ String endDateString = sdf.format(new Date(endDatetemp * 1000L));
|
|
|
+ DateTimeFormatter endfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
+ LocalDate eDate = LocalDate.parse(endDateString, endfmt);
|
|
|
+ //请假时长
|
|
|
+ String timeHours = date_range.getString("new_duration");
|
|
|
+ String leaveType = date_range.getString("type");
|
|
|
+ LeaveSheet leaveSheet = new LeaveSheet();
|
|
|
+ leaveSheet.setProcinstId(sp_no_lists[i].toString());
|
|
|
+ leaveSheet.setIsFinalAudit(1);
|
|
|
+ leaveSheet.setIndate(applyTime);
|
|
|
+ leaveSheet.setOwnerName(name);
|
|
|
+ leaveSheet.setOwnerId(user==null?"":user.getId());
|
|
|
+ leaveSheet.setCompanyId(user.getCompanyId());
|
|
|
+ leaveSheet.setTel(user.getPhone()==null?"":user.getPhone());
|
|
|
+ //审批人信息
|
|
|
+ leaveSheet.setAuditorName(approverName);
|
|
|
+ leaveSheet.setAuditorId(approverUser==null?"":approverUser.getId());
|
|
|
+ //请假日期
|
|
|
+ leaveSheet.setStartDate(sDate);
|
|
|
+ leaveSheet.setEndDate(eDate);
|
|
|
+ //请假类型
|
|
|
+ leaveSheet.setLeaveType(leave_type);
|
|
|
+ leaveSheet.setStatus(sp_status);
|
|
|
+ //请假说明
|
|
|
+ leaveSheet.setRemark(remark==null?"":remark);
|
|
|
+ //请假时长和天数
|
|
|
+ float time = Float.parseFloat(timeHours);
|
|
|
+ if("hour".equals(leaveType)){
|
|
|
+ leaveSheet.setTimeType(1);
|
|
|
+ leaveSheet.setTimeHours(time/3600);
|
|
|
+ }else{
|
|
|
+ leaveSheet.setTimeType(0);
|
|
|
+ leaveSheet.setTimeHours(time/3600);
|
|
|
+ leaveSheet.setTimeDays(time/3600/24);
|
|
|
+ }
|
|
|
+ result.add(leaveSheet);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }else{
|
|
|
+ fail.add(wxCorpInfo.getCorpFullName());
|
|
|
+ System.err.println(wxCorpInfo.getCorpFullName()+"审批单查询失败");
|
|
|
+ }
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+ //更新审核中的请假单以及查询某时间段的微信请假审批单号
|
|
|
@Override
|
|
|
public List<LeaveSheet> wxLeaveNumber(String startTime,String endTime,List<WxCorpInfo> wxCorpInfos,List<LeaveSheet> approvalLeave) throws Exception {
|
|
|
- //存储更新失败的公司名称
|
|
|
- List<String> fail = new ArrayList<>();
|
|
|
String url = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovalinfo?access_token=ACCESS_TOKEN";
|
|
|
String detailUrl = "https://qyapi.weixin.qq.com/cgi-bin/oa/getapprovaldetail?access_token=ACCESS_TOKEN";
|
|
|
+ //存储更新失败的公司名称
|
|
|
+ List<String> fail = new ArrayList<>();
|
|
|
HttpHeaders headers = new HttpHeaders();
|
|
|
RestTemplate restTemplate = new RestTemplate();
|
|
|
ArrayList<LeaveSheet> result = new ArrayList<>();
|
|
@@ -1150,10 +1336,11 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
for (WxCorpInfo wxCorpInfo : wxCorpInfos) {
|
|
|
//更新Access_token
|
|
|
String accessToken = getCorpAccessToken(wxCorpInfo);
|
|
|
- if (StringUtils.isEmpty(accessToken)){
|
|
|
- System.out.println(wxCorpInfo.getCorpName()+"accessToken获取失败");
|
|
|
- continue;
|
|
|
- }
|
|
|
+// if (StringUtils.isEmpty(accessToken)){
|
|
|
+// System.out.println(wxCorpInfo.getCorpName()+"accessToken获取失败");
|
|
|
+// fail.add(wxCorpInfo.getCorpName());
|
|
|
+// continue;
|
|
|
+// }
|
|
|
url = url.replace("ACCESS_TOKEN", accessToken);
|
|
|
//查询并更新审核中的审批单
|
|
|
System.out.println("+++++++++++++++++++开始查询并更新审核中的审批单+++++++++++++++++++");
|
|
@@ -1224,192 +1411,17 @@ public class WxCorpInfoServiceImpl extends ServiceImpl<WxCorpInfoMapper, WxCorpI
|
|
|
}
|
|
|
}
|
|
|
System.out.println("+++++++++++++++++++++开始同步昨天请假信息+++++++++++++++++++++");
|
|
|
- //批量获取审批单号
|
|
|
- ArrayList<HashMap> list = new ArrayList<>();
|
|
|
- HashMap<String, String> record_type = new HashMap<>();
|
|
|
- list.add(record_type);
|
|
|
- record_type.put("key", "record_type");
|
|
|
- record_type.put("value", "1");
|
|
|
- JSONObject requestMap = new JSONObject();
|
|
|
- requestMap.put("starttime", startTime);
|
|
|
- requestMap.put("endtime", endTime);
|
|
|
- requestMap.put("cursor", 0);
|
|
|
- requestMap.put("size", 100);
|
|
|
- requestMap.put("filters", list);
|
|
|
- HttpEntity<JSONObject> entity = new HttpEntity<>(requestMap, headers);
|
|
|
- ResponseEntity<String> ResponseEntity = restTemplate.postForEntity(url, entity, String.class);
|
|
|
- if (ResponseEntity.getStatusCode() == HttpStatus.OK) {
|
|
|
- String resp = ResponseEntity.getBody();
|
|
|
- JSONObject json = JSONObject.parseObject(resp);
|
|
|
- Object[] sp_no_lists = json.getJSONArray("sp_no_list").toArray();
|
|
|
- //查询每个审批号审批详情
|
|
|
- for (int i = 0; i < sp_no_lists.length; i++) {
|
|
|
- detailUrl = detailUrl.replace("ACCESS_TOKEN", accessToken);
|
|
|
- JSONObject detailMap = new JSONObject();
|
|
|
- detailMap.put("sp_no", sp_no_lists[i]);
|
|
|
- HttpEntity<JSONObject> detailEntity = new HttpEntity<>(detailMap, headers);
|
|
|
- ResponseEntity<String> detailResponseEntity = restTemplate.postForEntity(detailUrl, detailEntity, String.class);
|
|
|
- if(ResponseEntity.getStatusCode() == HttpStatus.OK){
|
|
|
- //封装请假单数据
|
|
|
- String detailResp = detailResponseEntity.getBody();
|
|
|
- JSONObject infoJson = JSONObject.parseObject(detailResp).getJSONObject("info");
|
|
|
- //审核状态
|
|
|
- Integer sp_status = infoJson.getInteger("sp_status");
|
|
|
- switch (sp_status){
|
|
|
- //审批中
|
|
|
- case 1:
|
|
|
- sp_status=1;
|
|
|
- break;
|
|
|
- //已通过
|
|
|
- case 2:
|
|
|
- sp_status=0;
|
|
|
- break;
|
|
|
- //已驳回
|
|
|
- case 3:
|
|
|
- sp_status=2;
|
|
|
- break;
|
|
|
- //已撤销
|
|
|
- case 4:
|
|
|
- sp_status=3;
|
|
|
- break;
|
|
|
- //通过后撤销
|
|
|
- case 5:
|
|
|
- sp_status=5;
|
|
|
- break;
|
|
|
- //通过后撤销
|
|
|
- case 6:
|
|
|
- sp_status=6;
|
|
|
- break;
|
|
|
- //7-已删除
|
|
|
- case 7:
|
|
|
- sp_status=7;
|
|
|
- break;
|
|
|
- default:
|
|
|
- sp_status=8;
|
|
|
- }
|
|
|
- //审批申请提交时间,Unix时间戳
|
|
|
- LocalDateTime applyTime = LocalDateTime.ofEpochSecond(Long.parseLong(infoJson.getString("apply_time")), 0, ZoneOffset.ofHours(8));
|
|
|
- //申请人姓名
|
|
|
- String applyer = infoJson.getString("applyer");
|
|
|
- String userId = JSONObject.parseObject(applyer).getString("userid");
|
|
|
- User user = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", userId));
|
|
|
- String name = user==null?userId:user.getName();
|
|
|
- //审批人姓名
|
|
|
- String approverUserId = infoJson.getJSONArray("sp_record").getJSONObject(0)
|
|
|
- .getJSONArray("details").getJSONObject(0)
|
|
|
- .getJSONObject("approver").getString("userid");
|
|
|
- User approverUser = new User();
|
|
|
- if (approverUserId!=null&&approverUserId!=""){
|
|
|
- approverUser = userMapper.selectOne(new QueryWrapper<User>().eq("corpwx_real_userid", approverUserId));
|
|
|
- }
|
|
|
- String approverName = approverUser==null?approverUserId:approverUser.getName();
|
|
|
- JSONArray contents = infoJson.getJSONObject("apply_data")
|
|
|
- .getJSONArray("contents");
|
|
|
- //请假类型
|
|
|
- JSONObject vacation = contents.getJSONObject(0)
|
|
|
- .getJSONObject("value")
|
|
|
- .getJSONObject("vacation");
|
|
|
- String text = vacation.getJSONObject("selector")
|
|
|
- .getJSONArray("options").getJSONObject(0)
|
|
|
- .getJSONArray("value").getJSONObject(0)
|
|
|
- .getString("text");
|
|
|
- //请假事由
|
|
|
- String remark = contents.getJSONObject(1).getJSONObject("value").getString("text");
|
|
|
- Integer leave_type = 0;
|
|
|
- switch (text){
|
|
|
- case "事假":
|
|
|
- leave_type = 0;
|
|
|
- break;
|
|
|
- case "病假":
|
|
|
- leave_type = 1;
|
|
|
- break;
|
|
|
- case "年假":
|
|
|
- leave_type = 2;
|
|
|
- break;
|
|
|
- case "产假":
|
|
|
- leave_type = 3;
|
|
|
- break;
|
|
|
- case "婚假":
|
|
|
- leave_type = 4;
|
|
|
- break;
|
|
|
- case "丧假":
|
|
|
- leave_type = 5;
|
|
|
- break;
|
|
|
- case "调休假":
|
|
|
- leave_type = 6;
|
|
|
- break;
|
|
|
- case "陪产假":
|
|
|
- leave_type = 7;
|
|
|
- break;
|
|
|
- case "其他":
|
|
|
- leave_type = 8;
|
|
|
- break;
|
|
|
- }
|
|
|
- //请假开始时间
|
|
|
- JSONObject date_range = vacation.getJSONObject("attendance")
|
|
|
- .getJSONObject("date_range");
|
|
|
- String startDate =date_range.getString("new_begin");
|
|
|
- SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
|
|
|
- long startDateTemp = Long.valueOf(startDate);
|
|
|
- String startDateString = sdf.format(new Date(startDateTemp * 1000L));
|
|
|
- DateTimeFormatter startfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
- LocalDate sDate = LocalDate.parse(startDateString, startfmt);
|
|
|
- //请假结束时间
|
|
|
- String endDate = date_range.getString("new_end");
|
|
|
- long endDatetemp = Long.valueOf(endDate);
|
|
|
- String endDateString = sdf.format(new Date(endDatetemp * 1000L));
|
|
|
- DateTimeFormatter endfmt = DateTimeFormatter.ofPattern("yyyy-MM-dd");
|
|
|
- LocalDate eDate = LocalDate.parse(endDateString, endfmt);
|
|
|
- //请假时长
|
|
|
- String timeHours = date_range.getString("new_duration");
|
|
|
- String leaveType = date_range.getString("type");
|
|
|
- LeaveSheet leaveSheet = new LeaveSheet();
|
|
|
- leaveSheet.setProcinstId(sp_no_lists[i].toString());
|
|
|
- leaveSheet.setIsFinalAudit(1);
|
|
|
- leaveSheet.setIndate(applyTime);
|
|
|
- leaveSheet.setOwnerName(name);
|
|
|
- leaveSheet.setOwnerId(user==null?"":user.getId());
|
|
|
- leaveSheet.setCompanyId(user.getCompanyId());
|
|
|
- leaveSheet.setTel(user.getPhone()==null?"":user.getPhone());
|
|
|
- //审批人信息
|
|
|
- leaveSheet.setAuditorName(approverName);
|
|
|
- leaveSheet.setAuditorId(approverUser==null?"":approverUser.getId());
|
|
|
- //请假日期
|
|
|
- leaveSheet.setStartDate(sDate);
|
|
|
- leaveSheet.setEndDate(eDate);
|
|
|
- //请假类型
|
|
|
- leaveSheet.setLeaveType(leave_type);
|
|
|
- leaveSheet.setStatus(sp_status);
|
|
|
- //请假说明
|
|
|
- leaveSheet.setRemark(remark==null?"":remark);
|
|
|
- //请假时长和天数
|
|
|
- float time = Float.parseFloat(timeHours);
|
|
|
- if("hour".equals(leaveType)){
|
|
|
- leaveSheet.setTimeType(1);
|
|
|
- leaveSheet.setTimeHours(time/3600);
|
|
|
- }else{
|
|
|
- leaveSheet.setTimeType(0);
|
|
|
- leaveSheet.setTimeHours(time/3600);
|
|
|
- leaveSheet.setTimeDays(time/3600/24);
|
|
|
- }
|
|
|
- result.add(leaveSheet);
|
|
|
- }else{
|
|
|
- System.err.println(sp_no_lists[i]+"审批单详情查询失败");
|
|
|
- }
|
|
|
- }
|
|
|
- }else{
|
|
|
- fail.add(wxCorpInfo.getCorpFullName());
|
|
|
- System.err.println(wxCorpInfo.getCorpFullName()+"审批单查询失败");
|
|
|
- }
|
|
|
+
|
|
|
}
|
|
|
if (fail.size() == 0){
|
|
|
System.err.println("全部同步成功");
|
|
|
}else{
|
|
|
- System.out.print("同步失败的公司有:");
|
|
|
+ System.err.println("总共"+fail.size()+"个公司同步失败");
|
|
|
+ System.err.print("同步失败的公司有:");
|
|
|
for (String s : fail) {
|
|
|
System.err.print(s+",");
|
|
|
- System.out.println();
|
|
|
}
|
|
|
+ System.out.println();
|
|
|
}
|
|
|
return result;
|
|
|
}
|