From d30e385951ce03335a5023f0775fd144da3c0b88 Mon Sep 17 00:00:00 2001
From: jinlin <jinlin>
Date: 星期二, 18 三月 2025 11:18:31 +0800
Subject: [PATCH] 修改

---
 src/main/java/com/example/client/service/Level1AddOrUpdate.java                        |    2 
 src/main/java/com/example/client/service/Level2ManageService.java                      |   20 
 src/main/resources/mapper/progressTrack/ImportRecord.xml                               |   10 
 src/main/java/com/example/client/utils/Compute.java                                    |   39 +
 src/main/java/com/example/server/progressTrack/model/ImportRecord.java                 |   27 
 src/main/java/com/example/client/utils/ColorDescription.java                           |   19 
 src/main/java/com/example/client/service/DataExportManageService.java                  |   29 
 src/main/java/com/example/client/service/Level3ViewService.java                        |    2 
 src/main/java/com/example/server/progressTrack/dao/ImportRecordDao.java                |   22 
 src/main/java/com/example/server/progressTrack/model/DjJdgzHandover.java               |   44 
 src/main/java/com/example/client/service/SubunitService.java                           |   27 
 src/main/java/com/example/server/progressTrack/dao/ExportRecordDao.java                |   20 
 src/main/java/com/example/server/progressTrack/model/ExportRecord.java                 |   25 
 src/main/resources/logback-spring.xml                                                  |    2 
 src/main/java/com/example/client/utils/MultiSelectComboBox2.java                       |  116 +++
 src/main/java/com/example/client/Main.java                                             |    5 
 src/main/java/com/example/client/service/Level1ViewService.java                        |   35 
 src/main/java/com/example/client/service/Level1ManageService.java                      |   21 
 src/main/java/com/example/client/service/ImportTrackRecordService.java                 |   15 
 src/main/java/com/example/client/service/Level3AddOrUpdate.java                        |    2 
 src/main/java/com/example/client/utils/CommonTable.java                                |    1 
 src/main/resources/mapper/progressTrack/DjJdgzHandoverDao.xml                          |    2 
 src/main/resources/mapper/cabin/CabinDao.xml                                           |    2 
 src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java                   |   36 
 src/main/resources/templateFile/跟踪记录导入模板.xlsx                                          |    0 
 src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java                |    2 
 src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java                  |   20 
 src/main/java/com/example/client/service/HandoverAddOrUpdate.java                      |   51 +
 src/main/java/com/example/client/service/DataImportManageService.java                  |   37 
 src/main/java/com/example/server/utils/DownLoadTmpFile.java                            |    4 
 src/main/java/com/example/client/service/HandoverService.java                          |   16 
 src/main/java/com/example/client/service/Level2AddOrUpdate.java                        |    2 
 src/main/resources/mapper/menu/MenuDao.xml                                             |   19 
 src/main/resources/templateFile/三级网络图导入模板.xlsx                                         |    0 
 src/main/java/com/example/client/service/DismantTrackService.java                      |   56 +
 src/main/java/com/example/client/service/ImportDataService.java                        |   12 
 src/main/java/com/example/client/service/TrackRecordManageService.java                 |  311 ++++++++-
 src/main/java/com/example/server/entity/FieldMetaObjectHandler.java                    |   13 
 src/main/java/com/example/client/service/ImportLevel3Service.java                      |    2 
 src/main/java/com/example/client/utils/ColorDescriptionComboBox.java                   |  102 +++
 src/main/java/com/example/client/service/Level3ManageService.java                      |   20 
 src/main/java/com/example/server/ExportExcel/method/ExcelExport.java                   |    1 
 src/main/java/com/example/client/service/SubunitAddOrUpdate.java                       |   21 
 src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java |   36 
 src/main/resources/db/csiczb1.db                                                       |    0 
 src/main/java/com/example/client/service/ExportTrackRecordService.java                 |   58 +
 src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java           |    4 
 /dev/null                                                                              |   19 
 src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java   |  275 ++++++++
 src/main/java/com/example/client/service/Level2ViewService.java                        |   48 +
 src/main/java/com/example/client/service/Level3View2Service.java                       |   98 ++
 src/main/java/com/example/server/DataSync/service/DataSyncService.java                 |   51 +
 src/main/java/com/example/client/service/MenuService.java                              |    6 
 src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml                       |   38 
 src/main/resources/application.yml                                                     |    3 
 src/main/resources/mapper/progressTrack/ExportRecord.xml                               |   10 
 56 files changed, 1,523 insertions(+), 335 deletions(-)

diff --git a/src/main/java/com/example/client/Main.java b/src/main/java/com/example/client/Main.java
index 4bd5742..7e8a0ee 100644
--- a/src/main/java/com/example/client/Main.java
+++ b/src/main/java/com/example/client/Main.java
@@ -123,7 +123,6 @@
         hSplitPane.setDividerSize(10);
         hSplitPane.setOneTouchExpandable(true);
         hSplitPane.setContinuousLayout(true);
-
         frame.getContentPane().add(hSplitPane, BorderLayout.CENTER);
 
         JSplitPane vSplitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
@@ -172,6 +171,10 @@
         tabbedPane.addTab(title, panel);
         Component tabComponent = createTabComponent(title, tree);
         tabbedPane.setTabComponentAt(tabbedPane.getTabCount() - 1, tabComponent);// 璁剧疆鑷畾涔夋爣绛剧粍浠�//鍒囨崲鍒板綋鍓嶉〉闈�
+        if (tabbedPane.getTabCount() > 5) {
+            // 鍒犻櫎绗竴涓爣绛�
+            tabbedPane.removeTabAt(0);
+        }
         tabbedPane.setSelectedIndex(tabbedPane.getTabCount() - 1);
     }
 
diff --git a/src/main/java/com/example/client/service/DataExportManageService.java b/src/main/java/com/example/client/service/DataExportManageService.java
index 28a6341..29c0efa 100644
--- a/src/main/java/com/example/client/service/DataExportManageService.java
+++ b/src/main/java/com/example/client/service/DataExportManageService.java
@@ -3,13 +3,10 @@
 
 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 com.example.server.progressTrack.dao.ExportRecordDao;
+import com.example.server.progressTrack.model.ExportRecord;
 import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
 
 import javax.swing.*;
@@ -24,7 +21,12 @@
     @Autowired
     DataSyncService dataSyncService;
     @Autowired
+    ExportRecordDao exportRecordDao;
+    @Autowired
     ImportDataService importDataService;
+
+    private List<ColumnDto> columnDto;
+    private JTable table;
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
         JPanel panel = new JPanel(new BorderLayout()); // 浣跨敤 BorderLayout
@@ -43,6 +45,8 @@
         JLabel label1 = new JLabel("鎻愮ず淇℃伅");
         JTextArea tips = new JTextArea(7, 30);
         tips.setEnabled(false);
+        tips.setForeground(Color.BLACK); // 璁剧疆涓洪粦鑹�
+        tips.setDisabledTextColor(Color.BLACK);
         tips.setLineWrap(true);
 
         JPanel center = new JPanel(new BorderLayout()); // 涓� left 璁剧疆甯冨眬
@@ -54,12 +58,12 @@
         left.add(center, BorderLayout.CENTER);
 
         JLabel label2 = new JLabel("瀵煎嚭璁板綍");
-        List<DataExportDto> list = new ArrayList<>();
-        List<ColumnDto> columnDto = new ArrayList<>();
+        List<ExportRecord> list = exportRecordDao.getList();
+        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);
+        columnDto.add(new ColumnDto("瀵煎嚭鏃堕棿", "createDate", 265, null, false, null, null));
+        columnDto.add(new ColumnDto("鎿嶄綔浜�", "userName", 265, null, false, null, null));
+        table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
@@ -72,10 +76,13 @@
         btnExport.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                dataSyncService.export();
+                dataSyncService.export(tips);
             }
         });
 
         return panel;
     }
+    public void refresh(List<ExportRecord> list){
+        CommonTable.refreshTable(list, columnDto,table);
+    }
 }
diff --git a/src/main/java/com/example/client/service/DataImportManageService.java b/src/main/java/com/example/client/service/DataImportManageService.java
index 4d3b099..c990685 100644
--- a/src/main/java/com/example/client/service/DataImportManageService.java
+++ b/src/main/java/com/example/client/service/DataImportManageService.java
@@ -5,10 +5,10 @@
 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.progressTrack.dao.ImportRecordDao;
+import com.example.server.progressTrack.model.ExportRecord;
+import com.example.server.progressTrack.model.ImportRecord;
 import com.example.server.utils.CacheUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -30,7 +30,11 @@
     @Autowired
     DataSyncService dataSyncService;
     @Autowired
+    ImportRecordDao importRecordDao;
+    @Autowired
     ImportDataService importDataService;
+    private List<ColumnDto> columnDto;
+    private JTable table;
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
         JPanel panel = new JPanel(new BorderLayout());
@@ -48,10 +52,10 @@
         JPanel center = new JPanel(); // 涓� left 璁剧疆甯冨眬
         GridBagLayout layout = new GridBagLayout();
         center.setLayout(layout);
-        center.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/2));
+        center.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/3));
 
         JPanel south = new JPanel(new BorderLayout()); // 涓� left 璁剧疆甯冨眬
-        south.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/2));
+        south.setPreferredSize(new Dimension((width - 10) / 2, (height-50)/3*2));
 
 
         String site = (String) CacheUtils.get("site", "site");
@@ -67,6 +71,8 @@
         JLabel label1 = new JLabel("鎻愮ず淇℃伅");
         JTextArea tips = new JTextArea(7, 30);
         tips.setEnabled(false);
+        tips.setForeground(Color.BLACK); // 璁剧疆涓洪粦鑹�
+        tips.setDisabledTextColor(Color.BLACK);
         tips.setLineWrap(true);
         south.add(label1,BorderLayout.NORTH);
         south.add(tips,BorderLayout.CENTER);
@@ -82,7 +88,7 @@
                 SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {
                     @Override
                     protected String doInBackground() throws Exception {
-                        String flag =  importDataService.UnzipFile();
+                        String flag =  importDataService.UnzipFile(tips);
                         return flag;
                     }
 
@@ -95,9 +101,10 @@
                             // 鍒锋柊琛ㄦ牸鏁版嵁锛堝鏋滀笂浼犳垚鍔燂級
                             if (uploadSucceeded.equals("true")) {
                                 waitUtil.dispose();
-                                System.out.println("瀵煎叆鎴愬姛鏃堕棿" + new Date());
+                                tips.setText("瀵煎叆鎴愬姛"+new Date());
                             } else {
                                 waitUtil.dispose();
+                                tips.setText("瀵煎叆澶辫触"+new Date());
                                 JOptionPane.showMessageDialog(null, uploadSucceeded, "鎻愮ず", JOptionPane.ERROR_MESSAGE);
                             }
 
@@ -118,15 +125,15 @@
         left.add(south,BorderLayout.SOUTH);
 
         JLabel label2 = new JLabel("瀵煎叆璁板綍");
-        List<DataImportDto> list  = new ArrayList<>();
+        List<ImportRecord> list  = importRecordDao.getList();
 
-        List<ColumnDto> columnDto = new ArrayList<>();
+        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);
+        columnDto.add(new ColumnDto("鏁版嵁婧�", "importSite", 200, null, false, null,null));
+        columnDto.add(new ColumnDto("瀵煎叆鏃堕棿", "createDate", 200, null, false, null,null));
+        columnDto.add(new ColumnDto("鎿嶄綔浜�", "userName", 200, null, false, null,null));
+        table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
@@ -138,6 +145,10 @@
 
         return panel;
     }
+
+    public void refresh(List<ImportRecord> list){
+        CommonTable.refreshTable(list, columnDto,table);
+    }
 }
 
 
diff --git a/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java b/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
index 86726ce..10d95ee 100644
--- a/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/DismantTrackAddOrUpdate.java
@@ -5,6 +5,7 @@
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
 import com.example.client.utils.ComplexTable;
+import com.example.client.utils.Compute;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.Dto.StatistReportsDto;
 import com.example.server.progressTrack.model.DjJdgzDismantTrack;
@@ -51,10 +52,10 @@
         panel.setPreferredSize(new Dimension(width, height));
 
         JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        topJpanel.setPreferredSize(new Dimension(width - 10, 37));
+        topJpanel.setPreferredSize(new Dimension(width - 10, 40));
 
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,frame)));
 
         panel.add(centerJpanel, BorderLayout.CENTER);
         panel.add(topJpanel, BorderLayout.NORTH);
@@ -105,7 +106,6 @@
 
         trackTable = CommonTable.createCommonTable(list, columnDto);
         trackTable.setRowHeight(25);
-
         trackTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
 
@@ -145,6 +145,7 @@
         btnSave.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
