ll
liukangdong
2024-10-18 9c491f119144c9bc536c1cf39307ad82be96b85b
ll
已添加18个文件
已修改13个文件
500 ■■■■■ 文件已修改
admin/src/components/business/OperaCarUseBookWindow.vue 242 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaHiddenDangerWindow.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/CommonHeader.vue 113 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/common/GlobalAlertWindow.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/platform/index.vue 22 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/dangetDetail.vue 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/driverDetail.vue 35 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/index.vue 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visReportDetail.vue 32 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/views/task/visSubDetail.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/index.vue 33 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
h5/pages/staff/task/visitorReport.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/pages/index/login.vue 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/release/apk/__UNI__8789FB4__20241018164933.apk 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/1024x1024.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/120x120.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/144x144.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/152x152.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/167x167.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/180x180.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/192x192.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/20x20.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/29x29.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/40x40.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/58x58.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/60x60.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/72x72.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/76x76.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/80x80.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/87x87.png 补丁 | 查看 | 原始文档 | blame | 历史
pda/unpackage/res/icons/96x96.png 补丁 | 查看 | 原始文档 | blame | 历史
admin/src/components/business/OperaCarUseBookWindow.vue
@@ -1,18 +1,14 @@
<template>
  <GlobalWindow
      :title="title"
      :visible.sync="visible"
      @confirm="confirm"
  >
  <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 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" 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:#B2B2B2; " v-if="model.status === 4">已撤销</span>
@@ -22,86 +18,98 @@
          <div class="list">
            <div class="item" style="width: 100%">
              <div class="label">申请人</div>
              <div class="value">{{model.memberName || ''}} {{model.memberPhone || ''}} ({{model.companyName || ''}})</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 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 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.content }}</div>
            </div>
            <div class="item">
              <div class="label">乘车人员</div>
              <div class="value">{{model.memberNames || ''}}</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>
              <div class="value status-red"   v-if="model.type == 1">【市外用车】</div>
              <div class="value status-red" v-if="model.type == 1">【市外用车】</div>
            </div>
            <div class="item">
              <div class="label">目的地</div>
              <div class="value">{{model.addr || ''}}</div>
              <div class="value">{{ model.addr || '' }}</div>
            </div>
            <div class="item">
              <div class="label">预计出发时间</div>
              <div class="value">{{model.planUseDate || ''}}</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 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="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)"/>
              <img src="@/assets/icons/ic_grey.png"  class="iconnew" v-if=" (item.status==null || item.status==0 )"/>
              <div style="display: inline" v-if="item.approveType !=1">
                <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="" />
              <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" />
              <img src="@/assets/icons/ic_grey.png" class="iconnew" v-if="item.status == null || item.status == 0" />
              <div style="display: inline" v-if="item.approveType != 1">
                <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.type !=1"  src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
                <img v-if="item.type == 1"  src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              <div style="display: inline" v-if="item.approveType == 1">
                <img v-if="item.type != 1" src="@/assets/icons/ic_duoren.png" class="avatar" alt="" />
                <img v-if="item.type == 1" src="@/assets/icons/ic_chaosong.png" class="avatar" alt="" />
              </div>
              <div class="content">
                <div class="line">
                  <div class="name">{{ item.title}}</div>
                  <div class="name">{{ item.title }}</div>
                  <div class="time">{{ item.checkDate }}</div>
                </div>
                <div class="line">
                  <div class="company">
                    {{ item.memberName }}
                    <div style="display: inline" v-if="item.statusInfo!=null && item.statusInfo!=''">
                       (<span class="status-green">{{item.statusInfo ||''}}</span>)
                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                      (<span :class="{ padding: item.statusInfo == '处理中' || item.status == '1' }">{{
                        item.statusInfo || ""
                      }}</span>)
                    </div>
                  </div>
                </div>
              </div>
            </div>
            <div v-if="item.approveType != 1 && item.checkInfo !=null && item.checkInfo !=''" class="remark">
              {{ item.checkInfo || '' }}
            <div v-if="
              item.approveType != 1 &&
              item.checkInfo != null &&
              item.checkInfo != ''
            " class="remark">
              {{ item.checkInfo || "" }}
            </div>
            <div v-if="item.approveType == 1 "  class="childList">
            <div v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="childList">
              <div class="m_content company" 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 > {{item1.memberName}}</span>
                <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> {{ item1.memberName }}</span>
              </div>
            </div>
          </div>
