Kaynağa Gözat

大屏-整改功能调整 船舶功能调整

zhuang 5 ay önce
ebeveyn
işleme
aac5c35b51
15 değiştirilmiş dosya ile 891 ekleme ve 82 silme
  1. 23 0
      business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxShipOffshoreDao.java
  2. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxShipOffshoreDetailDao.java
  3. 2 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxProjectManageService.java
  4. 16 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxShipOffshoreDetailService.java
  5. 24 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxShipOffshoreService.java
  6. 176 81
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxProjectManageServiceImpl.java
  7. 20 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxShipOffshoreDetailServiceImpl.java
  8. 321 0
      business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxShipOffshoreServiceImpl.java
  9. 2 1
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxSeaBindProofDo.java
  10. 99 0
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxShipOffshoreDetailDo.java
  11. 79 0
      business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxShipOffshoreDo.java
  12. 11 0
      business-entity/src/main/java/com/rongwei/bsentity/vo/ShipBaseVo.java
  13. 32 0
      business-entity/src/main/java/com/rongwei/bsentity/vo/ZhcxShipOffshoreVo.java
  14. 7 0
      business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxProjectManageController.java
  15. 63 0
      business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxShipOffshoreController.java

+ 23 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxShipOffshoreDao.java

@@ -0,0 +1,23 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxShipOffshoreDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.rongwei.bsentity.vo.ShipBaseVo;
+import org.apache.ibatis.annotations.Select;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * <p>
+ * 船运离岸 Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+public interface ZhcxShipOffshoreDao extends BaseMapper<ZhcxShipOffshoreDo> {
+
+    @Select("select SEAT,WHARF FROM ZHCX_SHIP_BASE WHERE DELETED = '0'")
+    List<ShipBaseVo> getShipBase();
+}

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/dao/ZhcxShipOffshoreDetailDao.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.dao;
+
+import com.rongwei.bsentity.domain.ZhcxShipOffshoreDetailDo;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * <p>
+ * 船运离岸明细 Mapper 接口
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+public interface ZhcxShipOffshoreDetailDao extends BaseMapper<ZhcxShipOffshoreDetailDo> {
+
+}

+ 2 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxProjectManageService.java

@@ -113,4 +113,6 @@ public interface ZhcxProjectManageService extends IService<ZhcxProjectManageDo>
     ZhcxProjectManageDo getByCode(String prjCode);
 
     void addScreenRectifyData(Map<String, Object> map);
+
+    R searchRectifyTabData(Map<String, Object> map);
 }

+ 16 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxShipOffshoreDetailService.java