+                trackTable.getCellEditor().stopCellEditing();
                 SysUser user = (SysUser) CacheUtils.get("user", "user");
                 if (user.getTeamgroup()==null||user.getTeamgroup().equals(nowLevel3.getTeamgroupId().toString())){
                     CommonTable.saveTableList(list, trackTable, columnDto);
@@ -165,8 +166,19 @@
 
         JScrollPane scrollPane = new JScrollPane(trackTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         scrollPane.setViewportView(trackTable);
-        scrollPane.setPreferredSize(new Dimension(width - 20, height - 130));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(40,frame)));
         centerJpanel.add(scrollPane);
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,frame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20,Compute.ComputeHeightWithScroll(40,frame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
diff --git a/src/main/java/com/example/client/service/DismantTrackService.java b/src/main/java/com/example/client/service/DismantTrackService.java
index 878f4b6..d0d0fbd 100644
--- a/src/main/java/com/example/client/service/DismantTrackService.java
+++ b/src/main/java/com/example/client/service/DismantTrackService.java
@@ -3,6 +3,7 @@
 import com.example.client.dto.ColumnDto;
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
@@ -43,9 +44,13 @@
         JPanel jLeft = new JPanel(new BorderLayout());
 
         JPanel top = new JPanel();
+        JPanel center = new JPanel();
 
-        jLeft.setPreferredSize(new Dimension(600, height));
         top.setPreferredSize(new Dimension(600, 100));
+        center.setPreferredSize(new Dimension(600, Compute.ComputeHeight(100,frame)));
+        jLeft.setPreferredSize(new Dimension(600, Compute.ComputeHeight(0,frame)));
+        jLeft.add(center, BorderLayout.CENTER);
+        jLeft.add(top, BorderLayout.NORTH);
 
         GridBagLayout layout = new GridBagLayout();
         top.setLayout(layout);
@@ -57,7 +62,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<>();
@@ -107,21 +112,19 @@
         top.add(sb, new GBC(4, 1, 2, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
         top.add(query, new GBC(6, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
-        jLeft.add(top, BorderLayout.NORTH);
-
         List<ColumnDto> columnDto = new ArrayList<>();
-        list = level3Service.getList(null, deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0],null);
+        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", 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("璁惧鍚嶇О", "name", 200, null, false, null, null));
+        columnDto.add(new ColumnDto("閮ㄩ棬", "deptId", 150, "dict", false, null, deptList));
+        columnDto.add(new ColumnDto("涓撲笟", "teamgroupId", 150, "dict", false, null, teamList));
         columnDto.add(new ColumnDto("鑸卞", "cabinId", 100, "dict", false, null, cabinList));
         columnDto.add(new ColumnDto("绫诲埆", "type", 100, null, false, null, null));
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
         subTable.setRowHeight(25);
-        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         comboBox.addItemListener(new ItemListener() {
             public void itemStateChanged(final ItemEvent event) {
@@ -132,7 +135,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
@@ -171,7 +174,7 @@
                         String type = comboBox4.getSelectedItem().toString();
 
                         Long shipId = shipMap.get(content);
-                        list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                        list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                         CommonTable.refreshTable(list, columnDto, subTable);
                         subTable.setRowHeight(25);
@@ -201,7 +204,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
@@ -229,7 +232,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
@@ -257,7 +260,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
@@ -280,7 +283,7 @@
         query.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                list = level3Service.getList(null, null, null, null, null,sb.getText());
+                list = level3Service.getList(null, null, null, null, null, sb.getText());
 
                 CommonTable.refreshTable(list, columnDto, subTable);
                 subTable.setRowHeight(25);
@@ -300,11 +303,26 @@
             }
         });
 
-        JScrollPane scrollTable = new JScrollPane(subTable);
-        jLeft.add(scrollTable, BorderLayout.CENTER);
+        JScrollPane scrollTable = new JScrollPane(subTable,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
+        scrollTable.setViewportView(subTable);
+        scrollTable.setPreferredSize(new Dimension(600,Compute.ComputeHeightWithScroll(100,frame)));
+        center.add(scrollTable);
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                center.setPreferredSize(new Dimension(600, Compute.ComputeHeight(100,frame)));
+                jLeft.setPreferredSize(new Dimension(600, Compute.ComputeHeight(0,frame)));
+                scrollTable.setPreferredSize(new Dimension(600,Compute.ComputeHeightWithScroll(100,frame)));
+                jLeft.revalidate();
+                jLeft.repaint();
+                center.revalidate();
+                center.repaint();
+                scrollTable.revalidate();
+                scrollTable.repaint();
+            }
+        });
 
-        JPanel track = addOrUpdate.createTrack(width - 620, height, list.get(0),frame);
-
+        JPanel track = addOrUpdate.createTrack(width - 620, height, list.get(0), frame);
 
         // 鍒涘缓姘村钩鍒嗗壊闈㈡澘
         JSplitPane hSplitPane = new JSplitPane(
diff --git a/src/main/java/com/example/client/service/ExportTrackRecordService.java b/src/main/java/com/example/client/service/ExportTrackRecordService.java
index 6383426..86cb788 100644
--- a/src/main/java/com/example/client/service/ExportTrackRecordService.java
+++ b/src/main/java/com/example/client/service/ExportTrackRecordService.java
@@ -5,7 +5,9 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.utils.CommonTable;
 import com.example.client.utils.GBC;
+import com.example.client.utils.MultiSelectComboBox2;
 import com.example.client.utils.RequiredLabel;
+import com.example.server.ExportExcel.dto.ExcelColumnDto;
 import com.example.server.progressTrack.model.DjJdgzTrackRecord;
 import com.example.server.progressTrack.service.DjJdgzNetworkLevel1Service;
 import com.example.server.progressTrack.service.DjJdgzNetworkLevel3ListService;
@@ -13,6 +15,7 @@
 import com.example.server.progressTrack.service.DjJdgzTrackRecordService;
 import com.example.server.teamGroup.service.SysTeamGroupClassService;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.ss.usermodel.HorizontalAlignment;
 import org.jdesktop.swingx.JXDatePicker;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
@@ -23,10 +26,8 @@
 import java.io.File;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
-import java.util.Date;
-import java.util.HashMap;
+import java.util.*;
 import java.util.List;
-import java.util.Map;
 
 @Service
 public class ExportTrackRecordService {
@@ -58,6 +59,28 @@
 
         GridBagLayout layout = new GridBagLayout();
         frame1.setLayout(layout);
+
+        List<ExcelColumnDto> columnDto = new ArrayList<>();
+
+        columnDto.add(new ExcelColumnDto("涓�绾ц妭鐐�", "Level1NodeName", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("浜岀骇鑺傜偣", "Level2NodeName", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("椤圭洰鍚嶇О", "Level3NetworkName", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("褰撳墠鑺傜偣", "Level3NodeName", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("涓撲笟", "teamgroupName", 20, HorizontalAlignment.CENTER));
+        columnDto.add(new ExcelColumnDto("鎬绘壙淇崟浣嶅強璐熻矗浜�", "GeneralRepair", 25, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("鍒嗘壙淇崟浣嶅強璐熻矗浜�", "Repair", 25, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("璺熻釜鏂瑰紡", "trackMethodStr", 10, HorizontalAlignment.CENTER));
+        columnDto.add(new ExcelColumnDto("鍔╀慨浜�", "TrackPerson", 25, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("鍘傛柟", "TrackedPerson", 25, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("璺熻釜鍦扮偣", "TrackLocation", 10, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("鑺傜偣杩涘睍", "status", 10, HorizontalAlignment.CENTER));
+        columnDto.add(new ExcelColumnDto("鑴辨湡椋庨櫓", "hasDelayRiskStr", 10, HorizontalAlignment.CENTER));
+        columnDto.add(new ExcelColumnDto("棰勮瀹屾垚鏃堕棿", "EstimatedCompletionTime", 15, HorizontalAlignment.CENTER));
+        columnDto.add(new ExcelColumnDto("瀛樺湪闂", "Problem", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("鍚庣画璁″垝", "FollowupPlan", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("澶囨敞", "Remark", 20, HorizontalAlignment.LEFT));
+        columnDto.add(new ExcelColumnDto("濉啓鏃堕棿", "UpdateDate", 15, HorizontalAlignment.CENTER));
+
 
         JComboBoxItem[] statusList = {
                 new JComboBoxItem(0L, "杩涜涓�"),
@@ -108,6 +131,14 @@
         JLabel JLabel7 = new JLabel("缁撴潫鏃ユ湡");
         JXDatePicker endDate = new JXDatePicker();
         endDate.setPreferredSize(new Dimension(300, 28));
+
+        List<String> itemList = new ArrayList<>();
+        for (ExcelColumnDto dto : columnDto) {
+            itemList.add(dto.getColumnDesc()); // 灏� dto.getColumnDesc() 娣诲姞鍒� List 涓�
+        }
+
+        String[] items = itemList.toArray(new String[0]);
+        MultiSelectComboBox2 mulcomboBox = new MultiSelectComboBox2(items, null, null);
 
         comboBox.addItemListener(new ItemListener() {
             @Override
@@ -167,8 +198,9 @@
 
         frame1.add(JLabel7, new GBC(0, 7, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
         frame1.add(endDate, new GBC(1, 7, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(mulcomboBox, new GBC(1, 8, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
-        frame1.add(exportButton, new GBC(0, 8, 2, 1).setWeight(0, 0));
+        frame1.add(exportButton, new GBC(0, 11, 2, 1).setWeight(0, 0));
 
         exportButton.addActionListener(new ActionListener() {
             @Override
@@ -192,7 +224,7 @@
 
                 if (projectItem != null) {
                     level1NetworkId = projectItem.getId();
-                }else {
+                } else {
                     JOptionPane.showMessageDialog(null, "娌℃湁閫夋嫨宸ョ▼", "鎻愮ず", JOptionPane.WARNING_MESSAGE);
                     return;
                 }
@@ -212,17 +244,21 @@
                     istq = Math.toIntExact(tq.getId());
                 }
 
-                String filePath = "璺熻釜璁板綍鎶ヨ〃.xlsx";
-                djJdgzTrackRecordService.exportExcel(filePath, teamGroupId, level1NetworkId, level3NetworkId, level3NodeId, status, beginDate2, endDate2, istq);
+                List<ExcelColumnDto> columnDto2 = new ArrayList<>();
+                Set<Integer> selectedIndices = mulcomboBox.getSelectedIndices();
+
+                for (Integer index : selectedIndices) {
+                    columnDto2.add(columnDto.get(index));
+                }
+
+                String fileName = "璺熻釜璁板綍鎶ヨ〃.xlsx";
                 JFileChooser fileChooser = new JFileChooser();
-                fileChooser.setSelectedFile(new File(filePath));
+                fileChooser.setSelectedFile(new File(fileName));
                 int result = fileChooser.showSaveDialog(frame1);
 
                 if (result == JFileChooser.APPROVE_OPTION) {
                     File selectedFile = fileChooser.getSelectedFile();
-                    // 灏嗘枃浠剁Щ鍔ㄥ埌鐢ㄦ埛閫夋嫨鐨勪綅缃�
-                    File originalFile = new File(filePath);
-                    originalFile.renameTo(selectedFile);
+                    djJdgzTrackRecordService.exportExcel(selectedFile.getPath(), teamGroupId, level1NetworkId, level3NetworkId, level3NodeId, status, beginDate2, endDate2, istq, columnDto2);
                     JOptionPane.showMessageDialog(frame1, "鏂囦欢瀵煎嚭鎴愬姛");
                 } else {
                     JOptionPane.showMessageDialog(frame1, "鏂囦欢瀵煎嚭鍙栨秷");
diff --git a/src/main/java/com/example/client/service/HandoverAddOrUpdate.java b/src/main/java/com/example/client/service/HandoverAddOrUpdate.java
index 0d24746..a0c3fdf 100644
--- a/src/main/java/com/example/client/service/HandoverAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/HandoverAddOrUpdate.java
@@ -93,11 +93,48 @@
         handoverTimeDate.setDate(parse);
 
         JLabel JLabel4 = new JLabel("浜ゆ帴鎯呭喌璇存槑");
-        JTextArea handoverSitua = new JTextArea(5, 40);
+        /*JTextArea handoverSitua = new JTextArea(5, 40);
         handoverSitua.setLineWrap(true);
-        handoverSitua.setPreferredSize(new Dimension(600,200));
-        if (StringUtils.isNotBlank(data.getHandoverSituation())) {
-            handoverSitua.setText(data.getHandoverSituation());
+        handoverSitua.setPreferredSize(new Dimension(600,200));*/
+        JTabbedPane tabbedPane = new JTabbedPane();
+
+        // 鍒涘缓涓撲笟璇存槑 JTextArea
+        JTextArea professExplan = new JTextArea(5, 40);
+        professExplan.setLineWrap(true);
+        professExplan.setWrapStyleWord(true);
+        professExplan.setPreferredSize(new Dimension(600, 200));
+        JScrollPane professionalScrollPane = new JScrollPane(professExplan);
+        professionalScrollPane.setPreferredSize(new Dimension(600, 200));
+
+        // 鍒涘缓閮ㄩ棬璇存槑 JTextArea
+        JTextArea deptExplan = new JTextArea(5, 40);
+        deptExplan.setLineWrap(true);
+        deptExplan.setWrapStyleWord(true);
+        deptExplan.setPreferredSize(new Dimension(600, 200));
+        JScrollPane departmentScrollPane = new JScrollPane(deptExplan);
+        departmentScrollPane.setPreferredSize(new Dimension(600, 200));
+
+        // 鍒涘缓TD璇存槑 JTextArea
+        JTextArea tdExplan = new JTextArea(5, 40);
+        tdExplan.setLineWrap(true);
+        tdExplan.setWrapStyleWord(true);
+        tdExplan.setPreferredSize(new Dimension(600, 200));
+        JScrollPane tdScrollPane = new JScrollPane(tdExplan);
+        tdScrollPane.setPreferredSize(new Dimension(600, 200));
+
+        // 灏� JTextArea 娣诲姞鍒� JTabbedPane
+        tabbedPane.addTab("涓撲笟浜ゆ帴璇存槑", professionalScrollPane);
+        tabbedPane.addTab("閮ㄩ棬浜ゆ帴璇存槑", departmentScrollPane);
+        tabbedPane.addTab("鑹囬槦浜ゆ帴璇存槑", tdScrollPane);
+
+        if (StringUtils.isNotBlank(data.getProfessExplan())) {
+            professExplan.setText(data.getProfessExplan());
+        }
+        if (StringUtils.isNotBlank(data.getDeptExplan())) {
+            deptExplan.setText(data.getDeptExplan());
+        }
+        if (StringUtils.isNotBlank(data.getTdExplan())) {
+            tdExplan.setText(data.getTdExplan());
         }
 
         JLabel JLabel5 = new JLabel("闄勪欢");
@@ -128,7 +165,7 @@
         frame1.add(handoverTimeDate, new GBC(1, 3, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
         frame1.add(JLabel4, new GBC(0, 4, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
-        frame1.add(handoverSitua, new GBC(1, 4, 1, 5).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(tabbedPane, new GBC(1, 4, 1, 5).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
         frame1.add(JLabel5, new GBC(0, 9, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
         frame1.add(jPanel, new GBC(1, 9, 6, 5).setAnchor(GBC.SOUTHWEST).setInsets(5));
@@ -144,7 +181,9 @@
                 data.setCurrentTeam(currentTeamDesc.getText());
                 data.setHandoverTeam(handoverTeamDesc.getText());
                 data.setHandoverTime(sdFormat.format(handoverTimeDate.getDate()));
-                data.setHandoverSituation(handoverSitua.getText());
+                data.setDeptExplan(deptExplan.getText());
+                data.setProfessExplan(professExplan.getText());
+                data.setTdExplan(tdExplan.getText());
                 Long id = handoverService.save(data);
                 uploadFile.save(id);
                 List<DjJdgzHandover> list = handoverService.getList(project.getId());
diff --git a/src/main/java/com/example/client/service/HandoverService.java b/src/main/java/com/example/client/service/HandoverService.java
index d548e2f..e459d71 100644
--- a/src/main/java/com/example/client/service/HandoverService.java
+++ b/src/main/java/com/example/client/service/HandoverService.java
@@ -71,14 +71,14 @@
 
         columnDto =  new ArrayList<>();
         //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
-        columnDto.add(new ColumnDto("搴忓彿", "", (width - 10) / 8, "autoCreate", false, null,null));
-        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", (width - 10) / 8, null, false, null,null));
-        columnDto.add(new ColumnDto("浜ゆ柟鑹囬槦", "currentTeam", (width - 10) / 8, null, false, null,null));
-        columnDto.add(new ColumnDto("鎺ユ柟鑹囬槦", "handoverTeam", (width - 10) / 8, null, false, null,null));
-        columnDto.add(new ColumnDto("浜ゆ帴鏃堕棿", "handoverTime", (width - 10) / 8, "selectDate", false, null,null));
-        columnDto.add(new ColumnDto("浜ゆ帴鎯呭喌璇存槑", "handoverSituation", (width - 10) / 8, null, false, null,null));
-        columnDto.add(new ColumnDto("闄勪欢", "fileName", (width - 10) / 8, "", false, null,null));
-        columnDto.add(new ColumnDto("鎿嶄綔", "", (width - 10) / 8, "", true, buttonList,null));
+        columnDto.add(new ColumnDto("搴忓彿", "", (width - 10) / 7, "autoCreate", false, null,null));
+        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", (width - 10) / 7, null, false, null,null));
+        columnDto.add(new ColumnDto("浜ゆ柟鑹囬槦", "currentTeam", (width - 10) / 7, null, false, null,null));
+        columnDto.add(new ColumnDto("鎺ユ柟鑹囬槦", "handoverTeam", (width - 10) / 7, null, false, null,null));
+        columnDto.add(new ColumnDto("浜ゆ帴鏃堕棿", "handoverTime", (width - 10) / 7, "selectDate", false, null,null));
+      /*  columnDto.add(new ColumnDto("浜ゆ帴鎯呭喌璇存槑", "handoverSituation", (width - 10) / 8, null, false, null,null));
+      */  columnDto.add(new ColumnDto("闄勪欢", "fileName", (width - 10) / 7, "", false, null,null));
+        columnDto.add(new ColumnDto("鎿嶄綔", "", (width - 10) / 7, "", true, buttonList,null));
 
         table = CommonTable.createCommonTable(list[0], columnDto);
         table.setRowHeight(25);
diff --git a/src/main/java/com/example/client/service/ImportDataService.java b/src/main/java/com/example/client/service/ImportDataService.java
index 4f14b4a..11cd7b8 100644
--- a/src/main/java/com/example/client/service/ImportDataService.java
+++ b/src/main/java/com/example/client/service/ImportDataService.java
@@ -190,16 +190,21 @@
         });
         return jPanel;
     }
-    public String UnzipFile(){
+    public String UnzipFile(JTextArea tips){
+        String massage = "";
         String filePath = model.getValueAt(0, 0).toString();
         String outputDirectory = UnzipPath;
         try {
 
             File zipFile = new File(filePath);
             if (!zipFile.exists()) {
+                massage = "ZIP鏂囦欢涓嶅瓨鍦細" + filePath;
+                tips.setText(tips.getText() + massage);
                 throw new FileNotFoundException("ZIP鏂囦欢涓嶅瓨鍦細" + filePath);
             }
             if (!zipFile.canRead()) {
+                massage = "鏃犳硶璇诲彇ZIP鏂囦欢锛岃妫�鏌ユ枃浠舵潈闄愶細" + filePath;
+                tips.setText(tips.getText() + massage);
                 System.err.println("鏃犳硶璇诲彇ZIP鏂囦欢锛岃妫�鏌ユ枃浠舵潈闄愶細" + filePath);
                 return "false";
             }
@@ -240,8 +245,9 @@
                     }
                 }
             }
-            System.out.println("鏂囦欢瑙e帇瀹屾垚锛岀洰鏍囩洰褰曪細" + outputDirectory);
-            dataSyncService.importData();
+            massage = "鏂囦欢瑙e帇瀹屾垚锛岀洰鏍囩洰褰曪細" + outputDirectory;
+            tips.setText(tips.getText() + massage);
+            dataSyncService.importData(tips);
         } catch (IOException e) {
             e.printStackTrace();
             return "false";
diff --git a/src/main/java/com/example/client/service/ImportLevel3Service.java b/src/main/java/com/example/client/service/ImportLevel3Service.java
index 2e389e5..2687805 100644
--- a/src/main/java/com/example/client/service/ImportLevel3Service.java
+++ b/src/main/java/com/example/client/service/ImportLevel3Service.java
@@ -79,7 +79,7 @@
         JLabel label0 = new JLabel("宸ョ▼");
         JComboBox<JComboBoxItem> comboBox0 = new JComboBox<>(projectList);
 
-        JLabel label1 = new JLabel("浜岀骇缃戠粶鍥�");
+        JLabel label1 = new JLabel("涓�绾х綉缁滃浘鑺傜偣");
         JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>();
         comboBox1.setModel(new DefaultComboBoxModel<>(level2List));
 
diff --git a/src/main/java/com/example/client/service/ImportTrackRecordService.java b/src/main/java/com/example/client/service/ImportTrackRecordService.java
index b411498..952b9c8 100644
--- a/src/main/java/com/example/client/service/ImportTrackRecordService.java
+++ b/src/main/java/com/example/client/service/ImportTrackRecordService.java
@@ -4,7 +4,6 @@
 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;
@@ -38,7 +37,7 @@
     @Autowired
     private Level3ManageService level3ManageService;
     @Autowired
-    private DjJdgzNetworkLevel3Service level3Service;
+    private TrackRecordManageService trackRecordManageService;
     @Autowired
     private DjJdgzNetworkLevel2ListService level2ListService;
     @Autowired
@@ -83,7 +82,7 @@
         JLabel label0 = new JLabel("宸ョ▼");
         JComboBox<JComboBoxItem> comboBox0 = new JComboBox<>(projectList);
 
-        JLabel label1 = new JLabel("浜岀骇缃戠粶鍥�");
+        JLabel label1 = new JLabel("涓�绾х綉缁滃浘鑺傜偣");
         JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>();
         comboBox1.setModel(new DefaultComboBoxModel<>(level2List));
 
@@ -297,7 +296,7 @@
 
 
                         String filePath = result.toString();
-                        String flag = level3Service.importDiagramFromExcel(filePath, level1Id[0], level2Id[0], level2NodeId[0]);
+                        String flag = djJdgzTrackRecordService.importDiagramFromExcel(filePath);
                         return flag;
                     }
 
@@ -315,11 +314,11 @@
                                 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);
+                                        "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�", ""
+                                };
+                                List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(level1Id[0], deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0], 0, null);
                                 CommonTable.refreshTable(list, columnDto, subTable);
-                                level3ManageService.tableModelListener(list, subTable, jFrame);
+                                trackRecordManageService.tableModelListener(subTable, jFrame, list);
                                 System.out.println("瀵煎叆鎴愬姛鏃堕棿" + new Date());
                             } else {
                                 waitUtil.dispose();
diff --git a/src/main/java/com/example/client/service/Level1AddOrUpdate.java b/src/main/java/com/example/client/service/Level1AddOrUpdate.java
index 1f313d9..a07c000 100644
--- a/src/main/java/com/example/client/service/Level1AddOrUpdate.java
+++ b/src/main/java/com/example/client/service/Level1AddOrUpdate.java
@@ -128,7 +128,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
diff --git a/src/main/java/com/example/client/service/Level1ManageService.java b/src/main/java/com/example/client/service/Level1ManageService.java
index 0406e9b..a393660 100644
--- a/src/main/java/com/example/client/service/Level1ManageService.java
+++ b/src/main/java/com/example/client/service/Level1ManageService.java
@@ -4,6 +4,7 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
 import com.example.server.progressTrack.model.DjJdgzShip;
@@ -41,13 +42,14 @@
     private List<ColumnDto> columnDto;
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
-        JPanel panel = new JPanel();
+        JPanel panel = new JPanel(new BorderLayout());
 
         JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        topJpanel.setPreferredSize(new Dimension(width, 37));
+        topJpanel.setPreferredSize(new Dimension(width, 40));
         topJpanel.setBackground(Color.WHITE);
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,jFrame)));
         centerJpanel.setBackground(Color.WHITE);
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
@@ -116,8 +118,19 @@
         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 - 100));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,jFrame)));
         centerJpanel.add(scrollPane);
+        jFrame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,jFrame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20,Compute.ComputeHeightWithScroll(40,jFrame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
diff --git a/src/main/java/com/example/client/service/Level1ViewService.java b/src/main/java/com/example/client/service/Level1ViewService.java
index 2660d99..282e15b 100644
--- a/src/main/java/com/example/client/service/Level1ViewService.java
+++ b/src/main/java/com/example/client/service/Level1ViewService.java
@@ -3,6 +3,7 @@
 import com.example.client.dto.ColumnDto;
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.server.progressTrack.Dto.NetworkNodeStatusDto;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1List;
@@ -11,6 +12,8 @@
 import com.example.server.progressTrack.service.DjJdgzShipService;
 import com.example.server.progressTrack.service.NetWorkDiagramService;
 import com.mxgraph.swing.mxGraphComponent;
+import com.mxgraph.util.mxPoint;
+import com.mxgraph.util.mxRectangle;
 import com.mxgraph.view.mxGraph;
 import com.teamdev.jxbrowser.chromium.StopFindAction;
 import org.jdesktop.swingx.JXDatePicker;
@@ -37,12 +40,12 @@
     @Autowired
     private NetWorkDiagramService netWorkDiagramService;
 
-    public JPanel createTable(Integer width, Integer height) {
+    public JPanel createTable(Integer width, Integer height, JFrame frame) {
         height = height - 100;
         JPanel panel = new JPanel();
 
         JPanel jLeft = new JPanel(new BorderLayout());
-        jLeft.setPreferredSize(new Dimension(width / 4 - 20, height));
+        jLeft.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeight(0, frame)));
 
         JPanel diagram = new JPanel(new BorderLayout());
         diagram.setPreferredSize(new Dimension(width - width / 4, height));
@@ -54,16 +57,27 @@
         //columnDto.add(new ColumnDto("ID", "id", -1, null,false));
 
 
-        columnDto.add(new ColumnDto("搴忓彿", "", width / 8 - 10, "autoCreate", false, null,null));
-        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", width / 8, null, false, null,null));
+        columnDto.add(new ColumnDto("搴忓彿", "", width / 8 - 10, "autoCreate", false, null, null));
+        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", width / 8, null, false, null, null));
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
         subTable.setRowHeight(25);
-        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         JScrollPane scrollTable = new JScrollPane(subTable);
+        scrollTable.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeightWithScroll(0, frame)));
         jLeft.add(scrollTable, BorderLayout.CENTER);
-
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                jLeft.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeight(40, frame)));
+                scrollTable.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeightWithScroll(40, frame)));
+                jLeft.revalidate();
+                jLeft.repaint();
+                scrollTable.revalidate();
+                scrollTable.repaint();
+            }
+        });
         // 鍒涘缓姘村钩鍒嗗壊闈㈡澘
         JSplitPane hSplitPane = new JSplitPane(
                 JSplitPane.HORIZONTAL_SPLIT,
@@ -86,7 +100,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
@@ -110,7 +124,12 @@
                     int r = subTable.getSelectedRow();
                     DjJdgzNetworkLevel1 data = list.get(r);
                     List<NetworkNodeStatusDto> nodeStatusList = level1Service.getNodeStatusData(data.getId());
-                    graph2[0] = netWorkDiagramService.getCsDiagram(graph2[0], data.getContent(), nodeStatusList, diagram.getPreferredSize().width, diagram.getPreferredSize().height);
+                    mxGraph csDiagram = netWorkDiagramService.getCsDiagram(graph2[0], data.getContent(), nodeStatusList, diagram.getPreferredSize().width, diagram.getPreferredSize().height);
+                    if (nodeStatusList != null && nodeStatusList.size() > 0) {
+                        graph2[0] = csDiagram;
+                    } else {
+                        graph2[0].removeCells(graph2[0].getChildVertices(graph2[0].getDefaultParent()));
+                    }
                 }
             }
         });
diff --git a/src/main/java/com/example/client/service/Level2AddOrUpdate.java b/src/main/java/com/example/client/service/Level2AddOrUpdate.java
index f2e72bf..709dd5e 100644
--- a/src/main/java/com/example/client/service/Level2AddOrUpdate.java
+++ b/src/main/java/com/example/client/service/Level2AddOrUpdate.java
@@ -172,7 +172,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
diff --git a/src/main/java/com/example/client/service/Level2ManageService.java b/src/main/java/com/example/client/service/Level2ManageService.java
index 1ead5b2..0437fd8 100644
--- a/src/main/java/com/example/client/service/Level2ManageService.java
+++ b/src/main/java/com/example/client/service/Level2ManageService.java
@@ -4,6 +4,7 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel2;
@@ -53,13 +54,13 @@
 
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
-        JPanel panel = new JPanel();
+        JPanel panel = new JPanel(new BorderLayout());
 
         JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        topJpanel.setPreferredSize(new Dimension(width, 37));
+        topJpanel.setPreferredSize(new Dimension(width, 40));
         topJpanel.setBackground(Color.WHITE);
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,jFrame)));
         centerJpanel.setBackground(Color.WHITE);
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
@@ -135,8 +136,19 @@
         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 - 100));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(40,jFrame)));
         centerJpanel.add(scrollPane);
+        jFrame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width  - 20, Compute.ComputeHeight(40,jFrame)));
+                scrollPane.setPreferredSize(new Dimension(width  - 20,Compute.ComputeHeightWithScroll(40,jFrame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
diff --git a/src/main/java/com/example/client/service/Level2ViewService.java b/src/main/java/com/example/client/service/Level2ViewService.java
index e70c7a0..73e5165 100644
--- a/src/main/java/com/example/client/service/Level2ViewService.java
+++ b/src/main/java/com/example/client/service/Level2ViewService.java
@@ -2,6 +2,7 @@
 
 import com.example.client.dto.ColumnDto;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.server.progressTrack.Dto.NetworkNodeStatusDto;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel2;
@@ -15,10 +16,7 @@
 
 import javax.swing.*;
 import java.awt.*;
-import java.awt.event.MouseAdapter;
-import java.awt.event.MouseEvent;
-import java.awt.event.MouseWheelEvent;
-import java.awt.event.MouseWheelListener;
+import java.awt.event.*;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -30,12 +28,12 @@
     @Autowired
     private NetWorkDiagramService netWorkDiagramService;
 
-    public JPanel createTable(Integer width, Integer height) {
-        height = height - 100;
-        JPanel panel = new JPanel();
+    public JPanel createTable(Integer width, Integer height, JFrame frame) {
+        JPanel panel = new JPanel(new BorderLayout());
+        panel.setPreferredSize(new Dimension(width, height));
 
-        JPanel jLeft = new JPanel(new BorderLayout());
-        jLeft.setPreferredSize(new Dimension(width / 4 - 20, height));
+        JPanel jLeft = new JPanel();
+        jLeft.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeight(0, frame)));
 
         JPanel diagram = new JPanel(new BorderLayout());
         diagram.setPreferredSize(new Dimension(width - width / 4, height));
@@ -47,16 +45,29 @@
         //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 / 8, null, false, null,null));
-        columnDto.add(new ColumnDto("涓�绾ц妭鐐�", "processName", width / 8, null, false, null,null));
+        columnDto.add(new ColumnDto("搴忓彿", "", 120, "autoCreate", false, null, null));
+        columnDto.add(new ColumnDto("宸ョ▼", "ProjectName", 145, null, false, null, null));
+        columnDto.add(new ColumnDto("涓�绾ц妭鐐�", "processName", 125, null, false, null, null));
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
         subTable.setRowHeight(25);
-        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         JScrollPane scrollTable = new JScrollPane(subTable);
-        jLeft.add(scrollTable, BorderLayout.CENTER);
+        scrollTable.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeightWithScroll(0, frame)));
+        jLeft.add(scrollTable);
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+
+                jLeft.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeight(0, frame)));
+                scrollTable.setPreferredSize(new Dimension(width / 4 - 20, Compute.ComputeHeightWithScroll(0, frame)));
+                jLeft.revalidate();
+                jLeft.repaint();
+                scrollTable.revalidate();
+                scrollTable.repaint();
+            }
+        });
 
         // 鍒涘缓姘村钩鍒嗗壊闈㈡澘
         JSplitPane hSplitPane = new JSplitPane(
@@ -80,7 +91,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
@@ -104,7 +115,12 @@
                     int r = subTable.getSelectedRow();
                     DjJdgzNetworkLevel2 data = list.get(r);
                     List<NetworkNodeStatusDto> nodeStatusList = level2Service.getNodeStatusData(data.getId());
-                    graph2[0] = netWorkDiagramService.getCsDiagram(graph2[0], data.getContent(), nodeStatusList, diagram.getPreferredSize().width, diagram.getPreferredSize().height);
+                    mxGraph csDiagram = netWorkDiagramService.getCsDiagram(graph2[0], data.getContent(), nodeStatusList, diagram.getPreferredSize().width, diagram.getPreferredSize().height);
+                    if (nodeStatusList != null && nodeStatusList.size() > 0) {
+                        graph2[0] = csDiagram;
+                    } else {
+                        graph2[0].removeCells(graph2[0].getChildVertices(graph2[0].getDefaultParent()));
+                    }
                 }
             }
         });
