liukangdong
2024-07-12 baab15477c13b3eeb04784f784fcc5bac1c68393
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/zbomyoujia
已添加28个文件
已修改40个文件
2611 ■■■■ 文件已修改
admin/public/template/users.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/users.js 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaUserImportWindow.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/system/dict/OperaDictDataWindow.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/crmInterfaceLog.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/iamInterfaceLog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/interfaceLog.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/member.vue 169 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shop.vue 39 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shopTree.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/shopUsers.vue 38 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/PushController.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/ShopController.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/api/business/UsersController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/timer/ZbomRedisResetBiz.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/admin/src/main/java/com/doumee/timer/init/InitBizService.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/ZbomCRMService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/ZbomIAMService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/ZbomZhongTaiService.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomCRMServiceImpl.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomIAMServiceImpl.java 14 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomSMSServiceImpl.java 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/impl/ZbomZhongTaiServiceImpl.java 322 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionBatchDoRequest.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTActionDoRequest.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTAreaListRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTBaseRequst.java 18 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCatalogListRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTCollectListRequest.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTConstants.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentInfoRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTContentListRequest.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserGetTokenRequest.java 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserInfoUpdateRequest.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/ZTUserLogoutRequest.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTAreaInfoResponse.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBasePageResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTBaseResponse.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogInfoResponse.java 51 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCatalogTagTypeResponse.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTCollectResponse.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentInfoResponse.java 54 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTContentListResponse.java 72 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/zbom/model/zhongtai/response/ZTUserGetTokenResponse.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/model/ApiResponse.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/HttpsUtil.java 34 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/admin/request/UserImport.java 41 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Customer.java 6 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/CustomerLog.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/Users.java 7 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/vo/ShopTreeVo.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/web/reqeust/FreeCustomizationDTO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/web/reqeust/RenovationCalculatorDTO.java 34 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/web/reqeust/TestTrimStyleDTO.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/CustomerService.java 23 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/InitService.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/MemberService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/UsersService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CustomerLogServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CustomerServiceImpl.java 211 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/IamInterfaceLogServiceImpl.java 9 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/ShopServiceImpl.java 12 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/SmsEmailServiceImpl.java 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/UsersServiceImpl.java 261 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/CustomerApi.java 53 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/web/src/main/java/com/doumee/api/web/PersonnelApi.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/public/template/users.xlsx
Binary files differ
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) {
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>
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">
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">
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">
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">
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="请输入微信openid" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态 0正常 1禁用" prop="status">
        <el-input v-model="searchForm.status" placeholder="请输入状态 0正常 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="请输入省份code" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="城市code" prop="cityCode">
        <el-input v-model="searchForm.cityCode" placeholder="请输入城市code" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="区域code" prop="areaCode">
        <el-input v-model="searchForm.areaCode" placeholder="请输入区域code" @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正常 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="操作"
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="正常" 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">正常</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>
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">正常</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>
-->
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="正常" 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="正常" 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: [],
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;
    }
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("操作成功");
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("操作成功");
    }
}
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();
        }
    }
}
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;
/**
 * å¿—邦组织信息表Service实现
 * @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));
    }
}
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 );
}
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);
}
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);
}
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;
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);
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);
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;
/**
 * äººå‘˜ä¿¡æ¯è¡¨Service实现
@@ -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("【中台接口:"+name+"】================成功====\n"+res);
        }else{
            log.error("【中台接口:"+name+"】================失败====:\n"+ res);
        }
    }
}
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;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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在HEADER中的名字
    public static  String HEADER_TOKEN = "token";//token
    public static  String DEFAULT_PID = "1";//默认省市区pid=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  ="获取省市区集合";
    }
}
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;
}
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;
    /**
     * æ˜¯å¦ç½®é¡¶ï¼Œé»˜è®¤false
     */
    private Boolean isTop;
    /**
     * å½“前页
     */
    private String pageNum;
    /**
     * æ¯é¡µæ¡æ•°
     */
    private String pageSize;
    /**
     * æœç´¢å…³é”®å­—,根据标题搜索关键字
     */
    private String search;
    /**
     * æŽ’序方式,NORMAL - é»˜è®¤
     * HOT - æœ€çƒ­
     * LATEST - æœ€æ–°
     */
    private String sortType;
    /**
     * å¤šä¸ªæ ‡ç­¾å”¯ä¸€ç¼–码的列表,多个标签唯一编码的列表
     */
    private List<String> tagCode;
}
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,应用ID, ç”¨ä½œç™»å½•行为日志记录
     */
    private String appId;
    /**
     * OpenID,OpenID手机号
     */
    private String openId;
    /**
     * å­åº”用码,子应用码,暂时不做要求,用作登录行为日志记录
     */
    private String subAppCode;
}
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,小程序的AppID å¿…需
     */
    private String appId;
    /**
     * å¤´åƒï¼Œå¤´åƒåœ°å€,
     * æ¯”如"https://www.gravatar.com/avatar/e64c7d89f26bd1972efa854d13d7dd61?s=64&d=identicon"
     */
    private String avatarUrl;
    /**
     * ç”Ÿæ—¥ï¼ŒXXXXå¹´X月X日
     */
    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;
    /**
     * å¹³å°ç±»åž‹ï¼Œå°ç¨‹åºä¼ mp-weixin,pad端传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;
    /**
     * å°åŒºï¼Œâ€œXX小区”
     */
    private String uptown;
    /**
     * å¾®ä¿¡å·
     */
    private String weixin;
}
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;
}
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;
}
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;
}
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;
}
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;
    /**
     * å°é¢å›¾URL
     */
    private String picture;
    /**
     * çˆ¶çº§ç›®å½•ID
     */
    private String pid;
    /**
     * å¤‡æ³¨
     */
    private String remark;
    /**
     * ç›®å½•排序
     */
    private String sort;
    /**
     * å­ç›®å½•
     */
    private List<ZTCatalogInfoResponse> childCatalog;
}
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;
}
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;
}
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;
}
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;
}
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;
}
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);
    }
    /**
     * è¯·æ±‚成功
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";// ä»£å®¢ä¸‹å•(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();
}
    /**
     * èŽ·å–è½¦ç‰Œç±»åž‹ä¿¡æ¯
     *
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){
                //信任所有ssl证书和主机
                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){
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;
}
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;
}
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;
}
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;
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;
}
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;
}
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;
}
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;
}
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);
}
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));
    }
}
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);
}
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);
}
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));
    }
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;
/**
 * å®¢æˆ·ä¿¡æ¯è¡¨Service实现
@@ -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;
    }
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));
    }
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(),"中台注销失败,请联系管理员");
    }
}
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());
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());
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;
/**
 * å‘˜å·¥ä¿¡æ¯è¡¨Service实现
@@ -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(),"对不起,验证码不正确,请重新发送再试!");
        }
        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(),"对不起,已存在导入或者上下级重置任务正在执行中,请稍后再试!");
        }
        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;
    }
}
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("操作成功");
    }
}
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({