From dc79419f90bd4b9622e06320e15e3e056c13d89b Mon Sep 17 00:00:00 2001
From: liukangdong <898885815@qq.com>
Date: 星期二, 15 十月 2024 19:07:27 +0800
Subject: [PATCH] Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit

---
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java            |   17 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PositionServiceImpl.java          |  146 +++++++++
 admin/src/views/business/position.vue                                                                          |   82 +++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java                          |   13 
 server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PositionCloudController.java                  |   99 ++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Position.java                        |   84 +++++
 server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PositionMapper.java                        |   12 
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PositionService.java                   |   99 ++++++
 admin/src/components/business/OperaMemberWindow.vue                                                            |   43 ++
 server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java |   40 +-
 admin/src/views/business/relativeMember.vue                                                                    |   78 +++-
 admin/src/components/business/OperaPositionWindow.vue                                                          |   75 ++++
 admin/src/api/business/position.js                                                                             |   42 ++
 admin/src/views/business/internalMember.vue                                                                    |   80 +++-
 14 files changed, 829 insertions(+), 81 deletions(-)

diff --git a/admin/src/api/business/position.js b/admin/src/api/business/position.js
new file mode 100644
index 0000000..bbf959c
--- /dev/null
+++ b/admin/src/api/business/position.js
@@ -0,0 +1,42 @@
+import request from '../../utils/request'
+
+// 鏌ヨ
+
+export function fetchList (data) {
+  return request.post('/visitsAdmin/cloudService/business/position/list', data, {
+    trim: true
+  })
+}
+
+// 鍒涘缓
+export function create (data) {
+  return request.post('/visitsAdmin/cloudService/business/position/create', data)
+}
+
+// 淇敼
+export function updateById (data) {
+  return request.post('/visitsAdmin/cloudService/business/position/updateById', data)
+}
+export function sort (data) {
+  return request.post('/visitsAdmin/cloudService/business/position/updateSort', data)
+}
+
+// 鍒嗛〉鏌ヨ
+export function positionGetList (data) {
+  return request.post('/visitsAdmin/cloudService/business/position/page', data)
+}
+
+// 鍒犻櫎
+export function deleteById (id) {
+  return request.get(`/visitsAdmin/cloudService/business/position/delete/${id}`)
+}
+
+
+// 鎵归噺鍒犻櫎
+export function deleteByIdInBatch (ids) {
+  return request.get('/visitsAdmin/cloudService/business/position/delete/batch', {
+    params: {
+      ids
+    }
+  })
+}
diff --git a/admin/src/components/business/OperaMemberWindow.vue b/admin/src/components/business/OperaMemberWindow.vue
index b356deb..7b12553 100644
--- a/admin/src/components/business/OperaMemberWindow.vue
+++ b/admin/src/components/business/OperaMemberWindow.vue
@@ -11,6 +11,12 @@
           娉細浠呮敮鎸侀�夋嫨 銆恵{ companyType === 0 ? '鐩稿叧鏂圭粍缁�' : '鍐呴儴缁勭粐' }}銆�
         </div>
       </el-form-item>
+      <el-form-item label="閫夋嫨宀椾綅锛�" prop="positionId" >
+        <el-select v-model="form.positionId" clearable filterable placeholder="璇烽�夋嫨">
+          <el-option v-for="item in positionList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="鎵嬫満鍙�" prop="phone">
         <el-input v-model="form.phone" placeholder="璇疯緭鍏ユ墜鏈哄彿" v-trim />
         <div style="color: #F56C6C;font-size: 12px">娉細鍛樺伐鎵嬫満鍙峰皢浣滀负骞冲彴鐧诲綍璐﹀彿锛屽垵濮嬪瘑鐮佷负绯荤粺榛樿瀵嗙爜閰嶇疆椤�</div>
@@ -27,6 +33,19 @@
       <el-form-item label="宸ュ彿" prop="code">
         <el-input v-model="form.code" placeholder="璇疯緭鍏ュ憳宸ュ伐鍙�" v-trim />
       </el-form-item>
+      <el-form-item label="鍏ヨ亴鏃ユ湡" prop="jobDate">
+        <el-date-picker
+            v-model="form.jobDate"
+            value-format="yyyy-MM-dd"
+            type="date">
+        </el-date-picker>
+      </el-form-item>
+        <el-form-item label="鏄惁鍏氬憳" prop="isDangyuan">
+          <el-radio-group v-model="form.radio" @input="isDangyuan">
+            <el-radio :label="0">闈炲厷鍛�</el-radio>
+            <el-radio :label="1">鍏氬憳</el-radio>
+          </el-radio-group>
+        </el-form-item>
       <el-form-item label="浜鸿劯鐓х墖" prop="faceImgFull">
         <div class="upload_wrap">
           <UploadFaceImg :file="{ 'imgurlfull': form.faceImgFull, 'imgurl': form.faceImg }" :uploadData="uploadData"
@@ -48,11 +67,12 @@
 import UploadAvatarImage from '@/components/common/UploadAvatarImage'
 import UploadFaceImg from '@/components/common/UploadFaceImg'
 import { checkMobile, validIdCardNo, validIdCardNoNew } from '@/utils/form'
