From f0aae4b39afbcbb18fb5a0b32e3ca689662c5ca7 Mon Sep 17 00:00:00 2001
From: jinlin <jinlin>
Date: 星期一, 10 三月 2025 08:21:31 +0800
Subject: [PATCH] jar

---
 src/main/java/com/example/client/utils/MultiSelectComboBox.java                        |   11 
 src/main/java/com/example/client/service/ProgressPromptService.java                    |    4 
 src/main/java/com/example/client/service/Level2ManageService.java                      |    6 
 src/main/resources/mapper/teamgroup/SysTeamGroupClassDao.xml                           |  143 +-
 src/main/java/com/example/client/utils/CircleRenderer.java                             |   57 +
 src/main/java/com/example/client/service/UserManageService.java                        |    1 
 src/main/java/com/example/server/progressTrack/Dto/TableNodeDto.java                   |   30 
 src/main/java/com/example/client/service/ConfigManageService.java                      |  182 +++
 src/main/java/com/example/client/service/DataExportManageService.java                  |   81 +
 src/main/java/com/example/client/utils/ComplexTable.java                               |    3 
 src/main/java/com/example/client/service/ExportDismantTrackService.java                |    4 
 src/main/java/com/example/client/service/SubunitService.java                           |   23 
 src/main/java/com/example/server/progressTrack/dao/DjJdgzDismantTrackDao.java          |    4 
 src/main/java/com/example/client/service/Level1ManageService.java                      |   14 
 src/main/java/com/example/Application.java                                             |    1 
 src/main/java/com/example/client/service/ImportTrackRecordService.java                 |  404 ++++++++
 src/main/java/com/example/client/Login.java                                            |   19 
 src/main/java/com/example/client/utils/CommonTable.java                                |   19 
 src/main/java/com/example/client/service/TeamGroupManageService.java                   |   20 
 src/main/resources/mapper/cabin/CabinDao.xml                                           |    4 
 src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java                   |   50 
 src/main/resources/templateFile/跟踪记录导入模板.xlsx                                          |    0 
 src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java                |    3 
 src/main/java/com/example/client/service/StatisDismantService.java                     |    9 
 src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java                  |   40 
 src/main/java/com/example/server/progressTrack/service/DjJdgzDismantTrackService.java  |   14 
 src/main/java/com/example/server/DataSync/dto/DataImportDto.java                       |   10 
 src/main/java/com/example/client/service/DataImportManageService.java                  |  145 ++
 src/main/java/com/example/server/utils/DownLoadTmpFile.java                            |  146 ++
 src/main/java/com/example/client/service/HandoverService.java                          |    4 
 src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel3Dao.xml                     |   76 +
 src/main/java/com/example/client/service/Level2AddOrUpdate.java                        |    6 
 src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel1Dao.xml                     |    7 
 src/main/java/com/example/client/service/TeamGroupAddOrUpdate.java                     |  137 ++
 src/main/java/com/example/server/teamGroup/dao/SysTeamGroupClassDao.java               |    2 
 src/main/resources/templateFile/三级网络图导入模板.xlsx                                         |    0 
 src/main/java/com/example/client/service/DismantTrackService.java                      |   20 
 src/main/java/com/example/client/service/ImportDataService.java                        |    8 
 src/main/java/com/example/client/service/TrackRecordManageService.java                 |   59 
 src/main/java/com/example/server/progressTrack/dao/DjJdgzNetworkLevel3Dao.java         |    3 
 src/main/java/com/example/client/service/ImportLevel3Service.java                      |   12 
 src/main/java/com/example/client/service/Level3ManageService.java                      |   40 
 src/main/java/com/example/client/service/StatisDismant2Service.java                    |  249 +++++
 src/main/java/com/example/client/service/SubunitAddOrUpdate.java                       |   21 
 src/main/java/com/example/server/progressTrack/service/NetWorkDiagramService.java      |    4 
 src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java |   80 +
 src/main/resources/db/csiczb1.db                                                       |    0 
 src/main/resources/templateFile/子部件导入模板.xlsx                                           |    0 
 src/main/java/com/example/server/DataSync/dto/DataExportDto.java                       |    9 
 src/main/java/com/example/server/teamGroup/service/SysTeamGroupClassService.java       |   12 
 src/main/java/com/example/client/dto/JComboBoxItem.java                                |    6 
 src/main/java/com/example/client/service/ExportTrackRecordService.java                 |    8 
 src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java           |    2 
 /dev/null                                                                              |  106 --
 src/main/resources/mapper/progressTrack/DjJdgzDismantTrackDao.xml                      |  108 +
 src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java   |    4 
 src/main/java/com/example/client/service/Level3View2Service.java                       |  263 +++++
 src/main/java/com/example/client/service/StatisReportsService.java                     |    2 
 src/main/java/com/example/server/DataSync/service/DataSyncService.java                 |    7 
 src/main/java/com/example/client/service/MenuService.java                              |   26 
 src/main/java/com/example/server/progressTrack/model/DjJdgzTrackRecord.java            |   13 
 src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml                       |  151 ++
 62 files changed, 2,446 insertions(+), 446 deletions(-)

diff --git a/src/main/java/com/example/Application.java b/src/main/java/com/example/Application.java
index a7df162..19e2b59 100644
--- a/src/main/java/com/example/Application.java
+++ b/src/main/java/com/example/Application.java
@@ -28,7 +28,6 @@
     public static void main(String[] args) {
         System.setProperty("java.awt.headless", "false");
         SpringApplication.run(Application.class, args);
-
     }
 }
 
diff --git a/src/main/java/com/example/client/Login.java b/src/main/java/com/example/client/Login.java
index 13cd379..45af729 100644
--- a/src/main/java/com/example/client/Login.java
+++ b/src/main/java/com/example/client/Login.java
@@ -5,6 +5,7 @@
 import com.example.server.user.model.SysUser;
 import com.example.server.user.service.UserService;
 import com.example.server.utils.CacheUtils;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
@@ -139,6 +140,7 @@
         String finalSite = site;
         String finalTeamGroup = teamGroup;
         String finalTeam = team;
+        String finalTeamGroup1 = teamGroup;
         loginButton.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
@@ -149,10 +151,20 @@
 
                 user = userService.login(name, str);
                 exist = user.getExist();
-
+                Boolean exit2 = true;
+                if (StringUtils.isNotBlank(user.getTeamgroup())) {
+                    if (StringUtils.isNotBlank(finalTeamGroup1) && !finalTeamGroup1.equals("null")) {
+                        if (!finalTeamGroup1.contains(user.getTeamgroup())) {
+                            exit2 = false;
+                        }
+                    }
+                }
 
                 if (exist) {
-                    System.out.println("鐧诲綍鎴愬姛");
+                    if (!exit2) {
+                        JOptionPane.showMessageDialog(null, "褰撳墠鏈哄櫒涓嶆敮鎸佽涓撲笟鐢ㄦ埛鐧诲綍", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                        return;
+                    }
                     try {
                         String path = Login.class.getClassLoader().getResource("config.properties").getPath();
                         OutputStream outputStream = null;
@@ -161,11 +173,12 @@
                             outputStream = new FileOutputStream(path);
                         } else {
                             try {
-                                outputStream = new FileOutputStream("config.properties");
+                                outputStream = new FileOutputStream(configPath);
                             } catch (FileNotFoundException ex) {
                                 ex.printStackTrace();
                             }
                         }
+
                         properties.setProperty("userName", name);
                         properties.setProperty("password", str);
                         properties.store(outputStream, "rxkj");
diff --git a/src/main/java/com/example/client/dto/JComboBoxItem.java b/src/main/java/com/example/client/dto/JComboBoxItem.java
index 5bcbf78..aba4acc 100644
--- a/src/main/java/com/example/client/dto/JComboBoxItem.java
+++ b/src/main/java/com/example/client/dto/JComboBoxItem.java
@@ -3,15 +3,15 @@
 import java.util.Objects;
 
 public class JComboBoxItem {
-    private final long id;
+    private final Long id;
     private final String name;
 
-    public JComboBoxItem(long id, String name) {
+    public JComboBoxItem(Long id, String name) {
         this.id = id;
         this.name = name;
     }
 
-    public long getId() {
+    public Long getId() {
         return id;
     }
 
diff --git a/src/main/java/com/example/client/service/ConfigManageService.java b/src/main/java/com/example/client/service/ConfigManageService.java
new file mode 100644
index 0000000..75ad3f7
--- /dev/null
+++ b/src/main/java/com/example/client/service/ConfigManageService.java
@@ -0,0 +1,182 @@
+package com.example.client.service;
+
+
+import com.example.client.Login;
+import com.example.client.dto.JComboBoxItem;
+import com.example.client.utils.GBC;
+import com.example.client.utils.MultiSelectComboBox;
+import com.example.client.utils.WaitUtil;
+import com.example.server.DataSync.service.DataSyncService;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
+import com.example.server.user.model.SysUser;
+import com.example.server.utils.CacheUtils;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.io.*;
+import java.nio.charset.StandardCharsets;
+import java.util.Date;
+import java.util.HashSet;
+import java.util.Properties;
+import java.util.Set;
+
+
+@Service
+public class ConfigManageService {
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+    @Value("${data.config-path}")
+    private String configPath;
+
+    public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
+        Properties properties = new Properties();
+
+        String site = "";
+        String teamGroup = "";
+        String team = "";
+
+        String path = Login.class.getClassLoader().getResource("config.properties").getPath();
+        InputStream inStream = null;
+        File dir = new File(path);
+        if (dir.exists()) {
+            inStream = Login.class.getClassLoader().getResourceAsStream("config.properties");
+        } else {
+            try {
+                inStream = new FileInputStream(configPath);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        }
+        Reader reader = null;
+        try {
+            reader = new InputStreamReader(inStream, StandardCharsets.UTF_8);
+            // 浣跨敤Properties.load(Reader)鍔犺浇灞炴�ф枃浠�
+            properties.load(reader);
+            site = properties.get("site").toString();
+            teamGroup = properties.get("teamGroup").toString();
+            team = properties.get("team").toString();
+        } catch (IOException e) {
+            e.printStackTrace();
+        } finally {
+            if (reader != null) {
+                try {
+                    reader.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+            if (inStream != null) {
+                try {
+                    inStream.close();
+                } catch (IOException e) {
+                    e.printStackTrace();
+                }
+            }
+        }
+
+        JPanel panel = new JPanel();
+
+        GridBagLayout layout = new GridBagLayout();
+        panel.setLayout(layout);
+
+        panel.setPreferredSize(new Dimension(width - 20, height));
+        String[] siteList = new String[]{
+                "宸ヤ綔缁�", "鍘傚", "TD"
+        };
+        JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
+
+        JLabel JLabel1 = new JLabel("鎵�灞炴満鍣�");
+        JComboBox<String> comboBox = new JComboBox<>(siteList);
+        comboBox.setPreferredSize(new Dimension(185,28));
+        if (StringUtils.isNotBlank(site)) {
+            comboBox.setSelectedItem(site);
+        }
+
+        JLabel JLabel2 = new JLabel("鎵�灞濼D");
+        JTextField teamName = new JTextField(16);
+        if (StringUtils.isNotBlank(team)) {
+            teamName.setText(team.replace("TD", ""));
+        }
+
+        JLabel JLabel3 = new JLabel("鍙搷浣滅殑涓撲笟");
+        MultiSelectComboBox comboBox2 = new MultiSelectComboBox(teamList);
+        comboBox2.setPreferredSize(new Dimension(500, 25));
+        if (StringUtils.isNotBlank(teamGroup) && !teamGroup.equals("null")) {
+            Set<Long> selectedIds = new HashSet<>();
+            String[] idParts = teamGroup.split(",");
+            for (String idPart : idParts) {
+                selectedIds.add(Long.parseLong(idPart.trim())); // 灏嗗瓧绗︿覆杞崲涓� Long 绫诲瀷骞舵坊鍔犲埌闆嗗悎涓�
+            }
+
+            // 灏� ID 杞崲涓哄搴旂殑 JComboBoxItem 瀵硅薄
+            Set<JComboBoxItem> selectedItems = new HashSet<>();
+            for (JComboBoxItem item : teamList) {
+                if (selectedIds.contains(item.getId())) { // 妫�鏌� Long 绫诲瀷鐨� ID 鏄惁鍖归厤
+                    selectedItems.add(item); // 娣诲姞鍒伴�変腑椤归泦鍚�
+                }
+            }
+            comboBox2.setSelectedItems(selectedItems);
+        }
+
+
+        JButton save = new JButton("淇濆瓨");
+
+        save.addActionListener((e) -> {
+            try {
+                String path2 = Login.class.getClassLoader().getResource("config.properties").getPath();
+                OutputStream outputStream = null;
+                File dir2 = new File(path2);
+                if (dir2.exists()) {
+                    outputStream = new FileOutputStream(path2);
+                } else {
+                    try {
+                        outputStream = new FileOutputStream(configPath);
+                    } catch (FileNotFoundException ex) {
+                        ex.printStackTrace();
+                    }
+                }
+                Set<JComboBoxItem> selectedItems = comboBox2.getSelectedItems();
+                StringBuilder selectedIds = new StringBuilder();
+                for (JComboBoxItem item : selectedItems) {
+                    selectedIds.append(item.getId()).append(",");
+                }
+                properties.setProperty("site", comboBox.getSelectedItem().toString());
+                properties.setProperty("team", teamName.getText() + "TD");
+                properties.setProperty("teamGroup", String.valueOf(selectedIds));
+                CacheUtils.remove("site", "site");
+                CacheUtils.put("site", "site", comboBox.getSelectedItem().toString());
+                properties.store(outputStream, "rxkj");
+                outputStream.close();
+            } catch (FileNotFoundException ex) {
+                ex.printStackTrace();
+            } catch (IOException ep) {
+                ep.printStackTrace();
+            }
+        });
+
+
+        panel.add(JLabel1, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        panel.add(comboBox, new GBC(1, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        panel.add(JLabel2, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        panel.add(teamName, new GBC(1, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        panel.add(JLabel3, new GBC(0, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        panel.add(comboBox2, new GBC(1, 2, 2, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        panel.add(save, new GBC(0, 3, 2, 1).setWeight(0, 0));
+
+
+        return panel;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/example/client/service/DataExportManageService.java b/src/main/java/com/example/client/service/DataExportManageService.java
new file mode 100644
index 0000000..28a6341
--- /dev/null
+++ b/src/main/java/com/example/client/service/DataExportManageService.java
@@ -0,0 +1,81 @@
+package com.example.client.service;
+
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.utils.CommonTable;
+import com.example.client.utils.GBC;
+import com.example.client.utils.WaitUtil;
+import com.example.server.DataSync.dto.DataExportDto;
+import com.example.server.DataSync.service.DataSyncService;
+import com.example.server.utils.CacheUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.util.ArrayList;
+import java.util.List;
+
+@Service
+public class DataExportManageService {
+    @Autowired
+    DataSyncService dataSyncService;
+    @Autowired
+    ImportDataService importDataService;
+
+    public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
+        JPanel panel = new JPanel(new BorderLayout()); // 浣跨敤 BorderLayout
+        panel.setPreferredSize(new Dimension(width - 10, height));
+
+        JPanel left = new JPanel(new BorderLayout()); // 涓� left 璁剧疆甯冨眬
+        left.setPreferredSize(new Dimension((width - 10) / 2, height));
+
+        JPanel right = new JPanel(new BorderLayout()); // 涓� right 璁剧疆甯冨眬
+        right.setPreferredSize(new Dimension((width - 10) / 2, height));
+
+        JButton btnExport = new JButton("瀵煎嚭");
+        JPanel top = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 涓� left 璁剧疆甯冨眬
+        top.add(btnExport);
+
+        JLabel label1 = new JLabel("鎻愮ず淇℃伅");
+        JTextArea tips = new JTextArea(7, 30);
+        tips.setEnabled(false);
+        tips.setLineWrap(true);
+
+        JPanel center = new JPanel(new BorderLayout()); // 涓� left 璁剧疆甯冨眬
+        center.setPreferredSize(new Dimension((width - 10) / 2, height-50));
+        center.add(label1,BorderLayout.NORTH);
+        center.add(tips,BorderLayout.CENTER);
+
+        left.add(top, BorderLayout.NORTH);
+        left.add(center, BorderLayout.CENTER);
+
+        JLabel label2 = new JLabel("瀵煎嚭璁板綍");
+        List<DataExportDto> list = new ArrayList<>();
+        List<ColumnDto> columnDto = new ArrayList<>();
+        columnDto.add(new ColumnDto("搴忓彿", "", 265, "autoCreate", false, null, null));
+        columnDto.add(new ColumnDto("瀵煎嚭鏃堕棿", "exportDate", 265, null, false, null, null));
+        columnDto.add(new ColumnDto("瀵煎嚭浜�", "importStaff", 265, null, false, null, null));
+        JTable table = CommonTable.createCommonTable(list, columnDto);
+        table.setRowHeight(25);
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+        right.add(label2, BorderLayout.NORTH);
+        right.add(new JScrollPane(table), BorderLayout.CENTER); // 灏� table 鍖呰鍦� JScrollPane 涓�
+
+        panel.add(left, BorderLayout.WEST);
+        panel.add(right, BorderLayout.CENTER); // 灏� right 娣诲姞鍒� CENTER 鍖哄煙
+
+        btnExport.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                dataSyncService.export();
+            }
+        });
+
+        return panel;
+    }
+}
diff --git a/src/main/java/com/example/client/service/DataImportManageService.java b/src/main/java/com/example/client/service/DataImportManageService.java
new file mode 100644
index 0000000..4d3b099
--- /dev/null
+++ b/src/main/java/com/example/client/service/DataImportManageService.java
@@ -0,0 +1,145 @@
+package com.example.client.service;
+
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.utils.CommonTable;
+import com.example.client.utils.GBC;
+import com.example.client.utils.WaitUtil;
+import com.example.server.DataSync.dto.DataExportDto;
+import com.example.server.DataSync.dto.DataImportDto;
+import com.example.server.DataSync.service.DataSyncService;
+import com.example.server.progressTrack.model.DjJdgzNetworkLevel2List;
+import com.example.server.utils.CacheUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+
+import java.awt.*;
+import java.awt.event.*;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+
+@Service
+public class DataImportManageService {
+    @Value("${data.imgDir}")
+    private String imgPath;
+    @Autowired
+    DataSyncService dataSyncService;
+    @Autowired
+    ImportDataService importDataService;
+
+    public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.setPreferredSize(new Dimension(width-10,height));
+
+        JPanel left = new JPanel(new BorderLayout());
+        left.setPreferredSize(new Dimension((width-10)/2,height));
+
+        JPanel right = new JPanel(new BorderLayout());
+        right.setPreferredSize(new Dimension((width-10)/2,height));
+
+        JPanel top = new JPanel(new FlowLayout(FlowLayout.LEFT)); // 涓� left 璁剧疆甯冨眬
+        top.setPreferredSize(new Dimension((width - 10) / 2, 50));
+
+        JPanel center = new JPanel(); // 涓� left 璁剧疆甯冨眬
+        GridBagLayout layout = new GridBagLayout();
+        center.setLayout(layout);
+        center.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/2));
+
+        JPanel south = new JPanel(new BorderLayout()); // 涓� left 璁剧疆甯冨眬
+        south.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/2));
+
+
+        String site = (String) CacheUtils.get("site", "site");
+        JLabel label = new JLabel(site + "鏈哄櫒");
+        top.add(label);
+
+        JPanel jPanel = importDataService.FileUpload(jFrame,700,100);
+        JButton btnImport = new JButton("瀵煎叆");
+        center.add(jPanel, new GBC(0, 0, 1, 1).setInsets(5));
+        center.add(btnImport, new GBC(0, 1, 1, 1).setInsets(5));
+
+
+        JLabel label1 = new JLabel("鎻愮ず淇℃伅");
+        JTextArea tips = new JTextArea(7, 30);
+        tips.setEnabled(false);
+        tips.setLineWrap(true);
+        south.add(label1,BorderLayout.NORTH);
+        south.add(tips,BorderLayout.CENTER);
+
+
+        btnImport.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                // 鍒涘缓鏃嬭浆绛夊緟妗嗙殑瀹炰緥锛堝亣璁網aitUtil鏄竴涓嚜瀹氫箟鐨凷wing缁勪欢锛�
+                final WaitUtil waitUtil = new WaitUtil(imgPath, "鏁版嵁姝e湪瀵煎叆锛岃绋嶅��");
+
+                // 寮�濮嬩笂浼犳枃浠剁殑寮傛浠诲姟
+                SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {
+                    @Override
+                    protected String doInBackground() throws Exception {
+                        String flag =  importDataService.UnzipFile();
+                        return flag;
+                    }
+
+                    @Override
+                    protected void done() {
+                        try {
+                            // 鑾峰彇涓婁紶缁撴灉锛堝湪杩欎釜渚嬪瓙涓紝鎴戜滑鍋囪涓婁紶鏂规硶杩斿洖Boolean绫诲瀷锛�
+                            String uploadSucceeded = get();
+
+                            // 鍒锋柊琛ㄦ牸鏁版嵁锛堝鏋滀笂浼犳垚鍔燂級
+                            if (uploadSucceeded.equals("true")) {
+                                waitUtil.dispose();
+                                System.out.println("瀵煎叆鎴愬姛鏃堕棿" + new Date());
+                            } else {
+                                waitUtil.dispose();
+                                JOptionPane.showMessageDialog(null, uploadSucceeded, "鎻愮ず", JOptionPane.ERROR_MESSAGE);
+                            }
+
+                        } catch (Exception ex) {
+                            ex.printStackTrace();
+                            waitUtil.dispose();
+                        }
+                    }
+                };
+                // 鎵ц寮傛浠诲姟
+                sw.execute();
+                waitUtil.setVisible(true);
+            }
+        });
+
+        left.add(top,BorderLayout.NORTH);
+        left.add(center,BorderLayout.CENTER);
+        left.add(south,BorderLayout.SOUTH);
+
+        JLabel label2 = new JLabel("瀵煎叆璁板綍");
+        List<DataImportDto> list  = new ArrayList<>();
+
+        List<ColumnDto> columnDto = new ArrayList<>();
+        //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
+        columnDto.add(new ColumnDto("搴忓彿", "", 200, "autoCreate", false, null,null));
+        columnDto.add(new ColumnDto("鏁版嵁婧�", "importLocal", 200, null, false, null,null));
+        columnDto.add(new ColumnDto("瀵煎叆鏃堕棿", "importDate", 200, null, false, null,null));
+        columnDto.add(new ColumnDto("鎿嶄綔浜�", "importStaff", 200, null, false, null,null));
+        JTable table = CommonTable.createCommonTable(list, columnDto);
+        table.setRowHeight(25);
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+        right.add(label2, BorderLayout.NORTH);
+        right.add(new JScrollPane(table), BorderLayout.CENTER);
+
+        panel.add(left,BorderLayout.WEST);
+        panel.add(right, BorderLayout.CENTER);
+
+        return panel;
+    }
+}
+
+
+
+
diff --git a/src/main/java/com/example/client/service/DataSyncManageService.java b/src/main/java/com/example/client/service/DataSyncManageService.java
deleted file mode 100644
index c439497..0000000
--- a/src/main/java/com/example/client/service/DataSyncManageService.java
+++ /dev/null
@@ -1,106 +0,0 @@
-package com.example.client.service;
-
-
-import com.example.client.utils.CommonTable;
-import com.example.client.utils.GBC;
-import com.example.client.utils.WaitUtil;
-import com.example.server.DataSync.service.DataSyncService;
-import com.example.server.progressTrack.model.DjJdgzNetworkLevel2List;
-import com.example.server.utils.CacheUtils;
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.stereotype.Service;
-
-import javax.swing.*;
-
-import java.awt.*;
-import java.awt.event.*;
-import java.util.Date;
-import java.util.List;
-
-
-@Service
-public class DataSyncManageService {
-    @Value("${data.imgDir}")
-    private String imgPath;
-    @Autowired
-    DataSyncService dataSyncService;
-    @Autowired
-    ImportDataService importDataService;
-
-    public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
-
-        JPanel panel = new JPanel();
-        GridBagLayout layout = new GridBagLayout();
-        panel.setLayout(layout);
-
-        String site = (String) CacheUtils.get("site", "site");
-        JLabel label = new JLabel(site + "鏈哄櫒");
-
-        JButton btnExport = new JButton("瀵煎嚭");
-        JPanel jPanel = importDataService.FileUpload(jFrame,500,200);
-        JButton btnImport = new JButton("瀵煎叆");
-
-        btnImport.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                // 鍒涘缓鏃嬭浆绛夊緟妗嗙殑瀹炰緥锛堝亣璁網aitUtil鏄竴涓嚜瀹氫箟鐨凷wing缁勪欢锛�
-                final WaitUtil waitUtil = new WaitUtil(imgPath, "鏁版嵁姝e湪瀵煎叆锛岃绋嶅��");
-
-                // 寮�濮嬩笂浼犳枃浠剁殑寮傛浠诲姟
-                SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {
-                    @Override
-                    protected String doInBackground() throws Exception {
-                        String flag =  importDataService.UnzipFile();
-                        return flag;
-                    }
-
-                    @Override
-                    protected void done() {
-                        try {
-                            // 鑾峰彇涓婁紶缁撴灉锛堝湪杩欎釜渚嬪瓙涓紝鎴戜滑鍋囪涓婁紶鏂规硶杩斿洖Boolean绫诲瀷锛�
-                            String uploadSucceeded = get();
-
-                            // 鍒锋柊琛ㄦ牸鏁版嵁锛堝鏋滀笂浼犳垚鍔燂級
-                            if (uploadSucceeded.equals("true")) {
-                                waitUtil.dispose();
-                                System.out.println("瀵煎叆鎴愬姛鏃堕棿" + new Date());
-                            } else {
-                                waitUtil.dispose();
-                                JOptionPane.showMessageDialog(null, uploadSucceeded, "鎻愮ず", JOptionPane.ERROR_MESSAGE);
-                            }
-
-                        } catch (Exception ex) {
-                            ex.printStackTrace();
-                            waitUtil.dispose();
-                        }
-                    }
-                };
-                // 鎵ц寮傛浠诲姟
-                sw.execute();
-                waitUtil.setVisible(true);
-            }
-        });
-
-        btnExport.addActionListener(new ActionListener() {
-            @Override
-            public void actionPerformed(ActionEvent e) {
-                    dataSyncService.export();
-            }
-        });
-
-        panel.add(label, new GBC(0, 0, 4, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
-
-        panel.add(btnExport, new GBC(0, 1, 4, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
-
-        panel.add(jPanel, new GBC(0, 2, 6, 5).setAnchor(GBC.SOUTHEAST).setInsets(5));
-        panel.add(btnImport, new GBC(6, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
-
-
-        return panel;
-    }
-}
-
-
-
-
diff --git a/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java b/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
index cf8ac81..86726ce 100644
--- a/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
@@ -33,13 +33,20 @@
     @Autowired
     private DjJdgzDismantTrackService djJdgzDismantTrackService;
     @Autowired
+    private DjJdgzNetworkLevel3Service djJdgzNetworkLevel3Service;
+    @Autowired
     private StatisDismantService statisDismantService;
+    @Autowired
+    private StatisDismant2Service statisDismant2Service;
     @Autowired
     private CabinService cabinService;
     private  JTable trackTable;
     private   List<ColumnDto> columnDto;
+    private   DjJdgzNetworkLevel3 nowLevel3;
+    private    List<DjJdgzDismantTrack> list;
 
     public JPanel createTrack(Integer width, Integer height, DjJdgzNetworkLevel3 djJdgzNetworkLevel3,JFrame frame) {
+        nowLevel3 = djJdgzNetworkLevel3;
         JPanel panel = new JPanel(new BorderLayout());
         panel.setPreferredSize(new Dimension(width, height));
 
@@ -52,23 +59,25 @@
         panel.add(centerJpanel, BorderLayout.CENTER);
         panel.add(topJpanel, BorderLayout.NORTH);
 
-        JButton btnTj = new JButton("缁熻鎶ヨ〃");
+        JButton btnTjz = new JButton("鎷嗗嵏杩涘害缁熻鎬昏〃");
+        JButton btnTj = new JButton("鎷嗗嵏杩涘害璇︽儏琛�");
         JButton btnExport = new JButton("瀵煎嚭鎷嗗嵏鎶ヨ〃");
         JButton btnSave = new JButton("淇濆瓨");
         JButton btnImport = new JButton("鎵归噺瀵煎叆");
 
+        topJpanel.add(btnTjz);
         topJpanel.add(btnTj);
         topJpanel.add(btnExport);
         topJpanel.add(btnSave);
         topJpanel.add(btnImport);
 
-        List<DjJdgzDismantTrack> list = djJdgzDismantTrackService.getList(djJdgzNetworkLevel3.getId(), null);
+        list = djJdgzDismantTrackService.getList(nowLevel3.getId(), null);
         List<TableButton> buttonList = new ArrayList<>();
         buttonList.add(new TableButton("edit", "缂栬緫"));
         JComboBoxItem[] cabinList = cabinService.getList();
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�"),
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�"),
         };
 
         // 鍒涘缓宸︿晶琛ㄦ牸
@@ -92,11 +101,11 @@
         columnDto.add(new ColumnDto("鍏ュ簱鏃堕棿", "warehouseTime", 130, "selectDate", true, null, null));
         columnDto.add(new ColumnDto("鍏ュ簱浜哄憳", "warehouseStaff", 120, null, true, null, null));
         columnDto.add(new ColumnDto("褰撳墠瀛樻斁浣嶇疆", "currentLocation", 160, null, true, null, null));
-        columnDto.add(new ColumnDto("鐘舵��", "status", 120, "dict", true, null, statusList));
+        columnDto.add(new ColumnDto("鐘舵��", "status", 120, "dicts", true, null, statusList));
 
         trackTable = CommonTable.createCommonTable(list, columnDto);
         trackTable.setRowHeight(25);
-        trackTable.setAutoCreateRowSorter(true);
+
         trackTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
 
@@ -113,10 +122,16 @@
         trackTable = new ComplexTable(headerRows,body);
         CommonTable.setColumnType(columnDto, trackTable);*/
 
+        btnTjz.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                statisDismantService.createTable(frame,nowLevel3.getLevel1NetworkId());
+            }
+        });
         btnTj.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                statisDismantService.createTable(frame,djJdgzNetworkLevel3.getLevel1NetworkId());
+                statisDismant2Service.createTable(frame,nowLevel3.getLevel1NetworkId());
             }
         });
 
@@ -131,11 +146,11 @@
             @Override
             public void actionPerformed(ActionEvent e) {
                 SysUser user = (SysUser) CacheUtils.get("user", "user");
-                if (user.getTeamgroup()==null||user.getTeamgroup().equals(djJdgzNetworkLevel3.getTeamgroupId())){
+                if (user.getTeamgroup()==null||user.getTeamgroup().equals(nowLevel3.getTeamgroupId().toString())){
                     CommonTable.saveTableList(list, trackTable, columnDto);
                     djJdgzDismantTrackService.save(list);
                 }else{
-                    JOptionPane.showMessageDialog(null, "涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                    JOptionPane.showMessageDialog(null, "褰撳墠鐢ㄦ埛涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                 }
             }
         });
@@ -143,7 +158,7 @@
         btnImport.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                importDismantTrackService.FileUpload(djJdgzNetworkLevel3.getId(),frame);
+                importDismantTrackService.FileUpload(nowLevel3.getId(),frame);
             }
         });
 
