From 66b84de58e3efae14c1e258ee716e02ad9557497 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期四, 09 十月 2025 08:48:50 +0800
Subject: [PATCH] 最新版本541200007

---
 admin/src/views/business/jkCustomer.vue                                                                 |  140 +--
 server/system_service/src/main/java/com/doumee/core/utils/Constants.java                                |    4 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java                   |   53 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java         |   36 
 admin/src/components/business/OperaJkCustomerImportWindow.vue                                           |   81 ++
 server/visits/admin_timer/src/main/resources/bootstrap.yml                                              |    2 
 admin/src/api/business/jkCustomer.js                                                                    |    4 
 admin/public/template/jkCustomerTemplate.xlsx                                                           |    0 
 admin/src/views/vehicle/components/OperaCategoryWindow.vue                                              |    2 
 admin/package-lock.json                                                                                 |  376 ++++++++--
 admin/src/components/business/OperaJkCustomerWindow.vue                                                 |   88 +-
 server/visits/admin_timer/src/main/java/com/doumee/api/JkCustomerTimerController.java                   |   47 +
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java             |   43 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java                   |    3 
 admin/src/api/business/jkLine.js                                                                        |    8 
 admin/src/views/vehicle/cars.vue                                                                        |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java       |    1 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java              |   34 +
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java     |  314 ++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java               |    3 
 admin/src/views/business/jkLine.vue                                                                     |  102 +-
 admin/public/template/jkLineTemplate.xlsx                                                               |    0 
 admin/src/main.js                                                                                       |    1 
 admin/src/components/business/OperaJkLineWindow.vue                                                     |  105 ++-
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java                |    2 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java          |   11 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java  |    4 
 admin/src/components/business/OperaJkLineImportWindow.vue                                               |   81 ++
 server/visits/admin_timer/src/main/resources/bootstrap-dev.yml                                          |    2 
 server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java                          |    3 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java          |   32 
 admin/package.json                                                                                      |    1 
 /dev/null                                                                                               |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java |  368 +++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java              |   10 
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java               |   67 +
 admin/src/components/business/OperaCarsWindow.vue                                                       |    2 
 37 files changed, 1,582 insertions(+), 450 deletions(-)

diff --git a/admin/package-lock.json b/admin/package-lock.json
index 665a035..f24166f 100644
--- a/admin/package-lock.json
+++ b/admin/package-lock.json
@@ -262,6 +262,11 @@
         "@babel/types": "^7.12.13"
       }
     },
+    "@babel/helper-string-parser": {
+      "version": "7.27.1",
+      "resolved": "https://registry.npmmirror.com/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz",
+      "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA=="
+    },
     "@babel/helper-validator-identifier": {
       "version": "7.14.0",
       "resolved": "https://registry.nlark.com/@babel/helper-validator-identifier/download/@babel/helper-validator-identifier-7.14.0.tgz?cache=0&sync_timestamp=1619727556616&other_urls=https%3A%2F%2Fregistry.nlark.com%2F%40babel%2Fhelper-validator-identifier%2Fdownload%2F%40babel%2Fhelper-validator-identifier-7.14.0.tgz",
@@ -1152,6 +1157,11 @@
         "postcss": "^7.0.0"
       }
     },
+    "@jridgewell/sourcemap-codec": {
+      "version": "1.5.5",
+      "resolved": "https://registry.npmmirror.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
+      "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og=="
+    },
     "@juggle/resize-observer": {
       "version": "3.4.0",
       "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz",
@@ -1876,6 +1886,63 @@
           "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
           "dev": true
         },
+        "ansi-styles": {
+          "version": "4.3.0",
+          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
+          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-convert": "^2.0.1"
+          }
+        },
+        "chalk": {
+          "version": "4.1.2",
+          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
+          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "ansi-styles": "^4.1.0",
+            "supports-color": "^7.1.0"
+          }
+        },
+        "color-convert": {
+          "version": "2.0.1",
+          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
+          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "color-name": "~1.1.4"
+          }
+        },
+        "color-name": {
+          "version": "1.1.4",
+          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
+          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
+          "dev": true,
+          "optional": true
+        },
+        "has-flag": {
+          "version": "4.0.0",
+          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
+          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
+          "dev": true,
+          "optional": true
+        },
+        "loader-utils": {
+          "version": "2.0.4",
+          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
+          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "big.js": "^5.2.2",
+            "emojis-list": "^3.0.0",
+            "json5": "^2.1.2"
+          }
+        },
         "ssri": {
           "version": "8.0.1",
           "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1883,6 +1950,28 @@
           "dev": true,
           "requires": {
             "minipass": "^3.1.1"
+          }
+        },
+        "supports-color": {
+          "version": "7.2.0",
+          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
+          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "has-flag": "^4.0.0"
+          }
+        },
+        "vue-loader-v16": {
+          "version": "npm:vue-loader@16.8.3",
+          "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
+          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
+          "dev": true,
+          "optional": true,
+          "requires": {
+            "chalk": "^4.1.0",
+            "hash-sum": "^2.0.0",
+            "loader-utils": "^2.0.0"
           }
         }
       }
@@ -1905,6 +1994,120 @@
         "request": "^2.88.2",
         "semver": "^6.1.0",
         "strip-ansi": "^6.0.0"
+      }
+    },
+    "@vue/compiler-core": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-core/-/compiler-core-3.5.22.tgz",
+      "integrity": "sha512-jQ0pFPmZwTEiRNSb+i9Ow/I/cHv2tXYqsnHKKyCQ08irI2kdF5qmYedmF8si8mA7zepUFmJ2hqzS8CQmNOWOkQ==",
+      "requires": {
+        "@babel/parser": "^7.28.4",
+        "@vue/shared": "3.5.22",
+        "entities": "^4.5.0",
+        "estree-walker": "^2.0.2",
+        "source-map-js": "^1.2.1"
+      },
+      "dependencies": {
+        "@babel/helper-validator-identifier": {
+          "version": "7.27.1",
+          "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+          "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
+        },
+        "@babel/parser": {
+          "version": "7.28.4",
+          "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz",
+          "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+          "requires": {
+            "@babel/types": "^7.28.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.28.4",
+          "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz",
+          "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+          "requires": {
+            "@babel/helper-string-parser": "^7.27.1",
+            "@babel/helper-validator-identifier": "^7.27.1"
+          }
+        },
+        "entities": {
+          "version": "4.5.0",
+          "resolved": "https://registry.npmmirror.com/entities/-/entities-4.5.0.tgz",
+          "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw=="
+        }
+      }
+    },
+    "@vue/compiler-dom": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-dom/-/compiler-dom-3.5.22.tgz",
+      "integrity": "sha512-W8RknzUM1BLkypvdz10OVsGxnMAuSIZs9Wdx1vzA3mL5fNMN15rhrSCLiTm6blWeACwUwizzPVqGJgOGBEN/hA==",
+      "requires": {
+        "@vue/compiler-core": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "@vue/compiler-sfc": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-sfc/-/compiler-sfc-3.5.22.tgz",
+      "integrity": "sha512-tbTR1zKGce4Lj+JLzFXDq36K4vcSZbJ1RBu8FxcDv1IGRz//Dh2EBqksyGVypz3kXpshIfWKGOCcqpSbyGWRJQ==",
+      "requires": {
+        "@babel/parser": "^7.28.4",
+        "@vue/compiler-core": "3.5.22",
+        "@vue/compiler-dom": "3.5.22",
+        "@vue/compiler-ssr": "3.5.22",
+        "@vue/shared": "3.5.22",
+        "estree-walker": "^2.0.2",
+        "magic-string": "^0.30.19",
+        "postcss": "^8.5.6",
+        "source-map-js": "^1.2.1"
+      },
+      "dependencies": {
+        "@babel/helper-validator-identifier": {
+          "version": "7.27.1",
+          "resolved": "https://registry.npmmirror.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz",
+          "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow=="
+        },
+        "@babel/parser": {
+          "version": "7.28.4",
+          "resolved": "https://registry.npmmirror.com/@babel/parser/-/parser-7.28.4.tgz",
+          "integrity": "sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg==",
+          "requires": {
+            "@babel/types": "^7.28.4"
+          }
+        },
+        "@babel/types": {
+          "version": "7.28.4",
+          "resolved": "https://registry.npmmirror.com/@babel/types/-/types-7.28.4.tgz",
+          "integrity": "sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q==",
+          "requires": {
+            "@babel/helper-string-parser": "^7.27.1",
+            "@babel/helper-validator-identifier": "^7.27.1"
+          }
+        },
+        "nanoid": {
+          "version": "3.3.11",
+          "resolved": "https://registry.npmmirror.com/nanoid/-/nanoid-3.3.11.tgz",
+          "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w=="
+        },
+        "postcss": {
+          "version": "8.5.6",
+          "resolved": "https://registry.npmmirror.com/postcss/-/postcss-8.5.6.tgz",
+          "integrity": "sha512-3Ybi1tAuwAP9s0r1UQ2J4n5Y0G05bJkpUIO0/bI9MhwmD70S5aTWbXGBwxHrelT+XM1k6dM0pk+SwNkpTRN7Pg==",
+          "requires": {
+            "nanoid": "^3.3.11",
+            "picocolors": "^1.1.1",
+            "source-map-js": "^1.2.1"
+          }
+        }
+      }
+    },
+    "@vue/compiler-ssr": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/compiler-ssr/-/compiler-ssr-3.5.22.tgz",
+      "integrity": "sha512-GdgyLvg4R+7T8Nk2Mlighx7XGxq/fJf9jaVofc3IL0EPesTE86cP/8DD1lT3h1JeZr2ySBvyqKQJgbS54IX1Ww==",
+      "requires": {
+        "@vue/compiler-dom": "3.5.22",
+        "@vue/shared": "3.5.22"
       }
     },
     "@vue/component-compiler-utils": {
@@ -1970,6 +2173,48 @@
       "resolved": "https://registry.npm.taobao.org/@vue/preload-webpack-plugin/download/@vue/preload-webpack-plugin-1.1.2.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2F%40vue%2Fpreload-webpack-plugin%2Fdownload%2F%40vue%2Fpreload-webpack-plugin-1.1.2.tgz",
       "integrity": "sha1-zrkktOyzucQ4ccekKaAvhCPmIas=",
       "dev": true
+    },
+    "@vue/reactivity": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/reactivity/-/reactivity-3.5.22.tgz",
+      "integrity": "sha512-f2Wux4v/Z2pqc9+4SmgZC1p73Z53fyD90NFWXiX9AKVnVBEvLFOWCEgJD3GdGnlxPZt01PSlfmLqbLYzY/Fw4A==",
+      "requires": {
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "@vue/runtime-core": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-core/-/runtime-core-3.5.22.tgz",
+      "integrity": "sha512-EHo4W/eiYeAzRTN5PCextDUZ0dMs9I8mQ2Fy+OkzvRPUYQEyK9yAjbasrMCXbLNhF7P0OUyivLjIy0yc6VrLJQ==",
+      "requires": {
+        "@vue/reactivity": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "@vue/runtime-dom": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/runtime-dom/-/runtime-dom-3.5.22.tgz",
+      "integrity": "sha512-Av60jsryAkI023PlN7LsqrfPvwfxOd2yAwtReCjeuugTJTkgrksYJJstg1e12qle0NarkfhfFu1ox2D+cQotww==",
+      "requires": {
+        "@vue/reactivity": "3.5.22",
+        "@vue/runtime-core": "3.5.22",
+        "@vue/shared": "3.5.22",
+        "csstype": "^3.1.3"
+      }
+    },
+    "@vue/server-renderer": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/server-renderer/-/server-renderer-3.5.22.tgz",
+      "integrity": "sha512-gXjo+ao0oHYTSswF+a3KRHZ1WszxIqO7u6XwNHqcqb9JfyIL/pbWrrh/xLv7jeDqla9u+LK7yfZKHih1e1RKAQ==",
+      "requires": {
+        "@vue/compiler-ssr": "3.5.22",
+        "@vue/shared": "3.5.22"
+      }
+    },
+    "@vue/shared": {
+      "version": "3.5.22",
+      "resolved": "https://registry.npmmirror.com/@vue/shared/-/shared-3.5.22.tgz",
+      "integrity": "sha512-F4yc6palwq3TT0u+FYf0Ns4Tfl9GRFURDN2gWG7L1ecIaS/4fCIuFOjMTnCyjsu/OK6vaDKLCrGAa+KvvH+h4w=="
     },
     "@vue/web-component-wrapper": {
       "version": "1.3.0",
@@ -4487,6 +4732,11 @@
         }
       }
     },
+    "csstype": {
+      "version": "3.1.3",
+      "resolved": "https://registry.npmmirror.com/csstype/-/csstype-3.1.3.tgz",
+      "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw=="
+    },
     "currently-unhandled": {
       "version": "0.4.1",
       "resolved": "https://registry.npm.taobao.org/currently-unhandled/download/currently-unhandled-0.4.1.tgz",
@@ -5880,6 +6130,11 @@
       "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.3.0.tgz?cache=0&sync_timestamp=1596642998635&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Festraverse%2Fdownload%2Festraverse-4.3.0.tgz",
       "integrity": "sha1-OYrT88WiSUi+dyXoPRGn3ijNvR0=",
       "dev": true
+    },
+    "estree-walker": {
+      "version": "2.0.2",
+      "resolved": "https://registry.npmmirror.com/estree-walker/-/estree-walker-2.0.2.tgz",
+      "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w=="
     },
     "esutils": {
       "version": "2.0.3",
@@ -8861,6 +9116,14 @@
         "yallist": "^3.0.2"
       }
     },
