Ver código fonte

Merge remote-tracking branch 'origin/dev' into dev

xuzhancheng 3 dias atrás
pai
commit
b7e8034ca3

+ 19 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/boilertaskorder/vo/BoilerOrderItemPageRespVO.java

@@ -380,4 +380,23 @@ public class BoilerOrderItemPageRespVO {
     private Integer mainTaskStatus;
 
     private LocalDateTime finishUploadTime;
+
+    @JsonIgnore
+    private String handlerIdJson;
+
+    @JsonIgnore
+    private String reporterIdJson;
+
+    @Schema(description ="意见书经办人ID列表")
+    private List<String> handlerIdList;
+
+    @Schema(description ="意见书经办人列表")
+    private List<AdminUserRespDTO> handlerUserList;
+
+    @Schema(description = "意见书上报人ID列表")
+    private List<String> reporterIdList;
+
+    @Schema(description = "意见书上报人列表")
+    private List<AdminUserRespDTO> reporterUserList;
+
 }

+ 18 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/controller/admin/pipetaskorder/vo/PipeOrderItemPageRespVO.java

@@ -389,4 +389,22 @@ public class PipeOrderItemPageRespVO {
     private Integer mainTaskStatus;
 
     private LocalDateTime finishUploadTime;
+
+    @JsonIgnore
+    private String handlerIdJson;
+
+    @JsonIgnore
+    private String reporterIdJson;
+
+    @Schema(description ="意见书经办人ID列表")
+    private List<String> handlerIdList;
+
+    @Schema(description ="意见书经办人列表")
+    private List<AdminUserRespDTO> handlerUserList;
+
+    @Schema(description = "意见书上报人ID列表")
+    private List<String> reporterIdList;
+
+    @Schema(description = "意见书上报人列表")
+    private List<AdminUserRespDTO> reporterUserList;
 }

+ 156 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/dataobject/opinionreporter/OpinionReporterDO.java

@@ -0,0 +1,156 @@
+package cn.start.tz.module.pressure2.dal.dataobject.opinionreporter;
+
+import cn.start.tz.framework.mybatis.core.dataobject.BaseDO;
+import cn.start.tz.module.pressure2.util.JsonArrayUtil;
+import com.baomidou.mybatisplus.annotation.*;
+import com.fasterxml.jackson.annotation.JsonIgnore;
+import lombok.*;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.List;
+
+/**
+ * 意见书负责人配置 DO
+ *
+ * @author 特种管理员
+ */
+@TableName("PRESSURE_OPINION_REPORTER")
+@KeySequence("SEQ_PRESSURE_OPINION_REPORTER")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Slf4j
+public class OpinionReporterDO extends BaseDO {
+
+    /**
+     * 主键
+     */
+    @TableId(value = "ID", type = IdType.ASSIGN_UUID)
+    private String id;
+
+    /**
+     * 部门ID
+     */
+    @TableField("DEPT_ID")
+    private String deptId;
+
+    /**
+     * 意见书经办人ID(数据库字段,JSON格式字符串)
+     */
+    @TableField("HANDLER_ID")
+    @JsonIgnore
+    private String handlerId;
+
+    /**
+     * 意见书上报人ID(数据库字段,JSON格式字符串)
+     */
+    @TableField("REPORTER_ID")
+    @JsonIgnore
+    private String reporterId;
+
+    /**
+     * 意见书经办人ID列表(业务字段)
+     */
+    @TableField(exist = false)
+    private List<String> handlerIdList;
+
+    /**
+     * 意见书上报人ID列表(业务字段)
+     */
+    @TableField(exist = false)
+    private List<String> reporterIdList;
+
+    /**
+     * 从数据库字段获取经办人ID列表
+     */
+    public List<String> getHandlerIdList() {
+        if (handlerIdList == null) {
+            handlerIdList = JsonArrayUtil.jsonToList(handlerId);
+        }
+        return handlerIdList;
+    }
+
+    /**
+     * 设置经办人ID列表并更新数据库字段
+     */
+    public void setHandlerIdList(List<String> handlerIdList) {
+        this.handlerIdList = handlerIdList;
+        this.handlerId = JsonArrayUtil.listToJson(handlerIdList);
+    }
+
+    /**
+     * 从数据库字段获取上报人ID列表
+     */
+    public List<String> getReporterIdList() {
+        if (reporterIdList == null) {
+            reporterIdList = JsonArrayUtil.jsonToList(reporterId);
+        }
+        return reporterIdList;
+    }
+
+    /**
+     * 设置上报人ID列表并更新数据库字段
+     */
+    public void setReporterIdList(List<String> reporterIdList) {
+        this.reporterIdList = reporterIdList;
+        this.reporterId = JsonArrayUtil.listToJson(reporterIdList);
+    }
+
+    /**
+     * 添加经办人ID
+     */
+    public void addHandlerId(String id) {
+        List<String> currentList = getHandlerIdList();
+        if (!currentList.contains(id)) {
+            currentList.add(id);
+            setHandlerIdList(currentList);
+        }
+    }
+
+    /**
+     * 移除经办人ID
+     */
+    public void removeHandlerId(String id) {
+        List<String> currentList = getHandlerIdList();
+        currentList.remove(id);
+        setHandlerIdList(currentList);
+    }
+
+    /**
+     * 添加上报人ID
+     */
+    public void addReporterId(String id) {
+        List<String> currentList = getReporterIdList();
+        if (!currentList.contains(id)) {
+            currentList.add(id);
+            setReporterIdList(currentList);
+        }
+    }
+
+    /**
+     * 移除上报人ID
+     */
+    public void removeReporterId(String id) {
+        List<String> currentList = getReporterIdList();
+        currentList.remove(id);
+        setReporterIdList(currentList);
+    }
+
+    /**
+     * 检查是否包含指定的经办人ID
+     */
+    public boolean containsHandlerId(String id) {
+        return getHandlerIdList().contains(id);
+    }
+
+    /**
+     * 检查是否包含指定的上报人ID
+     */
+    public boolean containsReporterId(String id) {
+        return getReporterIdList().contains(id);
+    }
+
+}