diff --git a/src/main/java/com/example/client/service/Level3AddOrUpdate.java b/src/main/java/com/example/client/service/Level3AddOrUpdate.java
index 157af61..5c9f56c 100644
--- a/src/main/java/com/example/client/service/Level3AddOrUpdate.java
+++ b/src/main/java/com/example/client/service/Level3AddOrUpdate.java
@@ -142,7 +142,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
diff --git a/src/main/java/com/example/client/service/Level3ManageService.java b/src/main/java/com/example/client/service/Level3ManageService.java
index 35e7d8c..b4c719c 100644
--- a/src/main/java/com/example/client/service/Level3ManageService.java
+++ b/src/main/java/com/example/client/service/Level3ManageService.java
@@ -4,6 +4,7 @@
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.model.TableButton;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.client.utils.MultiSelectComboBox;
 import com.example.server.cabin.service.CabinService;
@@ -57,6 +58,7 @@
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
         JPanel panel = new JPanel();
+        panel.setPreferredSize(new Dimension(width,height));
 
         JPanel topJpanel = new JPanel();
         GridBagLayout layout = new GridBagLayout();
@@ -65,7 +67,7 @@
         topJpanel.setBackground(Color.WHITE);
 
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,jFrame)));
         centerJpanel.setBackground(Color.WHITE);
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
@@ -170,11 +172,10 @@
                 if (e.getStateChange() == ItemEvent.SELECTED) {
                     JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem();
                     if (selectedItem != null) {
-                        long selectedId = selectedItem.getId();
+                        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();
@@ -288,8 +289,19 @@
         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));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(100,jFrame)));
         centerJpanel.add(scrollPane);
+        jFrame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,jFrame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20,Compute.ComputeHeightWithScroll(100,jFrame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
diff --git a/src/main/java/com/example/client/service/Level3View2Service.java b/src/main/java/com/example/client/service/Level3View2Service.java
index 31d2cfc..e6ded97 100644
--- a/src/main/java/com/example/client/service/Level3View2Service.java
+++ b/src/main/java/com/example/client/service/Level3View2Service.java
@@ -3,9 +3,7 @@
 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.client.utils.*;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.Dto.TableNodeDto;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
@@ -18,6 +16,7 @@
 
 import javax.swing.*;
 import javax.swing.event.TableModelEvent;
+import javax.swing.table.DefaultTableCellRenderer;
 import javax.swing.table.DefaultTableModel;
 import java.awt.*;
 import java.awt.event.*;
@@ -42,8 +41,8 @@
     private List<ColumnDto> columnDto;
 
 
-    public JPanel createTable(Integer width, Integer height) {
-        JPanel panel = new JPanel();
+    public JPanel createTable(Integer width, Integer height,JFrame frame) {
+        JPanel panel = new JPanel(new BorderLayout());
 
         JPanel topJpanel = new JPanel();
         GridBagLayout layout = new GridBagLayout();
@@ -52,7 +51,7 @@
         topJpanel.setBackground(Color.WHITE);
 
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,frame)));
         centerJpanel.setBackground(Color.WHITE);
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
@@ -62,7 +61,7 @@
         JComboBoxItem[] cabinList = cabinService.getList();
         JComboBoxItem[] deptList = sysTeamGroupClassService.getDeptList();
         String[] typeList = new String[]{
-                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�",""
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�", ""
         };
 
         JLabel JLabel0 = new JLabel("宸ョ▼");
@@ -90,6 +89,17 @@
         JTextField sb = new JTextField(16);
         JButton query = new JButton("鏌ヨ");
 
+        List<ColorDescription> colorDescriptions = new ArrayList<>();
+        colorDescriptions.add(new ColorDescription("#3498DB", "杩涜涓�"));
+        colorDescriptions.add(new ColorDescription("#F1C40F", "涓存湡"));
+        colorDescriptions.add(new ColorDescription("#E74C3C", "閫炬湡"));
+        colorDescriptions.add(new ColorDescription("#2ECC71", "姝e父瀹屾垚"));
+        colorDescriptions.add(new ColorDescription("#006400", "瓒呮湡瀹屾垚"));
+
+        // 鍒涘缓涓嬫媺妗�
+        ColorDescriptionComboBox comboBox5 = new ColorDescriptionComboBox(colorDescriptions);
+
+
         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));
@@ -103,8 +113,9 @@
 
         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));