@@ -109,38 +117,27 @@
      </div>
    </div>
    <!--  -->
    <template   v-slot:footer>
      <el-button @click="agreeOpen"  type="primary"  v-if="model.approveDateVO!=null&& model.approveDateVO.canBeApproved!=null &&model.approveDateVO.canBeApproved ==1 "  class="status-red">同意</el-button>
      <el-button @click="jectOpen"  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 v-slot:footer>
      <el-button @click="agreeOpen" type="primary"
        v-if="model.approveDateVO != null && model.approveDateVO.canBeApproved != null && model.approveDateVO.canBeApproved == 1"
        class="status-red">同意</el-button>
      <el-button @click="jectOpen" 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="同意申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isShowProblem"
        width="480px"
    >
      <el-form :model="dealForm" :rules="rules" ref="dealForm" >
    <el-dialog append-to-body title="同意申请" style="text-align: center" class="dialogCl" :visible.sync="isShowProblem"
      width="480px">
      <el-form :model="dealForm" :rules="rules" ref="dealForm">
        <!-- <el-form-item label="派车司机" prop="driverId" required v-if="model.approveDateVO!=null && model.approveDateVO.driverParam === 1"> -->
        <el-form-item label="派车司机" prop="driverId" v-if="model.approveDateVO!=null && model.approveDateVO.driverParam == 1">
          <el-select v-model="dealForm.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-form-item label="派车司机" prop="driverId"
          v-if="model.approveDateVO != null && model.approveDateVO.driverParam == 1">
          <el-select v-model="dealForm.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="dealForm.checkInfo"
          />
          <el-input type="textarea" placeholder="请填写说明" :rows="4" v-model="dealForm.checkInfo" />
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
@@ -148,26 +145,15 @@
        <el-button type="primary" :loading="dealing" @click="dealDo">确定</el-button>
      </span>
    </el-dialog>
    <el-dialog
        append-to-body
        title="拒绝申请"
        style="text-align: center"
        class="dialogCl"
        :visible.sync="isBackProblem"
        width="600px"
    >
      <el-form :model="backForm"  ref="backForm" label-width="100px">
    <el-dialog append-to-body title="拒绝申请" style="text-align: center" 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-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 @click="isBackProblem = false">取消</el-button>
        <el-button type="primary" :loading="dealing" @click="backDo">确定</el-button>
      </span>
    </el-dialog>