+    "magic-string": {
+      "version": "0.30.19",
+      "resolved": "https://registry.npmmirror.com/magic-string/-/magic-string-0.30.19.tgz",
+      "integrity": "sha512-2N21sPY9Ws53PZvsEpVtNuSW+ScYbQdp4b9qUaL+9QkHUrGFKo56Lg9Emg5s9V/qrtNBmiR01sYhUOwu3H+VOw==",
+      "requires": {
+        "@jridgewell/sourcemap-codec": "^1.5.5"
+      }
+    },
     "make-dir": {
       "version": "3.1.0",
       "resolved": "https://registry.npm.taobao.org/make-dir/download/make-dir-3.1.0.tgz?cache=0&sync_timestamp=1587567572251&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fmake-dir%2Fdownload%2Fmake-dir-3.1.0.tgz",
@@ -10227,6 +10490,11 @@
       "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz",
       "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
       "dev": true
+    },
+    "picocolors": {
+      "version": "1.1.1",
+      "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.1.1.tgz",
+      "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA=="
     },
     "picomatch": {
       "version": "2.2.3",
@@ -12525,6 +12793,11 @@
       "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
       "dev": true
     },
+    "source-map-js": {
+      "version": "1.2.1",
+      "resolved": "https://registry.npmmirror.com/source-map-js/-/source-map-js-1.2.1.tgz",
+      "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA=="
+    },
     "source-map-resolve": {
       "version": "0.5.3",
       "resolved": "https://registry.npm.taobao.org/source-map-resolve/download/source-map-resolve-0.5.3.tgz?cache=0&sync_timestamp=1584829515586&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fsource-map-resolve%2Fdownload%2Fsource-map-resolve-0.5.3.tgz",
@@ -13772,6 +14045,28 @@
       "integrity": "sha1-sj5DWK+oogL+ehAK8fX4g/AgB+4=",
       "dev": true
     },
+    "v-clipboard": {
+      "version": "3.0.0-next.1",
+      "resolved": "https://registry.npmmirror.com/v-clipboard/-/v-clipboard-3.0.0-next.1.tgz",
+      "integrity": "sha512-UvCnzetQMlVfk9yoiyew8ldGiCzeER5aYdmXXtZp8LC6rt2QXQS0AayEDn1K7rlXpd3M8d+JeYNUV+ZNgtaS4A==",
+      "requires": {
+        "vue": "^3.2.45"
+      },
+      "dependencies": {
+        "vue": {
+          "version": "3.5.22",
+          "resolved": "https://registry.npmmirror.com/vue/-/vue-3.5.22.tgz",
+          "integrity": "sha512-toaZjQ3a/G/mYaLSbV+QsQhIdMo9x5rrqIpYRObsJ6T/J+RyCSFwN2LHNVH9v8uIcljDNa3QzPVdv3Y6b9hAJQ==",
+          "requires": {
+            "@vue/compiler-dom": "3.5.22",
+            "@vue/compiler-sfc": "3.5.22",
+            "@vue/runtime-dom": "3.5.22",
+            "@vue/server-renderer": "3.5.22",
+            "@vue/shared": "3.5.22"
+          }
+        }
+      }
+    },
     "v8-compile-cache": {
       "version": "2.3.0",
       "resolved": "https://registry.npm.taobao.org/v8-compile-cache/download/v8-compile-cache-2.3.0.tgz?cache=0&sync_timestamp=1614993639567&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fv8-compile-cache%2Fdownload%2Fv8-compile-cache-2.3.0.tgz",
@@ -13909,87 +14204,6 @@
           "resolved": "https://registry.npm.taobao.org/hash-sum/download/hash-sum-1.0.2.tgz",
           "integrity": "sha1-M7QHd3VMZDJXPBIMw4CLvRDUfwQ=",
           "dev": true
-        }
-      }
-    },
-    "vue-loader-v16": {
-      "version": "npm:vue-loader@16.8.3",
-      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
-      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
-      "dev": true,
-      "optional": true,
-      "requires": {
-        "chalk": "^4.1.0",
-        "hash-sum": "^2.0.0",
-        "loader-utils": "^2.0.0"
-      },
-      "dependencies": {
-        "ansi-styles": {
-          "version": "4.3.0",
-          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
-          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-convert": "^2.0.1"
-          }
-        },
-        "chalk": {
-          "version": "4.1.2",
-          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
-          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "ansi-styles": "^4.1.0",
-            "supports-color": "^7.1.0"
-          }
-        },
-        "color-convert": {
-          "version": "2.0.1",
-          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
-          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "color-name": "~1.1.4"
-          }
-        },
-        "color-name": {
-          "version": "1.1.4",
-          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
-          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
-          "dev": true,
-          "optional": true
-        },
-        "has-flag": {
-          "version": "4.0.0",
-          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
-          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
-          "dev": true,
-          "optional": true
-        },
-        "loader-utils": {
-          "version": "2.0.4",
-          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
-          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "big.js": "^5.2.2",
-            "emojis-list": "^3.0.0",
-            "json5": "^2.1.2"
-          }
-        },
-        "supports-color": {
-          "version": "7.2.0",
-          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
-          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
-          "dev": true,
-          "optional": true,
-          "requires": {
-            "has-flag": "^4.0.0"
-          }
         }
       }
     },
diff --git a/admin/package.json b/admin/package.json
index 2a8afaa..b1d3572 100644
--- a/admin/package.json
+++ b/admin/package.json
@@ -28,6 +28,7 @@
     "js-file-download": "^0.4.12",
     "path": "^0.12.7",
     "qrcodejs2": "0.0.2",
+    "v-clipboard": "^3.0.0-next.1",
     "vue": "^2.6.11",
     "vue-clipboard2": "^0.3.1",
     "vue-cropper": "^0.6.5",
diff --git a/admin/public/template/jkCustomerTemplate.xlsx b/admin/public/template/jkCustomerTemplate.xlsx
new file mode 100644
index 0000000..9ae7836
--- /dev/null
+++ b/admin/public/template/jkCustomerTemplate.xlsx
Binary files differ
diff --git a/admin/public/template/jkCustomerTmeplate.xlsx b/admin/public/template/jkCustomerTmeplate.xlsx
deleted file mode 100644
index cceb025..0000000
--- a/admin/public/template/jkCustomerTmeplate.xlsx
+++ /dev/null
Binary files differ
diff --git a/admin/public/template/jkLineTemplate.xlsx b/admin/public/template/jkLineTemplate.xlsx
index 131a0ee..5435a96 100644
--- a/admin/public/template/jkLineTemplate.xlsx
+++ b/admin/public/template/jkLineTemplate.xlsx
Binary files differ
diff --git a/admin/src/api/business/jkCustomer.js b/admin/src/api/business/jkCustomer.js
index 6ea8495..16dff52 100644
--- a/admin/src/api/business/jkCustomer.js
+++ b/admin/src/api/business/jkCustomer.js
@@ -19,7 +19,9 @@
 export function create (data) {
   return request.post('/visitsAdmin/cloudService/business/jkCustomer/create', data)
 }
-
+export function importExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkCustomer/importExcel', data)
+}
 // 淇敼
 export function updateById (data) {
   return request.post('/visitsAdmin/cloudService/business/jkCustomer/updateById', data)
diff --git a/admin/src/api/business/jkLine.js b/admin/src/api/business/jkLine.js
index 95aac40..33ba880 100644
--- a/admin/src/api/business/jkLine.js
+++ b/admin/src/api/business/jkLine.js
@@ -6,6 +6,11 @@
     trim: true
   })
 }
+export function allList (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/list', data, {
+    trim: true
+  })
+}
 
 // 瀵煎嚭Excel
 export function exportExcel (data) {
@@ -20,6 +25,9 @@
   return request.post('/visitsAdmin/cloudService/business/jkLine/create', data)
 }
 
+export function importExcel (data) {
+  return request.post('/visitsAdmin/cloudService/business/jkLine/importExcel', data)
+}
 // 淇敼
 export function updateById (data) {
   return request.post('/visitsAdmin/cloudService/business/jkLine/updateById', data)
diff --git a/admin/src/components/business/OperaCarsWindow.vue b/admin/src/components/business/OperaCarsWindow.vue
index 376a3da..d61c16e 100644
--- a/admin/src/components/business/OperaCarsWindow.vue
+++ b/admin/src/components/business/OperaCarsWindow.vue
@@ -187,7 +187,7 @@
     },
     getCate () {
       fetchList({
-        model: {},
+        model: {type:1},
         capacity: 1000,
         page: 1
       }).then(res => {
diff --git a/admin/src/components/business/OperaJkCustomerImportWindow.vue b/admin/src/components/business/OperaJkCustomerImportWindow.vue
new file mode 100644
index 0000000..1da3322
--- /dev/null
+++ b/admin/src/components/business/OperaJkCustomerImportWindow.vue
@@ -0,0 +1,81 @@
+<template>
+  <el-dialog
+      class="center-title"
+      :title="title"
+      width="500px"
+      top="30vh"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn"><i class="el-icon-warning"></i>瀵煎叆璇存槑锛�<br>
+      1.璇峰厛涓嬭浇鏂囦欢妯℃澘锛屽苟鎸夌収妯℃澘瑕佸幓濉啓琛ㄦ牸鍐呭;<br>
+    </p>
+    <el-form class="demo-form-inline" >
+      <el-form-item label="瀹㈡埛淇℃伅" required>
+        <div style="width: 100%;display: flex;align-items: center;">
+          <el-button type="primary"   @click="clickRef">鐐瑰嚮涓婁紶</el-button>
+          <el-button type="text" @click="exportTemplate">鐐瑰嚮涓嬭浇妯$増.EXCEL</el-button>
+        </div>
+        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
+      </el-form-item>
+    </el-form>
+    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
+    <template   v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { importExcel } from '@/api/business/jkCustomer'
+export default {
+  extends: BaseOpera,
+  // eslint-disable-next-line vue/no-unused-components
+  components: { GlobalWindow },
+  data () {
+    return {
+      importing:false,
+      fileName: ''
+    }
+  },
+  methods: {
+    open (title) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/jkCustomerTemplate.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      importExcel(data)
+        .then(res => {
+          this.$message.success('瀵煎叆鎴愬姛')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          // this.$message.error(err)
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/business/OperaJkCustomerWindow.vue b/admin/src/components/business/OperaJkCustomerWindow.vue
index b75f350..3f2f5ef 100644
--- a/admin/src/components/business/OperaJkCustomerWindow.vue
+++ b/admin/src/components/business/OperaJkCustomerWindow.vue
@@ -3,55 +3,35 @@
     :title="title"
     :visible.sync="visible"
     :confirm-working="isWorking"
+    width="50%"
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      <el-form-item label="" prop="name">
+        <span  style="width: 100px;text-align: right;margin-right: 30px;">瀹㈡埛绠�鐮侊細</span>
+        <span>{{form.code}}</span>
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
+      <el-form-item label="" prop="name">
+        <span  style="width: 100px;text-align: right;margin-right: 30px;">瀹㈡埛鍚嶇О锛�</span>
+        <span>{{form.name}}</span>
       </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
+      <el-form-item label="" prop="lineName">
+        <span  style="width: 100px;text-align: right;margin-right: 30px;">閫佽揣绾胯矾锛�</span>
+        <span>{{form.lineName}}</span>
       </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
+      <el-form-item label="" prop="categoryName">
+        <span  style="width: 100px;text-align: right;margin-right: 30px;">鎵�灞炰富绾胯矾</span>
+        <span>{{form.categoryName}}</span>
       </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
+      <el-form-item label="" prop="location">
+        <span style="width: 100px;text-align: right;margin-right: 30px;">鍦板潃锛� </span>
+        <span>{{form.location}}</span>
       </el-form-item>
-      <el-form-item label="澶囨敞" prop="info">
-        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
+      <el-button style="color: blue;margin-bottom: 10px;" v-clipboard:copy="form.location" v-clipboard:success="onCopy" v-clipboard:error="onError">鐐瑰嚮澶嶅埗瀹㈡埛鍦板潃锛屽墠寰�缁忕含搴﹀湪绾挎彁鍙栧櫒</el-button>
+      <el-form-item label="缁忕含搴�:" prop="locationInfo">
+        <el-input v-model="form.locationInfo" placeholder="璇疯緭鍏ョ粡绾害" v-trim/>
       </el-form-item>
-      <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="缂栫爜" prop="code">
-        <el-input v-model="form.code" placeholder="璇疯緭鍏ョ紪鐮�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
-        <el-input v-model="form.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" v-trim/>
-      </el-form-item>
-      <el-form-item label="缁忓害" prop="longitude">
-        <el-input v-model="form.longitude" placeholder="璇疯緭鍏ョ粡搴�" v-trim/>
-      </el-form-item>
-      <el-form-item label="缁村害" prop="latitude">
-        <el-input v-model="form.latitude" placeholder="璇疯緭鍏ョ淮搴�" v-trim/>
-      </el-form-item>
-      <el-form-item label="閰嶉�佸懆鏈�" prop="weeks">
-        <el-input v-model="form.weeks" placeholder="璇疯緭鍏ラ厤閫佸懆鏈�" v-trim/>
-      </el-form-item>
-      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
-        <el-input v-model="form.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" v-trim/>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
-      </el-form-item>
-    </el-form>
+     </el-form>
   </GlobalWindow>
 </template>
 
@@ -67,24 +47,16 @@
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        info: '',
+        locationInfo: '',
         name: '',
         code: '',
-        lacation: '',
-        longitude: '',
-        latitude: '',
-        weeks: '',
-        lineId: '',
-        status: '',
-        sortnum: ''
+        location: '',
+        lineName: '',
+        categoryName: ''
       },
       // 楠岃瘉瑙勫垯
       rules: {
+        locationInfo: [{ required: true, message: '璇疯緭鍏ョ粡绾害淇℃伅' }]
       }
     }
   },
@@ -93,6 +65,16 @@
       api: '/business/jkCustomer',
       'field.id': 'id'
     })
+  },
+  methods: {
+    onCopy () {
+      console.log('Text copied!');
+      window.open('https://lbs.amap.com/tools/picker')
+    },
+    onError () {
+      console.error('Failed to copy text');
+      window.open('https://lbs.amap.com/tools/picker')
+    }
   }
 }
 </script>
