Parcourir la source

转移会员审批

Long il y a 1 semaine
Parent
commit
60d317a0a6
2 fichiers modifiés avec 418 ajouts et 0 suppressions
  1. 27 0
      src/api/company/companyApply.js
  2. 391 0
      src/views/company/companyApply/index.vue

+ 27 - 0
src/api/company/companyApply.js

@@ -0,0 +1,27 @@
+import request from '@/utils/request'
+
+// 查询更换会员归属申请列表
+export function listApply(query) {
+  return request({
+    url: '/company/apply/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询更换会员归属申请详细
+export function getApply(id) {
+  return request({
+    url: '/company/apply/' + id,
+    method: 'get'
+  })
+}
+
+// 审核更换会员归属申请
+export function auditApply(data) {
+  return request({
+    url: '/company/apply/audit',
+    method: 'post',
+    data: data
+  })
+}

+ 391 - 0
src/views/company/companyApply/index.vue

@@ -0,0 +1,391 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="审核状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择审核状态" clearable size="small">
+          <el-option label="待审核" value="0" />
+          <el-option label="通过" value="1" />
+          <el-option label="拒绝" value="2" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <el-row :gutter="10" class="mb8">
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="applyList">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="原归属销售" align="center" prop="fromName" />
+      <el-table-column label="申请归属销售" align="center" prop="toName" />
+      <el-table-column label="审核状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <el-tag v-if="scope.row.status === 0" type="warning">待审核</el-tag>
+          <el-tag v-if="scope.row.status === 1" type="success">通过</el-tag>
+          <el-tag v-if="scope.row.status === 2" type="danger">拒绝</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="申请人" align="center" prop="applyBy" />
+      <el-table-column label="申请时间" align="center" prop="applyTime"/>
+      <el-table-column label="审核人" align="center" prop="auditBy" />
+      <el-table-column label="审核时间" align="center" prop="auditTime" />
+      <el-table-column label="拒绝原因" align="center" prop="reason" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            v-if="scope.row.status === 0"
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleAudit(scope.row)"
+            v-hasPermi="['company:apply:audit']"
+          >审核</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['company:apply:query']"
+          >详情</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 详情对话框 -->
+    <el-dialog 
+      title="申请详情" 
+      :visible.sync="detailsVisible" 
+      width="50%"
+      :close-on-click-modal="false"
+      custom-class="apply-details-dialog"
+    >
+      <!-- 申请基本信息 -->
+      <div class="details-header">
+        <div class="info-item">
+          <span class="label">原归属销售:</span>
+          <span class="value">{{ selectedApply.fromName }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">申请归属销售:</span>
+          <span class="value">{{ selectedApply.toName }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">申请时间:</span>
+          <span class="value">{{ selectedApply.applyTime }}</span>
+        </div>
+        <div class="info-item">
+          <span class="label">审核状态:</span>
+          <el-tag :type="selectedApply.status === 0 ? 'warning' : selectedApply.status === 1 ? 'success' : 'danger'">
+            {{ selectedApply.status === 0 ? '待审核' : selectedApply.status === 1 ? '通过' : '拒绝' }}
+          </el-tag>
+        </div>
+      </div>
+      
+      <!-- 用户列表 -->
+      <div class="details-content">
+        <div class="content-title">变更用户列表</div>
+        <el-table 
+          :data="selectedUsers" 
+          border 
+          style="width: 100%"
+          :header-cell-style="{background:'#f5f7fa',color:'#606266'}"
+        >
+          <el-table-column prop="userId" label="用户ID" align="center"></el-table-column>
+          <el-table-column prop="userName" label="姓名" align="center"></el-table-column>
+        </el-table>
+      </div>
+      
+      <!-- 底部操作区 -->
+      <div class="details-footer">
+        <el-button @click="detailsVisible = false">关闭</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 审核对话框 -->
+    <el-dialog 
+      title="审核申请" 
+      :visible.sync="auditVisible" 
+      width="40%"
+      :close-on-click-modal="false"
+      custom-class="audit-dialog"
+    >
+      <!-- 审核表单 -->
+      <el-form ref="auditForm" :model="auditForm" :rules="auditRules" label-width="100px">
+        <el-form-item label="原归属销售" prop="fromName">
+          <span>{{ auditForm.fromName }}</span>
+        </el-form-item>
+        <el-form-item label="申请归属销售" prop="toName">
+          <span>{{ auditForm.toName }}</span>
+        </el-form-item>
+        <el-form-item label="审核结果" prop="status">
+          <el-radio-group v-model="auditForm.status">
+            <el-radio :label="1">通过</el-radio>
+            <el-radio :label="2">拒绝</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item 
+          label="拒绝原因" 
+          prop="reason"
+          v-if="auditForm.status === 2"
+        >
+          <el-input
+            type="textarea"
+            v-model="auditForm.reason"
+            placeholder="请输入拒绝原因"
+            :rows="3"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+      
+      <!-- 底部操作区 -->
+      <div class="audit-footer">
+        <el-button @click="auditVisible = false">取 消</el-button>
+        <el-button type="primary" @click="submitAudit" :loading="submitLoading">确 定</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listApply, getApply, auditApply } from "@/api/company/companyApply";
+
+export default {
+  name: "Apply",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 更换会员归属申请表格数据
+      applyList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        status: null
+      },
+      // 详情对话框
+      detailsVisible: false,
+      // 选中的用户
+      selectedUsers: [],
+      // 选中的申请
+      selectedApply: {},
+      // 审核对话框
+      auditVisible: false,
+      // 提交加载状态
+      submitLoading: false,
+      // 审核表单
+      auditForm: {
+        id: undefined,
+        status: 1,
+        reason: ''
+      },
+      // 审核表单校验规则
+      auditRules: {
+        status: [
+          { required: true, message: "请选择审核结果", trigger: "change" }
+        ],
+        reason: [
+          { required: true, message: "请输入拒绝原因", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询更换会员归属申请列表 */
+    getList() {
+      this.loading = true;
+      listApply(this.queryParams).then(response => {
+        this.applyList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 详情按钮操作 */
+    handleDetails(row) {
+      this.detailsVisible = true;
+      this.selectedApply = row;
+      getApply(row.id).then(response => {
+        this.selectedUsers = response.data.users;
+      });
+    },
+    /** 审核按钮操作 */
+    handleAudit(row) {
+      this.auditVisible = true;
+      this.auditForm = {
+        id: row.id,
+        fromName: row.fromName,
+        toName: row.toName,
+        status: 1,
+        reason: ''
+      };
+    },
+    /** 提交审核 */
+    submitAudit() {
+      this.$refs["auditForm"].validate(valid => {
+        if (valid) {
+          // 如果选择通过,不需要填写原因
+          if (this.auditForm.status === 1) {
+            this.auditForm.reason = '';
+          }
+          
+          this.submitLoading = true;
+          auditApply(this.auditForm).then(response => {
+            this.msgSuccess("审核成功");
+            this.auditVisible = false;
+            this.getList();
+          }).catch(error => {
+            this.msgError("审核失败:" + error);
+          }).finally(() => {
+            this.submitLoading = false;
+          });
+        }
+      });
+    }
+  }
+};
+</script>
+
+<style lang="scss" scoped>
+/* 详情弹窗样式 */
+.apply-details-dialog {
+  ::v-deep .el-dialog__body {
+    padding: 20px;
+  }
+  
+  /* 头部信息样式 */
+  .details-header {
+    display: flex;
+    flex-wrap: wrap;
+    padding: 15px;
+    background-color: #f8f9fa;
+    border-radius: 4px;
+    margin-bottom: 20px;
+    
+    .info-item {
+      width: 50%;
+      margin-bottom: 10px;
+      display: flex;
+      align-items: center;
+      
+      .label {
+        color: #606266;
+        font-size: 14px;
+        width: 100px;
+        text-align: right;
+      }
+      
+      .value {
+        color: #303133;
+        font-size: 14px;
+        margin-left: 10px;
+      }
+    }
+  }
+  
+  /* 内容区域样式 */
+  .details-content {
+    .content-title {
+      font-size: 16px;
+      color: #303133;
+      font-weight: bold;
+      margin-bottom: 15px;
+      padding-left: 10px;
+      border-left: 3px solid #409EFF;
+    }
+  }
+  
+  /* 底部样式 */
+  .details-footer {
+    margin-top: 20px;
+    text-align: right;
+    padding-top: 15px;
+    border-top: 1px solid #ebeef5;
+  }
+}
+
+/* 表格样式优化 */
+::v-deep .el-table {
+  .el-table__header-wrapper {
+    th {
+      background-color: #f5f7fa;
+      color: #606266;
+      font-weight: bold;
+    }
+  }
+  
+  .el-table__body-wrapper {
+    tr:hover > td {
+      background-color: #f5f7fa;
+    }
+  }
+}
+
+/* 审核弹窗样式 */
+.audit-dialog {
+  ::v-deep .el-dialog__body {
+    padding: 20px;
+  }
+  
+  /* 表单样式 */
+  .el-form {
+    padding: 20px 0;
+    
+    .el-form-item {
+      margin-bottom: 20px;
+      
+      span {
+        color: #606266;
+        font-size: 14px;
+      }
+    }
+  }
+  
+  /* 底部样式 */
+  .audit-footer {
+    margin-top: 20px;
+    text-align: right;
+    padding-top: 15px;
+    border-top: 1px solid #ebeef5;
+  }
+}
+</style>