+        topJpanel.add(comboBox5, new GBC(3, 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);
+        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));
@@ -122,6 +133,30 @@
 
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
+        MouseMotionListener mouseMotionListener = new MouseMotionListener() {
+            @Override
+            public void mouseDragged(MouseEvent e) {
+                // 涓嶉渶瑕佸鐞嗛紶鏍囨嫋鍔ㄤ簨浠�
+            }
+
+            @Override
+            public void mouseMoved(MouseEvent e) {
+                Point point = e.getPoint();
+                int row = table.rowAtPoint(point);
+                int column = table.columnAtPoint(point);
+
+                if (row <= list.size() && column > 1) {
+                    String hexColor = (String) table.getValueAt(row, column);
+                    String tooltip = getTooltipText(hexColor);
+                    table.setToolTipText(tooltip);
+                } else {
+                    table.setToolTipText(null);
+                }
+            }
+        };
+
+        table.addMouseMotionListener(mouseMotionListener);
+
         comboBox.addItemListener(new ItemListener() {
             public void itemStateChanged(final ItemEvent event) {
                 String content = comboBox.getSelectedItem().toString();
@@ -131,7 +166,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
@@ -145,12 +180,11 @@
             public void itemStateChanged(ItemEvent e) {
                 if (e.getStateChange() == ItemEvent.SELECTED) {
                     JComboBoxItem selectedItem = (JComboBoxItem) comboBox1.getSelectedItem();
-                    if (selectedItem.getId() != null) {
-                        long selectedId = selectedItem.getId();
+                    if (selectedItem != 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();
@@ -159,7 +193,7 @@
                         String type = comboBox4.getSelectedItem().toString();
 
                         Long shipId = shipMap.get(content);
-                        list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                        list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
                         CommonTable.refreshTable(list, columnDto, table);
                         table.setRowHeight(25);
 
@@ -180,7 +214,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
@@ -198,7 +232,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
@@ -216,7 +250,7 @@
                 String type = comboBox4.getSelectedItem().toString();
 
                 Long shipId = shipMap.get(content);
-                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type,null);
+                list = level3Service.getNodeList(shipId, dept.getId(), team.getId(), cabin.getId(), type, null);
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
@@ -229,7 +263,7 @@
         query.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
-                list = level3Service.getNodeList(null, null, null, null, null,sb.getText());
+                list = level3Service.getNodeList(null, null, null, null, null, sb.getText());
 
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
@@ -249,15 +283,43 @@
         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));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(100,frame)));
         centerJpanel.add(scrollPane);
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,frame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20,Compute.ComputeHeightWithScroll(100,frame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
 
+    private static String getTooltipText(String hexColor) {
+        switch (hexColor) {
+            case "#3498DB":
+                return "杩涜涓�";
+            case "#F1C40F":
+                return "涓存湡";
+            case "#E74C3C":
+                return "閫炬湡";
+            case "#2ECC71":
+                return "姝e父瀹屾垚";
+            case "#006400":
+                return "瓒呮湡瀹屾垚";
+            default:
+                return "鏈紑濮�";
+        }
+    }
 
 }
 
 
 
 
+
diff --git a/src/main/java/com/example/client/service/Level3ViewService.java b/src/main/java/com/example/client/service/Level3ViewService.java
index c8f0643..4479a87 100644
--- a/src/main/java/com/example/client/service/Level3ViewService.java
+++ b/src/main/java/com/example/client/service/Level3ViewService.java
@@ -86,7 +86,7 @@
         mxGraphComponent graphComponent = new mxGraphComponent(graph);
         graphComponent.setConnectable(false);
         graphComponent.setDragEnabled(false);
-        graphComponent.zoomTo(2, true);
+        graphComponent.zoomTo(1, true);
         diagram.add(graphComponent);
 
         mxGraph finalGraph = graph;
diff --git a/src/main/java/com/example/client/service/MenuService.java b/src/main/java/com/example/client/service/MenuService.java
index 85417d0..301085b 100644
--- a/src/main/java/com/example/client/service/MenuService.java
+++ b/src/main/java/com/example/client/service/MenuService.java
@@ -93,19 +93,19 @@
                         JPanel level1Manage = level1ManageService.createTable(width, height, frame);
                         main.showTab("涓�绾х綉缁滃浘绠$悊", level1Manage, tree);
                     } else if (nodeName.equals("涓�绾х綉缁滃浘鏌ョ湅")) {
-                        JPanel level1View = level1ViewService.createTable(width, height);
+                        JPanel level1View = level1ViewService.createTable(width, height,frame);
                         main.showTab("涓�绾х綉缁滃浘鏌ョ湅", level1View, tree);
                     } else if (nodeName.equals("浜岀骇缃戠粶鍥剧鐞�")) {
                         JPanel level2Manage = level2ManageService.createTable(width, height, frame);
                         main.showTab("浜岀骇缃戠粶鍥剧鐞�", level2Manage, tree);
                     } else if (nodeName.equals("浜岀骇缃戠粶鍥炬煡鐪�")) {
-                        JPanel level2View = level2ViewService.createTable(width, height);
+                        JPanel level2View = level2ViewService.createTable(width, height,frame);
                         main.showTab("浜岀骇缃戠粶鍥炬煡鐪�", level2View, tree);
                     } else if (nodeName.equals("涓夌骇缃戠粶鍥剧鐞�")) {
                         JPanel level3Manage = level3ManageService.createTable(width, height, frame);
                         main.showTab("涓夌骇缃戠粶鍥剧鐞�", level3Manage, tree);
                     } else if (nodeName.equals("涓夌骇缃戠粶鍥炬煡鐪�")) {
-                        JPanel level3View = level3View2Service.createTable(width, height);
+                        JPanel level3View = level3View2Service.createTable(width, height,frame);
                         main.showTab("涓夌骇缃戠粶鍥炬煡鐪�", level3View, tree);
                     } else if (nodeName.equals("椤圭洰杩涘害琛�")) {
                         JPanel trackRecord = trackRecordManageService.createTable(width, height, frame);
diff --git a/src/main/java/com/example/client/service/SubunitAddOrUpdate.java b/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
index 81dc730..426fb07 100644
--- a/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/SubunitAddOrUpdate.java
@@ -5,6 +5,7 @@
 import com.example.client.model.TableButton;
 import com.example.client.utils.BoxIteUtils;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.model.DjJdgzDismantTrack;
@@ -46,13 +47,13 @@
 
     public JPanel createTrack(Integer width, Integer height, DjJdgzNetworkLevel3 djJdgzNetworkLevel3,JFrame frame) {
         nowLevel3 = djJdgzNetworkLevel3;
-        JPanel panel = new JPanel();
+        JPanel panel = new JPanel(new BorderLayout());
         panel.setPreferredSize(new Dimension(width, height));
         JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        topJpanel.setPreferredSize(new Dimension(width - 10, 37));
+        topJpanel.setPreferredSize(new Dimension(width - 10, 40));
 
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(40,frame)));
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
 
@@ -101,9 +102,19 @@
 
         JScrollPane scrollPane = new JScrollPane(trackTable, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS, JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
         scrollPane.setViewportView(trackTable);
-        scrollPane.setPreferredSize(new Dimension(width - 20, height - 130));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(40,frame)));
         centerJpanel.add(scrollPane);
-
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(40,frame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(40,frame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
         return panel;
     }
 
diff --git a/src/main/java/com/example/client/service/SubunitService.java b/src/main/java/com/example/client/service/SubunitService.java
index b94a8f1..e6161b0 100644
--- a/src/main/java/com/example/client/service/SubunitService.java
+++ b/src/main/java/com/example/client/service/SubunitService.java
@@ -3,6 +3,7 @@
 import com.example.client.dto.ColumnDto;
 import com.example.client.dto.JComboBoxItem;
 import com.example.client.utils.CommonTable;
+import com.example.client.utils.Compute;
 import com.example.client.utils.GBC;
 import com.example.server.cabin.service.CabinService;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel3;
@@ -47,11 +48,16 @@
         JPanel jLeft = new JPanel(new BorderLayout());
 
         JPanel top = new JPanel();
+        JPanel center = new JPanel();
         GridBagLayout layout = new GridBagLayout();
         top.setLayout(layout);
 
-        jLeft.setPreferredSize(new Dimension(width / 2 - 20, height));
         top.setPreferredSize(new Dimension(width / 2 - 20, 100));
+        jLeft.setPreferredSize(new Dimension(width / 2 - 20, Compute.ComputeHeight(0,frame)));
+        center.setPreferredSize(new Dimension(width / 2 - 20, Compute.ComputeHeight(100,frame)));
+
+        jLeft.add(center,BorderLayout.CENTER);
+
 
         // 鍒涘缓宸︿晶琛ㄦ牸
 
@@ -125,7 +131,7 @@
 
         JTable subTable = CommonTable.createCommonTable(list, columnDto);
         subTable.setRowHeight(25);
-        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
+        subTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
         comboBox.addItemListener(new ItemListener() {
             public void itemStateChanged(final ItemEvent event) {
@@ -305,7 +311,22 @@
 
 
         JScrollPane scrollTable = new JScrollPane(subTable);
-        jLeft.add(scrollTable, BorderLayout.CENTER);
+        scrollTable.setPreferredSize(new Dimension(width / 2 - 20, Compute.ComputeHeightWithScroll(100,frame)));
+        center.add(scrollTable);
+        frame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                jLeft.setPreferredSize(new Dimension(width / 2 - 20, Compute.ComputeHeight(0,frame)));
+                center.setPreferredSize(new Dimension(width / 2 - 20, Compute.ComputeHeight(100,frame)));
+                scrollTable.setPreferredSize(new Dimension(width / 2 - 20,Compute.ComputeHeightWithScroll(100,frame)));
+                jLeft.revalidate();
+                jLeft.repaint();
+                center.revalidate();
+                center.repaint();
+                scrollTable.revalidate();
+                scrollTable.repaint();
+            }
+        });
 
         JPanel track = addOrUpdate.createTrack(width / 2, height, list.get(0),  frame);
 
diff --git a/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java b/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
index 323e542..319a680 100644
--- a/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
+++ b/src/main/java/com/example/client/service/TrackRecordAddOrUpdate.java
@@ -2,30 +2,22 @@
 
 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.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.*;
 import com.example.server.sysOss.model.SysOss;
-import com.example.server.teamGroup.service.SysTeamGroupClassService;
 import com.example.server.user.model.SysUser;
 import com.example.server.utils.CacheUtils;
-import com.mxgraph.swing.mxGraphComponent;
-import com.mxgraph.view.mxGraph;
 import org.apache.commons.lang3.StringUtils;
 import org.jdesktop.swingx.JXDatePicker;
 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 javax.swing.table.TableModel;
 import java.awt.*;
 import java.awt.event.*;
 import java.text.ParseException;
@@ -114,6 +106,12 @@
             trackPersonDesc.setText(data.getTrackPerson());
         }
 