@@ -0,0 +1,16 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.rongwei.bsentity.domain.ZhcxShipOffshoreDetailDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+
+/**
+ * <p>
+ * 船运离岸明细 服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+public interface ZhcxShipOffshoreDetailService extends IService<ZhcxShipOffshoreDetailDo> {
+
+}

+ 24 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/ZhcxShipOffshoreService.java

@@ -0,0 +1,24 @@
+package com.rongwei.bscommon.sys.service;
+
+import com.aspose.cells.Workbook;
+import com.rongwei.bsentity.domain.ZhcxShipOffshoreDo;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 船运离岸 服务类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+public interface ZhcxShipOffshoreService extends IService<ZhcxShipOffshoreDo> {
+
+
+    StringBuilder excelImport(Workbook book, HttpServletRequest request);
+
+    StringBuilder detailExcelImport(Workbook book, HttpServletRequest request);
+}

+ 176 - 81
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxProjectManageServiceImpl.java

@@ -11,7 +11,9 @@ import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.aspose.cells.*;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.rongwei.bscommon.sys.dao.LuckysheetDao;
 import com.rongwei.bscommon.sys.feign.LuckySheetService;
 import com.rongwei.bscommon.sys.service.*;
@@ -2079,16 +2081,13 @@ public class ZhcxProjectManageServiceImpl extends ServiceImpl<ZhcxProjectManageD
     public R searchRectifyData(Map<String, Object> map) {
         Object projectIdObj = map.get("projectId");
         Object machineNoObj = map.get("machineNo");
-//        Object currentObj = map.get("current");
-//        Object sizeObj = map.get("size");
+
         if (ObjectUtil.isEmpty(projectIdObj) || ObjectUtil.isEmpty(machineNoObj)) {
             return R.error();
         }
         String projectId = (String) projectIdObj;
         List<String> machineNos = (List<String>) machineNoObj;
-//        int current = (Integer) currentObj;
-//        int size = (Integer) sizeObj;
-        //Page<ZhcxProjectRectifySnapDo> page = new Page<>(current, size);
+
         LambdaQueryWrapper<ZhcxProjectRectifySnapDo> eq = Wrappers.<ZhcxProjectRectifySnapDo>lambdaQuery()
                 .eq(ZhcxProjectRectifySnapDo::getProjectid, projectId)
                 .in(ZhcxProjectRectifySnapDo::getMachineno, machineNos)
@@ -2096,11 +2095,7 @@ public class ZhcxProjectManageServiceImpl extends ServiceImpl<ZhcxProjectManageD
                 .between(ZhcxProjectRectifySnapDo::getDate,
                         Date.from(LocalDateTime.now().minusDays(29).toLocalDate().atStartOfDay(ZoneId.systemDefault()).toInstant())
                         , Date.from(LocalDateTime.now().toLocalDate().atTime(LocalTime.MAX).atZone(ZoneId.systemDefault()).toInstant()));
-        //IPage<ZhcxProjectRectifySnapDo> pageData = zhcxProjectRectifySnapService.page(page, eq);
-//        List<ZhcxProjectRectifySnapDo> list = pageData.getRecords();
-//        Long total = pageData.getTotal();  // 总记录数
-//        Long pages = pageData.getPages();   // 总页数
-        //zhcxProjectManageDao.searchRectifyData();
+
         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
         List<ZhcxProjectRectifySnapVo> list = zhcxProjectRectifySnapService.list(eq).stream()
                 .map(record -> {
@@ -2109,42 +2104,9 @@ public class ZhcxProjectManageServiceImpl extends ServiceImpl<ZhcxProjectManageD
                     return vo;
                 })
                 .collect(Collectors.toList());;
-//        Map<String, List<ZhcxProjectRectifySnapDo>> collect = list.stream()
-//                .filter(e -> Objects.nonNull(e.getFirstorgid()))
-//                .collect(Collectors.groupingBy(ZhcxProjectRectifySnapDo:: getFirstorgid));
+
         RectifySnapDto rectifySnapDto = new RectifySnapDto();
         Set<String> dateList = new HashSet<>();
-        //List<RectifySnapVo> rectifySnapVos = new ArrayList<>();
-//        collect.forEach((k, v) -> {
-//
-////            Map<String, List<ZhcxProjectRectifySnapDo>> collect2 = v.stream()
-////                    .filter(e -> Objects.nonNull(e.getDate()))
-////                    .collect(Collectors.groupingBy(e -> dateFormat.format(e.getDate())));
-////            collect2.forEach((k2, v2) -> {
-////                dateList.add(k2);
-////                data.addAll(v2);
-////            });
-//            Map<String, List<ZhcxProjectRectifySnapDo>> collect2 = v.stream()
-//                    .filter(e -> Objects.nonNull(e.getMachineno()))
-//                    .collect(Collectors.groupingBy(e -> e.getMachineno()));
-//            Map<String,List<RectifySnapVo>> machineNoData = new HashMap<>(16);
-//            collect2.forEach((k2, v2) -> {
-//                RectifySnapVo rectifySnapVo = new RectifySnapVo();
-//                List<ZhcxProjectRectifySnapDo> data = new ArrayList<>();
-//                rectifySnapVo.setFirstdeptname(v2.get(0).getFirstorgname());
-//                Map<String, List<ZhcxProjectRectifySnapDo>> collect3 = v2.stream()
-//                        .filter(e -> Objects.nonNull(e.getDate()))
-//                        .collect(Collectors.groupingBy(e -> dateFormat.format(e.getDate())));
-//                collect3.forEach((k3, v3) -> {
-//                    dateList.add(k3);
-//
-//                });
-//                //machineNoData.put(k2,)
-//                rectifySnapVo.setData(data);
-//                rectifySnapVos.add(rectifySnapVo);
-//            });
-//
-//        });
         //根据机号分组
         Map<String, List<ZhcxProjectRectifySnapVo>> collect = list.stream()
                 .filter(e -> Objects.nonNull(e.getMachineno()))
@@ -2235,23 +2197,7 @@ public class ZhcxProjectManageServiceImpl extends ServiceImpl<ZhcxProjectManageD
             rectifySnapMachineDto.setSnapList(rectifySnapVos);
             machineNoData.add(rectifySnapMachineDto);
         });
-//        Map<String, List<ZhcxProjectRectifySnapDo>> collect = list.stream()
-//                .filter(e -> Objects.nonNull(e.getDate()))
-//                .collect(Collectors.groupingBy(e -> dateFormat.format(e.getDate())));
-//        collect.forEach((k, v) -> {
-//
-//            dateList.add(k);
-//            Map<String, List<ZhcxProjectRectifySnapDo>> collect2 = v.stream()
-//                    .filter(e -> Objects.nonNull(e.getFirstorgid()))
-//                    .collect(Collectors.groupingBy(ZhcxProjectRectifySnapDo:: getFirstorgid));
-//            collect2.forEach((k2, v2) -> {
-//                RectifySnapVo rectifySnapVo = new RectifySnapVo();
-//                rectifySnapVo.setFirstdeptname(v2.get(0).getFirstorgname());
-//                rectifySnapVo.setData(v2);
-//                rectifySnapVos.add(rectifySnapVo);
-//            });
-//
-//        });
+
         List<String> sortedDateList = dateList.stream()
                 .map(date -> {
                     try {
@@ -2314,30 +2260,179 @@ public class ZhcxProjectManageServiceImpl extends ServiceImpl<ZhcxProjectManageD
             // 比较数字部分
             return Integer.compare(num1, num2);
         });
+        rectifySnapDto.setDateList(sortedDateList);
+        rectifySnapDto.setList(machineNoData);
+        return R.ok(rectifySnapDto);
+    }
 
-//        rectifySnapVos.forEach(snapVo -> {
-//            List<ZhcxProjectRectifySnapDo> dataList = snapVo.getData();
-//            if (dataList != null) {
-//                // 按 date 字段倒序排序
-//                dataList.sort(Comparator.comparing(ZhcxProjectRectifySnapDo::getDate, Comparator.nullsLast(Comparator.reverseOrder())));
-//                sortedDateList.forEach(date -> {
-//                    if (dataList.stream().noneMatch(data -> {
-//                        SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
-//                        String formattedDate = sdf.format(data.getDate());
-//                        return formattedDate.equals(date); // 假设 date 是一个字符串,格式为 "yyyy-MM-dd"
-//                    })) {
-//                        ZhcxProjectRectifySnapDo zhcxProjectRectifySnapDo = new ZhcxProjectRectifySnapDo();
-//                        zhcxProjectRectifySnapDo.setDate(new Date(date)); // 将字符串 date 转换为 Date 对象
-//                        dataList.add(zhcxProjectRectifySnapDo);
-//                    }
-//                });
-//            }
-//        });
+    @Override
+    public R searchRectifyTabData(Map<String, Object> map) {
+        Object projectIdObj = map.get("projectId");
+        Object machineNoObj = map.get("machineNo");
+
+        if (ObjectUtil.isEmpty(projectIdObj) || ObjectUtil.isEmpty(machineNoObj)) {
+            return R.error();
+        }
+        String projectId = (String) projectIdObj;
+        List<String> machineNos = (List<String>) machineNoObj;
+
+        LambdaQueryWrapper<ZhcxProjectRectifySnapDo> eq = Wrappers.<ZhcxProjectRectifySnapDo>lambdaQuery()
+                .eq(ZhcxProjectRectifySnapDo::getProjectid, projectId)
+                .in(ZhcxProjectRectifySnapDo::getMachineno, machineNos)
+                .eq(ZhcxProjectRectifySnapDo::getDeleted, "0");
+
+        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy/MM/dd");
+        List<ZhcxProjectRectifySnapVo> list = zhcxProjectRectifySnapService.list(eq).stream()
+                .map(record -> {
+                    ZhcxProjectRectifySnapVo vo = new ZhcxProjectRectifySnapVo();
+                    BeanUtils.copyProperties(record, vo); // 使用 Spring 的工具类复制属性
+                    return vo;
+                })
+                .collect(Collectors.toList());;
+
+        RectifySnapDto rectifySnapDto = new RectifySnapDto();
+        Set<String> dateList = new HashSet<>();
+        //根据机号分组
+        Map<String, List<ZhcxProjectRectifySnapVo>> collect = list.stream()
+                .filter(e -> Objects.nonNull(e.getMachineno()))
+                .collect(Collectors.groupingBy(ZhcxProjectRectifySnapVo:: getMachineno));
+        //Map<String,List<RectifySnapVo>> machineNoData = new HashMap<>(16);
+        List<RectifySnapMachineDto> machineNoData = new ArrayList<>();
+        collect.forEach((k, v) -> {
+            List<RectifySnapVo> rectifySnapVos = new ArrayList<>();
+            //根据部门分组
+            Map<String, List<ZhcxProjectRectifySnapVo>> collect2 = v.stream()
+                    .filter(e -> Objects.nonNull(e.getFirstorgid()))
+                    .collect(Collectors.groupingBy(ZhcxProjectRectifySnapVo:: getFirstorgid));
+            collect2.forEach((k2, v2) -> {
+                RectifySnapVo rectifySnapVo = new RectifySnapVo();
+                List<ZhcxProjectRectifySnapVo> data = new ArrayList<>();
+                rectifySnapVo.setFirstdeptname(v2.get(0).getFirstorgname());
+                rectifySnapVo.setIfoutsidebase(v2.get(0).getIfoutsidebase());
+                //根据日期分组
+                Map<String, List<ZhcxProjectRectifySnapVo>> collect3 = v2.stream()
+                        .filter(e -> Objects.nonNull(e.getDate()))
+                        .collect(Collectors.groupingBy(e -> dateFormat.format(e.getDate())));
+                collect3.forEach((k3, v3) -> {
+                    dateList.add(k3);
+                    data.addAll(v3);
+                });
+                rectifySnapVo.setData(data);
+                rectifySnapVos.add(rectifySnapVo);
+            });
+            rectifySnapVos.sort((vo1, vo2) -> {
+                String base1 = vo1.getIfoutsidebase();
+                String base2 = vo2.getIfoutsidebase();
+
+                if (base1 == null && base2 == null) {
+                    return 0; // 都是 null
+                }
+                if (base1 == null) {
+                    return 1;                  // null 排最后
+                }
+                if (base2 == null) {
+                    return -1;                 // null 排最后
+                }
+
+                // 自定义排序逻辑: inside < outside
+                if (base1.equals("inside") && !base2.equals("inside")) {
+                    return -1;
+                }
+                if (base1.equals("outside") && base2.equals("inside")) {
+                    return 1;
+                }
+                return base1.compareTo(base2);                // 其他情况默认字典排序
+            });
+            Map<String, List<ZhcxProjectRectifySnapVo>> collect4 = v.stream()
+                    .filter(e -> Objects.nonNull(e.getDate()))
+                    .collect(Collectors.groupingBy(e -> dateFormat.format(e.getDate())));
+            List<ZhcxProjectRectifySnapVo> data = new ArrayList<>();
+            RectifySnapVo rectifySnapVo = new RectifySnapVo();
+            rectifySnapVo.setFirstdeptname("总合计");
+            collect4.forEach((k4, v4) -> {
+                // 汇总两个字段
+                int sumField1 = v4.stream().mapToInt(vo -> Optional.ofNullable(vo.getFinishnum()).orElse(0)).sum();
+                int sumField2 = v4.stream().mapToInt(vo -> Optional.ofNullable(vo.getRectifytotal()).orElse(0)).sum();
+                // 创建汇总对象
+                ZhcxProjectRectifySnapVo summaryVo = new ZhcxProjectRectifySnapVo();
+                summaryVo.setDate(v4.get(0).getDate()); // 设置分组的日期
+                summaryVo.setFinishnum(sumField1); // 设置字段1的总和
+                summaryVo.setRectifytotal(sumField2); // 设置字段2的总和
+                summaryVo.setFirstorgname("总合计");
+                data.add(summaryVo);
+            });
+            rectifySnapVo.setData(data);
+            rectifySnapVos.add(rectifySnapVo);
+            RectifySnapMachineDto rectifySnapMachineDto = new RectifySnapMachineDto();
+            rectifySnapMachineDto.setMachineNo(k);
+            rectifySnapMachineDto.setSnapList(rectifySnapVos);
+            machineNoData.add(rectifySnapMachineDto);
+        });
+
+        List<String> sortedDateList = dateList.stream()
+                .map(date -> {
+                    try {
+                        return dateFormat.parse(date);
+                    } catch (Exception e) {
+                        throw new RuntimeException(e);
+                    }
+                })
+                .sorted(Collections.reverseOrder())
+                .map(dateFormat::format)
+                .collect(Collectors.toList());
+        for (int i = 0; i < machineNoData.size(); i++) {
+            List<RectifySnapVo> snapList = machineNoData.get(i).getSnapList();
+            snapList.forEach(snapVo -> {
+                List<ZhcxProjectRectifySnapVo> dataList = snapVo.getData();
+                if (dataList != null) {
+                    // 按 date 字段倒序排序
+                    dataList.sort(Comparator.comparing(ZhcxProjectRectifySnapVo::getDate, Comparator.nullsLast(Comparator.reverseOrder())));
+                    sortedDateList.forEach(date -> {
+                        if (dataList.stream().noneMatch(data -> {
+                            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd");
+                            String formattedDate = sdf.format(data.getDate());
+                            return formattedDate.equals(date); // 假设 date 是一个字符串,格式为 "yyyy-MM-dd"
+                        })) {
+                            ZhcxProjectRectifySnapVo zhcxProjectRectifySnapVo = new ZhcxProjectRectifySnapVo();
+                            zhcxProjectRectifySnapVo.setDate(new Date(date)); // 将字符串 date 转换为 Date 对象
+                            dataList.add(zhcxProjectRectifySnapVo);
+                        }
+                    });
+                    for (int j = dataList.size() -1; j >= 0; j--) {
+                        ZhcxProjectRectifySnapVo current = dataList.get(j);
+                        Integer rectifytotal = current.getRectifytotal() != null ? current.getRectifytotal() : 0;
+                        Integer finishnum = current.getFinishnum() != null ? current.getFinishnum() : 0;
+                        // 设置未完成数
+                        current.setUnFinishNum(rectifytotal - finishnum);
+
+                        // 设置当前完成数
+                        if (j < dataList.size() - 1) {
+                            // 前一个元素
+                            ZhcxProjectRectifySnapVo previous = dataList.get(j + 1);
+                            int i1 = previous.getUnFinishNum() == null ? 0 : previous.getUnFinishNum();
+                            int i2 = current.getUnFinishNum() == null ? 0 : current.getUnFinishNum();
+                            current.setNowFinishNum(i1 - i2);
+                        } else {
+                            // 第一条记录没有 "前一条" 数据
+                            current.setNowFinishNum(0);
+                        }
+                    }
+                }
+            });
+        }
+        machineNoData.sort((o1, o2) -> {
+            String machineNo1 = o1.getMachineNo();
+            String machineNo2 = o2.getMachineNo();
 
+            // 提取数字部分
+            Integer num1 = extractNumber(machineNo1);
+            Integer num2 = extractNumber(machineNo2);
+
+            // 比较数字部分
+            return Integer.compare(num1, num2);
+        });
         rectifySnapDto.setDateList(sortedDateList);
         rectifySnapDto.setList(machineNoData);
-//        rectifySnapDto.setTotal(total.intValue());
-//        rectifySnapDto.setPage(pages.intValue());
         return R.ok(rectifySnapDto);
     }
 

+ 20 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxShipOffshoreDetailServiceImpl.java

@@ -0,0 +1,20 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.rongwei.bsentity.domain.ZhcxShipOffshoreDetailDo;
+import com.rongwei.bscommon.sys.dao.ZhcxShipOffshoreDetailDao;
+import com.rongwei.bscommon.sys.service.ZhcxShipOffshoreDetailService;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.springframework.stereotype.Service;
+
+/**
+ * <p>
+ * 船运离岸明细 服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+@Service
+public class ZhcxShipOffshoreDetailServiceImpl extends ServiceImpl<ZhcxShipOffshoreDetailDao, ZhcxShipOffshoreDetailDo> implements ZhcxShipOffshoreDetailService {
+
+}

+ 321 - 0
business-common/src/main/java/com/rongwei/bscommon/sys/service/impl/ZhcxShipOffshoreServiceImpl.java

@@ -0,0 +1,321 @@
+package com.rongwei.bscommon.sys.service.impl;
+
+import com.aspose.cells.Cells;
+import com.aspose.cells.Workbook;
+import com.aspose.cells.Worksheet;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.rongwei.bscommon.sys.service.*;
+import com.rongwei.bsentity.domain.*;
+import com.rongwei.bscommon.sys.dao.ZhcxShipOffshoreDao;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import com.rongwei.bsentity.vo.ShipBaseVo;
+import com.rongwei.bsentity.vo.ZhcxShipOffshoreVo;
+import com.rongwei.rwcommon.utils.SecurityUtil;
+import com.rongwei.rwcommon.utils.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.servlet.http.HttpServletRequest;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
+import java.util.*;
+import java.util.concurrent.atomic.AtomicBoolean;
+import java.util.concurrent.atomic.AtomicInteger;
+import java.util.stream.Collectors;
+
+/**
+ * <p>
+ * 船运离岸 服务实现类
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+@Service
+public class ZhcxShipOffshoreServiceImpl extends ServiceImpl<ZhcxShipOffshoreDao, ZhcxShipOffshoreDo> implements ZhcxShipOffshoreService {
+
+    private static final List<SimpleDateFormat> SIMPLE_DATE_FORMATS_LIST = new ArrayList<SimpleDateFormat>() {{
+        add(new SimpleDateFormat("yyyy-MM-dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy/MM/dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy年MM月dd日", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy.MM.dd", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy年MM月", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy-MM", Locale.ENGLISH));
+        add(new SimpleDateFormat("yyyy/MM", Locale.ENGLISH));
+    }};
+
+    @Autowired
+    private ZhcxProjectManageService zhcxProjectManageService;
+    @Autowired
+    private ZhcxProjectDeviceNumberService zhcxProjectDeviceNumberService;
+    @Autowired
+    private ZhcxSeaBindProofService zhcxSeaBindProofService;
+    @Autowired
+    private ZhcxShipOffshoreService service;
+    @Autowired
+    private ZhcxShipOffshoreDetailService zhcxShipOffshoreDetailService;
+    @Autowired
+    private ZhcxShipOffshoreDao dao;
+
+    @Override
+    public StringBuilder excelImport(Workbook book, HttpServletRequest request) {
+        StringBuilder errmsg = new StringBuilder();
+        Map<String, ZhcxProjectManageDo> prjMap = new HashMap<>(4);
+        Map<String,ZhcxProjectDeviceNumberDo> machineMap = new HashMap<>(4);
+        Worksheet worksheet = book.getWorksheets().get(0);
+        Cells cells = worksheet.getCells();
+        List<ZhcxShipOffshoreVo> list = new ArrayList<>();
+        for (int i = 0; i <= cells.getMaxDataRow(); i++) {
+            if(i < 2){
+                continue;
+            }
+            ZhcxShipOffshoreVo zhcxShipOffshoreVo = new ZhcxShipOffshoreVo();
+            String code = cells.get(i, 11).getStringValue();
+            String name = cells.get(i, 8).getStringValue();
+            String machineno = cells.get(i, 10).getStringValue();
+            if (code == null || code.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行船编号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setCode(code);
+            }
+            if (name == null || name.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行运输船必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setName(name);
+            }
+            if (machineno == null || machineno.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行机号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setMachineno(machineno);
+            }
+            zhcxShipOffshoreVo.setRemark(cells.get(i, 9).getStringValue());
+            String prjcode = cells.get(i, 1).getStringValue();
+            if (prjcode == null || prjcode.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行产品工号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setProjectcode(prjcode);
+            }
+            String prjname = cells.get(i, 2).getStringValue();
+            if (prjname == null || prjname.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行产品名称必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setProjectname(prjname);
+            }
+            if(StringUtils.isNotBlank(prjcode) && StringUtils.isNotBlank(prjname)){
+                ZhcxProjectManageDo projData = prjMap.get(prjcode);
+                if (projData == null) {
+                    LambdaQueryWrapper<ZhcxProjectManageDo> wrapper = new LambdaQueryWrapper<>();
+                    wrapper.eq(ZhcxProjectManageDo::getProjectCode,prjcode);
+                    ZhcxProjectManageDo one = zhcxProjectManageService.getOne(wrapper);
+                    if (one == null) {
+                        errmsg.append("第").append(i+1).append("行产品相关信息不存在系统中,请确认;<br>");
+                    }else{
+                        prjMap.put(one.getProjectCode(),one);
+                        zhcxShipOffshoreVo.setProjectid(one.getId());
+                    }
+                }else{
+                    zhcxShipOffshoreVo.setProjectid(projData.getId());
+                }
+            }
+            if(StringUtils.isNotBlank(machineno)){
+                ZhcxProjectDeviceNumberDo no = machineMap.get(prjcode + machineno);
+                if (no == null && StringUtils.isNotBlank(zhcxShipOffshoreVo.getProjectid())){
+                    LambdaQueryWrapper<ZhcxProjectDeviceNumberDo> wrapper = new LambdaQueryWrapper<>();
+                    wrapper.eq(ZhcxProjectDeviceNumberDo::getDeviceNumber,machineno);
+                    wrapper.eq(ZhcxProjectDeviceNumberDo::getPid,zhcxShipOffshoreVo.getProjectid());
+                    ZhcxProjectDeviceNumberDo one = zhcxProjectDeviceNumberService.getOne(wrapper);
+                    if (one == null) {
+                        errmsg.append("第").append(i+1).append("行机号不存在系统中,请确认;<br>");
+                    }else{
+                        machineMap.put(prjcode+machineno,one);
+                        zhcxShipOffshoreVo.setMachineid(one.getId());
+                    }
+                }else{
+                    zhcxShipOffshoreVo.setMachineid(no.getId());
+                }
+            }
+            String stringValue = cells.get(i, 4).getStringValue();
+            String stringValue1 = cells.get(i, 6).getStringValue();
+            if (stringValue != null && !stringValue.isEmpty()) {
+                Date date = parseDate(stringValue, null);
+                if(date == null){
+                    errmsg.append("第").append(i+1).append("格式化靠船时间失败,请确认;<br>");
+                }else{
+                    zhcxShipOffshoreVo.setDockdate(date);
+                }
+            }
+            if (stringValue1 != null && !stringValue1.isEmpty()) {
+                Date date = parseDate(stringValue1, null);
+                if(date == null){
+                    errmsg.append("第").append(i+1).append("格式化计划开船时间失败,请确认;<br>");
+                }else{
+                    zhcxShipOffshoreVo.setOffshoredate(date);
+                }
+                zhcxShipOffshoreVo.setOffshoredate(date);
+            }
+            list.add(zhcxShipOffshoreVo);
+        }
+        if (errmsg.length() > 0) {
+            return errmsg;
+        }
+        Map<String, List<ZhcxShipOffshoreVo>> collect =
+                list.stream().collect(Collectors.groupingBy(ZhcxShipOffshoreVo::getCode));
+        List<ZhcxShipOffshoreDo> offshoreDoList = new ArrayList<>();
+        List<ZhcxShipOffshoreDetailDo> offshoreDetailDoList = new ArrayList<>();
+        collect.forEach((k, vos) -> {
+            ZhcxShipOffshoreDo zhcxShipOffshoreDo = new ZhcxShipOffshoreDo();
+            zhcxShipOffshoreDo.setId(SecurityUtil.getUUID());
+            zhcxShipOffshoreDo.setCode(vos.get(0).getCode());
+            zhcxShipOffshoreDo.setName(vos.get(0).getName());
+            zhcxShipOffshoreDo.setDockdate(vos.get(0).getDockdate());
+            zhcxShipOffshoreDo.setOffshoredate(vos.get(0).getOffshoredate());
+            zhcxShipOffshoreDo.setRemark(vos.get(0).getRemark());
+//            List<String> prjCodeList = vos.stream()
+//                    .map(ZhcxShipOffshoreVo::getProjectcode).collect(Collectors.toList());
+//            LambdaQueryWrapper<ZhcxSeaBindProofDo> wrapper = new LambdaQueryWrapper<>();
+//            wrapper.in(ZhcxSeaBindProofDo::getProjectcode, prjCodeList);
+//            wrapper.eq(ZhcxSeaBindProofDo::getDeleted,"0");
+//            wrapper.eq(ZhcxSeaBindProofDo::getStatus,"审批通过");
+//            List<ZhcxSeaBindProofDo> zhcxSeaBindProofDos = zhcxSeaBindProofService.list(wrapper);
+//            Map<String, List<ZhcxSeaBindProofDo>> collect2 =
+//                    zhcxSeaBindProofDos.stream().collect(Collectors.groupingBy(ZhcxSeaBindProofDo::getProjectcode));
+            boolean unlaflag = true;
+            int size = vos.size();
+            AtomicInteger i = new AtomicInteger();
+            vos.forEach(item -> {
+                ZhcxShipOffshoreDetailDo zhcxShipOffshoreDetailDo = new ZhcxShipOffshoreDetailDo();
+                zhcxShipOffshoreDetailDo.setId(SecurityUtil.getUUID());
+                zhcxShipOffshoreDetailDo.setDockdate(item.getDockdate());
+                zhcxShipOffshoreDetailDo.setPid(zhcxShipOffshoreDo.getId());
+                zhcxShipOffshoreDetailDo.setProjectcode(item.getProjectcode());
+                zhcxShipOffshoreDetailDo.setProjectname(item.getProjectname());
+                zhcxShipOffshoreDetailDo.setProjectid(item.getProjectid());
+                zhcxShipOffshoreDetailDo.setMachineno(item.getMachineno());
+                zhcxShipOffshoreDetailDo.setMachineid(item.getMachineid());
+                zhcxShipOffshoreDetailDo.setColor("绿");
+                LambdaQueryWrapper<ZhcxSeaBindProofDo> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(ZhcxSeaBindProofDo::getProjectcode, item.getProjectcode());
+                wrapper.eq(ZhcxSeaBindProofDo::getDeleted,"0");
+                wrapper.eq(ZhcxSeaBindProofDo::getStatus,"审批通过");
+                //wrapper.likeRight(ZhcxSeaBindProofDo::getCraneno,item.getMachineno());
+                wrapper.apply("FIND_IN_SET({0}, CRANENO)", item.getMachineno());
+                List<ZhcxSeaBindProofDo> zhcxSeaBindProofDos = zhcxSeaBindProofService.list(wrapper);
+                if(zhcxSeaBindProofDos.size() > 0){
+                    i.getAndIncrement();
+                }
+                offshoreDetailDoList.add(zhcxShipOffshoreDetailDo);
+            });
+            if(size != 0 && i.get() == size){
+                unlaflag = false;
+            }
+            if(unlaflag){
+                zhcxShipOffshoreDo.setStatus("未离岸");
+            }else{
+                zhcxShipOffshoreDo.setStatus("已离岸");
+            }
+            offshoreDoList.add(zhcxShipOffshoreDo);
+        });
+        if (offshoreDoList.size() > 0) {
+            service.remove(null);
+            service.saveBatch(offshoreDoList);
+        }
+        if(offshoreDetailDoList.size() > 0){
+            zhcxShipOffshoreDetailService.remove(null);
+            zhcxShipOffshoreDetailService.saveBatch(offshoreDetailDoList);
+        }
+        return errmsg;
+    }
+
+    @Override
+    public StringBuilder detailExcelImport(Workbook book, HttpServletRequest request) {
+        StringBuilder errmsg = new StringBuilder();
+        Worksheet worksheet = book.getWorksheets().get(0);
+        Cells cells = worksheet.getCells();
+        List<ZhcxShipOffshoreVo> list = new ArrayList<>();
+        for (int i = 0; i <= cells.getMaxDataRow(); i++) {
+            if(i < 1){
+                continue;
+            }
+            ZhcxShipOffshoreVo zhcxShipOffshoreVo = new ZhcxShipOffshoreVo();
+            String code = cells.get(i, 1).getStringValue();
+            String prjcode = cells.get(i, 6).getStringValue();
+            String prjname = cells.get(i, 5).getStringValue();
+            String machineno = cells.get(i, 7).getStringValue();
+            if (code == null || code.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行工位编号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setCode(code);
+            }
+            if (prjcode == null || prjcode.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行项目工号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setProjectcode(prjcode);
+            }
+            if (prjname == null || prjname.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行项目名称必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setProjectname(prjname);
+            }
+            if (machineno == null || machineno.isEmpty()) {
+                errmsg.append("第").append(i+1).append("行机号必填;<br>");
+            }else{
+                zhcxShipOffshoreVo.setMachineno(machineno);
+            }
+
+            list.add(zhcxShipOffshoreVo);
+        }
+        if (errmsg.length() > 0) {
+            return errmsg;
+        }
+        List<ShipBaseVo> shipBaseList = dao.getShipBase();
+        Map<String,String> shipBase = new HashMap<>(4);
+        shipBaseList.forEach(v ->{
+            shipBase.put(v.getSeat(),v.getWharf());
+        });
+        int i = 3;
+        Map<String,String> map = new HashMap<>(4);
+        for (int i1 = 0; i1 < list.size(); i1++) {
+            String orDefault = shipBase.getOrDefault(list.get(i1).getCode(), "");
+            if(orDefault == ""){
+                errmsg.append("第").append(i+i1).append("行工位编号系统不存在;<br>");
+                continue;
+            }else{
+                ZhcxShipOffshoreDetailDo detail = new ZhcxShipOffshoreDetailDo();
+                detail.setSeat(list.get(i1).getCode());
+                detail.setWharf(orDefault);
+                LambdaQueryWrapper<ZhcxShipOffshoreDetailDo> wrapper = new LambdaQueryWrapper<>();
+                wrapper.eq(ZhcxShipOffshoreDetailDo::getProjectcode, list.get(i1).getProjectcode());
+                wrapper.eq(ZhcxShipOffshoreDetailDo::getMachineno, list.get(i1).getMachineno());
+                zhcxShipOffshoreDetailService.update(detail,wrapper);
+                String pid = map.getOrDefault(list.get(i1).getProjectcode() + list.get(i1).getMachineno(),"");
+                if(pid == ""){
+                    wrapper.eq(ZhcxShipOffshoreDetailDo::getDeleted,"0");
+                    List<ZhcxShipOffshoreDetailDo> list1 = zhcxShipOffshoreDetailService.list(wrapper);
+                    if (list1.size() > 0) {
+                        String pid1 = list1.get(0).getPid();
+                        map.put(list.get(i1).getProjectcode() + list.get(i1).getMachineno(),pid1);
+                        ZhcxShipOffshoreDo shipOffshoreDo = new ZhcxShipOffshoreDo();
+                        shipOffshoreDo.setId(pid1);
+                        shipOffshoreDo.setStopwharf(orDefault);
+                        service.updateById(shipOffshoreDo);
+                    }
+                }
+            }
+        }
+        return errmsg;
+    }
+
+    private Date parseDate(String stringValue, Date date) {
+        for (SimpleDateFormat simpleDateFormat : SIMPLE_DATE_FORMATS_LIST) {
+            try {
+                date = simpleDateFormat.parse(stringValue);
+                break;
+            } catch (ParseException e) {
+                log.error("格式化时间失败", e);
+                //return null;
+                //errmsg.append("第").append(index+1).append("行格式化时间失败,请确认;<br>");
+            }
+        }
+        return date;
+    }
+}

+ 2 - 1
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxSeaBindProofDo.java

@@ -91,5 +91,6 @@ public class ZhcxSeaBindProofDo extends BaseDo {
     @TableField("RECORDREMARK")
     private String recordremark;
 
-
+    @TableField("STATUS")
+    private String status;
 }

+ 99 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxShipOffshoreDetailDo.java

@@ -0,0 +1,99 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 船运离岸明细
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ZHCX_SHIP_OFFSHORE_DETAIL")
+public class ZhcxShipOffshoreDetailDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableField("ID")
+    private String id;
+    /**
+     * 租户id
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 项目id
+     */
+    @TableField("PROJECTID")
+    private String projectid;
+    /**
+     * 项目工号
+     */
+    @TableField("PROJECTCODE")
+    private String projectcode;
+    /**
+     * 项目名称
+     */
+    @TableField("PROJECTNAME")
+    private String projectname;
+    /**
+     * 项目简称
+     */
+    @TableField("PROJECTSHORTNAME")
+    private String projectshortname;
+    /**
+     * 机号
+     */
+    @TableField("MACHINENO")
+    private String machineno;
+    /**
+     * 机号id
+     */
+    @TableField("MACHINEID")
+    private String machineid;
+    /**
+     * 摆放码头
+     */
+    @TableField("WHARF")
+    private String wharf;
+    /**
+     * 机位
+     */
+    @TableField("SEAT")
+    private String seat;
+    /**
+     * 父id
+     */
+    @TableField("PID")
+    private String pid;
+    /**
+     * 颜色
+     */
+    @TableField("COLOR")
+    private String color;
+    /**
+     * 靠岸日期
+     */
+    @TableField("DOCKDATE")
+    private Date dockdate;
+
+
+}