diff --git a/admin/src/components/business/OperaJkLineImportWindow.vue b/admin/src/components/business/OperaJkLineImportWindow.vue
new file mode 100644
index 0000000..da0f52d
--- /dev/null
+++ b/admin/src/components/business/OperaJkLineImportWindow.vue
@@ -0,0 +1,81 @@
+<template>
+  <el-dialog
+      class="center-title"
+      :title="title"
+      width="500px"
+      top="30vh"
+      :visible.sync="visible"
+      :confirm-working="isWorking"
+      @confirm="confirm"
+  >
+    <p class="tip-warn"><i class="el-icon-warning"></i>瀵煎叆璇存槑锛�<br>
+      1.璇峰厛涓嬭浇鏂囦欢妯℃澘锛屽苟鎸夌収妯℃澘瑕佸幓濉啓琛ㄦ牸鍐呭;<br>
+    </p>
+    <el-form class="demo-form-inline" >
+      <el-form-item label="鏂拌矾淇℃伅" required>
+        <div style="width: 100%;display: flex;align-items: center;">
+          <el-button type="primary"   @click="clickRef">鐐瑰嚮涓婁紶</el-button>
+          <el-button type="text" @click="exportTemplate">鐐瑰嚮涓嬭浇妯$増.EXCEL</el-button>
+        </div>
+        <div style="font-size: 14px; color: black;" v-if="fileName">{{fileName}}</div>
+      </el-form-item>
+    </el-form>
+    <input type="file" style="position: fixed; left: 0; top: -50px;" accept=".xlsx" ref="fileExcel" @change="result" />
+    <template   v-slot:footer>
+      <el-button @click="visible=false">杩斿洖</el-button>
+    </template>
+  </el-dialog>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+import { importExcel } from '@/api/business/jkLine'
+export default {
+  extends: BaseOpera,
+  // eslint-disable-next-line vue/no-unused-components
+  components: { GlobalWindow },
+  data () {
+    return {
+      importing:false,
+      fileName: ''
+    }
+  },
+  methods: {
+    open (title) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/jkLineTemplate.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      importExcel(data)
+        .then(res => {
+          this.$message.success('瀵煎叆鎴愬姛')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          // this.$message.error(err)
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/business/OperaJkLineWindow.vue b/admin/src/components/business/OperaJkLineWindow.vue
index e77d48a..ef15ac7 100644
--- a/admin/src/components/business/OperaJkLineWindow.vue
+++ b/admin/src/components/business/OperaJkLineWindow.vue
@@ -1,49 +1,41 @@
 <template>
   <GlobalWindow
     :title="title"
+    width="50%"
     :visible.sync="visible"
     :confirm-working="isWorking"
     @confirm="confirm"
   >
     <el-form :model="form" ref="form" :rules="rules">
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="form.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" v-trim/>
+      <el-form-item label="鎵�灞炰富绾胯矾" prop="categoryId">
+        <el-select v-model="form.categoryId"  filterable placeholder="璇烽�夋嫨鎵�灞炰富绾胯矾" >
+          <el-option v-for="item in categoryList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="form.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="form.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" v-trim/>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="form.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�"></el-date-picker>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="form.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" v-trim/>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="info">
-        <el-input v-model="form.info" placeholder="璇疯緭鍏ュ娉�" v-trim/>
-      </el-form-item>
-      <el-form-item label="鍚嶇О" prop="name">
+      <el-form-item label="绾胯矾鍚嶇О" prop="name">
         <el-input v-model="form.name" placeholder="璇疯緭鍏ュ悕绉�" v-trim/>
       </el-form-item>
-      <el-form-item label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" prop="categoryId">
-        <el-input v-model="form.categoryId" placeholder="璇疯緭鍏ョ彮缁勭紪鐮侊紙鍏宠仈category锛�" v-trim/>
+      <el-form-item label="閫佽揣杞﹁締" prop="carId">
+        <el-select v-model="form.carId"  filterable placeholder="璇烽�夋嫨閫佽揣杞﹁締" >
+          <el-option v-for="item in carsList" :key="item.id" :label="item.code" :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
-        <el-input v-model="form.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" v-trim/>
+      <el-form-item label="瀹㈡埛閲�" prop="maxCustomer">
+        <el-input type="number" v-model="form.maxCustomer" placeholder="璇疯緭鍏ユ渶澶у鎴烽噺" v-trim/>
       </el-form-item>
-      <el-form-item label="鏈�澶у鎴烽噺" prop="maxCustomer">
-        <el-input v-model="form.maxCustomer" placeholder="璇疯緭鍏ユ渶澶у鎴烽噺" v-trim/>
+      <el-form-item label="璁㈠崟閲�" prop="maxOrder">
+        <el-input type="number" v-model="form.maxOrder" placeholder="璇疯緭鍏ユ渶澶ц鍗曢噺" v-trim/>
       </el-form-item>
-      <el-form-item label="鏈�澶ц鍗曢噺" prop="maxOrder">
-        <el-input v-model="form.maxOrder" placeholder="璇疯緭鍏ユ渶澶ц鍗曢噺" v-trim/>
+      <el-form-item label="鍛ㄦ湡" prop="weeks">
+        <el-select v-model="form.weeks"  filterable placeholder="璇烽�夋嫨閫佽揣杞﹁締" >
+          <el-option v-for="item in weeksList" :key="item" :label="item" :value="item">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
-        <el-input v-model="form.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" v-trim/>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="form.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+      <el-form-item label="搴忓彿" prop="code">
+        <el-input v-model="form.code" placeholder="璇疯緭鍏ュ簭鍙�" v-trim/>
       </el-form-item>
     </el-form>
   </GlobalWindow>
@@ -52,6 +44,8 @@
 <script>
 import BaseOpera from '@/components/base/BaseOpera'
 import GlobalWindow from '@/components/common/GlobalWindow'
+import { fetchCateList } from '@/api/business/category'
+import { allList } from '@/api/business/cars'
 export default {
   name: 'OperaJkLineWindow',
   extends: BaseOpera,
@@ -61,13 +55,9 @@
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        info: '',
+        weeks:null,
         name: '',
+        code: '',
         categoryId: '',
         carId: '',
         maxCustomer: '',
@@ -75,8 +65,13 @@
         status: '',
         sortnum: ''
       },
+      categoryList: [],
+      carsList: [],
+      weeksList: ['鍛ㄤ竴','鍛ㄤ簩','鍛ㄤ笁','鍛ㄥ洓','鍛ㄤ簲','鍛ㄥ叚','鍛ㄦ棩'],
       // 楠岃瘉瑙勫垯
       rules: {
+        name: [{ required: true, message: '璇疯緭鍏ョ嚎璺悕绉�' }],
+        categoryId: [{ required: true, message: '璇烽�夋嫨鎵�灞炰富绾胯矾' }]
       }
     }
   },
@@ -85,6 +80,42 @@
       api: '/business/jkLine',
       'field.id': 'id'
     })
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.loadCategory()
+      this.loadCars()
+      this.visible = true
+      // 鏂板缓
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    },
+    loadCategory () {
+      fetchCateList({
+        type: 4
+      }).then(res => {
+        this.categoryList = res
+      })
+    },
+    loadCars () {
+      allList({
+        type: 1//鏌ヨ鍏ㄩ儴杞﹁締
+      }).then(res => {
+        this.carsList = res
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/main.js b/admin/src/main.js
index a98f12b..a0eb2fd 100644
--- a/admin/src/main.js
+++ b/admin/src/main.js
@@ -15,6 +15,7 @@
 import preventReClick from '@/directives/directive'
 import Treeselect from '@riophae/vue-treeselect'
 import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+
 Vue.component('treeselect', Treeselect)
 
 Vue.use(preventReClick)
diff --git a/admin/src/views/business/jkCustomer.vue b/admin/src/views/business/jkCustomer.vue
index 3fcc724..8c003f3 100644
--- a/admin/src/views/business/jkCustomer.vue
+++ b/admin/src/views/business/jkCustomer.vue
@@ -2,53 +2,32 @@
   <TableLayout :permissions="['business:jkcustomer:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="涓婚敭" prop="id">
-        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="瀹㈡埛绠�鐮�" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ鎴风畝鐮�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
+      <el-form-item label="瀹㈡埛鍚嶇О" prop="name">
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ鎴峰悕绉�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
+      <el-form-item label="鍦板潃" prop="location">
+        <el-input v-model="searchForm.location" placeholder="璇疯緭鍏ュ湴鍧�"  clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
+      <el-form-item label="閰嶉�佸懆鏈�" prop="lineWeeks">
+        <el-select v-model="searchForm.lineWeeks" clearable filterable placeholder="璇烽�夋嫨閰嶉�佸懆鏈�"  @change="search">
+          <el-option v-for="item in weeksList" :key="item" :label="item" :value="item">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
+      <el-form-item label="鎵�灞炰富绾胯矾" prop="categoryId">
+        <el-select v-model="searchForm.categoryId" clearable filterable placeholder="璇烽�夋嫨鎵�灞炰富绾胯矾"  @change="loadLines();search()">
+          <el-option v-for="item in categoryList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="info">
-        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="缂栫爜" prop="code">
-        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ョ紪鐮�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎵�鍦ㄤ綅缃�" prop="lacation">
-        <el-input v-model="searchForm.lacation" placeholder="璇疯緭鍏ユ墍鍦ㄤ綅缃�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="缁忓害" prop="longitude">
-        <el-input v-model="searchForm.longitude" placeholder="璇疯緭鍏ョ粡搴�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="缁村害" prop="latitude">
-        <el-input v-model="searchForm.latitude" placeholder="璇疯緭鍏ョ淮搴�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="閰嶉�佸懆鏈�" prop="weeks">
-        <el-input v-model="searchForm.weeks" placeholder="璇疯緭鍏ラ厤閫佸懆鏈�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" prop="lineId">
-        <el-input v-model="searchForm.lineId" placeholder="璇疯緭鍏ラ�佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0姝e父 绂佺敤" prop="status">
-        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 绂佺敤" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      <el-form-item label="閫佽揣绾胯矾" prop="lineId">
+        <el-select v-model="searchForm.lineId" clearable filterable placeholder="璇烽�夋嫨閫佽揣绾胯矾"  @change="search">
+          <el-option v-for="item in lineList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -59,8 +38,11 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:jkcustomer:create', 'business:jkcustomer:delete']">
+<!--
         <li><el-button type="primary" @click="$refs.operaJkCustomerWindow.open('鏂板缓浜ゆ帶-瀹㈡埛淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jkcustomer:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button></li>
+-->
+        <li><el-button icon="el-icon-upload"  type="primary" @click="$refs.OperaJkCustomerImportWindowRef.open('瀹㈡埛瀵煎叆')"  v-permissions="['business:jkcustomer:create']">瀹㈡埛瀵煎叆</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
         v-loading="isWorking.search"
@@ -69,22 +51,15 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
-        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="code" label="缂栫爜" min-width="100px"></el-table-column>
-        <el-table-column prop="lacation" label="鎵�鍦ㄤ綅缃�" min-width="100px"></el-table-column>
-        <el-table-column prop="longitude" label="缁忓害" min-width="100px"></el-table-column>
-        <el-table-column prop="latitude" label="缁村害" min-width="100px"></el-table-column>
-        <el-table-column prop="weeks" label="閰嶉�佸懆鏈�" min-width="100px"></el-table-column>
-        <el-table-column prop="lineId" label="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0姝e父 绂佺敤" min-width="100px"></el-table-column>
-        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="code" label="瀹㈡埛绠�鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="瀹㈡埛鍚嶇О" min-width="100px"></el-table-column>
+        <el-table-column prop="location" label="鍦板潃" min-width="200px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="locationInfo" label="缁忕含搴�" min-width="150px">  </el-table-column>
+        <el-table-column prop="lineWeeks" label="閰嶉�佸懆鏈�" min-width="100px"></el-table-column>
+        <el-table-column prop="lineName" label="閫佽揣绾胯矾" min-width="200px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="categoryName" label="鎵�灞炰富绾胯矾" min-width="100px"></el-table-column>
+        <el-table-column prop="sortno" label="搴忓彿" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="140px"></el-table-column>
         <el-table-column
           v-if="containPermissions(['business:jkcustomer:update', 'business:jkcustomer:delete'])"
           label="鎿嶄綔"
@@ -92,8 +67,8 @@
           fixed="right"
         >
           <template slot-scope="{row}">
-            <el-button type="text" @click="$refs.operaJkCustomerWindow.open('缂栬緫浜ゆ帶-瀹㈡埛淇℃伅琛�', row)" icon="el-icon-edit" v-permissions="['business:jkcustomer:update']">缂栬緫</el-button>
-            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button>
+            <el-button type="text" @click="$refs.operaJkCustomerWindow.open('缂栬緫瀹㈡埛淇℃伅', row)" icon="el-icon-edit" v-permissions="['business:jkcustomer:update']">缂栬緫</el-button>
+            <el-button type="text" style="color: red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:jkcustomer:delete']">鍒犻櫎</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -106,6 +81,7 @@
     </template>
     <!-- 鏂板缓/淇敼 -->
     <OperaJkCustomerWindow ref="operaJkCustomerWindow" @success="handlePageChange"/>
+    <OperaJkCustomerImportWindow ref="OperaJkCustomerImportWindowRef" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -114,31 +90,30 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaJkCustomerWindow from '@/components/business/OperaJkCustomerWindow'
+import OperaJkCustomerImportWindow from '@/components/business/OperaJkCustomerImportWindow'
+import { fetchCateList } from '@/api/business/category'
+import { allList } from '@/api/business/jkLine'
 export default {
   name: 'JkCustomer',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaJkCustomerWindow },
+  components: { TableLayout, Pagination, OperaJkCustomerWindow, OperaJkCustomerImportWindow },
   data () {
     return {
       // 鎼滅储
       searchForm: {
         id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        info: '',
+        categoryId: '',
         name: '',
         code: '',
-        lacation: '',
-        longitude: '',
-        latitude: '',
-        weeks: '',
+        location: '',
+        lineWeeks: '',
         lineId: '',
         status: '',
         sortnum: ''
-      }
+      },
+      categoryList: [],
+      lineList: [],
+      weeksList: ['鍛ㄤ竴', '鍛ㄤ簩', '鍛ㄤ笁', '鍛ㄥ洓', '鍛ㄤ簲', '鍛ㄥ叚', '鍛ㄦ棩']
     }
   },
   created () {
@@ -149,6 +124,25 @@
       'field.main': 'id'
     })
     this.search()
+    this.loadCategory()
+    this.loadLines()
+  },
+  methods: {
+    loadCategory () {
+      fetchCateList({
+        type: 4
+      }).then(res => {
+        this.categoryList = res
+      })
+    },
+    loadLines () {
+      this.searchForm.lineId =''
+      allList({
+        categoryId: this.searchForm.categoryId
+      }).then(res => {
+        this.lineList = res
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/business/jkLine.vue b/admin/src/views/business/jkLine.vue
index 0eb2e07..255cc63 100644
--- a/admin/src/views/business/jkLine.vue
+++ b/admin/src/views/business/jkLine.vue
@@ -2,47 +2,20 @@
   <TableLayout :permissions="['business:jkline:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="涓婚敭" prop="id">
-        <el-input v-model="searchForm.id" placeholder="璇疯緭鍏ヤ富閿�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍒涘缓浜虹紪鐮�" prop="creator">
-        <el-input v-model="searchForm.creator" placeholder="璇疯緭鍏ュ垱寤轰汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍒涘缓鏃堕棿" prop="createDate">
-        <el-date-picker v-model="searchForm.createDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ垱寤烘椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏇存柊浜虹紪鐮�" prop="editor">
-        <el-input v-model="searchForm.editor" placeholder="璇疯緭鍏ユ洿鏂颁汉缂栫爜" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏇存柊鏃堕棿" prop="editDate">
-        <el-date-picker v-model="searchForm.editDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ洿鏂版椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏄惁鍒犻櫎0鍚� 1鏄�" prop="isdeleted">
-        <el-input v-model="searchForm.isdeleted" placeholder="璇疯緭鍏ユ槸鍚﹀垹闄�0鍚� 1鏄�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="澶囨敞" prop="info">
-        <el-input v-model="searchForm.info" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
       <el-form-item label="鍚嶇О" prop="name">
-        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+        <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" prop="categoryId">
-        <el-input v-model="searchForm.categoryId" placeholder="璇疯緭鍏ョ彮缁勭紪鐮侊紙鍏宠仈category锛�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="鎵�灞炰富绾胯矾" prop="categoryId">
+        <el-select v-model="searchForm.categoryId" clearable filterable placeholder="璇烽�夋嫨鎵�灞炰富绾胯矾"  @change="search">
+          <el-option v-for="item in categoryList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
       </el-form-item>
-      <el-form-item label="鎵�灞炶溅杈�(鍏宠仈cars)" prop="carId">
-        <el-input v-model="searchForm.carId" placeholder="璇疯緭鍏ユ墍灞炶溅杈�(鍏宠仈cars)" @keypress.enter.native="search"></el-input>
+      <el-form-item label="杩愰�佽溅杈�" prop="carId">
+        <el-input v-model="searchForm.carCode" placeholder="璇疯緭鍏ヨ繍閫佽溅杈�" clearable @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鏈�澶у鎴烽噺" prop="maxCustomer">
-        <el-input v-model="searchForm.maxCustomer" placeholder="璇疯緭鍏ユ渶澶у鎴烽噺" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏈�澶ц鍗曢噺" prop="maxOrder">
-        <el-input v-model="searchForm.maxOrder" placeholder="璇疯緭鍏ユ渶澶ц鍗曢噺" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" prop="status">
-        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎺掑簭鐮�" prop="sortnum">
-        <el-input v-model="searchForm.sortnum" placeholder="璇疯緭鍏ユ帓搴忕爜" @keypress.enter.native="search"></el-input>
+      <el-form-item label="搴忓彿" prop="code">
+        <el-input v-model="searchForm.code" placeholder="璇疯緭鍏ュ簭鍙�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -54,7 +27,8 @@
     <template v-slot:table-wrap>
       <ul class="toolbar" v-permissions="['business:jkline:create', 'business:jkline:delete']">
         <li><el-button type="primary" @click="$refs.operaJkLineWindow.open('鏂板缓浜ゆ帶-绾胯矾淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:jkline:create']">鏂板缓</el-button></li>
-        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkline:delete']">鍒犻櫎</el-button></li>
+        <li><el-button icon="el-icon-upload"  type="primary" @click="$refs.OperaJkLineImportWindowRef.open('绾胯矾瀵煎叆')"  v-permissions="['business:jkline:create']">绾胯矾瀵煎叆</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:jkline:delete']">鍒犻櫎</el-button></li>
       </ul>
       <el-table
         v-loading="isWorking.search"
@@ -63,20 +37,14 @@
         @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="id" label="涓婚敭" min-width="100px"></el-table-column>
-        <el-table-column prop="creator" label="鍒涘缓浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="createDate" label="鍒涘缓鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="editor" label="鏇存柊浜虹紪鐮�" min-width="100px"></el-table-column>
-        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="isdeleted" label="鏄惁鍒犻櫎0鍚� 1鏄�" min-width="100px"></el-table-column>
-        <el-table-column prop="info" label="澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="categoryId" label="鐝粍缂栫爜锛堝叧鑱攃ategory锛�" min-width="100px"></el-table-column>
-        <el-table-column prop="carId" label="鎵�灞炶溅杈�(鍏宠仈cars)" min-width="100px"></el-table-column>
-        <el-table-column prop="maxCustomer" label="鏈�澶у鎴烽噺" min-width="100px"></el-table-column>
-        <el-table-column prop="maxOrder" label="鏈�澶ц鍗曢噺" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭" min-width="100px"></el-table-column>
-        <el-table-column prop="sortnum" label="鎺掑簭鐮�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="鍚嶇О" min-width="200px" show-tooltip-when-overflow></el-table-column>
+        <el-table-column prop="categoryName" label="鎵�灞炰富绾胯矾" min-width="140px"></el-table-column>
+        <el-table-column prop="carCode" label="鎵�灞炶溅杈�" min-width="100px"></el-table-column>
+        <el-table-column prop="maxCustomer" label="瀹㈡埛閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="maxOrder" label="璁㈠崟閲�" min-width="100px"></el-table-column>
+        <el-table-column prop="weeks" label="閰嶉�佸懆鏈�" min-width="140px"></el-table-column>
+        <el-table-column prop="code" label="搴忓彿" min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鏇存柊鏃堕棿" min-width="150px"></el-table-column>
         <el-table-column
           v-if="containPermissions(['business:jkline:update', 'business:jkline:delete'])"
           label="鎿嶄綔"
@@ -98,6 +66,7 @@
     </template>
     <!-- 鏂板缓/淇敼 -->
     <OperaJkLineWindow ref="operaJkLineWindow" @success="handlePageChange"/>
+    <OperaJkLineImportWindow ref="OperaJkLineImportWindowRef" @success="handlePageChange" />
   </TableLayout>
 </template>
 
@@ -106,29 +75,22 @@
 import TableLayout from '@/layouts/TableLayout'
 import Pagination from '@/components/common/Pagination'
 import OperaJkLineWindow from '@/components/business/OperaJkLineWindow'
+import OperaJkLineImportWindow from '@/components/business/OperaJkLineImportWindow'
+import { fetchCateList } from '@/api/business/category'
 export default {
   name: 'JkLine',
   extends: BaseTable,
-  components: { TableLayout, Pagination, OperaJkLineWindow },
+  components: { TableLayout, Pagination, OperaJkLineWindow,OperaJkLineImportWindow },
   data () {
     return {
       // 鎼滅储
       searchForm: {
-        id: '',
-        creator: '',
-        createDate: '',
-        editor: '',
-        editDate: '',
-        isdeleted: '',
-        info: '',
         name: '',
         categoryId: '',
-        carId: '',
-        maxCustomer: '',
-        maxOrder: '',
-        status: '',
-        sortnum: ''
-      }
+        carCode: '',
+        code: ''
+      },
+      categoryList: []
     }
   },
   created () {
@@ -139,6 +101,14 @@
       'field.main': 'id'
     })
     this.search()
+    this.loadCategory()
+  },
+  methods: {
+    loadCategory () {
+      fetchCateList({ type: 4 }).then(res => {
+        this.categoryList = res || []
+      })
+    }
   }
 }
 </script>
diff --git a/admin/src/views/vehicle/cars.vue b/admin/src/views/vehicle/cars.vue
index a4fcc63..9c026c5 100644
--- a/admin/src/views/vehicle/cars.vue
+++ b/admin/src/views/vehicle/cars.vue
@@ -198,7 +198,7 @@
     },
     getCate() {
       fetchList({
-        model: {},
+        model: {type:1},
         capacity: 1000,
         page: 1,
       }).then(res => {
diff --git a/admin/src/views/vehicle/components/OperaCategoryWindow.vue b/admin/src/views/vehicle/components/OperaCategoryWindow.vue
index cfc7acc..6fa801d 100644
--- a/admin/src/views/vehicle/components/OperaCategoryWindow.vue
+++ b/admin/src/views/vehicle/components/OperaCategoryWindow.vue
@@ -76,7 +76,7 @@
   },
   methods: {
     getList () {
-      fetchCateList({}).then(res => {
+      fetchCateList({type:1}).then(res => {
         this.dataList = res || []
       })
     },
diff --git a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
index 25e1f63..403a564 100644
--- a/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -161,6 +161,7 @@
     public static final String LIQUID_LEVEL_UNIT ="LIQUID_LEVEL_UNIT" ;
     public static final String OUT_HY_LOT_TOTAL ="OUT_HY_LOT_TOTAL" ;
     public static final String BANNER_IMG ="BANNER_IMG" ;
+    public static final String GAODE_LOCATION_GEOAPI_URL = "GAODE_LOCATION_GEOAPI_URL";
 
     public static  boolean DEALING_HK_SYNCPRIVILEGE= false;
     public static  boolean DEALING_HK_SYNCDEVICE = false;
@@ -518,6 +519,9 @@
 
     public interface RedisKeys {
         public static final String IMPORTING_CARS ="IMPORTING_CARS";
+        public static final String CHECKING_JKCUSTOMER_LOCATION ="CHECKING_JKCUSTOMER_LOCATION";
+        public static final String IMPORTING_JKCUSTOMER ="IMPORTING_JKCUSTOMER";
+        public static final String IMPORTING_JKLINE ="IMPORTING_JKLINE";
         public static final String IMPORTING_MEMBER ="IMPORTING_MEMBER";
         public static final String BIGSCREEN_UUID ="BIGSCREEN_UUID";
         public static final String IMPORTING_GAS ="IMPORTING_GAS";
diff --git a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
index 7db16b1..6835b17 100644
--- a/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
+++ b/server/system_timer/src/main/java/com/doumee/jobs/fegin/VisitServiceFegin.java
@@ -17,6 +17,9 @@
     @ApiOperation("銆愯瀹㈢郴缁熴�戝畾鏃舵煡璇汉鍛樿澶囨巿鏉冪粨鏋�")
     @PostMapping("/timer/empower/syncEmpowerDetailData")
     ApiResponse syncEmpowerDetailData();
+    @ApiOperation("銆愯瀹㈢郴缁熴�戞洿鏂颁氦鎺т腑蹇冨鎴风粡绾害淇℃伅")
+    @PostMapping("/timer/jkCustomer/getCustomerLocationInfo")
+    ApiResponse getCustomerLocationInfo();
     @ApiOperation("銆愯瀹㈢郴缁熴�戝畾鏃舵煡璇汉鍛樿澶囨巿鏉冧笅杞借繘搴�")
     @PostMapping("/timer/empower/syncEmpowerResultData")
     ApiResponse syncEmpowerResultData();
diff --git a/server/visits/admin_timer/src/main/java/com/doumee/api/JkCustomerTimerController.java b/server/visits/admin_timer/src/main/java/com/doumee/api/JkCustomerTimerController.java
new file mode 100644
index 0000000..ce6e734
--- /dev/null
+++ b/server/visits/admin_timer/src/main/java/com/doumee/api/JkCustomerTimerController.java
@@ -0,0 +1,47 @@
+package com.doumee.api;
+
+import com.alibaba.fastjson.JSONObject;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.core.wx.WXConstant;
+import com.doumee.dao.system.model.SystemDictData;
+import com.doumee.service.business.JkCustomerService;
+import com.doumee.service.business.third.model.ApiResponse;
+import com.doumee.service.system.SystemDictDataService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.apache.shiro.SecurityUtils;
+import org.apache.shiro.mgt.DefaultSecurityManager;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.Objects;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Api(tags = "浜ゆ帶涓績瀹㈡埛瀹氭椂鍣�")
+@RestController
+@RequestMapping("/timer/jkCustomer")
+public class JkCustomerTimerController extends BaseController {
+    @Autowired
+    private JkCustomerService jkCustomerService;
+
+    @ApiOperation("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�")
+    @PostMapping("/getCustomerLocationInfo")
+    public ApiResponse getCustomerLocationInfo() {
+        DefaultSecurityManager securityManager = new DefaultSecurityManager();
+        SecurityUtils.setSecurityManager(securityManager);
+        jkCustomerService.checkNullLocation();
+        return ApiResponse.success("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�");
+    }
+
+
+
+}
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
index e6d644d..02b55bb 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -23,7 +23,7 @@
 #        data-id: com.doumee.meeting.admin
       discovery:
         server-addr: http://192.168.0.212:8848 #閰嶇疆Nacos鍦板潃
-        namespace: dmvisit
+        namespace: wuhu_visit_dev
         username: nacos
         password: nacos
 
diff --git a/server/visits/admin_timer/src/main/resources/bootstrap.yml b/server/visits/admin_timer/src/main/resources/bootstrap.yml
index b5b65b7..efae338 100644
--- a/server/visits/admin_timer/src/main/resources/bootstrap.yml
+++ b/server/visits/admin_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@
 spring:
   profiles:
-    active: pro
+    active: dev
   application:
     name: visitsTimer
     # 瀹夊叏閰嶇疆
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java
index 8b31ffb..51ddef3 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkCustomerCloudController.java
@@ -6,16 +6,18 @@
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.utils.Constants;
 import com.doumee.dao.business.model.JkCustomer;
+import com.doumee.dao.business.model.JkLine;
 import com.doumee.service.business.JkCustomerService;
 import com.doumee.service.business.third.model.ApiResponse;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,35 +37,36 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkcustomer:create")
-    public ApiResponse create(@RequestBody JkCustomer jkCustomer) {
+    public ApiResponse create(@RequestBody JkCustomer jkCustomer, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCustomerService.create(jkCustomer));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkcustomer:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
-        jkCustomerService.deleteById(id);
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkCustomerService.deleteById(id,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:jkcustomer:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
             idList.add(Integer.valueOf(id));
         }
-        jkCustomerService.deleteByIdInBatch(idList);
+        jkCustomerService.deleteByIdInBatch(idList,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkcustomer:update")
-    public ApiResponse updateById(@RequestBody JkCustomer jkCustomer) {
+    public ApiResponse updateById(@RequestBody JkCustomer jkCustomer, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkCustomer.setLoginUserInfo(this.getLoginUser(token));
         jkCustomerService.updateById(jkCustomer);
         return ApiResponse.success(null);
     }
@@ -71,21 +74,32 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkcustomer:query")
-    public ApiResponse<PageData<JkCustomer>> findPage (@RequestBody PageWrap<JkCustomer> pageWrap) {
+    public ApiResponse<PageData<JkCustomer>> findPage (@RequestBody PageWrap<JkCustomer> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCustomerService.findPage(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkcustomer:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkCustomer> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkCustomer> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkCustomer.class).export(jkCustomerService.findPage(pageWrap).getRecords(), "浜ゆ帶-瀹㈡埛淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkcustomer:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkCustomerService.findById(id));
     }
+
+    @ApiOperation(value = "瀹㈡埛淇℃伅瀵煎叆" ,notes = "瀹㈡埛淇℃伅瀵煎叆")
+    @PostMapping("/importExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    @CloudRequiredPermission("business:cars:create")
+    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        List<JkCustomer> list = jkCustomerService.importBatch(file,this.getLoginUser(token));
+        return ApiResponse.success("瀵煎叆鎴愬姛");
+    }
 }
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java
index e404a4b..fede752 100644
--- a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/JkLineCloudController.java
@@ -5,17 +5,19 @@
 import com.doumee.core.annotation.excel.ExcelExporter;
 import com.doumee.core.annotation.pr.PreventRepeat;
 import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Cars;
 import com.doumee.dao.business.model.JkLine;
 import com.doumee.service.business.JkLineService;
 import com.doumee.service.business.third.model.ApiResponse;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
+import io.swagger.annotations.*;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
+import org.springframework.web.multipart.MultipartFile;
 
 import javax.servlet.http.HttpServletResponse;
+import java.io.File;
 import java.util.ArrayList;
 import java.util.List;
 
@@ -35,35 +37,37 @@
     @ApiOperation("鏂板缓")
     @PostMapping("/create")
     @CloudRequiredPermission("business:jkline:create")
-    public ApiResponse create(@RequestBody JkLine jkLine) {
+    public ApiResponse create(@RequestBody JkLine jkLine, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkLine.setLoginUserInfo(this.getLoginUser(token));
         return ApiResponse.success(jkLineService.create(jkLine));
     }
 
     @ApiOperation("鏍规嵁ID鍒犻櫎")
     @GetMapping("/delete/{id}")
     @CloudRequiredPermission("business:jkline:delete")
-    public ApiResponse deleteById(@PathVariable Integer id) {
-        jkLineService.deleteById(id);
+    public ApiResponse deleteById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkLineService.deleteById(id,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鎵归噺鍒犻櫎")
     @GetMapping("/delete/batch")
     @CloudRequiredPermission("business:jkline:delete")
-    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         String [] idArray = ids.split(",");
         List<Integer> idList = new ArrayList<>();
         for (String id : idArray) {
             idList.add(Integer.valueOf(id));
         }
-        jkLineService.deleteByIdInBatch(idList);
+        jkLineService.deleteByIdInBatch(idList,this.getLoginUser(token));
         return ApiResponse.success(null);
     }
 
     @ApiOperation("鏍规嵁ID淇敼")
     @PostMapping("/updateById")
     @CloudRequiredPermission("business:jkline:update")
-    public ApiResponse updateById(@RequestBody JkLine jkLine) {
+    public ApiResponse updateById(@RequestBody JkLine jkLine, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        jkLine.setLoginUserInfo(this.getLoginUser(token));
         jkLineService.updateById(jkLine);
         return ApiResponse.success(null);
     }
@@ -71,21 +75,38 @@
     @ApiOperation("鍒嗛〉鏌ヨ")
     @PostMapping("/page")
     @CloudRequiredPermission("business:jkline:query")
-    public ApiResponse<PageData<JkLine>> findPage (@RequestBody PageWrap<JkLine> pageWrap) {
+    public ApiResponse<PageData<JkLine>> findPage (@RequestBody PageWrap<JkLine> pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkLineService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:jkline:query")
+    public ApiResponse<List<JkLine>> list (@RequestBody JkLine pageWrap, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        return ApiResponse.success(jkLineService.findList(pageWrap));
     }
 
     @ApiOperation("瀵煎嚭Excel")
     @PostMapping("/exportExcel")
     @CloudRequiredPermission("business:jkline:exportExcel")
-    public void exportExcel (@RequestBody PageWrap<JkLine> pageWrap, HttpServletResponse response) {
+    public void exportExcel (@RequestBody PageWrap<JkLine> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         ExcelExporter.build(JkLine.class).export(jkLineService.findPage(pageWrap).getRecords(), "浜ゆ帶-绾胯矾淇℃伅琛�", response);
     }
 
     @ApiOperation("鏍规嵁ID鏌ヨ")
     @GetMapping("/{id}")
     @CloudRequiredPermission("business:jkline:query")
-    public ApiResponse findById(@PathVariable Integer id) {
+    public ApiResponse findById(@PathVariable Integer id, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
         return ApiResponse.success(jkLineService.findById(id));
     }
+
+    @ApiOperation(value = "绾胯矾淇℃伅瀵煎叆" ,notes = "绾胯矾淇℃伅瀵煎叆")
+    @PostMapping("/importExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    @CloudRequiredPermission("business:cars:create")
+    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file, @RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
+        List<JkLine> list = jkLineService.importBatch(file,this.getLoginUser(token));
+        return ApiResponse.success("瀵煎叆鎴愬姛");
+    }
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java
new file mode 100644
index 0000000..e0aa5a6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkCustomerImport.java
@@ -0,0 +1,32 @@
+package com.doumee.dao.admin.request;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 鍛樺伐淇℃伅瀵煎叆琛�
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("绾胯矾瀹㈡埛淇℃伅瀵煎叆")
+public class JkCustomerImport {
+
+
+    @ExcelColumn(name="瀹㈡埛绠�鐮�",value = "code",index = 0)
+    private String code;
+    @ExcelColumn(name="瀹㈡埛鍚嶇О",value = "name",index = 1)
+    private String name;
+    @ExcelColumn(name="绾胯矾",value = "lineName",index = 2)
+    private String lineName;
+    @ExcelColumn(name="搴忓彿",value = "sortno",index = 3)
+    private String sortno;
+    @ExcelColumn(name="鍦板潃",value = "location",index = 4)
+    private String location;
+
+    @ExcelColumn(name="缁忕含搴�" , value = "locationInfo",index = 5)
+    private String locationInfo;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java
new file mode 100644
index 0000000..c511472
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/admin/request/JkLineImport.java
@@ -0,0 +1,34 @@
+package com.doumee.dao.admin.request;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import lombok.Data;
+
+/**
+ * 鍛樺伐淇℃伅瀵煎叆琛�
+ * @author 姹熻箘韫�
+ * @date 2024/01/16 10:03
+ */
+@Data
+@ApiModel("绾胯矾淇℃伅瀵煎叆")
+public class JkLineImport {
+
+
+    @ExcelColumn(name="绾胯矾鍚嶇О",value = "name",index = 0)
+    private String name;
+    @ExcelColumn(name="鎵�灞炰富绾胯矾",value = "categoryName",index = 1)
+    private String categoryName;
+    @ExcelColumn(name="搴忓彿",value = "code",index = 2)
+    private String code;
+    @ExcelColumn(name="閫佽揣杞﹁締",value = "carCode",index = 3)
+    private String carCode;
+
+    @ExcelColumn(name="瀹㈡埛閲�" , value = "maxCustomer" ,index = 4)
+    private String maxCustomer;
+
+    @ExcelColumn(name="璁㈠崟閲�" , value = "maxOrder",index = 5)
+    private String maxOrder;
+    @ExcelColumn(name="鍛ㄦ湡" , value = "weeks",index = 6)
+    private String weeks;
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java
index 19b331b..cb08b73 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkCustomerMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.JkCustomer;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface JkCustomerMapper extends BaseMapper<JkCustomer> {
+public interface JkCustomerMapper extends MPJBaseMapper<JkCustomer> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java
index 7504edd..3a79e19 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/JkLineMapper.java
@@ -2,11 +2,12 @@
 
 import com.baomidou.mybatisplus.core.mapper.BaseMapper;
 import com.doumee.dao.business.model.JkLine;
+import com.github.yulichang.base.MPJBaseMapper;
 
 /**
  * @author 姹熻箘韫�
  * @date 2025/09/28 09:01
  */
-public interface JkLineMapper extends BaseMapper<JkLine> {
+public interface JkLineMapper extends MPJBaseMapper<JkLine> {
 
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
index 7e187cb..1f7584b 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCabinet.java
@@ -111,7 +111,7 @@
 
     @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
     @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
-    private String lacation;
+    private String location;
 
     @ApiModelProperty(value = "缁忓害", example = "1")
     @ExcelColumn(name="缁忓害")
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
index 59b7ae3..8403864 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkCustomer.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
@@ -23,69 +24,89 @@
 public class JkCustomer  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
-    @ExcelColumn(name="涓婚敭")
+    //@ExcelColumn(name="涓婚敭")
     private Integer id;
 
     @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    //@ExcelColumn(name="鍒涘缓浜虹紪鐮�")
     private Integer creator;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鍒涘缓鏃堕棿")IMPORTING_JKCUSTOMER
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    //@ExcelColumn(name="鏇存柊浜虹紪鐮�")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @ExcelColumn(name="鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鏇存柊鏃堕棿")IMPORTING_JKCUSTOMER
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
-    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    //@ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
     private Integer isdeleted;
 
     @ApiModelProperty(value = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
+    //@ExcelColumn(name="澶囨敞")
     private String info;
 
     @ApiModelProperty(value = "鍚嶇О", example = "1")
-    @ExcelColumn(name="鍚嶇О")
-    private Integer name;
+    @ExcelColumn(name="瀹㈡埛鍚嶇О",index = 2,width = 10)
+    private String name;
 
     @ApiModelProperty(value = "缂栫爜", example = "1")
-    @ExcelColumn(name="缂栫爜")
-    private Integer code;
+    @ExcelColumn(name="瀹㈡埛绠�鐮�",index = 1,width = 10)
+    private String code;
 
     @ApiModelProperty(value = "鎵�鍦ㄤ綅缃�")
-    @ExcelColumn(name="鎵�鍦ㄤ綅缃�")
-    private String lacation;
+    @ExcelColumn(name="鍦板潃",index = 3,width = 10)
+    private String location;
 
     @ApiModelProperty(value = "缁忓害", example = "1")
-    @ExcelColumn(name="缁忓害")
+    //@ExcelColumn(name="缁忓害")
     private BigDecimal longitude;
 
     @ApiModelProperty(value = "缁村害", example = "1")
-    @ExcelColumn(name="缁村害")
+    //@ExcelColumn(name="缁村害")
     private BigDecimal latitude;
 
-    @ApiModelProperty(value = "閰嶉�佸懆鏈�")
-    @ExcelColumn(name="閰嶉�佸懆鏈�")
-    private String weeks;
+    @ApiModelProperty(value = "瀹㈡埛搴忓彿")
+    @ExcelColumn(name="搴忓彿",index = 8,width = 10)
+    private String sortno;
 
+    @ApiModelProperty(value = "缁忕含搴�", example = "1")
+    @ExcelColumn(name="缁忕含搴�",index = 3,width = 10)
+    @TableField(exist = false)
+    private String locationInfo;
     @ApiModelProperty(value = "閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)", example = "1")
-    @ExcelColumn(name="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)")
+    //@ExcelColumn(name="閫佽揣璺嚎缂栫爜锛堝叧鑱攋k_line)")
     private Integer lineId;
 
     @ApiModelProperty(value = "鐘舵�� 0姝e父 绂佺敤", example = "1")
-    @ExcelColumn(name="鐘舵�� 0姝e父 绂佺敤")
+    //@ExcelColumn(name="鐘舵�� 0姝e父 绂佺敤")
     private Integer status;
 
     @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
-    @ExcelColumn(name="鎺掑簭鐮�")
+    //@ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
+    @ApiModelProperty(value = "鎵�灞炰富绾胯矾", example = "1")
+    @ExcelColumn(name="鎵�灞炰富绾胯矾",index = 7,width = 10)
+    @TableField(exist = false)
+    private String categoryName;
+    @ApiModelProperty(value = "鎵�灞炰富绾胯矾缂栫爜", example = "1")
+    @TableField(exist = false)
+    private Integer categoryId;
+    @ApiModelProperty(value = "绾胯矾", example = "1")
+    @ExcelColumn(name="閫佽揣绾胯矾",index = 6,width = 10)
+    @TableField(exist = false)
+    private String lineName;
+    @ApiModelProperty(value = "閰嶉�佸懆鏈�", example = "1")
+    @ExcelColumn(name="閰嶉�佸懆鏈�",index = 5,width = 10)
+    @TableField(exist = false)
+    private String lineWeeks;
+    @ApiModelProperty(value = "鏄惁鏂板锛� 0鍚� 1鏄�", example = "1")
+    @TableField(exist = false)
+    private int isnew;
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
index ba54cbb..3b90977 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/JkLine.java
@@ -1,5 +1,6 @@
 package com.doumee.dao.business.model;
 
+import com.baomidou.mybatisplus.annotation.TableField;
 import com.doumee.core.annotation.excel.ExcelColumn;
 import com.doumee.service.business.third.model.LoginUserModel;
 import io.swagger.annotations.ApiModel;
@@ -22,61 +23,79 @@
 public class JkLine  extends LoginUserModel {
 
     @ApiModelProperty(value = "涓婚敭", example = "1")
-    @ExcelColumn(name="涓婚敭")
+    //@ExcelColumn(name="涓婚敭")
     private Integer id;
 
     @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    //@ExcelColumn(name="鍒涘缓浜虹紪鐮�")
     private Integer creator;
 
     @ApiModelProperty(value = "鍒涘缓鏃堕棿")
-    @ExcelColumn(name="鍒涘缓鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鍒涘缓鏃堕棿")
     private Date createDate;
 
     @ApiModelProperty(value = "鏇存柊浜虹紪鐮�", example = "1")
-    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    //@ExcelColumn(name="鏇存柊浜虹紪鐮�")
     private Integer editor;
 
     @ApiModelProperty(value = "鏇存柊鏃堕棿")
-    @ExcelColumn(name="鏇存柊鏃堕棿")
-    @JsonFormat(pattern = "yyyy-MM-dd")
+    //@ExcelColumn(name="鏇存柊鏃堕棿")
     private Date editDate;
 
     @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�", example = "1")
-    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    //@ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
     private Integer isdeleted;
 
     @ApiModelProperty(value = "澶囨敞")
-    @ExcelColumn(name="澶囨敞")
+    //@ExcelColumn(name="澶囨敞")
     private String info;
+    @ApiModelProperty(value = "搴忓彿")
+    @ExcelColumn(name="搴忓彿",index = 7,width = 10)
+    private String code;
 
     @ApiModelProperty(value = "鍚嶇О", example = "1")
-    @ExcelColumn(name="鍚嶇О")
-    private Integer name;
+    @ExcelColumn(name="鍚嶇О",index = 1,width = 10)
+    private String name;
 
     @ApiModelProperty(value = "鐝粍缂栫爜锛堝叧鑱攃ategory锛�", example = "1")
-    @ExcelColumn(name="鐝粍缂栫爜锛堝叧鑱攃ategory锛�")
+    //@ExcelColumn(name="鐝粍缂栫爜锛堝叧鑱攃ategory锛�")
     private Integer categoryId;
 
     @ApiModelProperty(value = "鎵�灞炶溅杈�(鍏宠仈cars)", example = "1")
-    @ExcelColumn(name="鎵�灞炶溅杈�(鍏宠仈cars)")
+    //@ExcelColumn(name="鎵�灞炶溅杈�(鍏宠仈cars)")
     private Integer carId;
 
     @ApiModelProperty(value = "鏈�澶у鎴烽噺", example = "1")
-    @ExcelColumn(name="鏈�澶у鎴烽噺")
+    @ExcelColumn(name="鏈�澶у鎴烽噺",index = 5,width = 10)
     private Integer maxCustomer;
 
     @ApiModelProperty(value = "鏈�澶ц鍗曢噺", example = "1")
-    @ExcelColumn(name="鏈�澶ц鍗曢噺")
+    @ExcelColumn(name="鏈�澶ц鍗曢噺",index = 6,width = 10)
     private Integer maxOrder;
 
     @ApiModelProperty(value = "鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭", example = "1")
-    @ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
+    //@ExcelColumn(name="鐘舵�� 0鏈粦瀹� 1鍦ㄤ綅 2鍊熷嚭")
     private Integer status;
 
     @ApiModelProperty(value = "鎺掑簭鐮�", example = "1")
-    @ExcelColumn(name="鎺掑簭鐮�")
+//    @ExcelColumn(name="鎺掑簭鐮�")
     private Integer sortnum;
 
+    @ApiModelProperty(value = "閰嶉�佸懆鏈�")
+    @ExcelColumn(name="閰嶉�佸懆鏈�",index = 3,width = 10)
+    private String weeks;
+
+    @ApiModelProperty(value = "鏄惁鏂板锛� 0鍚� 1鏄�", example = "1")
+    @TableField(exist = false)
+    private int isnew;
+    @ApiModelProperty(value = "閫佽揣杞﹁締", example = "1")
+    @ExcelColumn(name="閫佽揣杞﹁締",index = 4,width = 10)
+    @TableField(exist = false)
+    private String carCode;
+    @ApiModelProperty(value = "鎵�灞炰富绾胯矾", example = "1")
+    @ExcelColumn(name="鎵�灞炰富绾胯矾",index = 2,width = 10)
+    @TableField(exist = false)
+    private String categoryName;
+
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java
index 9ff9578..c09153d 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkCustomerService.java
@@ -1,8 +1,11 @@
 package com.doumee.service.business;
 
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.JkCustomer;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 /**
@@ -25,7 +28,7 @@
      *
      * @param id 涓婚敭
      */
-    void deleteById(Integer id);
+    void deleteById(Integer id,LoginUserInfo user);
 
     /**
      * 鍒犻櫎
@@ -39,7 +42,7 @@
      *
      * @param ids 涓婚敭闆�
      */
-    void deleteByIdInBatch(List<Integer> ids);
+    void deleteByIdInBatch(List<Integer> ids,LoginUserInfo user);
 
     /**
      * 涓婚敭鏇存柊
@@ -94,4 +97,8 @@
      * @return long
      */
     long count(JkCustomer jkCustomer);
+
+    List<JkCustomer> importBatch(MultipartFile file, LoginUserInfo loginUser);
+
+    void checkNullLocation();
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java
index 4405246..2a68e63 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/JkLineService.java
@@ -1,8 +1,12 @@
 package com.doumee.service.business;
 
+import com.doumee.dao.business.model.Cars;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.dao.business.model.JkLine;
+import org.springframework.web.multipart.MultipartFile;
+
 import java.util.List;
 
 /**
@@ -25,7 +29,7 @@
      *
      * @param id 涓婚敭
      */
-    void deleteById(Integer id);
+    void deleteById(Integer id, LoginUserInfo user);
 
     /**
      * 鍒犻櫎
@@ -39,7 +43,7 @@
      *
      * @param ids 涓婚敭闆�
      */
-    void deleteByIdInBatch(List<Integer> ids);
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user);
 
     /**
      * 涓婚敭鏇存柊
@@ -94,4 +98,6 @@
      * @return long
      */
     long count(JkLine jkLine);
+
+    List<JkLine> importBatch(MultipartFile file, LoginUserInfo loginUser);
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
index 50ff9f0..5e3ac7c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarsServiceImpl.java
@@ -359,6 +359,7 @@
         && Constants.equalsInteger(Constants.ZERO,cars.getType())){
             return this.getGwCar();
         }
+        cars.setType(null);
         QueryWrapper<Cars> wrapper = new QueryWrapper<>(cars);
         wrapper.lambda().eq(Cars::getIsdeleted,Constants.ZERO);
         return carsMapper.selectList(wrapper);
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
index ace6b04..be0bceb 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCabinetServiceImpl.java
@@ -155,8 +155,8 @@
             queryWrapper.lambda().ge(JkCabinet::getHaertTime, Utils.Date.getStart(pageWrap.getModel().getHaertTime()));
             queryWrapper.lambda().le(JkCabinet::getHaertTime, Utils.Date.getEnd(pageWrap.getModel().getHaertTime()));
         }
-        if (pageWrap.getModel().getLacation() != null) {
-            queryWrapper.lambda().eq(JkCabinet::getLacation, pageWrap.getModel().getLacation());
+        if (pageWrap.getModel().getLocation() != null) {
+            queryWrapper.lambda().eq(JkCabinet::getLocation, pageWrap.getModel().getLocation());
         }
         if (pageWrap.getModel().getLongitude() != null) {
             queryWrapper.lambda().eq(JkCabinet::getLongitude, pageWrap.getModel().getLongitude());
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
index 82e889a..2e04143 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkCustomerServiceImpl.java
@@ -1,19 +1,42 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.annotation.excel.ExcelImporter;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.admin.request.JkCustomerImport;
+import com.doumee.dao.admin.request.JkLineImport;
+import com.doumee.dao.business.JkLineMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.dao.system.model.SystemUser;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.JkCustomerMapper;
-import com.doumee.dao.business.model.JkCustomer;
 import com.doumee.service.business.JkCustomerService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -22,11 +45,18 @@
  * @date 2025/09/28 09:01
  */
 @Service
+@Slf4j
 public class JkCustomerServiceImpl implements JkCustomerService {
 
     @Autowired
     private JkCustomerMapper jkCustomerMapper;
+    @Autowired
+    private JkLineMapper jkLineMapper;
+    @Autowired
+    private SystemDictDataBiz systemDictDataBiz;
 
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
     @Override
     public Integer create(JkCustomer jkCustomer) {
         jkCustomerMapper.insert(jkCustomer);
@@ -34,8 +64,13 @@
     }
 
     @Override
-    public void deleteById(Integer id) {
-        jkCustomerMapper.deleteById(id);
+    public void deleteById(Integer id,LoginUserInfo user) {
+        jkCustomerMapper.update(null,new UpdateWrapper<JkCustomer>().lambda()
+                .set(JkCustomer::getIsdeleted,Constants.ONE)
+                .set(JkCustomer::getEditor,user.getId())
+                .set(JkCustomer::getEditDate,new Date())
+                .eq(JkCustomer::getId,id)
+        );
     }
 
     @Override
@@ -45,16 +80,39 @@
     }
 
     @Override
-    public void deleteByIdInBatch(List<Integer> ids) {
+    public void deleteByIdInBatch(List<Integer> ids,LoginUserInfo user) {
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        jkCustomerMapper.deleteBatchIds(ids);
+        jkCustomerMapper.update(null,new UpdateWrapper<JkCustomer>().lambda()
+                .set(JkCustomer::getIsdeleted,Constants.ONE)
+                .set(JkCustomer::getEditor,user.getId())
+                .set(JkCustomer::getEditDate,new Date())
+                .in(JkCustomer::getId,ids)
+        );
     }
 
     @Override
     public void updateById(JkCustomer jkCustomer) {
-        jkCustomerMapper.updateById(jkCustomer);
+        if(jkCustomer.getId() == null
+            ||jkCustomer.getLocationInfo() ==null ){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        String[] strs = jkCustomer.getLocationInfo().split(",");
+        jkCustomer.setLongitude(getDecimalByVal(strs[0]));//缁忓害
+        jkCustomer.setLatitude(strs.length>1?getDecimalByVal(strs[1]):null);//绾害
+        if(jkCustomer.getLatitude() == null || jkCustomer.getLongitude() ==null){
+            //闈炴垚瀵瑰嚭鐜帮紝鏃犳晥缁忕含搴︿笉缁存姢
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+
+        jkCustomerMapper.update(null,new UpdateWrapper<JkCustomer>().lambda()
+                .set(JkCustomer::getLatitude,jkCustomer.getLatitude())
+                .set(JkCustomer::getLongitude,jkCustomer.getLongitude())
+                .set(JkCustomer::getEditor,jkCustomer.getLoginUserInfo().getId())
+                .set(JkCustomer::getEditDate,new Date())
+                .eq(JkCustomer::getId,jkCustomer.getId())
+        );
     }
 
     @Override
@@ -87,71 +145,315 @@
     @Override
     public PageData<JkCustomer> findPage(PageWrap<JkCustomer> pageWrap) {
         IPage<JkCustomer> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<JkCustomer> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<JkCustomer> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        queryWrapper.selectAll(JkCustomer.class )
+                .selectAs(JkLine::getName,JkCustomer::getLineName)
+                .selectAs(JkLine::getWeeks,JkCustomer::getLineWeeks)
+                .selectAs(Category::getId,JkCustomer::getCategoryId)
+                .selectAs(Category::getName,JkCustomer::getCategoryName)
+                .leftJoin(JkLine.class,JkLine::getId,JkCustomer::getLineId )
+                .leftJoin(Category.class,Category::getId,JkLine::getCategoryId );
+        queryWrapper.eq( pageWrap.getModel().getCategoryId()!=null,JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
+        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getLineWeeks()),JkLine::getWeeks, pageWrap.getModel().getLineWeeks());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCategoryName()),Category::getName, pageWrap.getModel().getCategoryName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getLineName()),JkLine::getName, pageWrap.getModel().getLineName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCategoryName()),Category::getName, pageWrap.getModel().getCategoryName());
         if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getId, pageWrap.getModel().getId());
+            queryWrapper.eq(JkCustomer::getId, pageWrap.getModel().getId());
         }
         if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getCreator, pageWrap.getModel().getCreator());
+            queryWrapper.eq(JkCustomer::getCreator, pageWrap.getModel().getCreator());
         }
         if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(JkCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(JkCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+            queryWrapper.ge(JkCustomer::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.le(JkCustomer::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
         }
         if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getEditor, pageWrap.getModel().getEditor());
+            queryWrapper.eq(JkCustomer::getEditor, pageWrap.getModel().getEditor());
         }
         if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(JkCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(JkCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+            queryWrapper.ge(JkCustomer::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.le(JkCustomer::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
         }
         if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
+            queryWrapper.eq(JkCustomer::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getInfo, pageWrap.getModel().getInfo());
+            queryWrapper.eq(JkCustomer::getInfo, pageWrap.getModel().getInfo());
         }
         if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getName, pageWrap.getModel().getName());
+            queryWrapper.like(JkCustomer::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getCode() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getCode, pageWrap.getModel().getCode());
+            queryWrapper.like(JkCustomer::getCode, pageWrap.getModel().getCode());
         }
-        if (pageWrap.getModel().getLacation() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getLacation, pageWrap.getModel().getLacation());
+        if (pageWrap.getModel().getLocation() != null) {
+            queryWrapper.like(JkCustomer::getLocation, pageWrap.getModel().getLocation());
         }
         if (pageWrap.getModel().getLongitude() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getLongitude, pageWrap.getModel().getLongitude());
+            queryWrapper.eq(JkCustomer::getLongitude, pageWrap.getModel().getLongitude());
         }
         if (pageWrap.getModel().getLatitude() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getLatitude, pageWrap.getModel().getLatitude());
+            queryWrapper.eq(JkCustomer::getLatitude, pageWrap.getModel().getLatitude());
         }
-        if (pageWrap.getModel().getWeeks() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getWeeks, pageWrap.getModel().getWeeks());
+        if (pageWrap.getModel().getSortno() != null) {
+            queryWrapper.eq(JkCustomer::getSortno, pageWrap.getModel().getSortno());
         }
         if (pageWrap.getModel().getLineId() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getLineId, pageWrap.getModel().getLineId());
+            queryWrapper.eq(JkCustomer::getLineId, pageWrap.getModel().getLineId());
         }
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getStatus, pageWrap.getModel().getStatus());
+            queryWrapper.eq(JkCustomer::getStatus, pageWrap.getModel().getStatus());
         }
         if (pageWrap.getModel().getSortnum() != null) {
-            queryWrapper.lambda().eq(JkCustomer::getSortnum, pageWrap.getModel().getSortnum());
+            queryWrapper.eq(JkCustomer::getSortnum, pageWrap.getModel().getSortnum());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
+
+        queryWrapper.orderByAsc(JkCustomer::getCode);
+        IPage<JkCustomer> result = jkCustomerMapper.selectJoinPage(page, JkCustomer.class,queryWrapper);
+        if(result.getRecords()!=null && result.getRecords().size()>0){
+            for(JkCustomer model :result.getRecords()){
+                if(model.getLongitude()!=null && model.getLatitude()!=null){
+                    model.setLocationInfo(model.getLongitude().setScale(6, RoundingMode.HALF_UP).doubleValue()
+                            +","+model.getLatitude().setScale(6, RoundingMode.HALF_UP).doubleValue());
+                }
             }
         }
-        return PageData.from(jkCustomerMapper.selectPage(page, queryWrapper));
+        return PageData.from(result);
     }
 
+    @Override
+    public     void checkNullLocation() {
+
+        log.error("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�===============寮�濮�");
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.CHECKING_JKCUSTOMER_LOCATION);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝涓婃浠诲姟姝e湪鎵ц涓紝璇风◢鍚庡啀璇曪紒");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.CHECKING_JKCUSTOMER_LOCATION,true);
+        try {
+            LambdaQueryWrapper<JkCustomer> queryWrapper = new LambdaQueryWrapper<>();
+            queryWrapper.isNotNull(JkCustomer::getLocation);
+            queryWrapper.and(wrapper ->{
+                wrapper.isNull(JkCustomer::getLatitude)
+                        .or().isNull(JkCustomer::getLongitude); });
+            //鏌ヨ鍏ㄩ儴鏈夊湴鍧�锛屼絾鏄病鏈夌粡绾害鐨勫鎴蜂俊鎭�
+            List<JkCustomer>  list = jkCustomerMapper.selectList(queryWrapper);
+            if(list ==null || list.size()==0){
+                return;
+            }
+            String url = systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.GAODE_LOCATION_GEOAPI_URL).getCode();
+            for(JkCustomer c : list){
+                try {
+                    String result = HttpsUtil.get(url.replace("${param}",c.getLocation()),true);
+                    JSONObject json = JSONObject.parseObject(result);
+                    if(json!=null
+                            && json.getInteger("status")!=null
+                            && json.getInteger("status") ==1
+                            && json.getJSONArray("geocodes")!=null
+                            && json.getJSONArray("geocodes").size()>0
+                            && json.getJSONArray("geocodes").getJSONObject(0)!=null
+                            && json.getJSONArray("geocodes").getJSONObject(0).getString("location")!=null){
+                        //璇锋眰鎴愬姛
+                        String[] strs =json.getJSONArray("geocodes").getJSONObject(0).getString("location").split(",");
+                        c.setLongitude(getDecimalByVal(strs[0]));//缁忓害
+                        c.setLatitude(strs.length>1?getDecimalByVal(strs[1]):null);//绾害
+                        if(c.getLatitude() != null && c.getLongitude() !=null){
+                            //闈炴垚瀵瑰嚭鐜帮紝鏃犳晥缁忕含搴︿笉缁存姢
+                            jkCustomerMapper.update(null,new UpdateWrapper<JkCustomer>().lambda()
+                                    .set(JkCustomer::getLatitude,c.getLatitude())
+                                    .set(JkCustomer::getLongitude,c.getLongitude())
+                                    .set(JkCustomer::getEditDate,new Date())
+                                    .eq(JkCustomer::getId,c.getId())
+                            );
+                        }
+                    }else{
+                        log.error("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�=====鑾峰彇澶辫触=========="+c.getName()+"-"+c.getLocation());
+                    }
+                }catch (Exception e){
+                    log.error("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�=====澶辫触=========="+c.getName()+"-"+c.getLocation());
+                }
+
+            }
+        }catch (Exception e){
+                log.error("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�===============",e.getMessage());
+        }finally {
+            redisTemplate.delete(Constants.RedisKeys.CHECKING_JKCUSTOMER_LOCATION);
+        }
+        log.error("鏇存柊浜ゆ帶涓績瀹㈡埛缁忕含搴︿俊鎭�===============缁撴潫");
+
+    }
     @Override
     public long count(JkCustomer jkCustomer) {
         QueryWrapper<JkCustomer> wrapper = new QueryWrapper<>(jkCustomer);
         return jkCustomerMapper.selectCount(wrapper);
     }
+
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public List<JkCustomer> importBatch(MultipartFile file, LoginUserInfo loginUserInfo){
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_JKCUSTOMER);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKCUSTOMER,true);
+        try {
+            ExcelImporter ie = null;
+            List<JkCustomerImport> dataList =null;
+            try {
+                ie = new ExcelImporter(file,1,0);
+                dataList = ie.getDataList(JkCustomerImport.class,null);
+            }  catch (Exception e) {
+                e.printStackTrace();
+            }
+            if(dataList == null || dataList.size() ==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
+            }
+            //褰撳墠鎵�鏈夌嚎璺�
+            List<JkLine> lineList =  jkLineMapper.selectJoinList(JkLine.class,new MPJLambdaWrapper<JkLine>()
+                    .selectAll(JkLine.class)
+                    .eq(JkLine::getIsdeleted,Constants.ZERO)
+            );
+            List<JkCustomer> allList =  jkCustomerMapper.selectJoinList(JkCustomer.class,new MPJLambdaWrapper<JkCustomer>()
+                    .selectAll(JkCustomer.class)
+                    .eq(JkCustomer::getIsdeleted,Constants.ZERO)
+            );
+
+            List<JkCustomer> newList = new ArrayList<>();
+            List<JkCustomer> updateList = new ArrayList<>();
+            for(int i=0;i<dataList.size();i++){
+                JkCustomerImport model = dataList.get(i);
+                if(StringUtils.isBlank(model.getName())
+                        &&StringUtils.isBlank(model.getCode())
+                        &&StringUtils.isBlank(model.getLocation())
+                        &&StringUtils.isBlank(model.getSortno())
+                        &&StringUtils.isBlank(model.getLocationInfo())
+                        &&StringUtils.isBlank(model.getLineName()) ){
+                    continue;
+                }
+                checkModelParam(model,newList,updateList,i,loginUserInfo,allList,lineList );
+            }
+            if((newList == null || newList.size() ==0) && updateList.size() == 0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏈夋晥鏁版嵁涓虹┖锛�");
+            }
+            if(newList.size()>0){
+                jkCustomerMapper.insert(newList);
+            }
+            if(updateList.size()>0){
+                for (JkCustomer c : updateList){
+                    jkCustomerMapper.updateById(c);
+                }
+            }
+            newList.addAll(updateList);
+            return newList;
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }finally {
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_JKCUSTOMER);
+        }
+
+    }
+
+
+    private JkCustomer checkModelParam(JkCustomerImport model, List<JkCustomer> newList
+            , List<JkCustomer> updateList
+            ,int index
+            ,LoginUserInfo loginUserInfo
+            ,List<JkCustomer> allList
+            ,List<JkLine> lineList ) {
+        if(StringUtils.isBlank(model.getName())
+                ||StringUtils.isBlank(model.getCode())
+                ||StringUtils.isBlank(model.getLocation()) ){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛屽鎴蜂俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+        }
+        for(JkCustomer param: newList){
+            if(StringUtils.isNotBlank(model.getCode())&&StringUtils.isNotBlank(param.getCode())) {
+                if (StringUtils.equals(model.getCode(), param.getCode())) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�" + (index + 3) + "琛屽鎴风畝鐮併��" + model.getName() + "銆戦噸澶嶅嚭鐜帮紝璇锋鏌ヨ〃鏍煎唴瀹癸紒");
+                }
+            }
+        }
+        JkLine line = findLineFromListByName(model.getLineName(),lineList);
+        if(line == null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�" + (index + 3) + "琛岀嚎璺��" + model.getLineName() + "銆戜笉瀛樺湪锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+        }
+
+        JkCustomer tModel = findModelFromList(model.getCode(),allList);
+        if(tModel == null){
+            tModel = new JkCustomer();
+            tModel.setCreator(loginUserInfo.getId());
+            tModel.setCreateDate(new Date());
+            tModel.setIsnew(Constants.ONE);
+            newList.add(tModel);
+        }else{
+            tModel.setIsnew(Constants.ZERO);
+            updateList.add(tModel);
+        }
+        tModel.setName(model.getName());
+        tModel.setCode(model.getCode());
+        tModel.setLocation(model.getLocation());
+        tModel.setSortno(model.getSortno());
+        tModel.setLineId(line.getId());
+        if(StringUtils.isNotBlank(model.getLocationInfo())){
+            String[] strs = model.getLocationInfo().split(",");
+            tModel.setLongitude(getDecimalByVal(strs[0]));//缁忓害
+            tModel.setLatitude(strs.length>1?getDecimalByVal(strs[1]):null);//绾害
+        }
+        if(tModel.getLatitude() == null || tModel.getLongitude() ==null){
+            //闈炴垚瀵瑰嚭鐜帮紝鏃犳晥缁忕含搴︿笉缁存姢
+            tModel.setLongitude(null);
+            tModel.setLatitude(null);
+        }
+        tModel.setEditDate(new Date());
+        tModel.setEditor(loginUserInfo.getId());
+        tModel.setIsdeleted(Constants.ZERO);
+        return tModel;
+    }
+
+    private BigDecimal getDecimalByVal(String val) {
+        try {
+            return new BigDecimal(val);
+        }catch (Exception e){
+
+        }
+        return null;
+    }
+
+    private Company findCompanyFromList(String companyName, List<Company> companyList) {
+        if(companyList !=null){
+            for(Company company : companyList){
+                if(StringUtils.equals(companyName,company.getCompanyNamePath())){
+                    return  company;
+                }
+            }
+        }
+        return null;
+    }
+    private JkCustomer findModelFromList(String code, List<JkCustomer> list) {
+        if(list !=null){
+            for(JkCustomer model : list){
+                if(StringUtils.equals(code,model.getCode())){
+                    return  model;
+                }
+            }
+        }
+        return null;
+    }
+    private JkLine findLineFromListByName(String name, List<JkLine> list) {
+        if(list !=null){
+            for(JkLine model : list){
+                if(StringUtils.equals(name,model.getName())){
+                    return model;
+                }
+            }
+        }
+        return null;
+    }
+
 }
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
index ff6161e..c5b5fa2 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/JkLineServiceImpl.java
@@ -1,19 +1,38 @@
 package com.doumee.service.business.impl;
 
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.doumee.core.annotation.excel.ExcelImporter;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.ScientificNotationTUtil;
+import com.doumee.dao.admin.request.CarsImport;
+import com.doumee.dao.admin.request.JkLineImport;
+import com.doumee.dao.business.CarsMapper;
+import com.doumee.dao.business.CategoryMapper;
+import com.doumee.dao.business.model.*;
+import com.doumee.service.business.third.model.LoginUserInfo;
 import com.doumee.service.business.third.model.PageData;
 import com.doumee.service.business.third.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.JkLineMapper;
-import com.doumee.dao.business.model.JkLine;
 import com.doumee.service.business.JkLineService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.github.yulichang.wrapper.MPJLambdaWrapper;
+import org.apache.commons.lang3.StringUtils;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 import org.springframework.util.CollectionUtils;
+import org.springframework.web.multipart.MultipartFile;
 
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
 import java.util.List;
 
 /**
@@ -25,17 +44,45 @@
 public class JkLineServiceImpl implements JkLineService {
 
     @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+    @Autowired
     private JkLineMapper jkLineMapper;
+    @Autowired
+    private CategoryMapper categoryMapper;
+    @Autowired
+    private CarsMapper carsMapper;
 
     @Override
     public Integer create(JkLine jkLine) {
+        if(jkLineMapper.selectCount(new QueryWrapper<JkLine>().lambda()
+                .eq(JkLine::getIsdeleted,Constants.ZERO)
+                .eq(JkLine::getName,jkLine.getName()) )>0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绾胯矾鍚嶇О宸插瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        if(categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
+                .eq(Category::getId,jkLine.getCategoryId())
+                .eq(Category::getType,Constants.FOUR)
+                .eq(Category::getIsdeleted,Constants.ZERO)) ==null){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鎵�灞炰富绾胯矾涓嶅瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        jkLine.setStatus(Constants.formatIntegerNum(jkLine.getStatus()));
+        jkLine.setIsdeleted(Constants.ZERO);
+        jkLine.setCreator(jkLine.getLoginUserInfo().getId());
+        jkLine.setCreateDate(new Date());
+        jkLine.setEditDate(jkLine.getCreateDate());
+        jkLine.setEditor(jkLine.getCreator());
         jkLineMapper.insert(jkLine);
         return jkLine.getId();
     }
 
     @Override
-    public void deleteById(Integer id) {
-        jkLineMapper.deleteById(id);
+    public void deleteById(Integer id, LoginUserInfo user) {
+        jkLineMapper.update(null,new UpdateWrapper<JkLine>().lambda()
+                .set(JkLine::getIsdeleted,Constants.ONE)
+                .set(JkLine::getEditor,user.getId())
+                .set(JkLine::getEditDate,new Date())
+                .eq(JkLine::getId,id)
+        );
     }
 
     @Override
@@ -45,15 +92,34 @@
     }
 
     @Override
-    public void deleteByIdInBatch(List<Integer> ids) {
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo user) {
         if (CollectionUtils.isEmpty(ids)) {
             return;
         }
-        jkLineMapper.deleteBatchIds(ids);
+        jkLineMapper.update(null,new UpdateWrapper<JkLine>().lambda()
+                .set(JkLine::getIsdeleted,Constants.ONE)
+                .set(JkLine::getEditor,user.getId())
+                .set(JkLine::getEditDate,new Date())
+                .in(JkLine::getId,ids)
+        );
     }
 
     @Override
     public void updateById(JkLine jkLine) {
+        if(jkLineMapper.selectCount(new QueryWrapper<JkLine>().lambda()
+                .ne(JkLine::getId,jkLine.getId())
+                .eq(JkLine::getIsdeleted,Constants.ZERO)
+                .eq(JkLine::getName,jkLine.getName()) )>0){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绾胯矾鍚嶇О宸插瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        if(categoryMapper.selectOne(new QueryWrapper<Category>().lambda()
+                .eq(Category::getId,jkLine.getCategoryId())
+                .eq(Category::getType,Constants.FOUR)
+                .eq(Category::getIsdeleted,Constants.ZERO)) ==null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝鎵�灞炰富绾胯矾涓嶅瓨鍦紝璇疯繑鍥炲埛鏂伴〉闈㈡煡鐪嬶紒");
+        }
+        jkLine.setEditor(jkLine.getLoginUserInfo().getId());
+        jkLine.setEditDate(new Date());
         jkLineMapper.updateById(jkLine);
     }
 
@@ -80,67 +146,75 @@
 
     @Override
     public List<JkLine> findList(JkLine jkLine) {
+        jkLine.setIsdeleted(Constants.ZERO);
         QueryWrapper<JkLine> wrapper = new QueryWrapper<>(jkLine);
+        wrapper.lambda().orderByAsc(JkLine::getCode);
         return jkLineMapper.selectList(wrapper);
     }
   
     @Override
     public PageData<JkLine> findPage(PageWrap<JkLine> pageWrap) {
         IPage<JkLine> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
-        QueryWrapper<JkLine> queryWrapper = new QueryWrapper<>();
+        MPJLambdaWrapper<JkLine> queryWrapper = new MPJLambdaWrapper<>();
         Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        queryWrapper.selectAll(JkLine.class )
+                .selectAs(Cars::getCode,JkLine::getCarCode)
+                .selectAs(Category::getName,JkLine::getCategoryName)
+                    .leftJoin(Category.class,Category::getId,JkLine::getCategoryId )
+                    .leftJoin(Cars.class,Cars::getId,JkLine::getCarId );
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCarCode()),Cars::getCode, pageWrap.getModel().getCarCode());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCategoryName()),Category::getName, pageWrap.getModel().getCategoryName());
+        queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getCode()),JkLine::getCode, pageWrap.getModel().getCode());
+        queryWrapper.eq(StringUtils.isNotBlank(pageWrap.getModel().getWeeks()),JkLine::getWeeks, pageWrap.getModel().getWeeks());
+
         if (pageWrap.getModel().getId() != null) {
-            queryWrapper.lambda().eq(JkLine::getId, pageWrap.getModel().getId());
+            queryWrapper.eq(JkLine::getId, pageWrap.getModel().getId());
         }
         if (pageWrap.getModel().getCreator() != null) {
-            queryWrapper.lambda().eq(JkLine::getCreator, pageWrap.getModel().getCreator());
+            queryWrapper.eq(JkLine::getCreator, pageWrap.getModel().getCreator());
         }
         if (pageWrap.getModel().getCreateDate() != null) {
-            queryWrapper.lambda().ge(JkLine::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
-            queryWrapper.lambda().le(JkLine::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
+            queryWrapper.ge(JkLine::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()));
+            queryWrapper.le(JkLine::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()));
         }
         if (pageWrap.getModel().getEditor() != null) {
-            queryWrapper.lambda().eq(JkLine::getEditor, pageWrap.getModel().getEditor());
+            queryWrapper.eq(JkLine::getEditor, pageWrap.getModel().getEditor());
         }
         if (pageWrap.getModel().getEditDate() != null) {
-            queryWrapper.lambda().ge(JkLine::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
-            queryWrapper.lambda().le(JkLine::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
+            queryWrapper.ge(JkLine::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()));
+            queryWrapper.le(JkLine::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()));
         }
         if (pageWrap.getModel().getIsdeleted() != null) {
-            queryWrapper.lambda().eq(JkLine::getIsdeleted, pageWrap.getModel().getIsdeleted());
+            queryWrapper.eq(JkLine::getIsdeleted, pageWrap.getModel().getIsdeleted());
         }
         if (pageWrap.getModel().getInfo() != null) {
-            queryWrapper.lambda().eq(JkLine::getInfo, pageWrap.getModel().getInfo());
+            queryWrapper.eq(JkLine::getInfo, pageWrap.getModel().getInfo());
         }
         if (pageWrap.getModel().getName() != null) {
-            queryWrapper.lambda().eq(JkLine::getName, pageWrap.getModel().getName());
+            queryWrapper.like(JkLine::getName, pageWrap.getModel().getName());
         }
         if (pageWrap.getModel().getCategoryId() != null) {
-            queryWrapper.lambda().eq(JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
+            queryWrapper.eq(JkLine::getCategoryId, pageWrap.getModel().getCategoryId());
         }
         if (pageWrap.getModel().getCarId() != null) {
-            queryWrapper.lambda().eq(JkLine::getCarId, pageWrap.getModel().getCarId());
+            queryWrapper.eq(JkLine::getCarId, pageWrap.getModel().getCarId());
         }
         if (pageWrap.getModel().getMaxCustomer() != null) {
-            queryWrapper.lambda().eq(JkLine::getMaxCustomer, pageWrap.getModel().getMaxCustomer());
+            queryWrapper.eq(JkLine::getMaxCustomer, pageWrap.getModel().getMaxCustomer());
         }
         if (pageWrap.getModel().getMaxOrder() != null) {
-            queryWrapper.lambda().eq(JkLine::getMaxOrder, pageWrap.getModel().getMaxOrder());
+            queryWrapper.eq(JkLine::getMaxOrder, pageWrap.getModel().getMaxOrder());
         }
         if (pageWrap.getModel().getStatus() != null) {
-            queryWrapper.lambda().eq(JkLine::getStatus, pageWrap.getModel().getStatus());
+            queryWrapper.eq(JkLine::getStatus, pageWrap.getModel().getStatus());
         }
         if (pageWrap.getModel().getSortnum() != null) {
-            queryWrapper.lambda().eq(JkLine::getSortnum, pageWrap.getModel().getSortnum());
+            queryWrapper.eq(JkLine::getSortnum, pageWrap.getModel().getSortnum());
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
-        return PageData.from(jkLineMapper.selectPage(page, queryWrapper));
+        queryWrapper.orderByAsc(JkLine::getCode);
+        IPage<JkLine> result = jkLineMapper.selectJoinPage(page, JkLine.class,queryWrapper);
+        return PageData.from(result);
     }
 
     @Override
@@ -148,4 +222,184 @@
         QueryWrapper<JkLine> wrapper = new QueryWrapper<>(jkLine);
         return jkLineMapper.selectCount(wrapper);
     }
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public List<JkLine> importBatch(MultipartFile file, LoginUserInfo loginUserInfo){
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_JKLINE);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_JKLINE,true);
+        try {
+            ExcelImporter ie = null;
+            List<JkLineImport> dataList =null;
+            try {
+                ie = new ExcelImporter(file,1,0);
+                dataList = ie.getDataList(JkLineImport.class,null);
+            }  catch (Exception e) {
+                e.printStackTrace();
+            }
+            if(dataList == null || dataList.size() ==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
+            }
+            //褰撳墠鎵�鏈夌嚎璺�
+            List<JkLine> allList =  jkLineMapper.selectJoinList(JkLine.class,new MPJLambdaWrapper<JkLine>()
+                    .selectAll(JkLine.class)
+                    .eq(JkLine::getIsdeleted,Constants.ZERO)
+            );
+            //鎵�鏈変富绾胯矾
+            List<Category> categoryList =  categoryMapper.selectJoinList(Category.class,new MPJLambdaWrapper<Category>()
+                    .selectAll(Category.class)
+                    .eq(Category::getIsdeleted,Constants.ZERO)
+                    .eq(Category::getType,Constants.FOUR)
+            );
+            //鎵�鏈夌墿娴佽溅杞﹁締
+            List<Cars> cars =  carsMapper.selectJoinList(Cars.class,new MPJLambdaWrapper<Cars>()
+                    .selectAll(Cars.class)
+                    .eq(Cars::getIsdeleted,Constants.ZERO)
+//                    .eq(Cars::getType,Constants.ONE)
+            );
+
+
+            List<JkLine> newList = new ArrayList<>();
+            List<JkLine> updateList = new ArrayList<>();
+            for(int i=0;i<dataList.size();i++){
+                JkLineImport model = dataList.get(i);
+                if(StringUtils.isBlank(model.getName())
+                        &&StringUtils.isBlank(model.getCategoryName())
+                        &&StringUtils.isBlank(model.getCarCode())
+                        &&StringUtils.isBlank(model.getWeeks())
+                        &&StringUtils.isBlank(model.getCode())
+                        &&StringUtils.isBlank(model.getMaxCustomer())
+                        &&StringUtils.isBlank(model.getMaxOrder()) ){
+                    continue;
+                }
+                checkModelParam(model,newList,updateList,i,loginUserInfo,allList,categoryList,cars);
+            }
+            if((newList == null || newList.size() ==0) && updateList.size() == 0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏈夋晥鏁版嵁涓虹┖锛�");
+            }
+            if(newList.size()>0){
+                jkLineMapper.insert(newList);
+            }
+            if(updateList.size()>0){
+                for (JkLine c : updateList){
+                    jkLineMapper.updateById(c);
+                }
+            }
+            newList.addAll(updateList);
+            return newList;
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            e.printStackTrace();
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }finally {
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_JKLINE);
+        }
+
+    }
+
+
+    private JkLine checkModelParam(JkLineImport model, List<JkLine> newList
+            , List<JkLine> updateList
+            ,int index
+            ,LoginUserInfo loginUserInfo
+            ,List<JkLine> allList
+            ,List<Category> categoryList
+            , List<Cars> carsList) {
+        if(StringUtils.isBlank(model.getName())
+                ||StringUtils.isBlank(model.getCategoryName()) ){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛岀嚎璺俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+        }
+        for(JkLine param: newList){
+            if(StringUtils.isNotBlank(model.getName())&&StringUtils.isNotBlank(param.getName())) {
+                if (StringUtils.equals(model.getName(), param.getName())) {
+                    throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�" + (index + 3) + "琛岀嚎璺悕绉般��" + model.getName() + "銆戦噸澶嶅嚭鐜帮紝璇锋鏌ヨ〃鏍煎唴瀹癸紒");
+                }
+            }
+        }
+        Category cate = findCategoryFromListByName(model.getCategoryName(),categoryList);
+        if(cate == null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�" + (index + 3) + "琛屾墍灞炰富绾胯矾銆�" + model.getCategoryName() + "銆戜笉瀛樺湪锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+        }
+        Cars car = findCarFromListByName(model.getCarCode(),carsList);
+        if(car == null){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "瀵逛笉璧凤紝绗�" + (index + 3) + "琛岄�佽溅杞﹁締銆�" + model.getCarCode() + "銆戜笉瀛樺湪锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+        }
+        JkLine line = findModelFromList(model.getName(),allList);
+        if(line == null){
+            line = new JkLine();
+            line.setCreator(loginUserInfo.getId());
+            line.setCreateDate(new Date());
+            line.setIsnew(Constants.ONE);
+            newList.add(line);
+        }else{
+            line.setIsnew(Constants.ZERO);
+            updateList.add(line);
+        }
+        line.setName(model.getName());
+        line.setCode(model.getCode());
+        line.setCategoryId(cate.getId());
+        line.setCarId(car.getId());
+        line.setWeeks(model.getWeeks());
+        line.setMaxCustomer(getIntegerByVal(model.getMaxCustomer()));
+        line.setMaxOrder(getIntegerByVal(model.getMaxOrder()));
+
+        line.setEditDate(new Date());
+        line.setEditor(loginUserInfo.getId());
+        line.setIsdeleted(Constants.ZERO);
+        return line;
+    }
+
+    private Integer getIntegerByVal(String maxCustomer) {
+        try {
+            return Integer.parseInt(maxCustomer);
+        }catch (Exception e){
+
+        }
+        return null;
+    }
+
+    private Company findCompanyFromList(String companyName, List<Company> companyList) {
+        if(companyList !=null){
+            for(Company company : companyList){
+                if(StringUtils.equals(companyName,company.getCompanyNamePath())){
+                    return  company;
+                }
+            }
+        }
+        return null;
+    }
+    private JkLine findModelFromList(String name, List<JkLine> list) {
+        if(list !=null){
+            for(JkLine model : list){
+                if(StringUtils.equals(name,model.getName())){
+                    return  model;
+                }
+            }
+        }
+        return null;
+    }
+    private Category findCategoryFromListByName(String name, List<Category> list) {
+        if(list !=null){
+            for(Category model : list){
+                if(StringUtils.equals(name,model.getName())){
+                    return model;
+                }
+            }
+        }
+        return null;
+    }
+    private Cars findCarFromListByName(String name, List<Cars> list) {
+        if(list !=null){
+            for(Cars model : list){
+                if(StringUtils.equals(name,model.getCode())){
+                    return model;
+                }
+            }
+        }
+        return null;
+    }
 }

--
Gitblit v1.9.3