liukangdong
2024-05-30 2edfe17a39cb5aa653318cad9474d18fbdaa204e
Merge branch 'master' of http://139.186.142.91:10010/r/productDev/dmvisit
已添加8个文件
已修改28个文件
1564 ■■■■ 文件已修改
admin/src/api/business/carUseBook.js 47 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/member.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_chaosong.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_dangqian.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_duoren.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_grey.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_jujue.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/assets/icons/ic_tongguo.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue 522 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 76 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/utils/request.js 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/danger/record.vue 18 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/operation/serviceCar/apprRecord.vue 307 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/api/system/SystemController.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/core/utils/Constants.java 21 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/InternalWebController.java 52 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java 11 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveDataVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/MemberVO.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java 257 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerLogServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java 88 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java 14 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/api/business/carUseBook.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,47 @@
import request from '../../utils/request'
// æŸ¥è¯¢
export function fetchList (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/page', data, {
    trim: true
  })
}
// æŸ¥è¯¢
export function findLogList (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBookLog/findList', data, {
    trim: true
  })
}
// åˆ›å»º
export function create (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/create', data)
}
export function transfercarUseBook (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/transfercarUseBook', data)
}
export function dealcarUseBook (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/dealcarUseBook', data)
}
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/visitsAdmin/cloudService/business/carUseBook/updateById', data)
}
// åˆ é™¤
export function deleteById (id) {
  return request.get(`/visitsAdmin/cloudService/business/carUseBook/delete/${id}`)
}
// æ ¹æ®ID查询
export function detail(id) {
  return request.get(`/visitsAdmin/cloudService/business/carUseBook/${id}`)
}
// æ‰¹é‡åˆ é™¤
export function deleteByIdInBatch (ids) {
  return request.get('/visitsAdmin/cloudService/business/carUseBook/delete/batch', {
    params: {
      ids
    }
  })
}
admin/src/api/business/member.js
@@ -10,13 +10,15 @@
  })
}
export function allList (data) {
  // return request.post('/business/member/page', data, {
  //   trim: true
  // })
  return request.post('/visitsAdmin/cloudService/business/member/list', data, {
    trim: true
  })
}
export function driveList (data) {
  return request.post('/visitsAdmin/cloudService/business/member/driveList', data, {
    trim: true
  })
}
// éƒ¨é—¨ä¿¡æ¯åŒæ­¥
export function memberSync (data) {
  return request.post('/visitsAdmin/cloudService/business/member/syncAll', data)
admin/src/assets/icons/ic_chaosong.png
admin/src/assets/icons/ic_dangqian.png
admin/src/assets/icons/ic_duoren.png
admin/src/assets/icons/ic_grey.png
admin/src/assets/icons/ic_jujue.png
admin/src/assets/icons/ic_tongguo.png
admin/src/components/business/OperaCarUseBookWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,522 @@
<template>
  <GlobalWindow
      :title="title"
      :visible.sync="visible"
      @confirm="confirm"
  >
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <div class="left">
            <div class="h1">公务车申请</div>
            <div class="time">提交时间:{{model.createDate}}</div>
          </div>
          <span class="right"  v-if="model.status === 0">申请中</span>
          <span class="right"  v-if="model.status === 1">待审批</span>
          <span class="right" style="background:#53b76f " v-if="model.status === 2">审批通过</span>
          <span class="right" style="background:#dc362e " v-if="model.status === 3">审批不通过</span>
          <span class="right" style="background:#dc362e " v-if="model.status === 4">已取消</span>
        </div>
        <div class="info">
          <div class="title">公务车申请信息</div>
          <div class="list">
            <div class="item" style="width: 100%">
              <div class="label">申请人</div>
              <div class="value">{{model.memberName || ''}} {{model.memberPhone || ''}} ({{model.companyName || ''}})</div>
            </div>
            <div class="item">
              <div class="label">申请车辆</div>
              <div class="value">{{model.carCode || ''}}</div>
            </div>
            <div class="item">
              <div class="label">司机信息</div>
              <div class="value" v-if="model.driverId !=null">{{model.driverName || ''}} {{model.driverPhone || ''}}</div>
              <div class="value" v-if="model.driverId ==null">未指派</div>
            </div>
            <div class="item"  >
            <div class="label">用车事由</div>
            <div class="value">{{model.content}}</div>
          </div>
            <div class="item">
              <div class="label">乘车人员</div>
              <div class="value">{{model.memberNames || ''}}</div>
            </div>
            <div class="item">
              <div class="label">目的地类别</div>
              <div class="value status-green" v-if="model.type === 0">【市内用车】</div>
              <spdivan class="value status-red"   v-if="model.type === 1">【市内用车】</spdivan>
            </div>
            <div class="item">
              <div class="label">目的地</div>
              <div class="value">{{model.addr || ''}}</div>
            </div>
            <div class="item">
              <div class="label">预计出发时间</div>
              <div class="value">{{model.planUseDate || ''}}</div>
            </div>
            <div class="item">
              <div class="label">用车时段</div>
              <div class="value">始:{{model.startTime || ''}}<br>æ­¢:{{model.endTime || ''}}</div>
            </div>
          </div>
        </div>
      </div>
      <div class="side">
        <div class="side_title">审批流程</div>
        <div class="list"  v-if="model.approveDateVO !=null && model.approveDateVO.approveList !=null">
          <div class="item" v-for="(item,index) in model.approveDateVO.approveList" :key="item.id">
            <div class="separate" v-if=" (index < model.approveDateVO.approveList.length-1)"></div>
            <div class="info">
              <img src="@/assets/icons/ic_tongguo.png"   class="iconnew" v-if="(item.status ==2)"/>
              <img src="@/assets/icons/ic_dangqian.png"   class="iconnew"  v-if="(item.status==1)"/>
              <img src="@/assets/icons/ic_jujue.png"  class="iconnew"  v-if="(item.status==3)"></i>
              <img src="@/assets/icons/ic_grep.png"  class="iconnew" v-if="(item.status==null || item.status==0 )"></i>
              <div style="display: inline" v-if="item.approveType ===0">
                <img v-if="item.faceImg!=null && item.faceImg !=''" :src="item.faceImg" class="avatar" alt="" />
                <img v-if="item.faceImg ==null ||item.faceImg ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
              </div>
              <div style="display: inline" v-if="item.approveType ===1">
                <img v-if="item.status === 1"  src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
                <img  v-if="item.status != 1"  src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
              </div>
              <div class="content">
                <div class="line">
                  <div class="name">{{ item.title}}</div>
                  <div class="time">{{ item.createDate }}</div>
                </div>
                <div class="line">
                  <div class="company">
                    {{ item.createUserName }} {{ item.companyName }}
                    <div style="display: inline" v-if="item.statusInfo!=null && item.statusInfo!=''">
                       <span class="status-green">{{item.statusInfo||''}}</span>)
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div v-if="item.approveType != 1 " class="remark">
              {{ item.checkInfo ||'水电费反反复复反反复复方法方法方法方法方法方法方法方法方法方法方法方法发发发' }}
            </div>
            <div v-if="item.approveType == 1 "  class="childList">
              <div style="display: inline" v-for="item1 in item.approveList" :key="item1.id">
                <img v-if="item1.faceImg!=null && item1.faceImg !=''" :src="item1.faceImg" class="avatar" alt="" />
                <img v-if="item1.faceImg ==null ||item1.faceImg ==''"  src="@/assets/avatar/man.png" class="avatar" alt="" />
                <span style="display: inline-block"> {{item1.memberName}}</span>
              </div>
            </div>
          </div>
        </div>
      </div>
    </div>
    <!--  -->
    <template   v-slot:footer>
      <el-button @click="isShowProblem = true"  type="primary"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  class="status-red">同意</el-button>
      <el-button @click="isBackProblem=true"  type="danger"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  >拒绝</el-button>
      <el-button @click="visible=false">返回</el-button>
    </template>
    <el-dialog
        append-to-body
        title="同意申请"
        class="dialogCl"
        :visible.sync="isShowProblem"
        width="480px"
    >
      <el-form :model="dealForm" ref="dealForm" >
        <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.drvierParam ===1">
          <el-select v-model="transForm.driverId" style="width: 300px"  filterable clearable placeholder="请选择派遣司机">
            <el-option
                v-for="item in memberList"
                :key="item.id"
                :label="item.name+'-'+item.phone"
                :value="item.id">
            </el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="同意说明">
          <el-input
              type="textarea"
              placeholder="请填写说明"
              :rows="4"
              v-model="backForm.checkInfo"
          />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isShowProblem = false">取消</el-button>
        <el-button type="primary" :loading="dealing" @click="dealDo">确定</el-button>
      </span>
    </el-dialog>
    <el-dialog
        append-to-body
        title="拒绝申请"
        class="dialogCl"
        :visible.sync="isBackProblem"
        width="600px"
    >
      <el-form :model="backForm"  ref="backForm" label-width="100px">
        <el-form-item label="拒绝说明">
          <el-input
              type="textarea"
              placeholder="请填写说明"
              :rows="4"
              v-model="backForm.checkInfo"
          />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="isBackProblem= false">取消</el-button>
        <el-button type="primary" :loading="dealing" @click="backDo">确定</el-button>
      </span>
    </el-dialog>
  </GlobalWindow>
