From 69a1b3bf45738f048361ee4ccb6bdc64fce35720 Mon Sep 17 00:00:00 2001
From: MrShi <1878285526@qq.com>
Date: 星期三, 12 三月 2025 11:31:46 +0800
Subject: [PATCH] 更新

---
 admin/src/views/task/visSubDetail.vue |  610 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 610 insertions(+), 0 deletions(-)

diff --git a/admin/src/views/task/visSubDetail.vue b/admin/src/views/task/visSubDetail.vue
new file mode 100644
index 0000000..c172862
--- /dev/null
+++ b/admin/src/views/task/visSubDetail.vue
@@ -0,0 +1,610 @@
+<template>
+  <GlobalWindow :title="title" :visible.sync="isShowModal" @close="close" @confirm="confirm">
+    <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" 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.createTime }}</div>
+          </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>
+          <div class="list">
+            <div class="item">
+              <div class="label">琚浜�</div>
+              <div class="value">{{ info.visitUserName }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ鏃堕棿</div>
+              <div class="value">{{ info.visitTime }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏉ヨ浜嬬敱</div>
+              <div class="value">{{ info.visitReason }}</div>
+            </div>
+            <div class="item">
+              <div class="label">闅忚杞﹁締</div>
+              <div class="value">{{ info.carNos }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏄惁娑夊強鏂藉伐浣滀笟</div>
+              <div class="value">{{ info.type == "0" ? "鍚�" : "鏄�" }}</div>
+            </div>
+            <div class="item">
+              <div class="label">鏂藉伐鍐呭</div>
+              <div class="value">{{ info.constructionReason }}</div>
+            </div>
+          </div>
+        </div>
+        <div class="table_info">
+          <div class="title">璁垮淇℃伅</div>
+          <el-table :data="[info]" border fit>
+            <el-table-column label="濮撳悕" prop="" min-width="150">
+              <template slot-scope="{ row }">
+                <div class="name_wrap">
+                  <image :src="row.prefix
+                    ? row.prefix
+                    : require('@/assets/avatar/man.png')
+                    " class="avatar" mode="" />
+                  <div class="content">
+                    <div class="line">
+                      <div class="name">{{ row.name }}</div>
+                      <div class="tag">鐢宠浜�</div>
+                    </div>
+                    <div class="line placeholder9">{{ row.phone }}</div>
+                  </div>
+                </div>
+              </template>
+            </el-table-column>
+            <!-- <el-table-column label="鎬у埆" prop="" min-width="40" /> -->
+            <el-table-column label="璇佷欢绫诲瀷" prop="idcardTypeName" min-width="80">
+              <template slot-scope="{ row }">
+                <span v-if="row.idcardType == 0">韬唤璇�</span>
+                <span v-if="row.idcardType == 1">娓境璇佷欢</span>
+                <span v-if="row.idcardType == 2">鎶ょ収</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="璇佷欢鍙风爜" prop="idCardDecode" min-width="120" />
+            <el-table-column label="鍏徃鍚嶇О" prop="companyName" min-width="120" />
+            <el-table-column label="浜鸿劯鐓х墖" prop="" min-width="80">
+              <template slot-scope="{ row }">
+                <el-image v-if="row.prefix && row.faceImg" :src="row.prefix + row.faceImg" :preview-src-list="[row.prefix + row.faceImg]">
+                </el-image>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+      </div>
+      <div class="side">
+        <div class="side_title">瀹℃壒娴佺▼</div>
+        <div class="list" v-if="
+          info.approveDateVO != null && info.approveDateVO.approveList != null
+        ">
+          <div class="item" v-for="(item, index) in info.approveDateVO.approveList" :key="item.id">
+            <div class="separate" v-if="index < info.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="" />
+              </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>
+              <div class="content">
+                <div class="line">
+                  <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="{ 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>
+            <div v-if="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>
+              </div>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!--  -->
+    <template v-slot:footer>
+      <el-button @click="handleAppr(2)" type="primary" class="status-red" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鍚屾剰</el-button>
+      <el-button @click="handleAppr(3)" type="danger" v-if="
+        info.approveDateVO != null &&
+        info.approveDateVO.canBeApproved != null &&
+        info.approveDateVO.canBeApproved == 1
+      ">鎷掔粷</el-button>
+      <el-button @click="close">杩斿洖</el-button>
+    </template>
+    <!--  鍚屾剰/鎷掔粷 -->
+    <el-dialog append-to-body :title="param.status == 2 ? '鍚屾剰' : '鎷掔粷'" :visible.sync="isShowAppr" width="480px">
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">
+        <el-form-item :prop="param.status == 3 ? 'checkInfo' : ''" :label="param.status == 2 ? '鍚屾剰璇存槑' : '鎷掔粷璇存槑'">
+          <el-input type="textarea" :placeholder="param.status == 2 ? '鍚屾剰璇存槑锛岄潪蹇呭~' : '鎷掔粷璇存槑蹇呭~'
+            " :rows="4" v-model="param.checkInfo" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowAppr = false">鍙栨秷</el-button>
+        <el-button :loading="subLoading" type="primary" @click="onSubAppr">纭畾</el-button>
+      </span>
+    </el-dialog>
+    <!-- 闅愭偅 -->
+    <el-dialog append-to-body title="闅愭偅" :visible.sync="isShowProblem" width="480px">
+      <el-form :model="param" :rules="rules" ref="ruleForm" label-width="100px">
+        <el-form-item label="閫�鍥炴椂闂�">
+          <el-date-picker class="w300" value-format="yyyy-MM-dd" type="date" placeholder="閫夋嫨鏃ユ湡" v-model="param.date" />
+        </el-form-item>
+        <el-form-item label="鏁存敼鍓�">
+          <div class="df_ac">
+            <img src="@/assets/avatar/man.png" />
+            <el-upload class="avatar-uploader" action="https://jsonplaceholder.typicode.com/posts/"
+              :show-file-list="false" :on-success="handleAvatarSuccess" :before-upload="beforeAvatarUpload">
+              <img v-if="param.url" :src="param.url" class="avatar" />
+              <div v-else class="upload_box">
+                <el-icon class="el-icon-plus icon" />
+                <div class="text">鍥剧墖/瑙嗛</div>
+              </div>
+            </el-upload>
+          </div>
+        </el-form-item>
+        <el-form-item label="閫�鍥炶鏄�">
+          <el-input type="textarea" placeholder="璇峰~鍐欒鏄�" :rows="4" v-model="param.explain" />
+        </el-form-item>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="isShowProblem = false">鍙栨秷</el-button>
+        <el-button type="primary" @click="isShowProblem = false">纭畾</el-button>
+      </span>
+    </el-dialog>
+  </GlobalWindow>
+</template>
+
+<script>
+import GlobalWindow from '@/components/common/GlobalWindow'
+import {
+  getVisitedDetail,
+  approveDo
+} from '@/api'
+export default {
+  components: { GlobalWindow },
+  data() {
+    return {
+      id: '',
+      type: '',
+
+      title: '璁垮棰勭害璇︽儏',
+      isShowModal: false,
+      info: {},
+      isShowAppr: false,
+      apprTitle: '鍚屾剰',
+      subLoading: false,
+      param: {},
+
+      isShowProblem: false,
+      rules: {
+        checkInfo: [{ required: true, message: '璇疯緭鍏�', trigger: 'blur' }]
+      },
+      statusMap: {
+        0: '寰呭鏍�',
+        1: '澶勭悊涓�',
+        2: '宸插悓鎰�',
+        3: '宸叉嫆缁�',
+        4: '宸插彇娑�',
+      },
+      cateList: {
+        0: '璁垮鐢宠',
+        1: '璁垮鎶ュ',
+        2: '鐢ㄨ溅鐢宠',
+        3: '闅愭偅闅忔墜鎷�',
+        4: '鐗╂祦杞︾敵璇�'
+      }
+    }
+  },
+  methods: {
+    onSubAppr() {
+      this.$refs.ruleForm.validate((valid) => {
+        if (!valid) {
+          return
+        }
+        this.$dialog.actionConfirm('鎿嶄綔纭', this.param.status === 2 ? '鎮ㄧ‘璁ゅ悓鎰忚鐢宠鍚楋紵' : '鎮ㄧ‘璁ゆ嫆缁濊鐢宠鍚楋紵')
+          .then(() => {
+            this.subLoading = true
+            approveDo({
+              objId: this.id,
+              objType: this.info.type,
+              status: this.param.status,
+              checkInfo: this.param.checkInfo
+            })
+              .then(res => {
+                this.subLoading = false
+                this.$tip.apiSuccess('澶勭悊鎴愬姛')
+                this.getDetail()
+                this.$emit('success')
+                this.$emit('close')
+                this.isShowAppr = false
+              })
+              .finally(() => {
+                this.subLoading = false
+              })
+          })
+      })
+    },
+    close(){
+      this.isShowModal = false
+      this.$emit('close')
+    },
+    getDetail() {
+      const { id, type } = this
+      console.log(id, type)
+      switch (type) {
+        case 0:
+          getVisitedDetail({ 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.approveList = []
+                }
+              })
+            }
+          })
+          break
+
+        default:
+          break
+      }
+    },
+    handleAppr(val) {
+      this.$set(this.param, 'status', val)
+      this.isShowAppr = true
+      this.$nextTick(() => {
+        this.$refs.ruleForm.clearValidate()
+      })
+    },
+    confirm() {
+      console.log('--')
+    },
+    handleTransfer() {
+      this.isShowProblem = true
+    },
+    reject() { },
+    handleAvatarSuccess() { },
+    beforeAvatarUpload() { }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+@import "@/assets/style/variables.scss";
+
+.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;
+  }
+}
+
+.side_title {
+  font-weight: 600;
+  font-size: 18px;
+  color: #111111;
+  margin-bottom: 20px;
+  margin-left: 20px;
+  margin-top: 20px;
+}
+
+.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;
+      position: relative;
+
+      .head_bg {
+        position: absolute;
+        width: 100%;
+        height: 100%;
+        left: 0;
+        top: 0;
+        z-index: 9;
+      }
+
+      .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;
+        position: relative;
+        z-index: 99;
+      }
+
+      .scs {
+        background-color: #00BA67;
+      }
+
+      .msg {
+        background-color: #ED4545;
+      }
+    }
+
+    .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% - 30px);
+          top: 49px;
+        }
+
+        .avatar {
+          width: 40px;
+          height: 40px;
+          border-radius: 50%;
+          margin: 0 12px 0 16px;
+          //border: 1px solid;
+        }
+
+        .childList {
+          display: flex;
+          flex-wrap: wrap;
+          margin-left: 100px;
+        }
+
+        .company {
+          font-size: 13px;
+          color: #888888;
+
+          .status {
+            color: $primaryColor;
+          }
+        }
+
+        .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 {
+            width: 24px;
+            height: 24px;
+          }
+
+          .icon3 {
+            position: relative;
+            z-index: 11;
+            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;
+          padding: 13px 15px;
+          color: #666666;
+          margin-left: 100px;
+        }
+      }
+    }
+  }
+}
+</style>

--
Gitblit v1.9.3