@@ -184,12 +170,12 @@
  name: 'OperaCarUseBookWindow',
  components: { GlobalWindow },
  extends: BaseOpera,
  data () {
  data() {
    return {
      title: '公务车申请',
      visible: false,
      dataId: null,
      model: { },
      model: {},
      dealing: false,
      isShowProblem: false,
      isBackProblem: false,
@@ -209,14 +195,14 @@
  computed: {
    ...mapState(['userInfo'])
  },
  created () {
  created() {
    this.config({
      api: '/business/carUseBook',
      'field.id': 'id'
    })
  },
  methods: {
    dealDo () {
    dealDo() {
      this.$refs.dealForm.validate((valid) => {
        if (!valid) {
          return
@@ -242,18 +228,18 @@
          })
      })
    },
    agreeOpen () {
    agreeOpen() {
      this.isShowProblem = true
      this.$set(this.dealForm, 'checkInfo', '')
      this.loadMemberList()
    },
    jectOpen () {
    jectOpen() {
      this.isBackProblem = true
      this.backForm = {
        checkInfo: null
      }
    },
    backDo () {
    backDo() {
      this.$refs.backForm.validate((valid) => {
        if (!valid) {
          return
@@ -275,7 +261,7 @@
          })
      })
    },
    open (title, target) {
    open(title, target) {
      this.title = title
      this.visible = true
      this.model = {}
@@ -292,14 +278,26 @@
        this.getDetail()
      })
    },
    getDetail () {
    getDetail() {
      this.api.detail(this.dataId)
        .then(res => {
          this.model = res
          if (this.model.approveDateVO && this.model.approveDateVO.approveList.length > 0) {
            this.model.approveDateVO.approveList.forEach(item => {
              if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
                item.title = item.approveList[0].title
                item.faceImg = item.approveList[0].faceImg
                item.memberName = item.approveList[0].memberName
                item.statusInfo = item.approveList[0].statusInfo
                item.status = item.approveList[0].status
                item.approveList = []
              }
            })
          }
          this.dealForm.driveId = res.driveId
        })
    },
    loadMemberList () {
    loadMemberList() {
      driveList({}).then(res => {
        this.memberList = res
      })
@@ -309,6 +307,8 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.upload_box {
  width: 84px;
  height: 84px;
@@ -320,14 +320,17 @@
  align-items: center;
  color: #999999;
  border: 1px solid #e4e4e4;
  .icon {
    font-size: 24px;
  }
  .text {
    font-size: 12px;
  }
}
.side_title{
.side_title {
  font-weight: 600;
  font-size: 18px;
  color: #111111;
@@ -335,9 +338,11 @@
  margin-left: 20px;
  margin-top: 20px;
}
.modal_wrap {
  display: flex;
  height: 100%;
  .modal_content {
    flex: 1;
    padding: 0px 30px;
@@ -352,6 +357,7 @@
      margin-bottom: 20px;
      margin-top: 30px;
    }
    .info {
      .list {
        display: flex;
@@ -361,6 +367,7 @@
          display: flex;
          width: 40%;
          margin-bottom: 20px;
          &:nth-of-type(2n) {
            width: 60%;
          }
@@ -410,20 +417,24 @@
        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;
@@ -441,17 +452,20 @@
    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% - 36px);
          height: calc(100% - 30px);
          top: 49px;
        }
        .avatar {
          width: 40px;
          height: 40px;
@@ -459,75 +473,98 @@
          margin: 0 12px 0 16px;
          //border: 1px solid;
        }
        .childList{
        .childList {
          display: flex;
          flex-wrap: wrap;
          margin-left: 100px;
        }
        .company {
          font-size: 13px;
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
        .m_content{
        .m_content {
          display: flex;
          flex-direction: column;
          align-items: center;
          justify-content: center;
          margin-bottom: 4px;
        }
        .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{
          .iconnew {
            width: 24px;
            height: 24px;
          }
          .icon3 {
            position: relative;
            z-index: 11;
            color:gray;
            color: gray;
            font-size: 24px;
          }
          .content {
            flex: 1;
            .line {
              display: flex;
              justify-content: space-between;
              align-content: center;
              margin-bottom: 6px;
              .status {
                color: #888888;
              }
              .padding {
                color: $primaryColor;
              }
              .name {
                font-weight: 600;
                font-size: 16px;
                color: #111111;
              }
              .time {
                color: #888888;
              }
            }
          }
        }
        .remark {
          background: #f7f7f7;
          border-radius: 4px;
@@ -535,7 +572,6 @@
          color: #666666;
          margin-left: 100px;
        }
      }
    }
  }
admin/src/components/business/OperaHiddenDangerWindow.vue
@@ -551,6 +551,7 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.side_title{
  font-weight: 600;
  font-size: 18px;
@@ -748,7 +749,7 @@
                font-size: 13px;
                color: #888888;
                .status {
                  color: #00ba67;
                  color: $primaryColor;
                }
              }
            }
admin/src/components/common/CommonHeader.vue
@@ -19,63 +19,35 @@
        <el-dropdown v-if="isLogined" trigger="click">
          <span class="el-dropdown-link">
            <!-- <img v-if="userInfo != null" :src="userInfo.avatar == null ? `${require('@/assets/avatar/man.png')}` : userInfo.avatar" alt="">{{userInfo | displayName}}<i class="el-icon-arrow-down el-icon--right"></i> -->
            <img
              v-if="userInfo != null"
              style="width: 30px !important"
              src="@/assets/avatar/man.png"
              alt=""
            />{{ userInfo | displayName
            <img v-if="userInfo != null" style="width: 30px !important" src="@/assets/avatar/man.png" alt="" />{{
              userInfo | displayName
            }}<i class="el-icon-arrow-down el-icon--right"></i>
          </span>
          <el-dropdown-menu slot="dropdown">
            <el-dropdown-item @click.native="changePwd"
              >修改密码</el-dropdown-item
            >
            <el-dropdown-item @click.native="changePwd">修改密码</el-dropdown-item>
            <el-dropdown-item @click.native="logout">退出登录</el-dropdown-item>
          </el-dropdown-menu>
        </el-dropdown>
      </div>
    </div>
    <!-- 修改密码 -->
    <GlobalAlertWindow
      title="修改密码"
      :visible.sync="visible.changePwd"
    <GlobalAlertWindow title="修改密码" :visible.sync="visible.changePwd"
      :showClose="!userInfo.needChangePwd || userInfo.needChangePwd == '1'"
      :showCancel="userInfo.needChangePwd && userInfo.needChangePwd == '0'"
      @confirm="confirmChangePwd"
      @close="visible.changePwd = false"
    >
      <el-form
        :model="changePwdData.form"
        ref="changePwdDataForm"
        :rules="changePwdData.rules"
      >
      :showCancel="!userInfo.needChangePwd || userInfo.needChangePwd == '1'" @confirm="confirmChangePwd"
      @close="visible.changePwd = false">
      <el-form :model="changePwdData.form" ref="changePwdDataForm" :rules="changePwdData.rules">
        <el-form-item label="原始密码" prop="oldPwd" required>
          <el-input
            v-model="changePwdData.form.oldPwd"
            type="password"
            placeholder="请输入原始密码"
            maxlength="30"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.oldPwd" type="password" placeholder="请输入原始密码" maxlength="30"
            show-password></el-input>
        </el-form-item>
        <el-form-item label="新密码" prop="newPwd" required>
          <el-input
            v-model="changePwdData.form.newPwd"
            type="password"
            placeholder="请输入新密码"
            maxlength="20"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.newPwd" type="password" placeholder="请输入新密码,密码需包含字母、数字及特殊字符中的至少两种" maxlength="20"
            show-password></el-input>
        </el-form-item>
        <!-- <div style="font-size: 12px;color:#999999">密码需包含字母、数字及特殊字符中的至少两种</div> -->
        <el-form-item label="确认新密码" prop="confirmPwd" required>
          <el-input
            v-model="changePwdData.form.confirmPwd"
            type="password"
            placeholder="请再次输入新密码"
            maxlength="20"
            show-password
          ></el-input>
          <el-input v-model="changePwdData.form.confirmPwd" type="password" placeholder="请再次输入新密码" maxlength="20"
            show-password></el-input>
        </el-form-item>
      </el-form>
    </GlobalAlertWindow>
@@ -121,8 +93,8 @@
            { required: true, message: '请输入原始密码' }
          ],
          newPwd: [
          { required: true, message: '请输入密码', trigger: 'blur' },
          { validator: this.validatePassword, trigger: 'blur' },
            { required: true, message: '请输入密码', trigger: 'blur' },
            { validator: this.validatePassword, trigger: 'blur' },
          ],
          confirmPwd: [
            { required: true, message: '请再次输入新密码' }
@@ -139,10 +111,10 @@
  },
  mounted() {
    // console.log('userInfo',this.userInfo);
    if(!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0'){
      this.visible.changePwd = true
    if (!this.userInfo.needChangePwd || this.userInfo.needChangePwd == '0') {
      // this.visible.changePwd = true
    }
  },
  filters: {
    // 展示名称
@@ -167,27 +139,27 @@
    },
    validatePassword(rule, value, callback) {
      if (!value) {
        callback(new Error('请输入密码'));
        callback(new Error('请输入密码'))
      } else {
        const lengthValid = /^.{6,20}$/.test(value);
        const hasLetter = /[a-zA-Z]/.test(value);
        const hasNumber = /[0-9]/.test(value);
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value);
        const lengthValid = /^.{6,20}$/.test(value)
        const hasLetter = /[a-zA-Z]/.test(value)
        const hasNumber = /[0-9]/.test(value)
        const hasSpecial = /[!@#$%^&*(),.?":{}|<>]/.test(value)
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length;
        const typesCount = [hasLetter, hasNumber, hasSpecial].filter(Boolean).length
        if (!lengthValid) {
          callback(new Error('密码长度需为6到20个字符'));
          callback(new Error('密码长度需为6到20个字符'))
        } else if (typesCount < 2) {
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'));
          callback(new Error('密码需包含字母、数字及特殊字符中的至少两种'))
        } else {
          callback(); // 验证通过
          callback() // 验证通过
        }
      }
    },
    getHeaderNav(type){
    getHeaderNav(type) {
      getAppHeaderNav(type).then(res => {
        window.open(res, "_blank");
        window.open(res, "_blank")
      })
    },
    // 确定修改密码
@@ -215,7 +187,7 @@
            this.visible.changePwd = false
          })
          .catch(e => {
           //  this.$tip.apiFailed(e)
            //  this.$tip.apiFailed(e)
          })
          .finally(() => {
            this.isWorking.changePwd = false
@@ -241,15 +213,18 @@
<style scoped lang="scss">
@import "@/assets/style/variables.scss";
.common-header {
  background-color: #2080f7;
}
.list{
.list {
  flex: 1;
  display: flex;
  align-items: center;
  margin-left: 60px;
  .item{
  .item {
    margin-right: 40px;
    font-size: 16px;
    font-weight: 400;
@@ -259,16 +234,19 @@
    justify-content: flex-start;
    height: 40px;
    cursor: pointer;
    .linellae{
    .linellae {
      width: 64px;
      height: 2px;
      background: #FFFFFF;
    }
  }
  .active{
  .active {
    font-weight: 500;
  }
}
.header {
  overflow: hidden;
  // background: #fff;
@@ -289,9 +267,11 @@
    color: #fff;
    display: flex;
    align-items: center;
    .title{
    .title {
      width: 200px;
    }
    // display: inline;
    .title-en {
      font-size: 11px;
@@ -299,6 +279,7 @@
      color: rgb(202, 214, 238);
    }
  }
  .user {
    width: 212px;
    box-sizing: border-box;
@@ -308,10 +289,12 @@
    flex-shrink: 0;
    text-align: right;
    cursor: pointer;
    .el-dropdown {
      top: 2px;
      color: #fff;
    }
    img {
      width: 32px;
      position: relative;
@@ -320,9 +303,11 @@
    }
  }
}
// 下拉菜单框
.el-dropdown-menu {
  width: 140px;
  .el-dropdown-menu__item:hover {
    background: #e3edfb;
    color: $primary-color;
admin/src/components/common/GlobalAlertWindow.vue
@@ -21,7 +21,7 @@
    <div v-if="withFooter" class="window__footer">
      <slot name="footer">
        <el-button @click="confirm" :loading="confirmWorking" type="primary">确定</el-button>
        <el-button v-if="showCancel" @click="close">取消</el-button>
        <el-button v-if="!showCancel" @click="close">取消</el-button>
      </slot>
    </div>
  </el-dialog>
@@ -41,7 +41,7 @@
    },
    showCancel: {
      type: Boolean,
      default: true
      default: false
    },
    // 是否包含底部操作
    withFooter: {
admin/src/views/platform/index.vue
@@ -62,27 +62,27 @@
              </div>
            </div>
            <div class="line">
              <div v-if="task.billCode" class="ite">
              <div v-if="task.billCode" style="width: 40%;" class="ite">
                <span>运输单号:</span>
                <span>{{ task.billCode }}</span>
              </div>
              <div v-else class="ite">
              <div v-else class="ite" style="width: 40%;">
                <span>合同单号:</span>
                <span>{{ task.contractNum }}</span>
              </div>
              <div class="ite siji">
              <div class="ite jiashi">
                <span>驾驶员:</span>
                <span>{{ task.driverName }}</span>
                <span>{{ task.driverName }} {{ task.drivierPhone }}</span>
              </div>
              <div class="ite phone">
              <!-- <div class="ite phone">
                <span>手机号:</span>
                <span>{{ task.drivierPhone }}</span>
              </div>
              <div class="ite">
              </div> -->
              <div class="ite" style="width: 40%">
                <span>总运输量:</span>
                <span>{{ task.totalNum }}万支</span>
              </div>
              <div v-if="task.billCode" class="ite" style="width: 66.6%">
              <div v-if="task.billCode" class="ite" style="width: 60%">
                <span>运输公司:</span>
                <span>{{ task.carrierName }}</span>
              </div>
@@ -497,12 +497,12 @@
          margin-bottom: 6px;
          .ite {
            width: 33.3%;
            width: 50%;
            margin-top: 8px;
          }
          .siji {
            width: 29%;
          .jiashi {
            width: 60%;
          }
          .phone {
admin/src/views/task/dangetDetail.vue
@@ -601,6 +601,7 @@
</script>
<style lang="scss" scoped>
@import "@/assets/style/variables.scss";
.upload_wrap {
  display: flex;
  flex-wrap: wrap;
@@ -800,7 +801,7 @@
          font-size: 13px;
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
        .m_content {
admin/src/views/task/driverDetail.vue
@@ -3,15 +3,19 @@
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-if="info.status == '3' || info.status == '6'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png"
            alt="">
          <img v-else-if="info.status == '2' || info.status == '5'" class="head_bg"
            src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.status == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
          <div class="left">
            <div class="h1">物流车预约</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
          </div>
          <div class="right" :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{ statusMap[info.status] }}</div>
          <div class="right"
            :class="{ scs: info.status == '2' || info.status == '5', msg: info.status == '3' || info.status == '6' }">{{
              statusMap[info.status] }}</div>
        </div>
        <div class="info">
          <div class="title">物流车预约信息</div>
@@ -43,7 +47,8 @@
            <div class="item">
              <div class="label">准运证照片</div>
              <div v-if="info.transportImg" class="value">
                <el-image  style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]" :src="info.prefixUrl + info.transportImg" alt="" />
                <el-image style="width: 100px" :preview-src-list="[info.prefixUrl + info.transportImg]"
                  :src="info.prefixUrl + info.transportImg" alt="" />
              </div>
            </div>
          </div>
@@ -210,7 +215,7 @@
        }
      })
    },
    close(){
    close() {
      this.isShowModal = false
      this.$emit('close')
    },
@@ -275,6 +280,7 @@
    border-radius: 8px;
    overflow: hidden;
    height: 100%;
    .title {
      font-weight: 600;
      font-size: 18px;
@@ -317,7 +323,8 @@
      margin: 0 -30px;
      border-radius: 8px 8px 0 0;
      position: relative;
      .head_bg{
      .head_bg {
        position: absolute;
        width: 100%;
        height: 100%;
@@ -325,6 +332,7 @@
        top: 0;
        z-index: 9;
      }
      .h1 {
        font-weight: 600;
        font-size: 22px;
@@ -349,10 +357,12 @@
        position: relative;
        z-index: 99;
      }
      .scs{
      .scs {
        background-color: #00BA67;
      }
      .msg{
      .msg {
        background-color: #ED4545;
      }
    }
@@ -398,6 +408,7 @@
        display: flex;
        margin-bottom: 24px;
        position: relative;
        .separate {
          position: absolute;
          border-left: 2px dashed #cccccc;
@@ -405,15 +416,18 @@
          height: calc(100% - 2px);
          top: 42px;
        }
        .info{
        .info {
          padding-top: 10px;
          margin-left: 20px;
          margin-right: 16px;
          .iconnew {
            width: 24px;
            height: 24px;
          }
        }
        .avatar_wrap {
          width: 40px;
          height: 40px;
@@ -460,7 +474,7 @@
            color: #777777;
            .status {
              color: $primary-color;
              color: $primaryColor;
            }
          }
@@ -480,6 +494,7 @@
          width: 100%;
          overflow-x: auto;
          margin-top: 12px;
          .carbon_item {
            text-align: center;
            flex-shrink: 0;
admin/src/views/task/index.vue
@@ -165,12 +165,12 @@
      },
      pagination: {
        capacity: 10,
        page: 1
        page: 1,
        total: 0,
      },
      loading: false,
      dataList: [],
      headData: {},
      total: 0,
      cateList: [
        { name: '访客申请', id: 0 },
@@ -268,6 +268,7 @@
      }).then(res => {
        console.log('res', res)
        this.dataList = res.records || []
        this.pagination.total = res.total || 0
        this.dataList.forEach(i => {
          i.param1 = JSON.parse(i.param1)
        })
admin/src/views/task/visReportDetail.vue
@@ -3,19 +3,17 @@
    <div class="modal_wrap">
      <div class="modal_content">
        <div class="header">
          <img v-if="info.businessStatus == '3'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png"
          <img v-if="info.businessStatus == '3'" class="head_bg" src="@/assets/task/bg_shenhe_fail@2x.png" alt="">
          <img v-else-if="info.businessStatus == '2'" class="head_bg" src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.businessStatus == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png"
            alt="">
          <img v-else-if="info.businessStatus == '2'" class="head_bg"
            src="@/assets/task/bg_shenhe_pass@2x.png" alt="">
          <img v-else-if="info.businessStatus == '4'" class="head_bg" src="@/assets/task/bg_shenhe_chexiao@2x.png" alt="">
          <img v-else class="head_bg" src="@/assets/task/bg_shenhe@2x.png" alt="">
          <div class="left">
            <div class="h1">{{ cateList[type] }}</div>
            <div class="time">提交时间:{{ info.createDate }}</div>
          </div>
          <div class="right"
            :class="{ scs: info.businessStatus == '2', msg: info.businessStatus == '3' }">{{
              statusMap[info.businessStatus] }}</div>
          <div class="right" :class="{ scs: info.businessStatus == '2', msg: info.businessStatus == '3' }">{{
            statusMap[info.businessStatus] }}</div>
        </div>
        <div class="info">
          <div class="title">访客报备信息</div>
@@ -83,7 +81,7 @@
                    <div style="display: inline" v-if="item.statusInfo != null && item.statusInfo != ''">
                      (<span :class="{ padding: item.statusInfo == '处理中' || item.status == '1' }">{{
                        item.statusInfo || ""
                        }}</span>)
                      }}</span>)
                    </div>
                  </div>
                </div>
@@ -96,7 +94,7 @@
            " class="remark">
              {{ item.checkInfo || "" }}
            </div>
            <div v-if="item.approveType == 1" class="childList">
            <div v-if="item.approveType == 0 || item.type == 1 || item.approveType == 1" class="childList">
              <div class="m_content company" 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"
@@ -238,7 +236,7 @@
          })
      })
    },
    close(){
    close() {
      this.isShowModal = false
      this.$emit('close')
    },
@@ -246,6 +244,18 @@
      const { id } = this
      getVisitedReDetail({ id }).then(res => {
        this.info = res
        if (this.info.approveDateVO && this.info.approveDateVO.approveList.length > 0) {
          this.info.approveDateVO.approveList.forEach(item => {
            if (item.approveList && item.approveList.length == 1 && item.type !== 1) {
              item.title = item.approveList[0].title
              item.faceImg = item.approveList[0].faceImg
              item.memberName = item.approveList[0].memberName
              item.statusInfo = item.approveList[0].statusInfo
              item.status = item.approveList[0].status
              item.approveList = []
            }
          })
        }
      })
    },
    handleAppr(val) {
@@ -463,7 +473,7 @@
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
admin/src/views/task/visSubDetail.vue
@@ -516,7 +516,7 @@
          color: #888888;
          .status {
            color: #00ba67;
            color: $primaryColor;
          }
        }
h5/pages/staff/index.vue
@@ -18,7 +18,7 @@
        mode="widthFix"
      ></image>
    </view>
    <view class="title_wrap"><view class="name">业务办理</view></view>
    <view v-if="list1.filter(i => checkAuth(i.auth)).length > 0" class="title_wrap"><view class="name">业务办理</view></view>
    <view class="container1">
            <view class="list">
                <block v-for="item in list1" :key="item.name">
@@ -65,13 +65,16 @@
      </view> -->
    </view>
    <!--  -->
    <view class="title_wrap"><view class="name">业务查询</view></view>
    <view v-if="list2.filter(i => checkAuth(i.auth)).length > 0" class="title_wrap"><view class="name">业务查询</view></view>
    <view class="container2">
            <view class="list">
                <view class="item" @click="jump(item.url)" v-for="item in list2" :key="item.name">
                    <image :src="item.img" class="icon" />
                    <view class="name">{{item.name}}</view>
                </view>
                <block v-for="item in list2" :key="item.name">
                    <view v-if="checkAuth(item.auth)" class="item" @click="jump(item.url)">
                        <image :src="item.img" class="icon" />
                        <view class="name">{{item.name}}</view>
                        <view v-if="item.name == '任务中心' && taskInfo" class="task_num">{{ taskInfo }}</view>
                    </view>
                </block>
            </view>
            
<!--      <view class="img_wrap" @click="jump('/pages/staff/task/index')">
@@ -206,6 +209,9 @@
        isDetail: '1'
      }).then(res => {
        this.taskInfo = res.data.noticeWaitNum + res.data.noticeCopyNum
                if(this.taskInfo && this.taskInfo > 99){
                    this.taskInfo = 99
                }
      })
    },
  }
@@ -250,11 +256,26 @@
        width: 25%;
        margin-bottom: 40rpx;
        font-size: 26rpx;
        position: relative;
        image{
            width: 88rpx;
            height: 88rpx;
            margin-bottom: 20rpx;
        }
        .task_num{
            position: absolute;
            top: -10rpx;
            right: 28rpx;
            font-size: 24rpx;
            width: 36rpx;
            height: 36rpx;
            background-color: red;
            color: #fff;
            border-radius: 50%;
            display: flex;
            justify-content: center;
            align-items: center;
        }
    }
}
.banner_wrap {
h5/pages/staff/task/visitorReport.vue
@@ -44,7 +44,7 @@
      </view>
      <view class="item">
        <view class="label">访客单位</view>
        <view class="value">{{ info.companyName }}人</view>
        <view class="value">{{ info.companyName }}</view>
      </view>
      <view class="item">
        <view class="label">来访事由</view>
pda/pages/index/login.vue
@@ -42,8 +42,8 @@
  data() {
    return {
      form: {
        username: '13996529050',
        password: '123456',
        username: '',
        password: '',
      },
            err: '',
      isShowProtocol: false,
pda/unpackage/release/apk/__UNI__8789FB4__20241018164933.apk
Binary files differ
pda/unpackage/res/icons/1024x1024.png
pda/unpackage/res/icons/120x120.png
pda/unpackage/res/icons/144x144.png
pda/unpackage/res/icons/152x152.png
pda/unpackage/res/icons/167x167.png
pda/unpackage/res/icons/180x180.png
pda/unpackage/res/icons/192x192.png
pda/unpackage/res/icons/20x20.png
pda/unpackage/res/icons/29x29.png
pda/unpackage/res/icons/40x40.png
pda/unpackage/res/icons/58x58.png
pda/unpackage/res/icons/60x60.png
pda/unpackage/res/icons/72x72.png
pda/unpackage/res/icons/76x76.png
pda/unpackage/res/icons/80x80.png
pda/unpackage/res/icons/87x87.png
pda/unpackage/res/icons/96x96.png