</template>
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import { driveList } from '@/api/business/member'
import { mapState } from 'vuex'
export default {
  name: 'OperaCarUseBookWindow',
  components: { GlobalWindow },
  extends: BaseOpera,
  data () {
    return {
      title: '公务车申请',
      visible: false,
      dataId: null,
      model: { },
      dealing: false,
      isShowProblem: false,
      isBackProblem: false,
      memberList: [],
      dealForm: {
        driveId: null,
        checkInfo: null
      },
      backForm: {
        checkInfo: null
      }
    }
  },
  computed: {
    ...mapState(['userInfo'])
  },
  created () {
    this.config({
      api: '/business/carUseBook',
      'field.id': 'id'
    })
  },
  methods: {
    dealDo () {
      this.$refs.dealForm.validate((valid) => {
        if (!valid) {
          return
        }
        this.$dialog.actionConfirm('操作确认', '您确认提交该隐患处理情况吗?')
          .then(() => {
            this.dealing = true
            this.api.dealHiddenDanger({
              id: this.dataId,
              status: 1,
              driverId: this.dealForm.driveId,
              checkInfo: this.dealForm.checkInfo
            })
              .then(res => {
                this.$tip.apiSuccess('处理成功')
                this.getDetail()
                this.isShowProblem = false
              })
              .finally(() => {
                this.dealing = false
              })
          })
      })
    },
    backDo () {
      this.$refs.backForm.validate((valid) => {
        if (!valid) {
          return
        }
        this.$dialog.actionConfirm('操作确认', '您确认退回该隐患处理情况吗?')
          .then(() => {
            this.dealing = true
            this.api.dealHiddenDanger({
              id: this.dataId,
              status: 2,
              checkInfo: this.backForm.checkInfo
            })
              .then(res => {
                this.$tip.apiSuccess('退回成功')
                this.getDetail()
                this.isBackProblem = false
              })
              .catch(e => {
              })
              .finally(() => {
                this.dealing = false
              })
          })
      })
    },
    open (title, target) {
      this.title = title
      this.visible = true
      this.model = {}
      this.dataId = target.id
      this.$nextTick(() => {
        this.memberList = []
        this.dealForm = {
          driveId: null,
          checkInfo: null
        }
        this.backForm = {
          checkInfo: null
        }
        this.getDetail()
      })
    },
    getDetail () {
      this.api.detail(this.dataId)
        .then(res => {
          this.model = res
          this.dealForm.driveId = res.driveId
        })
    },
    handleTransfer () {
      this.isShowTransfer = true
      this.loadMemberList()
    },
    loadMemberList () {
      driveList({}).then(res => {
        this.memberList = res
      })
    }
  }
}
</script>
<style lang="scss" scoped>
.side_title{
  font-weight: 600;
  font-size: 18px;
  color: #111111;
  margin-bottom: 20px;
  margin-left: 20px;
  margin-top: 20px;
}
.upload_box {
  width: 84px;
  height: 84px;
  border-radius: 4px;
  background-color: #f7f7f7;
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  color: #999999;
  border: 1px solid #e4e4e4;
  .icon {
    font-size: 24px;
  }
  .text {
    font-size: 12px;
  }
}
.modal_wrap {
  display: flex;
  height: 100%;
  .modal_content {
    flex: 1;
    padding: 0px 30px;
    border-radius: 8px;
    overflow: hidden;
    height: 100%;
    .title {
      font-weight: 600;
      font-size: 18px;
      color: #333333;
      margin-bottom: 20px;
      margin-top: 30px;
    }
    .info {
      .list {
        display: flex;
        flex-wrap: wrap;
        .item {
          display: flex;
          width: 40%;
          margin-bottom: 20px;
          &:nth-of-type(2n) {
            width: 60%;
          }
          .label {
            color: #888888;
            width: 100px;
          }
          .value {
            color: #111111;
          }
        }
      }
    }
    .header {
      display: flex;
      justify-content: space-between;
      align-items: center;
      padding: 20px 30px;
      margin: 0 -30px;
      border-radius: 8px 8px 0 0;
      background: linear-gradient(to right, #f2f6fe, #cadffa);
      .h1 {
        font-weight: 600;
        font-size: 22px;
        color: #111111;
        margin-bottom: 8px;
      }
      .time {
        font-size: 14px;
        color: #999999;
      }
      .right {
        height: 40px;
        font-size: 16px;
        color: #ffffff;
        line-height: 40px;
        padding: 0 20px;
        background: #207ff7;
        box-shadow: 4px 4px 0px 0px rgba(32, 127, 247, 0.16);
        border-radius: 16px 0px 16px 0px;
      }
    }
    .table_info {
      .name_wrap {
        display: flex;
        align-items: center;
        .avatar {
          width: 40px;
          height: 40px;
          border-radius: 50%;
          margin-right: 12px;
        }
        .content {
          .line {
            display: flex;
          }
          .tag {
            color: #b2cbf9;
            border: 1px solid #b2cbf9;
            padding: 0px 4px;
            border-radius: 4px;
            margin-left: 6px;
          }
        }
      }
    }
  }
  .side {
    height: 100%;
    width: 420px;
    background: #ffffff;
    border-left: 20px solid #f7f7f7;
    .list {
      .item {
        padding: 8px 0;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
          left: 31px;
          height: calc(100% - 24px);
          top: 34px;
        }
        .info {
          display: flex;
          align-items: center;
          margin-left: 20px;
          .icon {
            position: relative;
            z-index: 11;
            color: #53b76f;
            font-size: 24px;
          }
          .icon1 {
            position: relative;
            z-index: 11;
            color: deepskyblue;
            font-size: 24px;
          }
          .icon2 {
            position: relative;
            z-index: 11;
            color: #dc362e;
            font-size: 24px;
          }
          .iconnew{
            width: 24px;
            height: 24px;
          }
          .icon3 {
            position: relative;
            z-index: 11;
            color:gray;
            font-size: 24px;
          }
          .avatar {
            width: 40px;
            height: 40px;
            border-radius: 50%;
            margin: 0 12px 0 16px;
            border: 1px solid;
          }
          .content {
            flex: 1;
            .line {
              display: flex;
              justify-content: space-between;
              align-content: center;
              margin-bottom: 6px;
              .name {
                font-weight: 600;
                font-size: 16px;
                color: #111111;
              }
              .time {
                color: #888888;
              }
              .company {
                font-size: 13px;
                color: #888888;
                .status {
                  color: #00ba67;
                }
              }
            }
          }
        }
        .remark {
          background: #f7f7f7;
          border-radius: 4px;
          padding: 13px 15px;
          color: #666666;
          margin-left: 120px;
        }
        .childList {
          margin-left: 120px;
        }
      }
    }
  }
}
</style>
admin/src/components/business/OperaHiddenDangerWindow.vue
@@ -13,8 +13,8 @@
            <div class="time">提报时间:{{model.createDate}}</div>
          </div>
          <div class="right" v-if="model.status==0">待处理</div>
          <div class="right" v-if="model.status==1">已处理</div>
          <div class="right" v-if="model.status==2">已撤销</div>
          <div class="right"  style="background:#53b76f " v-if="model.status==1">已处理</div>
          <div class="right" style="background:#dc362e "  v-if="model.status==2">已退回</div>
        </div>
        <div class="info">
          <div class="title">隐患提报详情</div>
@@ -146,7 +146,7 @@
    <template   v-slot:footer>
      <el-button @click="isShowProblem = true"  type="primary"  v-if="model.status==0&& model.checkUserId == userInfo.memberId"  class="status-red">处理</el-button>
      <el-button type="primary" plain v-if="model.status==0 && model.checkUserId == userInfo.memberId" @click="handleTransfer">转交</el-button>
      <el-button @click="backDo"  v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger"  >退回</el-button>
      <el-button @click="isBackProblem=true"  v-if="model.status==0&& model.checkUserId == userInfo.memberId" type="danger"  >退回</el-button>
      <el-button @click="visible=false">返回</el-button>
    </template>
@@ -186,8 +186,9 @@
        <el-form-item label="整改时间" prop="checkDate">
          <el-date-picker
              class="w300"
              type="date"
              placeholder="选择日期"
              type="datetime"
              value-format="yyyy-MM-dd HH:mm:ss"
              placeholder="选择整改时间"
              v-model="dealForm.checkDate"
          />
        </el-form-item>
@@ -220,16 +221,18 @@
    <el-dialog
        append-to-body
        title="隐患退回"
        class="dialogCl"
        :visible.sync="isBackProblem"
        width="480px"
        width="600px"
    >
      <el-form :model="backForm" :rules="rulesBack" ref="backForm" label-width="100px">
        <el-form-item label="退回时间" prop="checkDate">
          <el-date-picker
              class="w300"
              type="date"
              placeholder="选择日期"
              value-format="yyyy-MM-dd HH:mm:ss"
              type="datetime"
              placeholder="选择退回时间"
              v-model="backForm.checkDate"
          />
        </el-form-item>
@@ -263,7 +266,6 @@
import upload from '@/components/common/upload'
import { memberList } from '@/api/business/hiddenDangerParam'
import { mapState } from 'vuex'
import { dealHiddenDanger } from '@/api/business/hiddenDanger'
export default {
  components: { GlobalWindow, upload },
  extends: BaseOpera,
@@ -303,10 +305,11 @@
      rulesBack: {
        checkDate: [
          { required: true, message: '请选择退回时间' }
        ],
        ]
        /*,
        dealBeforeFileList: [
          { required: true, message: '请上传整改前情况' }
        ]
        ]*/
      },
      memberList: [],
      transForm: {
@@ -345,8 +348,8 @@
          this.dealForm.dealAfterFileList.splice(index, 1)
        }
      } else if (type == 2) {
        if (this.backForm.dealAfterFileList != null && this.backForm.dealAfterFileList.length > index) {
          this.backForm.dealAfterFileList.splice(index, 1)
        if (this.backForm.dealBeforeFileList != null && this.backForm.dealBeforeFileList.length > index) {
          this.backForm.dealBeforeFileList.splice(index, 1)
        }
      }
    },