+ 6 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/boilertaskorderitem/BoilerTaskOrderItemMapper.java

@@ -18,6 +18,7 @@ import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.Boi
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreportuser.BoilerTaskOrderItemReportUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemuser.BoilerTaskOrderItemUserDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
+import cn.start.tz.module.pressure2.dal.dataobject.opinionreporter.OpinionReporterDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorder.PipeTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemreport.PipeTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitemuser.PipeTaskOrderItemUserDO;
@@ -112,11 +113,16 @@ public interface BoilerTaskOrderItemMapper extends BaseMapperX<BoilerTaskOrderIt
                 selectAs(BoilerTaskOrderItemReportDO::getVideo,BoilerOrderItemPageRespVO::getVideo).
                 selectAs(BoilerTaskOrderItemReportDO::getAttachment,BoilerOrderItemPageRespVO::getAttachment).
 
+                // 将JSON字符串映射到临时字符串字段
+                selectAs(OpinionReporterDO::getHandlerId,BoilerOrderItemPageRespVO::getHandlerIdJson).
+                selectAs(OpinionReporterDO::getReporterId,BoilerOrderItemPageRespVO::getReporterIdJson).
+
                 leftJoin(BoilerTaskOrderDO.class, BoilerTaskOrderDO::getId, BoilerTaskOrderItemDO::getOrderId).
                 leftJoin(EquipBoilerDO.class, EquipBoilerDO::getId, BoilerTaskOrderItemDO::getEquipId).
                 leftJoin(BoilerTaskOrderItemUserDO.class, BoilerTaskOrderItemUserDO::getOrderItemId, BoilerTaskOrderItemDO::getId).
                 leftJoin(BoilerTaskOrderItemReportDO.class, BoilerTaskOrderItemReportDO::getOrderItemId, BoilerTaskOrderItemDO::getId).
                 leftJoin(BoilerTaskOrderItemReportUserDO.class,BoilerTaskOrderItemReportUserDO::getReportId, BoilerTaskOrderItemReportDO::getId).
+                leftJoin(OpinionReporterDO.class,OpinionReporterDO::getDeptId, BoilerTaskOrderDO::getDeptId).
                 groupBy(BoilerTaskOrderItemReportDO::getId)
         ;
 

+ 19 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/opinionreporter/OpinionReporterMapper.java

@@ -0,0 +1,19 @@
+package cn.start.tz.module.pressure2.dal.mysql.opinionreporter;
+
+import cn.start.tz.framework.common.pojo.PageResult;
+import cn.start.tz.framework.mybatis.core.mapper.BaseMapperX;
+import cn.start.tz.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.start.tz.module.pressure2.dal.dataobject.opinionreporter.OpinionReporterDO;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.Collections;
+
+/**
+ * 意见书负责人配置 Mapper
+ *
+ * @author 特种管理员
+ */
+@Mapper
+public interface OpinionReporterMapper extends BaseMapperX<OpinionReporterDO> {
+
+}

+ 7 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/dal/mysql/pipetaskorderitem/PipeTaskOrderItemMapper.java