@@ -156,10 +171,11 @@
         return panel;
     }
     public void refreshTable(Long level3Id){
-        List<DjJdgzDismantTrack> list = djJdgzDismantTrackService.getList(level3Id, null);
+        nowLevel3 = djJdgzNetworkLevel3Service.get(level3Id);
+        list = djJdgzDismantTrackService.getList(level3Id, null);
         CommonTable.refreshTable(list, columnDto, trackTable);
         trackTable.setRowHeight(25);
-        trackTable.setAutoCreateRowSorter(true);
+
         trackTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
     }
 
diff --git a/src/main/java/com/example/client/service/DismantTrackService.java b/src/main/java/com/example/client/service/DismantTrackService.java
index 730b9f8..878f4b6 100644
--- a/src/main/java/com/example/client/service/DismantTrackService.java
+++ b/src/main/java/com/example/client/service/DismantTrackService.java
@@ -57,7 +57,7 @@
         JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
         JComboBoxItem[] cabinList = cabinService.getList();
         String[] typeList = new String[]{
-                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�"
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
         };
         List<DjJdgzShip> shipList = djJdgzShipService.getList();
         Map<String, Long> shipMap = new HashMap<>();
@@ -113,9 +113,9 @@
         list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
 
         columnDto.add(new ColumnDto("搴忓彿", "", 60, "autoCreate", false, null, null));
-        columnDto.add(new ColumnDto("璁惧鍚嶇О", "name", 112, null, false, null, null));
-        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 100, "dict", false, null, deptList));
-        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 100, "dict", false, null, teamList));
+        columnDto.add(new ColumnDto("璁惧鍚嶇О", "name", 110, null, false, null, null));
+        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 120, "dict", false, null, deptList));
+        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 120, "dict", false, null, teamList));
         columnDto.add(new ColumnDto("鑸卞", "cabinId", 100, "dict", false, null, cabinList));
         columnDto.add(new ColumnDto("绫诲埆", "type", 100, null, false, null, null));
 
@@ -136,7 +136,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -175,7 +175,7 @@
 
                         CommonTable.refreshTable(list, columnDto, subTable);
                         subTable.setRowHeight(25);
