Browse Source

初步完成用户列表

yujinwen 3 months ago
parent
commit
790e6bf5cb

+ 15 - 2
src/api/customer/user.js

@@ -11,14 +11,27 @@ export default{
   },
   // 编辑用户
   editUser:params=>{
-    return post('/eta_business/user/edit ',params)
+    return post('/eta_business/user/edit',params)
   },
   // 删除用户
   deleteUser:params=>{
-    return post('/eta_business/user/delete ',params)
+    return post('/eta_business/user/delete',params)
   },
   // 启用\禁用用户
   enableChange:params=>{
     return post('/eta_business/user/editEnabled',params)
+  },
+  // 移动用户至新商户
+  moveUser:params=>{
+    return post('/eta_business/user/changeBusiness',params)
+  },
+  // 获取批量导入用户的数据
+  getImportUserList:params=>{
+    return post('/eta_business/user/import/list',params)
+  },
+  // 导入用户
+  importUser:params=>{
+    return post('/eta_business/user/import',params)
   }
+
 }

+ 6 - 0
src/components/SelectBusiness.vue

@@ -2,6 +2,7 @@
 import {businessCustomInterence} from '@/api/modules/businessCustom'
 
 const value=defineModel('value')
+const emits=defineEmits(['change'])
 
 const props=defineProps({
   placeholder:{
@@ -42,6 +43,10 @@ async function remoteMethod(search){
 // 默认获取一次
 remoteMethod('')
 
+function handleChange(value,context){
+  emits('change',value,context)
+}
+
 </script>
 
 <template>
@@ -54,6 +59,7 @@ remoteMethod('')
     :loading="loading"
     :disabled="props.disabled"
     @search="remoteMethod"
+    @change="handleChange"
   >
     <t-option 
       v-for="item in options" 

+ 48 - 17
src/views/customer/user/Index.vue

@@ -2,6 +2,7 @@
 import { SearchIcon } from 'tdesign-icons-vue-next';
 import EditUser from './components/EditUser.vue'
 import MoveUser from './components/MoveUser.vue'
+import ConfirmImportUser from './components/ConfirmImportUser.vue'
 import {apiCustomerUser} from '@/api/customer'
 
 const jobOpts = [
@@ -58,7 +59,8 @@ async function getUserList(){
     CurrentIndex:tablePagination.current,
     PositionStatus:filterState.jobStatus===''?-1:filterState.jobStatus,
     Enabled:filterState.accountStatus===''?-1:filterState.accountStatus,
-    Keyword:filterState.keyword
+    Keyword:filterState.keyword,
+    BusinessCode:filterState.customer
   })
   if(res.Ret!==200) return
   const arr=res.Data.List||[]
@@ -101,6 +103,31 @@ async function handleDelUser(item){
   handleRefreshList()
 }
 
+// 启用禁用客户
+async function handleEnableUserChange(item,type){
+  const res=await apiCustomerUser.enableChange({
+    UserId:item.UserId,
+    Enabled:type
+  })
+  if(res.Ret!=200) return
+  MessagePlugin.success('操作成功')
+  item.Enabled=type
+}
+
+
+// 导入用户
+const showConfirmImportUser=ref(false)
+const confirmImportUserData=ref([])
+async function handleImportUser(e){
+  confirmImportUserData.value=[]
+  const data=new FormData()
+  data.append("File", e.raw)
+  const res=await apiCustomerUser.getImportUserList(data)
+  if(res.Ret!==200) return
+  showConfirmImportUser.value=true
+  confirmImportUserData.value=res.Data.ValidUser||[]
+}
+
 
 </script>
 
@@ -108,7 +135,14 @@ async function handleDelUser(item){
   <div class="customer-userlist-page">
     <div class="bg-white flex top-wrap">
       <t-button style="width: 120px" @click="showEditUser=true;editUserData=null">新增用户</t-button>
-      <t-button style="width: 120px; margin-left: 10px">批量导入用户</t-button>
+      <t-upload
+        :request-method="handleImportUser"
+        theme="custom"
+        accept=".xls,.xlsx"
+      >
+        <t-button style="width: 120px; margin-left: 10px">批量导入用户</t-button>
+      </t-upload>
+
       <t-button style="width: 120px; margin-left: 10px" theme="primary" variant="text">下载导入模板</t-button>
       <t-input
         style="width: 310px; margin-left: auto"
@@ -150,22 +184,17 @@ async function handleDelUser(item){
             :value="item.value"
           />
         </t-select>
-        <t-select
-          placeholder="客户名称"
-          v-model:value="filterState.customer"
-          clearable
+        <select-business 
+          placeholder="客户名称" 
+          clearable 
+          filterable
+          v-model="filterState.customer" 
           style="width: 240px"
-        >
-          <!-- <t-option
-            v-for="item in jobOpts"
-            :key="item.value"
-            :label="item.value"
-            :value="item.value"
-          /> -->
-        </t-select>
+          @change="handleRefreshList"
+        />
       </div>
       <t-table
-        rowKey="id"
+        rowKey="UserId"
         :data="tableData"
         :columns="columns"
         bordered
@@ -193,8 +222,8 @@ async function handleDelUser(item){
         </template>
         <template #opt="{ row }">
           <t-button size="small" variant="text" theme="primary" @click="handleEditUser(row)">编辑</t-button>
-          <t-button size="small" variant="text" theme="danger" v-if="row.Enabled">禁用</t-button>
-          <t-button size="small" variant="text" theme="primary" v-else>启用</t-button>
+          <t-button size="small" variant="text" theme="danger" v-if="row.Enabled" @click="handleEnableUserChange(row,0)">禁用</t-button>
+          <t-button size="small" variant="text" theme="primary" v-else @click="handleEnableUserChange(row,1)">启用</t-button>
           <t-button size="small" variant="text" theme="primary" @click="handleMoveUser(row)">移动</t-button>
           <t-button size="small" variant="text" theme="danger" @click="handleDelUser(row)">删除</t-button>
         </template>
@@ -205,6 +234,8 @@ async function handleDelUser(item){
   <EditUser v-model:show="showEditUser" :data="editUserData" @change="handleRefreshList"/>
   <!-- 移动用户 -->
   <MoveUser v-model:show="showMoveUser" :data="editUserData" @change="handleRefreshList"/>
+  <!-- 确认批量导入的用户 -->
+  <ConfirmImportUser v-model:show="showConfirmImportUser" :data="confirmImportUserData"/>
 </template>
 
 <style lang="scss" scoped>

+ 81 - 0
src/views/customer/user/components/ConfirmImportUser.vue

@@ -0,0 +1,81 @@
+<script setup>
+import {apiCustomerUser} from '@/api/customer'
+
+const show = defineModel('show', { type: Boolean, default: false })
+const props=defineProps({
+  data:{
+    type:Array,
+    default:()=>[]
+  }
+})
+
+const columns = [
+  { align: 'center', colKey: 'RealName', title: '姓名' },
+  { align: 'center', colKey: 'Mobile', title: '手机号',width:'150px' },
+  { align: 'center', colKey: 'DepartmentName', title: '岗位-部门',width:'150px' },
+  { align: 'center', colKey: 'BusinessName', title: '客户名称' },
+  { align: 'center', colKey: 'PositionStatus', title: '在职状态',width:'100px' }, 
+]
+
+async function handleSave(){
+  const res=await apiCustomerUser.importUser({ValidUser:props.data})
+  if(res.Ret!==200) return
+  MessagePlugin.success('导入成功')
+  show.value=false
+}
+
+</script>
+<template>
+  <t-dialog
+    v-model:visible="show"
+    header="批量导入"
+    draggable
+    attach="body"
+    top="50px"
+    width="80%"
+    :cancelBtn="null"
+    :confirmBtn="null"
+    class="import-user-wrap"
+  >
+    <t-table
+      rowKey="UserId"
+      :data="props.data"
+      :columns="columns"
+      bordered
+      max-height="500"
+      show-header
+      resizable
+    >
+      <template #Mobile="{ row }">
+        <span>{{row.CountryCode}}-{{row.Mobile}}</span>
+      </template>
+      <template #DepartmentName="{ row }">
+        <span>{{row.Position}}-{{row.DepartmentName}}</span>
+      </template>
+      <template #PositionStatus="{ row }">
+        <t-tag 
+          :theme="row.PositionStatus?'success':'danger'"
+          variant="light"
+        >{{row.PositionStatus?'在职':'离职'}}</t-tag>
+      </template>
+    </t-table>
+    <template #footer>
+      <div class="bottom-btn">
+        <t-button theme="default" @click="show=false">取消</t-button>
+        <t-button type="submit" @click="handleSave">确定</t-button>
+      </div>
+    </template>
+  </t-dialog>
+</template>
+
+<style lang="scss" scoped>
+.import-user-wrap{
+  .bottom-btn{
+    margin-top: 60px;
+    text-align: center;
+    .t-button{
+      width: 120px;
+    }
+  }
+}
+</style>

+ 2 - 0
src/views/customer/user/components/EditUser.vue

@@ -36,6 +36,7 @@ const FORM_RULES = {
   name: [{ required: true, message: '请输入姓名' }],
   tel:[{ required: true, message: '请输入手机号' }],
   jobStatus:[{ required: true, message: '请选择在职状态' }],
+  customer:[{ required: true, message: '请选择所属客户' }]
 };
 
 const formIns=useTemplateRef('formIns')
@@ -135,6 +136,7 @@ watch(
           filterable
           :disabled="props.data?true:false"
           v-model="formData.customer"
+          v-if="show"
         />
       </t-form-item>
       <t-form-item label="岗位" name="post">

+ 22 - 5
src/views/customer/user/components/MoveUser.vue

@@ -1,8 +1,9 @@
 <script setup>
 import { useTemplateRef, watch } from "vue";
-
+import {apiCustomerUser} from '@/api/customer'
 
 const show = defineModel('show', { type: Boolean, default: false })
+const emits=defineEmits(['change'])
 const props=defineProps({
   data:{
     type:[null,Object],
@@ -11,7 +12,7 @@ const props=defineProps({
 })
 
 const FORM_RULES = { 
-  company: [{ required: true, message: '请输入姓名' }],
+  company: [{ required: true, message: '请选择客户' }],
 };
 
 const formIns=useTemplateRef('formIns')
@@ -22,7 +23,14 @@ const formData=reactive({
 async function handleSave(){
   const validRes=await formIns.value.validate()
   if(validRes!==true) return
-
+  const res=await apiCustomerUser.moveUser({
+    UserId:props.data.UserId,
+    BusinessCode:formData.company
+  })
+  if(res.Ret!==200) return
+  show.value=false
+  MessagePlugin.success('移动成功')
+  emits('change')
 }
 
 
@@ -58,11 +66,20 @@ watch(
       labelAlign="top"
     >
       <t-form-item label="移动到" name="company">
-        <t-input v-model="formData.company" placeholder="请选择公司"></t-input>
+        <select-business 
+          v-model="formData.company"
+          placeholder="输入社会信用码或客户名称"
+          filterable
+        />
       </t-form-item>
       
       <t-form-item label="所属客户" name="customer">
-        
+        <select-business 
+          :value="props.data?.BusinessCode"
+          placeholder="输入社会信用码或客户名称"
+          disabled
+          v-if="show"
+        />
       </t-form-item>
     </t-form>
     <template #footer>

+ 2 - 2
vite.config.js

@@ -92,9 +92,9 @@ export default defineConfig(({ mode }) => {
       port:8900,
       proxy:{
         '/v1': {
-          // target: 'http://192.168.20.10:8912/v1',
+          target: 'http://192.168.20.10:8912/v1',
           // target: 'http://8.136.199.33:8900/v1',
-          target: 'http://8.136.199.33:7777/adminapi/',
+          // target: 'http://8.136.199.33:7777/adminapi/',
           changeOrigin: true,
           rewrite: (path) => path.replace(/^\/v1/, ''),
         }