|
@@ -0,0 +1,517 @@
|
|
|
+package com.persagy.fm.common.constant;
|
|
|
+
|
|
|
+import cn.hutool.core.date.DateTime;
|
|
|
+import com.alibaba.fastjson.JSON;
|
|
|
+import com.alibaba.fastjson.JSONArray;
|
|
|
+import com.alibaba.fastjson.JSONObject;
|
|
|
+import com.google.common.collect.Maps;
|
|
|
+import com.persagy.common.utils.DateUtil;
|
|
|
+import com.persagy.fm.common.constant.enums.ResultEnum;
|
|
|
+import com.persagy.fm.common.old.utils.StringUtil;
|
|
|
+import java.text.SimpleDateFormat;
|
|
|
+import java.util.Collections;
|
|
|
+import java.util.Comparator;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ *
|
|
|
+ * 功能描述: 数据请求处理类,包括查询条件的组装、返回数据处理、排序等
|
|
|
+ * @类型名称 DataRequestProcessUtil
|
|
|
+ * @创建者 wanghailong
|
|
|
+ * @邮箱 wanghailong@persagy.com
|
|
|
+ * @修改描述
|
|
|
+ */
|
|
|
+public class DataRequestProcessUtil {
|
|
|
+ /**
|
|
|
+ * 转换更新参数
|
|
|
+ * @param jsonObject 用户接口参数,除了过滤项,其它项默认为新增项
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getAddParamJson(JSONObject jsonObject){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ paramJson.put("insertObject", jsonObject);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换主键查询参数
|
|
|
+ * @param jsonObject 用户接口数据
|
|
|
+ * @param majors 主键
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getKeyWithMajors(JSONObject jsonObject, String... majors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONObject keyJson = new JSONObject();
|
|
|
+ Object value;
|
|
|
+ for(String major : majors){
|
|
|
+ value = jsonObject.get(major);
|
|
|
+ if(value != null && !"".equals(value.toString())){
|
|
|
+ keyJson.put(major, value);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ paramJson.put("Key", keyJson);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换更新参数
|
|
|
+ * @param jsonObject 用户接口参数,除了过滤项,其它项默认为修改项
|
|
|
+ * @param majors 过滤项
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getUpdateParamJson(JSONObject jsonObject, String... majors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONObject criteriaJson = new JSONObject();
|
|
|
+ Object value;
|
|
|
+ for(String major : majors){
|
|
|
+ value = jsonObject.get(major);
|
|
|
+ if(value != null && !"".equals(value.toString())){
|
|
|
+ criteriaJson.put(major, value);
|
|
|
+ }
|
|
|
+ jsonObject.remove(major);
|
|
|
+ }
|
|
|
+ paramJson.put("criteria", criteriaJson);
|
|
|
+ paramJson.put("set", jsonObject);
|
|
|
+
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得除去某些项的条件
|
|
|
+ * @param jsonObject 用户接口参数
|
|
|
+ * @param majors 过滤项
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getCriteriaRemoveMajors(JSONObject jsonObject, String... majors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ for(String major : majors){
|
|
|
+ jsonObject.remove(major);
|
|
|
+ }
|
|
|
+ paramJson.put("criteria", jsonObject);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得指定项的条件
|
|
|
+ * @param jsonObject 用户接口参数
|
|
|
+ * @param majors 过滤项
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getCriteriaWithMajors(JSONObject jsonObject, String... majors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONObject criteria = new JSONObject();
|
|
|
+ for(String major : majors){
|
|
|
+ criteria.put(major, jsonObject.get(major));
|
|
|
+ }
|
|
|
+ paramJson.put("criteria", criteria);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得指定项的条件-用于批量查询
|
|
|
+ * @param jsonArray 用户接口参数
|
|
|
+ * @param key 参数的code码
|
|
|
+ * @param code 用户接口参数code码
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getCriteriasWithMajors(JSONArray jsonArray, String key, String code){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONArray criterias = new JSONArray();
|
|
|
+ JSONObject criteria, json;
|
|
|
+ for(int i=0; i<jsonArray.size(); i++){
|
|
|
+ json = jsonArray.getJSONObject(i);
|
|
|
+ criteria = new JSONObject();
|
|
|
+ criteria.put(code, json.get(key));
|
|
|
+ criterias.add(criteria);
|
|
|
+ }
|
|
|
+ paramJson.put("criterias", criterias);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得指定项的条件-用于批量查询
|
|
|
+ * @param jsonObject 用户接口参数
|
|
|
+ * @param key 参数的code码
|
|
|
+ * @param code 用户接口参数code码
|
|
|
+ * @return 数据平台接口参数
|
|
|
+ */
|
|
|
+ public static JSONObject getCriteriasWithMajors(JSONObject jsonObject, String key, String code){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONArray criterias = new JSONArray();
|
|
|
+ JSONObject criteria = new JSONObject();
|
|
|
+ criteria.put(code, jsonObject.get(key));
|
|
|
+ criterias.add(criteria);
|
|
|
+ paramJson.put("criterias", criterias);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得批量查询参数
|
|
|
+ * @param jsonObject 参数
|
|
|
+ * @param arrayInfo 批量数组名
|
|
|
+ * @param infoName 查询参数
|
|
|
+ * @param marjors 非批量参数
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONObject getCriteriasWithMajors(JSONObject jsonObject, String arrayInfo, String infoName, String... marjors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONArray criterias = new JSONArray();
|
|
|
+ JSONObject criteria;
|
|
|
+ JSONArray infos = jsonObject.getJSONArray(arrayInfo);
|
|
|
+ if(infos != null) {
|
|
|
+ for (int i=0; i<infos.size(); i++){
|
|
|
+ criteria = new JSONObject();
|
|
|
+ criteria.put(infoName, infos.get(i));
|
|
|
+ for(String marjor : marjors){
|
|
|
+ if(!marjor.equals(infoName))
|
|
|
+ criteria.put(marjor, jsonObject.get(marjor));
|
|
|
+ }
|
|
|
+ criterias.add(criteria);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ paramJson.put("criterias", criterias);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 获得数据平台查询条件
|
|
|
+ * @param codeName
|
|
|
+ * @param jsonObject
|
|
|
+ * @param majors
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONObject getDataPlatCriteriaWithMajors(String codeName, JSONObject jsonObject, String... majors){
|
|
|
+ JSONObject paramJson = new JSONObject();
|
|
|
+ JSONObject criteria = new JSONObject();
|
|
|
+ if(codeName != null){
|
|
|
+ criteria.put("id", jsonObject.get(codeName));
|
|
|
+ }
|
|
|
+ for(String major : majors){
|
|
|
+ criteria.put(major, jsonObject.get(major));
|
|
|
+ }
|
|
|
+ paramJson.put("criteria", criteria);
|
|
|
+ return paramJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 功能描述:处理查询返回结果,将结果中的内容项转化为JsonString
|
|
|
+ * @param queryResult
|
|
|
+ * @param majors
|
|
|
+ * @return
|
|
|
+ * @创建者 wanghailong
|
|
|
+ * @邮箱 wanghailong@persagy.com
|
|
|
+ * @修改描述
|
|
|
+ */
|
|
|
+ public static String prossesResultToJsonString(String queryResult, String... majors){
|
|
|
+ if(queryResult.contains("Result") && queryResult.contains("Content")){
|
|
|
+ JSONObject resultJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONArray array = (JSONArray) resultJson.get("Content");
|
|
|
+ for(int i = 0 ; i < array.size() ; i++){
|
|
|
+ JSONObject dataJson = array.getJSONObject(i);
|
|
|
+ for(String major : majors){
|
|
|
+ String dataString = dataJson.getString(major);
|
|
|
+ if(!StringUtil.isNull(dataString)){
|
|
|
+ if(dataString.startsWith("{")){
|
|
|
+ dataJson.put(major, JSONObject.parseObject(dataJson.getString(major)));
|
|
|
+ }else if(dataString.startsWith("[")){
|
|
|
+ dataJson.put(major, JSONArray.parseArray(dataJson.getString(major)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ array.set(i, dataJson);
|
|
|
+ }
|
|
|
+ resultJson.put("Content", array);
|
|
|
+ queryResult = resultJson.toString();
|
|
|
+ }
|
|
|
+ return queryResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 功能描述:处理插入参数,将参数中的内容项转化为JsonString
|
|
|
+ * @param jsonObject
|
|
|
+ * @param majors
|
|
|
+ * @return
|
|
|
+ * @创建者 wanghailong
|
|
|
+ * @邮箱 wanghailong@persagy.com
|
|
|
+ * @修改描述
|
|
|
+ */
|
|
|
+ public static JSONObject prossesParamToJsonString(JSONObject jsonObject, String... majors){
|
|
|
+ for(String major : majors){
|
|
|
+ if(jsonObject.containsKey(major)){
|
|
|
+ jsonObject.put(major, JSON.toJSONString(jsonObject.get(major)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return jsonObject;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 功能描述:处理查询返回结果,转换结果中Date类型的数据格式
|
|
|
+ * @param queryResult
|
|
|
+ * @param fromDateFormat
|
|
|
+ * @param toDateFormat
|
|
|
+ * @param majors
|
|
|
+ * @return
|
|
|
+ * @throws Exception
|
|
|
+ */
|
|
|
+ public static String prossesResultToDateString(String queryResult, String fromDateFormat, String toDateFormat , String... majors) throws Exception {
|
|
|
+ if(queryResult.contains("Result") && queryResult.contains("Content")){
|
|
|
+ JSONObject resultJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONArray array = (JSONArray) resultJson.get("Content");
|
|
|
+ SimpleDateFormat fsdf = new SimpleDateFormat(fromDateFormat);
|
|
|
+ SimpleDateFormat tsdf = new SimpleDateFormat(toDateFormat);
|
|
|
+ for(int i = 0 ; i < array.size() ; i++){
|
|
|
+ JSONObject dataJson = array.getJSONObject(i);
|
|
|
+ for(String major : majors){
|
|
|
+ String dataString = dataJson.getString(major);
|
|
|
+ if(!StringUtil.isNull(dataString)){
|
|
|
+ dataJson.put(major, tsdf.format(fsdf.parse(dataString)));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ array.set(i, dataJson);
|
|
|
+ }
|
|
|
+ resultJson.put("Content", array);
|
|
|
+ queryResult = resultJson.toString();
|
|
|
+ }
|
|
|
+ return queryResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 功能描述:返回查询结果中的第一条记录
|
|
|
+ * @param queryResult
|
|
|
+ * @return
|
|
|
+ * @创建者 wanghailong
|
|
|
+ * @邮箱 wanghailong@persagy.com
|
|
|
+ * @修改描述
|
|
|
+ */
|
|
|
+ public static String getFirstRecordfromResult(String queryResult){
|
|
|
+ if(queryResult.contains("Result") && queryResult.contains("Content")){
|
|
|
+ JSONObject resultJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONArray array = (JSONArray) resultJson.get("Content");
|
|
|
+ if(array.size() > 0 && null != array.get(0)) {
|
|
|
+ resultJson.put("Item", JSONObject.parseObject(array.get(0).toString()));
|
|
|
+ resultJson.remove("Content");
|
|
|
+ resultJson.remove("Count");
|
|
|
+ }
|
|
|
+
|
|
|
+ queryResult = resultJson.toString();
|
|
|
+ }
|
|
|
+ return queryResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ *
|
|
|
+ * 功能描述:返回查询结果中的第一条记录,Json格式
|
|
|
+ * @param queryResult
|
|
|
+ * @return
|
|
|
+ * @创建者 wanghailong
|
|
|
+ * @邮箱 wanghailong@persagy.com
|
|
|
+ * @修改描述
|
|
|
+ */
|
|
|
+ public static JSONObject getFirstRecordfromResultWithJson(String queryResult){
|
|
|
+ JSONObject firstJson = null;
|
|
|
+ if(queryResult.contains("Result") && queryResult.contains("Content")){
|
|
|
+ JSONObject resultJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONArray array = (JSONArray) resultJson.get("Content");
|
|
|
+ if(array.size() > 0 && null != array.get(0)) {
|
|
|
+ firstJson = JSONObject.parseObject(array.get(0).toString());
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return firstJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 转换返回结果数据格式 persagy --> saga
|
|
|
+ * @param queryResult
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONObject translationResultFromPersagy(String queryResult){
|
|
|
+ JSONObject queryJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONObject result = new JSONObject();
|
|
|
+ result.put(ResultEnum.RESULT.getType(), queryJson.get(ResultEnum.PERSAGY_RESULT.getType()));
|
|
|
+ result.put(ResultEnum.CONTENT.getType(), queryJson.get(ResultEnum.PERSAGY_CONTENT.getType()));
|
|
|
+ result.put(ResultEnum.RESULT_MSG.getType(), queryJson.get(ResultEnum.PERSAGY_REASON.getType()));
|
|
|
+ return result;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ public static <K, V> Map<K, V> getMapFromResult(JSONObject resultJson, String keyCode, String valueCode){
|
|
|
+ Map<K, V> map = Maps.newHashMap();
|
|
|
+
|
|
|
+ JSONArray results = resultJson.getJSONArray(ResultEnum.CONTENT.getType());
|
|
|
+ results = results == null ? new JSONArray() : results;
|
|
|
+ JSONObject result;
|
|
|
+
|
|
|
+ for(int i=0; i<results.size(); i++){
|
|
|
+ result = results.getJSONObject(i);
|
|
|
+ map.put((K)result.get(keyCode), (V)result.get(valueCode));
|
|
|
+ }
|
|
|
+
|
|
|
+ return map;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param queryResult
|
|
|
+ * @param field 排序的字段
|
|
|
+ * @param order -1:倒序 1:正序
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONObject sortByField(String queryResult, String field, int order){
|
|
|
+ JSONObject resultJson = JSONObject.parseObject(queryResult);
|
|
|
+ JSONArray contentArray = resultJson.getJSONArray("Content");
|
|
|
+ if(contentArray != null){
|
|
|
+ Collections.sort(contentArray, new Comparator<Object>(){
|
|
|
+ public int compare(Object str1, Object str2){
|
|
|
+ JSONObject obj1 = JSONObject.parseObject(str1.toString());
|
|
|
+ JSONObject obj2 = JSONObject.parseObject(str2.toString());
|
|
|
+ if(obj1.getLongValue(field) > obj2.getLongValue(field)){
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+ if(obj1.getLongValue(field) == obj2.getLongValue(field)){
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return -1 * order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ resultJson.put("Content", contentArray);
|
|
|
+ return resultJson;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param array
|
|
|
+ * @param field 排序的字段
|
|
|
+ * @param order -1:倒序 1:正序
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONArray sortByField(JSONArray array, String field, int order){
|
|
|
+ if(array != null){
|
|
|
+ Collections.sort(array, new Comparator<Object>(){
|
|
|
+ public int compare(Object str1, Object str2){
|
|
|
+ JSONObject obj1 = JSONObject.parseObject(str1.toString());
|
|
|
+ JSONObject obj2 = JSONObject.parseObject(str2.toString());
|
|
|
+ if(obj1.getLongValue(field) > obj2.getLongValue(field)){
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+ if(obj1.getLongValue(field) == obj2.getLongValue(field)){
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return -1 * order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param array
|
|
|
+ * @param field 排序的字段
|
|
|
+ * @param order -1:倒序 1:正序
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONArray sortByIntegerField(JSONArray array, String field, int order){
|
|
|
+ if(array != null){
|
|
|
+ Collections.sort(array, new Comparator<Object>(){
|
|
|
+ public int compare(Object str1, Object str2){
|
|
|
+ JSONObject obj1 = JSONObject.parseObject(str1.toString());
|
|
|
+ JSONObject obj2 = JSONObject.parseObject(str2.toString());
|
|
|
+ String order1_Str = obj1.getString(field);
|
|
|
+ String order2_Str = obj2.getString(field);
|
|
|
+ if(StringUtil.isNull(order1_Str)) {
|
|
|
+ order1_Str = Integer.MIN_VALUE + "";
|
|
|
+ }
|
|
|
+ if(StringUtil.isNull(order2_Str)) {
|
|
|
+ order2_Str = Integer.MIN_VALUE + "";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ Integer order1 = Integer.valueOf(order1_Str);
|
|
|
+ Integer order2 = Integer.valueOf(order2_Str);
|
|
|
+
|
|
|
+ if(order1 > order2){
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+ if(order1 == order2){
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ return -1 * order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+ }
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param array
|
|
|
+ * @param field 排序的字段
|
|
|
+ * @param order -1:倒序 1:正序
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONArray sortByStringField(JSONArray array, String field, int order){
|
|
|
+ if(array != null){
|
|
|
+ Collections.sort(array, new Comparator<Object>(){
|
|
|
+ public int compare(Object str1, Object str2){
|
|
|
+ JSONObject obj1 = JSONObject.parseObject(str1.toString());
|
|
|
+ JSONObject obj2 = JSONObject.parseObject(str2.toString());
|
|
|
+ String order1 = obj1.getString(field);
|
|
|
+ if(order1 == null) {
|
|
|
+ order1 = "";
|
|
|
+ }
|
|
|
+
|
|
|
+ String order2 = obj2.getString(field);
|
|
|
+ if(order2 == null) {
|
|
|
+ order2 = "";
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ if(order1.compareTo(order2) > -1){
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+ return -1 * order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 排序
|
|
|
+ * @param array
|
|
|
+ * @param field 排序的字段
|
|
|
+ * @param order -1:倒序 1:正序
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ public static JSONArray sortByDateField(JSONArray array, String field, int order){
|
|
|
+ if(array != null){
|
|
|
+ Collections.sort(array, new Comparator<Object>(){
|
|
|
+ public int compare(Object str1, Object str2){
|
|
|
+ JSONObject obj1 = JSONObject.parseObject(str1.toString());
|
|
|
+ JSONObject obj2 = JSONObject.parseObject(str2.toString());
|
|
|
+ String order1_Str = obj1.getString(field);
|
|
|
+ String order2_Str = obj2.getString(field);
|
|
|
+ try {
|
|
|
+ DateTime order1 = DateUtil.parse(order1_Str,CommonConstant.date_format_save);
|
|
|
+ DateTime order2 = DateUtil.parse(order2_Str,CommonConstant.date_format_save);
|
|
|
+
|
|
|
+ if(order1.getTime() > order2.getTime()){
|
|
|
+ return order;
|
|
|
+ }
|
|
|
+ if(order1.getTime() == order2.getTime()){
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+ } catch (Exception e) {
|
|
|
+ }
|
|
|
+ return -1 * order;
|
|
|
+ }
|
|
|
+ });
|
|
|
+ }
|
|
|
+ return array;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+}
|