@@ -14,11 +14,13 @@ import cn.start.tz.module.pressure2.controller.admin.boilertaskorder.vo.BoilerTa
 import cn.start.tz.module.pressure2.controller.admin.boilertaskorderitem.vo.BoilerTaskOrderItemPageReqVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorder.vo.PipeOrderItemPageRespVO;
 import cn.start.tz.module.pressure2.controller.admin.pipetaskorder.vo.PipeTaskOrderItemDetailVO;
+import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorder.BoilerTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderissuereportitem.BoilerTaskOrderIssueReportItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitem.BoilerTaskOrderItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.boilertaskorderitemreport.BoilerTaskOrderItemReportDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equipboiler.EquipBoilerDO;
 import cn.start.tz.module.pressure2.dal.dataobject.equippipe.EquipPipeDO;
+import cn.start.tz.module.pressure2.dal.dataobject.opinionreporter.OpinionReporterDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorder.PipeTaskOrderDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderissuereportitem.PipeTaskOrderIssueReportItemDO;
 import cn.start.tz.module.pressure2.dal.dataobject.pipetaskorderitem.PipeTaskOrderItemDO;
@@ -123,11 +125,16 @@ public interface PipeTaskOrderItemMapper extends BaseMapperX<PipeTaskOrderItemDO
                 selectAs(PipeTaskOrderItemReportDO::getVideo,PipeOrderItemPageRespVO::getVideo).
                 selectAs(PipeTaskOrderItemReportDO::getAttachment,PipeOrderItemPageRespVO::getAttachment).
 
+                // 将JSON字符串映射到临时字符串字段
+                selectAs(OpinionReporterDO::getHandlerId,PipeOrderItemPageRespVO::getHandlerIdJson).
+                selectAs(OpinionReporterDO::getReporterId,PipeOrderItemPageRespVO::getReporterIdJson).
+
                 leftJoin(PipeTaskOrderDO.class, PipeTaskOrderDO::getId, PipeTaskOrderItemDO::getOrderId).
                 leftJoin(EquipPipeDO.class, EquipPipeDO::getId, PipeTaskOrderItemDO::getEquipId).
                 leftJoin(PipeTaskOrderItemUserDO.class, PipeTaskOrderItemUserDO::getOrderItemId, PipeTaskOrderItemDO::getId).
                 leftJoin(PipeTaskOrderItemReportDO.class, PipeTaskOrderItemReportDO::getOrderId, PipeTaskOrderDO::getId).
                 leftJoin(PipeTaskOrderItemReportUserDO.class,PipeTaskOrderItemReportUserDO::getReportId, PipeTaskOrderItemReportDO::getId).
+                leftJoin(OpinionReporterDO.class,OpinionReporterDO::getDeptId, PipeTaskOrderDO::getDeptId).
                 groupBy(PipeTaskOrderItemReportDO::getId)
         ;
 

+ 47 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/boilertaskorder/BoilerTaskOrderServiceImpl.java

@@ -5934,13 +5934,60 @@ public class BoilerTaskOrderServiceImpl extends ServiceImpl<BoilerTaskOrderMappe
 
         List<String> list = new ArrayList<>(pageResult.getList().stream().map(BoilerOrderItemPageRespVO::getManagerId).filter(Objects::nonNull).toList());
         List<String> list2 = pageResult.getList().stream().map(BoilerOrderItemPageRespVO::getMainChecker).filter(Objects::nonNull).toList();
+        // 收集handler和reporter的ID用于查询用户信息
+        Set<String> allHandlerIds = new HashSet<>();
+        Set<String> allReporterIds = new HashSet<>();
+
+        pageResult.getList().forEach(item -> {
+            // 处理handlerIdList(从JSON字符串转换)
+            if (item.getHandlerIdJson() != null) {
+                List<String> handlerIds = JsonArrayUtil.jsonToList(item.getHandlerIdJson());
+                item.setHandlerIdList(handlerIds);
+                if (handlerIds != null) {
+                    allHandlerIds.addAll(handlerIds);
+                }
+            }
+
+            // 处理reporterIdList(从JSON字符串转换)
+            if (item.getReporterIdJson() != null) {
+                List<String> reporterIds = JsonArrayUtil.jsonToList(item.getReporterIdJson());
+                item.setReporterIdList(reporterIds);
+                if (reporterIds != null) {
+                    allReporterIds.addAll(reporterIds);
+                }
+            }
+
+        });
+
         list.addAll(list2);
