Pārlūkot izejas kodu

Merge branch 'ch/jinrui1.0' of eta_mini/eta_mini_crm_front into debug_jr

leichen 3 nedēļas atpakaļ
vecāks
revīzija
b439d7da10

+ 14 - 2
src/api/customer/modules/user.js

@@ -37,8 +37,16 @@ export default {
     return post('/users/remove',params)
   },
   //潜在用户转客户
-  potentialUserEdit:params=>{
-    return post('/user/potential/edit',params)
+  usersTransFormal:params=>{
+    return post('/users/trans_formal',params)
+  },
+  //移动联系人
+  usersMove:params=>{
+    return post('/users/move',params)
+  },
+  //移动联系人
+  usersReportClassifyTree:params=>{
+    return get('/report/classify_tree',params)
   },
   // 客户全局搜索
   userGlobalSearch:params=>{
@@ -80,4 +88,8 @@ export default {
   companyRemove:params=>{
     return post('/company/remove',params)
   },
+  // 机构搜索
+  companySearch:params=>{
+    return get('/company/search',params)
+  },
 };

+ 5 - 5
src/components/SelectReportClassify.vue

@@ -1,5 +1,5 @@
 <script setup>
-// import { apiReportCommon } from '@/api/report'
+import { apiCustomerUser } from '@/api/customer'
 
 const model=defineModel()
 const props=defineProps({
@@ -13,10 +13,10 @@ const emits=defineEmits(['change'])
 
 const options=ref([])
 async function getData(){
-  // const res=await apiReportCommon.classifyList()
-  // if(res.Ret!=200) return
-  // const arr=res.Data||[]
-  // options.value=arr
+  const res=await apiCustomerUser.usersReportClassifyTree()
+  if(res.Ret!=200) return
+  const arr=res.Data||[]
+  options.value=arr
 }
 getData()
 

+ 14 - 6
src/views/customer/CompanyEdit.vue

@@ -10,6 +10,9 @@ const router = useRouter()
 
 const CompanyId = ref(route.query.id || 0)
 
+const showAddContact = ref(false)
+const userInfo=ref({})
+
 const isView = computed(() => {
   return route.path === '/customer/companyDetail'
 })
@@ -31,6 +34,8 @@ const formState = reactive({
   sellerId:'',
   province: '',
   city: '',
+  CityId: '',
+  ProvinceId: '',
 })
 
 
@@ -49,6 +54,8 @@ function getUserInfo() {
       formState.sellerId = Detail.SellerId
       formState.province = Detail.Province
       formState.city = Detail.City
+      formState.ProvinceId = Detail.ProvinceId
+      formState.CityId = Detail.CityId
     }
   })
 }
@@ -116,13 +123,17 @@ async function handleSave(type) {
 
 
 function selectRegion(data) {
-  console.log(data);
-  
   formState.province = data.province.value;
   formState.ProvinceId = data.province.provinceKey;
   formState.city = data.city.value == '市' ? '' : data.city.value;
   formState.CityId = data.city.value == '市' ? '' : data.city.cityKey;
 }
+
+
+const contactTableRef = ref(null)
+function handleChangeList() {
+  contactTableRef.value.getUserList();
+}
 </script>
 
 <template>
@@ -210,11 +221,8 @@ function selectRegion(data) {
         <div class="text-icon"></div>
         <h3 class="text">联系人信息</h3>
       </div>
-      <el-button type="primary" color="#0052D9" style="width: 120px; margin-top: 10px;" @click="handleSave"
-          >添加联系人</el-button
-        >
       <ContactTable
-        v-model:checkedIds="checkedIds"
+        ref="contactTableRef"
       />
     </div>
   </div>

+ 36 - 7
src/views/customer/PotentialUserList.vue

@@ -5,6 +5,7 @@ import { useRouter } from 'vue-router'
 import { dayjs, ElMessage, ElMessageBox } from 'element-plus'
 import EnableUser from './components/EnableUser.vue'
 import UserStatisticDetail from './reportStatistic/components/UserStatisticDetail.vue'
+import ToFormalize from './components/ToFormalize.vue'
 
 const router = useRouter()
 
@@ -83,12 +84,39 @@ function handleFilterList() {
 }
 
 
+const showToFormalize=ref(false)
+const userInfo=ref({})
+function handleEditUser(e, type) {
+  if (type === 'toformalize') {
+    showToFormalize.value = true
+    userInfo.value = e
+  } else if(type==='delete'){
+    ElMessageBox.confirm(
+      '该操作会删除该用户所有相关信息,不可恢复,确认删除吗?',
+      '提示',
+      {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }
+    )
+      .then(() => {
+        handleDelUser(e)
+      })
+      .catch(() => {
+      })
+  }
+}
 
-function handleEditUser(e) {
-  router.push({
-    path: '/customer/userTransform',
-    query: {
-      id: e.UserId
+// 删除临时用户
+function handleDelUser(e) {
+  apiCustomerUser.userDelete({ UserId: e.UserId }).then((res) => {
+    if (res.Ret === 200) {
+      ElMessage({
+        type: 'success',
+        message: '删除成功!',
+      })
+      getUserList()
     }
   })
 }
@@ -156,10 +184,10 @@ function handleGoReadTimes(e){
         </el-table-column>
         <el-table-column label="操作" align="center" width="200">
           <template #default="{ row }">
-            <el-button type="primary" v-permission="permissionBtn.customerManageBtn.trial_convert" link @click="handleEditUser(row)"
+            <el-button type="primary" v-permission="permissionBtn.customerManageBtn.trial_convert" link @click="handleEditUser(row, 'toformalize')"
               >转正式</el-button
             >
-            <el-button type="primary" v-permission="permissionBtn.customerManageBtn.trial_delete" link @click="handleEditUser(row)"
+            <el-button type="danger" v-permission="permissionBtn.customerManageBtn.trial_delete" link @click="handleEditUser(row, 'delete')"
               >删除</el-button
             >
           </template>
@@ -177,6 +205,7 @@ function handleGoReadTimes(e){
     </div>
   </div>
   <UserStatisticDetail v-model:show="showDetail" :userId="activeUserId" :userName="activeUserName"/>
+  <ToFormalize v-model:show="showToFormalize" :data="userInfo" @success="handleFilterList"/>
 </template>
 
 <style lang="scss" scoped>

+ 6 - 29
src/views/customer/UserEdit.vue

@@ -73,7 +73,7 @@ function getUserInfo() {
       formState.realName = Detail.RealName
       formState.areaCode = Detail.AreaCode
       formState.phone = Detail.Mobile
-      formState.sellerId = Detail.SellerDepartmentId||''
+      formState.sellerId = Detail.SellerId
       formState.isEnabled = Detail.Status ? true : false
     }
   })
@@ -90,30 +90,6 @@ async function getSellerDepartment() {
 }
 
 
-function handleToEdit() {
-  // 关闭提示
-  formState.isEnabled=true
-  ElMessageBox.close()
-  router.replace({
-    path: '/customer/userEdit',
-    query: {
-      id: userId.value
-    }
-  })
-}
-function checkAddContent(msg) {
-  return h('p', [
-    msg,
-    h(ElButton, {
-      type: 'primary',
-      link: true,
-      onClick: handleToEdit
-    }, '跳转查看')
-  ]);
-}
-
-
-
 async function handleSave(type) {
   await formRef.value.validate()
   let params = {
@@ -134,12 +110,13 @@ async function handleSave(type) {
     if (checkRes.Ret !== 200) return
     if (checkRes.Data.CheckResult !== 0) {
       // userId.value = checkRes.Data.UserId
-      ElMessageBox.confirm(checkAddContent(checkRes.Msg),'操作提示',{
+      // ElMessageBox.confirm(checkAddContent(checkRes.Data.Tips),'操作提示',{
+        ElMessageBox.confirm(checkRes.Data.Tips,'操作提示',{
         autofocus:false,
       }).then(()=>{
         // 确认则自动调用编辑保存一次用户信息
-        formState.isEnabled=true
-        handleSave()
+        // formState.isEnabled=true
+        // handleSave()
       }).catch(()=>{})
       return
     }
@@ -189,7 +166,7 @@ async function handleSave(type) {
             </el-select>
             <el-input
               v-model="showPhoneVal"
-              placeholder="手机号和邮箱至少填一个"
+              placeholder="输入手机号"
               style="width: 60%; margin-left: 5%"
             />
           </el-form-item>

+ 3 - 6
src/views/customer/UserList.vue

@@ -205,7 +205,6 @@ async function handleChangecompany(row) {
 async function handleDisabledUser(row) {
   const res = await apiCustomerUser.setUserStatus({
     UserId: row.UserId,
-    IsEnabled: false
   })
   if (res.Ret !== 200) return
   ElMessage.success('禁用成功')
@@ -216,13 +215,11 @@ async function handleDisabledUser(row) {
 function handleEnableUser(row) {
   const params={
     UserId:row.UserId,
-    IsEnabled:true,
   }
   apiCustomerUser.setUserStatus(params).then(res=>{
     if(res.Ret===200){
       ElMessage.success('启用成功')
-      emits('success')
-      show.value=false
+      getUserList()
     }
   })
 }
@@ -230,7 +227,7 @@ function handleEnableUser(row) {
 // 删除机构或者用户
 function handleDelUserAndCompany(row) {
   ElMessageBox.confirm(
-    '该操作会删除该用户所有相关信息,不可恢复,确认删除吗?',
+    `删除后不可恢复,是否确认删除客户【${row.CompanyName || row.RealName}】所有信息?`,
     '提示'
   ).then(() => {
     if (radio.value === 2) {
@@ -451,7 +448,7 @@ function handleGoReadTimes(e){
               v-permission="permissionBtn.customerManageBtn.customer_permissionSettings"
               type="danger"
               link
-              v-if="row.Status === 2"
+              v-if="row.AuthStatus === 1"
               @click.stop="handleOpenAndClose(row,'close')"
               >关闭权限</el-button
             >

+ 13 - 5
src/views/customer/UserSearch.vue

@@ -2,6 +2,7 @@
 import { Search } from '@element-plus/icons-vue'
 import { apiCustomerUser } from '@/api/customer'
 import { useRouter } from 'vue-router'
+import UserStatisticDetail from './reportStatistic/components/UserStatisticDetail.vue'
 
 const router = useRouter()
 
@@ -77,9 +78,15 @@ function handleFilterList() {
   }
 }
 
-function handleGoDetail(row) {
-  if (row.Status === 1) return
-  router.push({ path: '/customer/userDetail', query: { id: row.UserId } })
+
+
+const showDetail=ref(false)
+const activeUserId=ref(0)
+const activeUserName=ref('')
+function handleGoReadTimes(e){
+  activeUserId.value=e.UserId
+  activeUserName.value=e.RealName
+  showDetail.value=true
 }
 </script>
 
@@ -101,7 +108,6 @@ function handleGoDetail(row) {
         highlight-current-row
         element-loading-text="数据加载中..."
         v-loading="tableLoading"
-        @row-click="handleGoDetail"
       >
         <el-table-column
           v-for="column in tableColumns"
@@ -123,7 +129,8 @@ function handleGoDetail(row) {
             </el-tooltip>
           </template>
           <template #default="{ row }">
-            <span>{{ row[column.key] || '--' }}</span>
+            <span v-if="column.key === 'ReadTimes'" :style="row.ReadTimes > 0 ?'color: #075EEE;' : ''" @click="handleGoReadTimes(row)">{{ row.ReadTimes}}</span>
+            <span v-else>{{ row[column.key] || '--' }}</span>
           </template>
         </el-table-column>
       </el-table>
@@ -138,4 +145,5 @@ function handleGoDetail(row) {
       />
     </div>
   </div>
+  <UserStatisticDetail v-model:show="showDetail" :userId="activeUserId" :userName="activeUserName"/>
 </template>

+ 171 - 0
src/views/customer/components/AddContact.vue

@@ -0,0 +1,171 @@
+<script setup>
+import { apiCustomerUser } from '@/api/customer'
+import { apiSystemCommon } from '@/api/system'
+import { isMobileNo } from '@/utils/common'
+import { ref, computed, watch } from 'vue';
+import { ElMessageBox } from 'element-plus'
+import { ElMessage } from 'element-plus';
+
+const show = defineModel('show', { type: Boolean, default: false });
+const props = defineProps({
+  data: Object,
+  contactTatle: String,
+  areaCodeOpts: Array,
+});
+const emits = defineEmits(["success"]);
+const formRef = ref(null);
+const formData = ref({
+  RealName: '',
+  CompanyId: null,
+  UserId: null,
+  areaCode: '86',
+  Mobile: '',
+});
+const formRules = {
+  RealName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  Mobile: [
+    {
+      required: true,
+      validator: (rule, value, callback) => {
+        if (value && formData.value.areaCode === '86' && !isMobileNo(value || '')) {
+          callback(new Error('请输入正确的手机号格式'));
+        } else if (formData.value.areaCode !== '86' && isNaN(value?.trim())) {
+          callback(new Error('请输入正确的手机号格式'));
+        } else {
+          callback();
+        }
+      },
+      trigger: 'blur',
+    },
+  ],
+};
+
+const areaCodeOpts = ref([]);
+function getPhoneAreaCode() {
+  apiSystemCommon.phoneAreaCode().then(res => {
+    if (res.Ret === 200) {
+      areaCodeOpts.value = res.Data || [];
+    }
+  });
+}
+
+const showPhoneVal = computed({
+  get() {
+    return formData.value.Mobile;
+  },
+  set(value) {
+    formData.value.Mobile = value.replace(/ /g, '');
+  }
+});
+
+watch(() => show.value, (newval) => {
+  if (newval) {
+    formData.value.RealName = props.data.RealName;
+    formData.value.Mobile = props.data.Mobile;
+    formData.value.UserId = props.data.UserId;
+    formData.value.CompanyId = Number(props.data.CompanyId);
+    formRef.value ? formRef.value.clearValidate() : '';
+    getPhoneAreaCode();
+  }
+});
+
+async function handleSubmitForm() {
+  await formRef.value.validate();
+  const { RealName, CompanyId, UserId, areaCode, Mobile } = formData.value;
+
+  // 新增用户时进行校验
+  const checkRes = await apiCustomerUser.userAddCheck({
+    AreaCode: areaCode,
+    Mobile,
+  })
+  if (checkRes.Ret !== 200) return
+  if (checkRes.Data.CheckResult !== 0) {
+      ElMessageBox.confirm(checkRes.Data.Tips,'操作提示',{
+      autofocus:false,
+    }).then(()=>{
+    }).catch(()=>{})
+    return
+  }
+
+  const params = {
+    RealName,
+    CompanyId,
+    UserId,
+    AreaCode: areaCode,
+    Mobile: Mobile,
+  };
+  
+  const res = props.contactTatle === '添加联系人' ? await apiCustomerUser.userAdd(params) : await apiCustomerUser.userEdit(params);
+  if (res.Ret !== 200) return;
+  ElMessage.success('操作成功');
+  show.value = false;
+  emits("success");
+}
+</script>
+
+<template>
+  <el-dialog
+    v-model="show"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    width="30%"
+    :title="props.contactTatle || '添加联系人'"
+  >
+    <div class="dialog-content">
+      <el-form
+        label-width="80px"
+        :rules="formRules"
+        ref="formRef"
+        :model="formData"
+      >
+        <el-form-item label="姓名" prop="RealName">
+          <el-input
+            v-model="formData.RealName"
+            style="width: 100%"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="手机号" prop="Mobile">
+          <el-select
+            v-model="formData.areaCode"
+            placeholder="请选择"
+            style="width: 35%"
+          >
+            <el-option
+              v-for="item in areaCodeOpts"
+              :key="item.Value"
+              :label="item.Name"
+              :value="item.Value"
+            />
+          </el-select>
+          <el-input
+            v-model="showPhoneVal"
+            placeholder="输入手机号"
+            style="width: 60%; margin-left: 5%"
+          />
+        </el-form-item>
+      </el-form>
+    </div>
+    <template #footer>
+      <div class="btn-content">
+        <el-button
+          type="primary"
+          style="width: 80px; margin-right: 24px"
+          @click="handleSubmitForm"
+        >
+          保存
+        </el-button>
+        <el-button style="width: 80px" @click="show = false">取消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<style scoped lang="scss">
+.dialog-content {
+  padding: 0 50px;
+}
+.btn-content {
+  text-align: center;
+  padding-bottom: 20px;
+}
+</style>

+ 36 - 71
src/views/customer/components/ContactTable.vue

@@ -3,6 +3,8 @@ import { apiCustomerUser } from '@/api/customer'
 import { useRouter, useRoute } from 'vue-router'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import { computed } from 'vue'
+import MoveUser from './MoveUser.vue'
+import AddContact from './AddContact.vue'
 
 const route = useRoute()
 const router = useRouter()
@@ -15,16 +17,12 @@ const filterState = reactive({
 const tableColOpt = computed( ()=>{
   return [
     {
-      label: '投资者姓名',
+      label: '联系人姓名',
       key: 'RealName'
     },
     {
       label: '手机号',
-      key: 'MobileHidden'
-    },
-    {
-      label: '营业部',
-      key: 'SellerName'
+      key: 'Mobile'
     },
     {
       label: '是否注册',
@@ -41,12 +39,6 @@ const tableColOpt = computed( ()=>{
       label: '是否关注公众号',
       key: 'IsSubscribed' 
     },
-    {
-      label: '创建时间',
-      key: 'CreateTime',
-      sort: true,
-      headerTips: '系统中新增该用户的时间'
-    },
     { 
       label: '最近一次阅读时间',
       key: 'ModifyTime',
@@ -120,33 +112,13 @@ function handleFilterList() {
   getUserList()
 }
 
-function handleEditUser(e) {
-  const link=router.resolve({
-    path: '/customer/userEdit',
-    query: {
-      id: e.UserId
-    }
-  }).href
-  window.open(link,'__blank')
-}
-
-// 禁用用户
-async function handleDisabledUser(row) {
-  const res = await apiCustomerUser.setUserStatus({
-    UserId: row.UserId,
-    IsEnabled: false
-  })
-  if (res.Ret !== 200) return
-  ElMessage.success('禁用成功')
-  getUserList()
-}
 
-// 启用用户
-const showEnableUserPop = ref(false)
-const enableUserId = ref(0)
-function handleEnableUser(row) {
-  enableUserId.value = row.UserId
-  showEnableUserPop.value = true
+// 移动用户
+const showMove=ref(false)
+const activeUserId=ref(0)
+function handleMove(e){
+  activeUserId.value=e.UserId
+  showMove.value=true
 }
 
 // 删除用户
@@ -167,42 +139,34 @@ function handleDelUser(row) {
   }).catch(() => { })
 }
 
-// 跳转详情
-function handleGoDetail(e){
-  let link = ''
-  if (radio.value === 2) {
-    link = router.resolve({
-      path:'/customer/userDetail',
-      query:{
-        id:e.UserId
-      }
-    }).href
+const userInfo = ref({})
+const contactTatle = ref('添加联系人')
+const showAddContact = ref(false)
+function handleAddContact(row, type = 'edit') {
+  if (type === 'add') {
+    contactTatle.value = '添加联系人'
   } else {
-    link = router.resolve({
-      path:'/customer/companyDetail',
-      query:{
-        id:e.UserId
-      }
-    }).href
+    contactTatle.value = '编辑联系人'
   }
-
-  window.open(link,'__blank')
+  userInfo.value = { CompanyId: route.query.id, ...row }
+  showAddContact.value = true
 }
 
 </script>
 
 <template>
   <div class="customer-user-list-page">
+    <el-button type="primary" color="#0052D9" style="width: 120px; margin-top: 10px;" @click="handleAddContact({}, 'add')"
+      >添加联系人</el-button
+    >
     <div class="userlist-wrap" style="margin-top: 30px">
       <el-table
         :data="userList"
         border
-        
         highlight-current-row
         element-loading-text="数据加载中..."
         v-loading="tableLoading"
         @sort-change="handleTableSort"
-        @row-click="handleGoDetail"
       >
         <el-table-column
           v-for="column in tableColOpt"
@@ -253,24 +217,15 @@ function handleGoDetail(e){
               v-permission="permissionBtn.customerManageBtn.customer_edit"
               type="primary"
               link
-              @click.stop="handleEditUser(row)"
+              @click.stop="handleAddContact(row, 'edit')"
               >编辑</el-button
             >
-            <el-button
-              v-permission="permissionBtn.customerManageBtn.customer_permissionSettings"
-              type="danger"
-              link
-              v-if="row.Status === 2"
-              @click.stop="handleDisabledUser(row)"
-              >关闭权限</el-button
-            >
             <el-button
               v-permission="permissionBtn.customerManageBtn.customer_permissionSettings"
               type="primary"
               link
-              v-else
-              @click.stop="handleEnableUser(row)"
-              >开启权限</el-button
+              @click.stop="handleMove(row)"
+              >移动</el-button
             >
             <el-button
               v-permission="permissionBtn.customerManageBtn.customer_delete"
@@ -293,7 +248,17 @@ function handleGoDetail(e){
       />
     </div>
   </div>
-
+  <MoveUser
+    v-model:show="showMove"
+    :userId="activeUserId"
+    @success="getUserList"
+  />
+  <AddContact
+    v-model:show="showAddContact"
+    :data="userInfo"
+    @success="getUserList"
+    :contactTatle="contactTatle"
+  />
 </template>
 
 <style lang="scss" scoped>

+ 106 - 0
src/views/customer/components/MoveUser.vue

@@ -0,0 +1,106 @@
+<script setup>
+import { apiCustomerUser } from '@/api/customer'
+
+const show = defineModel('show', { type: Boolean, default: false })
+const props = defineProps({
+  userId: { type: Number, default: 0 },
+})
+const emits = defineEmits(["success"])
+const formRef = ref(null)
+const formData = ref({
+  CompanyId: null,
+  UserId: null,
+})
+const formRules = {
+  CompanyId: [
+    { required: true, message: '请选择投资者机构', trigger: 'change' },
+  ],
+}
+
+// 获取部门数据
+const departArr = ref([])
+async function getDepartList() {
+  const res = await apiCustomerUser.companySearch()
+  if (res.Ret !== 200) return
+  const list = res.Data || []
+  departArr.value = list
+}
+
+watch(() => show.value, (newval) => {
+  if (newval) {
+    formData.value.UserId = props.userId
+    getDepartList()
+  }
+})
+
+async function handleSubmitForm() {
+  await formRef.value.validate()
+  
+  const { CompanyId, UserId } = formData.value
+
+  const res=await apiCustomerUser.usersMove({
+    CompanyId,
+    UserId,
+  })
+  if(res.Ret!==200) return
+  ElMessage.success('操作成功')
+  show.value=false
+  emits("success")
+}
+</script>
+
+<template>
+  <el-dialog
+    v-model="show"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    width="30%"
+    title="移动"
+  >
+    <div class="dialog-content">
+      <el-form
+      label-width="80px"
+      :rules="formRules"
+      ref="formRef"
+      :model="formData"
+      >
+      <el-form-item label="移动到" prop="CompanyId">
+          <el-select
+            v-model="formData.CompanyId"
+            placeholder="请选择投资者机构"
+            size="large"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in departArr"
+              :key="item.CompanyId"
+              :label="item.CompanyName"
+              :value="item.CompanyId"
+            />
+          </el-select>
+        </el-form-item>
+      </el-form>
+    </div>
+    <template #footer>
+      <div class="btn-content">
+        <el-button
+          type="primary"
+          style="width: 80px; margin-right: 24px"
+          @click="handleSubmitForm"
+          >保存</el-button
+        >
+        <el-button style="width: 80px" @click="show = false">取消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<style scoped lang="scss">
+.dialog-content {
+  padding: 0 50px;
+}
+.btn-content {
+  text-align: center;
+  padding-bottom: 20px;
+}
+</style>

+ 160 - 0
src/views/customer/components/ToFormalize.vue

@@ -0,0 +1,160 @@
+<script setup>
+import { apiCustomerUser } from '@/api/customer'
+
+const show = defineModel('show', { type: Boolean, default: false })
+const props = defineProps({
+  data: Object,
+})
+const emits = defineEmits(["success"])
+const formRef = ref()
+const formData = ref({
+  RealName: '',
+  SellerId: null,
+  CompanyId: null,
+  UserId: null,
+  UserType: null
+})
+const formRules = {
+  RealName: [{ required: true, message: '请输入姓名', trigger: 'blur' }],
+  SellerId: [{ required: true, message: '请选择营业部', trigger: 'change' }],
+  UserType: [{ required: true, message: '请选择客户类型', trigger: 'blur' }],
+  CompanyId: [{ required: true, message: '请选择机构', trigger: 'blur' }],
+}
+
+const options = ref([
+  { label: '个人投资者', value: 1 },
+  { label: '机构投资者', value: 2 },
+])
+
+
+// 获取部门数据
+const departArr = ref([])
+async function getDepartList() {
+  const res = await apiCustomerUser.companySearch()
+  if (res.Ret !== 200) return
+  const list = res.Data || []
+  departArr.value = list
+}
+
+
+watch(() => show.value, (newval) => {
+  if (newval) {
+    formData.value.RealName = props.data.RealName
+    formData.value.Mobile = props.data.Mobile
+    formData.value.UserId = props.data.UserId
+    getDepartList()
+  }
+})
+
+async function handleSubmitForm() {
+  await formRef.value.validate()
+  
+  const {RealName, SellerId, CompanyId, UserId, UserType} = formData.value
+
+  const res=await apiCustomerUser.usersTransFormal({
+    RealName,
+    SellerId,
+    CompanyId,
+    UserId,
+    UserType
+  })
+  if(res.Ret!==200) return
+  ElMessage.success('操作成功')
+  show.value=false
+  emits("success")
+}
+</script>
+
+<template>
+  <el-dialog
+    v-model="show"
+    :close-on-click-modal="false"
+    :modal-append-to-body="false"
+    width="30%"
+    title="转正式"
+  >
+    <div class="dialog-content">
+      <el-form
+      label-width="80px"
+      :rules="formRules"
+      ref="formRef"
+      :model="formData"
+      >
+        <el-form-item label="姓名" prop="RealName">
+          <el-input
+            v-model="formData.RealName"
+            style="width: 100%"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="手机号">
+          <span>{{ formData.Mobile }}</span>
+        </el-form-item>
+        <el-form-item label="客户类型" prop="UserType">
+          <el-select
+            v-model="formData.UserType"
+            placeholder="请选择客户类型"
+            size="large"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in options"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="所属机构" prop="CompanyId" v-if="formData.UserType === 2">
+          <el-select
+            v-model="formData.CompanyId"
+            placeholder="请选择客户类型"
+            size="large"
+            style="width: 100%"
+          >
+            <el-option
+              v-for="item in departArr"
+              :key="item.CompanyId"
+              :label="item.CompanyName"
+              :value="item.CompanyId"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="营业部" prop="SellerId" v-if="formData.UserType === 1">
+          <all-user-for-depart
+            style="width: 100%"
+            :props="{
+              emitPath: false,
+              checkStrictly: true,
+            }"
+            :filterable="true"
+            onlySelectUser
+            :size="'large'"
+            v-model="formData.SellerId"
+            placeholder="请选择营业部"
+          />
+        </el-form-item>
+      </el-form>
+    </div>
+    <template #footer>
+      <div class="btn-content">
+        <el-button
+          type="primary"
+          style="width: 80px; margin-right: 24px"
+          @click="handleSubmitForm"
+          >保存</el-button
+        >
+        <el-button style="width: 80px" @click="show = false">取消</el-button>
+      </div>
+    </template>
+  </el-dialog>
+</template>
+
+<style scoped lang="scss">
+.dialog-content {
+  padding: 0 50px;
+}
+.btn-content {
+  text-align: center;
+  padding-bottom: 20px;
+}
+</style>

+ 1 - 1
src/views/customer/reportStatistic/components/UserStatisticDetail.vue

@@ -106,7 +106,7 @@ function formatClassifyName(e){
         highlight-current-row
         element-loading-text="数据加载中..."
         v-loading="tableLoading"
-        height="500px"
+        height="400px"
       >
         <el-table-column
           v-for="column in tableColOpt"