From baab15477c13b3eeb04784f784fcc5bac1c68393 Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期五, 12 七月 2024 18:35:39 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbomyoujia

---
 admin/src/views/business/iamInterfaceLog.vue                                                           |    3 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java        |   25 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionBatchDoRequest.java            |   18 
 server/web/src/main/java/com/doumee/api/web/CustomerApi.java                                           |   53 +
 server/service/src/main/java/com/doumee/dao/business/model/Customer.java                               |    6 
 server/service/src/main/java/com/doumee/dao/web/reqeust/FreeCustomizationDTO.java                      |   48 +
 server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java              |    9 
 admin/src/components/system/dict/OperaDictDataWindow.vue                                               |    2 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java           |  127 ++
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java    |   54 +
 server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java                              |   19 
 server/service/src/main/java/com/doumee/core/utils/Constants.java                                      |   85 +
 server/service/src/main/java/com/doumee/service/business/InitService.java                              |    7 
 server/admin/src/main/java/com/doumee/api/business/UsersController.java                                |   19 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java       |   25 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserGetTokenRequest.java             |   27 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTAreaListRequest.java                 |   16 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java           |   24 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java |   19 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java              |   45 +
 server/service/src/main/java/com/doumee/dao/business/model/Users.java                                  |    7 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionDoRequest.java                 |   21 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java              |   16 
 admin/src/views/business/interfaceLog.vue                                                              |    3 
 server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java                 |  211 ++++
 server/service/src/main/java/com/doumee/service/business/CustomerService.java                          |   23 
 server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java                   |   88 +
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java       |   30 
 admin/src/views/business/member.vue                                                                    |  169 +--
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java                          |   34 
 server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java                                      |   34 
 server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java                     |   12 
 admin/src/api/business/users.js                                                                        |    9 
 server/admin/src/main/java/com/doumee/timer/init/InitBizService.java                                   |   38 
 server/admin/src/main/java/com/doumee/timer/ZbomRedisResetBiz.java                                     |   38 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java                                   |    3 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java                     |  322 +++++++
 server/service/src/main/java/com/doumee/core/model/ApiResponse.java                                    |   10 
 server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java                 |    8 
 server/admin/src/main/java/com/doumee/api/business/ShopController.java                                 |    4 
 server/service/src/main/java/com/doumee/service/business/UsersService.java                             |    3 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java   |   13 
 server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java          |    9 
 server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java                                   |    2 
 server/web/src/main/java/com/doumee/api/web/PersonnelApi.java                                          |   20 
 admin/src/views/business/crmInterfaceLog.vue                                                           |    4 
 server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java                    |  261 +++++
 server/service/src/main/java/com/doumee/service/business/MemberService.java                            |    5 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCollectListRequest.java              |   25 
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java                          |    9 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java    |   72 +
 server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java                          |   14 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java                      |   18 
 server/admin/src/main/java/com/doumee/api/business/PushController.java                                 |    6 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java                       |   41 
 server/service/src/main/java/com/doumee/dao/web/reqeust/RenovationCalculatorDTO.java                   |   34 
 admin/src/components/business/OperaUserImportWindow.vue                                                |   82 +
 admin/src/views/business/shop.vue                                                                      |   39 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserLogoutRequest.java               |   16 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java    |   51 +
 server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java                                |    7 
 admin/src/views/business/shopTree.vue                                                                  |    9 
 server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java              |   16 
 server/service/src/main/java/com/doumee/dao/web/reqeust/TestTrimStyleDTO.java                          |   48 +
 admin/src/views/business/shopUsers.vue                                                                 |   38 
 server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.java                            |   17 
 server/service/src/main/java/com/doumee/dao/admin/request/UserImport.java                              |   41 
 admin/public/template/users.xlsx                                                                       |    0 
 68 files changed, 2,344 insertions(+), 267 deletions(-)

diff --git a/admin/public/template/users.xlsx b/admin/public/template/users.xlsx
index 05a836d..dab5df8 100644
--- a/admin/public/template/users.xlsx
+++ b/admin/public/template/users.xlsx
Binary files differ
diff --git a/admin/src/api/business/users.js b/admin/src/api/business/users.js
index 8cb3092..ed0e68a 100644
--- a/admin/src/api/business/users.js
+++ b/admin/src/api/business/users.js
@@ -14,14 +14,9 @@
     download: true
   })
 }