@@ -356,10 +359,9 @@
          this.dealForm.dealBeforeFileList = []
        }
        this.dealForm.dealBeforeFileList.push({
          id: this.model.id,
          fileurl: e.imgaddr,
          url: e.url,
          fileUrl: e.imgaddr,
          fileName: e.originname,
          name: e.originname,
          fileType: e.type
        })
      } else if (objType === 1) {
@@ -367,21 +369,19 @@
          this.dealForm.dealAfterFileList = []
        }
        this.dealForm.dealAfterFileList.push({
          id: this.model.id,
          fileUrl: e.imgaddr,
          fileurl: e.imgaddr,
          url: e.url,
          fileName: e.originname,
          name: e.originname,
          fileType: e.type
        })
      } else if (objType === 2) {
        if (this.backForm.dealAfterFileList == null) {
          this.backForm.dealAfterFileList = []
        if (this.backForm.dealBeforeFileList == null) {
          this.backForm.dealBeforeFileList = []
        }
        this.backForm.dealAfterFileList.push({
          id: this.model.id,
          fileUrl: e.imgaddr,
        this.backForm.dealBeforeFileList.push({
          fileurl: e.imgaddr,
          url: e.url,
          fileName: e.originname,
          name: e.originname,
          fileType: e.type
        })
      }
@@ -394,20 +394,20 @@
        }
        this.$dialog.actionConfirm('操作确认', '您确认提交该隐患处理情况吗?')
          .then(() => {
            this.transfering = true
            this.dealing = true
            this.api.dealHiddenDanger({
              id: this.dataId,
              status: 1,
              checkDate: this.dealForm.checkDate,
              dealTime: this.dealForm.checkDate,
              checkInfo: this.dealForm.checkInfo,
              dealBeforeFileList: this.dealForm.dealBeforeFileList,
              dealAfterFileList: this.dealForm.dealBeforeFileList
              dealAfterFileList: this.dealForm.dealAfterFileList
            })
              .then(res => {
                this.$tip.apiSuccess('转交成功')
                this.$tip.apiSuccess('处理成功')
                this.getDetail()
                this.getLogList()
                this.isShowTransfer = false
                this.isShowProblem = false
              })
              .catch(e => {
              })
@@ -424,19 +424,19 @@
        }
        this.$dialog.actionConfirm('操作确认', '您确认退回该隐患处理情况吗?')
          .then(() => {
            this.transfering = true
            this.dealing = true
            this.api.dealHiddenDanger({
              id: this.dataId,
              status: 0,
              checkDate: this.backForm.checkDate,
              status: 2,
              dealTime: this.backForm.checkDate,
              checkInfo: this.backForm.checkInfo,
              dealBeforeFileList: this.backForm.dealBeforeFileList
            })
              .then(res => {
                this.$tip.apiSuccess('转交成功')
                this.$tip.apiSuccess('退回成功')
                this.getDetail()
                this.getLogList()
                this.isShowTransfer = false
                this.isBackProblem = false
              })
              .catch(e => {
              })
@@ -455,13 +455,13 @@
        this.memberList = []
        this.transForm = {
          memberId: null
        },
        }
        this.dealForm = {
          checkDate: null,
          checkInfo: null,
          dealBeforeFileList: [],
          dealAfterFileList: []
        },
        }
        this.backForm = {
          checkDate: null,
          checkInfo: null,
@@ -692,7 +692,7 @@
          .icon2 {
            position: relative;
            z-index: 11;
            color: red;
            color: #dc362e;
            font-size: 24px;
          }
          .avatar {
admin/src/utils/request.js
@@ -53,7 +53,7 @@
  if (response.data.code === 503) {
    return Promise.reject(new Error('服务器繁忙,请稍后再试'))
  }
  if (response.data.code === 401) {
  if (response.data.code === 401 || response.data.code === 5112) {
    if (response.config.autoLogin !== false) {
      Cookies.set('dm_user_token','')
      window.location.href = process.env.VUE_APP_ROUTER_MODE === 'hash' ? (process.env.VUE_APP_CONTEXT_PATH +'/#/login') : (process.env.VUE_APP_CONTEXT_PATH+'/login')
admin/src/views/operation/danger/record.vue
@@ -6,10 +6,10 @@
        <el-input v-model="searchForm.memberName" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="提报人组织" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入" @keypress.enter.native="search"></el-input>
        <el-input v-model="searchForm.companyName" placeholder="请输入" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="隐患区域" prop="areaId">
        <el-select v-model="searchForm.areaId" placeholder="请选择隐患区域" @keypress.enter.native="search">
        <el-select v-model="searchForm.areaId" placeholder="请选择隐患区域" clearable  @change="search">
          <el-option
              v-for="item in areaList"
              :key="item.id"
@@ -19,13 +19,20 @@
        </el-select>
      </el-form-item>
      <el-form-item label="隐患类型" prop="cateId">
        <el-select v-model="searchForm.cateId" placeholder="请选择隐患类型" @keypress.enter.native="search">
        <el-select v-model="searchForm.cateId" placeholder="请选择隐患类型" clearable @change="search">
          <el-option
              v-for="item in cateList"
              :key="item.id"
              :label="item.name"
              :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status"  @change="search" clearable placeholder="状态">
          <el-option label="待处理" value="0"></el-option>
          <el-option label="已处理" value="1"></el-option>
          <el-option label="已退出" value="2"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="提报时间" prop="startTime">
@@ -72,7 +79,7 @@
          <template slot-scope="{row}">
            <span class="status-blue"  v-if="row.status === 0">待处理</span>
            <span class="status-green"   v-if="row.status === 1">已处理</span>
            <span class="status-red"   v-if="row.status === 2">已撤销</span>
            <span class="status-red"   v-if="row.status === 2">已退回</span>
          </template>
        </el-table-column>
        <el-table-column prop="editDate" label="操作时间" min-width="150px"></el-table-column>
@@ -117,7 +124,8 @@
        queryStartTime: '',
        queryEndTime: '',
        areaId: null,
        cateId: null
        cateId: null,
        status:null
      },
      cateList: [],
      areaList: [],
admin/src/views/operation/serviceCar/apprRecord.vue
@@ -1,135 +1,206 @@
<template>
  <div class="main_app">
    <QueryForm
      v-model="filters"
      :query-form-config="queryFormConfig"
      @handleQuery="getList(1)"
      @clear="clear"
    />
    <el-table v-loading="loading" :data="list" stripe>
      <el-table-column
        prop="name"
        label="申请人"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="组织"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="车牌照"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="用车时间"
        min-width="80"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="出发时间"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="目的地类别"
        min-width="110"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="目的地"
        min-width="100"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="申请状态"
        min-width="80"
        show-overflow-tooltip
      />
      <el-table-column
        prop="name"
        label="操作"
        min-width="80"
        show-overflow-tooltip
  <TableLayout :permissions="['business:empower:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="申请人" prop="memberName">
        <el-input v-model="searchForm.memberName" placeholder="请输入姓名/手机号" @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="申请人组织" prop="companyName">
        <el-input v-model="searchForm.companyName" placeholder="请输入申请人组织" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="车牌号" prop="carCode">
        <el-input v-model="searchForm.carCode" placeholder="请输入车牌号" clearable @keypress.enter.native="search"></el-input>
      </el-form-item>
      <el-form-item label="状态" prop="status">
        <el-select v-model="searchForm.status"  @change="search" clearable placeholder="状态">
          <el-option label="申请中" value="0"></el-option>
          <el-option label="审核中" value="1"></el-option>
          <el-option label="审批通过" value="2"></el-option>
          <el-option label="审批不通过" value="3"></el-option>
          <el-option label="已取消" value="4"></el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="目的地类型" prop="type">
        <el-select v-model="searchForm.type"  @change="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="startTime">
        <el-date-picker
            @change="seleTime"
            v-model="time"
            @keypress.enter.native="search"
            type="datetimerange"
            format="yyyy-MM-dd HH:mm:ss"
            value-format="yyyy-MM-dd HH:mm:ss"
            range-separator="至"
            start-placeholder="开始日期"
            end-placeholder="结束日期">
        </el-date-picker>
      </el-form-item>
      <el-radio-group v-model="searchForm.radio" size="small" @input="changeRadio">
        <el-radio-button label="0">当天</el-radio-button>
        <el-radio-button label="1">近7天</el-radio-button>
        <el-radio-button label="2">近30天</el-radio-button>
      </el-radio-group>
      <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:empower:create', 'business:empower:delete']">
        <!--<li><el-button type="primary" v-permissions="['business:empower:exportExcel']" @click="exportExcel">导出</el-button></li> -->
      </ul>
      <el-table
          v-loading="isWorking.search"
          :data="tableData.list"
          stripe
          @selection-change="handleSelectionChange"
      >
        <template>
          <el-button type="text">查看详情</el-button>
        </template>
      </el-table-column>
    </el-table>
    <pagination
      @size-change="handleSizeChange"
      @current-change="getList"
      :pagination="pagination"
    />
  </div>
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="memberName" label="提报人" min-width="80px"></el-table-column>
        <el-table-column prop="companyName" label="所属组织" min-width="150px"></el-table-column>
        <el-table-column prop="carCode" label="车牌号" min-width="100px"></el-table-column>
        <el-table-column label="用车时间" min-width="170px">
          <template slot-scope="{row}">
                <span>èµ·:{{row.startTime || ''}}</span><br>
                <span>æ­¢:{{row.endTime  || ''}}</span>
          </template>
        </el-table-column>
        <el-table-column prop="planUseDate" label="出发时间" min-width="150px"></el-table-column>
        <el-table-column label="目的地" min-width="200px">
          <template slot-scope="{row}">
            <span class="status-green" v-if="row.type === 0">【市内】</span>
            <span class="status-red"   v-if="row.type === 1">【市外】</span>
            <span >{{ row.addr }}</span>
          </template>
        </el-table-column>
        <el-table-column label="状态" min-width="100px">
          <template slot-scope="{row}">
            <span class="status-blue"  v-if="row.status === 0">申请中</span>
            <span class="status-blue"  v-if="row.status === 1">待审批</span>
            <span class="status-green" v-if="row.status === 2">审批通过</span>
            <span class="status-red"   v-if="row.status === 3">审批不通过</span>
            <span class="status-red"   v-if="row.status === 4">已取消</span>
          </template>
        </el-table-column>
        <el-table-column prop="createDate" label="申请时间" min-width="150px"></el-table-column>
        <el-table-column prop="editDate" label="操作时间" min-width="150px"></el-table-column>
        <el-table-column
            label="操作"
            min-width="100"
            align="center"
            fixed="right"
        >
          <template slot-scope="{row}">
            <el-button type="text" icon="el-icon-edit" @click="$refs.OperaDetailsWindow.open('公务车申请详情',row)" >查看详情</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
          @size-change="handleSizeChange"
          @current-change="handlePageChange"
          :pagination="tableData.pagination"
      >
      </pagination>
    </template>
    <OperaCarUseBookWindow ref="OperaDetailsWindow" @success="handlePageChange"/>
  </TableLayout>
</template>
<script>
import BaseTable from '@/components/base/BaseTable'
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import QueryForm from '@/components/common/QueryForm'
import OperaCarUseBookWindow from '@/components/business/OperaCarUseBookWindow'
import { timeForMat } from '@/utils/util'
import { allList } from '@/api/business/hiddenDangerParam'
export default {
  components: {
    Pagination,
    QueryForm
  },
  name: 'Empower',
  extends: BaseTable,
  components: { TableLayout, Pagination ,OperaCarUseBookWindow},
  data () {
    return {
      filters: {},
      loading: false,
      queryFormConfig: {
        formItems: [
          {
            filed: 'name',
            type: 'input',
            label: '申请人姓名'
          },
          {
            filed: 'idCard',
            type: 'input',
            label: '车牌照'
          },
          {
            filed: 'name',
            type: 'select',
            label: '目的地类别',
            options: []
          },
          {
            filed: 'name',
            type: 'datetimerange',
            label: '出发时间',
            options: []
          }
        ],
        online: true
      // æœç´¢
      searchForm: {
        memberName: '',
        companyName: '',
        queryStartTime: '',
        queryEndTime: '',
        type: null,
        status:null
      },
      pagination: {
        capacity: 10,
        page: 1
      },
      list: [],
      total: 0
      cateList: [],
      areaList: [],
      time: []
    }
  },
  created () {
    this.config({
      module: '用车申请管理',
      api: '/business/carUseBook',
      'field.id': 'id',
      'field.main': 'id'
    })
    // this.search()
    this.changeRadio('0')
    this.loadParams()
  },
  methods: {
    getList (page) { },
    clear () { },
    handleSizeChange (capacity) {
      this.pagination.capacity = capacity
    changeRadio (e) {
      this.searchForm.radio = e
      if (e === '0') {
        this.searchForm.queryStartTime = timeForMat(0)[0]
        this.searchForm.queryEndTime = timeForMat(0)[1]
        this.time = timeForMat(0)
      } else if (e === '1') {
        this.searchForm.queryStartTime = timeForMat(6)[0]
        this.searchForm.queryEndTime = timeForMat(6)[1]
        this.time = timeForMat(6)
      } else if (e === '2') {
        this.searchForm.queryStartTime = timeForMat(29)[0]
        this.searchForm.queryEndTime = timeForMat(29)[1]
        this.time = timeForMat(29)
      }
      this.search()
    },
    loadParams () {
      allList({
      })
          .then(res => {
            if (res != null && res.length) {
              res.forEach(item => {
                if (item && item.type != null && item.type === 0) {
                  this.areaList.push(item)
                }
                if (item && item.type != null && item.type === 1) {
                  this.cateList.push(item)
                }
              })
            }
          })
          .catch(e => {
            // this.$tip.apiFailed(e)
          })
          .finally(() => {
          })
    },
    seleTime (e) {
      this.searchForm.queryStartTime = e[0]
      this.searchForm.queryEndTime = e[1]
      this.searchForm.radio = null
      this.search()
    },
    reset () {
      this.$refs.searchForm.resetFields()
      this.searchForm.radio = '0'
      this.changeRadio('0')
      // this.search()
    }
  }
}
</script>
<style>
</style>
server/system_gateway/src/main/java/com/doumee/api/gateway/JwtAuthController.java
@@ -72,6 +72,26 @@
    }
    @PreventRepeat(limit = 10, lockTime = 10000)
    @ApiOperation("H5业务登录")
    @PostMapping("/loginH5")
    @LoginNoRequired
    public ApiResponse<String> loginH5 (@Validated @RequestBody LoginDTO dto, ServerWebExchange serverWebExchange) {
        try {
            ServerHttpRequest request = serverWebExchange.getRequest();
            dto.setCheckCode(false);
            LoginUserInfo user = systemLoginService.loginByPasswordNew(dto,request);
            String token = jwtTokenUtil.generateToken(user);
            return ApiResponse.success(token);
        }catch (BusinessException e){
            return ApiResponse.failed(e.getCode(),e.getMessage());
        }catch (Exception e){
            e.printStackTrace();
            return ApiResponse.failed(ResponseStatus.SERVER_ERROR);
        }
    }
    /**
     * åˆ·æ–°JWT令牌,用旧的令牌换新的令牌
     */
server/system_service/src/main/java/com/doumee/api/system/SystemController.java
@@ -42,6 +42,7 @@
    @ApiOperation("登录")
    @PostMapping("/login")
    public ApiResponse<String> login (@Validated @RequestBody LoginDTO dto, HttpServletRequest request) {
        dto.setCheckCode(true);
        return ApiResponse.success(systemLoginService.loginByPassword(dto, request));
    }
server/system_service/src/main/java/com/doumee/core/model/LoginUserInfo.java
@@ -1,5 +1,6 @@
package com.doumee.core.model;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.model.SystemPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
@@ -42,15 +43,17 @@
    private List<String> permissions;
    private List<Integer> companyIdList;
    private Company company;
    //jwt登录设置
    public static LoginUserInfo from(SystemUser user, List<SystemRole> roles, List<SystemPermission> permissions,String sessionId) {
    public static LoginUserInfo from(SystemUser user, List<SystemRole> roles, List<SystemPermission> permissions,Company company,String sessionId) {
        if (user == null) {
            return null;
        }
        // æ‹·è´ç”¨æˆ·ä¿¡æ¯
        LoginUserInfo loginUserInfo = new LoginUserInfo();
        BeanUtils.copyProperties(user, loginUserInfo);
        loginUserInfo.setCompany(company);
        // è®¾ç½®è§’色信息
        List<String> rs = new ArrayList<>();
        for (SystemRole role : roles) {
server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -299,14 +299,6 @@
         int invalid =9;
    }
    public interface multifileObjType{
        //0隐患现场情况 1隐患处理前情况 2隐患处理后情况 3隐患退回说明
        int zero = 0;
        int one = 1;
        int two = 2;
        int three = 3;
    }
    public interface EmpowerStatus{
        //一卡通授权下发状态 0待下发 1已下发 2下发成功   3已取消 4下发失败 5任务下载已结束
@@ -424,9 +416,16 @@
    int cityUseCar = 3;//市内用车
    int unCityUseCar = 4;//市外用车
    int logisticsCarUse = 5;//物流车预约
}
public interface  noticesObjectType{
    int visit = 0;//访客申请
    int visitReporting = 2;//访客报备
    int cityUseCar = 3;//市内用车
    int unCityUseCar = 4;//市外用车
    int logisticsCarUse = 5;//物流车预约
}
public interface  approveStatus{
@@ -434,8 +433,8 @@
    int auditIng = 1;//审批中
    int pass = 2;//审批通过
    int unPass = 3;//审批未通过
    int otherDeal = 4;//他人已处理
    int cancel = 5;//已取消
    int cancel = 4;//已取消
    int otherDeal = 5;//他人已处理
    int otherUnPass = 6;//他人拒绝
}
server/system_service/src/main/java/com/doumee/dao/system/MultifileMapper.java
@@ -3,10 +3,13 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.system.model.Multifile;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/05/04 18:18
 */
public interface MultifileMapper extends BaseMapper<Multifile> {
    void insertBatchSomeColumn(List<Multifile> fileList);
}
server/system_service/src/main/java/com/doumee/dao/system/dto/LoginDTO.java
@@ -30,4 +30,7 @@
    @NotBlank(message = "验证码UUID不能为空")
    @ApiModelProperty(value = "验证码UUID")
    private String uuid;
    @ApiModelProperty(value = "是否验证验证码" , hidden = true)
    private Boolean checkCode;
}
server/system_service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -4,6 +4,8 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.dao.CompanyMapper;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.system.model.*;
import com.doumee.service.common.CaptchaService;
@@ -23,6 +25,7 @@
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.List;
import java.util.Objects;
@Slf4j
@Service
@@ -53,6 +56,9 @@
    @Autowired
    private SystemLoginLogService systemLoginLogService;
    @Autowired
    private CompanyMapper companyMapper;
    @Override
    public String loginByPassword(LoginDTO dto, HttpServletRequest request) {
        SystemLoginLog loginLog = new SystemLoginLog();
@@ -65,7 +71,7 @@
        loginLog.setClientInfo(Utils.User_Client.getBrowser(request));
        loginLog.setOsInfo(Utils.User_Client.getOS(request));
        loginLog.setServerIp(Utils.Server.getIP());
        if(isDebug == null  || !isDebug){
        if((isDebug == null  || !isDebug) && (Objects.isNull(dto.getCheckCode()) || dto.getCheckCode()) ){
            // æ ¡éªŒéªŒè¯ç 
            try {
                captchaService.check(dto.getUuid(), dto.getCode());
@@ -135,6 +141,10 @@
        if( !StringUtils.equals(pwd, user.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        Company company = new Company();
        if(Objects.nonNull(user.getCompanyId())){
            company = companyMapper.selectById(user.getCompanyId());
        }
        // èŽ·å–ç™»å½•ç”¨æˆ·ä¿¡æ¯
        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
        List<SystemPermission> permissions = systemPermissionService.findByUserId(user.getId());
@@ -144,7 +154,7 @@
        //数据部门权限集合
        user.setCompanyIdList(systemDataPermissionService.selectHighRole(new SystemDataPermission(),rt,user));
        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions,null);
        LoginUserInfo userInfo = LoginUserInfo.from(user, roles, permissions,company,null);
        return  userInfo;
    }
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/MemberCloudController.java
@@ -245,9 +245,15 @@
    @ApiOperation("查询全部")
    @PostMapping("/list")
    @CloudRequiredPermission("business:member:query")
    public ApiResponse<List<Member>> findPage (@RequestBody Member model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
    public ApiResponse<List<Member>> list (@RequestBody Member model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(memberService.findList(model));
    }
    @ApiOperation("查询全部司机")
    @PostMapping("/driveList")
    @CloudRequiredPermission("business:member:query")
    public ApiResponse<List<Member>> findDriveList (@RequestBody Member model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){
        return ApiResponse.success(memberService.findDriveList(model));
    }
    @ApiOperation("导出Excel")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/VisitsCloudController.java
@@ -127,10 +127,9 @@
    @PostMapping("/createVisit")
    public ApiResponse createVisit(@RequestBody Visits visits,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        visits.setMemberId(getLoginUser(token).getMemberId());
        visits.setReceptMemberId(visits.getMemberId());
        return ApiResponse.success("查询成功", visitsService.visitReporting(visits));
    }
    @LoginNoRequired
    @ApiOperation("重置密码")
server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/web/InternalWebController.java
@@ -1,13 +1,19 @@
package com.doumee.cloud.web;
import com.doumee.api.BaseController;
import com.doumee.cloud.web.ApiController;
import com.doumee.config.annotation.LoginNoRequired;
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.ApiResponse;
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.dao.business.model.Visits;
import com.doumee.dao.system.dto.LoginDTO;
import com.doumee.dao.web.reqeust.AccountLoginDTO;
import com.doumee.dao.web.reqeust.AuditApproveDTO;
import com.doumee.dao.web.reqeust.VisitMemberDTO;
@@ -16,13 +22,19 @@
import com.doumee.service.business.ApproveService;
import com.doumee.service.business.MemberService;
import com.doumee.service.business.VisitsService;
import com.doumee.service.system.SystemLoginService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.server.reactive.ServerHttpRequest;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.server.ServerWebExchange;
import javax.annotation.Resource;
/**
 * Created by IntelliJ IDEA.
@@ -37,7 +49,7 @@
@RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/web/member")
@Slf4j
@LoginNoRequired
public class InternalWebController extends ApiController {
public class InternalWebController extends BaseController {
    @Autowired
    private MemberService memberService;
@@ -48,30 +60,17 @@
    @Autowired
    private ApproveService approveService;
    @ApiOperation(value = "人员登录", notes = "H5")
    @PostMapping("/accountLogin")
    public ApiResponse<WxAuthorizeVO> accountLogin(@RequestBody AccountLoginDTO accountLoginDTO) {
        WxAuthorizeVO wxAuthorizeVO = memberService.accountLogin(accountLoginDTO);
        return ApiResponse.success("登录成功",wxAuthorizeVO);
    }
    @ApiOperation(value = "内部人员首页", notes = "H5")
    @GetMapping("/internalHome")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<InternalHomeVO> internalHome() {
        return ApiResponse.success("查询成功",approveService.getHomeData(getMemberId()));
    public ApiResponse<InternalHomeVO> internalHome(@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success("查询成功",approveService.getHomeData(getLoginUser(token).getMemberId()));
    }
    @ApiOperation("任务中心")
    @PostMapping("/taskCenter")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<VisitRecordVO>> taskCenter (@RequestBody PageWrap<VisitRecordDTO> pageWrap) {
        pageWrap.getModel().setMemberId(getMemberId());
    public ApiResponse<PageData<VisitRecordVO>> taskCenter (@RequestBody PageWrap<VisitRecordDTO> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        pageWrap.getModel().setMemberId(getLoginUser(token).getMemberId());
        return ApiResponse.success(visitsService.taskCenter(pageWrap));
    }
@@ -88,29 +87,20 @@
    @ApiOperation(value = "人员分页",notes = "可拜访内部人员")
    @PostMapping("/memberList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse<PageData<MemberVO>> memberList (@RequestBody PageWrap<VisitMemberDTO> pageWrap) {
    public ApiResponse<PageData<MemberVO>> memberList (@RequestBody PageWrap<VisitMemberDTO> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        return ApiResponse.success(memberService.getVisitedMemberList(pageWrap));
    }
    @ApiOperation(value = "访客记录提交", notes = "内部人员提交")
    @PostMapping("/createVisit")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse createVisit(@RequestBody Visits visits) {
        visits.setCreateMemberId(getMemberId());
    public ApiResponse createVisit(@RequestBody Visits visits,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        visits.setCreateMemberId(getLoginUser(token).getMemberId());
        return ApiResponse.success("查询成功", visitsService.createFk(visits,false));
    }
    @ApiOperation(value = "审批流记录审批", notes = "内部人员")
    @PostMapping("/auditApprove")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse auditApprove(@RequestBody AuditApproveDTO auditApproveDTO) {
    public ApiResponse auditApprove(@RequestBody AuditApproveDTO auditApproveDTO,@RequestHeader(Constants.HEADER_USER_TOKEN) String token) {
        visitsService.auditApprove(auditApproveDTO);
        return ApiResponse.success("操作成功");
    }
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Approve.java
@@ -84,6 +84,9 @@
    @ExcelColumn(name="审批人")
    private String cheorId;
    @ApiModelProperty(value = "审批时间")
    private Date checkDate;
    @ApiModelProperty(value = "审批人姓名")
    @ExcelColumn(name="审批人姓名")
    private String checkorName;
@@ -101,8 +104,8 @@
    @ExcelColumn(name="审批等级")
    private Integer level;
    @ApiModelProperty(value = "多人审批方式 0或签 1会签", example = "1")
    @ExcelColumn(name="多人审批方式 0或签 1会签")
    @ApiModelProperty(value = "多人审批方式 0或签 1会签 2单人审批", example = "1")
    @ExcelColumn(name="多人审批方式 0或签 1会签 2单人审批")
    private Integer approveType;
@@ -124,6 +127,9 @@
    @ApiModelProperty(value = "人脸图片", example = "1")
    @TableField(exist = false)
    private String faceImg;
    @ApiModelProperty(value = "姓名", example = "1")
    @ExcelColumn(name="姓名")
@@ -141,6 +147,7 @@
    private String companyName;
    @ApiModelProperty(value = "待审批记录", example = "1")
    @TableField(exist = false)
    private List<Approve> approveList;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/ApproveParam.java
@@ -46,8 +46,8 @@
    @ExcelColumn(name="是否删除0否 1是")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    @ExcelColumn(name="备注")
    @ApiModelProperty(value = "节点名称")
    @ExcelColumn(name="节点名称")
    private String remark;
    @ApiModelProperty(value = "类型 0审批 1抄送", example = "1")
@@ -83,8 +83,8 @@
    @ExcelColumn(name="审批主管等级 0直接主管 1二级主管 2三级主管 4四级主管")
    private Integer objLevel;
    @ApiModelProperty(value = "多人审批方式 0或签 1会签", example = "1")
    @ExcelColumn(name="多人审批方式 0或签 1会签")
    @ApiModelProperty(value = "多人审批方式 0或签 1会签 2单人审批", example = "1")
    @ExcelColumn(name="多人审批方式 0或签 1会签 2单人审批")
    private Integer approveType;
    @ApiModelProperty(value = "无主管选项 0流程结束 1由上级主管代替审核", example = "1")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/CarUseBook.java
@@ -23,7 +23,6 @@
@ApiModel("车辆_用车申请信息表")
@TableName("`car_use_book`")
public class CarUseBook extends LoginUserModel {
    @TableId(type = IdType.AUTO)
    @ApiModelProperty(value = "主键", example = "1")
    @ExcelColumn(name="主键")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/HiddenDanger.java
@@ -84,7 +84,7 @@
    @ApiModelProperty(value = "处理说明")
    @ExcelColumn(name="处理说明")
    private String checklInfo;
    private String checkInfo;
    @ApiModelProperty(value = "处理人编码(关联member)", example = "1")
    @ExcelColumn(name="处理人编码(关联member)")
server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/vo/ApproveDataVO.java
@@ -21,6 +21,9 @@
    @ApiModelProperty(value = "是否可以审批 0=不可以;1=可以")
    private Integer canBeApproved;
    @ApiModelProperty(value = "是否指定司机项 0不指定 1指定")
    private Integer driverParam;
    @ApiModelProperty(value = "抄送记录")
    private List<Approve> copyList;
server/visits/dmvisit_service/src/main/java/com/doumee/dao/web/response/MemberVO.java
@@ -26,9 +26,12 @@
    @ApiModelProperty(value = "所属组织编码(关联company表)", example = "1")
    private Integer companyId;
    @ApiModelProperty(value = "访客名称")
    @ApiModelProperty(value = "被访问人名称")
    private String name;
    @ApiModelProperty(value = "被访问人部门")
    private String companyName;
    @ApiModelProperty(value = "手机号")
    private String phone;
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -215,5 +215,5 @@
    String importBatch(MultipartFile file, Integer companyType,LoginUserInfo loginUser);
    List<Member>  findDriveList(Member model);
}
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/ApproveServiceImpl.java
@@ -13,6 +13,8 @@
import com.doumee.dao.business.join.ApproveJoinMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.business.vo.ApproveDataVO;
import com.doumee.dao.system.join.NoticesJoinMapper;
import com.doumee.dao.system.model.Notices;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.web.response.InternalHomeVO;
import com.doumee.service.business.ApproveService;
@@ -20,8 +22,10 @@
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.service.system.NoticesService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import org.apache.commons.lang3.StringUtils;
import org.apache.xpath.operations.Bool;
import org.springframework.beans.factory.annotation.Autowired;
@@ -68,6 +72,9 @@
    @Autowired
    private VisitsMapper visitsMapper;
    @Autowired
    private NoticesJoinMapper noticesJoinMapper;
    @Override
    public Integer create(Approve approve) {
@@ -294,8 +301,13 @@
        for (int i = 0; i < approveParamList.size(); i++) {
            ApproveParam approveParam = approveParamList.get(i);
            List<Integer> ids = this.getApproveUserIds(approveParam,createMember);
            //生成待办 notices è¡¨æ•°æ®
            if(i==0){
            }
            for (Integer memberId:ids) {
                Approve approve = new Approve();
                approve.setRemark(approveParam.getRemark());
                approve.setCreateDate(new Date());
                approve.setIsdeleted(Constants.ZERO);
                approve.setTemplatId(approveTempl.getId());
@@ -313,6 +325,31 @@
                approveList.add(approve);
            }
        }
    }
    public void createNoticesData(List<Approve> approveList){
        for (Approve approve:approveList) {
            Notices notices = new Notices();
            notices.setCreateDate(new Date());
            notices.setIsdeleted(Constants.ZERO);
            notices.setObjId(approve.getObjId());
            notices.setObjId(approve.getApproveType());
            if(Constants.equalsInteger(approve.getType(),Constants.approveObjectType.unConstructionVisit)
            || Constants.equalsInteger(approve.getType(),Constants.approveObjectType.constructionVisit)){
                notices.setType(Constants.ZERO);
            }else if(Constants.equalsInteger(approve.getType(),Constants.approveObjectType.visitReporting)){
                notices.setType(Constants.ONE);
            }
        }
    }
@@ -435,6 +472,182 @@
        return auditCompany;
    }
    @Override
    public ApproveDataVO arrangeApprovedData(Integer businessId, Integer businessType, Integer memberId){
        ApproveDataVO approveDateVO = new ApproveDataVO();
        approveDateVO.setApproveList(new ArrayList<>());
        approveDateVO.setCanBeApproved(Constants.ZERO);
        List<Approve> approveGroupList = approveJoinMapper.selectJoinList(Approve.class,
                new MPJLambdaWrapper<Approve>().
                        selectAll(Approve.class)
                        .selectAs(Member::getName,Approve::getMemberName)
                        .selectAs(Member::getPhone,Approve::getMemberPhone)
                        .selectAs(Member::getFaceImg,Approve::getFaceImg)
                        .selectAs(Company::getCompanyNamePath,Approve::getCompanyName)
                        .leftJoin(Member.class,Member::getId,Approve::getChekorId)
                        .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                        .eq(Approve::getIsdeleted,Constants.ZERO)
                        .eq(Approve::getObjId,businessId)
                        .eq(Approve::getObjType,businessType)
                        .orderByAsc(Approve::getLevel)
        );
        //查找全部levelList
        List<Approve> levelList = getLevelListFromResult(approveGroupList,approveDateVO,memberId);
        List<Approve> copyList = getAllCopyList(approveGroupList);
        //遍历level查询每一级别业务数据
        for(Approve level:levelList){
            List<Approve> tlist = getLevelInfoFromList(level,approveGroupList);
            approveDateVO.getApproveList().addAll(tlist);
            if(tlist.size() ==0
                    ||Constants.equalsInteger(Constants.approveStatus.unPass,  tlist.get(0).getStatus())
                    ||Constants.equalsInteger(Constants.approveStatus.cancel,  tlist.get(0).getStatus())){
                break;
            }
        }
        //处理抄送记录
        if (CollectionUtils.isNotEmpty(copyList)) {
            Approve waitModel = new Approve();
            waitModel.setApproveType(Constants.ONE);
            waitModel.setStatusInfo("抄送");
            waitModel.setStatus(Constants.ONE);
            waitModel.setType(Constants.ONE);
            waitModel.setApproveList(copyList);
            approveDateVO.getApproveList().add(waitModel);
        }
        return approveDateVO;
    }
    private List<Approve> getAllCopyList(List<Approve> approveGroupList) {
        List<Approve> copyList = new ArrayList<>();
        if (CollectionUtils.isNotEmpty(approveGroupList)) {
            copyList.addAll(approveGroupList.stream().filter(i->Constants.equalsInteger(i.getType(),Constants.ONE)).collect(Collectors.toList()));
        }
        return copyList;
    }
    private List<Approve> getLevelInfoFromList(Approve level,List<Approve> approveGroupList) {
        List<Approve> list = new ArrayList<>();
        if(Constants.equalsInteger(level.getApproveType(),Constants.TWO)){
            //如果是单人审批
            list.add(level);
            return list;
        }
        //查找全部已处理的集合
        List<Approve> passList = new ArrayList<>();//已同意的记录集
        Approve  refuseModel = new Approve();//已拒绝的记录
        List<Approve> waitList = new ArrayList<>();  //查询全部未处理的集合
        List<Approve> otherPassList = new ArrayList<>();//他人已处理的记录集
        List<Approve> levelApprove = approveGroupList.stream().filter(i->Constants.equalsInteger(i.getLevel(),level.getLevel())).collect(Collectors.toList());
        dealGroupListBiz(level,levelApprove,approveGroupList,passList,refuseModel,waitList,otherPassList);
        if(Objects.nonNull(refuseModel) && Objects.nonNull(refuseModel.getId())){
            //存在拒绝的,只需要返回一条处理数据,后续不需要回显
            list.add(refuseModel);
            return list;
        }
        list.addAll(sortByCreateTime(passList));
        if(Constants.equalsInteger(level.getApproveType(),Constants.ONE)){
            //如果是会签
            if(waitList.size()>0){
                Approve waitModel = new Approve();
                waitModel.setApproveType(Constants.ONE);
                waitModel.setStatusInfo(StringUtils.defaultString(level.getTitle(),"审批人")+"处理中");
                waitModel.setStatus(Constants.equalsInteger(waitList.get(Constants.ZERO).getStatus(),Constants.ONE)?Constants.ONE:Constants.ZERO);
                waitModel.setApproveList(waitList);
                list.add(waitModel);
            }
        }else {
            if((waitList.size()> 0 || otherPassList.size()>0)){
                Approve waitModel = new Approve();
                waitModel.setApproveType(Constants.ONE);
                waitModel.setStatusInfo(passList.size()<=0?StringUtils.defaultString(level.getTitle(),"审批人"):"抄送或签审批人");
                waitModel.setStatus(passList.size()>0?Constants.ONE:Constants.ZERO);
                List<Approve> approveList = new ArrayList<>();
                approveList.addAll(waitList);
                //如果是或签
                if(passList.size()>0){
                    approveList.addAll(otherPassList);
                }
                waitModel.setApproveList(approveList);
                list.add(waitModel);
            }
            //如果是或签
//            if(otherPassList.size()>0){
//                Approve waitModel = new Approve();
//                waitModel.setApproveType(Constants.ONE);
//                waitModel.setStatusInfo(StringUtils.defaultString(level.getTitle(),"审批人")+"(抄送或签审批人)");
//                waitModel.setStatus(Constants.ONE);
//                waitModel.setApproveList(otherPassList);
//                list.add(waitModel);
//            }
        }
        return  list;
    }
    private void dealGroupListBiz(Approve level, List<Approve> levelApprove,List<Approve> approveGroupList, List<Approve> passList, Approve refuseModel, List<Approve> waitList, List<Approve> otherPassList) {
        //查询是否存在拒绝数据
        for (Approve approve:levelApprove) {
            if(Constants.equalsInteger(Constants.approveStatus.pass,approve.getStatus())){
                passList.add(approve);
            }else if(Constants.equalsInteger(Constants.approveStatus.otherDeal,approve.getStatus())){
                otherPassList.add(approve);
            }else if(Constants.equalsInteger(Constants.approveStatus.auditIng,approve.getStatus())||Constants.equalsInteger(Constants.approveStatus.wait,approve.getStatus())){
                waitList.add(approve);
            }else if(Constants.equalsInteger(Constants.approveStatus.unPass,approve.getStatus())){
                refuseModel = approve;
            }
        }
    }
    private List<Approve> sortByCreateTime(List<Approve> passList) {
        Collections.sort(passList, (a, b) -> a.getCheckDate().compareTo(b.getCheckDate()));
        return  passList;
    }
    private List<Approve> getLevelListFromResult(List<Approve> approveGroupList,ApproveDataVO approveDataVO,Integer memberId) {
        approveDataVO.setCanBeApproved(Constants.ZERO);
        approveDataVO.setDriverParam(Constants.ZERO);
        List<Approve> approveList = new ArrayList<>();
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        for (Approve approve:approveGroupList) {
            if(StringUtils.isNotBlank(approve.getFaceImg())){
                approve.setFaceImg(path + approve.getFaceImg());
            }
            if(Constants.equalsInteger(approve.getType(),Constants.ONE)){
                continue;
            }
            if(Constants.equalsInteger(approve.getChekorId(),memberId)){
                approveDataVO.setCanBeApproved(Constants.ONE);
                approveDataVO.setDriverParam(approve.getDriverParam());
            }
            if(notExsits(approveList,approve.getLevel())){
                approveList.add(approve);
            }
        }
        if(CollectionUtils.isEmpty(approveList)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"审批信息:级别数据异常");
        }
        return  approveList;
    }
    private boolean notExsits(List<Approve> approveList, Integer level) {
        for (Approve approve:approveList) {
            if(Constants.equalsInteger(approve.getLevel(),level)){
                return false;
            }
        }
        return true;
    }
    /**
     * æ•´ç† å®¡æ‰¹æ•°æ®
@@ -442,18 +655,18 @@
     * @param businessType
     * @return
     */
    @Override
    public ApproveDataVO arrangeApprovedData(Integer businessId, Integer businessType, Integer memberId){
//    @Override
    public ApproveDataVO arrangeApprovedDataOld(Integer businessId, Integer businessType, Integer memberId){
        ApproveDataVO approveDateVO = new ApproveDataVO();
        approveDateVO.setCanBeApproved(Constants.ZERO);
        List<Approve> approveGroupList = approveJoinMapper.selectJoinList(Approve.class,
                new MPJLambdaWrapper<Approve>().
                        select(Approve::getLevel,Approve::getType)
                        select(Approve::getLevel,Approve::getType,Approve::getTitle,Approve::getApproveType)
                        .eq(Approve::getIsdeleted,Constants.ZERO)
                        .eq(Approve::getObjId,businessId)
                        .isNotNull(Approve::getLevel)
                        .eq(Approve::getObjType,businessType)
                        .groupBy(Approve::getLevel,Approve::getType)
                        .groupBy(Approve::getLevel,Approve::getType,Approve::getTitle,Approve::getApproveType)
        );
        if(CollectionUtils.isEmpty(approveGroupList)){
            return approveDateVO;
@@ -464,6 +677,7 @@
                        .selectAll(Approve.class)
                        .selectAs(Member::getName,Approve::getMemberName)
                        .selectAs(Member::getPhone,Approve::getMemberPhone)
                        .selectAs(Member::getFaceImg,Approve::getFaceImg)
                        .selectAs(Company::getName,Approve::getCompanyName)
                        .leftJoin(Member.class,Member::getId,Approve::getChekorId)
                        .leftJoin(Company.class,Company::getId,Member::getCompanyId)
@@ -475,14 +689,26 @@
                        .orderByAsc(Approve::getLevel)
                        .orderByAsc(Approve::getId)
        );
        String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
        for (Approve approve:approveAllList ) {
            if(StringUtils.isNotBlank(approve.getFaceImg())){
                approve.setFaceImg(path + approve.getFaceImg());
            }
        }
        if(CollectionUtils.isEmpty(approveAllList)){
            return approveDateVO;
        }
        List<Approve> approveList = approveAllList.stream().filter(i->i.getType().equals(Constants.ZERO)).collect(Collectors.toList());
        List<Approve> approveList = approveAllList.stream().filter(i->Constants.equalsInteger(i.getType(),(Constants.ZERO)))
                .collect(Collectors.toList());
        if(CollectionUtils.isEmpty(approveList)){
            return approveDateVO;
        }
        approveDateVO.setCanBeApproved(this.canBeApproved(approveList,memberId));
        approveDateVO.setDriverParam(this.canDriverParam(approveList,memberId));
        //根据审批级别 å¤„理数据
        for (Approve approve:approveGroupList) {
            approve.setApproveList(
@@ -506,6 +732,24 @@
            //下个审批流程内 å¦‚果存在当前 ç”¨æˆ·çš„æŠ“ç´§ åˆ™å¯ä»¥è¿›è¡Œå®¡æ‰¹
            if(nextApprovedList.stream().filter(i->i.getChekorId().equals(memberId)).collect(Collectors.toList()).size()>0){
                return Constants.ONE;
            }
        }
        return Constants.ZERO;
    }
    public Integer canDriverParam(List<Approve> approveList,Integer memberId){
        //获取所有待审批的数据
        List<Approve> waitApprovedList = approveList.stream().filter(i->i.getType().equals(Constants.ZERO)&&i.getStatus().equals(Constants.ZERO)).collect(Collectors.toList());
        if(CollectionUtils.isNotEmpty(waitApprovedList)){
            //下个审批流程等级
            Integer nextApprovedLevel = waitApprovedList.get(Constants.ZERO).getLevel();
            //下个审批流程的 æ‰€æœ‰æ•°æ®
            List<Approve> nextApprovedList = waitApprovedList.stream().filter(i->i.getStatus().equals(Constants.ZERO)&&i.getLevel().equals(nextApprovedLevel)).collect(Collectors.toList());
            //下个审批流程内 å¦‚果存在当前 ç”¨æˆ·çš„æŠ“ç´§ åˆ™å¯ä»¥è¿›è¡Œå®¡æ‰¹
            List<Approve> auditApproveList  = nextApprovedList.stream().filter(i->i.getChekorId().equals(memberId)).collect(Collectors.toList());
            if(auditApproveList.size() >0){
                Approve auditApprove = auditApproveList.get(Constants.ZERO);
                return auditApprove.getDriverParam();
            }
        }
        return Constants.ZERO;
@@ -546,6 +790,7 @@
        approve.setCheckInfo(approveDTO.getCheckInfo());
        approve.setCheorId(approveDTO.getLoginUserInfo().getMemberId().toString());
        approve.setCheckorName(approve.getLoginUserInfo().getRealname());
        approve.setCheckDate(new Date());
        approve.setStatusInfo(approveDTO.getStatus()==Constants.TWO?"审批通过":approveDTO.getCheckInfo());
        Visits visits = new Visits();
        CarUseBook carUseBook = new CarUseBook();
@@ -635,8 +880,6 @@
                //TODO å®¡æ‰¹æœªé€šè¿‡é€šçŸ¥
            }
        }else if(approveDTO.getObjType().equals(Constants.approveObjectType.logisticsCarUse)){
            //TODO  ç‰©æµè½¦é¢„约
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/CarUseBookServiceImpl.java
@@ -165,11 +165,11 @@
        queryWrapper.select("t1.name",CarUseBook::getMemberName);
        queryWrapper.select("t1.phone",CarUseBook::getMemberPhone);
        queryWrapper.select("t2.name",CarUseBook::getDriverName);
        queryWrapper.select("t3.phone",CarUseBook::getDriverPhone);
        queryWrapper.select("t4.company_name_path",CarUseBook::getCompanyName);
        queryWrapper.select("t2.phone",CarUseBook::getDriverPhone);
//        queryWrapper.select("t4.company_name_path",CarUseBook::getCompanyName);
        queryWrapper.leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
                .leftJoin("company t4 on t1.company_id=t4.id")
                .leftJoin(Member.class,Member::getId,CarUseBook::getDriverId)
//                .leftJoin("company t4 on t1.company_id=t4.id")
                .eq(CarUseBook::getId,id)
                .last("limit 1"  );
        CarUseBook model = carUseBookMapper.selectJoinOne(CarUseBook.class,queryWrapper);
@@ -203,11 +203,11 @@
        queryWrapper.select("t1.name",CarUseBook::getMemberName);
        queryWrapper.select("t1.phone",CarUseBook::getMemberPhone);
        queryWrapper.select("t2.name",CarUseBook::getDriverName);
        queryWrapper.select("t3.phone",CarUseBook::getDriverPhone);
        queryWrapper.select("t2.phone",CarUseBook::getDriverPhone);
        queryWrapper.select("t4.company_name_path",CarUseBook::getCompanyName);
        queryWrapper.leftJoin(Member.class,Member::getId,CarUseBook::getMemberId)
                    .leftJoin("company t4 on t1.company_id=t4.id")
                    .leftJoin(Member.class,Member::getId,CarUseBook::getDriverId);
                    .leftJoin(Member.class,Member::getId,CarUseBook::getDriverId)
                    .leftJoin("company t4 on t1.company_id=t4.id");
        queryWrapper
                .eq(pageWrap.getModel().getId() != null, CarUseBook::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCreator() != null, CarUseBook::getCreator, pageWrap.getModel().getCreator())
@@ -243,6 +243,7 @@
                .eq(pageWrap.getModel().getAddr() != null, CarUseBook::getAddr, pageWrap.getModel().getAddr())
                .eq(pageWrap.getModel().getMemberId() != null, CarUseBook::getMemberId, pageWrap.getModel().getMemberId())
                .eq(pageWrap.getModel().getDriverId() != null, CarUseBook::getDriverId, pageWrap.getModel().getDriverId())
                .apply(pageWrap.getModel().getCompanyName() != null, "t4.company_name_path like '%"+pageWrap.getModel().getCompanyName()+"%'")
                .and(StringUtils.isNotBlank(pageWrap.getModel().getQueryDate()),
                        i->i.and(j->j.lt(CarUseBook::getStartTime,pageWrap.getModel().getQueryDate() +"00:00:00").gt(CarUseBook::getStartTime,pageWrap.getModel().getQueryDate() +"23:59:59"))
                        .or()
@@ -254,8 +255,8 @@
                )
                .and(StringUtils.isNotBlank(pageWrap.getModel().getMemberName()), ms->ms.like(Member::getName,pageWrap.getModel().getMemberName())
                        .or().like(Member::getPhone,pageWrap.getModel().getMemberName()))
                .ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), Empower::getCreateDate,pageWrap.getModel().getQueryStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()),Empower::getCreateDate,pageWrap.getModel().getQueryEndTime())
                .ge(Objects.nonNull(pageWrap.getModel().getQueryStartTime()), CarUseBook::getPlanUseDate,pageWrap.getModel().getQueryStartTime())
                .le(Objects.nonNull(pageWrap.getModel().getQueryEndTime()),CarUseBook::getPlanUseDate,pageWrap.getModel().getQueryEndTime())
                .orderByDesc(Visits::getCreateDate)
        ;
        for(PageWrap.SortData sortData: pageWrap.getSorts()) {
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerLogServiceImpl.java
@@ -126,14 +126,14 @@
            if(Objects.isNull(hiddenDanger)){
                return null;
            }
            HiddenDangerLog newBean = new HiddenDangerLog();
            newBean.setCreateUserName("-");
            newBean.setCompanyName("-");
            newBean.setTitle("隐患处理");
            newBean.setAvatar("-");
            if(hiddenDanger.getStatus().equals(Constants.ZERO)){
                //下一步处理人
                HiddenDangerLog newBean = new HiddenDangerLog();
                newBean.setCreateUserName("-");
                newBean.setCompanyName("-");
                newBean.setTitle("隐患处理");
                newBean.setAvatar("-");
                SystemUser systemUser = systemUserMapper.selectOne(new QueryWrapper<SystemUser>().lambda().eq(SystemUser::getMemberId,hiddenDanger.getCheckUserId()));
                if(Objects.nonNull(systemUser)){
                    newBean.setCreateUserName(systemUser.getRealname());
@@ -143,8 +143,8 @@
                        newBean.setCompanyName(company.getCompanyNamePath());
                    }
                }
                hiddenDangerLogList.add(newBean);
            }
            hiddenDangerLogList.add(newBean);
            String path = systemDictDataBiz.queryByCode(Constants.FTP,Constants.FTP_RESOURCE_PATH).getCode()
                    +systemDictDataBiz.queryByCode(Constants.FTP,Constants.MEMBER_IMG).getCode();
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/HiddenDangerServiceImpl.java
@@ -104,7 +104,7 @@
                multifile.setCreator(hiddenDanger.getCreator());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(hiddenDanger.getId());
                multifile.setObjType(Constants.multifileObjType.zero);
                multifile.setObjType(Constants.MultiFile.HIDDEN_DANGER_SUBMIT.getKey());
                multifile.setSortnum(i+1);
                multifileMapper.insert(multifile);
            }
@@ -260,7 +260,7 @@
                .eq(pageWrap.getModel().getMemberId() != null, HiddenDanger::getMemberId, pageWrap.getModel().getMemberId())
                .ge(pageWrap.getModel().getCheckDate() != null, HiddenDanger::getCheckDate, Utils.Date.getStart(pageWrap.getModel().getCheckDate()))
                .le(pageWrap.getModel().getCheckDate() != null, HiddenDanger::getCheckDate, Utils.Date.getEnd(pageWrap.getModel().getCheckDate()))
                .eq(pageWrap.getModel().getChecklInfo() != null, HiddenDanger::getChecklInfo, pageWrap.getModel().getChecklInfo())
                .eq(pageWrap.getModel().getCheckInfo() != null, HiddenDanger::getCheckInfo, pageWrap.getModel().getCheckInfo())
                .eq(pageWrap.getModel().getCheckUserId() != null, HiddenDanger::getCheckUserId, pageWrap.getModel().getCheckUserId())
                .eq(pageWrap.getModel().getAreaName() != null, HiddenDanger::getAreaName, pageWrap.getModel().getAreaName())
@@ -291,12 +291,31 @@
    @Override
    @Transactional(rollbackFor = {Exception.class,BusinessException.class})
    public void dealHiddenDanger(HiddenDanger hiddenDanger){
        isParamValid(hiddenDanger);
        dealFileBiz(hiddenDanger);
        hiddenDanger.setEditor(hiddenDanger.getLoginUserInfo().getId());
        hiddenDanger.setEditDate(new Date());
        hiddenDanger.setCheckDate(hiddenDanger.getEditDate());
        hiddenDangerMapper.updateById(hiddenDanger);
        //存储 æ“ä½œæ—¥å¿—
        HiddenDangerLog hiddenDangerLog = new HiddenDangerLog();
        hiddenDangerLog.setIsdeleted(Constants.ZERO);
        hiddenDangerLog.setCreateDate(new Date());
        hiddenDangerLog.setCreator(hiddenDanger.getEditor());
        hiddenDangerLog.setHiddenDangerId(hiddenDanger.getId());
        hiddenDangerLog.setContent(hiddenDanger.getCheckInfo());
        hiddenDangerLog.setTitle(hiddenDanger.getStatus().equals(Constants.ONE)?"隐患处理":"隐患退回");
        hiddenDangerLog.setObjType(hiddenDanger.getStatus().equals(Constants.ONE)?Constants.FOUR:Constants.TWO);
        hiddenDangerLogMapper.insert(hiddenDangerLog);
    }
    private void isParamValid(HiddenDanger hiddenDanger) {
        if(Objects.isNull(hiddenDanger)
            || Objects.isNull(hiddenDanger.getId())
            || Objects.isNull(hiddenDanger.getDealTime())
            || Objects.isNull(hiddenDanger.getLoginUserInfo())
            || Objects.isNull(hiddenDanger.getStatus())
            ){
                || Objects.isNull(hiddenDanger.getId())
                || Objects.isNull(hiddenDanger.getDealTime())
                || Objects.isNull(hiddenDanger.getLoginUserInfo())
                || Objects.isNull(hiddenDanger.getStatus())
        ){
            throw new BusinessException(ResponseStatus.BAD_REQUEST);
        }
        HiddenDanger model = hiddenDangerMapper.selectById(hiddenDanger.getId());
@@ -304,55 +323,68 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到隐患数据");
        }
        if (!model.getStatus().equals(Constants.ZERO)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转!");
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转,请刷新查看!");
        }
        if (!model.getCheckUserId().equals(hiddenDanger.getEditor())) {
        if (!model.getCheckUserId().equals(hiddenDanger.getLoginUserInfo().getMemberId())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"处理人非当前人员!");
        }
        if(!(hiddenDanger.getStatus().equals(Constants.ONE)||hiddenDanger.getStatus().equals(Constants.TWO))){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态错误!");
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态错误,请刷新查看!");
        }
        //整改前文件
    }
    private void dealFileBiz(HiddenDanger hiddenDanger) {//整改前文件
        List<Multifile> beforList = hiddenDanger.getDealBeforeFileList();
        List<Multifile> fileList = new ArrayList<>();
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(beforList)){
            boolean isTrue = false;
            for (int i = 0; i < beforList.size(); i++) {
                Multifile multifile = beforList.get(i);
                if(StringUtils.isBlank(multifile.getFileurl())){
                    continue;
                }
                multifile.setCreateDate(new Date());
                multifile.setCreator(hiddenDanger.getEditor());
                multifile.setIsdeleted(Constants.ZERO);
                multifile.setObjId(hiddenDanger.getId());
                multifile.setObjType(Constants.multifileObjType.one);
                multifile.setCreator(hiddenDanger.getLoginUserInfo().getId());
                multifile.setObjType(Constants.MultiFile.HIDDEN_DANGER_DEAL_BEFORE.getKey());
                multifile.setSortnum(i+1);
                multifileMapper.insert(multifile);
                fileList.add(multifile);
                isTrue=true;
            }
            if(hiddenDanger.getStatus().equals(Constants.ONE) && !isTrue){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求填写处理数据");
            }
        }
        if(hiddenDanger.getStatus().equals(Constants.ONE)){
            boolean isTrue = false;
            List<Multifile> afterList = hiddenDanger.getDealAfterFileList();
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(afterList)){
                for (int i = 0; i < afterList.size(); i++) {
                    Multifile multifile = afterList.get(i);
                    if(StringUtils.isBlank(multifile.getFileurl())){
                        continue;
                    }
                    multifile.setCreateDate(new Date());
                    multifile.setCreator(hiddenDanger.getEditor());
                    multifile.setIsdeleted(Constants.ZERO);
                    multifile.setCreator(hiddenDanger.getLoginUserInfo().getId());
                    multifile.setObjId(hiddenDanger.getId());
                    multifile.setObjType(Constants.multifileObjType.two);
                    multifile.setObjType(Constants.MultiFile.HIDDEN_DANGER_DEAL_AFTER.getKey());
                    multifile.setSortnum(i+1);
                    multifileMapper.insert(multifile);
                    fileList.add(multifile);
                    isTrue = true;
                }
            }
            if(isTrue){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对不起,请按要求填写处理数据");
            }
        }
        hiddenDanger.setEditor(hiddenDanger.getLoginUserInfo().getId());
        hiddenDanger.setEditDate(new Date());
        hiddenDangerMapper.updateById(hiddenDanger);
        //存储 æ“ä½œæ—¥å¿—
        HiddenDangerLog hiddenDangerLog = new HiddenDangerLog();
        hiddenDangerLog.setIsdeleted(Constants.ZERO);
        hiddenDangerLog.setCreateDate(new Date());
        hiddenDangerLog.setCreator(hiddenDanger.getCreator());
        hiddenDangerLog.setHiddenDangerId(hiddenDanger.getId());
        hiddenDangerLog.setTitle(hiddenDanger.getStatus().equals(Constants.ONE)?"隐患处理":"隐患退回");
        hiddenDangerLog.setObjType(hiddenDanger.getStatus().equals(Constants.ONE)?Constants.FOUR:Constants.TWO);
        hiddenDangerLogMapper.insert(hiddenDangerLog);
        if(fileList.size()>0){
            multifileMapper.insertBatchSomeColumn(fileList);
        }
    }
@@ -374,7 +406,7 @@
            throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到隐患数据");
        }
        if (!Constants.equalsInteger(model.getStatus(),Constants.ZERO)) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转!");
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"数据状态已流转,请刷新查看!");
        }
        if (!Constants.equalsInteger(model.getCheckUserId(),hiddenDanger.getLoginUserInfo().getMemberId())) {
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"处理人非当前人员!");
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -52,6 +52,8 @@
import com.doumee.service.business.SmsEmailService;
import com.doumee.service.business.impl.hksync.HkSyncEmpowerServiceImpl;
import com.doumee.service.business.impl.hksync.ferp.HkSyncOrgUserToHKServiceImpl;
import com.doumee.service.system.SystemLoginService;
import com.doumee.service.system.SystemUserService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.collections.CollectionUtils;
import org.apache.commons.lang3.RandomStringUtils;
@@ -1100,6 +1102,30 @@
        }
        return  list;
    }
    @Override
    public List<Member> findDriveList(Member member) {
        MPJLambdaWrapper<Member> queryWrapper = new MPJLambdaWrapper<>();
        queryWrapper.leftJoin(Company.class,Company::getId,Member::getCompanyId);
        queryWrapper.selectAll(Member.class)
                .selectAs(Company::getName,Member::getCompanyName)
                .eq(Member::getType,Constants.TWO)
                .exists("select d.id from car_driver b where b.isdeleted=0 and b.member_id=t.id");
        if(null != member.getType()) {
            queryWrapper.eq(Member::getType,member.getType());
        }
        if(null != member.getCompanyId()) {
            queryWrapper.eq(Member::getCompanyId,member.getCompanyId());
        }
        queryWrapper.eq(Member::getIsdeleted,Constants.ZERO);
        List<Member> list =  memberJoinMapper.selectJoinList(Member.class,queryWrapper);
        if(list!=null){
            for(Member m : list){
                m.setName(StringUtils.defaultString(m.getName(),"")+"-"+StringUtils.defaultString(m.getCompanyName(),""));
            }
        }
        return  list;
    }
    @Override
    public PageData<Member> findPage(PageWrap<Member> pageWrap) {
@@ -1631,7 +1657,10 @@
    @Override
    public List<MemberVO> getVisitedMember(CheckVisitedDTO checkVisitedDTO){
        List<Member> memberList = memberMapper.selectList(new QueryWrapper<Member>().lambda()
        List<Member> memberList = memberJoinMapper.selectJoinList(Member.class,new MPJLambdaWrapper<Member>()
                .selectAll(Member.class)
                        .selectAs(Company::getName,Member::getCompanyName)
                .leftJoin(Company.class,Company::getId,Member::getCompanyId)
                .eq(StringUtils.isNotBlank(checkVisitedDTO.getMobile()),Member::getPhone,checkVisitedDTO.getMobile())
                .eq(StringUtils.isNotBlank(checkVisitedDTO.getName()),Member::getName,checkVisitedDTO.getName())
                .eq(Member::getIsdeleted,Constants.ZERO)
@@ -1691,6 +1720,7 @@
    @Override
    public WxAuthorizeVO accountLogin(AccountLoginDTO accountLoginDTO){
        System.out.println(DESUtil.decrypt(Constants.EDS_PWD,"eIaPD5AR5DBuTBE9MW14QRG07IDKXCdh"));
        if(accountLoginDTO.getAccount().length()!=18
            //&&!IdcardUtil.isValidCard(accountLoginDTO.getAccount())
        ){
server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/VisitsServiceImpl.java
@@ -258,6 +258,7 @@
    @Override
    @Transactional(rollbackFor = {BusinessException.class,Exception.class})
    public Integer visitReporting(Visits visits) {
        visits.setSourceType(Constants.ZERO);
        isValidBaseParam(visits);
        //检验被拜访人是否合法
        Member visitMember = isValideVisitedUser(visits.getMemberId());
@@ -271,7 +272,7 @@
        visits.setVisitType(Integer.valueOf(systemDictDataBiz.queryByCode(Constants.SYSTEM,Constants.MDJ_VISIT_REQUIRED).getCode()));
        visits.setIdcardNo(DESUtil.decrypt(Constants.EDS_PWD, visitMember.getIdcardNo()));
        //初始化访客信息
        initVisitInfo(visits,date);
//        initVisitInfo(visits,date);
        visitsMapper.insert(visits);
        return visits.getId();
    }
@@ -607,12 +608,17 @@
                ||  StringUtils.isBlank( visits.getName())
                ||  StringUtils.isBlank( visits.getPhone())
                ||  StringUtils.isBlank( visits.getCompanyName())
                ||  visits.getIdcardType() == null
                ||  Objects.isNull(visits.getType())
//                ||  StringUtils.isBlank( visits.getFaceImg() )
                ||  StringUtils.isBlank( visits.getIdcardNo() )
                || visits.getReceptMemberId() == null){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!");
        }
        if(Constants.equalsInteger(visits.getType(),Constants.ZERO)
             ||  Constants.equalsInteger(visits.getType(),Constants.ONE)){
            if(  visits.getIdcardType() == null
                    ||  StringUtils.isBlank( visits.getIdcardNo() ) ){
                throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!");
            }
        }
        //访客报备
        if(visits.getType().equals(Constants.TWO)
@@ -620,10 +626,10 @@
                ||  StringUtils.isBlank( visits.getPhone())
                ||  StringUtils.isBlank( visits.getCompanyName()))
                ||  StringUtils.isBlank( visits.getCarNos())
                ||  Objects.isNull(visits.getReceptMemberId())
        ){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,信息填写不正确!");
        }else if(visits.getType().equals(Constants.ONE) && StringUtils.isBlank(visits.getConstructionReason())){
            throw  new BusinessException(ResponseStatus.BAD_REQUEST.getCode(), "对不起,未填写施工事由!");
        }
        if(visits.getEndtime().getTime() < System.currentTimeMillis()){