-                        subTable.setAutoCreateRowSorter(true);
+
                         subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                         subTable.addMouseListener(new MouseAdapter() {
                             public void mouseClicked(MouseEvent e) {
@@ -205,7 +205,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -233,7 +233,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -261,7 +261,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -284,7 +284,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
diff --git a/src/main/java/com/example/client/service/ExportDismantTrackService.java b/src/main/java/com/example/client/service/ExportDismantTrackService.java
index 3dfd520..96a8d58 100644
--- a/src/main/java/com/example/client/service/ExportDismantTrackService.java
+++ b/src/main/java/com/example/client/service/ExportDismantTrackService.java
@@ -48,8 +48,8 @@
         frame1.setLayout(layout);
 
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�"),
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�"),
         };
         JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
         JComboBoxItem[] teamGroupList = sysTeamGroupClassService.getList();
diff --git a/src/main/java/com/example/client/service/ExportTrackRecordService.java b/src/main/java/com/example/client/service/ExportTrackRecordService.java
index 3eac7eb..6383426 100644
--- a/src/main/java/com/example/client/service/ExportTrackRecordService.java
+++ b/src/main/java/com/example/client/service/ExportTrackRecordService.java
@@ -60,12 +60,12 @@
         frame1.setLayout(layout);
 
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�"),
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�"),
         };
         JComboBoxItem[] hasDelayRiskList = {
-                new JComboBoxItem(0, "鍚�"),
-                new JComboBoxItem(1, "鏄�"),
+                new JComboBoxItem(0L, "鍚�"),
+                new JComboBoxItem(1L, "鏄�"),
         };
 
         JComboBoxItem[] projectList = level1Service.getProjectList();
diff --git a/src/main/java/com/example/client/service/HandoverService.java b/src/main/java/com/example/client/service/HandoverService.java
index dae06c7..d548e2f 100644
--- a/src/main/java/com/example/client/service/HandoverService.java
+++ b/src/main/java/com/example/client/service/HandoverService.java
@@ -82,7 +82,7 @@
 
         table = CommonTable.createCommonTable(list[0], columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         comboBox.addItemListener(new ItemListener() {
@@ -92,7 +92,7 @@
                 list[0] = handoverService.getList(projectId);
                 CommonTable.refreshTable(list[0], columnDto,table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
                 tableModelListener(table,jFrame,list[0]);
diff --git a/src/main/java/com/example/client/service/ImportDataService.java b/src/main/java/com/example/client/service/ImportDataService.java
index eb77b26..4f14b4a 100644
--- a/src/main/java/com/example/client/service/ImportDataService.java
+++ b/src/main/java/com/example/client/service/ImportDataService.java
@@ -39,6 +39,8 @@
 
     public JPanel FileUpload(JFrame frame, Integer width, Integer heigth) {
         JPanel jPanel = new JPanel();
+        /*GridBagLayout layout = new GridBagLayout();
+        jPanel.setLayout(layout);*/
         jPanel.setPreferredSize(new Dimension(width, heigth));
 
         JTable table = new JTable();
@@ -48,13 +50,15 @@
 
 
         JScrollPane scrolltable = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
-
+        scrolltable.setPreferredSize(new Dimension(width-150,heigth));
         scrolltable.setViewportView(table);
         scrolltable.getViewport().setBackground(Color.WHITE);
 
         JButton browseButton = new JButton("閫夋嫨鏂囦欢");
-        jPanel.add(browseButton);
+
         jPanel.add(scrolltable);
+        jPanel.add(browseButton);
+
 
         browseButton.addActionListener(new ActionListener() {
             @Override
diff --git a/src/main/java/com/example/client/service/ImportLevel3Service.java b/src/main/java/com/example/client/service/ImportLevel3Service.java
index b941bef..2e389e5 100644
--- a/src/main/java/com/example/client/service/ImportLevel3Service.java
+++ b/src/main/java/com/example/client/service/ImportLevel3Service.java
@@ -51,7 +51,7 @@
     private String tmpPath;
 
     public void FileUpload(List<ColumnDto> columnDto, JTable subTable, JFrame jFrame) {
-        frame = new JFrame("瀵煎叆");
+        frame = new JFrame("瀵煎叆涓夌骇缃戠粶鍥�");
         frame.setSize(900, 600);
         frame.setResizable(true);
         frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
@@ -89,7 +89,11 @@
             @Override
             public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
                 super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
-                setText(truncateText(value.toString(), 15)); // 鎴柇鏂囨湰
+                if(value!=null){
+                    setText(truncateText(value.toString(), 15)); // 鎴柇鏂囨湰
+                }else{
+                    setText("");
+                }
                 return this;
             }
 
@@ -286,8 +290,8 @@
                                 JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
                                 JComboBoxItem[] cabinList = cabinService.getList();
                                 String[] typeList = new String[]{
-                                        "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�"
-                                };
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
+        };
                                 List<DjJdgzNetworkLevel3> list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
                                 CommonTable.refreshTable(list, columnDto, subTable);
                                 level3ManageService.tableModelListener(list, subTable, jFrame);
diff --git a/src/main/java/com/example/client/service/ImportTrackRecordService.java b/src/main/java/com/example/client/service/ImportTrackRecordService.java
new file mode 100644
index 0000000..b411498
--- /dev/null
+++ b/src/main/java/com/example/client/service/ImportTrackRecordService.java
@@ -0,0 +1,404 @@
+package com.example.client.service;
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.dto.JComboBoxItem;
+import com.example.client.utils.*;
+import com.example.server.cabin.service.CabinService;
+import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
+import com.example.server.progressTrack.model.DjJdgzTrackRecord;
+import com.example.server.progressTrack.service.*;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
+import com.example.server.utils.DownLoadTmpFile;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import java.awt.*;
+import java.awt.datatransfer.DataFlavor;
+import java.awt.datatransfer.Transferable;
+import java.awt.event.ActionEvent;
+import java.awt.event.ActionListener;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.io.File;
+import java.util.Date;
+import java.util.List;
+import java.util.Set;
+
+
+@Service
+public class ImportTrackRecordService {
+    private JTable table;
+    private JFrame frame;
+    @Value("${data.imgDir}")
+    private String imgPath;
+    private File selectedFiles;
+    @Autowired
+    private Level3ManageService level3ManageService;
+    @Autowired
+    private DjJdgzNetworkLevel3Service level3Service;
+    @Autowired
+    private DjJdgzNetworkLevel2ListService level2ListService;
+    @Autowired
+    private DjJdgzNetworkLevel2Service level2Service;
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+    @Autowired
+    private CabinService cabinService;
+    @Autowired
+    private DjJdgzNetworkLevel1Service level1Service;
+    @Autowired
+    private DjJdgzTrackRecordService djJdgzTrackRecordService;
+    @Value("${data.tmp-path}")
+    private String tmpPath;
+
+    public void FileUpload(List<ColumnDto> columnDto, JTable subTable, JFrame jFrame) {
+        frame = new JFrame("瀵煎叆璺熻釜璁板綍");
+        frame.setSize(900, 600);
+        frame.setResizable(true);
+        frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        frame.setLocationRelativeTo(null);
+        frame.setVisible(true);
+        GridBagLayout layout = new GridBagLayout();
+        frame.setLayout(layout);
+
+        table = new JTable();
+        table.setRowHeight(40);
+        DefaultTableModel model = new DefaultTableModel();
+        String[] columnIdentifiers = {"鏂囦欢鍦板潃", "鎿嶄綔"};//琛ㄥご
+
+        final Long[] level1Id = {null};
+        final Long[] level2Id = {null};
+        final Long[] level2NodeId = {null};
+
+        JComboBoxItem[] projectList = level1Service.getProjectList();
+        JComboBoxItem[] level2List = level2Service.getLevel2List(projectList[0].getId());
+        JComboBoxItem[] level2NodeList = level2ListService.getNode(level2List[0].getId());
+        level1Id[0] = projectList[0].getId();
+        level2Id[0] = level2List[0].getId();
+        level2NodeId[0] = level2NodeList[0].getId();
+
+        JLabel label0 = new JLabel("宸ョ▼");
+        JComboBox<JComboBoxItem> comboBox0 = new JComboBox<>(projectList);
+
+        JLabel label1 = new JLabel("浜岀骇缃戠粶鍥�");
+        JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>();
+        comboBox1.setModel(new DefaultComboBoxModel<>(level2List));
+
+        JLabel label2 = new JLabel("浜岀骇缃戠粶鍥捐妭鐐�");
+        JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(level2NodeList);
+        comboBox2.setRenderer(new DefaultListCellRenderer() {
+            @Override
+            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+                super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+                if(value!=null){
+                    setText(truncateText(value.toString(), 15)); // 鎴柇鏂囨湰
+                }else{
+                    setText("");
+                }
+                return this;
+            }
+
+            private String truncateText(String text, int maxLength) {
+                if (text.length() > maxLength) {
+                    return text.substring(0, maxLength - 3) + "...";
+                }
+                return text;
+            }
+        });
+
+        JComboBoxItem[] teamList1 = sysTeamGroupClassService.getTeamList(null);
+
+        JLabel JLabel5 = new JLabel("涓撲笟");
+        MultiSelectComboBox comboBox4 = new MultiSelectComboBox(teamList1);
+        comboBox4.setPreferredSize(new Dimension(185, 28));
+
+        JButton downloadbtn = new JButton("璺熻釜璁板綍瀵煎叆妯℃澘鐢熸垚");
+
+        comboBox0.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    JComboBoxItem selectedItem = (JComboBoxItem) comboBox0.getSelectedItem();
+                    if (selectedItem != null) {
+                        long selectedId = selectedItem.getId();
+                        level1Id[0] = selectedId;
+
+                        JComboBoxItem[] level2List = level2Service.getLevel2List(selectedId);
+                        comboBox1.setModel(new DefaultComboBoxModel<>(level2List));
+                        comboBox2.setModel(new DefaultComboBoxModel<>());
+                    }
+                }
+            }
+        });
+        comboBox1.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem();
+                    if (selectedItem != null) {
+                        long selectedId = selectedItem.getId();
+                        level2Id[0] = selectedId;
+
+                        JComboBoxItem[] level2NodeList = level2ListService.getNode(selectedId);
+                        comboBox2.setModel(new DefaultComboBoxModel<>(level2NodeList));
+                    }
+                }
+            }
+        });
+
+        comboBox2.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    JComboBoxItem selectedItem = (JComboBoxItem) comboBox2.getSelectedItem();
+                    if (selectedItem != null) {
+                        long selectedId = selectedItem.getId();
+                        level2NodeId[0] = selectedId;
+                    }
+                }
+            }
+        });
+
+        downloadbtn.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JComboBoxItem selectedItem0 = (JComboBoxItem) comboBox0.getSelectedItem();
+                JComboBoxItem selectedItem1 = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem selectedItem2 = (JComboBoxItem) comboBox2.getSelectedItem();
+                Long level1Id = selectedItem0 == null? null:selectedItem0.getId();
+                Long level2Id = selectedItem1 == null? null:selectedItem1.getId();
+                Long level2NodeId = selectedItem2 == null? null:selectedItem2.getId();
+                Set<JComboBoxItem> selectedItems = comboBox4.getSelectedItems();
+                StringBuilder selectedIds = new StringBuilder();
+                for (JComboBoxItem item : selectedItems) {
+                    selectedIds.append(item.getId()).append(",");
+                }
+                List<DjJdgzTrackRecord> list  = djJdgzTrackRecordService.getListByImport(level1Id,level2Id,level2NodeId,selectedIds.toString());
+                DownLoadTmpFile.buildTrack(list,tmpPath + "璺熻釜璁板綍瀵煎叆妯℃澘.xlsx", frame);
+            }
+        });
+
+        JScrollPane scrolltable = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+
+        scrolltable.setViewportView(table);
+        scrolltable.getViewport().setBackground(Color.WHITE);
+
+        JButton browseButton = new JButton("閫夋嫨鏂囦欢");
+        JButton uploadButton = new JButton("涓婁紶鏂囦欢");
+
+        frame.add(label0, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame.add(comboBox0, new GBC(1, 0, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5));
+
+        frame.add(label1, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame.add(comboBox1, new GBC(1, 1, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5));
+
+        frame.add(label2, new GBC(0, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame.add(comboBox2, new GBC(1, 2, 2, 1).setAnchor(GBC.SOUTHWEST).setFill(GBC.BOTH).setInsets(5));
+
+        frame.add(JLabel5, new GBC(0, 3, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame.add(comboBox4, new GBC(1, 3, 3, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        frame.add(downloadbtn, new GBC(0, 4, 2, 1).setFill(GBC.BOTH).setInsets(5));
+
+        frame.add(browseButton, new GBC(0, 5, 1, 1).setWeight(0, 1).setInsets(5));
+        frame.add(scrolltable, new GBC(1, 5, 3, 1).setFill(GBC.BOTH).setWeight(0, 1).setInsets(5));
+
+        frame.add(uploadButton, new GBC(0, 6, 4, 1).setWeight(1, 0));
+
+        browseButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                Boolean flag = true;
+                // 淇濆瓨褰撳墠鐨勫瑙傝缃�
+                LookAndFeel savedLookAndFeel = UIManager.getLookAndFeel();
+
+                // 璁剧疆鏂囦欢閫夋嫨鍣ㄥ瑙�
+                try {
+                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
+                } catch (Exception ex) {
+                    ex.printStackTrace();
+                }
+
+                JFileChooser fileChooser = new JFileChooser();
+
+                fileChooser.setDialogTitle("閫夋嫨鏂囦欢");
+                fileChooser.setPreferredSize(new Dimension(800, 500));
+
+
+                fileChooser.setMultiSelectionEnabled(true);
+
+                //鎭㈠澶栬锛岄伩鍏嶆敼鍙樻墍鏈夌粍浠跺瑙�
+                try {
+                    UIManager.setLookAndFeel(savedLookAndFeel);
+                } catch (UnsupportedLookAndFeelException ed) {
+                    ed.printStackTrace();
+                }
+
+                int result = fileChooser.showOpenDialog(frame);
+                if (result == JFileChooser.FILES_ONLY) {
+                    selectedFiles = fileChooser.getSelectedFile();
+
+                    Integer oldNum = model.getRowCount();
+                    String[][] data = new String[oldNum + 1][2];
+                    for (int i = 0; i < oldNum; i++) {
+                        data[i][0] = model.getValueAt(i, 0).toString();
+                    }
+
+                    String suffix = selectedFiles.getName().substring(selectedFiles.getName().lastIndexOf("."));
+                    if (suffix.equals(".xlsx") || suffix.equals(".xls")) {
+                        data[oldNum][0] = selectedFiles.getPath();
+                    } else {
+                        flag = false;
+
+                    }
+
+                    if (!flag) {
+                        JOptionPane.showMessageDialog(null, "鍙兘涓婁紶.xlsx鎴�.xls鐨勬枃浠讹紝涓斾笉瓒呰繃2G", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                        return;
+                    }
+
+                    model.setDataVector(data, columnIdentifiers);
+                    table.setModel(model);
+                    table.getColumnModel().getColumn(0).setPreferredWidth(600);
+                    table.getColumnModel().getColumn(1).setPreferredWidth(100);
+
+
+                    table.getColumnModel().getColumn(0).setCellRenderer(new TableViewRenderer());
+                    table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRendererButton());
+                    table.getColumnModel().getColumn(1).setCellEditor(new TableCellEditorButton(null, null));
+
+                } else {
+                    Object[] options = {"OK ", "CANCEL "};
+                    JOptionPane.showOptionDialog(null, "閫夋嫨鐨勬枃浠朵笉姝g‘ ", "鎻愮ず", JOptionPane.DEFAULT_OPTION,
+                            JOptionPane.WARNING_MESSAGE, null, options, options[0]);
+                }
+            }
+        });
+        uploadButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                // 鍒涘缓鏃嬭浆绛夊緟妗嗙殑瀹炰緥锛堝亣璁網aitUtil鏄竴涓嚜瀹氫箟鐨凷wing缁勪欢锛�
+                final WaitUtil waitUtil = new WaitUtil(imgPath, "鏂囦欢姝e湪瀵煎叆锛岃绋嶅��");
+
+                // 寮�濮嬩笂浼犳枃浠剁殑寮傛浠诲姟
+                SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {
+                    @Override
+                    protected String doInBackground() throws Exception {
+                        // 涓婁紶鏂囦欢鐨勯�昏緫
+                        StringBuilder result = new StringBuilder();
+
+                        // 浠庣涓�鍒楋紙绱㈠紩涓�0锛夎幏鍙栨暟鎹�
+                        String data = model.getValueAt(0, 0).toString();
+                        // 灏嗘暟鎹拰鎹㈣绗︽嫾鎺ュ埌StringBuilder涓�
+                        result.append(data);
+
+
+                        String filePath = result.toString();
+                        String flag = level3Service.importDiagramFromExcel(filePath, level1Id[0], level2Id[0], level2NodeId[0]);
+                        return flag;
+                    }
+
+                    @Override
+                    protected void done() {
+                        try {
+                            // 鑾峰彇涓婁紶缁撴灉锛堝湪杩欎釜渚嬪瓙涓紝鎴戜滑鍋囪涓婁紶鏂规硶杩斿洖Boolean绫诲瀷锛�
+                            String uploadSucceeded = get();
+
+                            // 鍒锋柊琛ㄦ牸鏁版嵁锛堝鏋滀笂浼犳垚鍔燂級
+                            if (uploadSucceeded.equals("true")) {
+                                waitUtil.dispose();
+                                frame.dispose();
+                                JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
+                                JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
+                                JComboBoxItem[] cabinList = cabinService.getList();
+                                String[] typeList = new String[]{
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
+        };
+                                List<DjJdgzNetworkLevel3> list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
+                                CommonTable.refreshTable(list, columnDto, subTable);
+                                level3ManageService.tableModelListener(list, subTable, jFrame);
+                                System.out.println("瀵煎叆鎴愬姛鏃堕棿" + new Date());
+                            } else {
+                                waitUtil.dispose();
+                                JOptionPane.showMessageDialog(null, uploadSucceeded, "鎻愮ず", JOptionPane.ERROR_MESSAGE);
+                            }
+
+                        } catch (Exception ex) {
+                            ex.printStackTrace();
+                            waitUtil.dispose();
+                        }
+                    }
+                };
+                // 鎵ц寮傛浠诲姟
+                sw.execute();
+                waitUtil.setVisible(true);
+            }
+        });
+
+        scrolltable.setTransferHandler(new TransferHandler() {
+            private static final long serialVersionUID = 1L;
+
+            @Override
+            public boolean importData(JComponent comp, Transferable t) {
+                try {
+                    Boolean flag = true;
+                    Object o = t.getTransferData(DataFlavor.javaFileListFlavor);
+                    String filepath = o.toString();
+                    if (filepath.startsWith("[")) {
+                        filepath = filepath.substring(1);
+                    }
+                    if (filepath.endsWith("]")) {
+                        filepath = filepath.substring(0, filepath.length() - 1);
+                    }
+                    String[] filepathArr = filepath.split(", ");
+                    Integer oldNum = model.getRowCount();
+                    String[][] data = new String[oldNum + filepathArr.length][2];
+                    for (int i = 0; i < oldNum; i++) {
+                        data[i][0] = model.getValueAt(i, 0).toString();
+                    }
+                    for (int i = 0; i < filepathArr.length; i++) {
+                        if (filepathArr[i].contains(".xlsx") || filepathArr[i].contains(".xls")) {
+                            data[i + oldNum][0] = filepathArr[i];
+                        } else {
+                            flag = false;
+                            break;
+                        }
+                    }
+                    if (!flag) {
+                        JOptionPane.showMessageDialog(null, "鍙兘涓婁紶.xlsx鎴�.xls鐨勬枃浠讹紝涓斾笉瓒呰繃2G\"", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                        return flag;
+                    }
+                    model.setDataVector(data, columnIdentifiers);
+                    table.setModel(model);
+                    table.getColumnModel().getColumn(0).setPreferredWidth(650);
+                    table.getColumnModel().getColumn(1).setPreferredWidth(80);
+
+                    table.getColumnModel().getColumn(0).setCellRenderer(new TableViewRenderer());
+                    table.getColumnModel().getColumn(1).setCellRenderer(new TableCellRendererButton());
+                    table.getColumnModel().getColumn(1).setCellEditor(new TableCellEditorButton(null, null));
+                    return true;
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+                return false;
+            }
+
+            @Override
+            public boolean canImport(JComponent comp, DataFlavor[] flavors) {
+                for (int i = 0; i < flavors.length; i++) {
+                    if (DataFlavor.javaFileListFlavor.equals(flavors[i])) {
+                        return true;
+                    }
+                }
+                return false;
+            }
+        });
+    }
+
+}
+
+
+
diff --git a/src/main/java/com/example/client/service/Level1ManageService.java b/src/main/java/com/example/client/service/Level1ManageService.java
index 2116af0..0406e9b 100644
--- a/src/main/java/com/example/client/service/Level1ManageService.java
+++ b/src/main/java/com/example/client/service/Level1ManageService.java
@@ -75,7 +75,7 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         final Boolean[] isFirstLoadData = {true};
@@ -87,7 +87,7 @@
                 if (!isFirstLoadData[0]) {
                     CommonTable.refreshTable(list, columnDto,table);
                     table.setRowHeight(25);
-                    table.setAutoCreateRowSorter(true);
+
                     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
                     tableModelListener(table,jFrame);
@@ -140,9 +140,9 @@
         frame1.setLayout(layout);
         JComboBoxItem[] shipList = djJdgzShipService.getListByItem();
         JComboBoxItem[] levelList = {
-                new JComboBoxItem(1, "涓�绾�"),
-                new JComboBoxItem(2, "浜岀骇"),
-                new JComboBoxItem(3, "涓夌骇"),
+                new JComboBoxItem(1L, "涓�绾�"),
+                new JComboBoxItem(1L, "浜岀骇"),
+                new JComboBoxItem(1L, "涓夌骇"),
         };
 
         JLabel JLabel1 = new JLabel("鐜勫彿");
@@ -205,12 +205,12 @@
             data.setStartDate(sdFormat.format(beginDate.getDate()));
             data.setYear((Integer) yearPicker.getValue());
             data.setAdventDay(7);
-            data.setProjectName(ship.getName()+"-"+yearPicker.getValue() + "-" + level.getName());
+            data.setProjectName(level.getName()+"淇悊"+ship.getName()+"椤圭洰");
             level1Service.insert(data);
             list = level1Service.getList(ship.getId());
             CommonTable.refreshTable(list,columnDto,table);
             table.setRowHeight(25);
-            table.setAutoCreateRowSorter(true);
+
             table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             tableModelListener(table,jFrame);
             frame1.dispose();
diff --git a/src/main/java/com/example/client/service/Level2AddOrUpdate.java b/src/main/java/com/example/client/service/Level2AddOrUpdate.java
index 4c154c0..f2e72bf 100644
--- a/src/main/java/com/example/client/service/Level2AddOrUpdate.java
+++ b/src/main/java/com/example/client/service/Level2AddOrUpdate.java
@@ -115,10 +115,10 @@
         List<TableButton> buttonList = new ArrayList<>();
         buttonList.add(new TableButton("del", "鍒犻櫎"));
 
-        columnDto.add(new ColumnDto("搴忓彿", "", 50, "autoCreate", false, null,null));
+        columnDto.add(new ColumnDto("搴忓彿", "", 50, "autoCreate", true, null,null));
         //columnDto.add(new ColumnDto("宸ョ▼涓撲笟", "majorName", 180, null, false, null,null));
-        columnDto.add(new ColumnDto("鑺傜偣鍚嶇О", "ProcessName", 160, null, false, null,null));
-        columnDto.add(new ColumnDto("瑕佹眰瀹屾垚鏃堕棿", "requiredCompletionTime", 120, null, false, null,null));
+        columnDto.add(new ColumnDto("鑺傜偣鍚嶇О", "ProcessName", 160, null, true, null,null));
+        columnDto.add(new ColumnDto("瑕佹眰瀹屾垚鏃堕棿", "requiredCompletionTime", 120, "selectDate", true, null,null));
         columnDto.add(new ColumnDto("鎿嶄綔", "", 85, "", true, buttonList,null));
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
diff --git a/src/main/java/com/example/client/service/Level2ManageService.java b/src/main/java/com/example/client/service/Level2ManageService.java
index 55261b3..1ead5b2 100644
--- a/src/main/java/com/example/client/service/Level2ManageService.java
+++ b/src/main/java/com/example/client/service/Level2ManageService.java
@@ -89,7 +89,7 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         final Boolean[] isFirstLoadData = {true};
@@ -101,7 +101,7 @@
                 if (!isFirstLoadData[0]) {
                     CommonTable.refreshTable(list, columnDto, table);
                     table.setRowHeight(25);
-                    table.setAutoCreateRowSorter(true);
+
                     table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
                     tableModelListener(table, jFrame);
@@ -207,7 +207,7 @@
             list = level2Service.getList(level1Data.getShipId());
             CommonTable.refreshTable(list, columnDto, table);
             table.setRowHeight(25);
-            table.setAutoCreateRowSorter(true);
+
             table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             tableModelListener(table, jFrame);
             frame1.dispose();
diff --git a/src/main/java/com/example/client/service/Level3ManageService.java b/src/main/java/com/example/client/service/Level3ManageService.java
index ac2ab59..35e7d8c 100644
--- a/src/main/java/com/example/client/service/Level3ManageService.java
+++ b/src/main/java/com/example/client/service/Level3ManageService.java
@@ -75,7 +75,7 @@
         JComboBoxItem[] cabinList = cabinService.getList();
         JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
         String[] typeList = new String[]{
-                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�"
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
         };
 
         JLabel JLabel0 = new JLabel("宸ョ▼");
@@ -130,20 +130,20 @@
 
         columnDto = new ArrayList<>();
         //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
-        columnDto.add(new ColumnDto("搴忓彿", "", (width - 10) / 10, "autoCreate", false, null, null));
-        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", (width - 10) / 10, null, false, null, null));
-        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", (width - 10) / 10, "dict", false, null, deptList));
-        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", (width - 10) / 10, "dict", false, null, teamList));
-        columnDto.add(new ColumnDto("鑸卞", "cabinId", (width - 10) / 10, "dict", false, null, cabinList));
-        columnDto.add(new ColumnDto("绫诲埆", "type", (width - 10) / 10, null, false, null, null));
-        columnDto.add(new ColumnDto("涓�绾х綉缁滃浘鑺傜偣鍚嶇О", "level1NodeName", (width - 10) / 10, null, false, null, null));
-        columnDto.add(new ColumnDto("浜岀骇缃戠粶鍥捐妭鐐瑰悕绉�", "level2NodeName", (width - 10) / 10, null, false, null, null));
-        columnDto.add(new ColumnDto("涓夌骇缃戠粶鍥惧悕绉�", "name", (width - 10) / 10, null, false, null, null));
-        columnDto.add(new ColumnDto("鎿嶄綔", "", (width - 10) / 10, "", true, buttonList, null));
+        columnDto.add(new ColumnDto("搴忓彿", "", 176, "autoCreate", false, null, null));
+        //columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", 150, null, false, null, null));
+        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 176, "dict", false, null, deptList));
+        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 176, "dict", false, null, teamList));
+        columnDto.add(new ColumnDto("鑸卞", "cabinId", 176, "dict", false, null, cabinList));
+        columnDto.add(new ColumnDto("绫诲埆", "type", 176, null, false, null, null));
+        columnDto.add(new ColumnDto("涓�绾х綉缁滃浘鑺傜偣鍚嶇О", "level1NodeName", 176, null, false, null, null));
+        columnDto.add(new ColumnDto("浜岀骇缃戠粶鍥捐妭鐐瑰悕绉�", "level2NodeName", 185, null, false, null, null));
+        columnDto.add(new ColumnDto("涓夌骇缃戠粶鍥惧悕绉�", "name", 176, null, false, null, null));
+        columnDto.add(new ColumnDto("鎿嶄綔", "", 190, "", true, buttonList, null));
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         comboBox.addItemListener(new ItemListener() {
@@ -159,7 +159,7 @@
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 tableModelListener(list, table, jFrame);
             }
@@ -186,7 +186,7 @@
                         list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
                         CommonTable.refreshTable(list, columnDto, table);
                         table.setRowHeight(25);
-                        table.setAutoCreateRowSorter(true);
+
                         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
                         tableModelListener(list, table, jFrame);
@@ -208,7 +208,7 @@
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 tableModelListener(list, table, jFrame);
             }
@@ -226,7 +226,7 @@
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 tableModelListener(list, table, jFrame);
             }
@@ -244,7 +244,7 @@
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 tableModelListener(list, table, jFrame);
             }
@@ -257,7 +257,7 @@
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
+
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 tableModelListener(list, table, jFrame);
             }
@@ -316,7 +316,7 @@
         JComboBoxItem[] cabinList = cabinService.getList();
         JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
         String[] typeList = new String[]{
-                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�"
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
         };
 
         JLabel JLabel1 = new JLabel("宸ョ▼");
@@ -454,7 +454,7 @@
             list = level3Service.getList(level1Data.getShipId(), deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
             CommonTable.refreshTable(list, columnDto, table);
             table.setRowHeight(25);
-            table.setAutoCreateRowSorter(true);
+
             table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
             tableModelListener(list, table, jFrame);
             frame1.dispose();
diff --git a/src/main/java/com/example/client/service/Level3View2Service.java b/src/main/java/com/example/client/service/Level3View2Service.java
new file mode 100644
index 0000000..31d2cfc
--- /dev/null
+++ b/src/main/java/com/example/client/service/Level3View2Service.java
@@ -0,0 +1,263 @@
+package com.example.client.service;
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.dto.JComboBoxItem;
+import com.example.client.model.TableButton;
+import com.example.client.utils.CommonTable;
+import com.example.client.utils.GBC;
+import com.example.client.utils.MultiSelectComboBox;
+import com.example.server.cabin.service.CabinService;
+import com.example.server.progressTrack.Dto.TableNodeDto;
+import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
+import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
+import com.example.server.progressTrack.model.DjJdgzShip;
+import com.example.server.progressTrack.service.*;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import javax.swing.event.TableModelEvent;
+import javax.swing.table.DefaultTableModel;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.List;
+import java.util.*;
+
+
+@Service
+public class Level3View2Service {
+    @Autowired
+    private DjJdgzNetworkLevel3Service level3Service;
+    @Autowired
+    private DjJdgzShipService djJdgzShipService;
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+    @Autowired
+    private CabinService cabinService;
+
+    private JTable table;
+    private List<TableNodeDto> list;
+    private Map<String, Long> shipMap = new HashMap<>();
+    private List<ColumnDto> columnDto;
+
+
+    public JPanel createTable(Integer width, Integer height) {
+        JPanel panel = new JPanel();
+
+        JPanel topJpanel = new JPanel();
+        GridBagLayout layout = new GridBagLayout();
+        topJpanel.setLayout(layout);
+        topJpanel.setPreferredSize(new Dimension(width, 100));
+        topJpanel.setBackground(Color.WHITE);
+
+        JPanel centerJpanel = new JPanel();
+        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setBackground(Color.WHITE);
+        panel.add(topJpanel, BorderLayout.NORTH);
+        panel.add(centerJpanel, BorderLayout.CENTER);
+
+        List<DjJdgzShip> shipList = djJdgzShipService.getList();
+        JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
+        JComboBoxItem[] cabinList = cabinService.getList();
+        JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
+        String[] typeList = new String[]{
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
+        };
+
+        JLabel JLabel0 = new JLabel("宸ョ▼");
+        JComboBox comboBox = new JComboBox();
+        comboBox.setPreferredSize(new Dimension(185, 28));
+
+        JLabel JLabel1 = new JLabel("閮ㄩ棬");
+        JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>(deptList);
+        comboBox1.setPreferredSize(new Dimension(185, 28));
+
+        JComboBoxItem[] teamList1 = sysTeamGroupClassService.getTeamList(deptList[0].getId());
+
+        JLabel JLabel2 = new JLabel("涓撲笟");
+        JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(teamList1);
+        comboBox2.setPreferredSize(new Dimension(185, 28));
+
+        JLabel JLabel3 = new JLabel("鑸卞");
+        JComboBox<JComboBoxItem> comboBox3 = new JComboBox<>(cabinList);
+        comboBox3.setPreferredSize(new Dimension(185, 28));
+
+        JLabel JLabel4 = new JLabel("绫诲埆");
+        JComboBox<String> comboBox4 = new JComboBox<>(typeList);
+        comboBox4.setPreferredSize(new Dimension(185, 28));
+
+        JTextField sb = new JTextField(16);
+        JButton query = new JButton("鏌ヨ");
+
+        topJpanel.add(JLabel0, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox, new GBC(1, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        topJpanel.add(JLabel1, new GBC(2, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox1, new GBC(3, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        topJpanel.add(JLabel2, new GBC(4, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox2, new GBC(5, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        topJpanel.add(JLabel3, new GBC(6, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox3, new GBC(7, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        topJpanel.add(JLabel4, new GBC(8, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox4, new GBC(9, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        topJpanel.add(sb, new GBC(0, 1, 2, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(query, new GBC(2, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        list = level3Service.getNodeList(shipList.get(0).getId(), deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
+
+        columnDto = new ArrayList<>();
+        //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
+        columnDto.add(new ColumnDto("搴忓彿", "", 227, "autoCreate", false, null, null));
+        //columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", 150, null, false, null, null));
+        columnDto.add(new ColumnDto("璁惧鍚嶇О", "name", 227, null, true, null, null));
+        columnDto.add(new ColumnDto("璁惧鎷嗗嵏鍑鸿埍", "time1Color", 227, "Circle", true, null, null));
+        columnDto.add(new ColumnDto("璁惧鍒嗕氦", "time2Color", 227, "Circle", true, null, null));
+        columnDto.add(new ColumnDto("鎷嗘閴村畾", "time3Color", 227, "Circle", true, null, null));
+        columnDto.add(new ColumnDto("璁惧杩斿巶", "time4Color", 227, "Circle", true, null, null));
+        columnDto.add(new ColumnDto("鍥炶", "time5Color", 227, "Circle", true, null, null));
+
+        table = CommonTable.createCommonTable(list, columnDto);
+        table.setRowHeight(25);
+
+        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+        comboBox.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                String content = comboBox.getSelectedItem().toString();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+
+                Long shipId = shipMap.get(content);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+            }
+        });
+        comboBox1.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem();
+                    if (selectedItem.getId() != null) {
+                        long selectedId = selectedItem.getId();
+
+                        JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(selectedId);
+                        comboBox2.setModel(new DefaultComboBoxModel<>(teamList));
+                        comboBox2.setSelectedIndex(0);
+
+                        String content = comboBox.getSelectedItem().toString();
+                        JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                        JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                        JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                        String type = comboBox4.getSelectedItem().toString();
+
+                        Long shipId = shipMap.get(content);
+                        list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                        CommonTable.refreshTable(list, columnDto, table);
+                        table.setRowHeight(25);
+
+                        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+
+                    }
+                }
+            }
+        });
+
+        comboBox2.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                String content = comboBox.getSelectedItem().toString();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+
+                Long shipId = shipMap.get(content);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+            }
+        });
+        comboBox3.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                String content = comboBox.getSelectedItem().toString();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+
+                Long shipId = shipMap.get(content);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+            }
+        });
+        comboBox4.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                String content = comboBox.getSelectedItem().toString();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+
+                Long shipId = shipMap.get(content);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+            }
+        });
+
+        query.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                list = level3Service.getNodeList(null, null, null, null, null,sb.getText());
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+            }
+        });
+
+        for (int i = 0; i < shipList.size(); i++) {
+            shipMap.put(shipList.get(i).getShipNo(), shipList.get(i).getId());
+            comboBox.addItem(shipList.get(i).getShipNo());
+        }
+        comboBox.setSelectedItem(shipList.get(0).getShipNo());
+
+
+        JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+        scrollPane.setViewportView(table);
+        scrollPane.getViewport().setBackground(Color.WHITE);
+        scrollPane.setPreferredSize(new Dimension(width - 20, height - 120));
+        centerJpanel.add(scrollPane);
+
+        return panel;
+    }
+
+
+}
+
+
+
+
diff --git a/src/main/java/com/example/client/service/MenuService.java b/src/main/java/com/example/client/service/MenuService.java
index 1d1560a..85417d0 100644
--- a/src/main/java/com/example/client/service/MenuService.java
+++ b/src/main/java/com/example/client/service/MenuService.java
@@ -30,11 +30,15 @@
     @Autowired
     private Level3ViewService level3ViewService;
     @Autowired
+    private Level3View2Service level3View2Service;
+    @Autowired
     private TrackRecordManageService trackRecordManageService;
     @Autowired
     private HandoverService handoverService;
     @Autowired
-    private DataSyncManageService dataSyncManageService;
+    private DataImportManageService dataImportManageService;
+    @Autowired
+    private DataExportManageService dataExportManageService;
     @Autowired
     private UserManageService userManageService;
     @Autowired
@@ -43,6 +47,8 @@
     private  SubunitService subunitService;
     @Autowired
     private  TeamGroupManageService teamGroupManageService;
+    @Autowired
+    private  ConfigManageService configManageService;
 
     @Autowired
     private Main main;
@@ -99,7 +105,7 @@
                         JPanel level3Manage = level3ManageService.createTable(width, height, frame);
                         main.showTab("涓夌骇缃戠粶鍥剧鐞�", level3Manage, tree);
                     } else if (nodeName.equals("涓夌骇缃戠粶鍥炬煡鐪�")) {
-                        JPanel level3View = level3ViewService.createTable(width, height);
+                        JPanel level3View = level3View2Service.createTable(width, height);
                         main.showTab("涓夌骇缃戠粶鍥炬煡鐪�", level3View, tree);
                     } else if (nodeName.equals("椤圭洰杩涘害琛�")) {
                         JPanel trackRecord = trackRecordManageService.createTable(width, height, frame);
@@ -107,10 +113,13 @@
                     } else if (nodeName.equals("浜ゆ帴鎯呭喌")) {
                         JPanel handover = handoverService.createTable(width, height, frame);
                         main.showTab("浜ゆ帴鎯呭喌", handover, tree);
-                    } else if (nodeName.equals("鏁版嵁鍚屾")) {
-                        JPanel dataSync = dataSyncManageService.createTable(width, height, frame);
-                        main.showTab("鏁版嵁鍚屾", dataSync, tree);
-                    } else if (nodeName.equals("鐢ㄦ埛绠$悊")) {
+                    } else if (nodeName.equals("鏁版嵁瀵煎叆")) {
+                        JPanel dataImport = dataImportManageService.createTable(width, height, frame);
+                        main.showTab("鏁版嵁瀵煎叆", dataImport, tree);
+                    } else if (nodeName.equals("鏁版嵁瀵煎嚭")) {
+                        JPanel dataExport = dataExportManageService.createTable(width, height, frame);
+                        main.showTab("鏁版嵁瀵煎嚭", dataExport, tree);
+                    }else if (nodeName.equals("鐢ㄦ埛绠$悊")) {
                         JPanel user = userManageService.createTable(width, height, frame);
                         main.showTab("鐢ㄦ埛绠$悊", user, tree);
                     } else if (nodeName.equals("鎷嗗嵏杩涘害琛�")) {
@@ -121,7 +130,10 @@
                         main.showTab("瀛愰儴浠堕厤缃�", subunit, tree);
                     }else if (nodeName.equals("涓撲笟绠$悊")) {
                         JPanel teamGroup = teamGroupManageService.createTable(width, height, frame);
-                        main.showTab("瀛愰儴浠堕厤缃�", teamGroup, tree);
+                        main.showTab("涓撲笟绠$悊", teamGroup, tree);
+                    }else if (nodeName.equals("骞冲彴閰嶇疆")) {
+                        JPanel config = configManageService.createTable(width, height, frame);
+                        main.showTab("骞冲彴閰嶇疆", config, tree);
                     }
                 }
             }
