liukangdong
2024-10-15 dc79419f90bd4b9622e06320e15e3e056c13d89b
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加8个文件
已修改6个文件
910 ■■■■■ 文件已修改
admin/src/api/business/position.js 42 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaMemberWindow.vue 43 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaPositionWindow.vue 75 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/internalMember.vue 80 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/position.vue 82 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/business/relativeMember.vue 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/PositionCloudController.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/PositionMapper.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Member.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Position.java 84 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/PositionService.java 99 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/PositionServiceImpl.java 146 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/hksync/HkSyncPushServiceImpl.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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
    }
  })
}
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>
</style>
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>
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="正常" 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">正常</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
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>
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="正常" 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">正常</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()
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));
    }
}
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> {
}
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 = "岗位编码,关联positionbiao", 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;
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;
}
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;
/**
 * è®¿å®¢äº‹ç”±ä¿¡æ¯è¡¨Service定义
 * @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);
}
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)
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;
/**
 * è®¿å®¢äº‹ç”±ä¿¡æ¯è¡¨Service实现
 * @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);
    }
}
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);//相关方出场人次
                        }
                    }
                }
            }