-export function updateWorkStatus (data) {
-  return request.post('/visitsAdmin/cloudService/business/member/updateWorkStatus', data)
-}
+
 export function importExcel (data) {
-  return request.post('/visitsAdmin/cloudService/business/member/importExcel', data)
-}
-export function memberSync (data) {
-  return request.post('/visitsAdmin/cloudService/business/member/syncAll', data)
+  return request.post('/business/users/importExcel', data)
 }
 // 鍒涘缓
 export function create (data) {
diff --git a/admin/src/components/business/OperaUserImportWindow.vue b/admin/src/components/business/OperaUserImportWindow.vue
new file mode 100644
index 0000000..7d5f239
--- /dev/null
+++ b/admin/src/components/business/OperaUserImportWindow.vue
@@ -0,0 +1,82 @@
+<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/users'
+export default {
+  name: 'OperaShopImportWindow',
+  extends: BaseOpera,
+  // eslint-disable-next-line vue/no-unused-components
+  components: { GlobalWindow },
+  data () {
+    return {
+      importing:false,
+      fileName: '',
+    }
+  },
+  methods: {
+    open (title, companyType) {
+      this.title = title
+      this.fileName = ''
+      this.visible = true
+    },
+    // 瀵煎嚭妯℃澘
+    exportTemplate () {
+      // 鎶曚繚鐢宠
+      window.open('/template/users.xlsx')
+    },
+    clickRef () {
+      this.$refs.fileExcel.click()
+    },
+    result (e) {
+      const data = new FormData()
+      data.append('file', e.target.files[0])
+      data.append('companyType', this.companyType)
+      importExcel(data)
+        .then(res => {
+          this.$tip.apiSuccess('鍙戣捣鎵归噺涓婁紶浠诲姟鎴愬姛锛岃绋嶅悗鍒锋柊椤甸潰鏌ョ湅')
+          this.$emit('success')
+          this.visible = false
+        })
+        .catch(err => {
+          this.fileName = ''
+        })
+        .finally(() => {
+          this.$refs.fileExcel.value = null
+        })
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+
+</style>
diff --git a/admin/src/components/system/dict/OperaDictDataWindow.vue b/admin/src/components/system/dict/OperaDictDataWindow.vue
index 65caa88..bc24149 100644
--- a/admin/src/components/system/dict/OperaDictDataWindow.vue
+++ b/admin/src/components/system/dict/OperaDictDataWindow.vue
@@ -14,7 +14,7 @@
         <span class="status-text">{{form.istext | disabledText1}}</span>
       </el-form-item>
       <el-form-item label="鏁版嵁鍊�" prop="code" required>
-        <el-input v-if="!form.istext" v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim maxlength="50"/>
+        <el-input v-if="!form.istext" v-model="form.code" placeholder="璇疯緭鍏ユ暟鎹��" v-trim maxlength="500"/>
         <RichEditor v-else  :richData="form.code" :styleEditor="styleEditor" @getWangedditor="getWangedditor" :readonly="false"/>
       </el-form-item>
       <el-form-item label="鐘舵��" prop="disabled" required class="form-item-status">
diff --git a/admin/src/views/business/crmInterfaceLog.vue b/admin/src/views/business/crmInterfaceLog.vue
index 67b4296..86ff316 100644
--- a/admin/src/views/business/crmInterfaceLog.vue
+++ b/admin/src/views/business/crmInterfaceLog.vue
@@ -50,8 +50,8 @@
         </el-table-column>
         <el-table-column label="骞冲彴" min-width="100px">
           <template slot-scope="{row}">
-            <span v-if="row.plat == 0">娴峰悍瀹夐槻骞冲彴</span>
-            <span v-if="row.plat == 1">ERP绯荤粺</span>
+            <span v-if="row.plat == 0">蹇楅偊CRM骞冲彴</span>
+            <span v-if="row.plat == 1">蹇楅偊鐭俊閫氶亾</span>
           </template>
         </el-table-column>
         <el-table-column prop="request" label="璇锋眰鍙傛暟" min-width="100px">
diff --git a/admin/src/views/business/iamInterfaceLog.vue b/admin/src/views/business/iamInterfaceLog.vue
index 83cbd54..af65e0f 100644
--- a/admin/src/views/business/iamInterfaceLog.vue
+++ b/admin/src/views/business/iamInterfaceLog.vue
@@ -50,8 +50,7 @@
         </el-table-column>
         <el-table-column label="骞冲彴" min-width="100px">
           <template slot-scope="{row}">
-            <span v-if="row.plat == 0">娴峰悍瀹夐槻骞冲彴</span>
-            <span v-if="row.plat == 1">ERP绯荤粺</span>
+            <span v-if="row.plat == 0">蹇楅偊IAM骞冲彴</span>
           </template>
         </el-table-column>
         <el-table-column prop="request" label="璇锋眰鍙傛暟" min-width="100px">
diff --git a/admin/src/views/business/interfaceLog.vue b/admin/src/views/business/interfaceLog.vue
index f792a20..b027af7 100644
--- a/admin/src/views/business/interfaceLog.vue
+++ b/admin/src/views/business/interfaceLog.vue
@@ -50,8 +50,7 @@
         </el-table-column>
         <el-table-column label="骞冲彴" min-width="100px">
           <template slot-scope="{row}">
-            <span v-if="row.plat == 0">娴峰悍瀹夐槻骞冲彴</span>
-            <span v-if="row.plat == 1">ERP绯荤粺</span>
+            <span v-if="row.plat == 0">蹇楅偊涓彴</span>
           </template>
         </el-table-column>
         <el-table-column prop="request" label="璇锋眰鍙傛暟" min-width="100px">
diff --git a/admin/src/views/business/member.vue b/admin/src/views/business/member.vue
index 14e0a33..613c5f5 100644
--- a/admin/src/views/business/member.vue
+++ b/admin/src/views/business/member.vue
@@ -2,41 +2,11 @@
   <TableLayout :permissions="['business:member: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="remark">
-        <el-input v-model="searchForm.remark" placeholder="璇疯緭鍏ュ娉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="澶村儚" prop="imgurl">
-        <el-input v-model="searchForm.imgurl" placeholder="璇疯緭鍏ュご鍍�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="绫诲瀷 0娑堣垂鑰�" prop="type">
-        <el-input v-model="searchForm.type" placeholder="璇疯緭鍏ョ被鍨� 0娑堣垂鑰�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
       <el-form-item label="鏄电О" prop="nickname">
         <el-input v-model="searchForm.nickname" 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="birthday">
-        <el-date-picker v-model="searchForm.birthday" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ュ嚭鐢熸棩鏈�" @change="search"/>
       </el-form-item>
       <el-form-item label="鎵嬫満鍙�" prop="phone">
         <el-input v-model="searchForm.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" @keypress.enter.native="search"></el-input>
@@ -44,62 +14,15 @@
       <el-form-item label="寰俊openid" prop="openid">
         <el-input v-model="searchForm.openid" placeholder="璇疯緭鍏ュ井淇penid" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鐘舵�� 0姝e父 1绂佺敤" prop="status">
-        <el-input v-model="searchForm.status" placeholder="璇疯緭鍏ョ姸鎬� 0姝e父 1绂佺敤" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="涓彴涓存椂绁ㄦ嵁杩囨湡鏃堕棿" prop="tokenDate">
-        <el-date-picker v-model="searchForm.tokenDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ヤ腑鍙颁复鏃剁エ鎹繃鏈熸椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="涓彴涓存椂绁ㄦ嵁" prop="token">
-        <el-input v-model="searchForm.token" placeholder="璇疯緭鍏ヤ腑鍙颁复鏃剁エ鎹�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鎬у埆 1鐢� 2濂�" prop="sex">
-        <el-input v-model="searchForm.sex" placeholder="璇疯緭鍏ユ�у埆 1鐢� 2濂�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏈�杩戠櫥褰曟椂闂�" prop="lastLoginDate">
-        <el-date-picker v-model="searchForm.lastLoginDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶杩戠櫥褰曟椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鐧诲綍娆℃暟" prop="loginNum">
-        <el-input v-model="searchForm.loginNum" placeholder="璇疯緭鍏ョ櫥褰曟鏁�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鐪佷唤鍚嶇О" prop="provinceName">
-        <el-input v-model="searchForm.provinceName" placeholder="璇疯緭鍏ョ渷浠藉悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍩庡競鍚嶇О" prop="cityName">
-        <el-input v-model="searchForm.cityName" placeholder="璇疯緭鍏ュ煄甯傚悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍖哄煙鍚嶇О" prop="areaName">
-        <el-input v-model="searchForm.areaName" placeholder="璇疯緭鍏ュ尯鍩熷悕绉�" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鐪佷唤code" prop="provicneCode">
-        <el-input v-model="searchForm.provicneCode" placeholder="璇疯緭鍏ョ渷浠絚ode" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍩庡競code" prop="cityCode">
-        <el-input v-model="searchForm.cityCode" placeholder="璇疯緭鍏ュ煄甯俢ode" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鍖哄煙code" prop="areaCode">
-        <el-input v-model="searchForm.areaCode" placeholder="璇疯緭鍏ュ尯鍩焎ode" @keypress.enter.native="search"></el-input>
-      </el-form-item>
       <el-form-item label="灏忓尯鍚嶇О" prop="district">
         <el-input v-model="searchForm.district" placeholder="璇疯緭鍏ュ皬鍖哄悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鎴峰瀷淇℃伅锛屽鍘呭帹鍗槼鏁伴噺锛屾牸寮忥紙1-1-1-1-1锛�" prop="housetype">
-        <el-input v-model="searchForm.housetype" placeholder="璇疯緭鍏ユ埛鍨嬩俊鎭紝瀹ゅ巺鍘ㄥ崼闃虫暟閲忥紝鏍煎紡锛�1-1-1-1-1锛�" @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="鎺堟潈鐘舵�� 0鏈巿鏉冩湭缁戝畾 1宸叉巿鏉冩湭缁戝畾 2宸叉巿鏉冨凡缁戝畾" prop="authStatus">
-        <el-input v-model="searchForm.authStatus" placeholder="璇疯緭鍏ユ巿鏉冪姸鎬� 0鏈巿鏉冩湭缁戝畾 1宸叉巿鏉冩湭缁戝畾 2宸叉巿鏉冨凡缁戝畾" @keypress.enter.native="search"></el-input>
-      </el-form-item>
-      <el-form-item label="鏈�杩戞巿鏉冪粦瀹氭椂闂�" prop="authDate">
-        <el-date-picker v-model="searchForm.authDate" value-format="yyyy-MM-dd" placeholder="璇疯緭鍏ユ渶杩戞巿鏉冪粦瀹氭椂闂�" @change="search"/>
-      </el-form-item>
-      <el-form-item label="鏈�杩戞巿鏉冪粦瀹氬娉�" prop="authInfo">
-        <el-input v-model="searchForm.authInfo" placeholder="璇疯緭鍏ユ渶杩戞巿鏉冪粦瀹氬娉�" @keypress.enter.native="search"></el-input>
+      <el-form-item label="鎺堟潈鐘舵��" prop="authStatus">
+        <el-select v-model="searchForm.authStatus" clearable @change="search">
+          <el-option value="0" label="鏈巿鏉冩湭缁戝畾" ></el-option>
+          <el-option value="1" label="宸叉巿鏉冩湭缁戝畾"></el-option>
+          <el-option value="2" label="宸叉巿鏉冨凡缁戝畾"></el-option>
+        </el-select>
       </el-form-item>
       <section>
         <el-button type="primary" @click="search">鎼滅储</el-button>
@@ -109,10 +32,10 @@
     </el-form>
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
-      <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
+<!-- <ul class="toolbar" v-permissions="['business:member:create', 'business:member:delete']">
         <li><el-button type="primary" @click="$refs.operaMemberWindow.open('鏂板缓鐢ㄦ埛淇℃伅琛�')" icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓</el-button></li>
         <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鍒犻櫎</el-button></li>
-      </ul>
+      </ul>-->
       <el-table
         v-loading="isWorking.search"
         :data="tableData.list"
@@ -120,39 +43,55 @@
         @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="remark" label="澶囨敞" min-width="100px"></el-table-column>
-        <el-table-column prop="imgurl" label="澶村儚" min-width="100px"></el-table-column>
-        <el-table-column prop="type" label="绫诲瀷 0娑堣垂鑰�" min-width="100px"></el-table-column>
-        <el-table-column prop="nickname" label="鏄电О" min-width="100px"></el-table-column>
-        <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
+        <el-table-column fixed label="澶村儚" align="center" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image
+                v-if="row.imgurlFull"
+                style="width: 60px; height: 60px"
+                :src="row.imgurlFull"
+                :preview-src-list="[row.imgurlFull]">
+            </el-image>
+          </template>
+        </el-table-column>
+        <el-table-column prop="nickname" align="center" fixed label="鏄电О/濮撳悕" min-width="180px">
+          <template slot-scope="{row}">
+            {{row.nickname||'-'}} / {{row.name||'-'}}
+          </template>
+        </el-table-column>
+        <el-table-column prop="phone" label="鎵嬫満鍙�" fixed min-width="100px"></el-table-column>
         <el-table-column prop="birthday" label="鍑虹敓鏃ユ湡" min-width="100px"></el-table-column>
-        <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
         <el-table-column prop="openid" label="寰俊openid" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵�� 0姝e父 1绂佺敤" min-width="100px"></el-table-column>
-        <el-table-column prop="tokenDate" label="涓彴涓存椂绁ㄦ嵁杩囨湡鏃堕棿" min-width="100px"></el-table-column>
-        <el-table-column prop="token" label="涓彴涓存椂绁ㄦ嵁" min-width="100px"></el-table-column>
-        <el-table-column prop="sex" label="鎬у埆 1鐢� 2濂�" min-width="100px"></el-table-column>
-        <el-table-column prop="lastLoginDate" label="鏈�杩戠櫥褰曟椂闂�" min-width="100px"></el-table-column>
-        <el-table-column prop="loginNum" label="鐧诲綍娆℃暟" min-width="100px"></el-table-column>
-        <el-table-column prop="provinceName" label="鐪佷唤鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="cityName" label="鍩庡競鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="areaName" label="鍖哄煙鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="provicneCode" label="鐪佷唤code" min-width="100px"></el-table-column>
-        <el-table-column prop="cityCode" label="鍩庡競code" min-width="100px"></el-table-column>
-        <el-table-column prop="areaCode" label="鍖哄煙code" min-width="100px"></el-table-column>
+        <el-table-column prop="sex" label="鎬у埆" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.sex ==1"  >鐢�</span>
+            <span v-if="row.sex ==0" >濂�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="provinceName" align="center" label="鍦板潃" min-width="200px">
+          <template slot-scope="{row}">
+            {{row.provinceName}}{{row.cityName}}{{row.areaName}}{{row.address}}
+          </template>
+        </el-table-column>
         <el-table-column prop="district" label="灏忓尯鍚嶇О" min-width="100px"></el-table-column>
-        <el-table-column prop="housetype" label="鎴峰瀷淇℃伅锛屽鍘呭帹鍗槼鏁伴噺锛屾牸寮忥紙1-1-1-1-1锛�" 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="authStatus" label="鎺堟潈鐘舵�� 0鏈巿鏉冩湭缁戝畾 1宸叉巿鏉冩湭缁戝畾 2宸叉巿鏉冨凡缁戝畾" min-width="100px"></el-table-column>
-        <el-table-column prop="authDate" label="鏈�杩戞巿鏉冪粦瀹氭椂闂�" min-width="100px"></el-table-column>
-        <el-table-column prop="authInfo" label="鏈�杩戞巿鏉冪粦瀹氬娉�" min-width="100px"></el-table-column>
+        <el-table-column prop="housetypeInfo" label="鎴峰瀷淇℃伅" min-width="100px"></el-table-column>
+        <el-table-column prop="area" label="闈㈢Н(銕�)" min-width="80px"></el-table-column>
+        <el-table-column prop="longitude" label="缁忕含搴�" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.longitude && row.latitude" style="color:red;">[{{row.longitude}},{{row.latitude}}]</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="authStatus" label="鎺堟潈鐘舵��" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="(row.authStatus|| 0) ==0" style="color:red;">鏈巿鏉冩湭缁戝畾</span>
+            <span v-if="row.authStatus ==1" style="color:blue;">宸叉巿鏉冩湭缁戝畾</span>
+            <span v-if="row.authStatus ==2" style="color:green;">宸叉巿鏉冨凡缁戝畾</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="loginNum" label="鐧诲綍娆℃暟" min-width="100px"></el-table-column>
+        <el-table-column prop="lastLoginDate" label="鏈�杩戠櫥褰曟椂闂�" min-width="120px"></el-table-column>
+        <el-table-column prop="authDate" label="鎺堟潈缁戝畾鏃堕棿" min-width="120px"></el-table-column>
+        <el-table-column prop="token" label="涓彴绁ㄦ嵁" min-width="100px"></el-table-column>
+        <el-table-column prop="tokenDate" label="绁ㄦ嵁鏈夋晥鏈�" min-width="100px"></el-table-column>
         <el-table-column
           v-if="containPermissions(['business:member:update', 'business:member:delete'])"
           label="鎿嶄綔"
diff --git a/admin/src/views/business/shop.vue b/admin/src/views/business/shop.vue
index 31878aa..233e5a8 100644
--- a/admin/src/views/business/shop.vue
+++ b/admin/src/views/business/shop.vue
@@ -2,31 +2,31 @@
   <TableLayout :permissions="['business:shop:query']">
     <!-- 鎼滅储琛ㄥ崟 -->
     <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
-      <el-form-item label="閮ㄩ棬鍚嶇О" prop="name">
+      <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="parentId">
+      <el-form-item label="" prop="parentId">
         <el-input v-model="searchForm.parentName" placeholder="璇疯緭鍏ヤ笂绾х粍缁囧悕绉�/缂栫爜" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鐘舵��" prop="status">
-        <el-select v-model="searchForm.status" @change="search" clearable placeholder="鐘舵��">
-          <el-option label="鍋滅敤" value="1"></el-option>
+      <el-form-item label="" prop="status">
+        <el-select v-model="searchForm.status" style="width: 130px"   @change="search" clearable placeholder="鐘舵��">
+          <el-option label="鍋滅敤" value="0"></el-option>
           <el-option label="姝e父" value="1"></el-option>
-          <el-option label="宸插垹闄�" value="2"></el-option>
+          <el-option label="宸插垹闄�" value="-1"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="缁勭粐缂栫爜" prop="code">
+      <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="type">
-        <el-select v-model="searchForm.type" @change="search" clearable placeholder="涓�绾х粍缁囩被鍨�">
+      <el-form-item label="" prop="type">
+        <el-select v-model="searchForm.type" @change="search" style="width: 130px"  clearable placeholder="涓�绾х粍缁囩被鍨�">
           <el-option label="HR" value="1"></el-option>
           <el-option label="鍔犵洘鍟�" value="2"></el-option>
           <el-option label="铏氭嫙缁勭粐" value="3"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="浜岀骇缁勭粐绫诲瀷" prop="type">
-        <el-select v-model="searchForm.secondType" @change="search" clearable placeholder="浜岀骇缁勭粐绫诲瀷">
+      <el-form-item label="" prop="type">
+        <el-select v-model="searchForm.secondType" @change="search" style="width: 130px"  clearable placeholder="浜岀骇缁勭粐绫诲瀷">
           <el-option label="S" value="1"></el-option>
           <el-option label="F" value="2"></el-option>
           <el-option label="搴楅潰" value="3"></el-option>
@@ -34,8 +34,8 @@
           <el-option label="铏氭嫙搴楅潰" value="5"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="閮ㄩ棬灞炴��" prop="attribute">
-        <el-select v-model="searchForm.attribute" @change="search" clearable placeholder="閮ㄩ棬灞炴��">
+      <el-form-item label="" prop="attribute">
+        <el-select v-model="searchForm.attribute" @change="search" style="width: 130px"  clearable placeholder="閮ㄩ棬灞炴��">
           <el-option label="瀹炰綋搴楅潰" value="1"></el-option>
           <el-option label="铏氭嫙搴楅潰" value="2"></el-option>
           <el-option label="鐢靛晢閮�" value="3"></el-option>
@@ -43,19 +43,19 @@
           <el-option label="璐㈠姟閮�" value="5"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="鐪佷唤鍚嶇О" prop="provinceName">
+      <el-form-item label="" prop="provinceName">
         <el-input v-model="searchForm.provinceName" placeholder="璇疯緭鍏ョ渷浠藉悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鍩庡競鍚嶇О" prop="cityName">
+      <el-form-item label="" prop="cityName">
         <el-input v-model="searchForm.cityName" placeholder="璇疯緭鍏ュ煄甯傚悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鍖哄幙鍚嶇О" prop="areaName">
+      <el-form-item label="" prop="areaName">
         <el-input v-model="searchForm.areaName" placeholder="璇疯緭鍏ュ尯鍘垮悕绉�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="鍝佺被缂栫爜" prop="unitCode">
+      <el-form-item label="" prop="unitCode">
         <el-input v-model="searchForm.unitCode" placeholder="璇疯緭鍏ュ搧绫荤紪鐮�" @keypress.enter.native="search"></el-input>
       </el-form-item>
-      <el-form-item label="瀹㈡埛绫诲瀷缂栫爜" prop="siteCode">
+      <el-form-item label="" prop="siteCode">
         <el-input v-model="searchForm.siteCode" placeholder="璇疯緭鍏ュ鎴风被鍨嬬紪鐮�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <section>
@@ -78,6 +78,7 @@
       >
         <el-table-column type="selection" width="55"></el-table-column>
         <el-table-column prop="name" label="缁勭粐鍚嶇О" min-width="120px"></el-table-column>
+        <el-table-column prop="code" label="缁勭粐缂栫爜" min-width="120px"></el-table-column>
         <el-table-column prop="type" label="涓�绾х被鍨�" min-width="80px">
           <template scope="{row}">
             <span v-if="row.type == 1">HR</span>
@@ -107,7 +108,7 @@
           <template scope="{row}">
             <span v-if="row.status == 0" style="color: red">鍋滅敤</span>
             <span v-if="row.status == 1" style="color: green">姝e父</span>
-            <span v-if="row.status == 2" style="color: grey">宸插垹闄�</span>
+            <span v-if="row.status == -1" style="color: grey">宸插垹闄�</span>
           </template>
         </el-table-column>
          <el-table-column prop="namePath" label="缁勭粐璺緞" min-width="200px"></el-table-column>
diff --git a/admin/src/views/business/shopTree.vue b/admin/src/views/business/shopTree.vue
index e024478..e3828f5 100644
--- a/admin/src/views/business/shopTree.vue
+++ b/admin/src/views/business/shopTree.vue
@@ -25,7 +25,8 @@
           @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="缁勭粐鍚嶇О" min-width="300px"></el-table-column>
+        <el-table-column prop="name" label="缁勭粐鍚嶇О" fixed min-width="300px"></el-table-column>
+        <el-table-column prop="code" label="缁勭粐缂栫爜" min-width="120px"></el-table-column>
         <el-table-column prop="type" label="涓�绾х被鍨�" min-width="100px">
           <template scope="{row}">
             <span v-if="row.type == 1">HR</span>
@@ -55,12 +56,12 @@
           <template scope="{row}">
             <span v-if="row.status == 0" style="color: red">鍋滅敤</span>
             <span v-if="row.status == 1" style="color: green">姝e父</span>
-            <span v-if="row.status == 2" style="color: grey">宸插垹闄�</span>
+            <span v-if="row.status == -1" style="color: grey">宸插垹闄�</span>
           </template>
         </el-table-column>
-<!--
+
         <el-table-column prop="namePath" label="缁勭粐璺緞" min-width="200px"></el-table-column>
--->
+
 <!--
         <el-table-column prop="syncDate" label="鏈�鍚庡悓姝ユ椂闂�" min-width="120px"></el-table-column>
 -->
diff --git a/admin/src/views/business/shopUsers.vue b/admin/src/views/business/shopUsers.vue
index 818c8a6..e3af0ef 100644
--- a/admin/src/views/business/shopUsers.vue
+++ b/admin/src/views/business/shopUsers.vue
@@ -9,14 +9,14 @@
         <el-input v-model="searchForm.iamUsername" placeholder="璇疯緭鍏ョ櫥褰曡处鍙�" @keypress.enter.native="search"></el-input>
       </el-form-item>
       <el-form-item label="" prop="shopType">
-        <el-select v-model="searchForm.shopType" @change="search" clearable placeholder="涓�绾х粍缁囩被鍨�">
+        <el-select v-model="searchForm.shopType" @change="search" style="width: 130px" clearable placeholder="涓�绾х粍缁囩被鍨�">
           <el-option label="HR" value="1"></el-option>
           <el-option label="鍔犵洘鍟�" value="2"></el-option>
           <el-option label="铏氭嫙缁勭粐" value="3"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="" prop="shopSecType">
-        <el-select v-model="searchForm.shopSecType" @change="search" clearable placeholder="浜岀骇缁勭粐绫诲瀷">
+        <el-select v-model="searchForm.shopSecType" @change="search" style="width: 130px"  clearable placeholder="浜岀骇缁勭粐绫诲瀷">
           <el-option label="S" value="1"></el-option>
           <el-option label="F" value="2"></el-option>
           <el-option label="搴楅潰" value="3"></el-option>
@@ -25,10 +25,9 @@
         </el-select>
       </el-form-item>
       <el-form-item label="" prop="status">
-        <el-select v-model="searchForm.status" @keypress.enter.native="search" clearable placeholder="鐘舵��">
-          <el-option label="姝e父" value="0"></el-option>
-          <el-option label="绂佺敤" value="1"></el-option>
-          <el-option label="鎷夐粦/鍐荤粨" value="2"></el-option>
+        <el-select v-model="searchForm.status" @keypress.enter.native="search" style="width: 120px"  clearable placeholder="鐘舵��">
+          <el-option label="鍋滅敤" value="0"></el-option>
+          <el-option label="姝e父" value="1"></el-option>
         </el-select>
       </el-form-item>
       <section>
@@ -54,10 +53,11 @@
     <!-- 琛ㄦ牸鍜屽垎椤� -->
     <template v-slot:table-wrap>
       <ul class="toolbar"  style="height: 26px">
-<!--        <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
-        <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('浜哄憳瀵煎叆',searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">浜哄憳瀵煎叆</el-button></li>
-        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鎵归噺鍒犻櫎</el-button></li>
-     -->
+        <li><el-button type="primary" @click="$refs.OperaUserImportWindow.open('鍒濆鍖栧鍏�')"  icon="el-icon-plus" v-permissions="['business:member:create']">鍒濆鍖栧鍏�</el-button></li>
+        <!--        <li><el-button type="primary" @click="$refs.OperaMemberWindow.open('鏂板缓鍛樺伐',null,department,searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">鏂板缓鍛樺伐</el-button></li>
+                <li><el-button type="primary" @click="$refs.OperaMemberImportWindow.open('浜哄憳瀵煎叆',searchForm.companyType)"  icon="el-icon-plus" v-permissions="['business:member:create']">浜哄憳瀵煎叆</el-button></li>
+                <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:member:delete']">鎵归噺鍒犻櫎</el-button></li>
+             -->
         <li style="float: right;">
          <el-checkbox style="font-size: 12px"  label="1" v-model="searchForm.includeChild" key="1"  @change="search" >鏄惁鍖呭惈涓嬬骇缁勭粐</el-checkbox>
         </li>
@@ -69,23 +69,23 @@
           @selection-change="handleSelectionChange"
       >
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="濮撳悕" min-width="100px"></el-table-column>
-        <el-table-column prop="iamUsername" label="鐧诲綍璐﹀彿" min-width="100px"></el-table-column>
-        <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
+        <el-table-column prop="name" label="濮撳悕" fixed min-width="100px"></el-table-column>
+        <el-table-column prop="iamUsername" fixed label="鐧诲綍璐﹀彿" min-width="100px"></el-table-column>
+        <el-table-column prop="phone" label="鎵嬫満鍙�" fixed min-width="100px"></el-table-column>
         <el-table-column label="鎬у埆" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.sex == 0">鐢�</span>
             <span v-if="row.sex == 1">濂�</span>
           </template>
         </el-table-column>
-        <el-table-column prop="shopName" label="鎵�灞為儴闂�" min-width="100px"></el-table-column>
+        <el-table-column prop="shopName" label="鎵�灞為儴闂�" min-width="150px"></el-table-column>
         <el-table-column prop="status" label="鐘舵��" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.status == 0" style="color: red">鍋滅敤</span>
             <span v-if="row.status == 1" style="color:green">鍚敤</span>
           </template>
         </el-table-column>
-        <el-table-column prop="shopType" label="缁勭粐绫诲瀷" min-width="80px">
+        <el-table-column prop="shopType" label="缁勭粐绫诲瀷" min-width="110px">
           <template scope="{row}">
             <span v-if="row.shopType == 1">HR</span>
             <span v-if="row.shopType == 2">鍔犵洘鍟�</span>
@@ -130,8 +130,7 @@
       >
       </pagination>
       <!--    鏌ョ湅浜哄憳寮�鍗¤褰�    -->
-      <OperaMemberWindow ref="OperaMemberWindow" @success="handlePageChange" />
-      <OperaMemberImportWindow ref="OperaMemberImportWindow" @success="handlePageChange" />
+      <OperaUserImportWindow ref="OperaUserImportWindow" @success="handlePageChange" />
     </template>
   </TableLayout1>
 </template>
@@ -140,13 +139,12 @@
 import BaseTable from '@/components/base/BaseTable'
 import TableLayout1 from '@/layouts/TableLayout1'
 import Pagination from '@/components/common/Pagination'
-import OperaMemberWindow from '@/components/business/OperaMemberWindow'
-import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
+import OperaUserImportWindow from '@/components/business/OperaUserImportWindow'
 import { fetchListByParent } from '@/api/business/shop'
 export default {
   name: 'internalMember',
   extends: BaseTable,
-  components: { TableLayout1, Pagination,  OperaMemberWindow, OperaMemberImportWindow },
+  components: { TableLayout1, Pagination, OperaUserImportWindow },
   data () {
     return {
       TreeList: [],
diff --git a/server/admin/src/main/java/com/doumee/api/business/PushController.java b/server/admin/src/main/java/com/doumee/api/business/PushController.java
index f7a8013..3190d34 100644
--- a/server/admin/src/main/java/com/doumee/api/business/PushController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/PushController.java
@@ -47,7 +47,7 @@
             success = Constants.ONE;
             r = ApiResponse.failed("鎿嶄綔澶辫触");
         }finally {
-            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo","IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, shopList,success, JSONObject.toJSONString(r));
+            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo",Constants.ONE,"IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, shopList,success, JSONObject.toJSONString(r));
         }
         return r;
     }
@@ -62,7 +62,7 @@
         ApiResponse<String> r = null;
         try {
             zbomIAMService.updateUserInfo(token,uuid,timestamp,upateUserModel);
-            r  = ApiResponse.success("鎿嶄綔鎴愬姛");
+            r  = ApiResponse.successIam("鎿嶄綔鎴愬姛");
         }catch (BusinessException e){
               success = Constants.ONE;
             r = ApiResponse.failed(StringUtils.defaultString(e.getMessage(),"鎿嶄綔澶辫触"));
@@ -71,7 +71,7 @@
             e.getMessage();
             r = ApiResponse.failed("鎿嶄綔澶辫触");
         }finally {
-            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo","IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, upateUserModel,success, JSONObject.toJSONString(r));
+            zbomIAMService.saveInterfaceLog("/push/iam/updateUserInfo",Constants.ONE,"IAM鎺ㄩ�佷汉鍛樿处鍙蜂俊鎭�", token, uuid, timestamp, upateUserModel,success, JSONObject.toJSONString(r));
         }
         return r;
     }
diff --git a/server/admin/src/main/java/com/doumee/api/business/ShopController.java b/server/admin/src/main/java/com/doumee/api/business/ShopController.java
index 1afee8f..082befb 100644
--- a/server/admin/src/main/java/com/doumee/api/business/ShopController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/ShopController.java
@@ -109,10 +109,6 @@
     })
     @RequiresPermissions("business:shop:create")
     public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file ) {
-//        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_SHOP);
-//        if(importing!=null && importing){
-//            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ヤ换鍔℃鍦ㄦ墽琛屼腑锛岃绋嶅悗鍐嶈瘯锛�");
-//        }
         shopService.importBatch(file);
 //        shopService.dealShopNamePath();
         return ApiResponse.success("鎿嶄綔鎴愬姛");
diff --git a/server/admin/src/main/java/com/doumee/api/business/UsersController.java b/server/admin/src/main/java/com/doumee/api/business/UsersController.java
index 07cc87e..35f85cf 100644
--- a/server/admin/src/main/java/com/doumee/api/business/UsersController.java
+++ b/server/admin/src/main/java/com/doumee/api/business/UsersController.java
@@ -8,13 +8,15 @@
 import com.doumee.core.model.PageData;
 import com.doumee.dao.business.model.Users;
 import com.doumee.service.business.UsersService;
-import io.swagger.annotations.Api;
-import io.swagger.annotations.ApiOperation;
-import org.apache.shiro.authz.annotation.RequiresPermissions;    
+import io.swagger.annotations.*;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
 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;
 
@@ -87,4 +89,15 @@
     public ApiResponse findById(@PathVariable Long id) {
         return ApiResponse.success(usersService.findById(id));
     }
+
+    @ApiOperation(value = "浜哄憳淇℃伅鍒濆鍖栧鍏�" ,notes = "浜哄憳淇℃伅鍒濆鍖栧鍏�")
+    @PostMapping("/importExcel")
+    @ApiImplicitParams({
+            @ApiImplicitParam(name = "file", value = "file", required = true, paramType = "query", dataType = "file", dataTypeClass = File.class),
+    })
+    @RequiresPermissions("business:users:create")
+    public ApiResponse<String> importExcel (@ApiParam(value = "file") MultipartFile file ) {
+        usersService.importBatch(file);
+        return ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 }
diff --git a/server/admin/src/main/java/com/doumee/timer/ZbomRedisResetBiz.java b/server/admin/src/main/java/com/doumee/timer/ZbomRedisResetBiz.java
new file mode 100644
index 0000000..770f75f
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/timer/ZbomRedisResetBiz.java
@@ -0,0 +1,38 @@
+package com.doumee.timer;
+
+import com.doumee.biz.zbom.ZbomIAMService;
+import com.doumee.service.business.InitService;
+import org.apache.commons.lang3.StringUtils;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
+
+import java.lang.reflect.Method;
+
+/**
+ * @author 鍒濆鍖栧織閭﹀悇骞冲彴缂撳瓨瀛楀吀鍊�
+ * @since 2023-07-26 11:44
+ */
+@Component("zbomDictDataTask")
+public class ZbomRedisResetBiz implements JobService {
+    private static final Logger log = LoggerFactory.getLogger(ZbomRedisResetBiz.class);
+
+    @Autowired
+    InitService initService;
+    @Override
+    public void run(String params,String module) {
+        Method method = null;
+        try {
+            if(StringUtils.equals(module,"refreshZbomDictDataCache")){
+                initService.refreshZbomDictDataCache();
+            }else  if(StringUtils.equals(module,"orgInit")){
+
+            }else
+                log.info("\n ======== 瀹氭椂浠诲姟宸叉墽琛岋細zbomRedisResut.========"+module);
+        } catch (Exception e) {
+           e.printStackTrace();
+        }
+    }
+
+}
diff --git a/server/admin/src/main/java/com/doumee/timer/init/InitBizService.java b/server/admin/src/main/java/com/doumee/timer/init/InitBizService.java
new file mode 100644
index 0000000..2e352e1
--- /dev/null
+++ b/server/admin/src/main/java/com/doumee/timer/init/InitBizService.java
@@ -0,0 +1,38 @@
+package com.doumee.timer.init;
+
+import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.core.utils.Constants;
+import com.doumee.service.business.InitService;
+import com.doumee.service.business.ShopService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Lazy;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.stereotype.Service;
+
+import javax.annotation.PostConstruct;
+
+/**
+ * 蹇楅偊缁勭粐淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @date 2024/07/04 14:40
+ */
+@Service
+public class InitBizService {
+
+    @Autowired
+    @Lazy
+    private InitService initService;
+
+    @PostConstruct
+    public void clearImporting(){
+        initService.clearImporting();
+    }
+    @PostConstruct
+    public void refreshZbomDictDataCache(){
+        initService.refreshZbomDictDataCache();
+    }
+    @PostConstruct
+    public void cacheShopTree(){
+//        redisTemplate.opsForValue().set(Constants.RedisKeys.SHOP_TREE,shopService.shopTree(null));
+    }
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
index e78f898..5d02b44 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java
@@ -3,6 +3,7 @@
 import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
 import com.doumee.biz.zbom.model.IamUpateShopModel;
 import com.doumee.biz.zbom.model.IamUpateUserModel;
+import com.doumee.dao.business.model.CustomerLog;
 import org.springframework.stereotype.Service;
 
 import java.util.List;
@@ -15,5 +16,7 @@
 @Service
 public interface ZbomCRMService {
 
+    void dealCustomerLogData(CustomerLog customerLog);
+
     int postDataToCrm(CrmCustomerSubmmitModel entity );
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java
index 59c90e8..006b2c6 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java
@@ -30,5 +30,5 @@
     void updateShopInfo(String token, String uuid, String timestamp, List<IamUpateShopModel> shopList);
 
     void updateUserInfo(String token, String uuid, String timestamp, IamUpateUserModel upateUserModel);
-    void  saveInterfaceLog(String url,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone);
+    void  saveInterfaceLog(String url,int type,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone);
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
index 49eabf5..f3ac168 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java
@@ -1,8 +1,12 @@
 package com.doumee.biz.zbom;
 
+import com.doumee.biz.zbom.model.zhongtai.*;
+import com.doumee.biz.zbom.model.zhongtai.response.*;
 import com.doumee.dao.business.MemberMapper;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
+
+import java.util.List;
 
 /**
  * 蹇楅偊涓彴瀵规帴涓氬姟鎺ュ彛
@@ -13,5 +17,20 @@
 public interface ZbomZhongTaiService {
 
 
+    ZTUserGetTokenResponse getUserToken(ZTUserGetTokenRequest param);
+    ZTUserGetTokenResponse userUpdateInfo(ZTUserInfoUpdateRequest param);
+    boolean userLogout(ZTBaseRequst param);
+    List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest param);
+    ZTBasePageResponse<ZTContentListResponse> pageContentList(ZTContentListRequest param);
+   ZTContentInfoResponse getContentInfo(ZTContentInfoRequest param);
+   boolean collectDo(ZTActionDoRequest param);
+   boolean likeDo(ZTActionBatchDoRequest param);
+   boolean shareDo(ZTActionDoRequest param);
+   boolean viewDo(ZTActionDoRequest param);
+    ZTBasePageResponse<ZTContentListResponse> pageCollectList(ZTContentListRequest param);
+    ZTBasePageResponse<ZTContentListResponse> pageLikeList(ZTContentListRequest param);
+    List<ZTAreaInfoResponse> getAreaList(ZTAreaListRequest param);
+
+
 
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
index 917c171..f6d1d27 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java
@@ -6,6 +6,7 @@
 import com.doumee.biz.zbom.model.CrmCustomerInfoModel;
 import com.doumee.biz.zbom.model.CrmCustomerSubmmitModel;
 import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.DateUtil;
 import com.doumee.core.utils.HttpsUtil;
 import com.doumee.dao.business.CrmInterfaceLogMapper;
 import com.doumee.dao.business.CustomerLogMapper;
@@ -36,6 +37,30 @@
     @Autowired
     private RedisTemplate<String, Object> redisTemplate;
 
+
+    @Override
+    @Async
+    public void dealCustomerLogData(CustomerLog customerLog){
+        CrmCustomerSubmmitModel entity = new CrmCustomerSubmmitModel();
+        List<CrmCustomerInfoModel> cusInfo = new ArrayList();
+        CrmCustomerInfoModel crmCustomerInfoModel = new CrmCustomerInfoModel();
+        crmCustomerInfoModel.setId(customerLog.getId());
+        crmCustomerInfoModel.setName(customerLog.getName());
+        crmCustomerInfoModel.setPhone(customerLog.getPhone());
+        crmCustomerInfoModel.setAreaname(customerLog.getAreaName());
+        crmCustomerInfoModel.setAreacode(customerLog.getAreaCode());
+        crmCustomerInfoModel.setOpenid(customerLog.getOpenid());
+        crmCustomerInfoModel.setSource(Constants.CrmSources.SOURCE_ZBJX);
+        crmCustomerInfoModel.setChannel(crmCustomerInfoModel.getSource()+"00");
+        crmCustomerInfoModel.setDate(DateUtil.dateToString(customerLog.getCreateDate(),"yyyy/MM/dd HH:mm"));
+        cusInfo.add(crmCustomerInfoModel);
+        entity.setCusInfo(cusInfo);
+        this.postDataToCrm(entity);
+
+    }
+
+
+
     /**
      * 蹇楅偊瀹㈡埛淇℃伅鎻愪氦鎺ュ彛
      * @param entity
@@ -51,16 +76,16 @@
         String type = "postCusData";
         String appid = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_KEY);
         String urlStr =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_CRM_API_URL) ;
-
         long _t = System.currentTimeMillis();
         String crmInfo="鎻愪氦澶辫触";
         if (StringUtils.isNotBlank(appid)||StringUtils.isNotBlank(urlStr)) {
-            String token = DigestUtils.md5Hex(type + _t + appid);
-            String url = urlStr + "?type=" + type + "&_t=" + _t + "&token=" + token;// 鎻愪氦CRM鍦板潃
             String param = JSONObject.toJSONString(entity);
-            int success =1;
             String result = null;
+            int success =1;
+            String url = urlStr;
             try {
+                String token = DigestUtils.md5Hex(type + _t + appid);
+                  url = urlStr + "?type=" + type + "&_t=" + _t + "&token=" + token;// 鎻愪氦CRM鍦板潃
                   result = HttpsUtil.postJson(url,param);
                 if (StringUtils.isNotBlank(result)) {
                     JSONObject r = JSONObject.parseObject(result.replace("(", "").replace(")", ""));
@@ -99,6 +124,7 @@
                 .set(CustomerLog::getCrmDate,new Date() ));// 鏇存柊鐘舵��
         return status;// 榛樿澶辫触
     }
+
     public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone){
             if(crmInterfaceLogMapper ==null){
                 return;
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java
index 4542b02..5d3fb8c 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java
@@ -313,6 +313,7 @@
         users.setIsdeleted(Constants.ZERO);
         users.setRemark(JSONObject.toJSONString(upateUserModel));
         users.setRoleNames(null);
+        users.setRoleCodes(null);
         users.setRoleIds(null);
         users.setUserTypes(null);
         if( upateUserModel.getUserTypes() !=null){
@@ -331,8 +332,12 @@
                 if(StringUtils.isBlank(users.getRoleNames())){
                     users.setRoleNames("");
                 }
-                users.setRoleIds(users.getRoleIds()+t.getId()+"["+t.getId()+"];");
+                if(StringUtils.isBlank(users.getRoleCodes())){
+                    users.setRoleCodes("");
+                }
+                users.setRoleIds(users.getRoleIds()+"["+t.getId()+"];");
                 users.setRoleNames(users.getRoleNames()+"["+t.getName()+"];");
+                users.setRoleCodes(users.getRoleCodes()+"["+t.getCode()+"];");
             }
         }
         if(upateUserModel.getJobs()!=null){
@@ -350,11 +355,8 @@
                         .last("limit 1"));
                 users.setDepartmentId(shop ==null?null:shop.getId());
             }
-
         }
-
         return  users;
-
     }
 
     public  String getToken(String uuid,String time) {
@@ -366,7 +368,7 @@
     }
     @Override
     @Async
-    public  void  saveInterfaceLog(String url,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone){
+    public  void  saveInterfaceLog(String url,int type,String name, String token, String uuid, String timestamp, Object obj,Integer success,String respone){
             Map<String,Object> map = new HashMap<>();
             map.put("token",token);
             map.put("uuid",uuid);
@@ -380,7 +382,7 @@
             log.setName(name);
             log.setIsdeleted(Constants.ZERO);
             log.setRequest(JSONObject.toJSONString(map));
-            log.setType(Constants.ONE);
+            log.setType(type);
             log.setSuccess(success);
             log.setRepose(respone);
             iamInterfaceLogMapper.insert(log);
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
index dc37011..dbe6b43 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java
@@ -32,7 +32,7 @@
  * @author 姹熻箘韫�
  * @date 2023/11/30 15:33
  */
-@Service
+//@Service
 public class ZbomSMSServiceImpl implements ZbomSMSService  {
 
     @Autowired
@@ -45,7 +45,7 @@
 
     public static void main(String[] args) {
         ZbomSMSServiceImpl obj = new ZbomSMSServiceImpl();
-        obj.sendMessage("鎮ㄧ殑楠岃瘉鐮佹槸765412锛屾楠岃瘉鐮佺敤浜庨噸缃瘑鐮併��3鍒嗛挓鍐呮湁鏁堛��","15345690849");
+        obj.sendMessage("鎮ㄧ殑楠岃瘉鐮佹槸765412锛屾楠岃瘉鐮佺敤浜庨噸缃瘑鐮併��3鍒嗛挓鍐呮湁鏁堛��","18156091665");
     }
     /**
      * 蹇楅偊瀹㈡埛淇℃伅鎻愪氦鎺ュ彛
@@ -57,6 +57,8 @@
         if(StringUtils.isBlank(content)){
             return false;
         }
+//        String appkey ="581ba98d70ae2b85c4ecb9c785";
+//        String urlStr =  "http://wx.zhibang.com/api/QR/Face_UserSms?TenantId=2&smstype=6&" ;
         String appkey = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_SMS_API_KEY);
         String urlStr =  (String)redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_SMS_API_URL) ;
         try {
@@ -90,6 +92,7 @@
             saveInterfaceLog(urlStr,"蹇楅偊鐭俊鍙戦�佹帴鍙�", sb.toString(), 0,inputline);
             return true;//
         }catch (Exception e){
+            e.printStackTrace();
             return false;
         }
 
@@ -102,7 +105,7 @@
             log.setCreateDate(new Date());
             log.setUrl(url);
             log.setEditDate(log.getCreateDate());
-            log.setPlat(Constants.ZERO);
+            log.setPlat(Constants.ONE);
             log.setName(name);
             log.setIsdeleted(Constants.ZERO);
             log.setRequest(param);
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
index 0ea7258..663aa5c 100644
--- a/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java
@@ -1,9 +1,31 @@
 package com.doumee.biz.zbom.impl;
 
+import com.alibaba.fastjson.JSONObject;
+import com.alibaba.fastjson.TypeReference;
 import com.doumee.biz.zbom.ZbomZhongTaiService;
+import com.doumee.biz.zbom.model.zhongtai.*;
+import com.doumee.biz.zbom.model.zhongtai.response.*;
+import com.doumee.core.haikang.model.HKConstants;
+import com.doumee.core.haikang.model.HKTools;
+import com.doumee.core.haikang.model.param.BaseResponse;
+import com.doumee.core.haikang.model.param.request.VisitAppointmentCancelRequest;
+import com.doumee.core.utils.Constants;
+import com.doumee.core.utils.HttpsUtil;
+import com.doumee.dao.business.CrmInterfaceLogMapper;
+import com.doumee.dao.business.InterfaceLogMapper;
 import com.doumee.dao.business.MemberMapper;
+import com.doumee.dao.business.model.CrmInterfaceLog;
+import com.doumee.dao.business.model.InterfaceLog;
+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 java.util.Date;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
 
 /**
  * 浜哄憳淇℃伅琛⊿ervice瀹炵幇
@@ -11,10 +33,306 @@
  * @date 2023/11/30 15:33
  */
 @Service
+@Slf4j
 public class ZbomZhongTaiServiceImpl implements ZbomZhongTaiService {
-
     @Autowired
-    private MemberMapper memberMapper;
+    private InterfaceLogMapper interfaceLogMapper;
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
+
+    /**
+     * 鑾峰彇鐢ㄦ埛鐧婚檰token
+     * @param param
+     * @return
+     */
+   @Override
+   public ZTUserGetTokenResponse getUserToken(ZTUserGetTokenRequest param){
+       ZTBaseResponse<ZTUserGetTokenResponse> result = sendHttpRequest(
+               ZTConstants.IntegerUrl.USER_GET_TOKEN_URL,
+               ZTConstants.IntegerName.USER_GET_TOKEN_NAME,
+               param.getToken(),
+               param.getUserType(),
+               JSONObject.toJSONString(param ));
+       if(result!=null){
+           return result.getData();
+       }
+       return null;
+   }
+    /**
+     * 鐢ㄦ埛淇℃伅鍚屾
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTUserGetTokenResponse userUpdateInfo(ZTUserInfoUpdateRequest param){
+        ZTBaseResponse<ZTUserGetTokenResponse> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.USER_UPDATE_URL,
+                ZTConstants.IntegerName.USER_UPDATE_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return null;
+    }
+    /**
+     * 娉ㄩ攢鐢ㄦ埛
+     * @param param
+     * @return
+     */
+    @Override
+    public boolean userLogout(ZTBaseRequst param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.USER_LOGOUT_URL,
+                ZTConstants.IntegerName.USER_LOGOUT_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+
+    /**
+     * 鑾峰彇鍒嗙被鍜屽垎绫讳笅鐨勬爣绛�
+     * @param param
+     * @return
+     */
+    @Override
+    public  List<ZTCatalogInfoResponse> getCatalogList(ZTCatalogListRequest param){
+        ZTBaseResponse<List<ZTCatalogInfoResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.CATALOG_LIST_URL,
+                ZTConstants.IntegerName.CATALOG_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return null;
+    }
+
+    /**
+     * 鑾峰彇鍐呭鍒楄〃鍒嗛〉
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTBasePageResponse<ZTContentListResponse> pageContentList(ZTContentListRequest param){
+        ZTBaseResponse<ZTBasePageResponse<ZTContentListResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.CONTENT_LIST_URL,
+                ZTConstants.IntegerName.CONTENT_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return null;
+    }
+    /**
+     * 鑾峰彇鍐呭璇︽儏
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTContentInfoResponse getContentInfo(ZTContentInfoRequest param){
+        ZTBaseResponse<ZTContentInfoResponse> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.CONTENT_INFO_URL+ param.getArticleId(),
+                ZTConstants.IntegerName.CONTENT_INFO_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+    }
+    /**
+     * 鍐呭鏀惰棌
+     * @param param
+     * @return
+     */
+    @Override
+    public boolean collectDo(ZTActionDoRequest param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.COLLECT_DO_URL,
+                ZTConstants.IntegerName.COLLECT_DO_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 鍐呭鍠滄
+     * @param param
+     * @return
+     */
+    @Override
+    public  boolean likeDo(ZTActionBatchDoRequest param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.LIKE_DO_URL,
+                ZTConstants.IntegerName.LIKE_DO_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 鍐呭鍒嗕韩
+     * @param param
+     * @return
+     */
+    @Override
+    public boolean shareDo(ZTActionDoRequest param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.SHARE_DO_URL,
+                ZTConstants.IntegerName.SHARE_DO_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 鍐呭娴忚
+     * @param param
+     * @return
+     */
+    @Override
+    public boolean viewDo(ZTActionDoRequest param){
+        ZTBaseResponse result = sendHttpRequest(
+                ZTConstants.IntegerUrl.VIEW_DO_URL,
+                ZTConstants.IntegerName.VIEW_DO_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null ){
+            return true;
+        }
+        return false;
+    }
+    /**
+     * 鑾峰彇鎴戠殑鏀惰棌鍒楄〃鍒嗛〉
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTBasePageResponse<ZTContentListResponse> pageCollectList(ZTContentListRequest param){
+        ZTBaseResponse< ZTBasePageResponse<ZTContentListResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.COLLECT_LIST_URL,
+                ZTConstants.IntegerName.COLLECT_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+    }
+    /**
+     * 鑾峰彇鎴戠殑鍠滄鍒楄〃鍒嗛〉
+     * @param param
+     * @return
+     */
+    @Override
+    public ZTBasePageResponse<ZTContentListResponse> pageLikeList(ZTContentListRequest param){
+
+        ZTBaseResponse< ZTBasePageResponse<ZTContentListResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.LIKE_LIST_URL,
+                ZTConstants.IntegerName.LIKE_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+
+    }
+    /**
+     * 鑾峰彇鑾峰彇鐪佸競鍖洪泦鍚�
+     * @param param
+     * @return
+     */
+    @Override
+    public List<ZTAreaInfoResponse> getAreaList(ZTAreaListRequest param){
+       if(StringUtils.isBlank(param.getPid())){
+           param.setPid(ZTConstants.DEFAULT_PID);//榛樿鍙栧叏閮ㄧ渷浠�
+       }
+        ZTBaseResponse<List<ZTAreaInfoResponse>> result = sendHttpRequest(
+                ZTConstants.IntegerUrl.AREA_LIST_URL,
+                ZTConstants.IntegerName.AREA_LIST_NAME,
+                param.getToken(),
+                param.getUserType(),
+                JSONObject.toJSONString(param ));
+        if(result!=null){
+            return result.getData();
+        }
+        return  null;
+    }
 
 
+    public   <T> ZTBaseResponse<T> sendHttpRequest(String url,String name,String token,String userType,String param){
+        log.info("銆�"+name+"銆�================寮�濮�===="+ JSONObject.toJSONString(param));
+        String res = null;
+        int success = 0;
+        try {
+
+            Map<String,String> headers = new HashMap<>();
+            headers.put(ZTConstants.HEADER_TOKEN,token);
+            headers.put(ZTConstants.HEADER_USERTYPE,userType);
+            String index = (String) redisTemplate.opsForValue().get(Constants.RedisKeys.ZBOM_ZHONGTAI_API_URL);
+            res = HttpsUtil.postJsonWithHeaders(index+url,param,headers);
+            TypeReference typeReference =
+                    new TypeReference<ZTBaseResponse<T>>(){};
+            ZTBaseResponse<T>  result = JSONObject.parseObject(res, typeReference.getType());
+            logResult(result,name);
+            if(StringUtils.equals(result.getCode(),ZTConstants.CODE_SUCCESS)){
+                return  result;
+            }else{
+                success =1;
+            }
+        }catch (Exception e){
+            success = 1;
+            log.error("銆�"+name+"銆�================澶辫触===="+ JSONObject.toJSONString(param));
+        }finally {
+            saveInterfaceLog(url,name,param,success,res);
+        }
+        return  null;
+    }
+    public  void  saveInterfaceLog(String url,String name,String  param,Integer success,String respone){
+        if(interfaceLogMapper ==null){
+            return;
+        }
+        InterfaceLog log = new InterfaceLog();
+        log.setCreateDate(new Date());
+        log.setUrl(url);
+        log.setEditDate(log.getCreateDate());
+        log.setPlat(Constants.ZERO);
+        log.setName(name);
+        log.setIsdeleted(Constants.ZERO);
+        log.setRequest(param);
+        log.setType(Constants.ONE);
+        log.setSuccess(success);
+        log.setRepose(respone);
+        interfaceLogMapper.insert(log);
+    }
+    private static void logResult(ZTBaseResponse res,String name) {
+        if(StringUtils.equals(res.getCode(), ZTConstants.CODE_SUCCESS)){
+            log.info("銆愪腑鍙版帴鍙o細"+name+"銆�================鎴愬姛====\n"+res);
+        }else{
+            log.error("銆愪腑鍙版帴鍙o細"+name+"銆�================澶辫触====锛歕n"+ res);
+        }
+    }
 }
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionBatchDoRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionBatchDoRequest.java
new file mode 100644
index 0000000..98a180c
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionBatchDoRequest.java
@@ -0,0 +1,18 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛鏀惰棌銆佹祻瑙堛�佺偣璧炪�佸垎浜�+1
+ */
+@Data
+public class ZTActionBatchDoRequest extends  ZTBaseRequst {
+    /**
+     * 鏂囩珷ID
+     */
+    private List<ZTActionDoRequest> list;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionDoRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionDoRequest.java
new file mode 100644
index 0000000..3f5cf00
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionDoRequest.java
@@ -0,0 +1,21 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛鏀惰棌銆佹祻瑙堛�佺偣璧炪�佸垎浜�+1
+ */
+@Data
+public class ZTActionDoRequest  extends  ZTBaseRequst {
+    /**
+     * 鏂囩珷ID
+     */
+    private String articleId;
+    /**
+     * OpenID
+     */
+    private String openId;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTAreaListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTAreaListRequest.java
new file mode 100644
index 0000000..ccc0eb5
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTAreaListRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛鏀惰棌銆佹祻瑙堛�佺偣璧炪�佸垎浜�+1
+ */
+@Data
+public class ZTAreaListRequest  extends  ZTBaseRequst{
+    /**
+     * 鐖剁骇缂栫爜
+     */
+    private String pid;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java
new file mode 100644
index 0000000..18a7efb
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java
@@ -0,0 +1,18 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛鏀惰棌銆佹祻瑙堛�佺偣璧炪�佸垎浜�+1
+ */
+@Data
+public class ZTBaseRequst {
+    /**
+     * 鐖剁骇缂栫爜
+     */
+    private String userType;
+    private String token;
+    private String openid;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java
new file mode 100644
index 0000000..37e7fcb
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCatalogListRequest  extends  ZTBaseRequst{
+    /**
+     * 鐩綍鍞竴缂栫爜,缂栫爜涓虹┖锛屽垯杩斿洖鍏ㄩ儴涓�绾х洰褰�
+     */
+    private String catalogCode;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCollectListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCollectListRequest.java
new file mode 100644
index 0000000..8970d96
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCollectListRequest.java
@@ -0,0 +1,25 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCollectListRequest  extends  ZTBaseRequst{
+    /**
+     * 鏀惰棌绫诲瀷锛屼骇鍝侊紝妗堜緥锛屽疄鏅� 蹇呴渶
+     */
+    private String favoriteType;
+    /**
+     * OpenID 蹇呴渶
+     */
+    private String openId;
+    /**
+     * 鎺掑簭鏂瑰紡 鍙��
+     */
+    private String sort;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java
new file mode 100644
index 0000000..6c76b7e
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java
@@ -0,0 +1,41 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+public class ZTConstants {
+
+    public static  String PLATFORM_MP_WX = "mp-weixin";//灏忕▼搴忓钩鍙�
+    public static  String PLATFORM_WEBPAD = "web-pad";//PAD绔�
+    public static  String CODE_SUCCESS = "200";//鎺ュ彛鎴愬姛杩斿洖鐮�
+    public static  String HEADER_USERTYPE = "userType";//userType鍦℉EADER涓殑鍚嶅瓧
+    public static  String HEADER_TOKEN = "token";//token
+    public static  String DEFAULT_PID = "1";//榛樿鐪佸競鍖簆id=1琛ㄧず鍙栧叏涓浗
+    public interface IntegerUrl{
+        String USER_UPDATE_URL ="customer/api/sync";
+        String USER_GET_TOKEN_URL ="/customer/api/login";
+        String USER_LOGOUT_URL ="/customer/api/disable";
+        String CATALOG_LIST_URL ="/content/api/catalog";
+        String CONTENT_LIST_URL ="/content/api/page";
+        String CONTENT_INFO_URL ="/content/api/detail/";
+        String COLLECT_DO_URL ="/content/api/collect";
+        String VIEW_DO_URL ="/content/api/view";
+        String SHARE_DO_URL ="/content/api/share";
+        String LIKE_DO_URL ="/content/api/like";
+        String COLLECT_LIST_URL ="/behavior/getFavorite";
+        String LIKE_LIST_URL ="/behavior/getLike";
+        String AREA_LIST_URL ="/base/admin/bAreaRegion/getChildren";
+    }
+    public interface IntegerName{
+        String USER_UPDATE_NAME ="鐢ㄦ埛淇℃伅鍚屾";
+        String USER_GET_TOKEN_NAME  ="鐢ㄦ埛鐧婚檰";
+        String USER_LOGOUT_NAME  ="娉ㄩ攢鐢ㄦ埛";
+        String CATALOG_LIST_NAME  ="鑾峰彇鍒嗙被鍜屽垎绫讳笅鐨勬爣绛�";
+        String CONTENT_LIST_NAME  ="鑾峰彇鍐呭鍒楄〃鍒嗛〉";
+        String CONTENT_INFO_NAME  ="鑾峰彇鍐呭璇︽儏";
+        String COLLECT_DO_NAME  ="鍐呭鏀惰棌";
+        String VIEW_DO_NAME  ="鍐呭娴忚";
+        String SHARE_DO_NAME  ="鍐呭鍒嗕韩";
+        String LIKE_DO_NAME  ="鍐呭鍠滄";
+        String COLLECT_LIST_NAME  ="鑾峰彇鎴戠殑鏀惰棌鍒楄〃鍒嗛〉";
+        String LIKE_LIST_NAME  ="鑾峰彇鎴戠殑鍠滄鍒楄〃鍒嗛〉";
+        String AREA_LIST_NAME  ="鑾峰彇鐪佸競鍖洪泦鍚�";
+    }
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java
new file mode 100644
index 0000000..85a8669
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTContentInfoRequest  extends  ZTBaseRequst{
+    /**
+     * 涓存椂绁ㄦ嵁
+     */
+    private String articleId;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java
new file mode 100644
index 0000000..c362b62
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java
@@ -0,0 +1,45 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTContentListRequest extends ZTBaseRequst {
+    /**
+     * 鐩綍鍞竴缂栫爜锛岀洰褰曞敮涓�缂栫爜
+     */
+    private String catalogCode;
+    /**
+     * 鏄惁缃《锛岄粯璁alse
+     */
+    private Boolean isTop;
+    /**
+     * 褰撳墠椤�
+     */
+    private String pageNum;
+    /**
+     * 姣忛〉鏉℃暟
+     */
+    private String pageSize;
+    /**
+     * 鎼滅储鍏抽敭瀛楋紝鏍规嵁鏍囬鎼滅储鍏抽敭瀛�
+     */
+    private String search;
+    /**
+     * 鎺掑簭鏂瑰紡锛孨ORMAL - 榛樿
+     * HOT - 鏈�鐑�
+     * LATEST - 鏈�鏂�
+     */
+    private String sortType;
+    /**
+     * 澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛紝澶氫釜鏍囩鍞竴缂栫爜鐨勫垪琛�
+     */
+    private List<String> tagCode;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserGetTokenRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserGetTokenRequest.java
new file mode 100644
index 0000000..b637773
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserGetTokenRequest.java
@@ -0,0 +1,27 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛鑾峰彇涓存椂绁ㄦ嵁
+ */
+@Data
+public class ZTUserGetTokenRequest extends  ZTBaseRequst {
+    /**
+     * 搴旂敤鐮侊紝搴旂敤鐮侊紝鏆傛椂涓嶅仛瑕佹眰锛岀敤浣滅櫥褰曡涓烘棩蹇楄褰�
+     */
+    private String appCode;
+    /**
+     * 搴旂敤ID锛屽簲鐢↖D, 鐢ㄤ綔鐧诲綍琛屼负鏃ュ織璁板綍
+     */
+    private String appId;
+    /**
+     * OpenID锛孫penID鎵嬫満鍙�
+     */
+    private String openId;
+    /**
+     * 瀛愬簲鐢ㄧ爜锛屽瓙搴旂敤鐮侊紝鏆傛椂涓嶅仛瑕佹眰锛岀敤浣滅櫥褰曡涓烘棩蹇楄褰�
+     */
+    private String subAppCode;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java
new file mode 100644
index 0000000..0f195e7
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java
@@ -0,0 +1,127 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+/**
+ * 鏍规嵁OpenID缁戝畾涓彴鐨勭敤鎴峰叧绯诲拰鐢ㄦ埛淇℃伅锛岃繑鍥炰腑鍙扮殑鐢ㄦ埛浠ょ墝
+ */
+@Data
+public class ZTUserInfoUpdateRequest  extends  ZTBaseRequst{
+    /**
+     * 鍦板潃锛岀渷甯傚尯鐨勫畬鏁村瓧绗︿覆锛屾瘮濡�"骞夸笢鐪佸箍宸炲競鐧戒簯鍖�"
+     */
+    private String address;
+    /**
+     * 骞撮緞锛屽~鏁板瓧, "18"
+     */
+    private String age;
+    /**
+     * 搴旂敤鐮侊紝搴旂敤鐮侊紝鏆傛椂涓嶅仛瑕佹眰锛岀敤浣滃悓姝ヤ俊鎭涓烘棩蹇楄褰�
+     */
+    private String appCode;
+    /**
+     * 搴旂敤ID锛屽皬绋嬪簭鐨凙ppID 蹇呴渶
+     */
+    private String appId;
+    /**
+     * 澶村儚锛屽ご鍍忓湴鍧�,
+     * 姣斿"https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=64&d=identicon"
+     */
+    private String avatarUrl;
+    /**
+     * 鐢熸棩锛孹XXX骞碭鏈圶鏃�
+     */
+    private String birthday;
+    /**
+     * 瀹㈡埛娓犻亾鏉ユ簮缂栫爜
+     */
+    private String channelSourceCode;
+    /**
+     * 瀹㈡埛鍗曚綅
+     */
+    private String customerCompany;
+    /**
+     * 瀹㈡埛绾у埆
+     */
+    private String customerLevel;
+    /**
+     * 瀹㈡埛鎵�灞炶涓�
+     */
+    private String customerTrade;
+    /**
+     * 鐢靛瓙閭
+     */
+    private String email;
+    /**
+     * 璇︾粏鍦板潃锛屽尯浠ヤ笅鐨勮缁嗗湴鍧�
+     */
+    private String fullAddress;
+    /**
+     * 鎬у埆锛屾�у埆锛屸�滅敺","濂�"
+     */
+    private String gender;
+    /**
+     * 鎴垮眿闈㈢Н锛屸��120鈥�
+     */
+    private String houseArea;
+    /**
+     * 鎴垮眿鎴峰瀷锛�"3瀹や竴鍘呬竴鍘ㄤ竴鍗�"
+     */
+    private String houseLayout;
+    /**
+     * 韬唤璇�
+     */
+    private String idCard;
+    /**
+     * 濮撳悕
+     */
+    private String name;
+    /**
+     * OpenID锛屽井淇$敤鎴风殑OpenID 蹇呴渶
+     */
+    private String openId;
+    /**
+     * 鎵嬫満
+     */
+    private String phone;
+    /**
+     * 骞冲彴绫诲瀷锛屽皬绋嬪簭浼爉p-weixin锛宲ad绔紶web-pad  蹇呴渶
+     */
+    private String platform;
+    /**
+     * 鑱屼笟
+     */
+    private String position;
+    /**
+     * 鎰忓悜浜у搧缂栫爜锛岀敤閫楀彿闅斿紑
+     */
+    private String productCode;
+    /**
+     * 鎺ㄨ崘浜�
+     */
+    private String referee;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+    /**
+     * 鏉ユ簮绯荤粺瀹㈡埛ID锛屽搴旂殑鏉ユ簮绯荤粺閲岀殑瀹㈡埛ID
+     */
+    private String sourceCustomerId;
+    /**
+     * 瀛愬簲鐢ㄧ爜锛屽瓙搴旂敤鐮侊紝鏆傛椂涓嶅仛瑕佹眰锛岀敤浣滃悓姝ヤ俊鎭涓烘棩蹇楄褰�
+     */
+    private String subAppCode;
+    /**
+     * UnionId锛屽井淇$敤鎴风殑UnionID
+     */
+    private String unionId;
+    /**
+     * 灏忓尯锛屸�淴X灏忓尯鈥�
+     */
+    private String uptown;
+    /**
+     * 寰俊鍙�
+     */
+    private String weixin;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserLogoutRequest.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserLogoutRequest.java
new file mode 100644
index 0000000..652d4ea
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserLogoutRequest.java
@@ -0,0 +1,16 @@
+package com.doumee.biz.zbom.model.zhongtai;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTUserLogoutRequest  extends  ZTBaseRequst{
+    /**
+     * 涓存椂绁ㄦ嵁
+     */
+    private String token;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java
new file mode 100644
index 0000000..52c1541
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java
@@ -0,0 +1,30 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.util.Map;
+
+
+/**
+ * 鐪佸競鍖鸿鎯呰繑鍥�
+ */
+@Data
+public class ZTAreaInfoResponse {
+    /**
+     * id":鈥�11000000000鏃�"
+     * pid":"1"
+     * "shortname":"鍖椾含鈥�
+     * "name":"鍖椾含甯�"
+     * "mergename":"涓浗.鍖椾含甯�"
+     * "level": 2
+     */
+    private String id;
+    private String pid;
+    private String code;
+    private String shortname;
+    private String mergename;
+    private String name;
+    //灞傜骇
+    private String level;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java
new file mode 100644
index 0000000..441512c
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java
@@ -0,0 +1,25 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ZTBasePageResponse<T> {
+    /**
+     *  褰撳墠椤�
+     */
+    private double current;
+    /**
+     * 璁板綍鍒楄〃
+     */
+    private List<T> records;
+    /**
+     * 姣忛〉鏄剧ず鏉℃暟
+     */
+    private double size;
+    /**
+     * 鎬昏褰曟暟
+     */
+    private double total;
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java
new file mode 100644
index 0000000..10a6620
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java
@@ -0,0 +1,24 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+@Data
+public class ZTBaseResponse<T> {
+    /**
+     *鏄惁鎴愬姛,true:鎴愬姛;false:澶辫触
+     */
+    private Boolean success;
+    /**
+     * 娑堟伅鐮�,200:鎴愬姛;鍏朵粬code:澶辫触
+     */
+    private String code;
+    /**
+     * 鎻愮ず娑堟伅
+     */
+    private String msg;
+    /**
+     *  鏁版嵁
+     */
+    private T data;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java
new file mode 100644
index 0000000..0755f2d
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java
@@ -0,0 +1,51 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCatalogInfoResponse {
+    /**
+     * 鐩綍鍞竴缂栫爜
+     */
+    private String code;
+    /**
+     * 鐩綍棰濆淇℃伅
+     */
+    private String expandInfo;
+    /**
+     * 鐩綍ID
+     */
+    private String id;
+    /**
+     * 鐩綍鍚嶇О
+     */
+    private String name;
+    /**
+     * 灏侀潰鍥綰RL
+     */
+    private String picture;
+    /**
+     * 鐖剁骇鐩綍ID
+     */
+    private String pid;
+    /**
+     * 澶囨敞
+     */
+    private String remark;
+    /**
+     * 鐩綍鎺掑簭
+     */
+    private String sort;
+
+    /**
+     * 瀛愮洰褰�
+     */
+    private List<ZTCatalogInfoResponse> childCatalog;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java
new file mode 100644
index 0000000..03c8568
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java
@@ -0,0 +1,19 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.util.List;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCatalogTagTypeResponse {
+    /**
+     * 瀛愮洰褰�
+     */
+    private List<ZTCatalogTagTypeResponse> tags;
+
+}
+
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java
new file mode 100644
index 0000000..f15c7ec
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java
@@ -0,0 +1,25 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+
+/**
+ * 鐢ㄦ埛閫�鍑�
+ */
+@Data
+public class ZTCollectResponse {
+    /**
+     * 鏀惰棌绫诲瀷锛屼骇鍝侊紝妗堜緥锛屽疄鏅� 蹇呴渶
+     */
+    private String favoriteType;
+    /**
+     * OpenID 蹇呴渶
+     */
+    private String openId;
+    /**
+     * 鎺掑簭鏂瑰紡 鍙��
+     */
+    private String sort;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java
new file mode 100644
index 0000000..504177b
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java
@@ -0,0 +1,54 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+import java.util.Map;
+
+
+/**
+ * 鍐呭璇︽儏杩斿洖
+ */
+@Data
+public class ZTContentInfoResponse {
+    /**
+     * 浣滆��
+     */
+    private String author;
+    /**
+     * 鍐呭璇︽儏
+     */
+    private Map<String, Object> content;
+    /**
+     * 鏂囩珷绫诲瀷
+     */
+    private String contentType;
+    /**
+     * 鏂囩珷ID
+     */
+    private String id;
+    /**
+     * 璇█缂栫爜
+     */
+    private String langCode;
+    /**
+     * 澶氬浘鐗囧垪琛�
+     */
+    private String picUrls;
+    /**
+     * 鍙戝竷鏃ユ湡
+     */
+    private String publishDate;
+    /**
+     * 鍙戝竷缁勭粐
+     */
+    private String publishDepartment;
+    /**
+     * 瀛愭爣棰�
+     */
+    private String subtitle;
+    /**
+     * 鏂囩珷鏍囬
+     */
+    private String title;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java
new file mode 100644
index 0000000..e783704
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java
@@ -0,0 +1,72 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+
+/**
+ * 鍐呭鍒嗛〉鍒楄〃杩斿洖鍐呭
+ */
+@Data
+public class ZTContentListResponse {
+    /**
+     * 浣滆��
+     */
+    private String author;
+    /**
+     * 灏侀潰鍥�
+     */
+    private String coverImage;
+    /**
+     * 鏀惰棌閲�
+     */
+    private double favoriteCount;
+    /**
+     * 鏂囩珷ID
+     */
+    private String id;
+    /**
+     * 鏄惁缃《
+     */
+    private String isTop;
+    /**
+     * 璇█缂栫爜
+     */
+    private String langCode;
+    /**
+     * 鐐硅禐閲�
+     */
+    private double likeCount;
+    /**
+     * 鍙戝竷鏃ユ湡
+     */
+    private String publishDate;
+    /**
+     * 鍙戝竷缁勭粐
+     */
+    private String publishDepartment;
+    /**
+     * 闃呰閲�
+     */
+    private double readCount;
+    /**
+     * 鎺掑簭
+     */
+    private String sort;
+    /**
+     * 瀛愭爣棰�
+     */
+    private String subtitle;
+    /**
+     * 鏍囬
+     */
+    private String title;
+    /**
+     * 鏂囩珷绫诲瀷
+     */
+    private String type;
+    /**
+     * 鏂囩珷澶栭摼URL锛岃棰戝拰鍏朵粬璺宠浆閾炬帴绫诲瀷
+     */
+    private String url;
+
+}
diff --git a/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java
new file mode 100644
index 0000000..4eae486
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java
@@ -0,0 +1,13 @@
+package com.doumee.biz.zbom.model.zhongtai.response;
+
+import lombok.Data;
+
+@Data
+public class ZTUserGetTokenResponse {
+    /**
+     *鐢ㄦ埛涓存椂绁ㄦ嵁
+     */
+    private String token;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/core/model/ApiResponse.java b/server/service/src/main/java/com/doumee/core/model/ApiResponse.java
index 051cc84..2e1ad9c 100644
--- a/server/service/src/main/java/com/doumee/core/model/ApiResponse.java
+++ b/server/service/src/main/java/com/doumee/core/model/ApiResponse.java
@@ -45,6 +45,16 @@
     public static <T> ApiResponse<T> success(T data) {
         return ApiResponse.success("璇锋眰鎴愬姛", data);
     }
+    public static <T> ApiResponse<T> successIam(T data) {
+        return ApiResponse.successIam("璇锋眰鎴愬姛", data);
+    }
+
+    /**
+     * 璇锋眰鎴愬姛
+     */
+    public static <T> ApiResponse<T> successIam(String message, T data) {
+        return new ApiResponse<>(0, Boolean.TRUE, message, data, null);
+    }
 
     /**
      * 璇锋眰鎴愬姛
diff --git a/server/service/src/main/java/com/doumee/core/utils/Constants.java b/server/service/src/main/java/com/doumee/core/utils/Constants.java
index 5525149..7a19d73 100644
--- a/server/service/src/main/java/com/doumee/core/utils/Constants.java
+++ b/server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -38,6 +38,9 @@
     public static final String HK_ROOTORG_CODE ="HK_ROOTORG_CODE" ;
     public static final String HK_ROOTORG_NAME ="HK_ROOTORG_NAME" ;
     public static final String REDIS_TOKEN_KEY = "token_";
+    public static final String CUSTOMER = "CUSTOMER";    
+    public static final String BUSINESS = "BUSINESS";
+
 
     //琚嫓璁夸汉淇℃伅鏍¢獙鏂瑰紡锛�0鎵嬫満鍙峰崟鐙牎楠� 1鎵嬫満鍙峰拰濮撳悕缁勫悎鏍¢獙锛�
     public static final String BEVISITED_USER_VALID = "BEVISITED_USER_VALID";
@@ -53,6 +56,7 @@
     public static final String FILE_DIR = "";
     public static final String INITIAL_PASSWORD = "INITIAL_PASSWORD";
     public static final String VALIDATE_VISIT = "VALIDATE_VISIT";
+    public static final String PLATFORM = "mp-weixin";
 
     // 璁垮鏉ヨ閰嶇疆
     public static final String VISIT_CONFIG = "VISIT_CONFIG";
@@ -320,6 +324,7 @@
 
 
     public static final String WX_PLATFORM = "WX_PLATFORM";
+    public static final String ZBOM_ZHONGTAI_API_URL = "ZBOM_ZHONGTAI_API_URL";
     public static final String WX_PLATFORM_ACCESS_TOKEN = "WX_PLATFORM_ACCESS_TOKEN";
     public static final String WX_PLATFORM_APPID = "WX_PLATFORM_APPID";
     public static final String WX_PLATFORM_SECRET = "WX_PLATFORM_SECRET";
@@ -327,6 +332,7 @@
     public static final String ZBOM_CRM_API_URL = "ZBOM_CRM_API_URL";
     public static final String ZBOM_CRM_API_KEY = "ZBOM_CRM_API_KEY";
     public static final String ZBOM_SMS_API_KEY = "ZBOM_SMS_API_KEY";
+    public static final String ZBOM_IAM_API_URL = "ZBOM_IAM_API_URL";
     public static final String ZBOM_SMS_API_URL = "ZBOM_SMS_API_URL";
     public static final String WX_PLATFORM_PREFIX = "WX_PLATFORM_PREFIX";
 
@@ -339,25 +345,41 @@
     public static final String WX_SECRET_PERSONNEL = "WX_SECRET_PERSONNEL";
 
 
+    public interface CrmSources{
+
+
+       String SOURCE_DKXD = "DKXD";// 浠e涓嬪崟(DKXD)
+       String SOURCE_LYSJ = "LYSJ";// 闆跺厓璁捐(LYSJ)
+       String SOURCE_ZBSJSQ = "ZBSJSQ";// 蹇楅偊璁捐鐢宠(ZBSJSQ)
+       String SOURCE_ZBDXFX = "ZBDXFX";// 蹇楅偊鐭俊鍒嗕韩(ZBDXFX)
+       String SOURCE_ZBLLJL = "ZBLLJL";// 蹇楅偊娴忚璁板綍鍒嗕韩(ZBLLJL)
+       String SOURCE_ZBWDSC = "ZBWDSC";// 蹇楅偊鎴戠殑鏀惰棌鍒嗕韩(ZBWDSC)
+       String SOURCE_ZBLYSJ = "ZBLYSJ";// 蹇楅偊闆跺厓璁捐(ZBLYSJ)
+       String SOURCE_ZBLDX = "ZBLDX";// 蹇楅偊鑰佸甫鏂�(ZBLDX)
+       String SOURCE_ZBFGCS = "ZBFGCS";// 蹇楅偊椋庢牸娴嬭瘯(ZBFGCS)
+       String SOURCE_ZBJX = "DSLX22";// 蹇楅偊瀹堕��(ZBJX)
+    }
 
     public interface RedisKeys {
-        public static final String IMPORTING_MEMBER ="IMPORTING_MEMBER";
-        public static final String IMPORTING_SHOP ="IMPORTING_SHOP";
-        public static final String IAM_APPID ="IAM_APPID";
-        public static final String ZBOM_CRM_API_KEY ="ZBOM_CRM_API_KEY";
-        public static final String ZBOM_CRM_API_URL ="ZBOM_CRM_API_URL";
-        public static final String ZBOM_SMS_API_KEY ="ZBOM_SMS_API_KEY";
-        public static final String ZBOM_SMS_API_URL ="ZBOM_SMS_API_URL";
-        public static final String IAM_APPKEY ="IAM_APPKEY";
-        public static final String SHOP_TREE ="SHOP_TREE";
-        public static final String ERP_TOKEN ="ERP_TOKEN";
-        public static final long EXPIRE_TIME = 7200;
+       String IMPORTING_MEMBER ="IMPORTING_MEMBER";
+       String IMPORTING_SHOP ="IMPORTING_SHOP";
+       String IMPORTING_USERS ="IMPORTING_USERS";
+       String IAM_APPID ="IAM_APPID";
+       String ZBOM_CRM_API_KEY ="ZBOM_CRM_API_KEY";
+       String ZBOM_CRM_API_URL ="ZBOM_CRM_API_URL";
+       String ZBOM_SMS_API_KEY ="ZBOM_SMS_API_KEY";
+       String ZBOM_ZHONGTAI_API_URL ="ZBOM_ZHONGTAI_API_URL";
+       String ZBOM_SMS_API_URL ="ZBOM_SMS_API_URL";
+       String IAM_APPKEY ="IAM_APPKEY";
+       String SHOP_TREE ="SHOP_TREE";
+       String ERP_TOKEN ="ERP_TOKEN";
+       long EXPIRE_TIME = 7200;
 
-        public static final String INTERNAL_TOKEN ="INTERNAL_TOKEN";
+       String INTERNAL_TOKEN ="INTERNAL_TOKEN";
 
-        public static final String GOODSORDER_KEY = "ordercode_";
-        public static final String ACTIVITY_SIGN_KEY = "actcode_";
-        public static final String AFTERSALE_KEY = "salecode_";
+       String GOODSORDER_KEY = "ordercode_";
+       String ACTIVITY_SIGN_KEY = "actcode_";
+       String AFTERSALE_KEY = "salecode_";
     }
 
 
@@ -433,6 +455,39 @@
     int otherDeal = 4;//浠栦汉宸插鐞�
 }
 
+
+    /**
+     * 鏍规嵁閰嶇疆澶勭悊鎴垮眿鎴峰瀷淇℃伅
+     * @param layout
+     * @return
+     */
+    public static String getHouseLayout(String layout){
+        if(StringUtils.isBlank(layout)){
+            return null;
+        }
+        String [] arr = layout.split("-");
+        StringBuffer stringBuffer = new StringBuffer();
+        for (int i = 0; i < arr.length; i++) {
+            if(i==0){
+                stringBuffer.append( i + "瀹�");
+            }else if(i==1){
+                stringBuffer.append( i + "鍘�");
+            }else if(i==2){
+                stringBuffer.append( i + "鍘�");
+            }else if(i==3){
+                stringBuffer.append( i + "鍗�");
+            }else if(i==4){
+                stringBuffer.append( i + "闃�");
+            }else {
+                break;
+            }
+
+        }
+        return stringBuffer.toString();
+}
+
+
+
     /**
      * 鑾峰彇杞︾墝绫诲瀷淇℃伅
      *
diff --git a/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java b/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
index c74af73..46015fb 100644
--- a/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
+++ b/server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java
@@ -11,25 +11,33 @@
 import java.security.SecureRandom;
 import java.security.cert.CertificateException;
 import java.security.cert.X509Certificate;
+import java.util.Map;
 
 public class HttpsUtil {
 
     public static String get(String url,boolean ignoreSSL) {
-        return connection(url, "GET", null, null,ignoreSSL);
+        return connection(url, "GET", null, null,ignoreSSL,null);
     }
 
     public static String post(String url, String data, String contentType, boolean ignoreSSL) {
-        return connection(url, "POST", data, contentType, ignoreSSL);
+        return connection(url, "POST", data, contentType, ignoreSSL,null);
     }
     public static String postJson(String url, String data) {
         if(url.startsWith("https://")){
-            return connection(url, "POST", data, "application/json", true);
+            return connection(url, "POST", data, "application/json", true,null);
         }else{
-            return connectionHttp(url, "POST", data, "application/json");
+            return connectionHttp(url, "POST", data, "application/json",null);
+        }
+    }
+    public static String postJsonWithHeaders(String url, String data, Map<String,String> headers) {
+        if(url.startsWith("https://")){
+            return connection(url, "POST", data, "application/json", true,headers);
+        }else{
+            return connectionHttp(url, "POST",  data, "application/json",headers);
         }
     }
 
-    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL){
+    public static String connection(String url,String method,String data,String contentType,boolean ignoreSSL, Map<String,String> headers){
         HttpsURLConnection connection = null;
         try {
             URL _url = new URL(url);
@@ -41,7 +49,11 @@
             if(contentType != null){
                 connection.setRequestProperty("Content-Type", contentType);
             }
-
+            if (headers!=null && headers.size()>0) {
+                for (String s : headers.keySet()) {
+                    connection.setRequestProperty(s, headers.get(s));
+                }
+            }
             if(ignoreSSL){
                 //淇′换鎵�鏈塻sl璇佷功鍜屼富鏈�
                 TrustManager[] trustManagers = {new HttpsTrustManager()};
@@ -56,7 +68,6 @@
                 });
             }
 
-
             connection.connect();
 
             if(data != null){
@@ -64,7 +75,6 @@
                 outputStream.write(data.getBytes("utf-8"));
                 outputStream.close();
             }
-
             int responseCode = connection.getResponseCode();
             if (responseCode == HttpsURLConnection.HTTP_OK) {
                 InputStream is = connection.getInputStream();
@@ -87,7 +97,7 @@
         }
         return null;
     }
-    public static String connectionHttp(String url,String method,String data,String contentType ){
+    public static String connectionHttp(String url,String method,String data,String contentType, Map<String,String> headers){
         HttpURLConnection connection = null;
         try {
             URL _url = new URL(url);
@@ -99,7 +109,11 @@
             if(contentType != null){
                 connection.setRequestProperty("Content-Type", contentType);
             }
-
+            if (headers!=null && headers.size()>0) {
+                for (String s : headers.keySet()) {
+                    connection.setRequestProperty(s, headers.get(s));
+                }
+            }
             connection.connect();
 
             if(data != null){
diff --git a/server/service/src/main/java/com/doumee/dao/admin/request/UserImport.java b/server/service/src/main/java/com/doumee/dao/admin/request/UserImport.java
new file mode 100644
index 0000000..faa7060
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/admin/request/UserImport.java
@@ -0,0 +1,41 @@
+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 UserImport {
+    @ExcelColumn(name="缂栫爜",value = "orgId",index = 1)
+    private String userId;
+    @ExcelColumn(name="鍚嶇О",value = "name",index = 2)
+    private String name;
+    @ExcelColumn(name="鐧诲綍璐﹀彿",value = "accountNo",index = 3)
+    private String accountNo;
+    @ExcelColumn(name="鎬у埆 0鐢� 1濂�",value = "sex",index = 4)
+    private String sex;
+    @ExcelColumn(name="鐘舵��  0鍋滅敤锛�1鍚敤",value = "status",index =5)
+    private String status;
+    @ExcelColumn(name="閭",value = "email",index = 6)
+    private String email;
+    @ExcelColumn(name="鎵嬫満鍙�",value = "phone",index = 7)
+    private String phone;
+    @ExcelColumn(name="宸ュ彿",value = "code",index = 8)
+    private String code;
+    @ExcelColumn(name="閮ㄩ棬缂栫爜闆嗗悎,澶氫釜鑻辨枃閫楀彿闅斿紑",value = "orgIds",index = 9)
+    private String orgIds;
+    @ExcelColumn(name="鐢ㄦ埛绫诲瀷缂栫爜闆嗗悎,澶氫釜鑻辨枃閫楀彿闅斿紑",value = "typeCodes",index = 10)
+    private String typeCodes;
+    @ExcelColumn(name="瑙掕壊鍚嶇О闆嗗悎,澶氫釜鑻辨枃閫楀彿闅斿紑",value = "roleNames",index = 11)
+    private String roleNames;
+    @ExcelColumn(name="瑙掕壊code闆嗗悎,澶氫釜鑻辨枃閫楀彿闅斿紑",value = "roleCodes",index = 12)
+    private String roleCodes;
+    @ExcelColumn(name="瑙掕壊缂栫爜闆嗗悎,澶氫釜鑻辨枃閫楀彿闅斿紑",value = "roleIds",index = 13)
+    private String roleIds;
+}
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Customer.java b/server/service/src/main/java/com/doumee/dao/business/model/Customer.java
index 2fbe6c7..17fb7e8 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Customer.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Customer.java
@@ -94,6 +94,9 @@
     @ExcelColumn(name="鍖哄煙")
     private String areaName;
 
+    @ApiModelProperty(value = "鍖哄煙缂栫爜")
+    @ExcelColumn(name="鍖哄煙缂栫爜")
+    private String areaCode;
     @ApiModelProperty(value = "绯荤粺鐗堟湰")
     @ExcelColumn(name="绯荤粺鐗堟湰")
     private String sysVersion;
@@ -118,8 +121,5 @@
     @ExcelColumn(name="鐪佷唤缂栫爜")
     private String provinceCode;
 
-    @ApiModelProperty(value = "鍖哄煙缂栫爜")
-    @ExcelColumn(name="鍖哄煙缂栫爜")
-    private String areaCode;
 
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.java b/server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.java
index d56661d..5462d9d 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.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.dao.business.dto.BaseQueryDto;
 import io.swagger.annotations.ApiModel;
@@ -138,4 +139,20 @@
     @ExcelColumn(name="crm鎻愪氦澶囨敞")
     private String crmInfo;
 
+    @ApiModelProperty(value = "鍖哄煙")
+    @ExcelColumn(name="鍖哄煙")
+    private String areaName;
+
+    @ApiModelProperty(value = "鍖哄煙缂栫爜")
+    @ExcelColumn(name="鍖哄煙缂栫爜")
+    private String areaCode;
+
+    @ApiModelProperty(value = "濮撳悕")
+    @ExcelColumn(name="濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "openid")
+    @TableField(exist = false)
+    private String openid;
+
 }
diff --git a/server/service/src/main/java/com/doumee/dao/business/model/Users.java b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
index 0fd7ea5..54c9563 100644
--- a/server/service/src/main/java/com/doumee/dao/business/model/Users.java
+++ b/server/service/src/main/java/com/doumee/dao/business/model/Users.java
@@ -158,9 +158,12 @@
     @ExcelColumn(name="鐢ㄦ埛瑙掕壊缂栫爜闆嗗悎锛屽涓敤鑻辫閫楀彿闅斿紑")
     private String roleIds;
 
-    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊鍚嶇О闆嗗悎锛屽涓敤鑻辫閫楀彿闅斿紑")
-    @ExcelColumn(name="鐢ㄦ埛瑙掕壊鍚嶇О闆嗗悎锛屽涓敤鑻辫閫楀彿闅斿紑")
+    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊鍚嶇О闆嗗悎")
+    @ExcelColumn(name="鐢ㄦ埛瑙掕壊鍚嶇О闆嗗悎")
     private String roleNames;
+    @ApiModelProperty(value = "鐢ㄦ埛瑙掕壊code闆嗗悎锛屽涓敤鑻辫閫楀彿闅斿紑")
+    @ExcelColumn(name="鐢ㄦ埛瑙掕壊code闆嗗悎锛屽涓敤鑻辫閫楀彿闅斿紑")
+    private String roleCodes;
     @ApiModelProperty(value = "鏄惁鍖呭惈涓嬬骇")
     @TableField(exist = false)
     private Boolean includeChild;
diff --git a/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java b/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
index 4750289..bf7daa2 100644
--- a/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
+++ b/server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java
@@ -82,4 +82,11 @@
     @ApiModelProperty(value = "涓嬬骇閮ㄩ棬闆嗗悎", example = "1")
     @TableField(exist = false)
     private List<ShopTreeVo> childList;
+
+    @ApiModelProperty(value = "閮ㄩ棬缂栫爜绾у埆璺緞", example = "1")
+    private String idPath;
+    @ApiModelProperty(value = "閮ㄩ棬绾у埆璺緞", example = "1")
+    private String namePath;
+    @ApiModelProperty(value = "閮ㄩ棬绾у埆璺緞", example = "1")
+    private Long parentId;
 }
diff --git a/server/service/src/main/java/com/doumee/dao/web/reqeust/FreeCustomizationDTO.java b/server/service/src/main/java/com/doumee/dao/web/reqeust/FreeCustomizationDTO.java
new file mode 100644
index 0000000..b337e14
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/web/reqeust/FreeCustomizationDTO.java
@@ -0,0 +1,48 @@
+package com.doumee.dao.web.reqeust;
+
+import com.doumee.core.annotation.excel.ExcelColumn;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/11 17:19
+ */
+@Data
+@ApiModel("0鍏冨畾鍒舵姤鍚嶈姹傜被")
+public class FreeCustomizationDTO {
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭", hidden = true)
+    private long memberId;
+
+    @ApiModelProperty(value = "鐢ㄦ埛濮撳悕")
+    private String name;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+
+    @ApiModelProperty(value = "鐪佷唤")
+    private String provinceName;
+
+    @ApiModelProperty(value = "鍩庡競")
+    private String cityName;
+
+    @ApiModelProperty(value = "鍖哄煙")
+    private String areaName;
+
+    @ApiModelProperty(value = "鍩庡競缂栫爜")
+    private String cityCode;
+
+    @ApiModelProperty(value = "鐪佷唤缂栫爜")
+    private String provinceCode;
+
+    @ApiModelProperty(value = "鍖哄煙缂栫爜")
+    private String areaCode;
+
+}
diff --git a/server/service/src/main/java/com/doumee/dao/web/reqeust/RenovationCalculatorDTO.java b/server/service/src/main/java/com/doumee/dao/web/reqeust/RenovationCalculatorDTO.java
new file mode 100644
index 0000000..764442a
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/web/reqeust/RenovationCalculatorDTO.java
@@ -0,0 +1,34 @@
+package com.doumee.dao.web.reqeust;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.math.BigDecimal;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/11 17:19
+ */
+@Data
+@ApiModel("瑁呬慨璁$畻璇锋眰绫�")
+public class RenovationCalculatorDTO {
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭", hidden = true)
+    private long memberId;
+
+    @ApiModelProperty(value = "鎴垮眿绫诲瀷锛�0绮捐 1姣涘澂")
+    private String houseStatus;
+
+    @ApiModelProperty(value = "鎴峰瀷淇℃伅锛�0涓�瀹や竴鍘� 1涓ゅ涓�鍘� 2涓ゅ涓ゅ巺 3涓夊涓ゅ巺 4鍥涘涓ゅ巺 5浜斿涓ゅ巺鍙婁互涓�")
+    private String houseType;
+
+    @ApiModelProperty(value = "鎴垮眿闈㈢Н")
+    private String area;
+
+    @ApiModelProperty(value = "瑁呬慨棰勭畻锛堜竾鍏冿級")
+    private BigDecimal budget;
+
+}
diff --git a/server/service/src/main/java/com/doumee/dao/web/reqeust/TestTrimStyleDTO.java b/server/service/src/main/java/com/doumee/dao/web/reqeust/TestTrimStyleDTO.java
new file mode 100644
index 0000000..1a428c9
--- /dev/null
+++ b/server/service/src/main/java/com/doumee/dao/web/reqeust/TestTrimStyleDTO.java
@@ -0,0 +1,48 @@
+package com.doumee.dao.web.reqeust;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+/**
+ * Created by IntelliJ IDEA.
+ *
+ * @Author : Rk
+ * @create 2024/7/11 17:19
+ */
+@Data
+@ApiModel("娴嬭瘯瑁呬慨椋庢牸璇锋眰绫�")
+public class TestTrimStyleDTO {
+
+    @ApiModelProperty(value = "鐢ㄦ埛涓婚敭", hidden = true)
+    private long memberId;
+
+    @ApiModelProperty(value = "鎴垮瓙鎴峰瀷锛�0涓�灞� 1涓ゅ眳 2涓夊眳 3鍥涘眳鍙婁互涓�")
+    private String houseType;
+
+    @ApiModelProperty(value = "鎵嬫満鍙�")
+    private String phone;
+
+    @ApiModelProperty(value = "鎬у埆 0鐢� 1濂�")
+    private Integer sex;
+
+    @ApiModelProperty(value = "骞撮緞娈� 0-70鍚� 1-80鍚� 2-90鍚� 3-00鍚�")
+    private String ageInfo;
+
+    @ApiModelProperty(value = "椋庢牸锛堥鏍兼祴璇曠敤锛� 0-5")
+    private String styleInfo;
+
+    @ApiModelProperty(value = "鐪佷唤")
+    private String provinceName;
+
+    @ApiModelProperty(value = "鍩庡競")
+    private String cityName;
+
+    @ApiModelProperty(value = "鍩庡競缂栫爜")
+    private String cityCode;
+
+    @ApiModelProperty(value = "鐪佷唤缂栫爜")
+    private String provinceCode;
+
+
+}
diff --git a/server/service/src/main/java/com/doumee/service/business/CustomerService.java b/server/service/src/main/java/com/doumee/service/business/CustomerService.java
index 4f07e5a..4fbe5c1 100644
--- a/server/service/src/main/java/com/doumee/service/business/CustomerService.java
+++ b/server/service/src/main/java/com/doumee/service/business/CustomerService.java
@@ -3,6 +3,11 @@
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Customer;
+import com.doumee.dao.business.model.CustomerLog;
+import com.doumee.dao.web.reqeust.FreeCustomizationDTO;
+import com.doumee.dao.web.reqeust.RenovationCalculatorDTO;
+import com.doumee.dao.web.reqeust.TestTrimStyleDTO;
+
 import java.util.List;
 
 /**
@@ -94,4 +99,22 @@
      * @return long
      */
     long count(Customer customer);
+
+    /**
+     * 鎴垮眿瑁呬慨璁$畻鍣ㄤ俊鎭瓨鍌�
+     * @param renovationCalculatorDTO
+     */
+    CustomerLog saveRenovationCalculator(RenovationCalculatorDTO renovationCalculatorDTO);
+
+    /**
+     * 0鍏冨畾鍒朵俊鎭�
+     * @param freeCustomizationDTO
+     */
+    CustomerLog saveFreeCustomizationApply(FreeCustomizationDTO freeCustomizationDTO);
+
+    /**
+     * 娴嬭瘯瑁呬慨椋庢牸
+     * @param testTrimStyleDTO
+     */
+    CustomerLog saveTestTrimStyle(TestTrimStyleDTO testTrimStyleDTO);
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/InitService.java b/server/service/src/main/java/com/doumee/service/business/InitService.java
index b8660df..d05de5d 100644
--- a/server/service/src/main/java/com/doumee/service/business/InitService.java
+++ b/server/service/src/main/java/com/doumee/service/business/InitService.java
@@ -28,22 +28,23 @@
     @Lazy
     private SystemDictDataBiz  systemDictDataBiz;
 
-    @PostConstruct
     public void clearImporting(){
         redisTemplate.delete(Constants.RedisKeys.IMPORTING_SHOP);
+        redisTemplate.delete(Constants.RedisKeys.IMPORTING_USERS);
     }
-    @PostConstruct
-    public void initIamAppIdAndAppKey(){
+    public void refreshZbomDictDataCache(){
         redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPKEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPKEY).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.IAM_APPID,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_IAM_APPID).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_CRM_API_KEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_KEY).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_CRM_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_CRM_API_URL).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_SMS_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_SMS_API_URL).getCode());
         redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_SMS_API_KEY,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_SMS_API_KEY).getCode());
+        redisTemplate.opsForValue().set(Constants.RedisKeys.ZBOM_ZHONGTAI_API_URL,systemDictDataBiz.queryByCode(Constants.ZBOM,Constants.ZBOM_ZHONGTAI_API_URL).getCode());
     }
     @PostConstruct
     public void cacheShopTree(){
 //        redisTemplate.opsForValue().set(Constants.RedisKeys.SHOP_TREE,shopService.shopTree(null));
     }
 
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/MemberService.java b/server/service/src/main/java/com/doumee/service/business/MemberService.java
index 05ba621..b97fe57 100644
--- a/server/service/src/main/java/com/doumee/service/business/MemberService.java
+++ b/server/service/src/main/java/com/doumee/service/business/MemberService.java
@@ -123,4 +123,9 @@
     Member getMemberInfo(Long memberId);
 
 
+    /**
+     * 鐢ㄦ埛娉ㄩ攢
+     * @param memberId
+     */
+    void logOff(Long memberId);
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/UsersService.java b/server/service/src/main/java/com/doumee/service/business/UsersService.java
index 894d3f4..e31e89b 100644
--- a/server/service/src/main/java/com/doumee/service/business/UsersService.java
+++ b/server/service/src/main/java/com/doumee/service/business/UsersService.java
@@ -4,6 +4,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.dao.business.model.Users;
 import com.doumee.dao.web.response.AccountResponse;
+import org.springframework.web.multipart.MultipartFile;
 
 import java.util.List;
 
@@ -102,4 +103,6 @@
     AccountResponse wxLogin(String code);
 
     void bindingOpenid(String code,Long userId);
+
+    String importBatch(MultipartFile file);
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java
index 1bad34f..41dacb0 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java
@@ -6,6 +6,7 @@
 import com.doumee.dao.business.CustomerLogMapper;
 import com.doumee.dao.business.model.CustomerLog;
 import com.doumee.dao.business.model.IamInterfaceLog;
+import com.doumee.dao.business.model.InterfaceLog;
 import com.doumee.service.business.CustomerLogService;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
@@ -186,13 +187,7 @@
         if (pageWrap.getModel().getQueryEndDate() != null) {
             queryWrapper.lambda().le(CustomerLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getQueryEndDate()));
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.lambda().orderByDesc(CustomerLog::getCreateDate);
         return PageData.from(customerLogMapper.selectPage(page, queryWrapper));
     }
 
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java
index fd74554..1416905 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java
@@ -1,20 +1,38 @@
 package com.doumee.service.business.impl;
 
+import com.alibaba.druid.sql.visitor.functions.Concat;
+import com.doumee.core.constants.ResponseStatus;
+import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.business.CustomerLogMapper;
 import com.doumee.dao.business.CustomerMapper;
+import com.doumee.dao.business.MemberMapper;
 import com.doumee.dao.business.model.Customer;
+import com.doumee.dao.business.model.CustomerLog;
+import com.doumee.dao.business.model.Member;
+import com.doumee.dao.web.reqeust.FreeCustomizationDTO;
+import com.doumee.dao.web.reqeust.RenovationCalculatorDTO;
+import com.doumee.dao.web.reqeust.TestTrimStyleDTO;
+import com.doumee.service.business.CustomerLogService;
 import com.doumee.service.business.CustomerService;
 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 org.checkerframework.checker.units.qual.A;
+import org.checkerframework.checker.units.qual.C;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 import org.springframework.util.CollectionUtils;
+import org.springframework.util.StringUtils;
 
+import java.math.BigDecimal;
+import java.util.Date;
 import java.util.List;
+import java.util.Objects;
 
 /**
  * 瀹㈡埛淇℃伅琛⊿ervice瀹炵幇
@@ -26,6 +44,13 @@
 
     @Autowired
     private CustomerMapper customerMapper;
+
+    @Autowired
+    private CustomerLogMapper customerLogMapper;
+
+    @Autowired
+    private MemberMapper memberMapper;
+
 
     @Override
     public Long create(Customer customer) {
@@ -182,16 +207,192 @@
         return customerMapper.selectCount(wrapper);
     }
 
+    @Override
+    public CustomerLog saveRenovationCalculator(RenovationCalculatorDTO renovationCalculatorDTO){
+        if(Objects.isNull(renovationCalculatorDTO)
+            || Objects.isNull(renovationCalculatorDTO.getMemberId())
+            || Objects.isNull(renovationCalculatorDTO.getHouseStatus())
+            || Objects.isNull(renovationCalculatorDTO.getHouseType())
+            || Objects.isNull(renovationCalculatorDTO.getBudget())
+            || StringUtils.isEmpty(renovationCalculatorDTO.getArea())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Member member = memberMapper.selectById(renovationCalculatorDTO.getMemberId());
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐢ㄦ埛淇℃伅");
+        }
+        if(StringUtils.isEmpty(member.getPhone())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈巿鏉冩墜鏈哄彿");
+        }
+        Customer customer = customerMapper.selectOne(new QueryWrapper<Customer>().lambda().eq(Customer::getPhone,member.getPhone()).eq(Customer::getIsdeleted, Constants.ZERO).last("limit 1"));
+        if(Objects.isNull(customer)){
+            customer = new Customer();
+            customer.setIsdeleted(Constants.ZERO);
+            customer.setPhone(member.getPhone());
+            customer.setCreateDate(new Date());
+        } else{
+            customer.setEditDate(new Date());
+        }
+        customer.setOpenid(member.getOpenid());
+        customer.setMemberId(member.getId());
 
+        customerMapper.insertOrUpdate(customer);
 
-
-    public void saveRenovationCalculator(){
-
-
-
+        //瀛樺偍 customerLog 鏁版嵁
+        CustomerLog customerLog = new CustomerLog();
+        customerLog.setCreateDate(new Date());
+        customerLog.setIsdeleted(Constants.ZERO);
+        customerLog.setType(Constants.TWO);
+        customerLog.setCrmStatus(Constants.ZERO);
+        customerLog.setPhone(customer.getPhone());
+        customerLog.setBudget(renovationCalculatorDTO.getBudget().multiply(new BigDecimal(10000)).toString());
+        customerLog.setHouseStatus(renovationCalculatorDTO.getHouseStatus());
+        customerLog.setArea(renovationCalculatorDTO.getArea());
+        customerLog.setHouseType(renovationCalculatorDTO.getHouseType());
+        customerLog.setCostomerId(customer.getId().toString());
+        customerLogMapper.insert(customerLog);
+        customerLog.setOpenid(member.getOpenid());
+        return  customerLog;
     }
 
 
+    @Override
+    public CustomerLog saveFreeCustomizationApply(FreeCustomizationDTO freeCustomizationDTO){
+        if(Objects.isNull(freeCustomizationDTO)
+                || Objects.isNull(freeCustomizationDTO.getMemberId())
+                || StringUtils.isEmpty(freeCustomizationDTO.getName())
+                || StringUtils.isEmpty(freeCustomizationDTO.getPhone())
+                || StringUtils.isEmpty(freeCustomizationDTO.getCityCode())
+                || StringUtils.isEmpty(freeCustomizationDTO.getCityName())
+                || StringUtils.isEmpty(freeCustomizationDTO.getProvinceName())
+                || StringUtils.isEmpty(freeCustomizationDTO.getProvinceCode())
+                || StringUtils.isEmpty(freeCustomizationDTO.getAreaCode())
+                || StringUtils.isEmpty(freeCustomizationDTO.getAreaName())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Member member = memberMapper.selectById(freeCustomizationDTO.getMemberId());
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐢ㄦ埛淇℃伅");
+        }
+        if(StringUtils.isEmpty(member.getPhone())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈巿鏉冩墜鏈哄彿");
+        }
+        Customer customer = customerMapper.selectOne(new QueryWrapper<Customer>().lambda()
+                .eq(Customer::getPhone,freeCustomizationDTO.getPhone()).eq(Customer::getIsdeleted, Constants.ZERO).last("limit 1"));
+        if(Objects.isNull(customer)){
+            customer = new Customer();
+            customer.setPhone(freeCustomizationDTO.getPhone());
+            customer.setCreateDate(new Date());
+            customer.setIsdeleted(Constants.ZERO);
+        } else{
+            customer.setEditDate(new Date());
+        }
+        customer.setOpenid(member.getOpenid());
+        customer.setMemberId(member.getId());
+        customer.setName(freeCustomizationDTO.getName());
+
+        customer.setProName(freeCustomizationDTO.getProvinceName());
+        customer.setCityName(freeCustomizationDTO.getCityName());
+        customer.setAreaName(freeCustomizationDTO.getAreaName());
+        customer.setProvinceCode(freeCustomizationDTO.getProvinceCode());
+        customer.setCityCode(freeCustomizationDTO.getCityCode());
+        customer.setAreaCode(freeCustomizationDTO.getAreaCode());
+        customerMapper.insertOrUpdate(customer);
+
+        //瀛樺偍 customerLog 鏁版嵁
+        CustomerLog customerLog = new CustomerLog();
+        customerLog.setCreateDate(new Date());
+        customerLog.setIsdeleted(Constants.ZERO);
+        customerLog.setType(Constants.ONE);
+        customerLog.setCrmStatus(Constants.ZERO);
+        customerLog.setPhone(customer.getPhone());
+        customerLog.setCostomerId(customer.getId().toString());
+
+        customerLog.setProvinceName(freeCustomizationDTO.getProvinceName());
+        customerLog.setCityName(freeCustomizationDTO.getCityName());
+        customerLog.setAreaCode(freeCustomizationDTO.getAreaName());
+        customerLog.setProvicneCode(freeCustomizationDTO.getProvinceCode());
+        customerLog.setCityCode(freeCustomizationDTO.getCityCode());
+        customerLog.setAreaCode(freeCustomizationDTO.getAreaCode());
+        customerLog.setName(freeCustomizationDTO.getName());
+        customerLog.setPhone(freeCustomizationDTO.getPhone());
+        customerLogMapper.insert(customerLog);
+        customerLog.setOpenid(member.getOpenid());
+        return  customerLog;
+    }
+
+    @Override
+    public CustomerLog saveTestTrimStyle(TestTrimStyleDTO testTrimStyleDTO){
+        if(Objects.isNull(testTrimStyleDTO)
+                || Objects.isNull(testTrimStyleDTO.getMemberId())
+
+                || StringUtils.isEmpty(testTrimStyleDTO.getStyleInfo())
+                || StringUtils.isEmpty(testTrimStyleDTO.getAgeInfo())
+                || Objects.isNull(testTrimStyleDTO.getSex())
+                || StringUtils.isEmpty(testTrimStyleDTO.getHouseType())
+                || StringUtils.isEmpty(testTrimStyleDTO.getAgeInfo())
+                || StringUtils.isEmpty(testTrimStyleDTO.getPhone())
+
+                || StringUtils.isEmpty(testTrimStyleDTO.getCityCode())
+                || StringUtils.isEmpty(testTrimStyleDTO.getCityName())
+                || StringUtils.isEmpty(testTrimStyleDTO.getProvinceName())
+                || StringUtils.isEmpty(testTrimStyleDTO.getProvinceCode())
+        ){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST);
+        }
+        Member member = memberMapper.selectById(testTrimStyleDTO.getMemberId());
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈煡璇㈠埌鐢ㄦ埛淇℃伅");
+        }
+        if(StringUtils.isEmpty(member.getPhone())){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"鏈巿鏉冩墜鏈哄彿");
+        }
+        Customer customer = customerMapper.selectOne(new QueryWrapper<Customer>().lambda()
+                .eq(Customer::getPhone,testTrimStyleDTO.getPhone()).eq(Customer::getIsdeleted, Constants.ZERO).last("limit 1"));
+        if(Objects.isNull(customer)){
+            customer = new Customer();
+            customer.setPhone(testTrimStyleDTO.getPhone());
+            customer.setCreateDate(new Date());
+            customer.setIsdeleted(Constants.ZERO);
+        } else{
+            customer.setEditDate(new Date());
+        }
+        customer.setOpenid(member.getOpenid());
+        customer.setMemberId(member.getId());
+
+        customer.setProName(testTrimStyleDTO.getProvinceName());
+        customer.setCityName(testTrimStyleDTO.getCityName());
+        customer.setProvinceCode(testTrimStyleDTO.getProvinceCode());
+        customer.setCityCode(testTrimStyleDTO.getCityCode());
+        customerMapper.insertOrUpdate(customer);
+
+        //瀛樺偍 customerLog 鏁版嵁
+        CustomerLog customerLog = new CustomerLog();
+        customerLog.setCreateDate(new Date());
+        customerLog.setIsdeleted(Constants.ZERO);
+        customerLog.setType(Constants.ZERO);
+        customerLog.setCrmStatus(Constants.ZERO);
+        customerLog.setPhone(customer.getPhone());
+        customerLog.setCostomerId(customer.getId().toString());
+
+        customerLog.setProvinceName(testTrimStyleDTO.getProvinceName());
+        customerLog.setCityName(testTrimStyleDTO.getCityName());
+        customerLog.setProvicneCode(testTrimStyleDTO.getProvinceCode());
+        customerLog.setCityCode(testTrimStyleDTO.getCityCode());
+
+        customerLog.setAgeInfo(testTrimStyleDTO.getAgeInfo());
+        customerLog.setHouseType(testTrimStyleDTO.getHouseType());
+        customerLog.setStyleInfo(testTrimStyleDTO.getStyleInfo());
+        customerLog.setSex(testTrimStyleDTO.getSex());
+        customerLog.setAgeInfo(testTrimStyleDTO.getAgeInfo());
+        customerLog.setPhone(testTrimStyleDTO.getPhone());
+        customerLogMapper.insert(customerLog);
+        customerLog.setOpenid(member.getOpenid());
+        return  customerLog;
+    }
+
 
 
 
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
index ffe30cc..96f10e5 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java
@@ -4,6 +4,7 @@
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Utils;
 import com.doumee.dao.business.IamInterfaceLogMapper;
+import com.doumee.dao.business.model.CustomerLog;
 import com.doumee.dao.business.model.IamInterfaceLog;
 import com.doumee.dao.business.model.InterfaceLog;
 import com.doumee.service.business.IamInterfaceLogService;
@@ -146,13 +147,7 @@
         if (pageWrap.getModel().getQueryEndDate() != null) {
             queryWrapper.lambda().le(IamInterfaceLog::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getQueryEndDate()));
         }
-        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
-            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
-                queryWrapper.orderByDesc(sortData.getProperty());
-            } else {
-                queryWrapper.orderByAsc(sortData.getProperty());
-            }
-        }
+        queryWrapper.lambda().orderByDesc(IamInterfaceLog::getCreateDate);
         return PageData.from(iamInterfaceLogMapper.selectPage(page, queryWrapper));
     }
 
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 80576f9..18e6aa8 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -4,6 +4,11 @@
 import cn.binarywang.wx.miniapp.bean.WxMaPhoneNumberInfo;
 import com.alibaba.fastjson.JSONObject;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.biz.zbom.ZbomZhongTaiService;
+import com.doumee.biz.zbom.model.zhongtai.ZTBaseRequst;
+import com.doumee.biz.zbom.model.zhongtai.ZTUserGetTokenRequest;
+import com.doumee.biz.zbom.model.zhongtai.ZTUserInfoUpdateRequest;
+import com.doumee.biz.zbom.model.zhongtai.response.ZTUserGetTokenResponse;
 import com.doumee.config.Jwt.JwtPayLoad;
 import com.doumee.config.Jwt.JwtTokenUtil;
 import com.doumee.core.constants.ResponseStatus;
@@ -54,6 +59,9 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private ZbomZhongTaiService zbomZhongTaiService;
 
     @Autowired
     private RedisTemplate<String,Object> redisTemplate;
@@ -301,6 +309,28 @@
 
     @Override
     public void updMemberDetail(EditMemberRequest editMemberRequest){
+        Member member = memberMapper.selectById(editMemberRequest.getMemberId());
+        ZTUserInfoUpdateRequest ztUserInfoUpdateRequest = new  ZTUserInfoUpdateRequest();
+        ztUserInfoUpdateRequest.setOpenid(member.getOpenid());
+        String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
+        ztUserInfoUpdateRequest.setAppId(appId);
+        ztUserInfoUpdateRequest.setPlatform(Constants.PLATFORM);
+        ztUserInfoUpdateRequest.setPhone(editMemberRequest.getPhone());
+        ztUserInfoUpdateRequest.setName(editMemberRequest.getName());
+        ztUserInfoUpdateRequest.setAddress(editMemberRequest.getProvinceName()+editMemberRequest.getCityName()+editMemberRequest.getAreaName());
+        ztUserInfoUpdateRequest.setFullAddress(editMemberRequest.getAddress());
+        String prefix = systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.RESOURCE_PATH).getCode() +
+                systemDictDataBiz.queryByCode(Constants.OBJCET_STORAGE, Constants.MEMBER).getCode();
+        if(StringUtils.isNotBlank(editMemberRequest.getImgurl())){
+            ztUserInfoUpdateRequest.setAvatarUrl(prefix + editMemberRequest.getImgurl());
+        }
+        ztUserInfoUpdateRequest.setUptown(editMemberRequest.getDistrict());
+        ztUserInfoUpdateRequest.setHouseArea(editMemberRequest.getHousearea().toString());
+        ztUserInfoUpdateRequest.setHouseLayout(Constants.getHouseLayout(editMemberRequest.getHousetype()));
+        ZTUserGetTokenResponse userUpdateInfo = zbomZhongTaiService.userUpdateInfo(ztUserInfoUpdateRequest);
+        if(Objects.isNull(userUpdateInfo)){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴淇℃伅鏇存柊澶辫触锛岃鑱旂郴绠$悊鍛�");
+        }
         memberMapper.update(new UpdateWrapper<Member>()
                 .lambda()
                 .set(StringUtils.isNotBlank(editMemberRequest.getImgurl()),Member::getImgurl,editMemberRequest.getImgurl())
@@ -318,8 +348,8 @@
                 .set(StringUtils.isNotBlank(editMemberRequest.getHousetype()),Member::getHousetype,editMemberRequest.getHousetype())
                 .set(Objects.nonNull(editMemberRequest.getLatitude()),Member::getLatitude,editMemberRequest.getLatitude())
                 .set(Objects.nonNull(editMemberRequest.getLongitude()),Member::getLongitude,editMemberRequest.getLongitude())
+                .set(Member::getToken,userUpdateInfo.getToken())
                 .eq(Member::getId,editMemberRequest.getMemberId()));
-
     }
 
     @Override
@@ -334,4 +364,60 @@
         return member;
     }
 
+
+    /**
+     * 鏇存柊涓彴token淇℃伅
+     * @param member
+     */
+    public void updUserZTToken(Member member){
+        //濡傛灉鏃犳湁鏁堟湡/宸茶繃鏈� 閲嶆柊鑾峰彇
+        if(Objects.isNull(member.getTokenDate()) || member.getTokenDate().getTime()<=System.currentTimeMillis() ){
+            ZTUserGetTokenRequest param = new ZTUserGetTokenRequest();
+            //鏌ヨAPPID
+            String appId = systemDictDataBiz.queryByCode(Constants.WX_MINI_CONFIG,Constants.WX_APPID_CUSTOMER).getCode();
+            param.setAppId(appId);
+            param.setOpenId(member.getOpenid());
+            ZTUserGetTokenResponse ztUserGetTokenResponse = zbomZhongTaiService.getUserToken(param);
+            if(Objects.nonNull(ztUserGetTokenResponse)){
+                member.setToken(ztUserGetTokenResponse.getToken());
+                //TODO 鏆傛棤杩囨湡鏃ユ湡
+                memberMapper.update(new UpdateWrapper<Member>().lambda().set(Member::getToken,ztUserGetTokenResponse.getToken())
+                        .eq(Member::getId,member.getId()));
+            }else{
+                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴TOKEN鑾峰彇澶辫触锛岃鑱旂郴绠$悊鍛�");
+            }
+        };
+    }
+
+
+
+    @Override
+    public void logOff(Long memberId){
+        Member member = memberMapper.selectById(memberId);
+        if(Objects.isNull(member)){
+            throw new BusinessException(ResponseStatus.DATA_EMPTY);
+        }
+        if(StringUtils.isBlank(member.getPhone())){
+            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"鐢ㄦ埛宸叉敞閿�");
+        }
+        //鏍¢獙鐢ㄦ埛token淇℃伅
+        this.updUserZTToken(member);
+        //璋冭捣涓彴娉ㄩ攢鎺ュ彛
+        ZTBaseRequst ztBaseRequst = new ZTBaseRequst();
+        ztBaseRequst.setUserType(Constants.CUSTOMER);
+        ztBaseRequst.setOpenid(member.getOpenid());
+        ztBaseRequst.setToken(member.getToken());
+        Boolean logoutFlag = zbomZhongTaiService.userLogout(ztBaseRequst);
+        if(logoutFlag){
+            memberMapper.update(new UpdateWrapper<Member>().lambda()
+                    .set(Member::getPhone,null)
+                    .set(Member::getEditDate,new Date())
+                    .eq(Member::getId,member.getId())
+            );
+            return;
+        }
+        throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"涓彴娉ㄩ攢澶辫触锛岃鑱旂郴绠$悊鍛�");
+    }
+
+
 }
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
index 6223904..2a03951 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java
@@ -841,10 +841,16 @@
                     s.setIdPath(s.getId()+"/");
                     shopMapper.updateById(s);
                 }else{
+                    String idPath = StringUtils.defaultString(parent.getIdPath(),"")+ shop.getId()+"/";
+                    String namePath =StringUtils.defaultString(parent.getNamePath(),"")+"/"+shop.getName();
                     s.setParentId(parent.getId());
-                    s.setNamePath(parent.getNamePath()+"/"+s.getName());
-                    s.setIdPath(parent.getIdPath()+s.getId()+"/");
-                    shopMapper.updateById(s);
+                    s.setNamePath(namePath);
+                    s.setIdPath(idPath);
+                    if(!(Constants.equalsLong(parent.getId(),shop.getParentId())
+                            && StringUtils.equals(idPath,shop.getIdPath())
+                            &&StringUtils.equals(namePath,shop.getNamePath())) ){
+                        shopMapper.updateById(s);
+                    }
                 }
                 if(shop.getChildList()!=null && shop.getChildList().size()>0){
                     updateNamePath(s,shop.getChildList());
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
index 052a192..a1f7547 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java
@@ -5,6 +5,7 @@
 import com.baomidou.mybatisplus.core.metadata.IPage;
 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.biz.zbom.ZbomSMSService;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
 import com.doumee.core.model.LoginUserInfo;
@@ -39,6 +40,9 @@
 
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
+
+    @Autowired
+    private ZbomSMSService zbomSMSService;
 
 
     public static void isCaptcheValide(SmsEmailMapper smsEmailMapper, String phone, String captche) {
@@ -89,10 +93,8 @@
         String code = Constants.getRandom6Num();
 
         String content = //systemDictDataBiz.queryByCode(Constants.SMS,Constants.SMS_COMNAME).getCode()+
-
                 "楠岃瘉鐮佷负锛�"+code+"锛屾楠岃瘉鐮佹湁鏁堜负3鍒嗛挓銆傝鍕挎硠闇�";
-
-
+        zbomSMSService.sendMessage(content,smsEmail.getPhone());
         smsEmail.setRemark(code);
         smsEmail.setIsdeleted(Constants.ZERO);
         smsEmail.setCreateDate(new Date());
diff --git a/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java b/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
index 7d1c818..64a7de6 100644
--- a/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
+++ b/server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java
@@ -2,22 +2,25 @@
 
 import cn.binarywang.wx.miniapp.bean.WxMaJscode2SessionResult;
 import com.doumee.biz.system.SystemDictDataBiz;
+import com.doumee.biz.zbom.model.IamUserRoleModel;
+import com.doumee.biz.zbom.model.IamUserTypeModel;
 import com.doumee.config.Jwt.JwtPayLoad;
 import com.doumee.config.Jwt.JwtTokenUtil;
+import com.doumee.core.annotation.excel.ExcelImporter;
 import com.doumee.core.constants.ResponseStatus;
 import com.doumee.core.exception.BusinessException;
+import com.doumee.core.model.LoginUserInfo;
 import com.doumee.core.model.PageData;
 import com.doumee.core.model.PageWrap;
 import com.doumee.core.utils.Constants;
 import com.doumee.core.utils.Utils;
+import com.doumee.dao.admin.request.ShopImport;
+import com.doumee.dao.admin.request.UserImport;
 import com.doumee.dao.business.ShopMapper;
 import com.doumee.core.wx.WxMiniConfig;
+import com.doumee.dao.business.SmsEmailMapper;
 import com.doumee.dao.business.UsersMapper;
-import com.doumee.dao.business.model.Multifile;
-import com.doumee.dao.business.model.News;
-import com.doumee.dao.business.model.Shop;
-import com.doumee.dao.business.model.Member;
-import com.doumee.dao.business.model.Users;
+import com.doumee.dao.business.model.*;
 import com.doumee.dao.system.model.SystemUser;
 import com.doumee.dao.web.response.AccountResponse;
 import com.doumee.service.business.UsersService;
@@ -30,14 +33,21 @@
 import org.apache.commons.lang3.StringUtils;
 import me.chanjar.weixin.common.error.WxErrorException;
 import org.apache.commons.lang3.StringUtils;
+import org.apache.shiro.SecurityUtils;
 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.util.ArrayList;
 import java.util.Date;
 import java.util.List;
 import java.util.Objects;
+import java.util.concurrent.Callable;
+import java.util.concurrent.ExecutorService;
+import java.util.concurrent.Executors;
 
 /**
  * 鍛樺伐淇℃伅琛⊿ervice瀹炵幇
@@ -47,10 +57,16 @@
 @Service
 public class UsersServiceImpl implements UsersService {
 
+
+    ExecutorService executor = Executors.newFixedThreadPool(1);
+    @Autowired
+    private RedisTemplate<String, Object> redisTemplate;
     @Autowired
     private UsersMapper usersMapper;
     @Autowired
     private ShopMapper shopMapper;
+    @Autowired
+    private SmsEmailMapper smsEmailMapper;
     @Autowired
     private SystemDictDataBiz systemDictDataBiz;
 
@@ -276,6 +292,8 @@
     }
 
 
+
+
     @Override
     public AccountResponse phoneLogin(String phone,String code){
         if(StringUtils.isEmpty(phone)||StringUtils.isEmpty(code)){
@@ -291,10 +309,27 @@
         if(!StringUtils.equals(users.getStatus(),Constants.ZERO+"")){
             throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"褰撳墠璐︽埛宸插仠鐢紝璇疯仈绯荤鐞嗗憳");
         }
-        //TODO 楠岃瘉鐭俊淇℃伅
-        if(!StringUtils.equals(code,"123456")){
-            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"楠岃瘉鐮侀敊璇�");
+        //楠岃瘉鐭俊
+        SmsEmail model = smsEmailMapper.selectOne(new QueryWrapper<SmsEmail>().lambda()
+                .eq(SmsEmail::getType, Constants.ZERO)
+                .eq(SmsEmail::getPhone, phone)
+                .eq(SmsEmail::getRemark, code)
+                .eq(SmsEmail::getIsdeleted, Constants.ZERO)
+        );
+        if(model == null){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝楠岃瘉鐮佷笉姝g‘锛岃閲嶆柊鍙戦�佸啀璇曪紒");
         }
+        if(!Constants.equalsInteger(model.getStatus(),Constants.ZERO)){
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝楠岃瘉鐮佸凡澶辨晥锛岃閲嶆柊鍙戦�佸啀璇曪紒");
+        }
+        model.setStatus(Constants.ONE);
+        model.setEditDate(new Date());
+        if(model.getCreateDate() !=null &&
+                System.currentTimeMillis() - model.getCreateDate().getTime() > 3*60*1000){
+            smsEmailMapper.updateById(model);
+            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝楠岃瘉鐮佸凡澶辨晥锛岃閲嶆柊鍙戦�佸啀璇晘");
+        }
+        smsEmailMapper.updateById(model);
         //鍒涘缓token
         JwtPayLoad payLoad = new JwtPayLoad(users.getId(),Constants.ONE);
         String token = JwtTokenUtil.generateToken(payLoad);
@@ -356,4 +391,214 @@
             e.printStackTrace();
         }
     }
+
+    @Override
+    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
+    public String importBatch(MultipartFile file){
+        Boolean importing = (Boolean) redisTemplate.opsForValue().get(Constants.RedisKeys.IMPORTING_USERS);
+        if(importing!=null && importing){
+            throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝宸插瓨鍦ㄥ鍏ユ垨鑰呬笂涓嬬骇閲嶇疆浠诲姟姝e湪鎵ц涓紝璇风◢鍚庡啀璇曪紒");
+        }
+        redisTemplate.opsForValue().set(Constants.RedisKeys.IMPORTING_USERS,true);
+        try {
+            LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
+            ExcelImporter ie = null;
+            List<UserImport> dataList =null;
+            try {
+                ie = new ExcelImporter(file,0,0);
+                dataList = ie.getDataList(UserImport.class,null);
+            }  catch (Exception e) {
+                e.printStackTrace();
+            }
+            if(dataList == null || dataList.size() ==0){
+                throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝褰曞叆鏁版嵁涓虹┖锛�");
+            }
+            Date date =new Date();
+            List<UserImport> finalDataList = dataList;
+            Callable<String> task = () -> {
+                dealUserDataBiz(finalDataList,date,loginUserInfo);
+                return "寮傛浠诲姟瀹屾垚";
+            };
+            executor.submit(task);
+
+            return "瀵煎叆鎴愬姛";
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }
+    }
+
+    private void dealUserDataBiz(List<UserImport> dataList, Date date, LoginUserInfo loginUserInfo) {
+        try {
+            List<Users> list =  usersMapper.selectJoinList(Users.class,new MPJLambdaWrapper<Users>()
+                    .selectAll(Users.class)
+            );
+            List<Users> insertList = new ArrayList<>();
+            List<Users> updateList = new ArrayList<>();
+            for(int i=0;i<dataList.size();i++){
+                UserImport model = dataList.get(i);
+                if(StringUtils.isBlank(model.getName())
+                        &&StringUtils.isBlank(model.getCode()) ){
+                    continue;
+                }
+                Users user = checkModelParam(model,insertList,updateList,i,loginUserInfo,list,date);
+            }
+            if(insertList .size() >0){
+                int temp = 0;
+                while(temp < insertList.size()){
+                    int index;
+                    if(temp + 500 <= insertList.size()){
+                        index = temp+500;
+                    }else{
+                        index = insertList.size();
+                    }
+                    usersMapper.insert(insertList.subList(temp,index));
+                    temp = index;
+                }
+            }
+            if(updateList .size() >0){
+                for(Users s : updateList){
+                    //閬嶅巻鏇存柊鏁版嵁
+                    usersMapper.updateById(s);
+                }
+            }
+        }catch (BusinessException e){
+            throw e;
+        }catch (Exception e){
+            throw  new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"淇℃伅瀵煎叆澶辫触锛岃绋嶅悗閲嶈瘯");
+        }finally {
+            executor.shutdown();
+            redisTemplate.delete(Constants.RedisKeys.IMPORTING_USERS);
+        }
+    }
+    private Users getUserByUserID(String userId, List<Users> list) {
+        if(list ==null || list.size() ==0){
+            return null;
+        }
+        for(Users s :list){
+            if(StringUtils.equals(s.getIamId(),userId)){
+                return s;
+            }
+        }
+        return null;
+    }
+
+    private Users checkModelParam(UserImport model, List<Users> insertList, List<Users> updateList, int index, LoginUserInfo loginUserInfo, List<Users> list, Date date) {
+
+            if(StringUtils.isBlank(model.getUserId())){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛屻�愮紪鐮併�戜俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+            }
+            if(StringUtils.isBlank(model.getName())){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛屻�愬鍚嶃�戜俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+            }
+            if(StringUtils.isBlank(model.getAccountNo())){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛屻�愮櫥褰曡处鍙枫�戜俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+            }
+            if(StringUtils.isBlank(model.getPhone())){
+                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"瀵逛笉璧凤紝绗�"+(index+3)+"琛屻�愭墜鏈哄彿銆戜俊鎭笉瀹屾暣锛岃妫�鏌ヨ〃鏍煎唴瀹癸紒");
+            }
+            Users users = getUserByUserID(model.getUserId(),list);
+            if(users == null){
+                users = new Users();
+                users.setCreator(loginUserInfo.getId());
+                users.setCreateDate(date);
+                initUsersInfo(users,model,date,loginUserInfo);
+                insertList.add(users);
+            }else {
+                initUsersInfo(users,model,date,loginUserInfo);
+                updateList.add(users);
+            }
+            return  users;
+        }
+
+    private void initUsersInfo(Users users, UserImport model,Date date,LoginUserInfo loginUserInfo ){
+        users.setEditor(loginUserInfo.getId());
+        users.setEditDate(date);
+        users.setName(model.getName());
+        users.setIamUsername(model.getAccountNo());
+        users.setPhone(model.getPhone());
+        users.setStatus(model.getStatus());
+        users.setEmail(model.getEmail());
+        users.setIamId(model.getUserId());
+        users.setCode(model.getCode());
+        users.setSex(model.getSex());
+        users.setStatus(model.getStatus());
+        users.setIsdeleted(Constants.ZERO);
+        users.setRoleIds("");
+        users.setRoleNames("");
+        users.setRoleCodes("");
+        users.setUserTypes("");
+        users.setIamOrgId("");
+        getDepartidByParam(users,model.getOrgIds());
+        setRolesInfo(users,model);
+        getUserTypesByParam(users,model.getTypeCodes());
+    }
+
+    private String getUserTypesByParam(Users users,String typeCodes) {
+        if( typeCodes !=null){
+            String[] codes =typeCodes.split(",");
+            for(String t : codes){
+                if(StringUtils.isBlank(users.getUserTypes())){
+                    users.setUserTypes("");
+                }
+                users.setUserTypes(users.getUserTypes()+"["+t+"];");
+            }
+        }
+        return  users.getUserTypes();
+    }
+
+    private void setRolesInfo(Users users, UserImport model) {
+        if( model.getRoleCodes() !=null){
+            String[] codes = model.getRoleCodes().split(",");
+            for(String t : codes){
+                if(StringUtils.isBlank(users.getRoleCodes())){
+                    users.setRoleCodes("");
+                }
+                users.setRoleCodes(users.getRoleCodes()+"["+t+"];");
+            }
+        }
+        if( model.getRoleIds() !=null){
+            String[] codes = model.getRoleIds().split(",");
+            for(String t : codes){
+                if(StringUtils.isBlank(users.getRoleIds())){
+                    users.setRoleIds("");
+                }
+                users.setRoleIds(users.getRoleIds()+"["+t+"];");
+            }
+        }
+        if( model.getRoleNames() !=null){
+            String[] codes = model.getRoleNames().split(",");
+            for(String t : codes){
+                if(StringUtils.isBlank(users.getRoleNames())){
+                    users.setRoleNames("");
+                }
+                users.setRoleNames(users.getRoleNames()+"["+t+"];");
+            }
+        }
+    }
+
+    private Shop getDepartidByParam(Users users , String orgIds) {
+        if( orgIds ==null){
+          return null;
+        }
+        String[] orgArray = orgIds.split(",");
+        if( orgArray !=null && orgArray.length>0){
+            for(String t : orgArray){
+                Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda()
+                        .eq(Shop::getOrgId,t)
+                        .last("limit 1"));
+                if(shop!=null) {
+                    users.setIamOrgId(t);
+                    users.setDepartmentId(shop.getId());
+                    return  shop;
+                }
+            }
+        }
+        users.setIamOrgId(orgIds+"--灏氭湭鍚屾鍒扮粍缁�");
+
+        return null;
+    }
+
 }
+
diff --git a/server/web/src/main/java/com/doumee/api/web/CustomerApi.java b/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
index 3dbee62..3c9c591 100644
--- a/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/CustomerApi.java
@@ -1,11 +1,12 @@
 package com.doumee.api.web;
 
+import com.doumee.biz.zbom.ZbomCRMService;
 import com.doumee.config.annotation.LoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.CustomerLog;
 import com.doumee.dao.business.model.Member;
-import com.doumee.dao.web.reqeust.EditMemberRequest;
-import com.doumee.dao.web.reqeust.WxPhoneRequest;
+import com.doumee.dao.web.reqeust.*;
 import com.doumee.dao.web.response.AccountResponse;
 import com.doumee.dao.web.response.BjParamConfigResponse;
 import com.doumee.service.business.BjParamService;
@@ -16,6 +17,7 @@
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
@@ -44,6 +46,8 @@
     @Autowired
     private CustomerService customerService;
 
+    @Autowired
+    private ZbomCRMService zbomCRMService;
 
     @ApiOperation(value = "瀹㈡埛绔皬绋嬪簭鐧婚檰", notes = "瀹㈡埛绔皬绋嬪簭")
     @GetMapping("/wxLoginCustomer")
@@ -94,8 +98,53 @@
     }
 
 
+    @LoginRequired
+    @ApiOperation(value = "瑁呬慨璁$畻鍣ㄤ俊鎭瓨鍌�", notes = "瀹㈡埛绔皬绋嬪簭")
+    @PostMapping("/saveRenovationCalculator")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse saveRenovationCalculator(@RequestBody RenovationCalculatorDTO renovationCalculatorDTO) {
+        renovationCalculatorDTO.setMemberId(getMemberId());
+        CustomerLog customerLog =customerService.saveRenovationCalculator(renovationCalculatorDTO);
+        zbomCRMService.dealCustomerLogData(customerLog);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 
 
+    @LoginRequired
+    @ApiOperation(value = "0鍏冨畾鍒朵俊鎭�", notes = "瀹㈡埛绔皬绋嬪簭")
+    @PostMapping("/saveFreeCustomizationApply")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse saveFreeCustomizationApply(@RequestBody FreeCustomizationDTO freeCustomizationDTO) {
+        freeCustomizationDTO.setMemberId(getMemberId());
+        CustomerLog customerLog = customerService.saveFreeCustomizationApply(freeCustomizationDTO);
+        zbomCRMService.dealCustomerLogData(customerLog);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "娴嬭瘯瑁呬慨椋庢牸", notes = "瀹㈡埛绔皬绋嬪簭")
+    @PostMapping("/saveTestTrimStyle")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "鐢ㄦ埛token鍊�", required = true)
+    })
+    public ApiResponse saveTestTrimStyle(@RequestBody TestTrimStyleDTO testTrimStyleDTO) {
+        testTrimStyleDTO.setMemberId(getMemberId());
+        CustomerLog customerLog = customerService.saveTestTrimStyle(testTrimStyleDTO);
+        zbomCRMService.dealCustomerLogData(customerLog);
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
+
+    @LoginRequired
+    @ApiOperation(value = "鐢ㄦ埛娉ㄩ攢", notes = "瀹㈡埛绔皬绋嬪簭")
+    @GetMapping("/logOff")
+    public ApiResponse logOff() {
+        memberService.logOff(getMemberId());
+        return  ApiResponse.success("鎿嶄綔鎴愬姛");
+    }
 
 
 }
diff --git a/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java b/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
index cce994c..8772dde 100644
--- a/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
+++ b/server/web/src/main/java/com/doumee/api/web/PersonnelApi.java
@@ -3,14 +3,17 @@
 import com.doumee.config.annotation.UserLoginRequired;
 import com.doumee.core.annotation.trace.Trace;
 import com.doumee.core.model.ApiResponse;
+import com.doumee.dao.business.model.SmsEmail;
 import com.doumee.dao.web.response.AccountResponse;
 import com.doumee.service.business.MemberService;
+import com.doumee.service.business.SmsEmailService;
 import com.doumee.service.business.UsersService;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiImplicitParam;
 import io.swagger.annotations.ApiImplicitParams;
 import io.swagger.annotations.ApiOperation;
 import lombok.extern.slf4j.Slf4j;
+import org.checkerframework.checker.units.qual.A;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.GetMapping;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -33,6 +36,9 @@
     @Autowired
     public UsersService usersService;
 
+    @Autowired
+    public SmsEmailService smsEmailService;
+
 
     @ApiOperation(value = "灏忕▼搴忕櫥闄�", notes = "鍛樺伐绔皬绋嬪簭")
     @GetMapping("/loginByWx")
@@ -44,6 +50,20 @@
     }
 
 
+    @ApiOperation(value = "鍙戦�佺煭淇¢獙璇佺爜", notes = "鍛樺伐绔皬绋嬪簭")
+    @GetMapping("/sendSms")
+    @ApiImplicitParams({
+            @ApiImplicitParam(paramType = "query", dataType = "String", name = "phone", value = "鎵嬫満鍙�", required = true),
+    })
+    public ApiResponse sendSms(@RequestParam String phone) {
+        SmsEmail smsEmail = new SmsEmail();
+        smsEmail.setPhone(phone);
+        smsEmailService.sendSms(smsEmail);
+        return  ApiResponse.success("鍙戦�佹垚鍔�");
+    }
+
+
+
     @ApiOperation(value = "鎵嬫満鍙烽獙璇佺爜鐧婚檰", notes = "鍛樺伐绔皬绋嬪簭")
     @GetMapping("/loginByPhone")
     @ApiImplicitParams({

--
Gitblit v1.9.3