diff --git a/src/main/java/com/example/client/service/ProgressPromptService.java b/src/main/java/com/example/client/service/ProgressPromptService.java
index 25b3343..95c764e 100644
--- a/src/main/java/com/example/client/service/ProgressPromptService.java
+++ b/src/main/java/com/example/client/service/ProgressPromptService.java
@@ -42,7 +42,7 @@
 
         //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
         columnDto.add(new ColumnDto("宸ョ▼鍚嶇О", "ProjectName", 280, null, false, null,null));
-        columnDto.add(new ColumnDto("鐝粍涓撲笟", "teamGroupName", 150, null, false, null,null));
+        columnDto.add(new ColumnDto("鐝粍涓撲笟", "teamgroupName", 150, null, false, null,null));
         columnDto.add(new ColumnDto("涓�绾ц妭鐐�", "level1NodeName", 150, null, false, null,null));
         columnDto.add(new ColumnDto("浜岀骇鑺傜偣", "level2NodeName", 150, null, false, null,null));
         columnDto.add(new ColumnDto("椤圭洰鍚嶇О", "level3NetworkName", 150, null, false, null,null));
@@ -52,7 +52,7 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         JScrollPane scrollTable = new JScrollPane(table);
         frame1.add(scrollTable);
diff --git a/src/main/java/com/example/client/service/StatisDismant2Service.java b/src/main/java/com/example/client/service/StatisDismant2Service.java
new file mode 100644
index 0000000..a0dd774
--- /dev/null
+++ b/src/main/java/com/example/client/service/StatisDismant2Service.java
@@ -0,0 +1,249 @@
+package com.example.client.service;
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.dto.JComboBoxItem;
+import com.example.client.utils.CommonTable;
+import com.example.client.utils.ComplexHeaderUI;
+import com.example.client.utils.ComplexTable;
+import com.example.client.utils.ComplexTableUI;
+import com.example.server.progressTrack.Dto.StatistDismantDto;
+import com.example.server.progressTrack.model.DjJdgzShip;
+import com.example.server.progressTrack.service.DjJdgzDismantTrackService;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableModel;
+import javax.swing.table.TableModel;
+import java.awt.*;
+import java.awt.event.ItemEvent;
+import java.awt.event.ItemListener;
+import java.awt.event.WindowAdapter;
+import java.awt.event.WindowEvent;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Vector;
+
+
+@Service
+public class StatisDismant2Service {
+    @Autowired
+    private DjJdgzDismantTrackService djJdgzDismantTrackService;
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+
+    public void createTable(JFrame jFrame, Long level1Id) {
+        JFrame frame1 = new JFrame("鎷嗗嵏杩涘害缁熻璇︽儏琛�");
+        frame1.setSize(1500, 800);
+        frame1.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        frame1.setLocationRelativeTo(null);
+        frame1.setVisible(true);
+        frame1.addWindowListener(new WindowAdapter() {
+            //娣诲姞绗簩涓晫闈㈢殑鍏抽棴浜嬩欢:
+            public void windowClosing(WindowEvent e) {
+                //娣诲姞浜嬩欢:
+                jFrame.setEnabled(true);//灏嗕富鐣岄潰鍐嶈缃负鍙搷浣滅殑
+            }
+        });
+
+
+        JPanel topJpanel = new JPanel();
+        topJpanel.setPreferredSize(new Dimension(1500, 40));
+        topJpanel.setBackground(Color.WHITE);
+
+        JPanel centerJpanel = new JPanel();
+        centerJpanel.setPreferredSize(new Dimension(1500 - 20, 800 - 40));
+        centerJpanel.setBackground(Color.WHITE);
+
+
+        JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
+
+
+        JLabel JLabel1 = new JLabel("閮ㄩ棬");
+        JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>(deptList);
+        comboBox1.setPreferredSize(new Dimension(185, 28));
+        comboBox1.setSelectedIndex(1);
+
+        JComboBoxItem[] teamList1 = sysTeamGroupClassService.getTeamList(deptList[1].getId());
+
+        JLabel JLabel2 = new JLabel("涓撲笟");
+        JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(teamList1);
+        comboBox2.setPreferredSize(new Dimension(185, 28));
+
+        topJpanel.add(JLabel1);
+        topJpanel.add(comboBox1);
+        topJpanel.add(JLabel2);
+        topJpanel.add(comboBox2);
+
+        final List<StatistDismantDto>[] list = new List[]{djJdgzDismantTrackService.getStatist2(level1Id, deptList[1].getId())};
+
+        Object[][] headerRows = new Object[2][9];
+        headerRows[0] = new Object[]{"鑸卞", "鎬绘暟", ComplexTable.mergeCellX, "鎷嗗嵏杩涘害瀹屾垚", ComplexTable.mergeCellX, "瀛愰儴浠�", ComplexTable.mergeCellX, ComplexTable.mergeCellX, ComplexTable.mergeCellX,};
+        //姝ゅ2-5鏄笉浼氭樉绀哄嚭鏉ョ殑锛屽洜涓�1-4鍚戜笅鍚堝苟浜嗕竴琛� + 鍚戝彸鍚堝苟浜嗕竴鍒�  锛� 鑰�2-5琚繖涓煩褰㈣寖鍥村寘鎷簡
+        headerRows[1] = new Object[]{ComplexTable.mergeCellY, "璁惧", "瀛愰儴浠�", "璁惧", "瀛愰儴浠�", "宸叉媶鍗�", "宸插嚭鑸�", "宸查��閲�", "宸插叆搴�"};
+
+        String[][] body = new String[list[0].size()][9];
+
+        for (int i = 0; i < list[0].size(); i++) {
+            StatistDismantDto data = list[0].get(i);
+            body[i][0] = data.getName();
+            body[i][1] = String.valueOf(data.getSbsl());
+            body[i][2] = String.valueOf(data.getZbjsl());
+            body[i][3] = String.valueOf(data.getSbcxsl());
+            body[i][4] = String.valueOf(data.getZbjcxsl());
+            body[i][5] = String.valueOf(data.getDismantsl());
+            body[i][6] = String.valueOf(data.getExitsl());
+            body[i][7] = String.valueOf(data.getReturnsl());
+            body[i][8] = String.valueOf(data.getWarehousesl());
+        }
+
+        JTable jTable = new ComplexTable(headerRows, body, 160);
+        JScrollPane scrollTable = new JScrollPane(jTable);
+        scrollTable.setPreferredSize(new Dimension(1500 - 20, 800 - 40));
+        centerJpanel.add(scrollTable);
+        frame1.add(topJpanel, BorderLayout.NORTH);
+        frame1.add(centerJpanel, BorderLayout.CENTER);
+        comboBox1.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem();
+                    if (selectedItem != null && selectedItem.getId() != null) {
+                        long selectedId = selectedItem.getId();
+
+                        JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(selectedId);
+                        comboBox2.setModel(new DefaultComboBoxModel<>(teamList));
+                        comboBox2.setSelectedIndex(0);
+
+                        JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                        JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                        Long id = null;
+                        if (team.getId() != null) {
+                            id = team.getId();
+                        } else {
+                            id = dept.getId();
+                        }
+                        list[0] = djJdgzDismantTrackService.getStatist2(level1Id, id);
+
+                        Object[][] headerRows = new Object[2][9];
+                        headerRows[0] = new Object[]{"閮ㄩ棬/涓撲笟", "鎬绘暟", ComplexTable.mergeCellX, "鎷嗗嵏杩涘害瀹屾垚", ComplexTable.mergeCellX, "瀛愰儴浠�", ComplexTable.mergeCellX, ComplexTable.mergeCellX, ComplexTable.mergeCellX,};
+                        //姝ゅ2-5鏄笉浼氭樉绀哄嚭鏉ョ殑锛屽洜涓�1-4鍚戜笅鍚堝苟浜嗕竴琛� + 鍚戝彸鍚堝苟浜嗕竴鍒�  锛� 鑰�2-5琚繖涓煩褰㈣寖鍥村寘鎷簡
+                        headerRows[1] = new Object[]{ComplexTable.mergeCellY, "璁惧", "瀛愰儴浠�", "璁惧", "瀛愰儴浠�", "宸叉媶鍗�", "宸插嚭鑸�", "宸查��閲�", "宸插叆搴�"};
+
+                        String[][] body = new String[list[0].size()][9];
+
+                        for (int i = 0; i < list[0].size(); i++) {
+                            StatistDismantDto data = list[0].get(i);
+                            body[i][0] = data.getName();
+                            body[i][1] = String.valueOf(data.getSbsl());
+                            body[i][2] = String.valueOf(data.getZbjsl());
+                            body[i][3] = String.valueOf(data.getSbcxsl());
+                            body[i][4] = String.valueOf(data.getZbjcxsl());
+                            body[i][5] = String.valueOf(data.getDismantsl());
+                            body[i][6] = String.valueOf(data.getExitsl());
+                            body[i][7] = String.valueOf(data.getReturnsl());
+                            body[i][8] = String.valueOf(data.getWarehousesl());
+                        }
+                        Vector<Vector<Object>> dataVector = new Vector<>();
+                        for (Object[] row : body) {
+                            dataVector.add(new Vector<>(Arrays.asList(row)));
+                        }
+
+                        Vector<Object> columnIdentifiers = new Vector<>(Arrays.asList(headerRows[1]));
+
+                        DefaultTableModel model = (DefaultTableModel) jTable.getModel();
+                        model.setDataVector(dataVector, columnIdentifiers);
+
+                        // 璁剧疆鍒楀
+                        for (int i = 0; i < headerRows[1].length; i++) {
+                            jTable.getColumnModel().getColumn(i).setPreferredWidth(160);
+                        }
+
+                        // 璁剧疆琛ㄥごUI
+                        jTable.getTableHeader().setUI(new ComplexHeaderUI(headerRows, jTable));
+
+                        // 璁剧疆琛ㄦ牸UI
+                        jTable.setUI(new ComplexTableUI(body, jTable));
+
+                        // 閲嶆柊娓叉煋琛ㄦ牸
+                        jTable.repaint();
+                    }
+                }
+            }
+        });
+        comboBox2.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+
+                    JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                    JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                    Long id = null;
+                    if (team.getId() != null) {
+                        id = team.getId();
+                    } else {
+                        id = dept.getId();
+                    }
+                    list[0] = djJdgzDismantTrackService.getStatist2(level1Id, id);
+
+                    Object[][] headerRows = new Object[2][9];
+                    headerRows[0] = new Object[]{"閮ㄩ棬/涓撲笟", "鎬绘暟", ComplexTable.mergeCellX, "鎷嗗嵏杩涘害瀹屾垚", ComplexTable.mergeCellX, "瀛愰儴浠�", ComplexTable.mergeCellX, ComplexTable.mergeCellX, ComplexTable.mergeCellX,};
+                    //姝ゅ2-5鏄笉浼氭樉绀哄嚭鏉ョ殑锛屽洜涓�1-4鍚戜笅鍚堝苟浜嗕竴琛� + 鍚戝彸鍚堝苟浜嗕竴鍒�  锛� 鑰�2-5琚繖涓煩褰㈣寖鍥村寘鎷簡
+                    headerRows[1] = new Object[]{ComplexTable.mergeCellY, "璁惧", "瀛愰儴浠�", "璁惧", "瀛愰儴浠�", "宸叉媶鍗�", "宸插嚭鑸�", "宸查��閲�", "宸插叆搴�"};
+
+                    String[][] body = new String[list[0].size()][9];
+
+                    for (int i = 0; i < list[0].size(); i++) {
+                        StatistDismantDto data = list[0].get(i);
+                        body[i][0] = data.getName();
+                        body[i][1] = String.valueOf(data.getSbsl());
+                        body[i][2] = String.valueOf(data.getZbjsl());
+                        body[i][3] = String.valueOf(data.getSbcxsl());
+                        body[i][4] = String.valueOf(data.getZbjcxsl());
+                        body[i][5] = String.valueOf(data.getDismantsl());
+                        body[i][6] = String.valueOf(data.getExitsl());
+                        body[i][7] = String.valueOf(data.getReturnsl());
+                        body[i][8] = String.valueOf(data.getWarehousesl());
+                    }
+                    Vector<Vector<Object>> dataVector = new Vector<>();
+                    for (Object[] row : body) {
+                        dataVector.add(new Vector<>(Arrays.asList(row)));
+                    }
+
+                    Vector<Object> columnIdentifiers = new Vector<>(Arrays.asList(headerRows[1]));
+
+                    DefaultTableModel model = (DefaultTableModel) jTable.getModel();
+                    model.setDataVector(dataVector, columnIdentifiers);
+
+                    // 璁剧疆鍒楀
+                    for (int i = 0; i < headerRows[1].length; i++) {
+                        jTable.getColumnModel().getColumn(i).setPreferredWidth(160);
+                    }
+
+                    // 璁剧疆鍒楀
+                    for (int i = 0; i < headerRows[1].length; i++) {
+                        jTable.getColumnModel().getColumn(i).setPreferredWidth(160);
+                    }
+
+                    // 璁剧疆琛ㄥごUI
+                    jTable.getTableHeader().setUI(new ComplexHeaderUI(headerRows, jTable));
+
+                    // 璁剧疆琛ㄦ牸UI
+                    jTable.setUI(new ComplexTableUI(body, jTable));
+
+                    // 閲嶆柊娓叉煋琛ㄦ牸
+                    jTable.repaint();
+                }
+            }
+        });
+
+        frame1.setVisible(true);
+    }
+
+}
+
+
+
+
diff --git a/src/main/java/com/example/client/service/StatisDismantService.java b/src/main/java/com/example/client/service/StatisDismantService.java
index 8b4b196..d11da34 100644
--- a/src/main/java/com/example/client/service/StatisDismantService.java
+++ b/src/main/java/com/example/client/service/StatisDismantService.java
@@ -22,9 +22,8 @@
     private DjJdgzDismantTrackService djJdgzDismantTrackService;
 
     public void createTable(JFrame jFrame,Long level1Id) {
-        JFrame frame1 = new JFrame("缁熻鎶ヨ〃");
-        frame1.setSize(1200, 700);
-        frame1.setResizable(false);
+        JFrame frame1 = new JFrame("鎷嗗嵏杩涘害缁熻鎬昏〃");
+        frame1.setSize(1500, 800);
         frame1.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
         frame1.setLocationRelativeTo(null);
         frame1.setVisible(true);
@@ -53,7 +52,7 @@
 
 
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         JScrollPane scrollTable = new JScrollPane(table);*/
         //frame1.add(scrollTable);
@@ -80,7 +79,7 @@
             body[i][8] = String.valueOf(data.getWarehousesl());
         }
 
-        JScrollPane scrollTable = new JScrollPane(new ComplexTable(headerRows , body,130));
+        JScrollPane scrollTable = new JScrollPane(new ComplexTable(headerRows , body,160));
         frame1.add(scrollTable);
         frame1.setVisible(true);
     }
diff --git a/src/main/java/com/example/client/service/StatisReportsService.java b/src/main/java/com/example/client/service/StatisReportsService.java
index f09c93e..80206a9 100644
--- a/src/main/java/com/example/client/service/StatisReportsService.java
+++ b/src/main/java/com/example/client/service/StatisReportsService.java
@@ -63,7 +63,7 @@
 
 
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
+
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         JScrollPane scrollTable = new JScrollPane(table);*/
         //frame1.add(scrollTable);
diff --git a/src/main/java/com/example/client/service/SubunitAddOrUpdate.java b/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
index 88e566d..81dc730 100644
--- a/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
@@ -9,6 +9,7 @@
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.model.DjJdgzDismantTrack;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
+import com.example.server.progressTrack.model.DjJdgzTrackRecord;
 import com.example.server.progressTrack.service.DjJdgzDismantTrackService;
 import com.example.server.progressTrack.service.DjJdgzNetworkLevel3Service;
 import com.example.server.teamGroup.service.SysTeamGroupClassService;
@@ -41,8 +42,10 @@
     private CabinService cabinService;
     private List<ColumnDto> columnDto;
     private JTable trackTable;
+    private DjJdgzNetworkLevel3 nowLevel3;
 
     public JPanel createTrack(Integer width, Integer height, DjJdgzNetworkLevel3 djJdgzNetworkLevel3,JFrame frame) {
+        nowLevel3 = djJdgzNetworkLevel3;
         JPanel panel = new JPanel();
         panel.setPreferredSize(new Dimension(width, height));
         JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
@@ -59,7 +62,7 @@
         topJpanel.add(btnInsert);
 
         JComboBoxItem[] cabinList = cabinService.getList();
-        List<DjJdgzDismantTrack> list = djJdgzDismantTrackService.getList(djJdgzNetworkLevel3.getId(), null);
+        List<DjJdgzDismantTrack> list = djJdgzDismantTrackService.getList(nowLevel3.getId(), null);
         List<TableButton> buttonList = new ArrayList<>();
         buttonList.add(new TableButton("edit", "缂栬緫"));
         buttonList.add(new TableButton("del", "鍒犻櫎"));
@@ -76,7 +79,7 @@
         trackTable = CommonTable.createCommonTable(list, columnDto);
         trackTable.setPreferredSize(new Dimension(width , height));
         trackTable.setRowHeight(25);
-        trackTable.setAutoCreateRowSorter(true);
+
         trackTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         tableModelListener(trackTable, frame,list,columnDto);
@@ -85,15 +88,13 @@
             @Override
             public void actionPerformed(ActionEvent e) {
                 SysUser user = (SysUser) CacheUtils.get("user", "user");
-                if (user.getTeamgroup()==null||user.getTeamgroup().equals(djJdgzNetworkLevel3.getTeamgroupId())) {
+                if (user.getTeamgroup()==null||user.getTeamgroup().equals(nowLevel3.getTeamgroupId().toString())) {
                     DjJdgzDismantTrack djJdgzDismantTrack = new DjJdgzDismantTrack();
-                    djJdgzDismantTrack.setLevel3NetworkId(djJdgzNetworkLevel3.getId());
+                    djJdgzDismantTrack.setLevel3NetworkId(nowLevel3.getId());
                     insert(frame,djJdgzDismantTrack);
                 }else{
-                    JOptionPane.showMessageDialog(null, "涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                    JOptionPane.showMessageDialog(null, "褰撳墠鐢ㄦ埛涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                 }
-
-
             }
         });
 
@@ -164,15 +165,17 @@
             list.add(data);
             djJdgzDismantTrackService.save(list);
 
+            this.refreshTable(data.getLevel3NetworkId(),null);
             frame1.dispose();
             jFrame.setEnabled(true);//灏嗕富鐣岄潰鍐嶈缃负鍙搷浣滅殑
         });
     }
     public void refreshTable(Long level3Id,JFrame jFrame){
+        nowLevel3 = level3Service.get(level3Id);
         List<DjJdgzDismantTrack> list = djJdgzDismantTrackService.getList(level3Id, null);
         CommonTable.refreshTable(list, columnDto, trackTable);
         trackTable.setRowHeight(25);
-        trackTable.setAutoCreateRowSorter(true);
+
         trackTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
         tableModelListener(trackTable, jFrame,list,columnDto);
     }