+ 79 - 0
business-entity/src/main/java/com/rongwei/bsentity/domain/ZhcxShipOffshoreDo.java

@@ -0,0 +1,79 @@
+package com.rongwei.bsentity.domain;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.rongwei.rwcommon.base.BaseDo;
+import java.util.Date;
+import com.baomidou.mybatisplus.annotation.TableField;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+
+/**
+ * <p>
+ * 船运离岸
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@Accessors(chain = true)
+@TableName("ZHCX_SHIP_OFFSHORE")
+public class ZhcxShipOffshoreDo extends BaseDo {
+
+    private static final long serialVersionUID=1L;
+
+    /**
+     * 主键
+     */
+    @TableField("ID")
+    private String id;
+    /**
+     * 租户id
+     */
+    @TableField("TENANTID")
+    private String tenantid;
+    /**
+     * 扩展json格式配置
+     */
+    @TableField("ROPTION")
+    private String roption;
+    /**
+     * 船编号
+     */
+    @TableField("CODE")
+    private String code;
+    /**
+     * 船名称
+     */
+    @TableField("NAME")
+    private String name;
+    /**
+     * 预计离岸日期
+     */
+    @TableField("OFFSHOREDATE")
+    private Date offshoredate;
+    /**
+     * 停靠码头
+     */
+    @TableField("STOPWHARF")
+    private String stopwharf;
+    /**
+     * 图片
+     */
+    @TableField("PIC")
+    private String pic;
+    /**
+     * 状态
+     */
+    @TableField("STATUS")
+    private String status;
+    /**
+     * 靠岸日期
+     */
+    @TableField("DOCKDATE")
+    private Date dockdate;
+
+
+}