+        list.addAll(allHandlerIds);
+        list.addAll(allReporterIds);
+
         if (!list.isEmpty()) {
             Map<String, AdminUserRespDTO> userMap = adminUserApi.getUserMap(list);
             pageResult.getList().forEach(item -> {
                 item.setManager(userMap.get(item.getManagerId()));
                 item.setMainCheckerUser(userMap.get(item.getMainChecker()));
                 item.setRemainingDays(10);
+
+                // 设置经办人列表
+                if (item.getHandlerIdList() != null) {
+                    List<AdminUserRespDTO> handlerUserList = item.getHandlerIdList().stream()
+                            .map(userMap::get)
+                            .filter(Objects::nonNull)
+                            .toList();
+                    item.setHandlerUserList(handlerUserList);
+                }
+
+                // 设置上报人列表
+                if (item.getReporterIdList() != null) {
+                    List<AdminUserRespDTO> reporterUserList = item.getReporterIdList().stream()
+                            .map(userMap::get)
+                            .filter(Objects::nonNull)
+                            .toList();
+                    item.setReporterUserList(reporterUserList);
+                }
+
             });
         }
 

+ 47 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/service/pipetaskorder/PipeTaskOrderServiceImpl.java

@@ -153,6 +153,7 @@ import cn.start.tz.module.pressure2.service.pipetaskordersecuritycheck.PipeTaskO
 import cn.start.tz.module.pressure2.service.userwallthicknesstemplate.UserWallThicknessTemplateService;
 import cn.start.tz.module.pressure2.util.ConversionUtil;
 import cn.start.tz.module.pressure2.util.DeptDataPermissionUtil;
+import cn.start.tz.module.pressure2.util.JsonArrayUtil;
 import cn.start.tz.module.pressure2.util.JsonDiffTool;
 import cn.start.tz.module.system.api.clientunit.ClientUnitApi;
 import cn.start.tz.module.system.api.dept.DeptApi;
@@ -5091,13 +5092,59 @@ public class PipeTaskOrderServiceImpl extends ServiceImpl<PipeTaskOrderMapper, P
 
         List<String> list = new ArrayList<>(pageResult.getList().stream().map(PipeOrderItemPageRespVO::getManagerId).filter(Objects::nonNull).toList());
         List<String> list2 = pageResult.getList().stream().map(PipeOrderItemPageRespVO::getMainChecker).filter(Objects::nonNull).toList();
+        // 收集handler和reporter的ID用于查询用户信息
+        Set<String> allHandlerIds = new HashSet<>();
+        Set<String> allReporterIds = new HashSet<>();
+
+        pageResult.getList().forEach(item -> {
+            // 处理handlerIdList(从JSON字符串转换)
+            if (item.getHandlerIdJson() != null) {
+                List<String> handlerIds = JsonArrayUtil.jsonToList(item.getHandlerIdJson());
+                item.setHandlerIdList(handlerIds);
+                if (handlerIds != null) {
+                    allHandlerIds.addAll(handlerIds);
+                }
+            }
+
+            // 处理reporterIdList(从JSON字符串转换)
+            if (item.getReporterIdJson() != null) {
+                List<String> reporterIds = JsonArrayUtil.jsonToList(item.getReporterIdJson());
+                item.setReporterIdList(reporterIds);
+                if (reporterIds != null) {
+                    allReporterIds.addAll(reporterIds);
+                }
+            }
+
+        });
+
         list.addAll(list2);
+        list.addAll(allHandlerIds);
+        list.addAll(allReporterIds);
+
         if (!list.isEmpty()) {
             Map<String, AdminUserRespDTO> userMap = adminUserApi.getUserMap(list);
             pageResult.getList().forEach(item -> {
                 item.setManager(userMap.get(item.getManagerId()));
                 item.setMainCheckerUser(userMap.get(item.getMainChecker()));
                 item.setRemainingDays(10);
+
+                // 设置经办人列表
+                if (item.getHandlerIdList() != null) {
+                    List<AdminUserRespDTO> handlerUserList = item.getHandlerIdList().stream()
+                            .map(userMap::get)
+                            .filter(Objects::nonNull)
+                            .toList();
+                    item.setHandlerUserList(handlerUserList);
+                }
+
+                // 设置上报人列表
+                if (item.getReporterIdList() != null) {
+                    List<AdminUserRespDTO> reporterUserList = item.getReporterIdList().stream()
+                            .map(userMap::get)
+                            .filter(Objects::nonNull)
+                            .toList();
+                    item.setReporterUserList(reporterUserList);
+                }
             });
         }
 

+ 159 - 0
tz-module-pressure2/tz-module-pressure2-biz/src/main/java/cn/start/tz/module/pressure2/util/JsonArrayUtil.java