@@ -197,7 +200,7 @@
                     if (n == 0) {
                         DefaultTableModel model = (DefaultTableModel) table.getModel();
                         DjJdgzDismantTrack data = list.get(row);
-                        djJdgzDismantTrackService.deleteLogic(data.getId());
+                        djJdgzDismantTrackService.delete(data.getId());
                         list.remove(row);
                         model.removeRow(row);
                     }
diff --git a/src/main/java/com/example/client/service/SubunitService.java b/src/main/java/com/example/client/service/SubunitService.java
index d77b425..b94a8f1 100644
--- a/src/main/java/com/example/client/service/SubunitService.java
+++ b/src/main/java/com/example/client/service/SubunitService.java
@@ -60,7 +60,7 @@
         JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
         JComboBoxItem[] cabinList = cabinService.getList();
         String[] typeList = new String[]{
-                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�"
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
         };
         List<DjJdgzShip> shipList = djJdgzShipService.getList();
         Map<String, Long> shipMap = new HashMap<>();
@@ -117,11 +117,11 @@
         list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
 
         columnDto.add(new ColumnDto("搴忓彿", "", 60, "autoCreate", false, null, null));
-        columnDto.add(new ColumnDto("璁惧鍚嶇О", "name", 180, null, false, null, null));
-        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 180, "dict", false, null, deptList));
-        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 180, "dict", false, null, teamList));
-        columnDto.add(new ColumnDto("鑸卞", "cabinId", 180, "dict", false, null, cabinList));
-        columnDto.add(new ColumnDto("绫诲埆", "type", 180, null, false, null, null));
+        columnDto.add(new ColumnDto("璁惧鍚嶇О", "name", 152, null, false, null, null));
+        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 152, "dict", false, null, deptList));
+        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 152, "dict", false, null, teamList));
+        columnDto.add(new ColumnDto("鑸卞", "cabinId", 150, "dict", false, null, cabinList));
+        columnDto.add(new ColumnDto("绫诲埆", "type", 150, null, false, null, null));
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
         subTable.setRowHeight(25);
@@ -140,7 +140,6 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -179,7 +178,7 @@
 
                         CommonTable.refreshTable(list, columnDto, subTable);
                         subTable.setRowHeight(25);