+import { fetchList as positionList } from '@/api/business/position'
 export default {
   name: 'OperaCompanyWindow',
   extends: BaseOpera,
   components: { GlobalWindow, UploadAvatarImage, UploadFaceImg },
-  data() {
+  data () {
     return {
       uploadData: {
         folder: 'member'
@@ -64,6 +84,7 @@
       },
       companyType: 0,
       department: [],
+      positionList: [],
       // 琛ㄥ崟鏁版嵁
       form: {
         id: null,
@@ -79,6 +100,9 @@
         idcardType: 0,
         phone: '',
         faceImg: '',
+        jobDate: null,
+        isDangyuan: 0,
+        positionId: null,
         faceImgFull: ''
       },
       // 楠岃瘉瑙勫垯
@@ -91,14 +115,14 @@
       }
     }
   },
-  created() {
+  created () {
     this.config({
       api: '/business/member.js',
       'field.id': 'id'
     })
   },
   methods: {
-    handleChangeCompany(value) {
+    handleChangeCompany (value) {
       if (this.form.company && this.form.company.length > 1) {
         this.form.companyId = this.form.company[this.form.company.length - 1]
       }
@@ -108,11 +132,12 @@
      * @title 绐楀彛鏍囬
      * @target 缂栬緫鐨勫璞�
      */
-    open(title, target, depart, companyType) {
+    open (title, target, depart, companyType) {
       this.title = title
       this.department = depart
       this.visible = true
       this.companyType = companyType
+      this.positionList()
       // 鏂板缓
       if (target == null) {
         this.$nextTick(() => {
@@ -140,8 +165,14 @@
         }
       })
     },
+    getPositionList () {
+      positionList({})
+        .then(res => {
+          this.positionList = res
+        })
+    },
     // 涓婁紶鍥剧墖
-    uploadAvatarSuccess(file) {
+    uploadAvatarSuccess (file) {
       this.form.faceImg = file.imgurl
       this.form.faceImgFull = file.imgurlfull
     }
@@ -171,4 +202,4 @@
     line-height: 24px;
   }
 }
-</style>
\ No newline at end of file
+</style>
diff --git a/admin/src/components/business/OperaPositionWindow.vue b/admin/src/components/business/OperaPositionWindow.vue
new file mode 100644
index 0000000..541c67c
--- /dev/null
+++ b/admin/src/components/business/OperaPositionWindow.vue
@@ -0,0 +1,75 @@
+<template>
+    <GlobalWindow
+        :title="title"
+        width="500px"
+        :visible.sync="visible"
+        :confirm-working="isWorking"
+        @confirm="confirm"
+    >
+      <el-form :model="form" ref="form" :rules="rules">
+          <el-form-item label="宀椾綅鍚嶇О" prop="name">
+            <el-input v-model="form.name" placeholder="璇疯緭鍏ュ矖浣嶅悕绉�" v-trim/>
+          </el-form-item>
+          <el-form-item label="鎺掑簭鐮�(鍗囧簭)" prop="sortnum">
+            <el-input v-model="form.sortnum" type="number" placeholder="璇疯緭鍏ユ帓搴忕爜" v-trim/>
+          </el-form-item>
+        <el-form-item label="澶囨敞" prop="remark">
+          <el-input type="textarea" v-model="form.remark" placeholder="璇疯緭鍏ュ娉�" v-trim :rows="3" maxlength="500"/>
+        </el-form-item>
+        </el-form>
+    </GlobalWindow>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera'
+import GlobalWindow from '@/components/common/GlobalWindow'
+export default {
+  name: 'OperaPositionWindow',
+  extends: BaseOpera,
+  components: { GlobalWindow },
+  data () {
+    return {
+      // 琛ㄥ崟鏁版嵁
+      memberList: [],
+      form: {
+        id: null,
+        name: null,
+        remark: null,
+        sortnum: null
+      },
+      // 楠岃瘉瑙勫垯
+      rules: {
+        name: [
+          { required: true, message: '璇疯緭鍏ュ悕绉�' }
+        ]
+      }
+    }
+  },
+  created () {
+    this.config({
+      api: '/business/',
+      'field.id': 'id'
+    })
+  },
+  methods: {
+    open (title, target) {
+      this.title = title
+      this.visible = true
+      // 鏂板缓缁勭粐
+      if (target == null) {
+        this.$nextTick(() => {
+          this.$refs.form.resetFields()
+          this.form[this.configData['field.id']] = null
+        })
+        return
+      }
+      // 缂栬緫
+      this.$nextTick(() => {
+        for (const key in this.form) {
+          this.form[key] = target[key]
+        }
+      })
+    }
+  }
+}
+</script>
diff --git a/admin/src/views/business/internalMember.vue b/admin/src/views/business/internalMember.vue
index ba0ad77..a8cd27e 100644
--- a/admin/src/views/business/internalMember.vue
+++ b/admin/src/views/business/internalMember.vue
@@ -5,6 +5,12 @@
       <el-form-item label="" prop="keyword">
         <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�/宸ュ彿" @keypress.enter.native="search"></el-input>
       </el-form-item>
+      <el-form-item label="" prop="positionId" >
+        <el-select v-model="searchForm.positionId" clearable filterable placeholder="宀椾綅">
+          <el-option v-for="item in positionList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="" prop="hasFace">
         <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" clearable placeholder="鏄惁鏈変汉鑴�">
           <el-option label="鏃�" value="0"></el-option>
@@ -17,11 +23,10 @@
           <el-option label="鍚�" value="0"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="" prop="status">
-        <el-select v-model="searchForm.status" @keypress.enter.native="search" clearable placeholder="鐘舵��">
-          <el-option label="姝e父" value="0"></el-option>
-          <el-option label="绂佺敤" value="1"></el-option>
-          <el-option label="鎷夐粦/鍐荤粨" value="2"></el-option>
+      <el-form-item label="" prop="workStatus">
+        <el-select v-model="searchForm.workStatus" @keypress.enter.native="search" clearable placeholder="鍦ㄨ亴鐘舵��">
+          <el-option label="鍦ㄨ亴" value="0"></el-option>
+          <el-option label="绂昏亴" value="1"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="" prop="hkStatus">
@@ -66,10 +71,17 @@
       </ul>
       <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="濮撳悕" min-width="110px">
+        <el-table-column  fixed="left"  prop="name" label="濮撳悕" min-width="110px">
           <template slot-scope="{row}">
             <span>{{ row.name }}</span>
             <span class="zhuguan" v-if="row.headStatus == 1">涓荤</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="浜鸿劯淇℃伅" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image v-if="row.faceImgFull" style="width: 60px; height: 60px" :src="row.faceImgFull"
+                      :preview-src-list="[row.faceImgFull]">
+            </el-image>
           </template>
         </el-table-column>
         <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
@@ -81,13 +93,21 @@
           </template>
         </el-table-column>
         <el-table-column prop="companyName" label="鎵�灞為儴闂�" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+        <el-table-column prop="postionName" label="宀椾綅" min-width="100px"></el-table-column>
+        <el-table-column prop="isDangyuan" label="鏄惁鍏氬憳" min-width="100px">
+          <template slot-scope="{row}">
+          <span v-if="row.isDangyuan == 0" style="color: green">鏄�</span>
+          <span v-else >鍚�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="jobDate" label="鍏ヨ亴鏃ユ湡" min-width="100px"></el-table-column>
+<!--        <el-table-column prop="status" label="鐘舵��" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.status == 0" style="color: green">姝e父</span>
             <span v-if="row.status == 1" style="color: red">绂佺敤</span>
             <span v-if="row.status == 2" style="color: red">鎷夐粦/鍐荤粨</span>
           </template>
-        </el-table-column>
+        </el-table-column>-->
         <el-table-column label="閮ㄩ棬绫诲瀷" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.companyType == 0">鐩稿叧鏂圭粍缁�</span>
@@ -148,13 +168,6 @@
         </el-table-column>
         <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
-        <el-table-column fixed="right" label="浜鸿劯淇℃伅" min-width="100px">
-          <template slot-scope="{row}">
-            <el-image v-if="row.faceImgFull" style="width: 60px; height: 60px" :src="row.faceImgFull"
-              :preview-src-list="[row.faceImgFull]">
-            </el-image>
-          </template>
-        </el-table-column>
         <el-table-column
           v-if="containPermissions(['business:member:update', 'business:member:delete', 'business:empower:create'])"
           label="鎿嶄綔" min-width="280" fixed="right">
@@ -194,12 +207,13 @@
 import OperaMemberRoleWindow from '@/components/business/OperaMemberRoleWindow'
 import OperaMemberImportWindow from '@/components/business/OperaMemberImportWindow'
 import { fetchList } from '@/api/business/company'
+import { fetchList as alllist } from '@/api/business/position'
 import { memberSync, roleAuth, updateCanVisit, updateHead, updateWorkStatus } from '@/api/business/member'
 export default {
   name: 'internalMember',
   extends: BaseTable,
   components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow, OperaMemberImportWindow },
-  data() {
+  data () {
     return {
       TreeList: [],
       // 鎼滅储
@@ -207,12 +221,14 @@
         name: '',
         status: '',
         hkStatus: '',
-        includeChild: false,
+        includeChild: true,
         canVisit: '',
         keyword: '',
         type: 2,
         companyType: 1,
         erpOrgId: '',
+        workStatus: '',
+        positionId: '',
         companyId: '',
         hasFace: ''
       },
@@ -221,10 +237,11 @@
       working: false,
       canvisiting: false,
       companyTree: [],
+      positionList: [],
       department: []
     }
   },
-  created() {
+  created () {
     this.config({
       module: '浜哄憳淇℃伅琛�',
       api: '/business/member',
@@ -233,9 +250,10 @@
     })
     // this.search()
     this.getfindCompanyTreePage()
+    this.getPositionList()
   },
   methods: {
-    startEmpowerBatch() {
+    startEmpowerBatch () {
       if (this.tableData.selectedRows.length === 0) {
         this.$tip.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
         return
@@ -248,7 +266,13 @@
       })
       this.$refs.OperaMemberRoleWindow.open('鍐呴儴鍛樺伐涓嬪彂鏉冮檺', ids, names, this.searchForm.companyType)
     },
-    empower(id) {
+    getPositionList () {
+      alllist({})
+        .then(res => {
+          this.positionList = res
+        })
+    },
+    empower (id) {
       var that = this
       this.$confirm('纭畾閲嶆柊鎺堟潈鍚�?', '鎻愮ず', {
         confirmButtonText: '纭畾',
@@ -265,7 +289,7 @@
       })
     },
     // 鑾峰彇缁勭粐鏍�
-    getfindCompanyTreePage() {
+    getfindCompanyTreePage () {
       fetchList()
         .then(res => {
           if (res && res.length > 0) {
@@ -277,7 +301,7 @@
           }
         })
     },
-    getDepartmentTree(tree) {
+    getDepartmentTree (tree) {
       if (tree == null) {
         return []
       }
@@ -293,7 +317,7 @@
         }
 
         if (newItem.type === this.searchForm.companyType) {
-          //newItem.disabled =false
+          // newItem.disabled =false
         } else {
           newItem.disabled = true
         }
@@ -301,7 +325,7 @@
       })
     },
     // 鍚屾淇℃伅
-    async synchronous() {
+    async synchronous () {
       this.$dialog.actionConfirm('璇ユ搷浣滈檷瑙﹀彂鍏ㄥ憳淇℃伅鏇存柊鍜岄噸鏂颁笅鍙戯紒璇疯皑鎱庢搷浣�', '鎮ㄧ‘璁ゅ叏閲忓悓姝ュ唴閮ㄤ汉鍛樹俊鎭悧锛�')
         .then(() => {
           this.loading = true
@@ -319,7 +343,7 @@
         })
         .catch(() => { })
     },
-    async updateHead(row, type) {
+    async updateHead (row, type) {
       this.$dialog.actionConfirm('鎮ㄧ‘璁よ繘琛屽綋鍓嶆搷浣滃悧锛�', '閮ㄩ棬涓荤璁剧疆鎿嶄綔鎻愮ず')
         .then(() => {
           this.heading = true
@@ -337,7 +361,7 @@
             .catch(() => { })
         })
     },
-    changeWorkStatus(e, row) {
+    changeWorkStatus (e, row) {
       this.working = true
       updateWorkStatus({ id: row.id, workStatus: e })
         .then(res => {
@@ -352,7 +376,7 @@
         })
         .catch(() => { })
     },
-    changeCanvisit(e, row) {
+    changeCanvisit (e, row) {
       this.canvisiting = true
       updateCanVisit({ id: row.id, canVisit: e })
         .then(res => {
@@ -367,7 +391,7 @@
         })
         .catch(() => { })
     },
-    callback(row) {
+    callback (row) {
       console.log(row)
       this.searchForm.erpOrgId = row.erpId
       this.searchForm.companyId = row.id
diff --git a/admin/src/views/business/position.vue b/admin/src/views/business/position.vue
new file mode 100644
index 0000000..3f48eea
--- /dev/null
+++ b/admin/src/views/business/position.vue
@@ -0,0 +1,82 @@
+<template>
+  <TableLayout :permissions="['business:member:query']">
+    <!-- 鎼滅储琛ㄥ崟 -->
+    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="120px" inline>
+      <el-form-item label="" prop="name">
+        <el-input v-model="searchForm.name" clearable placeholder="宀椾綅鍚嶇О" @keypress.enter.native="search"></el-input>
+      </el-form-item>
+      <section>
+        <el-button type="primary" @click="search">鎼滅储</el-button>
+        <el-button @click="reset">閲嶇疆</el-button>
+      </section>
+    </el-form>
+    <!-- 琛ㄦ牸鍜屽垎椤� -->
+    <template v-slot:table-wrap>
+      <ul class="toolbar" v-permissions="['business:position:create','business:position:delete']">
+        <li><el-button type="primary" @click="$refs.OperaPositionWindow.open('鏂板缓宀椾綅',null,searchForm.type)" icon="el-icon-plus" v-permissions="['business:position:create']">鏂板缓</el-button></li>
+        <li><el-button type="danger" @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:position:delete']">鎵归噺鍒犻櫎</el-button></li>
+      </ul>
+      <el-table
+          v-loading="isWorking.search"
+          :data="tableData.list"
+          stripe
+          @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"></el-table-column>
+        <el-table-column prop="name" label="宀椾綅" min-width="200px"></el-table-column>
+        <el-table-column prop="sortnum" label="鎺掑簭鐮�"  min-width="100px"></el-table-column>
+        <el-table-column prop="editDate" label="鎿嶄綔鏃堕棿" min-width="200px"></el-table-column>
+        <el-table-column
+            v-if="containPermissions(['business:position:update', 'business:position:delete' ])"
+            label="鎿嶄綔"
+            min-width="250"
+            fixed="right"
+        >
+          <template slot-scope="{row}">
+            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaPositionWindow.open('缂栬緫宀椾綅',row,searchForm.type)" v-permissions="['business:position:update']">缂栬緫</el-button>
+            <el-button  type="text"  icon="el-icon-delete" @click="deleteById(row)" style="color: red" v-permissions="['business:position:delete']">鍒犻櫎</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+          @size-change="handleSizeChange"
+          @current-change="handlePageChange"
+          :pagination="tableData.pagination"
+      >
+      </pagination>
+    </template>
+    <!-- 鏂板缓/淇敼 -->
+    <OperaPositionWindow ref="OperaPositionWindow" @success="handlePageChange"/>
+  </TableLayout>
+</template>
+
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaPositionWindow from '@/components/business/OperaPositionWindow'
+export default {
+  name: 'areaSet',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaPositionWindow },
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        title: ''
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '宀椾綅閰嶇疆',
+      api: '/business/position',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+  }
+}
+</script>
diff --git a/admin/src/views/business/relativeMember.vue b/admin/src/views/business/relativeMember.vue
index 026d7f3..f5a6676 100644
--- a/admin/src/views/business/relativeMember.vue
+++ b/admin/src/views/business/relativeMember.vue
@@ -5,6 +5,13 @@
       <el-form-item label="" prop="keyword">
         <el-input v-model="searchForm.keyword" placeholder="璇疯緭鍏ュ鍚�/鎵嬫満鍙�/宸ュ彿" @keypress.enter.native="search"></el-input>
       </el-form-item>
+
+      <el-form-item label="" prop="positionId" >
+        <el-select v-model="searchForm.positionId" clearable filterable placeholder="宀椾綅">
+          <el-option v-for="item in positionList" :key="item.id" :label="item.name" :value="item.id">
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item label="" prop="hasFace">
         <el-select v-model="searchForm.hasFace" @keypress.enter.native="search" placeholder="鏄惁鏈変汉鑴�">
           <el-option label="鏃�" value="0"></el-option>
@@ -17,11 +24,10 @@
           <el-option label="鍚�" value="0"></el-option>
         </el-select>
       </el-form-item>
-      <el-form-item label="" prop="status">
-        <el-select v-model="searchForm.status" @keypress.enter.native="search" placeholder="鐘舵��">
-          <el-option label="姝e父" value="0"></el-option>
-          <el-option label="绂佺敤" value="1"></el-option>
-          <el-option label="鎷夐粦/鍐荤粨" value="2"></el-option>
+      <el-form-item label="" prop="workStatus">
+        <el-select v-model="searchForm.workStatus" @keypress.enter.native="search" clearable placeholder="鍦ㄨ亴鐘舵��">
+          <el-option label="鍦ㄨ亴" value="0"></el-option>
+          <el-option label="绂昏亴" value="1"></el-option>
         </el-select>
       </el-form-item>
       <el-form-item label="" prop="hkStatus">
@@ -70,10 +76,17 @@
       </ul>
       <el-table v-loading="isWorking.search" :data="tableData.list" stripe @selection-change="handleSelectionChange">
         <el-table-column type="selection" width="55"></el-table-column>
-        <el-table-column prop="name" label="濮撳悕" min-width="110px">
+        <el-table-column fixed="left"  prop="name" label="濮撳悕" min-width="110px">
           <template slot-scope="{row}">
             <span>{{ row.name }}</span>
             <span class="zhuguan" v-if="row.headStatus == 1">涓荤</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="浜鸿劯淇℃伅" min-width="100px">
+          <template slot-scope="{row}">
+            <el-image v-if="row.faceImgFull" style="width: 60px; height: 60px" :src="row.faceImgFull"
+                      :preview-src-list="[row.faceImgFull]">
+            </el-image>
           </template>
         </el-table-column>
         <el-table-column prop="phone" label="鎵嬫満鍙�" min-width="100px"></el-table-column>
@@ -85,13 +98,21 @@
           </template>
         </el-table-column>
         <el-table-column prop="companyName" label="鎵�灞為儴闂�" min-width="100px"></el-table-column>
-        <el-table-column prop="status" label="鐘舵��" min-width="100px">
+        <el-table-column prop="postionName" label="宀椾綅" min-width="100px"></el-table-column>
+        <el-table-column prop="isDangyuan" label="鏄惁鍏氬憳" min-width="100px">
+          <template slot-scope="{row}">
+            <span v-if="row.statusisDangyuan == 0" style="color: green">鏄�</span>
+            <span v-else >鍚�</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="jobDate" label="鍏ヨ亴鏃ユ湡" min-width="100px">  </el-table-column>
+<!--        <el-table-column prop="status" label="鐘舵��" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.status == 0" style="color: green">姝e父</span>
             <span v-if="row.status == 1" style="color: red">绂佺敤</span>
             <span v-if="row.status == 2" style="color: red">鎷夐粦/鍐荤粨</span>
           </template>
-        </el-table-column>
+        </el-table-column>-->
         <el-table-column label="閮ㄩ棬绫诲瀷" min-width="100px">
           <template slot-scope="{row}">
             <span v-if="row.companyType == 0">鐩稿叧鏂圭粍缁�</span>
@@ -152,13 +173,6 @@
         </el-table-column>
         <el-table-column prop="editorName" label="鎿嶄綔浜�" min-width="100px"></el-table-column>
         <el-table-column prop="editDate" label="鏈�鍚庢搷浣滄椂闂�" min-width="150px"></el-table-column>
-        <el-table-column fixed="right" label="浜鸿劯淇℃伅" min-width="100px">
-          <template slot-scope="{row}">
-            <el-image v-if="row.faceImgFull" style="width: 60px; height: 60px" :src="row.faceImgFull"
-              :preview-src-list="[row.faceImgFull]">
-            </el-image>
-          </template>
-        </el-table-column>
         <el-table-column
           v-if="containPermissions(['business:member:update', 'business:member:delete', 'business:empower:create'])"
           label="鎿嶄綔" min-width="280" fixed="right">
@@ -200,12 +214,13 @@
 import OperaTrainTimeImportWindow from '@/components/business/OperaTrainTimeImportWindow'
 import OperaMemberRoleWindow from '@/components/business/OperaMemberRoleWindow'
 import { fetchList } from '@/api/business/company'
+import { fetchList as positionList } from '@/api/business/position'
 import { memberSync, roleAuth, updateCanVisit, updateHead, updateWorkStatus } from '@/api/business/member'
 export default {
   name: 'internalMember',
   extends: BaseTable,
   components: { TableLayout1, Pagination, Tree, cardOpeningRecord, OperaMemberWindow, OperaMemberRoleWindow, OperaMemberImportWindow, OperaTrainTimeImportWindow },
-  data() {
+  data () {
     return {
       TreeList: [],
       // 鎼滅储
@@ -219,6 +234,8 @@
         type: 2,
         companyType: 0,
         erpOrgId: '',
+        workStatus: '',
+        positionId: '',
         companyId: '',
         hasFace: ''
       },
@@ -230,7 +247,7 @@
       department: []
     }
   },
-  created() {
+  created () {
     this.config({
       module: '浜哄憳淇℃伅琛�',
       api: '/business/member',
@@ -239,9 +256,10 @@
     })
     // this.search()
     this.getfindCompanyTreePage()
+    this.getPositionList()
   },
   methods: {
-    startEmpowerBatch() {
+    startEmpowerBatch () {
       if (this.tableData.selectedRows.length === 0) {
         this.$tip.warning('璇疯嚦灏戦�夋嫨涓�鏉℃暟鎹�')
         return
@@ -254,7 +272,13 @@
       })
       this.$refs.OperaMemberRoleWindow.open('鍐呴儴鍛樺伐涓嬪彂鏉冮檺', ids, names, this.searchForm.companyType)
     },
-    empower(id) {
+    getPositionList () {
+      positionList({})
+        .then(res => {
+          this.positionList = res
+        })
+    },
+    empower (id) {
       var that = this
       this.$confirm('纭畾閲嶆柊鎺堟潈鍚�?', '鎻愮ず', {
         confirmButtonText: '纭畾',
@@ -271,7 +295,7 @@
       })
     },
     // 鑾峰彇缁勭粐鏍�
-    getfindCompanyTreePage() {
+    getfindCompanyTreePage () {
       fetchList()
         .then(res => {
           if (res && res.length > 0) {
@@ -283,7 +307,7 @@
           }
         })
     },
-    getDepartmentTree(tree) {
+    getDepartmentTree (tree) {
       if (tree == null) {
         return []
       }
@@ -298,7 +322,7 @@
           newItem.children = this.getDepartmentTree(newItem.children)
         }
         if (newItem.type === this.searchForm.companyType) {
-          //newItem.disabled =false
+          // newItem.disabled =false
         } else {
           newItem.disabled = true
         }
@@ -306,7 +330,7 @@
       })
     },
     // 鍚屾淇℃伅
-    async synchronous() {
+    async synchronous () {
       this.$dialog.actionConfirm('璇ユ搷浣滈檷瑙﹀彂鍏ㄥ憳淇℃伅鏇存柊鍜岄噸鏂颁笅鍙戯紒璇疯皑鎱庢搷浣�', '鎮ㄧ‘璁ゅ叏閲忓悓姝ュ唴閮ㄤ汉鍛樹俊鎭悧锛�')
         .then(() => {
           this.loading = true
@@ -324,7 +348,7 @@
         })
         .catch(() => { })
     },
-    async updateHead(row, type) {
+    async updateHead (row, type) {
       this.$dialog.actionConfirm('鎮ㄧ‘璁よ繘琛屽綋鍓嶆搷浣滃悧锛�', '閮ㄩ棬涓荤璁剧疆鎿嶄綔鎻愮ず')
         .then(() => {
           this.heading = true
@@ -342,7 +366,7 @@
             .catch(() => { })
         })
     },
-    changeWorkStatus(e, row) {
+    changeWorkStatus (e, row) {
       this.working = true
       updateWorkStatus({ id: row.id, workStatus: e })
         .then(res => {
@@ -357,7 +381,7 @@
         })
         .catch(() => { })
     },
-    changeCanvisit(e, row) {
+    changeCanvisit (e, row) {
       this.canvisiting = true
       updateCanVisit({ id: row.id, canVisit: e })
         .then(res => {
@@ -372,7 +396,7 @@
         })
         .catch(() => { })
     },
-    callback(row) {
+    callback (row) {
       this.searchForm.erpOrgId = row.erpId
       this.searchForm.companyId = row.id
       this.search()
diff --git a/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PositionCloudController.java b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PositionCloudController.java
new file mode 100644
index 0000000..b0a1e9c
--- /dev/null
+++ b/server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PositionCloudController.java
@@ -0,0 +1,99 @@
+package com.doumee.cloud.admin;
+
+import com.doumee.api.BaseController;
+import com.doumee.config.annotation.CloudRequiredPermission;
+import com.doumee.core.annotation.excel.ExcelExporter;
+import com.doumee.core.annotation.pr.PreventRepeat;
+import com.doumee.core.model.ApiResponse;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.core.utils.Constants;
+import com.doumee.dao.business.model.Position;
+import com.doumee.service.business.PositionService;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+
+import javax.servlet.http.HttpServletResponse;
+import java.util.ArrayList;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @since 2024/04/28 15:44
+ */
+@Api(tags = "宀椾綅淇℃伅琛�")
+@RestController
+@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/position")
+public class PositionCloudController extends BaseController {
+
+    @Autowired
+    private PositionService positionService;
+
+    @PreventRepeat
+    @ApiOperation("鏂板缓")
+    @PostMapping("/create")
+    @CloudRequiredPermission("business:position:create")
+    public ApiResponse create(@RequestBody Position position,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        position.setLoginUserInfo(this.getLoginUser(token));
+        return ApiResponse.success(positionService.create(position));
+    }
+
+    @ApiOperation("鏍规嵁ID鍒犻櫎")
+    @GetMapping("/delete/{id}")
+    @CloudRequiredPermission("business:position:delete")
+    public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        positionService.deleteById(id,this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鎵归噺鍒犻櫎")
+    @GetMapping("/delete/batch")
+    @CloudRequiredPermission("business:position:delete")
+    public ApiResponse deleteByIdInBatch(@RequestParam String ids,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        String [] idArray = ids.split(",");
+        List<Integer> idList = new ArrayList<>();
+        for (String id : idArray ){
+            idList.add(Integer.valueOf(id));
+        }
+        positionService.deleteByIdInBatch(idList,this.getLoginUser(token));
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鏍规嵁ID淇敼")
+    @PostMapping("/updateById")
+    @CloudRequiredPermission("business:position:update")
+    public ApiResponse updateById(@RequestBody Position position,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        position.setLoginUserInfo(this.getLoginUser(token));
+        positionService.updateById(position);
+        return ApiResponse.success(null);
+    }
+
+    @ApiOperation("鍒嗛〉鏌ヨ")
+    @PostMapping("/page")
+    @CloudRequiredPermission("business:position:query")
+    public ApiResponse<PageData<Position>> findPage (@RequestBody PageWrap<Position> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(positionService.findPage(pageWrap));
+    }
+    @ApiOperation("鏌ヨ鍏ㄩ儴")
+    @PostMapping("/list")
+    @CloudRequiredPermission("business:position:query")
+    public ApiResponse<List<Position>> findList (@RequestBody Position  pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(positionService.findList(pageWrap));
+    }
+
+    @ApiOperation("瀵煎嚭Excel")
+    @PostMapping("/exportExcel")
+    @CloudRequiredPermission("business:position:exportExcel")
+    public void exportExcel (@RequestBody PageWrap<Position> pageWrap, HttpServletResponse response,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        ExcelExporter.build(Position.class).export(positionService.findPage(pageWrap).getRecords(), "璁垮浜嬬敱淇℃伅琛�", response);
+    }
+
+    @ApiOperation("鏍规嵁ID鏌ヨ")
+    @GetMapping("/{id}")
+    @CloudRequiredPermission("business:position:query")
+    public ApiResponse findById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
+        return ApiResponse.success(positionService.findById(id));
+    }
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PositionMapper.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PositionMapper.java
new file mode 100644
index 0000000..a46fd1b
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PositionMapper.java
@@ -0,0 +1,12 @@
+package com.doumee.dao.business;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.doumee.dao.business.model.Position;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+public interface PositionMapper extends BaseMapper<Position> {
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
index a62910f..1cc108c 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java
@@ -160,6 +160,12 @@
     @ApiModelProperty(value = "鍦ㄨ亴鐘舵�� 0鍦ㄨ亴 1绂昏亴", example = "1")
     @ExcelColumn(name="鍦ㄨ亴鐘舵�� 0鍦ㄨ亴 1绂昏亴")
     private Integer workStatus;
+    @ApiModelProperty(value = "鏄惁鍏氬憳 0鍚� 1鏄�", example = "1")
+    @ExcelColumn(name="鏄惁鍏氬憳 0鍚� 1鏄�")
+    private Integer isDangyuan;
+    @ApiModelProperty(value = "宀椾綅缂栫爜锛屽叧鑱攑ositionbiao", example = "1")
+    @ExcelColumn(name="宀椾綅缂栫爜")
+    private Integer positionId;
     @ApiModelProperty(value = "ERP鏍囪瘑", example = "1")
     @ExcelColumn(name="ERP鏍囪瘑")
     private String erpId;
@@ -167,6 +173,10 @@
     @ApiModelProperty(value = "ERP鍚屾鏃堕棿")
     @ExcelColumn(name="ERP鍚屾鏃堕棿")
     private Date erpDate;
+    @ApiModelProperty(value = "鍏ヨ亴濡傛湡")
+    @ExcelColumn(name="鍏ヨ亴濡傛湡")
+    @JsonFormat(pattern = "yyyy-MM-dd")
+    private Date jobDate;
 
     @ApiModelProperty(value = "ERP鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�", example = "1")
     @ExcelColumn(name="ERP鍚屾鐘舵�� 0鏈悓姝� 1宸插悓姝�")
@@ -289,6 +299,9 @@
     @ApiModelProperty(value = "鏈�鍚庢搷浣滃唴瀹�")
     @TableField(exist = false)
     private String optRemark;
+    @ApiModelProperty(value = "宀椾綅鍚嶇О")
+    @TableField(exist = false)
+    private String positionName;
     @ApiModelProperty(value = "鍩硅寮�濮嬫椂闂�")
     @TableField(exist = false)
     private Date trainStartTime;
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Position.java b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Position.java
new file mode 100644
index 0000000..f10b48d
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Position.java
@@ -0,0 +1,84 @@
+package com.doumee.dao.business.model;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.doumee.core.annotation.excel.ExcelColumn;
+import com.doumee.core.model.LoginUserModel;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 鍒嗙被淇℃伅琛�
+ * @author 姹熻箘韫�
+ * @date 2023/11/30 15:33
+ */
+@Data
+@ApiModel("宀椾綅淇℃伅琛�")
+@TableName("`position`")
+public class Position extends LoginUserModel {
+
+    @TableId(type = IdType.AUTO)
+    @ApiModelProperty(value = "涓婚敭")
+    @ExcelColumn(name="涓婚敭")
+    private Integer id;
+
+    @ApiModelProperty(value = "鍒涘缓浜虹紪鐮�")
+    @ExcelColumn(name="鍒涘缓浜虹紪鐮�")
+    private Integer creator;
+
+    @ApiModelProperty(value = "鍒涘缓鏃堕棿")
+    @ExcelColumn(name="鍒涘缓鏃堕棿")
+    private Date createDate;
+
+    @ApiModelProperty(value = "鏇存柊浜虹紪鐮�")
+    @ExcelColumn(name="鏇存柊浜虹紪鐮�")
+    private Integer editor;
+
+    @ApiModelProperty(value = "鏇存柊鏃堕棿")
+    @ExcelColumn(name="鏇存柊鏃堕棿")
+    private Date editDate;
+
+    @ApiModelProperty(value = "鏄惁鍒犻櫎0鍚� 1鏄�")
+    @ExcelColumn(name="鏄惁鍒犻櫎0鍚� 1鏄�")
+    private Integer isdeleted;
+
+    @ApiModelProperty(value = "鍚嶇О")
+    @ExcelColumn(name="鍚嶇О")
+    private String name;
+
+    @ApiModelProperty(value = "澶囨敞")
+    @ExcelColumn(name="澶囨敞")
+    private String remark;
+
+    @ApiModelProperty(value = "鐘舵�� 0鍚敤 1绂佺敤")
+    @ExcelColumn(name="鐘舵�� 0鍚敤 1绂佺敤")
+    private Integer status;
+
+    @ApiModelProperty(value = "鎺掑簭鐮�")
+    @ExcelColumn(name="鎺掑簭鐮�")
+    private Integer sortnum;
+
+    @ApiModelProperty(value = "鍥炬爣")
+    @ExcelColumn(name="鍥炬爣")
+    private String imgurl;
+
+    @ApiModelProperty(value = "绫诲瀷 0鍛樺伐宀椾綅")
+    @ExcelColumn(name="绫诲瀷0鍛樺伐宀椾綅")
+    private Integer type;
+
+    @ApiModelProperty(value = "鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�")
+    @ExcelColumn(name="鐖剁骇缂栫爜锛堣嚜鍏宠仈锛�")
+    private Integer parentId;
+
+    @ApiModelProperty(value = "瀛愰泦鍒嗙被")
+    @TableField(exist = false)
+    private List<Position> childList;
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PositionService.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PositionService.java
new file mode 100644
index 0000000..732796c
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PositionService.java
@@ -0,0 +1,99 @@
+package com.doumee.service.business;
+
+import com.doumee.core.model.LoginUserInfo;
+import com.doumee.core.model.PageData;
+import com.doumee.core.model.PageWrap;
+import com.doumee.dao.business.model.Position;
+
+import java.util.List;
+
+/**
+ * 璁垮浜嬬敱淇℃伅琛⊿ervice瀹氫箟
+ * @author 姹熻箘韫�
+ * @since 2024/04/28 15:44
+ */
+public interface PositionService {
+
+    /**
+     * 鍒涘缓
+     * 
+     * @param position 瀹炰綋瀵硅薄
+     * @return Integer
+     */
+    Integer create(Position position);
+
+    /**
+     * 涓婚敭鍒犻櫎
+     *
+     * @param id 涓婚敭
+     */
+    void deleteById(Integer id, LoginUserInfo userInfo);
+
+    /**
+     * 鍒犻櫎
+     *
+     * @param position 瀹炰綋瀵硅薄
+     */
+    void delete(Position position, LoginUserInfo userInfo);
+
+    /**
+     * 鎵归噺涓婚敭鍒犻櫎
+     *
+     * @param ids 涓婚敭闆�
+     */
+    void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo);
+
+    /**
+     * 涓婚敭鏇存柊
+     *
+     * @param position 瀹炰綋瀵硅薄
+     */
+    void updateById(Position position);
+
+    /**
+     * 鎵归噺涓婚敭鏇存柊
+     *
+     * @param positions 瀹炰綋闆�
+     */
+    void updateByIdInBatch(List<Position> positions);
+
+    /**
+     * 涓婚敭鏌ヨ
+     *
+     * @param id 涓婚敭
+     * @return Position
+     */
+    Position findById(Integer id);
+
+    /**
+     * 鏉′欢鏌ヨ鍗曟潯璁板綍
+     *
+     * @param position 瀹炰綋瀵硅薄
+     * @return Position
+     */
+    Position findOne(Position position);
+
+    /**
+     * 鏉′欢鏌ヨ
+     *
+     * @param position 瀹炰綋瀵硅薄
+     * @return List<Position>
+     */
+    List<Position> findList(Position position);
+  
+    /**
+     * 鍒嗛〉鏌ヨ
+     *
+     * @param pageWrap 鍒嗛〉瀵硅薄
+     * @return PageData<Position>
+     */
+    PageData<Position> findPage(PageWrap<Position> pageWrap);
+
+    /**
+     * 鏉′欢缁熻
+     *
+     * @param position 瀹炰綋瀵硅薄
+     * @return long
+     */
+    long count(Position position);
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
index 0d64ceb..2418a69 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -327,7 +327,7 @@
         if (StringUtils.isBlank(member.getPhone())||!PhoneUtil.isPhone(member.getPhone())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"鐢佃瘽鍙风爜鏍煎紡鏈夎");
         }
-        if (StringUtils.isBlank(member.getIdcardNo())||!IdcardUtil.isValidCard(member.getIdcardNo())){
+        if (StringUtils.isNotBlank(member.getIdcardNo()) && !IdcardUtil.isValidCard(member.getIdcardNo())){
             throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"韬唤璇佸彿鏍煎紡鏈夎");
         }
         if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
@@ -396,7 +396,8 @@
         }
         if (StringUtils.isNotBlank(member.getIdcardNoNew())){
             String encrptNo = (DESUtil.encrypt(Constants.EDS_PWD, member.getIdcardNoNew()));//韬唤璇佸彿鍔犲瘑
-            if(!isDebug &&  !StringUtils.equals(model.getIdcardNo(),encrptNo)&& !IdcardUtil.isValidCard(member.getIdcardNoNew())){
+            if(!isDebug && StringUtils.isNotBlank(member.getIdcardNoNew()) &&
+                    !StringUtils.equals(model.getIdcardNo(),encrptNo)&& !IdcardUtil.isValidCard(member.getIdcardNoNew())){
                 //濡傛灉鍙戠敓鏀瑰彉锛屽苟涓斾笉鍚堟硶锛屾彁绀哄紓甯�
                 throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"淇敼鐨勬柊韬唤璇佸彿鏍煎紡鏈夎");
             }
@@ -1109,6 +1110,8 @@
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
         queryWrapper.selectAll(Member.class)
                 .selectAs(Company::getName,Member::getCompanyName) ;
+        queryWrapper.selectAs(Position::getName,Member::getPositionName);
+        queryWrapper.leftJoin(Position.class,Position::getId,Member::getPositionId);
         if(StringUtils.isNotBlank(member.getName())){
             queryWrapper.like(Member::getName,member.getName());
         }
@@ -1140,6 +1143,8 @@
                 .eq(Member::getType,Constants.TWO)
                 .exists("select b.id from car_driver b where b.isdeleted=0 and b.member_id=t.id");
 
+        queryWrapper.selectAs(Position::getName,Member::getPositionName);
+        queryWrapper.leftJoin(Position.class,Position::getId,Member::getPositionId);
         if(null != member.getType()) {
             queryWrapper.eq(Member::getType,member.getType());
         }
@@ -1353,6 +1358,8 @@
         queryWrapper.select(" ( select count(1) from member_card mc where mc.isdeleted = 0 and  mc.member_id = t.id ) as  memberCardCount ");
         queryWrapper.leftJoin(SystemUser.class,SystemUser::getId,Member::getEditor);
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
+        queryWrapper.selectAs(Position::getName,Member::getPositionName);
+        queryWrapper.leftJoin(Position.class,Position::getId,Member::getPositionId);
         queryWrapper.eq(Member::getType,pageWrap.getModel().getType());
 //        queryWrapper.eq(Objects.nonNull(model.getCompanyId()),Member::getCompanyId,model.getCompanyId())
         queryWrapper.in(Objects.nonNull(pageWrap.getModel().getCompanyIds())&&pageWrap.getModel().getCompanyIds().size()>0,
@@ -1451,6 +1458,8 @@
         queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
         queryWrapper.selectAll(Member.class)
                 .selectAs(Company::getName,Member::getCompanyName)
+        .selectAs(Position::getName,Member::getPositionName)
+         .leftJoin(Position.class,Position::getId,Member::getPositionId)
                 .selectAs(Member::getLastVisitDate,Member::getLastVisitDate)
                 .select(" (select count(v.id) from visits v where v.MEMBER_ID=t.id and v.ISDELETED=0 and v.status  in (7,8) ) as visitTimes");
         queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getName()),Member::getName,pageWrap.getModel().getName())
@@ -1500,6 +1509,8 @@
                 .eq(Objects.nonNull(pageWrap.getModel().getCode()),Member::getCode,pageWrap.getModel().getCode())
                 .orderByDesc(Member::getCreateDate);
 
+        queryWrapper.selectAs(Position::getName,Member::getPositionName);
+        queryWrapper.leftJoin(Position.class,Position::getId,Member::getPositionId);
 
         IPage<Member> memberIPage = memberJoinMapper.selectJoinPage(page, Member.class,queryWrapper);
         return PageData.from(memberIPage);
@@ -1696,6 +1707,8 @@
                 .selectAll(Member.class)
                         .selectAs(Company::getName,Member::getCompanyName)
                 .leftJoin(Company.class,Company::getId,Member::getCompanyId)
+                .selectAs(Position::getName,Member::getPositionName)
+                .leftJoin(Position.class,Position::getId,Member::getPositionId)
                 .eq(StringUtils.isNotBlank(checkVisitedDTO.getMobile()),Member::getPhone,checkVisitedDTO.getMobile())
                 .eq(StringUtils.isNotBlank(checkVisitedDTO.getName()),Member::getName,checkVisitedDTO.getName())
                 .eq(Member::getIsdeleted,Constants.ZERO)
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PositionServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PositionServiceImpl.java
new file mode 100644
index 0000000..4b518a6
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PositionServiceImpl.java
@@ -0,0 +1,146 @@
+package com.doumee.service.business.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.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.business.PositionMapper;
+import com.doumee.dao.business.model.Position;
+import com.doumee.service.business.PositionService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.CollectionUtils;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * 璁垮浜嬬敱淇℃伅琛⊿ervice瀹炵幇
+ * @author 姹熻箘韫�
+ * @since 2024/04/28 15:44
+ */
+@Service
+public class PositionServiceImpl implements PositionService {
+
+    @Autowired
+    private PositionMapper positionMapper;
+
+    @Override
+    public Integer create(Position model) {
+        model.setCreator(model.getLoginUserInfo().getId());
+        model.setEditor(model.getCreator());
+        model.setIsdeleted(Constants.ZERO);
+        model.setEditDate(new Date());
+        model.setCreateDate(model.getEditDate());
+        positionMapper.insert(model);
+        return model.getId();
+    }
+
+    @Override
+    public void deleteById(Integer id, LoginUserInfo userInfo) {
+        Position update = new Position();
+        update.setEditor(userInfo.getId());
+        update.setEditDate(new Date());
+        update.setIsdeleted(Constants.ONE);
+        update.setId(id);
+        positionMapper.updateById(update);
+
+    }
+
+    @Override
+    public void delete(Position position, LoginUserInfo userInfo) {
+        UpdateWrapper<Position> deleteWrapper = new UpdateWrapper<>(position);
+        positionMapper.delete(deleteWrapper);
+    }
+
+    @Override
+    public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo) {
+        if (CollectionUtils.isEmpty(ids)) {
+            return;
+        }
+        for(Integer id :ids){
+         deleteById(id,userInfo);
+        }
+    }
+
+    @Override
+    public void updateById(Position model) {
+        model.setEditor(model.getLoginUserInfo().getId());
+        model.setEditDate(new Date());
+        positionMapper.updateById(model);
+    }
+
+    @Override
+    public void updateByIdInBatch(List<Position> positions) {
+        if (CollectionUtils.isEmpty(positions)) {
+            return;
+        }
+        for (Position position: positions) {
+            this.updateById(position);
+        }
+    }
+
+    @Override
+    public Position findById(Integer id) {
+        return positionMapper.selectById(id);
+    }
+
+    @Override
+    public Position findOne(Position position) {
+        QueryWrapper<Position> wrapper = new QueryWrapper<>(position);
+        return positionMapper.selectOne(wrapper);
+    }
+
+    @Override
+    public List<Position> findList(Position position) {
+        QueryWrapper<Position> wrapper = new QueryWrapper<>(position);
+        wrapper.eq("isdeleted",Constants.ZERO);
+        return positionMapper.selectList(wrapper);
+    }
+  
+    @Override
+    public PageData<Position> findPage(PageWrap<Position> pageWrap) {
+        IPage<Position> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
+        QueryWrapper<Position> queryWrapper = new QueryWrapper<>();
+        Utils.MP.blankToNull(pageWrap.getModel());
+        pageWrap.getModel().setIsdeleted(Constants.ZERO);
+        queryWrapper.lambda()
+                .eq(pageWrap.getModel().getId() != null, Position::getId, pageWrap.getModel().getId())
+                .eq(pageWrap.getModel().getCreator() != null, Position::getCreator, pageWrap.getModel().getCreator())
+                .ge(pageWrap.getModel().getCreateDate() != null, Position::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate()))
+                .le(pageWrap.getModel().getCreateDate() != null, Position::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate()))
+                .eq(pageWrap.getModel().getEditor() != null, Position::getEditor, pageWrap.getModel().getEditor())
+                .ge(pageWrap.getModel().getEditDate() != null, Position::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate()))
+                .le(pageWrap.getModel().getEditDate() != null, Position::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate()))
+                .eq(pageWrap.getModel().getIsdeleted() != null, Position::getIsdeleted, pageWrap.getModel().getIsdeleted())
+                .eq(pageWrap.getModel().getRemark() != null, Position::getRemark, pageWrap.getModel().getRemark())
+                .like(pageWrap.getModel().getName() != null, Position::getName, pageWrap.getModel().getName())
+                .eq(pageWrap.getModel().getSortnum() != null, Position::getSortnum, pageWrap.getModel().getSortnum())
+                .eq(pageWrap.getModel().getType() != null, Position::getType, pageWrap.getModel().getType())
+                .orderByAsc(Position::getSortnum)
+        ;
+        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
+            if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) {
+                queryWrapper.orderByDesc(sortData.getProperty());
+            } else {
+                queryWrapper.orderByAsc(sortData.getProperty());
+            }
+        }
+        return PageData.from(positionMapper.selectPage(page, queryWrapper));
+    }
+
+    @Override
+    public long count(Position position) {
+        QueryWrapper<Position> wrapper = new QueryWrapper<>(position);
+        return positionMapper.selectCount(wrapper);
+    }
+
+
+
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
index 5985abd..e0b6ba6 100644
--- a/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java
@@ -199,27 +199,31 @@
                     .eq(Device::getDoorId,request.getSrcIndex())
                     .eq(Device::getIsdeleted,Constants.ZERO)
                     .last("limit 1" ));
-            if(d!=null && !(Constants.equalsInteger(d.getIsEntrance(),Constants.ONE) && Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE)){
-                //濡傛灉鏄繘闂紝褰曞叆浜哄憳鐨勫湪鍦烘暟鎹褰�
-                inoutDayCount.setInMemberNum(Constants.formatIntegerNum(inoutDayCount.getInMemberNum())+1);//鍏ュ満浜烘
-            }else{
-                inoutDayCount.setOutMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutMemberNum())+1);//绂诲満浜烘
+            if(d!=null && !Constants.equalsInteger(d.getIsEntrance(),Constants.ONE)){
+                if(Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE){
+                    //濡傛灉鏄繘闂紝褰曞叆浜哄憳鐨勫湪鍦烘暟鎹褰�
+                    inoutDayCount.setInMemberNum(Constants.formatIntegerNum(inoutDayCount.getInMemberNum())+1);//鍏ュ満浜烘
+                }else{
+                    inoutDayCount.setOutMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutMemberNum())+1);//绂诲満浜烘
+                }
             }
             if(member !=null){
-                delRetentionLis.add(member.getId());
-                if(d!=null && !(Constants.equalsInteger(d.getIsEntrance(),Constants.ONE) && Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE)){
-                    //濡傛灉鏄繘闂紝褰曞叆浜哄憳鐨勫湪鍦烘暟鎹褰�
-                    retentionList.add(getRetentionModelByRequest(member,request));
-                    if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
-                        inoutDayCount.setInSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getInSelfMemberNum())+1);//鍐呴儴浜哄憳鍏ュ満浜烘
+                if(d!=null && !Constants.equalsInteger(d.getIsEntrance(),Constants.ONE)){
+                    delRetentionLis.add(member.getId());
+                    if( Constants.formatIntegerNum(request.getData().getExtEventInOut()) != Constants.ONE){
+                        //濡傛灉鏄繘闂紝褰曞叆浜哄憳鐨勫湪鍦烘暟鎹褰�
+                        retentionList.add(getRetentionModelByRequest(member,request));
+                        if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
+                            inoutDayCount.setInSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getInSelfMemberNum())+1);//鍐呴儴浜哄憳鍏ュ満浜烘
+                        }else{
+                            inoutDayCount.setInOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getInOtherMemberNum())+1);//鐩稿叧鏂瑰叆鍦轰汉娆�
+                        }
                     }else{
-                        inoutDayCount.setInOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getInOtherMemberNum())+1);//鐩稿叧鏂瑰叆鍦轰汉娆�
-                    }
-                }else{
-                    if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
-                        inoutDayCount.setOutSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutSelfMemberNum())+1);//鍐呴儴浜哄憳鍑哄満浜烘
-                    }else{
-                        inoutDayCount.setOutOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutOtherMemberNum())+1);//鐩稿叧鏂瑰嚭鍦轰汉娆�
+                        if(Constants.equalsInteger(member.getCompanyType(),Constants.ONE)){
+                            inoutDayCount.setOutSelfMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutSelfMemberNum())+1);//鍐呴儴浜哄憳鍑哄満浜烘
+                        }else{
+                            inoutDayCount.setOutOtherMemberNum(Constants.formatIntegerNum(inoutDayCount.getOutOtherMemberNum())+1);//鐩稿叧鏂瑰嚭鍦轰汉娆�
+                        }
                     }
                 }
             }

--
Gitblit v1.9.3