+        JLabel JLabel34 = new JLabel("鍗曚綅");
+        JTextField trackPersonUnitDesc = new JTextField(16);
+        if (StringUtils.isNotBlank(data.getTrackPersonUnit())) {
+            trackPersonUnitDesc.setText(data.getTrackPersonUnit());
+        }
+
         JLabel JLabel4 = new JLabel("鑱旂郴鏂瑰紡");
         JTextField trackPersonContactDesc = new JTextField(16);
         if (StringUtils.isNotBlank(data.getTrackPersonContact())) {
@@ -124,6 +122,12 @@
         JTextField trackedPersonDesc = new JTextField(16);
         if (StringUtils.isNotBlank(data.getTrackedPerson())) {
             trackedPersonDesc.setText(data.getTrackedPerson());
+        }
+
+        JLabel JLabel56 = new JLabel("鍗曚綅");
+        JTextField trackedPersonUnitDesc = new JTextField(16);
+        if (StringUtils.isNotBlank(data.getTrackedPersonUnit())) {
+            trackedPersonUnitDesc.setText(data.getTrackedPersonUnit());
         }
 
         JLabel JLabel6 = new JLabel("鑱旂郴鏂瑰紡");
@@ -245,13 +249,17 @@
 
         frame1.add(JLabel3, new GBC(0, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
         frame1.add(trackPersonDesc, new GBC(1, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
-        frame1.add(JLabel4, new GBC(2, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
-        frame1.add(trackPersonContactDesc, new GBC(3, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(JLabel34, new GBC(2, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(trackPersonUnitDesc, new GBC(3, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(JLabel4, new GBC(4, 1, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(trackPersonContactDesc, new GBC(5, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
         frame1.add(JLabel5, new GBC(0, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
         frame1.add(trackedPersonDesc, new GBC(1, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
-        frame1.add(JLabel6, new GBC(2, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
-        frame1.add(trackedPersonContactDesc, new GBC(3, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(JLabel56, new GBC(2, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(trackedPersonUnitDesc, new GBC(3, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+        frame1.add(JLabel6, new GBC(4, 2, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        frame1.add(trackedPersonContactDesc, new GBC(5, 2, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
 
         frame1.add(JLabel7, new GBC(0, 3, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
         frame1.add(generalRepairUnitDesc, new GBC(1, 3, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
@@ -313,6 +321,8 @@
                 data.setTrackLocation(trackLocatDesc.getText());
                 data.setTrackPerson(trackPersonDesc.getText());
                 data.setTrackPersonContact(trackPersonContactDesc.getText());
+                data.setTrackPersonUnit(trackPersonUnitDesc.getText());
+                data.setTrackedPersonUnit(trackedPersonUnitDesc.getText());
                 data.setTrackedPerson(trackedPersonDesc.getText());
                 data.setTrackedPersonContact(trackedPersonContactDesc.getText());
                 data.setGeneralRepairUnit(generalRepairUnitDesc.getText());
@@ -329,7 +339,7 @@
                 data.setRemark(remark.getText());
                 Long id = djJdgzTrackRecordService.save(data);
                 uploadFile.save(id);
-                List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(level1Id, 0);
+                List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(level1Id, level3.getDeptId(), null, null, level3.getType(), 0, null);
                 CommonTable.refreshTable(list, columnDto, table);
                 trackRecordManageService.tableModelListener(table, jFrame, list);
                 frame1.dispose();
diff --git a/src/main/java/com/example/client/service/TrackRecordManageService.java b/src/main/java/com/example/client/service/TrackRecordManageService.java
index d30992b..363d012 100644
--- a/src/main/java/com/example/client/service/TrackRecordManageService.java
+++ b/src/main/java/com/example/client/service/TrackRecordManageService.java
@@ -3,12 +3,11 @@
 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.*;
 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;
@@ -16,12 +15,12 @@
 
 import javax.swing.*;
 import javax.swing.event.TableModelEvent;
+import javax.swing.table.TableColumnModel;
 import java.awt.*;
 import java.awt.event.*;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
-import java.util.Map;
+import java.util.Set;
 
 
 @Service
@@ -50,16 +49,19 @@
     private JTable table;
     private List<DjJdgzTrackRecord> list;
     private List<ColumnDto> columnDto;
+    private TableColumnModel columnModel;
 
     public JPanel createTable(Integer width, Integer height, JFrame jFrame) {
         JPanel panel = new JPanel();
 
-        JPanel topJpanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
-        topJpanel.setPreferredSize(new Dimension(width, 37));
+        JPanel topJpanel = new JPanel();
+        GridBagLayout layout = new GridBagLayout();
+        topJpanel.setLayout(layout);
+        topJpanel.setPreferredSize(new Dimension(width - 20, 100));
         topJpanel.setBackground(Color.WHITE);
 
         JPanel centerJpanel = new JPanel();
-        centerJpanel.setPreferredSize(new Dimension(width - 20, height - 100));
+        centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,jFrame)));
         centerJpanel.setBackground(Color.WHITE);
         panel.add(topJpanel, BorderLayout.NORTH);
         panel.add(centerJpanel, BorderLayout.CENTER);
@@ -73,44 +75,173 @@
                 new JComboBoxItem(1L, "宸插畬鎴�")
         };
 
+        JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(null);
+        String[] typeList = new String[]{
+                "鏀硅", "鍔犺", "鎹㈣", "鏀硅繘鎬т慨鐞�", ""
+        };
+
+        JLabel JLabel0 = new JLabel("宸ョ▼");
+        JComboBox<JComboBoxItem> comboBox = new JComboBox<>(projectList);
+        comboBox.setPreferredSize(new Dimension(150, 28));
+
+        JLabel JLabel1 = new JLabel("閮ㄩ棬");
+        JComboBox<JComboBoxItem> comboBox1 = new JComboBox<>(deptList);
+        comboBox1.setPreferredSize(new Dimension(150, 28));
+
+        JComboBoxItem[] teamList1 = sysTeamGroupClassService.getTeamList(deptList[0].getId());
+
+        JLabel JLabel2 = new JLabel("涓撲笟");
+        JComboBox<JComboBoxItem> comboBox2 = new JComboBox<>(teamList1);
+        comboBox2.setPreferredSize(new Dimension(150, 28));
+
+        JLabel JLabel3 = new JLabel("鑸卞");
+        JComboBox<JComboBoxItem> comboBox3 = new JComboBox<>(cabinList);
+        comboBox3.setPreferredSize(new Dimension(150, 28));
+
+        JLabel JLabel4 = new JLabel("绫诲埆");
+        JComboBox<String> comboBox4 = new JComboBox<>(typeList);
+        comboBox4.setPreferredSize(new Dimension(150, 28));
+
+        JLabel JLabel5 = new JLabel("鐘舵��");
+        JComboBox<JComboBoxItem> comboBox5 = new JComboBox<>(statusList);
+        comboBox5.setPreferredSize(new Dimension(150, 28));
+
+        JTextField sb = new JTextField(16);
+        sb.setPreferredSize(new Dimension(150, 28));
+        JButton query = new JButton("鏌ヨ");
+
         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();
-        JComboBoxItem selectedItem2 = (JComboBoxItem) comboBox2.getSelectedItem();
 
         comboBox.addItemListener(new ItemListener() {
             public void itemStateChanged(final ItemEvent event) {
-                JComboBoxItem selectedItemNow = (JComboBoxItem) comboBox.getSelectedItem();
-                JComboBoxItem selectedItem2Now = (JComboBoxItem) comboBox2.getSelectedItem();
-                Long level1Id = selectedItemNow.getId();
-                Long Status = selectedItem2Now.getId();
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
 
-                list = djJdgzTrackRecordService.getList(level1Id, Math.toIntExact(Status));
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-                tableModelListener(table, jFrame,list);
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
+            }
+        });
+
+        comboBox1.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                Long deptId = dept.getId();
+                JComboBoxItem[] teamList = sysTeamGroupClassService.getTeamList(deptId);
+                comboBox2.setModel(new DefaultComboBoxModel<>(teamList));
+
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
+
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
             }
         });
 
         comboBox2.addItemListener(new ItemListener() {
             public void itemStateChanged(final ItemEvent event) {
-                JComboBoxItem selectedItemNow = (JComboBoxItem) comboBox.getSelectedItem();
-                JComboBoxItem selectedItem2Now = (JComboBoxItem) comboBox2.getSelectedItem();
-                Long level1Id = selectedItemNow.getId();
-                Long Status = selectedItem2Now.getId();
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
 
-                list = djJdgzTrackRecordService.getList(level1Id, Math.toIntExact(Status));
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
                 CommonTable.refreshTable(list, columnDto, table);
                 table.setRowHeight(25);
-                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
 
-                tableModelListener(table, jFrame,list);
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
+            }
+        });
+
+        comboBox3.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
+
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
+            }
+        });
+        comboBox4.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
+
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
+            }
+        });
+
+        comboBox5.addItemListener(new ItemListener() {
+            public void itemStateChanged(final ItemEvent event) {
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                JComboBoxItem dept = (JComboBoxItem) comboBox1.getSelectedItem();
+                JComboBoxItem team = (JComboBoxItem) comboBox2.getSelectedItem();
+                JComboBoxItem cabin = (JComboBoxItem) comboBox3.getSelectedItem();
+                String type = comboBox4.getSelectedItem().toString();
+                JComboBoxItem status = (JComboBoxItem) comboBox5.getSelectedItem();
+
+                list = djJdgzTrackRecordService.getList(project.getId(), dept.getId(), team.getId(), cabin.getId(), type, Math.toIntExact(status.getId()), null);
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
+            }
+        });
+        query.addActionListener(new ActionListener() {
+            @Override
+            public void actionPerformed(ActionEvent e) {
+                JComboBoxItem project = (JComboBoxItem) comboBox.getSelectedItem();
+                list = djJdgzTrackRecordService.getList(project.getId(), null, null, null, null, null, sb.getText());
+
+                CommonTable.refreshTable(list, columnDto, table);
+                table.setRowHeight(25);
+
+                table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+                tableModelListener(table, jFrame, list);
             }
         });
 
@@ -118,21 +249,11 @@
             @Override
             public void actionPerformed(ActionEvent e) {
                 JComboBoxItem selectedItemNow = (JComboBoxItem) comboBox.getSelectedItem();
-                importTrackRecordService.FileUpload(columnDto,table,jFrame);
+                importTrackRecordService.FileUpload(columnDto, table, jFrame);
             }
         });
 
-        topJpanel.add(btnTj);
-        topJpanel.add(btnJc);
-        topJpanel.add(btnExport);
-        topJpanel.add(btnImport);
-        topJpanel.add(comboBox);
-        topJpanel.add(comboBox2);
-
-        comboBox.setPreferredSize(new Dimension(300, 28));
-        comboBox2.setPreferredSize(new Dimension(300, 28));
-
-        list = djJdgzTrackRecordService.getList(selectedItem.getId(), Math.toIntExact(selectedItem2.getId()));
+        list = djJdgzTrackRecordService.getList(projectList[0].getId(), deptList[0].getId(), teamList[0].getId(), cabinList[0].getId(), typeList[0], Math.toIntExact(statusList[0].getId()), null);
         List<TableButton> buttonList = new ArrayList<>();
         buttonList.add(new TableButton("edit", "缂栬緫"));
 
@@ -146,11 +267,11 @@
         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("褰撳墠鑺傜偣", "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));
-        columnDto.add(new ColumnDto("鍒嗘壙淇崟浣�", "repair", 180, null, false, null, null));
+        columnDto.add(new ColumnDto("褰撳墠鑺傜偣", "level3NodeName", 150, null, false, null, null));
+        columnDto.add(new ColumnDto("璁″垝瀹屾垚鏃堕棿", "requiredCompletionTime", 180, null, false, null, null));
         columnDto.add(new ColumnDto("璺熻釜璁板綍", "", 100, "", true, buttonList, null));
+        columnDto.add(new ColumnDto("鎬绘壙淇崟浣�", "generalRepair", 200, null, false, null, null));
+        columnDto.add(new ColumnDto("鍒嗘壙淇崟浣�", "repair", 200, null, false, null, null));
         columnDto.add(new ColumnDto("鍘嗗彶璁板綍", "trackNum", 100, null, false, null, null));
         columnDto.add(new ColumnDto("瀹屾垚鏃堕棿", "actualCompletion", 200, null, false, null, null));
         columnDto.add(new ColumnDto("闄勪欢", "fileName", 200, null, false, null, null));
@@ -159,6 +280,60 @@
         table = CommonTable.createCommonTable(list, columnDto);
         table.setRowHeight(25);
         table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
+
+        List<String> itemList = new ArrayList<>();
+        for (ColumnDto dto : columnDto) {
+            itemList.add(dto.getColumnDesc()); // 灏� dto.getColumnDesc() 娣诲姞鍒� List 涓�
+        }
+
+        String[] items = itemList.toArray(new String[0]);
+        columnModel = table.getColumnModel();
+        MultiSelectComboBox2 mulcomboBox = new MultiSelectComboBox2(items,columnDto,columnModel);
+
+/*        final Integer[] lastIndex = {-1};
+        mulcomboBox.addItemListener(new ItemListener() {
+            @Override
+            public void itemStateChanged(ItemEvent event) {
+                int selectedIndex = mulcomboBox.getSelectedIndex();
+                if (lastIndex[0] == selectedIndex){
+                    lastIndex[0] = -1;
+                    return;
+                }else{
+                    lastIndex[0] = selectedIndex;
+                }
+                if (selectedIndex != -1) {
+                    // 鏇存柊 selectedIndices
+                    if (event.getStateChange() == ItemEvent.SELECTED){
+                        Integer width = columnDto.get(selectedIndex).getColumnWidth();
+                        columnModel.getColumn(selectedIndex).setPreferredWidth(width);
+                    }else{
+                        columnModel.getColumn(selectedIndex).setPreferredWidth(0);
+                    }
+                }
+            }
+        });*/
+
+        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(JLabel5, new GBC(10, 0, 1, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(comboBox5, new GBC(11, 0, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
+        topJpanel.add(btnTj, new GBC(1, 1, 1, 1).setInsets(5));
+        topJpanel.add(btnJc, new GBC(2, 1, 2, 1).setInsets(5));
+        topJpanel.add(btnImport, new GBC(4, 1, 2, 1).setInsets(5));
+        topJpanel.add(btnExport, new GBC(6, 1, 2, 1).setInsets(5));
+        topJpanel.add(mulcomboBox, new GBC(8, 1, 2, 1).setInsets(5));
+        topJpanel.add(sb, new GBC(10, 1, 2, 1).setAnchor(GBC.SOUTHEAST).setInsets(5));
+        topJpanel.add(query, new GBC(12, 1, 1, 1).setAnchor(GBC.SOUTHWEST).setInsets(5));
+
 
         table.addMouseListener(new MouseAdapter() {
             @Override
@@ -203,13 +378,24 @@
                 exportTrackRecordService.openDialog(jFrame);
             }
         });
-        tableModelListener(table, jFrame,list);
+        tableModelListener(table, jFrame, list);
 
         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 - 130));
+        scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(100,jFrame)));
         centerJpanel.add(scrollPane);
+        jFrame.addComponentListener(new ComponentAdapter() {
+            @Override
+            public void componentResized(ComponentEvent e) {
+                centerJpanel.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeight(100,jFrame)));
+                scrollPane.setPreferredSize(new Dimension(width - 20, Compute.ComputeHeightWithScroll(100,jFrame)));
+                centerJpanel.revalidate();
+                centerJpanel.repaint();
+                scrollPane.revalidate();
+                scrollPane.repaint();
+            }
+        });
 
         return panel;
     }
@@ -272,7 +458,7 @@
 
     }
 
-    public void tableModelListener(JTable table, JFrame jFrame,List<DjJdgzTrackRecord> recordList) {
+    public void tableModelListener(JTable table, JFrame jFrame, List<DjJdgzTrackRecord> recordList) {
         table.getModel().addTableModelListener(e -> {
             // 妫�鏌ヤ簨浠剁被鍨�
             if (e.getType() == TableModelEvent.UPDATE) {
@@ -292,7 +478,7 @@
                         data = djJdgzTrackRecordService.get(data.getId());
                         data.setLevel1NetworkId(level1Id);
                         data.setIsUpdate(isUpdate);
-                    }else{
+                    } else {
                         DjJdgzNetworkLevel3 level3 = level3Service.get(data.getLevel3NetworkId());
                         data.setGeneralRepairUnit(level3.getGeneralRepairUnit());
                         data.setGeneralRepairUnitDirector(level3.getGeneralRepairUnitDirector());
@@ -309,6 +495,41 @@
                 System.out.println("鍗曞厓鏍煎彉鍖�: 琛�=" + row + ", 鍒�=" + column + ", 鏂板��=" + newValue);
             }
         });
+
+        table.addMouseListener(new MouseAdapter() {
+            @Override
+            public void mousePressed(MouseEvent e) {
+                if (e.isPopupTrigger()) {
+                    showPopupMenu(e);
+                }
+            }
+
+            @Override
+            public void mouseReleased(MouseEvent e) {
+                if (e.isPopupTrigger()) {
+                    showPopupMenu(e);
+                }
+            }
+
+            private void showPopupMenu(MouseEvent e) {
+                JPopupMenu popupMenu = new JPopupMenu();
+                JMenuItem menuItem1 = new JMenuItem("鎾ゅ洖");
+                popupMenu.add(menuItem1);
+                int row = table.rowAtPoint(e.getPoint());
+                int col = table.columnAtPoint(e.getPoint());
+                DjJdgzTrackRecord djJdgzTrackRecord = list.get(row);
+                if (djJdgzTrackRecord.getCurrentStatus() == 1) {
+                    table.setRowSelectionInterval(row, row);
+                    popupMenu.show(e.getComponent(), e.getX(), e.getY());
+                    menuItem1.addActionListener(ex -> {
+                        djJdgzTrackRecordService.retract(djJdgzTrackRecord.getId());
+                        List<DjJdgzTrackRecord> list = djJdgzTrackRecordService.getList(djJdgzTrackRecord.getLevel1NetworkId(), null, null, null, null, 0, null);
+                        CommonTable.refreshTable(list, columnDto, table);
+                        tableModelListener(table, jFrame, list);
+                    });
+                }
+            }
+        });
     }
 
 }
diff --git a/src/main/java/com/example/client/utils/ColorDescription.java b/src/main/java/com/example/client/utils/ColorDescription.java
new file mode 100644
index 0000000..beab88e
--- /dev/null
+++ b/src/main/java/com/example/client/utils/ColorDescription.java
@@ -0,0 +1,19 @@
+package com.example.client.utils;
+
+public class ColorDescription {
+    private String hexColor;
+    private String description;
+
+    public ColorDescription(String hexColor, String description) {
+        this.hexColor = hexColor;
+        this.description = description;
+    }
+
+    public String getHexColor() {
+        return hexColor;
+    }
+
+    public String getDescription() {
+        return description;
+    }
+}
diff --git a/src/main/java/com/example/client/utils/ColorDescriptionComboBox.java b/src/main/java/com/example/client/utils/ColorDescriptionComboBox.java
new file mode 100644
index 0000000..b9754cd
--- /dev/null
+++ b/src/main/java/com/example/client/utils/ColorDescriptionComboBox.java
@@ -0,0 +1,102 @@
+package com.example.client.utils;
+
+import com.example.client.dto.ColumnDto;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableColumnModel;
+import java.awt.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class ColorDescriptionComboBox extends JComboBox<ColorDescription> {
+    private String defaultText; // 榛樿鏄剧ず鏂囨湰
+
+    public ColorDescriptionComboBox(List<ColorDescription> colorDescriptions) {
+        super(colorDescriptions.toArray(new ColorDescription[0]));
+        this.defaultText = "鐘舵��"; // 璁剧疆榛樿鏂囨湰
+        setEditable(true);
+
+        // 鑷畾涔夋覆鏌撳櫒
+        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 instanceof ColorDescription) {
+                    ColorDescription cd = (ColorDescription) value;
+                    setText(cd.getDescription()); // 鏄剧ず鎻忚堪
+                    setIcon(new ColorIcon(cd.getHexColor())); // 璁剧疆鍦嗗舰鍥炬爣
+                }
+                return this;
+            }
+        });
+
+        // 鑷畾涔夌紪杈戝櫒
+        setEditor(new BasicComboBoxEditor() {
+            private JTextField textField;
+
+            @Override
+            public Component getEditorComponent() {
+                if (textField == null) {
+                    textField = new JTextField(defaultText); // 璁剧疆榛樿鏂囨湰
+                    textField.setEditable(false); // 璁剧疆涓轰笉鍙紪杈�
+                }
+                return textField;
+            }
+
+            @Override
+            public void setItem(Object anObject) {
+                // 绂佺敤鑷姩鏇存柊缂栬緫鍣ㄦ枃鏈殑琛屼负
+                if (textField != null) {
+                    textField.setText(defaultText); // 濮嬬粓鏄剧ず榛樿鏂囨湰
+                }
+            }
+        });
+    }
+}
+
+
+// 鑷畾涔夊渾褰㈠浘鏍囩被
+class ColorIcon implements Icon {
+    private Color color;
+
+    public ColorIcon(String hexColor) {
+        this.color = ColorUtils.hexToColor(hexColor);
+    }
+
+    @Override
+    public void paintIcon(Component c, Graphics g, int x, int y) {
+        int width = getIconWidth();
+        int height = getIconHeight();
+        int diameter = Math.min(width, height);
+        int xCenter = (width - diameter) / 2;
+        int yCenter = (height - diameter) / 2;
+
+        g.setColor(color);
+        g.fillOval(x + xCenter, y + yCenter, diameter, diameter);
+    }
+
+    @Override
+    public int getIconWidth() {
+        return 20; // 鍦嗗舰鐨勫搴�
+    }
+
+    @Override
+    public int getIconHeight() {
+        return 20; // 鍦嗗舰鐨勯珮搴�
+    }
+}
+// 鍗佸叚杩涘埗棰滆壊杞崲涓� Color 瀵硅薄
+class ColorUtils {
+    public static Color hexToColor(String hex) {
+        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 ea59bc7..84892be 100644
--- a/src/main/java/com/example/client/utils/CommonTable.java
+++ b/src/main/java/com/example/client/utils/CommonTable.java
@@ -45,6 +45,7 @@
     public static void setColumnType(List<ColumnDto> dtoList, JTable table) {
         for (int j = 0; j < dtoList.size(); j++) {
             table.getColumnModel().getColumn(j).setPreferredWidth(dtoList.get(j).getColumnWidth());
+            table.getColumnModel().getColumn(j).setMinWidth(2);
             if (dtoList.get(j).getButtonList() != null) {
                 CreateTableButton.AcceptRejectRenderer renderer = new CreateTableButton.AcceptRejectRenderer(dtoList.get(j).getButtonList());
                 table.getColumnModel().getColumn(j).setCellRenderer(renderer);
diff --git a/src/main/java/com/example/client/utils/Compute.java b/src/main/java/com/example/client/utils/Compute.java
new file mode 100644
index 0000000..4216855
--- /dev/null
+++ b/src/main/java/com/example/client/utils/Compute.java
@@ -0,0 +1,39 @@
+package com.example.client.utils;
+
+import javax.swing.*;
+import java.awt.*;
+
+public class Compute {
+    /*public static Integer ComputeHeight(Integer topHeight){
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        Rectangle rect = ge.getMaximumWindowBounds();
+        Integer screenWidth = rect.width;
+        Integer screenHeight = rect.height;
+
+        Integer panelHeight = screenHeight - 50 - topHeight;
+
+        return panelHeight;
+    }
+    public static Integer ComputeHeightWithScroll(Integer topHeight){
+        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
+        Rectangle rect = ge.getMaximumWindowBounds();
+        Integer screenWidth = rect.width;
+        Integer screenHeight = rect.height;
+
+        Integer panelHeight = screenHeight - 50 - 30 - topHeight;
+
+        return panelHeight;
+    }*/
+    public static Integer ComputeHeight(Integer topHeight, JFrame frame){
+        int height = frame.getSize().height;
+        Integer panelHeight = height - 70 - topHeight;
+
+        return panelHeight;
+    }
+    public static Integer ComputeHeightWithScroll(Integer topHeight, JFrame frame){
+        int height = frame.getSize().height;
+        Integer panelHeight = height - 100 - topHeight;
+
+        return panelHeight;
+    }
+}
diff --git a/src/main/java/com/example/client/utils/MultiSelectComboBox2.java b/src/main/java/com/example/client/utils/MultiSelectComboBox2.java
new file mode 100644
index 0000000..fed687b
--- /dev/null
+++ b/src/main/java/com/example/client/utils/MultiSelectComboBox2.java
@@ -0,0 +1,116 @@
+package com.example.client.utils;
+
+import com.example.client.dto.ColumnDto;
+
+import javax.swing.*;
+import javax.swing.plaf.basic.BasicComboBoxEditor;
+import javax.swing.table.TableColumnModel;
+import java.awt.*;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+public class MultiSelectComboBox2 extends JComboBox<String> {
+    public Set<Integer> selectedIndices = new HashSet<>();
+    private String defaultText; // 榛樿鏄剧ず鏂囨湰
+
+    public MultiSelectComboBox2(String[] items, List<ColumnDto> columnDto, TableColumnModel columnModel) {
+        super(items);
+        this.defaultText = "鑷畾涔夎〃澶�"; // 璁剧疆榛樿鏂囨湰
+        setEditable(true);
+
+        // 鑷畾涔夋覆鏌撳櫒
+        setRenderer(new DefaultListCellRenderer() {
+            @Override
+            public Component getListCellRendererComponent(JList<?> list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
+                JCheckBox checkBox = new JCheckBox();
+                checkBox.setText(value.toString()); // 浣跨敤瀛楃涓蹭綔涓烘枃鏈�
+                checkBox.setSelected(selectedIndices.contains(index)); // 璁剧疆閫変腑鐘舵��
+                checkBox.setEnabled(list.isEnabled());
+                checkBox.setFont(list.getFont());
+                checkBox.setFocusPainted(false);
+                checkBox.setBackground(isSelected ? list.getSelectionBackground() : list.getBackground());
+                checkBox.setForeground(isSelected ? list.getSelectionForeground() : list.getForeground());
+                return checkBox;
+            }
+        });
+
+        // 鑷畾涔夌紪杈戝櫒
+        setEditor(new BasicComboBoxEditor() {
+            private JTextField textField;
+
+            @Override
+            public Component getEditorComponent() {
+                if (textField == null) {
+                    textField = new JTextField(defaultText); // 璁剧疆榛樿鏂囨湰
+                    textField.setEditable(false); // 璁剧疆涓轰笉鍙紪杈�
+                }
+                return textField;
+            }
+
+            @Override
+            public void setItem(Object anObject) {
+                // 绂佺敤鑷姩鏇存柊缂栬緫鍣ㄦ枃鏈殑琛屼负
+                if (textField != null) {
+                    textField.setText(defaultText); // 濮嬬粓鏄剧ず榛樿鏂囨湰
+                }
+            }
+        });
+
+        // 娣诲姞鍔ㄤ綔鐩戝惉鍣�
+        addActionListener(e -> {
+            int selectedIndex = getSelectedIndex();
+            if (selectedIndex != -1) {
+                if (selectedIndices.contains(selectedIndex)) {
+                    selectedIndices.remove(selectedIndex);
+                    if (columnModel != null) {
+                        columnModel.getColumn(selectedIndex).setPreferredWidth(2);
+                    }
+                } else {
+                    selectedIndices.add(selectedIndex);
+                    if (columnModel != null) {
+                        Integer width = columnDto.get(selectedIndex).getColumnWidth();
+                        columnModel.getColumn(selectedIndex).setPreferredWidth(width);
+                    }
+                }
+            }
+        });
+
+        // 榛樿閫変腑鎵�鏈夐」
+        for (int i = 0; i < getItemCount(); i++) {
+            selectedIndices.add(i); // 灏嗘墍鏈夌储寮曟坊鍔犲埌閫変腑闆嗗悎
+        }
+    }
+
+    public Set<String> getSelectedItems() {
+        Set<String> selectedItems = new HashSet<>();
+        for (Integer index : selectedIndices) {
+            selectedItems.add((String) getItemAt(index));
+        }
+        return selectedItems;
+    }
+
+    public void setSelectedItems(Set<String> items) {
+        selectedIndices.clear(); // 娓呯┖褰撳墠閫変腑椤�
+        for (int i = 0; i < getItemCount(); i++) {
+            String item = getItemAt(i);
+            if (items.contains(item)) {
+                selectedIndices.add(i); // 灏嗗搴旂殑绱㈠紩娣诲姞鍒伴�変腑闆嗗悎
+            }
+        }
+    }
+
+    public Set<Integer> getUnselectedIndices() {
+        Set<Integer> unselectedIndices = new HashSet<>();
+        for (int i = 0; i < getItemCount(); i++) {
+            if (!selectedIndices.contains(i)) {
+                unselectedIndices.add(i);
+            }
+        }
+        return unselectedIndices;
+    }
+
+    public Set<Integer> getSelectedIndices() {
+        return new HashSet<>(selectedIndices);
+    }
+}
\ 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
deleted file mode 100644
index c381b98..0000000
--- a/src/main/java/com/example/server/DataSync/dto/DataExportDto.java
+++ /dev/null
@@ -1,9 +0,0 @@
-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
deleted file mode 100644
index a88af62..0000000
--- a/src/main/java/com/example/server/DataSync/dto/DataImportDto.java
+++ /dev/null
@@ -1,10 +0,0 @@
-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 e096a1e..3a6f4a8 100644
--- a/src/main/java/com/example/server/DataSync/service/DataSyncService.java
+++ b/src/main/java/com/example/server/DataSync/service/DataSyncService.java
@@ -1,10 +1,16 @@
 package com.example.server.DataSync.service;
 
 import com.example.Application;
+import com.example.client.service.DataExportManageService;
+import com.example.client.service.DataImportManageService;
 import com.example.client.utils.WaitUtil;
 import com.example.server.DataSync.dto.IDUpdateDateDto;
 import com.example.server.DataSync.dto.FieldTypeDto;
 import com.example.server.mysql.dao.SysMysqlDao;
+import com.example.server.progressTrack.dao.ExportRecordDao;
+import com.example.server.progressTrack.dao.ImportRecordDao;
+import com.example.server.progressTrack.model.ExportRecord;
+import com.example.server.progressTrack.model.ImportRecord;
 import com.example.server.utils.CacheUtils;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.beans.factory.annotation.Value;
@@ -28,6 +34,14 @@
 public class DataSyncService {
     @Autowired
     protected SysMysqlDao sysMysqlDao;
+    @Autowired
+    protected ExportRecordDao exportRecordDao;
+    @Autowired
+    protected ImportRecordDao importRecordDao;
+    @Autowired
+    DataExportManageService dataExportManageService;
+    @Autowired
+    DataImportManageService dataImportManageService;
 
     @Value("${data.config-path}")
     private String configPath2;
@@ -40,7 +54,9 @@
     @Value("${spring.datasource.url}")
     private String datasource;
 
-    public void export() {
+
+    public void export(JTextArea tips) {
+        final String[] massage = {""};
         String[] parts = datasource.split(":", 3);
         // 瀹氫箟鏂囦欢璺緞
         String dbPath = parts[2];
@@ -53,15 +69,16 @@
         String outputZipPath = showSaveFileDialog(mySite + "鍚屾鏁版嵁鍖�.zip");
 
         if (outputZipPath == null) {
-            System.out.println("鐢ㄦ埛鍙栨秷淇濆瓨锛岀▼搴忛��鍑恒��");
-        }else{
+            massage[0] = "鐢ㄦ埛鍙栨秷淇濆瓨锛岀▼搴忛��鍑恒��"+ new Date();
+            tips.setText(tips.getText() + massage[0]);
+        } else {
             final WaitUtil waitUtil = new WaitUtil(imgPath, "鏁版嵁姝e湪瀵煎叆锛岃绋嶅��");
 
             // 寮�濮嬩笂浼犳枃浠剁殑寮傛浠诲姟
             SwingWorker<String, Void> sw = new SwingWorker<String, Void>() {
                 @Override
                 protected String doInBackground() throws Exception {
-                    String flag =  zipData(dbPath,configPath,directoryPath,outputZipPath);
+                    String flag = zipData(dbPath, configPath, directoryPath, outputZipPath);
                     return flag;
                 }
 
@@ -74,9 +91,15 @@
                         // 鍒锋柊琛ㄦ牸鏁版嵁锛堝鏋滀笂浼犳垚鍔燂級
                         if (uploadSucceeded.equals("true")) {
                             waitUtil.dispose();
-                            System.out.println("瀵煎嚭鎴愬姛鏃堕棿" + new Date());
+                            massage[0] = "瀵煎嚭鎴愬姛" + new Date();
+                            exportRecordDao.insert(new ExportRecord());
+                            List<ExportRecord> list = exportRecordDao.getList();
+                            dataExportManageService.refresh(list);
+                            tips.setText(tips.getText() + massage[0]);
                         } else {
                             waitUtil.dispose();
+                            massage[0] = "瀵煎嚭澶辫触" + new Date();
+                            tips.setText(tips.getText() + massage[0]);
                             JOptionPane.showMessageDialog(null, uploadSucceeded, "鎻愮ず", JOptionPane.ERROR_MESSAGE);
                         }
 
@@ -92,7 +115,7 @@
         }
     }
 
-    public String zipData(String dbPath,String configPath,String directoryPath,String outputZipPath){
+    public String zipData(String dbPath, String configPath, String directoryPath, String outputZipPath) {
         // 鍒涘缓ZIP鏂囦欢杈撳嚭娴�
         FileOutputStream fos = null;
         ZipOutputStream zos = null;
@@ -123,7 +146,8 @@
         return "true";
     }
 
-    public void importData() {
+    public void importData(JTextArea tips) {
+        String massage = "";
         InputStream inStream = null;
         Properties properties = new Properties();
         try {
@@ -137,8 +161,8 @@
 
             // 閫掑綊澶嶅埗鏂囦欢澶�
             copyDirectory(sourceDir, targetDir);
-            System.out.println("鏂囦欢澶瑰鍒跺畬鎴愶紝鐩爣璺緞锛�" + targetDir);
-
+            massage = "鏂囦欢澶瑰鍒跺畬鎴愶紝鐩爣璺緞锛�" + targetDir;
+            tips.setText(tips.getText() + massage);
             //璇诲彇閰嶇疆
             inStream = new FileInputStream(UnzipPath + "config.properties");
             properties.load(inStream);
@@ -175,6 +199,8 @@
                 syncTable("dj_jdgz_track_record");
                 syncTable("dj_sys_oss");
                 syncTable("dj_jdgz_dismant_track");
+                syncTable("dj_sys_teamgroup_class");
+                syncTable("sys_user");
             }
         } else if ("鍘傚".equals(mySite)) {
             syncTable("dj_jdgz_handover");
@@ -188,6 +214,11 @@
             syncTable("dj_sys_oss");
             syncTable("dj_jdgz_dismant_track");
         }
+        ImportRecord data =new ImportRecord();
+        data.setImportSite(otherSite);
+        importRecordDao.insert(data);
+        List<ImportRecord> list = importRecordDao.getList();
+        dataImportManageService.refresh(list);
     }
 
     public void syncTable(String tableName) {
@@ -250,7 +281,7 @@
                     java.util.Date otherUpdateDate = dateFormat.parse(otherupdateDate);
                     if (otherUpdateDate.after(mysqlUpdateDate)) {
                         isUpdate = true;
-                    }else {
+                    } else {
                         continue;
                     }
                 }
diff --git a/src/main/java/com/example/server/ExportExcel/method/ExcelExport.java b/src/main/java/com/example/server/ExportExcel/method/ExcelExport.java
index b717d9f..e3da8f8 100644
--- a/src/main/java/com/example/server/ExportExcel/method/ExcelExport.java
+++ b/src/main/java/com/example/server/ExportExcel/method/ExcelExport.java
@@ -10,6 +10,7 @@
 import org.apache.poi.xssf.streaming.SXSSFWorkbook;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.lang.reflect.Method;
diff --git a/src/main/java/com/example/server/entity/FieldMetaObjectHandler.java b/src/main/java/com/example/server/entity/FieldMetaObjectHandler.java
index 823c875..16b1603 100644
--- a/src/main/java/com/example/server/entity/FieldMetaObjectHandler.java
+++ b/src/main/java/com/example/server/entity/FieldMetaObjectHandler.java
@@ -19,6 +19,7 @@
 import org.springframework.stereotype.Component;
 
 import java.time.LocalDate;
+import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
 import java.util.Date;
 
@@ -34,10 +35,10 @@
     public void insertFill(MetaObject metaObject) {
         Object object = metaObject.getOriginalObject();
         SysUser user = (SysUser) CacheUtils.get("user","user");
-        LocalDate currentDate = LocalDate.now();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime currentDateTime = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         // 灏嗗綋鍓嶆棩鏈熸牸寮忓寲涓哄瓧绗︿覆
-        String date = currentDate.format(formatter);
+        String date = currentDateTime.format(formatter);
 
         if (object instanceof TeamEntity) {
             TeamEntity entity = (TeamEntity) object;
@@ -64,10 +65,10 @@
 
     @Override
     public void updateFill(MetaObject metaObject) {
-        LocalDate currentDate = LocalDate.now();
-        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");
+        LocalDateTime currentDateTime = LocalDateTime.now();
+        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
         // 灏嗗綋鍓嶆棩鏈熸牸寮忓寲涓哄瓧绗︿覆
-        String date = currentDate.format(formatter);
+        String date = currentDateTime.format(formatter);
         SysUser user =(SysUser) CacheUtils.get("user","user");
         Object object = metaObject.getOriginalObject();
         if (object instanceof PlatformEntity) {
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 dd46f58..faa80ec 100644
--- a/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java
+++ b/src/main/java/com/example/server/progressTrack/dao/DjJdgzTrackRecordDao.java
@@ -19,7 +19,7 @@
 @Mapper
 public interface DjJdgzTrackRecordDao extends BaseDao<DjJdgzTrackRecord> {
 
-    List<DjJdgzTrackRecord> getList(Long level1NetworkId,Integer status,Long userId);
+    List<DjJdgzTrackRecord> getList(Long level1NetworkId, Long deptId, Long teamId, Long cabinId, String type, Integer status, String name);
 
     List<DjJdgzTrackRecord> getHistory(Long level3NodeId);
 
@@ -34,4 +34,6 @@
     Integer getTrackNum(Long level3NodeId);
 
     List<DjJdgzTrackRecord> getListByImport(Long level1Id, Long level2Id, Long level2NodeId, String selectedIds);
+
+    void retract(Long id);
 }
diff --git a/src/main/java/com/example/server/progressTrack/dao/ExportRecordDao.java b/src/main/java/com/example/server/progressTrack/dao/ExportRecordDao.java
new file mode 100644
index 0000000..9af9b4b
--- /dev/null
+++ b/src/main/java/com/example/server/progressTrack/dao/ExportRecordDao.java
@@ -0,0 +1,20 @@
+package com.example.server.progressTrack.dao;
+
+import com.example.server.dao.BaseDao;
+import com.example.server.progressTrack.model.ExportRecord;
+import com.example.server.progressTrack.model.ImportRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+
+/**
+ * dj_jdgz_ship
+ *
+ * @author zt generator 
+ * @since 1.0.0 2024-12-18
+ */
+@Mapper
+public interface ExportRecordDao extends BaseDao<ExportRecord> {
+    List<ExportRecord> getList();
+}
diff --git a/src/main/java/com/example/server/progressTrack/dao/ImportRecordDao.java b/src/main/java/com/example/server/progressTrack/dao/ImportRecordDao.java
new file mode 100644
index 0000000..25df55e
--- /dev/null
+++ b/src/main/java/com/example/server/progressTrack/dao/ImportRecordDao.java
@@ -0,0 +1,22 @@
+package com.example.server.progressTrack.dao;
+
+import com.example.client.dto.JComboBoxItem;
+import com.example.server.dao.BaseDao;
+import com.example.server.progressTrack.model.DjJdgzShip;
+import com.example.server.progressTrack.model.ImportRecord;
+import org.apache.ibatis.annotations.Mapper;
+
+import java.util.List;
+
+
+/**
+ * dj_jdgz_ship
+ *
+ * @author zt generator 
+ * @since 1.0.0 2024-12-18
+ */
+@Mapper
+public interface ImportRecordDao extends BaseDao<ImportRecord> {
+    List<ImportRecord> getList();
+
+}
diff --git a/src/main/java/com/example/server/progressTrack/model/DjJdgzHandover.java b/src/main/java/com/example/server/progressTrack/model/DjJdgzHandover.java
index eebfbd7..5edfcd5 100644
--- a/src/main/java/com/example/server/progressTrack/model/DjJdgzHandover.java
+++ b/src/main/java/com/example/server/progressTrack/model/DjJdgzHandover.java
@@ -13,38 +13,42 @@
 /**
  * dj_jdgz_handover
  *
- * @author zt generator 
+ * @author zt generator
  * @since 1.0.0 2024-12-17
  */
 @Data
-@EqualsAndHashCode(callSuper=false)
+@EqualsAndHashCode(callSuper = false)
 @TableName("dj_jdgz_handover")
 public class DjJdgzHandover extends BusiEntity {
-	private static final long serialVersionUID = 1L;
+    private static final long serialVersionUID = 1L;
 
-	@ApiModelProperty(value = "涓�绾х綉缁滃浘ID")
-	private Long level1NetworkId;
+    @ApiModelProperty(value = "涓�绾х綉缁滃浘ID")
+    private Long level1NetworkId;
 
-	@TableField(exist = false)
-	@ApiModelProperty(value = "宸ョ▼鍚嶇О锛堢敱X鍙�-骞翠唤-淇悊绛夌骇鑷姩鎷兼帴锛�")
-	private String projectName;
+    @TableField(exist = false)
+    @ApiModelProperty(value = "宸ョ▼鍚嶇О锛堢敱X鍙�-骞翠唤-淇悊绛夌骇鑷姩鎷兼帴锛�")
+    private String projectName;
 
-	@ApiModelProperty(value = "褰撳墠闃�")
-	private String currentTeam;
+    @ApiModelProperty(value = "褰撳墠闃�")
+    private String currentTeam;
 
-	@ApiModelProperty(value = "浜ゆ帴闃�")
-	private String handoverTeam;
+    @ApiModelProperty(value = "浜ゆ帴闃�")
+    private String handoverTeam;
 
-	@ApiModelProperty(value = "浜ゆ帴鏃堕棿")
-	private String handoverTime;
+    @ApiModelProperty(value = "浜ゆ帴鏃堕棿")
+    private String handoverTime;
 
-	@ApiModelProperty(value = "浜ゆ帴鎯呭喌璇存槑")
-	private String handoverSituation;
+    @ApiModelProperty(value = "浜ゆ帴鎯呭喌璇存槑")
+    private String tdExplan;
+    @ApiModelProperty(value = "浜ゆ帴鎯呭喌璇存槑")
+    private String professExplan;
+    @ApiModelProperty(value = "浜ゆ帴鎯呭喌璇存槑")
+    private String deptExplan;
 
-	@ApiModelProperty(value = "澶囨敞")
-	private Integer remark;
+    @ApiModelProperty(value = "澶囨敞")
+    private Integer remark;
 
-	@TableField(exist = false)
-	private String fileName;
+    @TableField(exist = false)
+    private String fileName;
 
 }
diff --git a/src/main/java/com/example/server/progressTrack/model/ExportRecord.java b/src/main/java/com/example/server/progressTrack/model/ExportRecord.java
new file mode 100644
index 0000000..9407287
--- /dev/null
+++ b/src/main/java/com/example/server/progressTrack/model/ExportRecord.java
@@ -0,0 +1,25 @@
+package com.example.server.progressTrack.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.example.client.entity.PlatformLogEntity;
+import com.example.server.entity.BaseEntity;
+import com.example.server.entity.BusiEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * dj_jdgz_handover
+ *
+ * @author zt generator
+ * @since 1.0.0 2024-12-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("export_record")
+public class ExportRecord extends PlatformLogEntity {
+    @TableField(exist = false)
+    private String userName;
+}
diff --git a/src/main/java/com/example/server/progressTrack/model/ImportRecord.java b/src/main/java/com/example/server/progressTrack/model/ImportRecord.java
new file mode 100644
index 0000000..2809fd1
--- /dev/null
+++ b/src/main/java/com/example/server/progressTrack/model/ImportRecord.java
@@ -0,0 +1,27 @@
+package com.example.server.progressTrack.model;
+
+import com.baomidou.mybatisplus.annotation.FieldFill;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.example.client.entity.PlatformLogEntity;
+import com.example.server.entity.BaseEntity;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * dj_jdgz_handover
+ *
+ * @author zt generator
+ * @since 1.0.0 2024-12-17
+ */
+@Data
+@EqualsAndHashCode(callSuper = false)
+@TableName("import_record")
+public class ImportRecord extends PlatformLogEntity {
+    private String importSite;
+
+    @TableField(exist = false)
+    private String userName;
+
+}
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 6cebd68..4f1382d 100644
--- a/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java
+++ b/src/main/java/com/example/server/progressTrack/service/DjJdgzNetworkLevel3Service.java
@@ -262,18 +262,18 @@
                         time1 = time1.replace("/", "-");
                         node.setRequiredCompletionTime(time1);
                         node.setProcessName(mapProcessName.get(1));
-                        node.setSort(sort + 1);
+                        node.setSort(1);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time1.matches("[0-9.]+")) {
                         time1 = time1.replace(".", "-");
                         node.setRequiredCompletionTime(time1);
                         node.setProcessName(mapProcessName.get(1));
-                        node.setSort(sort + 1);
+                        node.setSort(1);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time1.matches("[0-9-]+")) {
                         node.setRequiredCompletionTime(time1);
                         node.setProcessName(mapProcessName.get(1));
-                        node.setSort(sort + 1);
+                        node.setSort(1);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else {
                         result = "绗�" + j + "琛�" + "绗�" + 1 + "涓�" + "鑺傜偣鏃堕棿鏃ユ湡鏍煎紡涓嶈鑼�";
@@ -288,18 +288,18 @@
                     if (time2.matches("[0-9/]+")) {
                         node.setRequiredCompletionTime(time2);
                         node.setProcessName(mapProcessName.get(2));
-                        node.setSort(sort + 1);
+                        node.setSort(2);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time2.matches("[0-9.]+")) {
                         time2 = time2.replace(".", "-");
                         node.setRequiredCompletionTime(time2);
                         node.setProcessName(mapProcessName.get(2));
-                        node.setSort(sort + 1);
+                        node.setSort(2);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time2.matches("[0-9-]+")) {
                         node.setRequiredCompletionTime(time2);
                         node.setProcessName(mapProcessName.get(2));
-                        node.setSort(sort + 1);
+                        node.setSort(2);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else {
                         result = "绗�" + j + "琛�" + "绗�" + 2 + "涓�" + "鑺傜偣鏃堕棿鐨勬棩鏈熸牸寮忎笉瑙勮寖";
@@ -315,18 +315,18 @@
                         time3 = time3.replace("/", "-");
                         node.setRequiredCompletionTime(time3);
                         node.setProcessName(mapProcessName.get(3));
-                        node.setSort(sort + 1);
+                        node.setSort(3);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time3.matches("[0-9.]+")) {
                         time3 = time3.replace(".", "-");
                         node.setRequiredCompletionTime(time3);
                         node.setProcessName(mapProcessName.get(3));
-                        node.setSort(sort + 1);
+                        node.setSort(3);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time3.matches("[0-9-]+")) {
                         node.setRequiredCompletionTime(time3);
                         node.setProcessName(mapProcessName.get(3));
-                        node.setSort(sort + 1);
+                        node.setSort(3);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else {
                         result = "绗�" + j + "琛�" + "绗�" + 3 + "涓�" + "鑺傜偣鏃堕棿鐨勬棩鏈熸牸寮忎笉瑙勮寖";
@@ -342,18 +342,18 @@
                         time4 = time4.replace("/", "-");
                         node.setRequiredCompletionTime(time4);
                         node.setProcessName(mapProcessName.get(4));
-                        node.setSort(sort + 1);
+                        node.setSort(4);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time4.matches("[0-9.]+")) {
                         time4 = time4.replace(".", "-");
                         node.setRequiredCompletionTime(time4);
                         node.setProcessName(mapProcessName.get(4));
-                        node.setSort(sort + 1);
+                        node.setSort(4);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time4.matches("[0-9-]+")) {
                         node.setRequiredCompletionTime(time4);
                         node.setProcessName(mapProcessName.get(4));
-                        node.setSort(sort + 1);
+                        node.setSort(4);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else {
                         result = "绗�" + j + "琛�" + "绗�" + 4 + "涓�" + "鑺傜偣鏃堕棿鐨勬棩鏈熸牸寮忎笉瑙勮寖";
@@ -369,18 +369,18 @@
                         time5 = time5.replace("/", "-");
                         node.setRequiredCompletionTime(time5);
                         node.setProcessName(mapProcessName.get(5));
-                        node.setSort(sort + 1);
+                        node.setSort(5);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time5.matches("[0-9.]+")) {
                         time5 = time5.replace(".", "-");
                         node.setRequiredCompletionTime(time5);
                         node.setProcessName(mapProcessName.get(5));
-                        node.setSort(sort + 1);
+                        node.setSort(5);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else if (time5.matches("[0-9-]+")) {
                         node.setRequiredCompletionTime(time5);
                         node.setProcessName(mapProcessName.get(5));
-                        node.setSort(sort + 1);
+                        node.setSort(5);
                         DjJdgzNetworkLevel3ListService.insert(node);
                     } else {
                         result = "绗�" + j + "琛�" + "绗�" + 5 + "涓�" + "瑕佹眰瀹屾垚鏃堕棿鐨勬棩鏈熸牸寮忎笉瑙勮寖";
@@ -401,13 +401,13 @@
                 if (StringUtils.isNotBlank(generalRepairUnitDirector)) {
                     data.setGeneralRepairUnitDirector(generalRepairUnitDirector);
                 }
-                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                if (StringUtils.isNotBlank(repairUnit)) {
                     data.setRepairUnit(repairUnit);
                 }
-                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                if (StringUtils.isNotBlank(repairUnitContact)) {
                     data.setRepairUnitContact(repairUnitContact);
                 }
-                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                if (StringUtils.isNotBlank(repairUnitDirector)) {
                     data.setRepairUnitDirector(repairUnitDirector);
                 }
 
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 e011133..2d8cbc5 100644
--- a/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java
+++ b/src/main/java/com/example/server/progressTrack/service/DjJdgzTrackRecordService.java
@@ -7,17 +7,26 @@
 import com.example.server.progressTrack.Dto.StatistReportsDto;
 import com.example.server.progressTrack.dao.DjJdgzTrackRecordDao;
 import com.example.server.progressTrack.model.DjJdgzNetworkLevel1;
+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.teamGroup.service.SysTeamGroupClassService;
 import com.example.server.user.service.UserService;
+import com.example.server.utils.FileUtils;
+import com.example.server.utils.ImportUtil;
 import com.example.server.utils.TreeFieldUtils;
 import com.example.server.utils.UUIDUtil;
+import org.apache.commons.lang3.StringUtils;
+import org.apache.poi.hssf.usermodel.HSSFWorkbook;
 import org.apache.poi.ss.usermodel.HorizontalAlignment;
+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.stereotype.Service;
+import org.springframework.web.multipart.MultipartFile;
 
-import javax.servlet.http.HttpServletResponse;
 import java.io.IOException;
 import java.text.ParseException;
 import java.text.SimpleDateFormat;
@@ -41,12 +50,14 @@
     @Autowired
     private DjJdgzNetworkLevel3ListService djJdgzNetworkLevel3ListService;
     @Autowired
+    private DjJdgzNetworkLevel3Service djJdgzNetworkLevel3Service;
+    @Autowired
     private UserService sysUserService;
     @Autowired
     private SysTeamGroupClassService sysTeamGroupClassService;
 
 
-    public List<DjJdgzTrackRecord> getList(Long level1NetworkId, Integer status) {
+    public List<DjJdgzTrackRecord> getList(Long level1NetworkId, Long deptId, Long teamId, Long cabinId, String type, Integer status, String name) {
         Long userId = null;
        /* Map adminRole = sysUserService.adminRole();
         Object isTyRole = adminRole.get("isTyRole");
@@ -54,7 +65,7 @@
         if (isTyRole.equals(true) || isYwzRole.equals(true)) {
             userId =  UserContext.getUser().getId();
         }*/
-        List<DjJdgzTrackRecord> list = baseDao.getList(level1NetworkId, status, userId);
+        List<DjJdgzTrackRecord> list = baseDao.getList(level1NetworkId,deptId,teamId,cabinId,type, status, name);
         /*if (list != null && list.size() > 0) {
             sysOssService.setListOsses(list, "ProjectProgressFileUpload");
         }*/
@@ -205,7 +216,7 @@
 
     public void exportExcel(String filePath, String teamgroupId, Long level1NetworkId,
                             Long level3NetworkId, Long level3NodeId, Integer status, Date beginDate,
-                            Date endDate, Integer istq) {
+                            Date endDate, Integer istq, List<ExcelColumnDto> columnDto) {
         List<ExprotExcelDto> dtos = new ArrayList<>();
    /*     Map<String, String> keywordMap = dailyPlanService.getReplacement();
         String keywordT = keywordMap.get("ting");*/
@@ -225,26 +236,6 @@
 
         ExprotExcelDto dto = new ExprotExcelDto();
         dto.setSheetName("璺熻釜璁板綍鏄庣粏");
-        List<ExcelColumnDto> columnDto = new ArrayList<>();
-
-        columnDto.add(new ExcelColumnDto("涓�绾ц妭鐐�", "Level1NodeName", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("浜岀骇鑺傜偣", "Level2NodeName", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("椤圭洰鍚嶇О", "Level3NetworkName", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("褰撳墠鑺傜偣", "Level3NodeName", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("涓撲笟", "TeamGroupName", 20, HorizontalAlignment.CENTER));
-        columnDto.add(new ExcelColumnDto("鎬绘壙淇崟浣嶅強璐熻矗浜�", "GeneralRepair", 25, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("鍒嗘壙淇崟浣嶅強璐熻矗浜�", "Repair", 25, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("璺熻釜鏂瑰紡", "trackMethodStr", 10, HorizontalAlignment.CENTER));
-        columnDto.add(new ExcelColumnDto("鍔╀慨浜�", "TrackPerson", 25, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("鍘傛柟", "TrackedPerson", 25, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("璺熻釜鍦扮偣", "TrackLocation", 10, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("鑺傜偣杩涘睍", "status", 10, HorizontalAlignment.CENTER));
-        columnDto.add(new ExcelColumnDto("鑴辨湡椋庨櫓", "hasDelayRiskStr", 10, HorizontalAlignment.CENTER));
-        columnDto.add(new ExcelColumnDto("棰勮瀹屾垚鏃堕棿", "EstimatedCompletionTime", 15, HorizontalAlignment.CENTER));
-        columnDto.add(new ExcelColumnDto("瀛樺湪闂", "Problem", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("鍚庣画璁″垝", "FollowupPlan", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("澶囨敞", "Remark", 20, HorizontalAlignment.LEFT));
-        columnDto.add(new ExcelColumnDto("濉啓鏃堕棿", "UpdateDate", 15, HorizontalAlignment.CENTER));
 
         List<DjJdgzTrackRecord> list = baseDao.getdata(teamgroupId, level1NetworkId, level3NetworkId, level3NodeId, status, beginDate, endDate, istq);
 
@@ -304,6 +295,240 @@
     }
 
     public List<DjJdgzTrackRecord> getListByImport(Long level1Id, Long level2Id, Long level2NodeId, String selectedIds) {
-        return baseDao.getListByImport(level1Id,level2Id,level2NodeId,selectedIds);
+        return baseDao.getListByImport(level1Id, level2Id, level2NodeId, selectedIds);
+    }
+
+    public String importDiagramFromExcel(String path) {
+        String result = "true";
+        Integer sum = 0; // 鎬诲叡鐨勬潯鏁�
+        Integer suc = 0; // 鎴愬姛鐨勬潯鏁�
+        Integer err = 0; // 澶辫触鐨勬潯鏁�
+        Map<String, Object> errMap = new HashMap<>();
+        MultipartFile mutFile = null;
+        try {
+            mutFile = FileUtils.convertFileToMultipartFile(path);
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        String sheetName = null;
+        int row1 = 0;
+        try {
+            // 鑾峰彇瀵煎叆鏂囦欢鐨勫悗缂�鍚�
+            String fileName = mutFile.getOriginalFilename();
+            Workbook workbook = null;
+            //瑙e喅excel鐗堟湰闂
+            if (fileName != null && fileName.endsWith(".xls")) {
+                workbook = new HSSFWorkbook(mutFile.getInputStream());
+            } else if (fileName != null && fileName.endsWith(".xlsx")) {
+                workbook = new XSSFWorkbook(mutFile.getInputStream());
+            }
+            assert workbook != null; //鏂█濡傛灉[boolean琛ㄨ揪寮廬涓簍rue锛屽垯绋嬪簭缁х画鎵ц銆� 濡傛灉涓篺alse锛屽垯绋嬪簭鎶涘嚭AssertionError锛屽苟缁堟鎵ц銆�
+
+            Sheet sheet = workbook.getSheetAt(0);
+            int num = sheet.getLastRowNum(); // 涓�鍏辨湁澶氬皯琛�
+            sheetName = sheet.getSheetName(); //鑾峰彇褰撳墠sheet鍚嶇О
+            sum = sum + num;
+
+            Map<String, Integer> trackMethodMap = new HashMap<>();
+            trackMethodMap.put("绾夸笅", 0);
+            trackMethodMap.put("鐢佃瘽", 1);
+
+            Map<String, Integer> statusMap = new HashMap<>();
+            statusMap.put("杩涜涓�", 0);
+            statusMap.put("宸插畬鎴�", 1);
+
+            Map<String, Integer> hasDelayRiskMap = new HashMap<>();
+            hasDelayRiskMap.put("鏈�", 1);
+            hasDelayRiskMap.put("鏃�", 0);
+
+
+            for (int j = 2; j <= num; j++) {
+                int sort = 0;
+                DjJdgzTrackRecord data = new DjJdgzTrackRecord();
+
+                boolean isErr = false;
+                row1 = j + 1;
+                String pattern = "yyyy-MM-dd";
+                Row row = sheet.getRow(j);
+
+                String idStr = ImportUtil.getCellValue(row, 0, pattern);
+                String dataDate = ImportUtil.getCellValue(row, 1, pattern);
+                String name = ImportUtil.getCellValue(row, 2, pattern);
+                String progressName = ImportUtil.getCellValue(row, 3, pattern);
+                String trackMethodStr = ImportUtil.getCellValue(row, 4, pattern);
+                String trackLocationStr = ImportUtil.getCellValue(row, 5, pattern);
+                String currentStatusStr = ImportUtil.getCellValue(row, 6, pattern);
+                String hasDelayRiskStr = ImportUtil.getCellValue(row, 7, pattern);
+                String estimatedCompletionTimeStr = ImportUtil.getCellValue(row, 8, pattern);
+                String problemStr = ImportUtil.getCellValue(row, 9, pattern);
+                String followupPlanStr = ImportUtil.getCellValue(row, 10, pattern);
+                String remarkStr = ImportUtil.getCellValue(row, 11, pattern);
+                String trackPersonStr = ImportUtil.getCellValue(row, 12, pattern);
+                String trackPersonContact = ImportUtil.getCellValue(row, 13, pattern);
+                String trackPersonUnit = ImportUtil.getCellValue(row, 14, pattern);
+                String trackedPerson = ImportUtil.getCellValue(row, 15, pattern);
+                String trackedPersonContact = ImportUtil.getCellValue(row, 16, pattern);
+                String trackedPersonUnit = ImportUtil.getCellValue(row, 17, pattern);
+                String generalRepairUnit = ImportUtil.getCellValue(row, 18, pattern);
+                String generalRepairUnitDirector = ImportUtil.getCellValue(row, 19, pattern);
+                String generalRepairUnitContact = ImportUtil.getCellValue(row, 20, pattern);
+                String repairUnit = ImportUtil.getCellValue(row, 21, pattern);
+                String repairUnitDirector = ImportUtil.getCellValue(row, 22, pattern);
+                String repairUnitContact = ImportUtil.getCellValue(row, 23, pattern);
+
+                DjJdgzNetworkLevel3 level3 = djJdgzNetworkLevel3Service.get(Long.parseLong(idStr));
+                Long level1NetworkId = level3.getLevel1NetworkId();
+
+                Long id = UUIDUtil.generateId();
+
+                if (StringUtils.isEmpty(dataDate)) {
+                    result = "绗�" + j + "琛�" + "褰曞叆鏃堕棿涓嶈兘涓虹┖";
+                    isErr = true;
+                    continue;
+                } else {
+                    int weekNo = this.getWeekNo(level1NetworkId);
+                    data.setWeekNo(weekNo);
+                    data.setLevel1NetworkId(level1NetworkId);
+                    data.setLevel3NetworkId(level3.getId());
+                }
+
+                if (StringUtils.isEmpty(name)) {
+                    result = "绗�" + j + "琛�" + "璁惧鍚嶇О涓嶈兘涓虹┖";
+                    isErr = true;
+                    continue;
+                } else {
+                    data.setId(id);
+                    data.setLevel3NetworkName(name);
+                }
+
+                if (StringUtils.isEmpty(progressName)) {
+                    result = "绗�" + j + "琛�" + "鑺傜偣鍚嶇О涓嶈兘涓虹┖";
+                    isErr = true;
+                    continue;
+                } else {
+                    List<DjJdgzNetworkLevel3List> list = djJdgzNetworkLevel3ListService.getList(level3.getId());
+                    for (DjJdgzNetworkLevel3List item : list) {
+                        if(item.getProcessName().equals(progressName)){
+                            data.setLevel3NodeId(item.getId());
+                            data.setEstimatedCompletionTime(item.getRequiredCompletionTime());
+                            break;
+                        }
+                    }
+                    data.setProcessName(progressName);
+                }
+
+                if (StringUtils.isEmpty(trackMethodStr)) {
+                    data.setTrackMethod(0);
+                } else {
+                    data.setTrackMethod(trackMethodMap.get(trackMethodStr));
+                }
+
+                if (StringUtils.isNotBlank(trackLocationStr)) {
+                    data.setTrackLocation(trackLocationStr);
+                }
+
+                if (StringUtils.isEmpty(currentStatusStr)) {
+                    data.setCurrentStatus(0);
+                } else {
+                    data.setCurrentStatus(statusMap.get(currentStatusStr));
+                }
+
+                if (StringUtils.isEmpty(hasDelayRiskStr)) {
+                    data.setHasDelayRisk(0);
+                } else {
+                    data.setHasDelayRisk(hasDelayRiskMap.get(hasDelayRiskStr));
+                }
+
+                if (StringUtils.isNotBlank(estimatedCompletionTimeStr)) {
+                    if (estimatedCompletionTimeStr.matches("[0-9/]+")) {
+                        estimatedCompletionTimeStr = estimatedCompletionTimeStr.replace("/", "-");
+                        data.setEstimatedCompletionTime(estimatedCompletionTimeStr);
+                    } else if (estimatedCompletionTimeStr.matches("[0-9.]+")) {
+                        estimatedCompletionTimeStr = estimatedCompletionTimeStr.replace(".", "-");
+                        data.setEstimatedCompletionTime(estimatedCompletionTimeStr);
+                    } else if (estimatedCompletionTimeStr.matches("[0-9-]+")) {
+                        data.setEstimatedCompletionTime(estimatedCompletionTimeStr);
+                    } else {
+                        result = "绗�" + j + "琛�" + "绗�" + 1 + "涓�" + "棰勮瀹屾垚鏃堕棿鏃ユ湡鏍煎紡涓嶈鑼�";
+                        isErr = true;
+                    }
+                }
+
+                if (StringUtils.isNotBlank(problemStr)) {
+                    data.setProblem(problemStr);
+                }
+
+                if (StringUtils.isNotBlank(followupPlanStr)) {
+                    data.setFollowupPlan(followupPlanStr);
+                }
+
+                if (StringUtils.isNotBlank(remarkStr)) {
+                    data.setRemark(remarkStr);
+                }
+
+                if (StringUtils.isNotBlank(trackPersonStr)) {
+                    data.setTrackPerson(trackPersonStr);
+                }
+
+                if (StringUtils.isNotBlank(trackPersonContact)) {
+                    data.setTrackPersonContact(trackPersonContact);
+                }
+
+                if (StringUtils.isNotBlank(trackPersonUnit)) {
+                    data.setTrackPersonUnit(trackPersonUnit);
+                }
+
+                if (StringUtils.isNotBlank(trackedPerson)) {
+                    data.setTrackPerson(trackPersonStr);
+                }
+
+                if (StringUtils.isNotBlank(trackedPersonContact)) {
+                    data.setTrackPersonContact(trackPersonContact);
+                }
+
+                if (StringUtils.isNotBlank(trackedPersonUnit)) {
+                    data.setTrackPersonUnit(trackPersonUnit);
+                }
+                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                    data.setGeneralRepairUnit(generalRepairUnit);
+                }
+
+                if (StringUtils.isNotBlank(generalRepairUnitContact)) {
+                    data.setGeneralRepairUnitContact(generalRepairUnitContact);
+                }
+                if (StringUtils.isNotBlank(generalRepairUnitDirector)) {
+                    data.setGeneralRepairUnitDirector(generalRepairUnitDirector);
+                }
+                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                    data.setRepairUnit(repairUnit);
+                }
+                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                    data.setRepairUnitContact(repairUnitContact);
+                }
+                if (StringUtils.isNotBlank(generalRepairUnit)) {
+                    data.setRepairUnitDirector(repairUnitDirector);
+                }
+
+                if (!isErr) {
+                    data.setIsUpdate(false);
+                    this.save(data);
+                }
+                if (isErr) {
+                    err++;
+                    continue;
+                }
+            }
+        } catch (Exception e) {
+            e.printStackTrace();
+            result = "瀵煎叆" + row1 + "琛屾暟鎹椂妫�娴嬪埌寮傚父锛屼腑鏂鍏ユ搷浣溿��";
+        }
+
+        suc = sum - err;
+
+        return result;
+    }
+
+    public void retract(Long id) {
+        baseDao.retract(id);
     }
 }
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 f5d3f45..442e863 100644
--- a/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java
+++ b/src/main/java/com/example/server/teamGroup/model/SysTeamGroupClass.java
@@ -34,10 +34,10 @@
 
 	@ApiModelProperty(value = "鍚嶇О")
 	private String name;
-
 	@ApiModelProperty(value = "鍒嗙被锛圓/B锛�")
 	private String classType;
 
+	@TableField(exist = false)
 	@ApiModelProperty(value = "绫诲瀷锛�")
 	private String type;
 
diff --git a/src/main/java/com/example/server/utils/DownLoadTmpFile.java b/src/main/java/com/example/server/utils/DownLoadTmpFile.java
index fa11450..73e175b 100644
--- a/src/main/java/com/example/server/utils/DownLoadTmpFile.java
+++ b/src/main/java/com/example/server/utils/DownLoadTmpFile.java
@@ -91,7 +91,7 @@
                 Row row = sheet.createRow(num);
 
                 Cell cell = row.createCell(0);
-                cell.setCellValue(list.get(i).getId());
+                cell.setCellValue(list.get(i).getId().toString());
 
                 cell = row.createCell(1);
                 cell.setCellValue(date);
@@ -137,7 +137,7 @@
                 }
                 cell = row.createCell(20);
                 if (StringUtils.isNotBlank(list.get(i).getGeneralRepairUnitContact())) {
-                    cell.setCellValue(list.get(i).getGeneralRepairUnitDirector());
+                    cell.setCellValue(list.get(i).getGeneralRepairUnitContact());
                 }
                 cell = row.createCell(21);
                 if (StringUtils.isNotBlank(list.get(i).getRepairUnit())) {
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index d213c7e..2a6d2f0 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -1,6 +1,3 @@
-server:
-  port: 8080
-
 logging:
   level:
     com.example: debug
diff --git a/src/main/resources/db/csiczb1.db b/src/main/resources/db/csiczb1.db
index 831fc47..26c365e 100644
--- a/src/main/resources/db/csiczb1.db
+++ b/src/main/resources/db/csiczb1.db
Binary files differ
diff --git a/src/main/resources/logback-spring.xml b/src/main/resources/logback-spring.xml
index 104ee63..97ef477 100644
--- a/src/main/resources/logback-spring.xml
+++ b/src/main/resources/logback-spring.xml
@@ -1,7 +1,7 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <configuration scan="true" scanPeriod="60 seconds" debug="false">
     <!-- 鏃ュ織鏍圭洰褰�-->
-    <property name="LOG_PATH" value="../logs"/>
+    <property name="LOG_PATH" value="./log"/>
     <!-- 椤圭洰鍚�   -->
     <property name="PROJECT_NAME" value="progress_track"/>
     <!-- 瀹氫箟鎺у埗鍙拌緭鍑烘牸寮忛鑹� 鏃ュ織鏂囦欢鏍煎紡 -->
diff --git a/src/main/resources/mapper/cabin/CabinDao.xml b/src/main/resources/mapper/cabin/CabinDao.xml
index 8e0300a..c0382af 100644
--- a/src/main/resources/mapper/cabin/CabinDao.xml
+++ b/src/main/resources/mapper/cabin/CabinDao.xml
@@ -11,5 +11,7 @@
         SELECT
             null AS id,
             '' AS name
+        ORDER BY
+            id
     </select>
 </mapper>
diff --git a/src/main/resources/mapper/menu/MenuDao.xml b/src/main/resources/mapper/menu/MenuDao.xml
index 64ba80f..6935e5f 100644
--- a/src/main/resources/mapper/menu/MenuDao.xml
+++ b/src/main/resources/mapper/menu/MenuDao.xml
@@ -7,14 +7,17 @@
     </update>
 
     <select id="getList" resultType="com.example.server.menu.model.Menu">
-        select a.id,a.pid,a.menu_name
-        from menu a
-        where
-            a.is_delete = 0
-            <if test="site!='宸ヤ綔缁�'">
-                and menu_name not like '%绠$悊%'
-            </if>
-        order by sort
+        SELECT a.id, a.pid, a.menu_name
+        FROM menu a
+        WHERE
+        a.is_delete = 0
+        <if test="site != '宸ヤ綔缁�'">
+            AND (
+            menu_name NOT LIKE '%绠$悊%'
+            OR menu_name = '涓夌骇缃戠粶鍥剧鐞�'
+            )
+        </if>
+        ORDER BY sort;
     </select>
 
 </mapper>
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzHandoverDao.xml b/src/main/resources/mapper/progressTrack/DjJdgzHandoverDao.xml
index cd1f2d8..a1668a2 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzHandoverDao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzHandoverDao.xml
@@ -7,7 +7,7 @@
         SELECT
             a.*,
             b.project_name,
-            GROUP_CONCAT(c.name) AS fileName-- 浣跨敤 GROUP_CONCAT 鎷兼帴 c.name
+            GROUP_CONCAT(c.name) AS fileName
         FROM
             dj_jdgz_handover a
                 LEFT JOIN dj_jdgz_network_level1 b
diff --git a/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml b/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
index 641ddf3..e9c7928 100644
--- a/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
+++ b/src/main/resources/mapper/progressTrack/DjJdgzTrackRecordDao.xml
@@ -2,6 +2,16 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 
 <mapper namespace="com.example.server.progressTrack.dao.DjJdgzTrackRecordDao">
+    <update id="retract">
+        UPDATE dj_jdgz_track_record
+        SET CURRENT_STATUS = 0
+        WHERE LEVEL3_NETWORK_ID = (
+            SELECT LEVEL3_NETWORK_ID FROM dj_jdgz_track_record WHERE id = ${id}
+        )
+          AND create_date >= (
+            SELECT create_date FROM dj_jdgz_track_record WHERE id = ${id}
+        );
+    </update>
 
     <select id="getList" resultType="com.example.server.progressTrack.model.DjJdgzTrackRecord">
         SELECT
@@ -59,9 +69,6 @@
         WHERE
         a.IS_DELETE = 0
         and a.network_id != 10000
-        <if test="userId!=null">
-            AND a.TEAMGROUP_ID in (select teamgroup from sys_user where is_delete=0 and user_id=#{userId})
-        </if>
         <if test="status==1">
             AND b.CURRENT_STATUS = 1
         </if>
@@ -74,6 +81,21 @@
         AND f.IS_DELETE = 0
         AND g.IS_DELETE = 0
         AND g.id = ${level1NetworkId}
+        <if test="deptId!=null">
+            and c.dept_id = ${deptId}
+        </if>
+        <if test="teamId!=null">
+            and c.TEAMGROUP_ID = ${teamId}
+        </if>
+        <if test="cabinId!=null">
+            and c.cabin_id LIKE '%${cabinId}%'
+        </if>
+        <if test="type!=null and type!=''">
+            and c.type = #{type}
+        </if>
+        <if test="name!=null and name!=''">
+            and c.name LIKE '%${name}%'
+        </if>
         <if test="status==0">
             GROUP BY
             c.id
@@ -89,8 +111,8 @@
         select GENERAL_REPAIR_UNIT || ',' || GENERAL_REPAIR_UNIT_DIRECTOR || ',' ||
                GENERAL_REPAIR_UNIT_CONTACT                                              AS generalRepair,
                REPAIR_UNIT || ',' || REPAIR_UNIT_DIRECTOR || ',' || REPAIR_UNIT_CONTACT AS `repair`,
-               track_person || ',' || track_person_contact                              AS trackPerson,
-               tracked_person || ',' || tracked_person_contact                          AS trackedPerson,
+               track_person || ',' || track_person_unit || ',' || track_person_contact  AS trackPerson,
+               tracked_person || ',' || tracked_person_unit || ',' || tracked_person_contact  AS trackedPerson,
                track_method,
                track_location,
                CURRENT_STATUS,
@@ -194,8 +216,8 @@
         b.GENERAL_REPAIR_UNIT|| ',' || b.GENERAL_REPAIR_UNIT_DIRECTOR|| ',' ||
         b.GENERAL_REPAIR_UNIT_CONTACT AS generalRepair,
         b.REPAIR_UNIT|| ',' || b.REPAIR_UNIT_DIRECTOR|| ',' || b.REPAIR_UNIT_CONTACT AS `repair`,
-        b.track_person|| ',' || b.track_person_contact AS trackPerson,
-        b.tracked_person|| ',' || b.tracked_person_contact AS trackedPerson,
+        b.track_person|| ',' || b.track_person_unit || ',' || b.track_person_contact AS trackPerson,
+        b.tracked_person|| ',' || b.tracked_person_unit || ',' || b.tracked_person_contact AS trackedPerson,
         b.track_method,
         b.track_location,
         b.track_location,
@@ -213,7 +235,7 @@
         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
-        LEFT JOIN dj_sys_teamgroup_class h ON h.id = a.TEAMGROUP_ID
+        LEFT JOIN dj_sys_teamgroup_class h ON h.id = c.TEAMGROUP_ID
         WHERE
         a.IS_DELETE = 0
         and a.network_id != 10000
diff --git a/src/main/resources/mapper/progressTrack/ExportRecord.xml b/src/main/resources/mapper/progressTrack/ExportRecord.xml
new file mode 100644
index 0000000..1d5e5a7
--- /dev/null
+++ b/src/main/resources/mapper/progressTrack/ExportRecord.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.example.server.progressTrack.dao.ExportRecordDao">
+    <select id="getList" resultType="com.example.server.progressTrack.model.ExportRecord">
+        select a.*, b.user_name
+        from export_record a
+                 left join sys_user b on b.user_id = a.creator
+    </select>
+</mapper>
diff --git a/src/main/resources/mapper/progressTrack/ImportRecord.xml b/src/main/resources/mapper/progressTrack/ImportRecord.xml
new file mode 100644
index 0000000..ade4a27
--- /dev/null
+++ b/src/main/resources/mapper/progressTrack/ImportRecord.xml
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+
+<mapper namespace="com.example.server.progressTrack.dao.ImportRecordDao">
+    <select id="getList" resultType="com.example.server.progressTrack.model.ImportRecord">
+        select a.*, b.user_name
+        from import_record a
+        left join sys_user b on b.user_id = a.creator
+    </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 99fe841..ed8da25 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/\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"
index 69ce045..f2b3c8d 100644
--- "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"
Binary files differ
diff --git a/target/classes/mapper/progressTrack/DjJdgzShipDao.xml b/target/classes/mapper/progressTrack/DjJdgzShipDao.xml
deleted file mode 100644
index 5a284f2..0000000
--- a/target/classes/mapper/progressTrack/DjJdgzShipDao.xml
+++ /dev/null
@@ -1,19 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
-
-<mapper namespace="com.example.server.progressTrack.dao.DjJdgzShipDao">
-
-    <select id="getList" resultType="com.example.server.progressTrack.model.DjJdgzShip">
-        select a.*
-        from dj_jdgz_ship a
-        where
-            a.is_delete = 0
-    </select>
-    <select id="getListByItem" resultType="com.example.client.dto.JComboBoxItem">
-        select a.id,a.ship_no as name
-        from dj_jdgz_ship a
-        where
-            a.is_delete = 0
-    </select>
-
-</mapper>

--
Gitblit v1.9.1