-                        subTable.setAutoCreateRowSorter(true);
+
                         subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                         subTable.addMouseListener(new MouseAdapter() {
                             public void mouseClicked(MouseEvent e) {
@@ -209,7 +208,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -237,7 +236,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -265,7 +264,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
@@ -288,7 +287,7 @@
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
-                subTable.setAutoCreateRowSorter(true);
+
                 subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
                 subTable.addMouseListener(new MouseAdapter() {
                     public void mouseClicked(MouseEvent e) {
diff --git a/src/main/java/com/example/client/service/TeamGroupAddOrUpdate.java b/src/main/java/com/example/client/service/TeamGroupAddOrUpdate.java
new file mode 100644
index 0000000..6783411
--- /dev/null
+++ b/src/main/java/com/example/client/service/TeamGroupAddOrUpdate.java
@@ -0,0 +1,137 @@
+package com.example.client.service;
+
+import com.example.client.dto.ColumnDto;
+import com.example.client.dto.JComboBoxItem;
+import com.example.client.utils.BoxIteUtils;
+import com.example.client.utils.CommonTable;
+import com.example.client.utils.GBC;
+import com.example.server.boatFleet.service.BoatFleetService;
+import com.example.server.teamGroup.model.SysTeamGroupClass;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
+import com.example.server.user.model.SysUser;
+import com.example.server.user.service.UserService;
+import org.apache.commons.lang3.StringUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import javax.swing.*;
+import java.awt.*;
+import java.awt.event.*;
+import java.util.List;
+
+@Service
+public class TeamGroupAddOrUpdate {
+
+    @Autowired
+    private TeamGroupManageService teamGroupManageService;
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+
+
+    public void openDialog(SysTeamGroupClass data, JFrame jFrame, List<ColumnDto> columnDto, JTable table) {
+        JFrame frame1 = new JFrame("涓撲笟鎿嶄綔");
+        frame1.setSize(800, 600);
+        frame1.setResizable(false);
+        frame1.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
+        frame1.setLocationRelativeTo(null);
+        frame1.setVisible(true);
+        frame1.addWindowListener(new WindowAdapter() {
+            //娣诲姞绗簩涓晫闈㈢殑鍏抽棴浜嬩欢:
+            public void windowClosing(WindowEvent e) {
+                //娣诲姞浜嬩欢:
+                jFrame.setEnabled(true);//灏嗕富鐣岄潰鍐嶈缃负鍙搷浣滅殑
+            }
+        });
+        GridBagLayout layout = new GridBagLayout();
+        frame1.setLayout(layout);
+
+        JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
+        String[] typeList = new String[]{
+                "閮ㄩ棬", "涓撲笟"
+        };
+
+        JLabel JLabel0 = new JLabel("绫诲瀷");
+        JComboBox<String> comboBox1 = new JComboBox<>(typeList);
+        comboBox1.setPreferredSize(new Dimension(185,28));
+        if (StringUtils.isNotBlank(data.getType())) {
+            comboBox1.setSelectedItem(data.getType());
+        }
+
+        JLabel JLabel1 = new JLabel("閮ㄩ棬/涓撲笟鍚嶇О");
+        JTextField name = new JTextField(16);
+        if (StringUtils.isNotBlank(data.getName())) {
+            name.setText(data.getName());
+        }
+
+        JLabel JLabel4 = new JLabel("鎵�灞為儴闂�");
+        JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(deptList);
+        comboBox2.setPreferredSize(new Dimension(185,28));
+        if (data.getPid() != null) {
+            if (data.getPid()!=0){
+                comboBox2.setSelectedItem(BoxIteUtils.GetSelectItemById(deptList, data.getPid()));
+            }else {
+                comboBox2.setEditable(false);
+            }
+        }
+
+        comboBox1.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent e) {
+                if (e.getStateChange() == ItemEvent.SELECTED) {
+                    String type = comboBox1.getSelectedItem().toString();
+                    if (type.equals("閮ㄩ棬")) {
+                        comboBox2.setEditable(false);
+                        comboBox2.setSelectedIndex(-1);
+                        data.setPid(0L);
+                    }
+                }
+            }
+        });
+
+
+        JButton saveButton = new JButton("纭畾");
+
+        frame1.add(JLabel0, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(comboBox1, new GBC(1, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        frame1.add(JLabel1, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(name, new GBC(1, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        frame1.add(JLabel4, new GBC(0, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(comboBox2, new GBC(1, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        frame1.add(saveButton, new GBC(0, 3, 2, 1).setWeight(0, 0));
+
+        saveButton.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                String type = comboBox1.getSelectedItem().toString();
+                JComboBoxItem dept = (JComboBoxItem) comboBox2.getSelectedItem();
+                Integer sortMax = 0;
+                if (type.equals("閮ㄩ棬")) {
+                    data.setPid(0L);
+                    sortMax = sysTeamGroupClassService.getSortMax(0L);
+                    data.setSort(sortMax + 100);
+                } else {
+                    data.setPid(dept.getId());
+                    sortMax = sysTeamGroupClassService.getSortMax(dept.getId());
+                    data.setSort(sortMax + 1);
+                }
+
+                data.setArea("hld");
+                data.setName(name.getText());
+                //data.setBoatfleet(String.valueOf(boat.getId()));
+
+                sysTeamGroupClassService.save(data);
+
+                List<SysTeamGroupClass> list = sysTeamGroupClassService.getListByTree();;
+                CommonTable.refreshTable(list, columnDto, table);
+                teamGroupManageService.tableModelListener(table, jFrame, list);
+                frame1.dispose();
+                jFrame.setEnabled(true);//灏嗕富鐣岄潰鍐嶈缃负鍙搷浣滅殑
+            }
+        });
+
+    }
+}
+
diff --git a/src/main/java/com/example/client/service/TeamGroupManageService.java b/src/main/java/com/example/client/service/TeamGroupManageService.java
index 4b5ed0d..3f7236e 100644
--- a/src/main/java/com/example/client/service/TeamGroupManageService.java
+++ b/src/main/java/com/example/client/service/TeamGroupManageService.java
@@ -26,6 +26,8 @@
 public class TeamGroupManageService {
     @Autowired
     private SysTeamGroupClassService sysTeamGroupClassService;
+    @Autowired
+    private TeamGroupAddOrUpdate addOrUpdate;
 
     private JTable table;
     private List<ColumnDto> columnDto;
@@ -60,19 +62,18 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-        //tableModelListener(table,jFrame,list);
+        tableModelListener(table,jFrame,list);
 
-       /* btnInsert.addActionListener(new ActionListener() {
+        btnInsert.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                SysUser data = new SysUser();
+                SysTeamGroupClass data = new SysTeamGroupClass();
                 addOrUpdate.openDialog(data,jFrame, columnDto,table);
                 jFrame.setEnabled(false);
             }
-        });*/
+        });
 
         JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         scrollPane.setViewportView(table);
@@ -83,7 +84,7 @@
         return panel;
     }
 
- /*   public void tableModelListener(JTable table,JFrame jFrame,List<SysUser> list){
+    public void tableModelListener(JTable table,JFrame jFrame,List<SysTeamGroupClass> list){
         table.getModel().addTableModelListener(e -> {
             // 妫�鏌ヤ簨浠剁被鍨�
             if (e.getType() == TableModelEvent.UPDATE) {
@@ -95,15 +96,15 @@
                 Object newValue = table.getModel().getValueAt(row, column);
                 // 杈撳嚭鍙樺寲淇℃伅
                 if (newValue.equals("edit")){
-                    SysUser data = list.get(row);
+                    SysTeamGroupClass data = list.get(row);
                     addOrUpdate.openDialog(data,jFrame, columnDto,table);
                     jFrame.setEnabled(false);
                 }else if(newValue.equals("del")) {
                     int n = JOptionPane.showConfirmDialog(null, "鏄惁鍒犻櫎?", "鎻愮ず", JOptionPane.YES_NO_OPTION);
                     if (n == 0) {
                         DefaultTableModel model = (DefaultTableModel) table.getModel();
-                        SysUser data = list.get(row);
-                        userService.deleteLogic(data.getId());
+                        SysTeamGroupClass data = list.get(row);
+                        sysTeamGroupClassService.deleteLogic(data.getId());
                         list.remove(row);
                         model.removeRow(row);
                     }
@@ -112,7 +113,6 @@
             }
         });
     }
-*/
 
 }
 
diff --git a/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java b/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
index 5a3bc23..323e542 100644
--- a/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
@@ -6,13 +6,11 @@
 import com.example.client.utils.CommonTable;
 import com.example.client.utils.GBC;
 import com.example.client.utils.UploadFile;
+import com.example.server.progressTrack.model.DjJdgzDismantTrack;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3List;
 import com.example.server.progressTrack.model.DjJdgzTrackRecord;
-import com.example.server.progressTrack.service.DjJdgzNetworkLevel3ListService;
-import com.example.server.progressTrack.service.DjJdgzNetworkLevel3Service;
-import com.example.server.progressTrack.service.DjJdgzTrackRecordService;
-import com.example.server.progressTrack.service.NetWorkDiagramService;
+import com.example.server.progressTrack.service.*;
 import com.example.server.sysOss.model.SysOss;
 import com.example.server.teamGroup.service.SysTeamGroupClassService;
 import com.example.server.user.model.SysUser;
@@ -45,9 +43,11 @@
     private TrackRecordManageService trackRecordManageService;
     @Autowired
     private UploadFile uploadFile;
+    @Autowired
+    private DjJdgzDismantTrackService djJdgzDismantTrackService;
 
     public void openDialog(DjJdgzTrackRecord data, JFrame jFrame, Long level1Id, List<ColumnDto> columnDto, JTable table) {
-        JFrame frame1 = new JFrame("璺熻釜璁板綍");
+        JFrame frame1 = new JFrame(data.getLevel3NetworkName() + "璺熻釜璁板綍");
         frame1.setSize(1200, 800);
         frame1.setResizable(false);
         frame1.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
@@ -76,17 +76,17 @@
         hasDelayRiskMap.put(0, "鏃�");
 
         JComboBoxItem[] trackList = {
-                new JComboBoxItem(0, "绾夸笅"),
-                new JComboBoxItem(1, "鐢佃瘽"),
+                new JComboBoxItem(0L, "绾夸笅"),
+                new JComboBoxItem(1L, "鐢佃瘽"),
         };
 
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�"),
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�"),
         };
         JComboBoxItem[] hasDelayRiskList = {
-                new JComboBoxItem(0, "鏃�"),
-                new JComboBoxItem(1, "鏈�"),
+                new JComboBoxItem(0L, "鏃�"),
+                new JComboBoxItem(1L, "鏈�"),
         };
 
         JLabel JLabel0 = new JLabel("褰撳墠鑺傜偣");
@@ -172,7 +172,7 @@
         JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>(statusList);
         comboBox1.setPreferredSize(new Dimension(185, 28));
         if (data.getCurrentStatus() != null) {
-            comboBox0.setSelectedItem(new JComboBoxItem(data.getCurrentStatus(), statusMap.get(data.getCurrentStatus())));
+            comboBox0.setSelectedItem(new JComboBoxItem(data.getCurrentStatus().longValue(), statusMap.get(data.getCurrentStatus())));
         }
 
 
@@ -180,7 +180,7 @@
         JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(hasDelayRiskList);
         comboBox2.setPreferredSize(new Dimension(185, 28));
         if (data.getHasDelayRisk() != null) {
-            comboBox0.setSelectedItem(new JComboBoxItem(data.getHasDelayRisk(), hasDelayRiskMap.get(data.getHasDelayRisk())));
+            comboBox0.setSelectedItem(new JComboBoxItem(data.getHasDelayRisk().longValue(), hasDelayRiskMap.get(data.getHasDelayRisk())));
         }
 
 
@@ -224,7 +224,7 @@
 
         JLabel JLabel19 = new JLabel("闄勪欢");
         SysOss oss = new SysOss();
-        if (data.getId()!=null){
+        if (data.getId() != null) {
             oss.setBusiId(data.getId());
         }
         oss.setBusiType("ProjectProgressFileUpload");
@@ -233,7 +233,7 @@
         oss.setBusiFieldName("椤圭洰杩涘害鏂囦欢");
         oss.setStatus(1);
         oss.setChannel("local");
-        JPanel jPanel = uploadFile.uploadFile(jFrame,500,220,oss);
+        JPanel jPanel = uploadFile.uploadFile(jFrame, 500, 220, oss);
         JButton saveButton = new JButton("淇濆瓨");
 
         frame1.add(JLabel0, new GBC(0, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
@@ -292,14 +292,22 @@
             public void actionPerformed(ActionEvent e) {
                 SysUser user = (SysUser) CacheUtils.get("user", "user");
                 DjJdgzNetworkLevel3 level3 = djJdgzNetworkLevel3Service.get(data.getLevel3NetworkId());
-                if (user.getTeamgroup()!=null && !user.getTeamgroup().equals(level3.getTeamgroupId())){
-                    JOptionPane.showMessageDialog(null, "涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                if (user.getTeamgroup() != null && !user.getTeamgroup().equals(level3.getTeamgroupId().toString())) {
+                    JOptionPane.showMessageDialog(null, "褰撳墠鐢ㄦ埛涓嶅彲鎿嶄綔鍏朵粬涓撲笟鏁版嵁", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     return;
                 }
-
                 JComboBoxItem trackMethod = (JComboBoxItem) comboBox0.getSelectedItem();
                 JComboBoxItem currentStatus = (JComboBoxItem) comboBox1.getSelectedItem();
                 JComboBoxItem hasDelayRisk = (JComboBoxItem) comboBox2.getSelectedItem();
+                List<DjJdgzDismantTrack> list1 = djJdgzDismantTrackService.getList(data.getLevel3NetworkId(), null);
+                if (data.getProcessName().equals("璁惧鎷嗗嵏鍑鸿埍") && currentStatus.getId() == 1 && list1 != null && list1.size() > 0) {
+                    Boolean status = djJdgzDismantTrackService.getStatus(data.getLevel3NetworkId());
+                    if (!status) {
+                        JOptionPane.showMessageDialog(null, "鏈夋湭瀹屾垚鐨勫瓙閮ㄤ欢", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
+                        return;
+                    }
+                }
+
                 data.setTrackMethod(Math.toIntExact(trackMethod.getId()));
                 data.setProcessName(data.getLevel3NodeName());
                 data.setTrackLocation(trackLocatDesc.getText());
@@ -321,9 +329,9 @@
                 data.setRemark(remark.getText());
                 Long id = djJdgzTrackRecordService.save(data);
                 uploadFile.save(id);
-                List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(level1Id,0);
-                CommonTable.refreshTable(list,columnDto,table);
-                trackRecordManageService.tableModelListener(table,jFrame);
+                List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(level1Id, 0);
+                CommonTable.refreshTable(list, columnDto, table);
+                trackRecordManageService.tableModelListener(table, jFrame, list);
                 frame1.dispose();
                 jFrame.setEnabled(true);//灏嗕富鐣岄潰鍐嶈缃负鍙搷浣滅殑
             }
diff --git a/src/main/java/com/example/client/service/TrackRecordManageService.java b/src/main/java/com/example/client/service/TrackRecordManageService.java
index 52c1c2c..d30992b 100644
--- a/src/main/java/com/example/client/service/TrackRecordManageService.java
+++ b/src/main/java/com/example/client/service/TrackRecordManageService.java
@@ -4,11 +4,13 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
+import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.model.*;
 import com.example.server.progressTrack.service.DjJdgzNetworkLevel1Service;
 import com.example.server.progressTrack.service.DjJdgzNetworkLevel3Service;
 import com.example.server.progressTrack.service.DjJdgzShipService;
 import com.example.server.progressTrack.service.DjJdgzTrackRecordService;
+import com.example.server.teamGroup.service.SysTeamGroupClassService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
@@ -37,7 +39,13 @@
     @Autowired
     private ExportTrackRecordService exportTrackRecordService;
     @Autowired
+    private ImportTrackRecordService importTrackRecordService;
+    @Autowired
     private TrackRecordAddOrUpdate addOrUpdate; // 娉ㄥ叆 AddOrupdate 瀹炰緥
+    @Autowired
+    private SysTeamGroupClassService sysTeamGroupClassService;
+    @Autowired
+    private CabinService cabinService;
 
     private JTable table;
     private List<DjJdgzTrackRecord> list;
@@ -57,14 +65,18 @@
         panel.add(centerJpanel, BorderLayout.CENTER);
 
         JComboBoxItem[] projectList = level1Service.getProjectList();
+
+        JComboBoxItem[] cabinList = cabinService.getList();
+        JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�")
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�")
         };
 
         JButton btnTj = new JButton("缁熻鎶ヨ〃");
         JButton btnJc = new JButton("鍛ㄨ繘搴︽鏌ヨ〃");
         JButton btnExport = new JButton("瀵煎嚭璺熻釜鎶ヨ〃");
+        JButton btnImport = new JButton("瀵煎叆璺熻釜鎶ヨ〃");
         JComboBox<JComboBoxItem> comboBox = new JComboBox<>(projectList);
         JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(statusList);
         JComboBoxItem selectedItem = (JComboBoxItem) comboBox.getSelectedItem();
@@ -80,10 +92,9 @@
                 list = djJdgzTrackRecordService.getList(level1Id, Math.toIntExact(Status));
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-                tableModelListener(table, jFrame);
+                tableModelListener(table, jFrame,list);
             }
         });
 
@@ -97,16 +108,24 @@
                 list = djJdgzTrackRecordService.getList(level1Id, Math.toIntExact(Status));
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoCreateRowSorter(true);
                 table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-                tableModelListener(table, jFrame);
+                tableModelListener(table, jFrame,list);
+            }
+        });
+
+        btnImport.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JComboBoxItem selectedItemNow = (JComboBoxItem) comboBox.getSelectedItem();
+                importTrackRecordService.FileUpload(columnDto,table,jFrame);
             }
         });
 
         topJpanel.add(btnTj);
         topJpanel.add(btnJc);
         topJpanel.add(btnExport);
+        topJpanel.add(btnImport);
         topJpanel.add(comboBox);
         topJpanel.add(comboBox2);
 
@@ -120,10 +139,13 @@
         columnDto = new ArrayList<>();
         //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
         columnDto.add(new ColumnDto("搴忓彿", "", 50, "autoCreate", false, null, null));
-        columnDto.add(new ColumnDto("宸ョ▼鍚嶇О", "ProjectName", 180, null, false, null, null));
+        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 120, "dict", false, null, deptList));
+        columnDto.add(new ColumnDto("涓撲笟", "teamgroupName", 120, null, false, null, null));
+        columnDto.add(new ColumnDto("鑸卞", "cabinId", 100, "dict", false, null, cabinList));
+        columnDto.add(new ColumnDto("绫诲埆", "type", 100, null, false, null, null));
         columnDto.add(new ColumnDto("涓�绾ц妭鐐�", "level1NodeName", 120, null, false, null, null));
         columnDto.add(new ColumnDto("浜岀骇鑺傜偣", "level2NodeName", 120, null, false, null, null));
-        columnDto.add(new ColumnDto("椤圭洰鍚嶇О", "level3NetworkName", 120, null, false, null, null));
+        columnDto.add(new ColumnDto("璁惧鍚嶇О", "level3NetworkName", 120, null, false, null, null));
         columnDto.add(new ColumnDto("褰撳墠鑺傜偣", "level3NodeName", 120, null, false, null, null));
         columnDto.add(new ColumnDto("璁″垝瀹屾垚鏃堕棿", "requiredCompletionTime", 200, null, false, null, null));
         columnDto.add(new ColumnDto("鎬绘壙淇崟浣�", "generalRepair", 180, null, false, null, null));
@@ -136,7 +158,6 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         table.addMouseListener(new MouseAdapter() {
@@ -149,7 +170,7 @@
 
                 // 妫�鏌ユ槸鍚︾偣鍑讳簡鏈夋晥鍗曞厓鏍�
                 if (row >= 0 && column >= 0) {
-                    if (column == 10) { // 鍒楃储寮曚粠0寮�濮�
+                    if (column == 13) { // 鍒楃储寮曚粠0寮�濮�
                         // 鑾峰彇璇ュ崟鍏冩牸鐨勫��
                         Object cellValue = table.getValueAt(row, column);
                         Integer value = Integer.parseInt(cellValue.toString());
@@ -182,7 +203,7 @@
                 exportTrackRecordService.openDialog(jFrame);
             }
         });
-        tableModelListener(table, jFrame);
+        tableModelListener(table, jFrame,list);
 
         JScrollPane scrollPane = new JScrollPane(table, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         scrollPane.setViewportView(table);
@@ -211,17 +232,17 @@
         List<ColumnDto> columnDto = new ArrayList<>();
         List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getHistory(level3NodeId);
         JComboBoxItem[] trackList = {
-                new JComboBoxItem(0, "绾夸笅"),
-                new JComboBoxItem(1, "鐢佃瘽"),
+                new JComboBoxItem(0L, "绾夸笅"),
+                new JComboBoxItem(1L, "鐢佃瘽"),
         };
 
         JComboBoxItem[] statusList = {
-                new JComboBoxItem(0, "杩涜涓�"),
-                new JComboBoxItem(1, "宸插畬鎴�"),
+                new JComboBoxItem(0L, "杩涜涓�"),
+                new JComboBoxItem(1L, "宸插畬鎴�"),
         };
         JComboBoxItem[] hasDelayRiskList = {
-                new JComboBoxItem(0, "鏃�"),
-                new JComboBoxItem(1, "鏈�"),
+                new JComboBoxItem(0L, "鏃�"),
+                new JComboBoxItem(1L, "鏈�"),
         };
 
         columnDto.add(new ColumnDto("搴忓彿", "", 50, "autoCreate", false, null, null));
@@ -251,7 +272,7 @@
 
     }
 
-    public void tableModelListener(JTable table, JFrame jFrame) {
+    public void tableModelListener(JTable table, JFrame jFrame,List<DjJdgzTrackRecord> recordList) {
         table.getModel().addTableModelListener(e -> {
             // 妫�鏌ヤ簨浠剁被鍨�
             if (e.getType() == TableModelEvent.UPDATE) {
@@ -263,7 +284,7 @@
                 Object newValue = table.getModel().getValueAt(row, column);
                 // 杈撳嚭鍙樺寲淇℃伅
                 if (newValue.equals("edit")) {
-                    DjJdgzTrackRecord data = list.get(row);
+                    DjJdgzTrackRecord data = recordList.get(row);
                     Long level1Id = data.getLevel1NetworkId();
                     data.setProcessName(data.getLevel3NodeName());
                     Boolean isUpdate = data.getIsUpdate();
diff --git a/src/main/java/com/example/client/service/UserManageService.java b/src/main/java/com/example/client/service/UserManageService.java
index 63cfdb2..bc39772 100644
--- a/src/main/java/com/example/client/service/UserManageService.java
+++ b/src/main/java/com/example/client/service/UserManageService.java
@@ -86,7 +86,6 @@
 
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
-        table.setAutoCreateRowSorter(true);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         tableModelListener(table,jFrame,list);
diff --git a/src/main/java/com/example/client/utils/CircleRenderer.java b/src/main/java/com/example/client/utils/CircleRenderer.java
new file mode 100644
index 0000000..ac19351
--- /dev/null
+++ b/src/main/java/com/example/client/utils/CircleRenderer.java
@@ -0,0 +1,57 @@
+package com.example.client.utils;
+
+import javax.swing.*;
+import javax.swing.table.DefaultTableCellRenderer;
+import java.awt.*;
+
+public class CircleRenderer extends DefaultTableCellRenderer {
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+        super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+
+        // 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓� Color 瀵硅薄
+        if (value instanceof String) {
+            String hexColor = (String) value;
+            Color color = hexToColor(hexColor);
+            setForeground(color); // 璁剧疆鍓嶆櫙鑹蹭负鍦嗗舰鐨勯鑹�
+        }
+
+        // 璁剧疆鑳屾櫙鑹诧紙鍙�夛級
+        setBackground(isSelected ? table.getSelectionBackground() : table.getBackground());
+
+        // 璁剧疆鏂囨湰涓虹┖锛屽洜涓烘垜浠彧鏄剧ず鍦嗗舰鍥炬
+        setText("");
+
+        return this;
+    }
+
+    @Override
+    protected void paintComponent(Graphics g) {
+        super.paintComponent(g);
+
+        // 缁樺埗鍦嗗舰鍥炬
+        int width = getWidth();
+        int height = getHeight();
+        int diameter = Math.min(width, height); // 鍦嗙殑鐩村緞
+        int x = (width - diameter) / 2;
+        int y = (height - diameter) / 2;
+
+        g.setColor(getForeground());
+        g.fillOval(x, y, diameter, diameter); // 缁樺埗濉厖鐨勫渾褰�
+    }
+
+    // 灏嗗崄鍏繘鍒跺瓧绗︿覆杞崲涓� Color 瀵硅薄
+    private Color hexToColor(String hex) {
+        if (hex == null || hex.isEmpty()) {
+            return Color.WHITE; // 榛樿棰滆壊
+        }
+        try {
+            // 鍘绘帀鍙兘瀛樺湪鐨� "#" 鍓嶇紑
+            hex = hex.trim().replace("#", "");
+            int rgb = Integer.parseInt(hex, 16);
+            return new Color((rgb >> 16) & 0xFF, (rgb >> 8) & 0xFF, rgb & 0xFF);
+        } catch (NumberFormatException e) {
+            return Color.WHITE; // 濡傛灉杞崲澶辫触锛岃繑鍥為粯璁ら鑹�
+        }
+    }
+}
diff --git a/src/main/java/com/example/client/utils/CommonTable.java b/src/main/java/com/example/client/utils/CommonTable.java
index 6321b72..ea59bc7 100644
--- a/src/main/java/com/example/client/utils/CommonTable.java
+++ b/src/main/java/com/example/client/utils/CommonTable.java
@@ -62,7 +62,7 @@
                 });
                 table.getColumnModel().getColumn(j).setCellEditor(new DatePickerEditor(datePicker));
             }
-            if ("dict".equals(dtoList.get(j).getColumnType())) {
+            if ("dict".equals(dtoList.get(j).getColumnType()) || "dicts".equals(dtoList.get(j).getColumnType())) {
                 Map<Long, JComboBoxItem> itemMap = new HashMap<>();
                 JComboBoxItem[] dictList = dtoList.get(j).getDictList();
                 for (JComboBoxItem item : dictList) {
@@ -86,6 +86,9 @@
                 });
                 table.getColumnModel().getColumn(j).setCellRenderer(new CellComboBoxRenderer(itemMap));
                 table.getColumnModel().getColumn(j).setCellEditor(new CellComboBoxEditor(comboBox, itemMap));
+            }
+            if ("Circle".equals(dtoList.get(j).getColumnType())) {
+                table.getColumnModel().getColumn(j).setCellRenderer(new CircleRenderer());
             }
         }
     }
@@ -117,6 +120,10 @@
                     if (StringUtils.isBlank(dtoList.get(j).getColumnType()) || dtoList.get(j).getColumnType().equals("selectDate")) {
                         rowData[i][j] = valueStr;
                     } else if (dtoList.get(j).getColumnType().equals("dict")) {
+                        rowData[i][j] = valueStr;
+                    } else if (dtoList.get(j).getColumnType().equals("dicts")) {
+                        rowData[i][j] = valueStr;
+                    } else if (dtoList.get(j).getColumnType().equals("Circle")) {
                         rowData[i][j] = valueStr;
                     } else if (dtoList.get(j).getColumnType().equals("autoCreate")) {
                         rowData[i][j] = "" + (i + 1);
@@ -151,16 +158,18 @@
                     if (StringUtils.isNotBlank(fieldName)) {
                         if ("dict".equals(dtoList.get(j).getColumnType())) {
                             method = c1azz.getMethod("set" + StringUtils.capitalize(fieldName), Long.class);
+                        } else if ("dicts".equals(dtoList.get(j).getColumnType())) {
+                            method = c1azz.getMethod("set" + StringUtils.capitalize(fieldName), Integer.class);
                         } else {
                             method = c1azz.getMethod("set" + StringUtils.capitalize(fieldName), String.class);
                         }
                         Object value = table.getModel().getValueAt(i, j);
-                        if (value != null) {
+                        if (value != null && !value.equals("") ) {
                             if ("selectDate".equals(dtoList.get(j).getColumnType())) {
                                 method.invoke(object, value.toString());
                                 System.out.println(value.toString().length());
                                 String valueStr = value.toString();
-                                Method method2 = c1azz.getMethod("set" + StringUtils.capitalize(fieldName) + "Digit", Long.class);
+                                //Method method2 = c1azz.getMethod("set" + StringUtils.capitalize(fieldName) + "Digit", Long.class);
                                 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                                 Date date = null;
                                 try {
@@ -169,9 +178,11 @@
                                     e.printStackTrace();
                                 }
                                 Long timestamp = date.getTime();
-                                method2.invoke(object, timestamp);
+                                // method2.invoke(object, timestamp);
                             } else if ("dict".equals(dtoList.get(j).getColumnType())) {
                                 method.invoke(object, Long.parseLong(value.toString()));
+                            } else if ("dicts".equals(dtoList.get(j).getColumnType())) {
+                                method.invoke(object, Integer.valueOf(value.toString()));
                             } else {
                                 method.invoke(object, value.toString());
                             }
diff --git a/src/main/java/com/example/client/utils/ComplexTable.java b/src/main/java/com/example/client/utils/ComplexTable.java
index ddece2a..d7df4c4 100644
--- a/src/main/java/com/example/client/utils/ComplexTable.java
+++ b/src/main/java/com/example/client/utils/ComplexTable.java
@@ -4,6 +4,8 @@
 import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;
 import java.awt.*;
+import java.util.Arrays;
+import java.util.Vector;
 
 
 public class ComplexTable extends JTable {
@@ -28,6 +30,5 @@
         this.getTableHeader().setUI(new ComplexHeaderUI(headerRows, this));
         this.setUI(new ComplexTableUI(body, this));
     }
-
 }
 
diff --git a/src/main/java/com/example/client/utils/MultiSelectComboBox.java b/src/main/java/com/example/client/utils/MultiSelectComboBox.java
index bba48e7..d92aaae 100644
--- a/src/main/java/com/example/client/utils/MultiSelectComboBox.java
+++ b/src/main/java/com/example/client/utils/MultiSelectComboBox.java
@@ -81,4 +81,15 @@
         }
         return selectedItems;
     }
+
+    public void setSelectedItems(Set<JComboBoxItem> items) {
+        selectedIndices.clear(); // 娓呯┖褰撳墠閫変腑椤�
+        for (int i = 0; i < getItemCount(); i++) {
+            JComboBoxItem item = getItemAt(i);
+            if (items.contains(item)) {
+                selectedIndices.add(i); // 灏嗗搴旂殑绱㈠紩娣诲姞鍒伴�変腑闆嗗悎
+            }
+        }
+        updateTextField(); // 鏇存柊鏂囨湰妗嗗唴瀹�
+    }
 }
\ No newline at end of file
diff --git a/src/main/java/com/example/server/DataSync/dto/DataExportDto.java b/src/main/java/com/example/server/DataSync/dto/DataExportDto.java
new file mode 100644
index 0000000..c381b98
--- /dev/null
+++ b/src/main/java/com/example/server/DataSync/dto/DataExportDto.java
@@ -0,0 +1,9 @@
+package com.example.server.DataSync.dto;
+
+import lombok.Data;
+
+@Data
+public class DataExportDto {
+    private String exportDate;
+    private String exportStaff;
+}
diff --git a/src/main/java/com/example/server/DataSync/dto/DataImportDto.java b/src/main/java/com/example/server/DataSync/dto/DataImportDto.java
new file mode 100644
index 0000000..a88af62
--- /dev/null
+++ b/src/main/java/com/example/server/DataSync/dto/DataImportDto.java
@@ -0,0 +1,10 @@
+package com.example.server.DataSync.dto;
+
+import lombok.Data;
+
+@Data
+public class DataImportDto {
+    private String importDate;
+    private String importLocal;
+    private String importStaff;
+}
diff --git a/src/main/java/com/example/server/DataSync/service/DataSyncService.java b/src/main/java/com/example/server/DataSync/service/DataSyncService.java
index 121f264..e096a1e 100644
--- a/src/main/java/com/example/server/DataSync/service/DataSyncService.java
+++ b/src/main/java/com/example/server/DataSync/service/DataSyncService.java
@@ -156,13 +156,14 @@
             syncTable("dj_jdgz_track_record");
             syncTable("dj_sys_oss");
             syncTable("dj_jdgz_dismant_track");
-        } else if ("TD".equals(mySite)) {
-            if ("TD".equals(otherSite)) {
+        } else if (mySite.equals("TD")) {
+            if (otherSite.equals("TD")) {
                 syncTable("dj_jdgz_network_level3");
                 syncTable("dj_jdgz_network_level3_list");
                 syncTable("dj_jdgz_track_record");
                 syncTable("dj_sys_oss");
                 syncTable("dj_jdgz_dismant_track");
+                syncTable("dj_jdgz_handover");
             } else if ("宸ヤ綔缁�".equals(otherSite)) {
                 syncTable("dj_jdgz_handover");
                 syncTable("dj_jdgz_network_level1");
@@ -267,7 +268,7 @@
                     }
                 }
                 if (isUpdate) {
-                    updateSql = "update " + tableName + " set " + updateSql + "where id = " + id;
+                    updateSql = "update " + tableName + " set " + updateSql + " where id = " + id;
                     // 鎵цupdate
                     sysMysqlDao.execute(updateSql);
                 } else {
diff --git a/src/main/java/com/example/server/progressTrack/Dto/TableNodeDto.java b/src/main/java/com/example/server/progressTrack/Dto/TableNodeDto.java
new file mode 100644
index 0000000..13899e3
--- /dev/null
+++ b/src/main/java/com/example/server/progressTrack/Dto/TableNodeDto.java
@@ -0,0 +1,30 @@
+package com.example.server.progressTrack.Dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class TableNodeDto {
+    private Long id;
+
+    private Long networkId;
+
+    @ApiModelProperty(value = "瑕佹眰瀹屾垚鏃堕棿")
+    private String requiredCompletionTime;
+
+    @ApiModelProperty(value = "瀹為檯瀹屾垚鏃堕棿")
+    private String actualCompletion;
+
+    @ApiModelProperty(value = "褰撳墠鐘舵��")
+    private Integer currentStatus;
+
+    private String processName;
+    private String name;
+
+    private String time1Color;
+    private String time2Color;
+    private String time3Color;
+    private String time4Color;
+    private String time5Color;
+
+}
diff --git a/src/main/java/com/example/server/progressTrack/dao/DjJdgzDismantTrackDao.java b/src/main/java/com/example/server/progressTrack/dao/DjJdgzDismantTrackDao.java
index 3ddbb97..0698dd9 100644
--- a/src/main/java/com/example/server/progressTrack/dao/DjJdgzDismantTrackDao.java
+++ b/src/main/java/com/example/server/progressTrack/dao/DjJdgzDismantTrackDao.java
@@ -26,4 +26,8 @@
     List<DjJdgzDismantTrack> getdata(Long deptId, Long teamGroupId, Long level1NetworkId, Long level3NetworkId, Integer status);
 
     List<StatistDismantDto> getStatist(Long level1Id);
+
+    Boolean getStatus(Long level3NetworkId);
+
+    List<StatistDismantDto> getStatist2(Long level1Id, Long id);
 }
diff --git a/src/main/java/com/example/server/progressTrack/dao/DjJdgzNetworkLevel3Dao.java b/src/main/java/com/example/server/progressTrack/dao/DjJdgzNetworkLevel3Dao.java
index f46d382..1e6646a 100644
--- a/src/main/java/com/example/server/progressTrack/dao/DjJdgzNetworkLevel3Dao.java
+++ b/src/main/java/com/example/server/progressTrack/dao/DjJdgzNetworkLevel3Dao.java
@@ -3,6 +3,7 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.server.dao.BaseDao;
 import com.example.server.progressTrack.Dto.NetworkNodeStatusDto;
+import com.example.server.progressTrack.Dto.TableNodeDto;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
 import org.apache.ibatis.annotations.Mapper;
 
@@ -32,4 +33,6 @@
     void deleteByTeamGroup(Long teamGroupId, String name);
 
     JComboBoxItem[] getListByExport(Long projectId, Long deptId, Long teamId);
+
+    List<TableNodeDto> getNodeList(Long shipId, Long deptId, Long teamId, Long cabinId, String type, String name);
 }
diff --git a/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java b/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java
index e81fd0a..dd46f58 100644
--- a/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java
+++ b/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java
@@ -32,4 +32,6 @@
     List<DjJdgzTrackRecord> getSummaryData(String teamgroupId, Long level1NetworkId, Long level3NetworkId, Long level3NodeId, Integer status, Date beginDate, Date endDate, Integer istq);
 
     Integer getTrackNum(Long level3NodeId);
+
+    List<DjJdgzTrackRecord> getListByImport(Long level1Id, Long level2Id, Long level2NodeId, String selectedIds);
 }
diff --git a/src/main/java/com/example/server/progressTrack/model/DjJdgzTrackRecord.java b/src/main/java/com/example/server/progressTrack/model/DjJdgzTrackRecord.java
index a52d614..aaf7452 100644
--- a/src/main/java/com/example/server/progressTrack/model/DjJdgzTrackRecord.java
+++ b/src/main/java/com/example/server/progressTrack/model/DjJdgzTrackRecord.java
@@ -59,7 +59,8 @@
 
 	@ApiModelProperty(value = "璺熻釜浜�")
 	private String trackPerson;
-
+	@ApiModelProperty(value = "璺熻釜浜哄崟浣�")
+	private String trackPersonUnit;
 	@ApiModelProperty(value = "璺熻釜浜鸿仈绯绘柟寮�")
 	private String trackPersonContact;
 
@@ -68,7 +69,8 @@
 
 	@ApiModelProperty(value = "琚窡韪汉")
 	private String trackedPerson;
-
+	@ApiModelProperty(value = "璺熻釜浜哄崟浣�")
+	private String trackedPersonUnit;
 	@ApiModelProperty(value = "琚窡韪汉鑱旂郴鏂瑰紡")
 	private String trackedPersonContact;
 
@@ -143,7 +145,7 @@
 	private String status;
 
 	@TableField(exist = false)
-	private String teamGroupName;
+	private String teamgroupName;
 
 	@TableField(exist = false)
 	private String istq;
@@ -174,5 +176,10 @@
 	@TableField(exist = false)
 	private String fileName;
 
+	@TableField(exist = false)
+	private Long cabinId;
+
+	@TableField(exist = false)
+	private String type;
 
 }
diff --git a/src/main/java/com/example/server/progressTrack/service/DjJdgzDismantTrackService.java b/src/main/java/com/example/server/progressTrack/service/DjJdgzDismantTrackService.java
index b222e69..17913eb 100644
--- a/src/main/java/com/example/server/progressTrack/service/DjJdgzDismantTrackService.java
+++ b/src/main/java/com/example/server/progressTrack/service/DjJdgzDismantTrackService.java
@@ -113,7 +113,7 @@
             String curSbName = "";
             Long curSbId = null;
 