@@ -0,0 +1,159 @@
+package cn.start.tz.module.pressure2.util;
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONException;
+import lombok.extern.slf4j.Slf4j;
+
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * JSON数组转换工具类
+ * 用于处理数据库存储的JSON格式字符串数组
+ *
+ * @author 特种管理员
+ */
+@Slf4j
+public class JsonArrayUtil {
+
+    /**
+     * 将字符串列表转换为JSON字符串,用于数据库存储
+     *
+     * @param list 字符串列表
+     * @return JSON字符串
+     */
+    public static String listToJson(List<String> list) {
+        if (list == null || list.isEmpty()) {
+            return "[]";
+        }
+        try {
+            return JSON.toJSONString(list);
+        } catch (Exception e) {
+            log.error("列表转JSON字符串失败: {}", list, e);
+            return "[]";
+        }
+    }
+
+    /**
+     * 将JSON字符串解析为字符串列表
+     *
+     * @param jsonStr JSON字符串
+     * @return 字符串列表
+     */
+    public static List<String> jsonToList(String jsonStr) {
+        if (StrUtil.isBlank(jsonStr)) {
+            return new ArrayList<>();
+        }
+        try {
+            // 尝试解析为JSON数组
+            JSONArray jsonArray = JSON.parseArray(jsonStr);
+            if (jsonArray != null) {
+                List<String> result = new ArrayList<>();
+                for (int i = 0; i < jsonArray.size(); i++) {
+                    Object item = jsonArray.get(i);
+                    if (item != null) {
+                        result.add(item.toString());
+                    }
+                }
+                return result;
+            }
+        } catch (JSONException e) {
+            // 如果不是有效的JSON数组格式,可能是逗号分隔的字符串
+            log.debug("JSON解析失败,尝试按逗号分割: {}", jsonStr);
+            return parseCommaSeparated(jsonStr);
+        } catch (Exception e) {
+            log.error("JSON字符串解析失败: {}", jsonStr, e);
+            return new ArrayList<>();
+        }
+        return new ArrayList<>();
+    }
+
+    /**
+     * 解析逗号分隔的字符串为列表
+     *
+     * @param str 逗号分隔的字符串
+     * @return 字符串列表
+     */
+    private static List<String> parseCommaSeparated(String str) {
+        if (StrUtil.isBlank(str)) {
+            return new ArrayList<>();
+        }
+        try {
+            List<String> result = new ArrayList<>();
+            String[] items = str.split(",");
+            for (String item : items) {
+                String trimmed = item.trim();
+                if (StrUtil.isNotBlank(trimmed)) {
+                    result.add(trimmed);
+                }
+            }
+            return result;
+        } catch (Exception e) {
+            log.error("逗号分隔字符串解析失败: {}", str, e);
+            return new ArrayList<>();
+        }
+    }
+
+    /**
+     * 向JSON数组字符串中添加元素
+     *
+     * @param jsonStr 原JSON字符串
+     * @param element 要添加的元素
+     * @return 更新后的JSON字符串
+     */
+    public static String addElement(String jsonStr, String element) {
+        List<String> list = jsonToList(jsonStr);
+        if (StrUtil.isNotBlank(element) && !list.contains(element)) {
+            list.add(element);
+        }
+        return listToJson(list);
+    }
+
+    /**
+     * 从JSON数组字符串中移除元素
+     *
+     * @param jsonStr 原JSON字符串
+     * @param element 要移除的元素
+     * @return 更新后的JSON字符串
+     */
+    public static String removeElement(String jsonStr, String element) {
+        List<String> list = jsonToList(jsonStr);
+        list.remove(element);
+        return listToJson(list);
+    }
+
+    /**
+     * 检查JSON数组字符串是否包含指定元素
+     *
+     * @param jsonStr JSON字符串
+     * @param element 要检查的元素
+     * @return 是否包含
+     */
+    public static boolean contains(String jsonStr, String element) {
+        List<String> list = jsonToList(jsonStr);
+        return list.contains(element);
+    }
+
+    /**
+     * 获取JSON数组字符串的大小
+     *
+     * @param jsonStr JSON字符串
+     * @return 数组大小
+     */
+    public static int size(String jsonStr) {
+        List<String> list = jsonToList(jsonStr);
+        return list.size();
+    }
+
+    /**
+     * 检查JSON数组字符串是否为空
+     *
+     * @param jsonStr JSON字符串
+     * @return 是否为空
+     */
+    public static boolean isEmpty(String jsonStr) {
+        return size(jsonStr) == 0;
+    }
+}