+ 11 - 0
business-entity/src/main/java/com/rongwei/bsentity/vo/ShipBaseVo.java

@@ -0,0 +1,11 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+@Data
+public class ShipBaseVo {
+
+    private String seat;
+
+    private String wharf;
+}

+ 32 - 0
business-entity/src/main/java/com/rongwei/bsentity/vo/ZhcxShipOffshoreVo.java

@@ -0,0 +1,32 @@
+package com.rongwei.bsentity.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+/**
+ * @author zhuang
+ */
+@Data
+public class ZhcxShipOffshoreVo {
+
+    private String projectid;
+
+    private String projectcode;
+
+    private String projectname;
+
+    private Date dockdate;
+
+    private Date offshoredate;
+
+    private String code;
+
+    private String name;
+
+    private String remark;
+
+    private String machineno;
+
+    private String machineid;
+}

+ 7 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxProjectManageController.java

@@ -219,6 +219,13 @@ public class ZhcxProjectManageController {
         return r;
     }
 
+    @PostMapping("/searchRectifyTabData")
+    @ApiOperation("查询整改快照tab数据")
+    public R searchRectifyTabData(@RequestBody Map<String,Object> map) {
+        R r = service.searchRectifyTabData(map);
+        return r;
+    }
+
     @PostMapping("/exportRectifySnapData")
     @ApiOperation("导出整改快照")
     public void exportRectifySnapData(@RequestBody Map<String,Object> map , HttpServletResponse response) {

+ 63 - 0
business-server/src/main/java/com/rongwei/bsserver/controller/ZhcxShipOffshoreController.java

@@ -0,0 +1,63 @@
+package com.rongwei.bsserver.controller;
+
+
+import com.aspose.cells.Workbook;
+import com.rongwei.bscommon.sys.service.ZhcxShipOffshoreService;
+import com.rongwei.rwcommon.base.R;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
+
+import javax.servlet.http.HttpServletRequest;
+
+/**
+ * <p>
+ * 船运离岸 前端控制器
+ * </p>
+ *
+ * @author dlc
+ * @since 2025-02-18
+ */
+@RestController
+@RequestMapping("/zhcxShipOffshore")
+public class ZhcxShipOffshoreController {
+
+    @Autowired
+    private ZhcxShipOffshoreService service;
+
+    @PostMapping("/excelImport")
+    @ResponseBody
+    public R excelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
+        Workbook book = null;
+        try {
+            book = new Workbook(file.getInputStream());
+            StringBuilder errmsg = service.excelImport(book, request);
+            if (errmsg.toString().isEmpty()){
+                return R.ok();
+            }else {
+                return R.error(errmsg.toString());
+            }
+        } catch (Exception e) {
+            return R.error();
+        }
+    }
+
+    @PostMapping("/detailExcelImport")
+    @ResponseBody
+    public R detailExcelImport(@RequestParam("file") MultipartFile file, HttpServletRequest request) {
+        Workbook book = null;
+        try {
+            book = new Workbook(file.getInputStream());
+            StringBuilder errmsg = service.detailExcelImport(book, request);
+            if (errmsg.toString().isEmpty()){
+                return R.ok();
+            }else {
+                return R.error(errmsg.toString());
+            }
+        } catch (Exception e) {
+            return R.saveError();
+        }
+    }
+
+}
+