-            for (int j = 1; j <= num; j++) {
+            for (int j = 2; j <= num; j++) {
                 DjJdgzDismantTrack data = new DjJdgzDismantTrack();
 
                 boolean isErr = false;
@@ -390,4 +390,16 @@
     public List<StatistDismantDto> getStatist(Long level1Id) {
         return baseDao.getStatist(level1Id);
     }
+
+    public Boolean getStatus(Long level3NetworkId) {
+        return baseDao.getStatus(level3NetworkId);
+    }
+
+    public void delete(Long id) {
+        baseDao.deleteById(id);
+    }
+
+    public List<StatistDismantDto> getStatist2(Long level1Id, Long id) {
+        return baseDao.getStatist2(level1Id,id);
+    }
 }
diff --git a/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java b/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java
index d4bbe69..6cebd68 100644
--- a/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java
+++ b/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java
@@ -4,6 +4,7 @@
 import com.example.client.service.BaseService;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.Dto.NetworkNodeStatusDto;
+import com.example.server.progressTrack.Dto.TableNodeDto;
 import com.example.server.progressTrack.dao.DjJdgzNetworkLevel3Dao;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3List;
@@ -23,6 +24,8 @@
 import org.springframework.web.multipart.MultipartFile;
 
 import java.io.IOException;
+import java.text.ParseException;
+import java.text.SimpleDateFormat;
 import java.util.*;
 
 
@@ -46,6 +49,11 @@
 
     @Value("${zt.oss.local-path}")
     private String path;
+
+    enum StatusEnum {zy, jxz, lq, yq, zcwc, cqwc}
+
+    String[] fillColorArr = {"#e5e5e5", "#3498DB", "#F1C40F", "#E74C3C", "#2ECC71", "#006400"};
+    String[] fontColorArr = {"#e5e5e5", "#3498DB", "#F1C40F", "#E74C3C", "#2ECC71", "#006400"};
 
     public List<DjJdgzNetworkLevel3> getList(Long shipId, Long deptId, Long teamId, Long cabinId, String type, String name) {
         List<DjJdgzNetworkLevel3> list = baseDao.getList(shipId, deptId, teamId, cabinId, type, name);
@@ -148,7 +156,7 @@
                 teamMap.put(item.getName(), item.getId());
             }
 
-            for (int j = 1; j <= num; j++) {
+            for (int j = 2; j <= num; j++) {
                 int sort = 0;
                 DjJdgzNetworkLevel3 data = new DjJdgzNetworkLevel3();
                 DjJdgzNetworkLevel3List node = new DjJdgzNetworkLevel3List();
@@ -428,6 +436,76 @@
         JComboBoxItem[] list = baseDao.getListByExport(projectId, deptId, teamId);
         return list;
     }
+
+    public List<TableNodeDto> getNodeList(Long shipId, Long deptId, Long teamId, Long cabinId, String type, String name) {
+        List<TableNodeDto> list = baseDao.getNodeList(shipId, deptId, teamId, cabinId, type, name);
+
+        Map<Long, StatusEnum> statusMap = new HashMap<>();
+        Date today = new Date();
+        for (TableNodeDto node : list) {
+            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
+            Date requiredCompletionDate = null;
+            Date actualCompletionDate = null;
+            try {
+                if (StringUtils.isNotBlank(node.getRequiredCompletionTime())) {
+                    requiredCompletionDate = sdf.parse(node.getRequiredCompletionTime());
+                }
+                if (StringUtils.isNotBlank(node.getActualCompletion())) {
+                    actualCompletionDate = sdf.parse(node.getActualCompletion());
+                }
+
+            } catch (ParseException e) {
+                e.printStackTrace();
+            }
+            if (node.getCurrentStatus() == null || node.getCurrentStatus() == 0) {
+                if (today.after(requiredCompletionDate)) {
+                    statusMap.put(node.getId(), StatusEnum.yq);
+                } else if ((requiredCompletionDate.getTime() - today.getTime()) / (1000 * 60 * 60 * 24) < 7) {
+                    statusMap.put(node.getId(), StatusEnum.lq);
+                } else {
+                    statusMap.put(node.getId(), StatusEnum.jxz);
+                }
+            } else if (node.getCurrentStatus() == 1) {
+                // 宸插畬鎴�
+                if (node.getActualCompletion() != null && actualCompletionDate.after(requiredCompletionDate)) {
+                    statusMap.put(node.getId(), StatusEnum.cqwc);
+                } else {
+                    statusMap.put(node.getId(), StatusEnum.zcwc);
+                }
+            }
+        }
+        StatusEnum status = StatusEnum.jxz;
+        List<TableNodeDto> dataList = new ArrayList<>();
+        Long oldId = 0L;
+        TableNodeDto data = null;
+        for (TableNodeDto node : list) {
+            if (oldId.equals(node.getNetworkId())){
+
+            }else{
+                data = new TableNodeDto();
+                data.setName(node.getName());
+                data.setNetworkId(node.getNetworkId());
+                dataList.add(data);
+                oldId = node.getNetworkId();
+            }
+
+            status = statusMap.get(node.getId());
+            if (node.getProcessName().equals("璁惧鎷嗗嵏鍑鸿埍")) {
+                data.setTime1Color(fillColorArr[status.ordinal()]);
+            } else if (node.getProcessName().equals("璁惧鍒嗕氦")) {
+                data.setTime2Color(fillColorArr[status.ordinal()]);
+            } else if (node.getProcessName().equals("鎷嗘閴村畾")) {
+                data.setTime3Color(fillColorArr[status.ordinal()]);
+            } else if (node.getProcessName().equals("璁惧杩斿巶")) {
+                data.setTime4Color(fillColorArr[status.ordinal()]);
+            } else if (node.getProcessName().equals("鍥炶")) {
+                data.setTime5Color(fillColorArr[status.ordinal()]);
+            }
+        }
+
+
+        return dataList;
+    }
   /*  public void exportExcelTemplate(HttpServletResponse response, HttpServletRequest request) throws IOException {
         String excelName="涓夌骇缃戠粶鍥炬壒閲忔ā鐗�";
         String excelPath = path + "template/jx-model/" + excelName + ".xlsx"; //妯℃澘璺緞
diff --git a/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java b/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java
index 0cb2757..e011133 100644
--- a/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java
+++ b/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java
@@ -303,5 +303,7 @@
         }
     }
 
-
+    public List<DjJdgzTrackRecord> getListByImport(Long level1Id, Long level2Id, Long level2NodeId, String selectedIds) {
+        return baseDao.getListByImport(level1Id,level2Id,level2NodeId,selectedIds);
+    }
 }
diff --git a/src/main/java/com/example/server/progressTrack/service/NetWorkDiagramService.java b/src/main/java/com/example/server/progressTrack/service/NetWorkDiagramService.java
index 3414286..ffd8672 100644
--- a/src/main/java/com/example/server/progressTrack/service/NetWorkDiagramService.java
+++ b/src/main/java/com/example/server/progressTrack/service/NetWorkDiagramService.java
@@ -79,8 +79,8 @@
     //鐘舵�佸垎涓猴細涓撲笟銆佸凡鍚姩/杩涜涓紙娴呯伆锛夈�佷复鏈燂紙榛勮壊锛夈�佸凡閫炬湡锛堢孩鑹诧級銆佸凡瀹屾垚锛堟祬缁胯壊锛夈�佽秴鏈熷畬鎴愶紙娣辩豢鑹诧級
     enum StatusEnum {zy, jxz, lq, yq, zcwc, cqwc}
 
-    String[] fillColorArr = {"#e5e5e5", "#A9A9A9", "yellow", "#FF0000", "#90EE90", "#006400"};
-    String[] fontColorArr = {"#e5e5e5", "#A9A9A9", "yellow", "#FF0000", "#90EE90", "#006400"};
+    String[] fillColorArr = {"#e5e5e5", "#3498DB", "#F1C40F", "#E74C3C", "#2ECC71", "#006400"};
+    String[] fontColorArr = {"#e5e5e5", "#3498DB", "#F1C40F", "#E74C3C", "#2ECC71", "#006400"};
 
     InitParamDto initParamDto = new InitParamDto();
     ResultDataDto resultDataDto = new ResultDataDto();
diff --git a/src/main/java/com/example/server/teamGroup/dao/SysTeamGroupClassDao.java b/src/main/java/com/example/server/teamGroup/dao/SysTeamGroupClassDao.java
index 30692a5..40b720e 100644
--- a/src/main/java/com/example/server/teamGroup/dao/SysTeamGroupClassDao.java
+++ b/src/main/java/com/example/server/teamGroup/dao/SysTeamGroupClassDao.java
@@ -40,4 +40,6 @@
     JComboBoxItem[] getDeptList();
 
     List<SysTeamGroupClass> getListByTree();
+
+    Integer getSortMax(Long pid);
 }
diff --git a/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java b/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java
index 2f84603..f5d3f45 100644
--- a/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java
+++ b/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java
@@ -38,6 +38,9 @@
 	@ApiModelProperty(value = "鍒嗙被锛圓/B锛�")
 	private String classType;
 
+	@ApiModelProperty(value = "绫诲瀷锛�")
+	private String type;
+
 	@ApiModelProperty(value = "澶囨敞")
 	private String comment;
 
diff --git a/src/main/java/com/example/server/teamGroup/service/SysTeamGroupClassService.java b/src/main/java/com/example/server/teamGroup/service/SysTeamGroupClassService.java
index ebb2c28..3e73163 100644
--- a/src/main/java/com/example/server/teamGroup/service/SysTeamGroupClassService.java
+++ b/src/main/java/com/example/server/teamGroup/service/SysTeamGroupClassService.java
@@ -205,4 +205,16 @@
     public List<SysTeamGroupClass> getListByTree() {
         return baseDao.getListByTree();
     }
+
+    public Integer getSortMax(Long pid) {
+        return baseDao.getSortMax(pid);
+    }
+
+    public void save(SysTeamGroupClass data) {
+        if (data.getId()!=null){
+            this.update(data);
+        }else{
+            this.insert(data);
+        }
+    }
 }
diff --git a/src/main/java/com/example/server/utils/DownLoadTmpFile.java b/src/main/java/com/example/server/utils/DownLoadTmpFile.java
index 84047c0..fa11450 100644
--- a/src/main/java/com/example/server/utils/DownLoadTmpFile.java
+++ b/src/main/java/com/example/server/utils/DownLoadTmpFile.java
@@ -1,15 +1,28 @@
 package com.example.server.utils;
 
 import com.example.Application;
+import com.example.server.progressTrack.model.DjJdgzTrackRecord;
+import com.example.server.progressTrack.service.DjJdgzDismantTrackService;
+import com.example.server.progressTrack.service.DjJdgzTrackRecordService;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.Cell;
+import org.apache.poi.ss.usermodel.Row;
+import org.apache.poi.ss.usermodel.Sheet;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
 
 import javax.swing.*;
 import java.io.*;
 import java.nio.file.Files;
 import java.nio.file.StandardCopyOption;
+import java.time.LocalDate;
+import java.time.format.DateTimeFormatter;
+import java.util.List;
 
 public class DownLoadTmpFile {
-    public static void down(String name,JFrame frame1){
+    public static void down(String name, JFrame frame1) {
         InputStream inputStream = Application.class.getClassLoader().getResourceAsStream(name);
 
         if (inputStream == null) {
@@ -50,4 +63,135 @@
             tempFile.delete(); // 鍒犻櫎涓存椂鏂囦欢
         }
     }
+
+    public static void buildTrack(List<DjJdgzTrackRecord> list, String path, JFrame frame1) {
+        LocalDate currentDate = LocalDate.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        // 灏嗗綋鍓嶆棩鏈熸牸寮忓寲涓哄瓧绗︿覆
+        String date = currentDate.format(formatter);
+
+        InputStream inputStream = Application.class.getClassLoader().getResourceAsStream(path);
+
+        if (inputStream == null) {
+            try {
+                inputStream = new FileInputStream(path);
+            } catch (FileNotFoundException e) {
+                e.printStackTrace();
+            }
+        }
+
+        try {
+            Workbook workbook = new XSSFWorkbook(inputStream);
+            // 鑾峰彇绗竴涓伐浣滆〃
+            Sheet sheet = workbook.getSheetAt(0);
+            int num = 1;
+
+            for (int i = 0; i < list.size(); i++) {
+                num = num + 1;
+                Row row = sheet.createRow(num);
+
+                Cell cell = row.createCell(0);
+                cell.setCellValue(list.get(i).getId());
+
+                cell = row.createCell(1);
+                cell.setCellValue(date);
+
+                cell = row.createCell(2);
+                cell.setCellValue(list.get(i).getLevel3NetworkName());
+
+                cell = row.createCell(12);
+                if (StringUtils.isNotBlank(list.get(i).getTrackPerson())) {
+                    cell.setCellValue(list.get(i).getTrackPerson());
+                }
+                cell = row.createCell(13);
+                if (StringUtils.isNotBlank(list.get(i).getTrackPersonContact())) {
+                    cell.setCellValue(list.get(i).getTrackPersonContact());
+                }
+
+                cell = row.createCell(14);
+                if (StringUtils.isNotBlank(list.get(i).getTrackPersonUnit())) {
+                    cell.setCellValue(list.get(i).getTrackPersonUnit());
+                }
+
+                cell = row.createCell(15);
+                if (StringUtils.isNotBlank(list.get(i).getTrackedPerson())) {
+                    cell.setCellValue(list.get(i).getTrackPerson());
+                }
+                cell = row.createCell(16);
+                if (StringUtils.isNotBlank(list.get(i).getTrackedPersonContact())) {
+                    cell.setCellValue(list.get(i).getTrackPersonContact());
+                }
+
+                cell = row.createCell(17);
+                if (StringUtils.isNotBlank(list.get(i).getTrackedPersonUnit())) {
+                    cell.setCellValue(list.get(i).getTrackPersonUnit());
+                }
+
+                cell = row.createCell(18);
+                if (StringUtils.isNotBlank(list.get(i).getGeneralRepairUnit())) {
+                    cell.setCellValue(list.get(i).getGeneralRepairUnit());
+                }
+                cell = row.createCell(19);
+                if (StringUtils.isNotBlank(list.get(i).getGeneralRepairUnitDirector())) {
+                    cell.setCellValue(list.get(i).getGeneralRepairUnitDirector());
+                }
+                cell = row.createCell(20);
+                if (StringUtils.isNotBlank(list.get(i).getGeneralRepairUnitContact())) {
+                    cell.setCellValue(list.get(i).getGeneralRepairUnitDirector());
+                }
+                cell = row.createCell(21);
+                if (StringUtils.isNotBlank(list.get(i).getRepairUnit())) {
+                    cell.setCellValue(list.get(i).getRepairUnit());
+                }
+                cell = row.createCell(22);
+                if (StringUtils.isNotBlank(list.get(i).getRepairUnitDirector())) {
+                    cell.setCellValue(list.get(i).getRepairUnitDirector());
+                }
+                cell = row.createCell(23);
+                if (StringUtils.isNotBlank(list.get(i).getRepairUnitContact())) {
+                    cell.setCellValue(list.get(i).getRepairUnitContact());
+                }
+
+                if (i >= list.size() - 1) {
+                    row = sheet.createRow(sheet.getLastRowNum() + 3);
+                    cell = row.createCell(1);
+                    cell.setCellValue("娉細");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("1. 璁惧鍚嶇О锛氬鍑烘ā鏉挎椂锛岀郴缁熻嚜鍔ㄧ敓鎴愯涓撲笟鐨勬墍鏈夎澶囷紝鐢ㄦ埛涓嶈淇敼");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("2. 榛勮壊鏍忕洰涓轰富瑕佸~鍐欎俊鎭紝鍏朵腑锛岄璁″畬鎴愭椂闂翠笉濉椂锛屽鍏ユ椂绯荤粺灏嗗綋鍓嶈妭鐐圭殑瑕佹眰瀹屾垚鏃堕棿浣滀负棰勮瀹屾垚鏃堕棿");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("3. 缁胯壊鏍忕洰涓哄鍑烘ā鏉挎椂甯︽湁鏁版嵁锛屽彲鏍规嵁闇�瑕佷慨鏀�");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("4. 鏁版嵁褰曞叆鏃堕棿涓鸿窡韪殑鏃堕棿锛屽鍏ュ悗绯荤粺鑷姩鎹㈢畻鎴愬懆");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("5. 鏁版嵁褰曞叆鏃堕棿鎴栬�呭綋鍓嶈妭鐐规爮鐩湭褰曟暟鎹椂锛屽鍏ユ椂绯荤粺鍒ゆ柇璇ヨ涓虹┖");
+                    row = sheet.createRow(sheet.getLastRowNum() + 1);
+                    cell = row.createCell(2);
+                    cell.setCellValue("6. 浠ヤ笅鏍忕洰涓轰笅鎷夐�夛細褰撳墠鑺傜偣銆佽窡韪柟寮忋�佽妭鐐硅繘灞曘�佹湁鏃犺劚鏈熼闄�");
+                }
+            }
+            // 寮瑰嚭鏂囦欢閫夋嫨瀵硅瘽妗�
+            JFileChooser fileChooser = new JFileChooser();
+            fileChooser.setSelectedFile(new File(path)); // 榛樿鏂囦欢鍚�
+            int result = fileChooser.showSaveDialog(frame1);
+            if (result == JFileChooser.APPROVE_OPTION) {
+                File selectedFile = fileChooser.getSelectedFile();
+                try (FileOutputStream outputStream = new FileOutputStream(selectedFile)) {
+                    workbook.write(outputStream);
+                    JOptionPane.showMessageDialog(frame1, "鏂囦欢淇濆瓨鎴愬姛", "鎴愬姛", JOptionPane.INFORMATION_MESSAGE);
+                } catch (IOException e) {
+                    JOptionPane.showMessageDialog(frame1, "鏂囦欢淇濆瓨澶辫触: " + e.getMessage(), "閿欒", JOptionPane.ERROR_MESSAGE);
+                }
+            }
+        } catch (
+                IOException e) {
+            e.printStackTrace();
+        }
+    }
 }
diff --git a/src/main/resources/db/csiczb1.db b/src/main/resources/db/csiczb1.db
index 806a92c..831fc47 100644
--- a/src/main/resources/db/csiczb1.db
+++ b/src/main/resources/db/csiczb1.db
Binary files differ
diff --git a/src/main/resources/mapper/cabin/CabinDao.xml b/src/main/resources/mapper/cabin/CabinDao.xml
index ee883d3..8e0300a 100644
--- a/src/main/resources/mapper/cabin/CabinDao.xml
+++ b/src/main/resources/mapper/cabin/CabinDao.xml
@@ -7,5 +7,9 @@
         select id, name
         from cabin
         where is_delete = 0
+        UNION ALL
+        SELECT
+            null AS id,
+            '' AS name
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzDismantTrackDao.xml b/src/main/resources/mapper/progressTrack/DjJdgzDismantTrackDao.xml
index c5f36d1..1401c75 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzDismantTrackDao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzDismantTrackDao.xml
@@ -65,50 +65,78 @@
         b.UPDATE_DATE
     </select>
     <select id="getStatist" resultType="com.example.server.progressTrack.Dto.StatistDismantDto">
-        select a.*,
-               sum(case when c.status=1 then 1 else 0 end) as sbcxsl
-        from (
-                 select a.id,
-                        case when a.pid=0 then a.NAME else '    '|| a.NAME end as name,
-                        case when a.pid=0 then '' || a.id else ''|| a.pid || a.SORT end as sort,
-                        count(DISTINCT b.LEVEL3_NETWORK_ID) as sbsl,
-                        count(DISTINCT b.dismant_id) as zbjsl,
-                        sum(case when b.status=1 then 1 else 0 end) as zbjcxsl,
-                        sum( CASE WHEN dismant_time IS NULL THEN 0 ELSE 1 END ) AS dismantsl,
-                        sum( CASE WHEN exit_time IS NULL THEN 0 ELSE 1 END ) AS exitsl,
-                        sum( CASE WHEN return_weight_time IS NULL THEN 0 ELSE 1 END ) AS returnsl,
-                        sum( CASE WHEN warehouse_time IS NULL THEN 0 ELSE 1 END ) AS warehousesl
-                 from dj_sys_teamgroup_class  a
-                          left join (
-                     select a.id as id2 ,a.pid as pid2 ,c.LEVEL3_NETWORK_ID,
-                            c.id as dismant_id,c.status,
-                            c.dismant_time,
-                            c.exit_time,
-                            c.return_weight_time,
-                            c.warehouse_time
-                     from 	dj_sys_teamgroup_class  a,dj_jdgz_network_level3 b,dj_jdgz_dismant_track c
-                     where a.IS_DELETE= 0 and b.IS_DELETE = 0 and c.is_delete = 0
-                       and a.AREA = 'hld'
-                       and b.TEAMGROUP_ID = a.id
-                       and c.LEVEL3_NETWORK_ID = b.id
-                       and b.LEVEL1_NETWORK_ID = ${level1Id}
-                 ) b on a.id=b.id2 or a.id = b.pid2
-                 where a.AREA = 'hld' and a.IS_DELETE = 0
-                 group by a.id,a.NAME
-             ) a
+        select a.id,
+               case when a.pid=0 then a.NAME else '    '|| a.NAME end as name,
+               case when a.pid=0 then '' || a.id else ''|| a.pid || a.SORT end as sort,
+               sum(case when b.LEVEL3_NETWORK_ID is not null then 1 else 0 end) as sbsl,
+               sum(case when sbStatus = 1 then 1 else 0 end) as sbcxsl,
+               sum(case when zbjsl is null then 0 else zbjsl end) as zbjsl,
+               sum(case when zbjwcsl is null then 0 else zbjwcsl end) as zbjcxsl,
+               sum(case when dismantsl is null then 0 else dismantsl end) as dismantsl,
+               sum(case when exitsl is null then 0 else exitsl end) as exitsl,
+               sum(case when returnsl is null then 0 else returnsl end) as returnsl,
+               sum(case when warehousesl is null then 0 else warehousesl end) as warehousesl
+        from dj_sys_teamgroup_class  a
                  left join (
-            select a.id as id2 ,a.pid as pid2,
-                   case when EXISTS(select 1 from dj_jdgz_dismant_track c where c.LEVEL3_NETWORK_ID=b.id
-                                    and (status=0 or status is null) and is_delete = 0) or not
-                             EXISTS(select 1 from dj_jdgz_dismant_track c where c.LEVEL3_NETWORK_ID=b.id
-                                    and status=1 and is_delete = 0)then 0 else 1 end as status
-            from dj_sys_teamgroup_class  a  ,dj_jdgz_network_level3 b
-            where a.IS_DELETE= 0 and b.IS_DELETE = 0
+            select a.id as id2, a.pid as pid2,c.LEVEL3_NETWORK_ID,
+                   case when EXISTS(select 1 from dj_jdgz_dismant_track s where s.LEVEL3_NETWORK_ID=b.id and (s.status=0 or s.status is null) and s.is_delete = 0) or not EXISTS(select 1 from dj_jdgz_dismant_track s where s.LEVEL3_NETWORK_ID=b.id and s.status=1 and s.is_delete = 0) then 0 else 1 end as sbStatus,
+                   sum(case when c.id is not null then 1 else 0 end) as zbjsl,
+                   sum(case when c.status=1 then 1 else 0 end) as zbjwcsl,
+                   sum(case when c.dismant_time is null then 0 else 1 end) as dismantsl,
+                   sum(case when c.exit_time is null then 0 else 1 end) as exitsl,
+                   sum(case when c.return_weight_time is null then 0 else 1 end) as returnsl,
+                   sum(case when c.warehouse_time is null then 0 else 1 end) as warehousesl
+            from 	dj_sys_teamgroup_class  a
+                        left join dj_jdgz_network_level3 b on b.IS_DELETE = 0 and b.TEAMGROUP_ID = a.id
+                        left join dj_jdgz_dismant_track c on c.is_delete = 0 and c.LEVEL3_NETWORK_ID = b.id
+            where a.IS_DELETE= 0
               and a.AREA = 'hld'
-              and b.TEAMGROUP_ID = a.id
               and b.LEVEL1_NETWORK_ID = ${level1Id}
-        ) c on a.id=c.id2 or a.id = c.pid2
+            group by a.id,a.NAME,b.id
+        ) b on a.id=b.id2 or a.id = b.pid2
+        where a.AREA = 'hld' and a.IS_DELETE = 0
         group by a.id,a.NAME
         order by sort
     </select>
+    <select id="getStatus" resultType="java.lang.Boolean">
+        SELECT CASE
+        WHEN NOT EXISTS (
+        SELECT 1
+        FROM dj_jdgz_dismant_track
+        WHERE LEVEL3_NETWORK_ID = ${level3NetworkId} AND  (status=0 or status is null)
+        ) THEN TRUE
+        ELSE FALSE
+        END
+    </select>
+    <select id="getStatist2" resultType="com.example.server.progressTrack.Dto.StatistDismantDto">
+        select a.id,a.name,
+               sum(case when b.id is not null then 1 else 0 end) as sbsl,
+               sum(case when sbStatus = 1 then 1 else 0 end) as sbcxsl,
+               sum(case when zbjsl is null then 0 else zbjsl end) as zbjsl,
+               sum(case when zbjwcsl is null then 0 else zbjwcsl end) as zbjcxsl,
+               sum(case when dismantsl is null then 0 else dismantsl end) as dismantsl,
+               sum(case when exitsl is null then 0 else exitsl end) as exitsl,
+               sum(case when returnsl is null then 0 else returnsl end) as returnsl,
+               sum(case when warehousesl is null then 0 else warehousesl end) as warehousesl
+        from cabin a
+                 left join (
+            select b.id,c.cabin_id,
+                   case when EXISTS(select 1 from dj_jdgz_dismant_track s where s.LEVEL3_NETWORK_ID=b.id and (s.status=0 or s.status is null) and s.is_delete = 0) or not EXISTS(select 1 from dj_jdgz_dismant_track s where s.LEVEL3_NETWORK_ID=b.id and s.status=1 and s.is_delete = 0) then 0 else 1 end as sbStatus,
+                   sum(case when c.id is not null then 1 else 0 end) as zbjsl,
+                   sum(case when c.status=1 then 1 else 0 end) as zbjwcsl,
+                   sum(case when c.dismant_time is null then 0 else 1 end) as dismantsl,
+                   sum(case when c.exit_time is null then 0 else 1 end) as exitsl,
+                   sum(case when c.return_weight_time is null then 0 else 1 end) as returnsl,
+                   sum(case when c.warehouse_time is null then 0 else 1 end) as warehousesl
+            from dj_jdgz_network_level3 b
+                     join dj_jdgz_dismant_track c on c.is_delete = 0 and c.LEVEL3_NETWORK_ID = b.id
+            where b.IS_DELETE = 0
+                  and b.LEVEL1_NETWORK_ID = ${level1Id}
+                  and b.TEAMGROUP_ID in (select id from dj_sys_teamgroup_class where AREA = 'hld' and IS_DELETE = 0 and (id = ${id} or pid = ${id}))
+            group by b.id,c.cabin_id
+        ) b on a.id=b.cabin_id
+        where a.IS_DELETE = 0
+        group by b.cabin_id
+        order by a.id
+    </select>
 </mapper>
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel1Dao.xml b/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel1Dao.xml
index 82072fa..eed8f3b 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel1Dao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel1Dao.xml
@@ -141,9 +141,14 @@
         GROUP BY a.id
     </select>
     <select id="getProjectList" resultType="com.example.client.dto.JComboBoxItem">
-        select id, project_name as `name`
+        select id, project_name as `name`,year
         from dj_jdgz_network_level1
         where is_delete = 0
+        UNION ALL
+        SELECT
+            null AS id,
+            '' AS name ,
+            0 AS year
         ORDER BY year desc
     </select>
 
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel3Dao.xml b/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel3Dao.xml
index ff2aa69..dad57e4 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel3Dao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzNetworkLevel3Dao.xml
@@ -33,28 +33,28 @@
         LEFT JOIN dj_jdgz_network_level1_list b on b.NETWORK_ID = c.ID
         LEFT JOIN dj_jdgz_network_level2_list d on d.ID = a.LEVEL2_NODE_ID
         where
-            a.is_delete = 0
-            and b.is_delete = 0
-            and c.is_delete = 0
-            and d.is_delete = 0
-            <if test="shipId!=null">
-                and c.ship_id = ${shipId}
-            </if>
-            <if test="deptId!=null">
-                and a.dept_id = ${deptId}
-            </if>
-            <if test="teamId!=null">
-                and a.TEAMGROUP_ID = ${teamId}
-            </if>
-            <if test="cabinId!=null">
-                and a.cabin_id  LIKE '%${cabinId}%'
-            </if>
-            <if test="type!=null and type!=''">
-                and a.type  = #{type}
-            </if>
-            <if test="name!=null and name!=''">
-                and a.name  LIKE '%${name}%'
-            </if>
+        a.is_delete = 0
+        and b.is_delete = 0
+        and c.is_delete = 0
+        and d.is_delete = 0
+        <if test="shipId!=null">
+            and c.ship_id = ${shipId}
+        </if>
+        <if test="deptId!=null">
+            and a.dept_id = ${deptId}
+        </if>
+        <if test="teamId!=null">
+            and a.TEAMGROUP_ID = ${teamId}
+        </if>
+        <if test="cabinId!=null">
+            and a.cabin_id LIKE '%${cabinId}%'
+        </if>
+        <if test="type!=null and type!=''">
+            and a.type = #{type}
+        </if>
+        <if test="name!=null and name!=''">
+            and a.name LIKE '%${name}%'
+        </if>
         group by a.id
     </select>
 
@@ -93,6 +93,38 @@
             and a.TEAMGROUP_ID = ${teamId}
         </if>
     </select>
+    <select id="getNodeList" resultType="com.example.server.progressTrack.Dto.TableNodeDto">
+        SELECT
+        b.name,
+        a.NETWORK_ID,
+        a.process_name,
+        a.ID, a.REQUIRED_COMPLETION_TIME, a.ACTUAL_COMPLETION, a.CURRENT_STATUS
+        FROM `dj_jdgz_network_level3_list` a
+        LEFT JOIN dj_jdgz_network_level3 b on b.ID = a.NETWORK_ID
+        LEFT JOIN dj_jdgz_network_level1 c on c.ID = b.LEVEL1_NETWORK_ID
+        where
+        a.is_delete = 0
+        and b.is_delete = 0
+        and c.is_delete = 0
+        <if test="shipId!=null">
+            and c.ship_id = ${shipId}
+        </if>
+        <if test="deptId!=null">
+            and b.dept_id = ${deptId}
+        </if>
+        <if test="teamId!=null">
+            and b.TEAMGROUP_ID = ${teamId}
+        </if>
+        <if test="cabinId!=null">
+            and b.cabin_id LIKE '%${cabinId}%'
+        </if>
+        <if test="type!=null and type!=''">
+            and b.type = #{type}
+        </if>
+        <if test="name!=null and name!=''">
+            and b.name LIKE '%${name}%'
+        </if>
+    </select>
 
 
 </mapper>
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml b/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
index eaf2c29..641ddf3 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
@@ -18,6 +18,10 @@
         b.LEVEL3_NODE_ID ELSE a.id
         END AS level3NodeId,
         c.id as level3NetworkId,
+        c.teamgroup_name,
+        c.dept_id,
+        c.cabin_id,
+        c.type,
         c.`NAME` as level3NetworkName,
         a.PROCESS_NAME AS level3NodeName,
         a.REQUIRED_COMPLETION_TIME,
@@ -103,37 +107,38 @@
     <select id="getReport" resultType="com.example.server.progressTrack.Dto.StatistReportsDto">
         select d.*, e.name as teamGroupName
         from (
-        select TEAMGROUP_ID,
-        count(1) as allNum,
-        sum(case when status = 'zcjxz' or status = 'lq' then 1 else 0 end) as jxzNum,
-        sum(case when status = 'lq' then 1 else 0 end) as lqNum,
-        sum(case when status = 'yq' then 1 else 0 end) as yqNum,
-        sum(case when status = 'zcwc' then 1 else 0 end) as zcwcNum,
-        sum(case when status = 'cqwc' then 1 else 0 end) as cqwcNum
-        from (
-        select b.TEAMGROUP_ID,
-        CASE
-        WHEN b.CURRENT_STATUS = 1
-        AND b.REQUIRED_COMPLETION_TIME > b.ACTUAL_COMPLETION THEN
-        'cqwc'
-        WHEN b.CURRENT_STATUS = 1 THEN
-        'zcwc'
-        WHEN b.REQUIRED_COMPLETION_TIME &lt; (SELECT datetime('now')) THEN 'yq'
-        WHEN b.REQUIRED_COMPLETION_TIME &lt; (SELECT date('now', '-' || c.advent_day || ' days')) THEN 'lq'
-        ELSE 'zcjxz'
-        END AS status
-        from dj_jdgz_network_level3 a,
-        dj_jdgz_network_level3_list b,
-        dj_jdgz_network_level1 c
-        where a.IS_DELETE = 0
-        and a.LEVEL1_NETWORK_ID = ${level1NetworkId}
-        and a.LEVEL1_NETWORK_ID = c.id
-        and b.IS_DELETE = 0
-        and b.NETWORK_ID = a.id
-        ) c
-        group by TEAMGROUP_ID
-        ) d,
-        dj_sys_teamgroup_class e
+                 select TEAMGROUP_ID,
+                        count(1)                                                           as allNum,
+                        sum(case when status = 'zcjxz' or status = 'lq' then 1 else 0 end) as jxzNum,
+                        sum(case when status = 'lq' then 1 else 0 end)                     as lqNum,
+                        sum(case when status = 'yq' then 1 else 0 end)                     as yqNum,
+                        sum(case when status = 'zcwc' then 1 else 0 end)                   as zcwcNum,
+                        sum(case when status = 'cqwc' then 1 else 0 end)                   as cqwcNum
+                 from (
+                          select a.TEAMGROUP_ID,
+                                 CASE
+                                     WHEN b.CURRENT_STATUS = 1
+                                         AND b.REQUIRED_COMPLETION_TIME > b.ACTUAL_COMPLETION THEN
+                                         'cqwc'
+                                     WHEN b.CURRENT_STATUS = 1 THEN
+                                         'zcwc'
+                                     WHEN b.REQUIRED_COMPLETION_TIME &lt; (SELECT datetime('now')) THEN 'yq'
+                                     WHEN b.REQUIRED_COMPLETION_TIME &lt;
+                                          (SELECT date('now', '-' || c.advent_day || ' days')) THEN 'lq'
+                                     ELSE 'zcjxz'
+                                     END AS status
+                          from dj_jdgz_network_level3 a,
+                               dj_jdgz_network_level3_list b,
+                               dj_jdgz_network_level1 c
+                          where a.IS_DELETE = 0
+                            and a.LEVEL1_NETWORK_ID = ${level1NetworkId}
+                            and a.LEVEL1_NETWORK_ID = c.id
+                            and b.IS_DELETE = 0
+                            and b.NETWORK_ID = a.id
+                      ) c
+                 group by TEAMGROUP_ID
+             ) d,
+             dj_sys_teamgroup_class e
         where d.TEAMGROUP_ID = e.id
     </select>
     <select id="prompt" resultType="com.example.server.progressTrack.model.DjJdgzTrackRecord">
@@ -144,7 +149,7 @@
         e.PROCESS_NAME AS level1NodeName,
         f.project_name,
         g.week_no,
-        h.name as teamGroupName
+        b.TEAMGROUP_NAME
         FROM
         `dj_jdgz_network_level3_list` a
         LEFT JOIN dj_jdgz_network_level3 b ON b.id = a.NETWORK_ID
@@ -342,5 +347,87 @@
         from dj_jdgz_track_record
         where LEVEL3_NODE_ID = ${level3NodeId}
     </select>
+    <select id="getListByImport" resultType="com.example.server.progressTrack.model.DjJdgzTrackRecord">
+        SELECT
+        c.id,
+        c.`NAME` as level3NetworkName,
+        CASE
+        WHEN
+        b.GENERAL_REPAIR_UNIT IS NOT NULL THEN b.GENERAL_REPAIR_UNIT else
+        c.GENERAL_REPAIR_UNIT
+        END as GENERAL_REPAIR_UNIT,
+        CASE
+        WHEN
+        b.GENERAL_REPAIR_UNIT_DIRECTOR IS NOT NULL THEN b.GENERAL_REPAIR_UNIT_DIRECTOR else
+        c.GENERAL_REPAIR_UNIT_DIRECTOR
+        END as GENERAL_REPAIR_UNIT_DIRECTOR,
+        CASE
+        WHEN
+        b.GENERAL_REPAIR_UNIT_CONTACT IS NOT NULL THEN
+        b.GENERAL_REPAIR_UNIT_CONTACT else
+        c.GENERAL_REPAIR_UNIT_CONTACT
+        END as GENERAL_REPAIR_UNIT_CONTACT,
+        CASE
+        WHEN
+        b.REPAIR_UNIT IS NOT NULL THEN b.REPAIR_UNIT else
+        c.REPAIR_UNIT
+        END as REPAIR_UNIT,
+        CASE
+        WHEN
+        b.REPAIR_UNIT_DIRECTOR IS NOT NULL THEN b.REPAIR_UNIT_DIRECTOR else
+        c.REPAIR_UNIT_DIRECTOR
+        END as REPAIR_UNIT_DIRECTOR,
+        CASE
+        WHEN
+        b.REPAIR_UNIT_CONTACT IS NOT NULL THEN
+        b.REPAIR_UNIT_CONTACT else
+        c.REPAIR_UNIT_CONTACT
+        END as REPAIR_UNIT_CONTACT,
+        b.track_person,
+        b.track_person_unit,
+        b.track_person_contact,
+        b.tracked_person,
+        b.tracked_person_unit,
+        b.tracked_person_contact
+        FROM
+        dj_jdgz_network_level3_list a
+        LEFT JOIN (
+        SELECT *
+        FROM dj_jdgz_track_record
+        WHERE (LEVEL3_NODE_ID, update_date) IN (
+        SELECT LEVEL3_NODE_ID, MAX(update_date)
+        FROM dj_jdgz_track_record
+        GROUP BY LEVEL3_NODE_ID
+        )
+        ) b ON b.LEVEL3_NODE_ID = a.id
+        LEFT JOIN dj_jdgz_network_level3 c ON c.id = a.NETWORK_ID
+        LEFT JOIN dj_jdgz_network_level2_list d ON d.id = c.LEVEL2_NODE_ID
+        LEFT JOIN dj_jdgz_network_level2 e ON e.id = d.NETWORK_ID
+        LEFT JOIN dj_jdgz_network_level1_list f ON f.id = e.LEVEL1_NODE_ID
+        LEFT JOIN dj_jdgz_network_level1 g ON g.id = c.LEVEL1_NETWORK_ID
+        WHERE
+        a.IS_DELETE = 0
+        and a.network_id != 10000
+        <if test="selectedIds!=null and selectedIds!=''">
+            AND c.TEAMGROUP_ID in (${selectedIds})
+        </if>
+        and (b.CURRENT_STATUS IS null OR b.CURRENT_STATUS = 0)
+        AND c.IS_DELETE = 0
+        AND d.IS_DELETE = 0
+        AND e.IS_DELETE = 0
+        AND f.IS_DELETE = 0
+        AND g.IS_DELETE = 0
+        AND g.id = ${level1Id}
+        <if test="level2Id!=null">
+            AND e.id = ${level2Id}
+        </if>
+        <if test="level2NodeId!=null">
+            AND d.id = ${level2NodeId}
+        </if>
+        GROUP BY
+        c.id
+        ORDER BY
+        a.REQUIRED_COMPLETION_TIME
+    </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/teamgroup/SysTeamGroupClassDao.xml b/src/main/resources/mapper/teamgroup/SysTeamGroupClassDao.xml
index a52152f..d9809fd 100644
--- a/src/main/resources/mapper/teamgroup/SysTeamGroupClassDao.xml
+++ b/src/main/resources/mapper/teamgroup/SysTeamGroupClassDao.xml
@@ -5,25 +5,25 @@
 
     <select id="getAll" resultType="com.example.server.teamGroup.model.SysTeamGroupClass">
         SELECT
-            a.*
+        a.*
         FROM
-            DJ_SYS_TEAMGROUP_CLASS a
+        DJ_SYS_TEAMGROUP_CLASS a
         WHERE
-            a.is_delete = 0
-            <if test="localArea!=null and (localArea=='sy' or localArea=='qd' or localArea=='hld')">
-                and a.area=#{localArea}
-            </if>
+        a.is_delete = 0
+        <if test="localArea!=null and (localArea=='sy' or localArea=='qd' or localArea=='hld')">
+            and a.area=#{localArea}
+        </if>
         ORDER BY
-            a.area desc, a.sort
+        a.area desc, a.sort
     </select>
 
     <select id="getMapAll" resultType="com.example.client.entity.MapData">
         SELECT
-            a.id,a.name
+        a.id,a.name
         FROM
-            DJ_SYS_TEAMGROUP_CLASS a
+        DJ_SYS_TEAMGROUP_CLASS a
         WHERE
-            a.is_delete = 0
+        a.is_delete = 0
         <if test="localArea!=null and (localArea=='sy' or localArea=='qd')">
             and a.area=#{localArea}
         </if>
@@ -52,7 +52,7 @@
     </select>
 
     <select id="getTeamGroupIdByNames" resultType="java.lang.Long">
-        SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE  a.is_delete=0 AND a.name IN
+        SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE a.is_delete=0 AND a.name IN
         <foreach item="item" index="index" collection="list"
                  open="(" separator="," close=")">
             #{item}
@@ -63,90 +63,103 @@
     </select>
 
     <select id="getTeamGroupIdByName" resultType="java.lang.Long">
-        SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE  a.is_delete=0 AND a.name = #{name}
+        SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE a.is_delete=0 AND a.name = #{name}
         <if test="localArea!=null and (localArea=='sy' or localArea=='qd')">
             and a.area=#{localArea}
         </if>
     </select>
     <select id="getBzTeamGroupIdByName" resultType="java.lang.Long">
-         SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE  a.is_delete=0 AND a.name = #{name}
+        SELECT a.id FROM DJ_SYS_TEAMGROUP_CLASS a WHERE a.is_delete=0 AND a.name = #{name}
         <if test="localArea!=null and (localArea=='sy' or localArea=='qd')">
             and a.area=#{localArea}
         </if>
     </select>
 
     <select id="getTeamGroupClassList" resultType="com.example.server.teamGroup.model.SysTeamGroupClass">
-         SELECT
-            a.id,a.name
-        FROM
-            DJ_SYS_TEAMGROUP_CLASS a
-        WHERE
-            a.is_delete = 0
-            and area = 'sy'
-            and pid != 0
-            order by sort
+        SELECT a.id,
+               a.name
+        FROM DJ_SYS_TEAMGROUP_CLASS a
+        WHERE a.is_delete = 0
+          and area = 'sy'
+          and pid != 0
+        order by sort
     </select>
     <select id="getList" resultType="com.example.client.dto.JComboBoxItem">
-        SELECT
-            a.id,
-            CASE
-                WHEN a.pid != 0  THEN  b.name || '/' || a.name
-                ELSE a.name
-                END AS name
-        FROM
-            DJ_SYS_TEAMGROUP_CLASS a
-                LEFT JOIN
-            DJ_SYS_TEAMGROUP_CLASS b ON a.pid = b.id
-        WHERE
-            a.is_delete = 0
+        SELECT a.id,
+               CASE
+                   WHEN a.pid != 0 THEN b.name || '/' || a.name
+                   ELSE a.name
+                   END AS name
+        FROM DJ_SYS_TEAMGROUP_CLASS a
+                 LEFT JOIN
+             DJ_SYS_TEAMGROUP_CLASS b ON a.pid = b.id
+        WHERE a.is_delete = 0
           AND a.pid != 0
-        ORDER BY
-            a.sort;
+        ORDER BY a.sort;
     </select>
     <select id="getTeamList" resultType="com.example.client.dto.JComboBoxItem">
         SELECT
-            a.id,
-            a.name
+        a.id,
+        a.name,
+        a.sort
         FROM
-            DJ_SYS_TEAMGROUP_CLASS a
+        DJ_SYS_TEAMGROUP_CLASS a
         WHERE
-            a.is_delete = 0
-          AND a.pid != 0
+        a.is_delete = 0
+        AND a.pid != 0
         <if test="pid!=null">
             AND a.pid = ${pid}
         </if>
+        UNION ALL
+        SELECT
+        null AS id,
+        '' AS name ,
+        0 AS sort
         ORDER BY
-            a.sort;
+        sort;
     </select>
     <select id="getDeptList" resultType="com.example.client.dto.JComboBoxItem">
-        SELECT
-            a.id,
-            a.name
-        FROM
-            DJ_SYS_TEAMGROUP_CLASS a
-        WHERE
-            a.is_delete = 0
+        SELECT a.id,
+               a.name,
+               a.sort
+        FROM DJ_SYS_TEAMGROUP_CLASS a
+        WHERE a.is_delete = 0
           AND a.pid = 0
-        ORDER BY
-            a.sort;
+        UNION ALL
+        SELECT null AS id,
+               ''   AS name,
+               0    AS sort
+        ORDER BY sort
     </select>
     <select id="getListByTree" resultType="com.example.server.teamGroup.model.SysTeamGroupClass">
-        SELECT
-            a.id,
-            CASE
-                WHEN a.pid = 0 THEN
-                    a.NAME ELSE '    ' || a.NAME
-                END AS name,
-            CASE
+        SELECT a.id,
+               a.pid,
+               CASE
+                   WHEN a.pid = 0 THEN
+                       a.NAME
+                   ELSE '    ' || a.NAME
+                   END AS name,
+               CASE
+                   WHEN a.pid = 0 THEN
+                       '閮ㄩ棬'
+                   ELSE '涓撲笟'
+                   END AS type,
+               CASE
 
-                WHEN a.pid = 0 THEN
-                    '' || a.id ELSE '' || a.pid || a.SORT
-                END AS sort2
-        FROM
-            dj_sys_teamgroup_class a
-        WHERE
-            a.AREA = 'hld'
+                   WHEN a.pid = 0 THEN
+                       '' || a.id
+                   ELSE '' || a.pid || a.SORT
+                   END AS sort2
+        FROM dj_sys_teamgroup_class a
+        WHERE a.AREA = 'hld'
           AND a.IS_DELETE = 0
         ORDER BY sort2
     </select>
+    <select id="getSortMax" resultType="java.lang.Integer">
+        select max(sort)
+        FROM dj_sys_teamgroup_class
+        WHERE AREA = 'hld'
+          AND IS_DELETE = 0
+          and pid = ${pid}
+    </select>
 </mapper>
diff --git "a/src/main/resources/templateFile/\344\270\211\347\272\247\347\275\221\347\273\234\345\233\276\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/resources/templateFile/\344\270\211\347\272\247\347\275\221\347\273\234\345\233\276\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
index 0da9a9b..99fe841 100644
--- "a/src/main/resources/templateFile/\344\270\211\347\272\247\347\275\221\347\273\234\345\233\276\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
+++ "b/src/main/resources/templateFile/\344\270\211\347\272\247\347\275\221\347\273\234\345\233\276\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ
diff --git "a/src/main/resources/templateFile/\345\255\220\351\203\250\344\273\266\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/resources/templateFile/\345\255\220\351\203\250\344\273\266\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
index 6c8c443..6310e4b 100644
--- "a/src/main/resources/templateFile/\345\255\220\351\203\250\344\273\266\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
+++ "b/src/main/resources/templateFile/\345\255\220\351\203\250\344\273\266\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ
diff --git "a/src/main/resources/templateFile/\350\267\237\350\270\252\350\256\260\345\275\225\345\257\274\345\205\245\346\250\241\346\235\277.xlsx" "b/src/main/resources/templateFile/\350\267\237\350\270\252\350\256\260\345\275\225\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
new file mode 100644
index 0000000..69ce045
--- /dev/null
+++ "b/src/main/resources/templateFile/\350\267\237\350\270\252\350\256\260\345\275\225\345\257\274\345\205\245\346\250\241\346\235\277.xlsx"
Binary files differ

--
Gitblit v1.9.1