Pārlūkot izejas kodu

修改员工列表

hurx 5 dienas atpakaļ
vecāks
revīzija
60a177a19c

+ 4 - 0
src/api/customer/customerFile/customerContact/types.ts

@@ -199,6 +199,10 @@ export interface CustomerContactQuery extends PageQuery {
    */
   contactName?: string;
 
+  contactNo?: string;
+
+  customerName?: string;
+
   /**
    * 手机号码
    */

+ 462 - 0
src/views/customer/customerFile/contactInfo/index.vue

@@ -0,0 +1,462 @@
+<template>
+  <div class="p-2">
+    <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave">
+      <div v-show="showSearch" class="mb-[10px]">
+        <el-card shadow="hover">
+          <el-form ref="queryFormRef" :model="queryParams" :inline="true">
+            <el-form-item label="用户编码" prop="contactNo">
+              <el-input v-model="queryParams.contactNo" placeholder="请输入用户编码" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="姓名" prop="contactName">
+              <el-input v-model="queryParams.contactName" placeholder="请输入姓名" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="联系电话" prop="phone">
+              <el-input v-model="queryParams.phone" placeholder="请输入联系电话" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item label="所属客户" prop="customerName">
+              <el-input v-model="queryParams.customerName" placeholder="请输入所属客户" clearable @keyup.enter="handleQuery" />
+            </el-form-item>
+            <el-form-item>
+              <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
+              <el-button icon="Refresh" @click="resetQuery">重置</el-button>
+            </el-form-item>
+          </el-form>
+        </el-card>
+      </div>
+    </transition>
+    <el-card shadow="never">
+      <template #header>
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="19">
+            <span>员工信息列表</span>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()">批量删除</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="primary" plain :disabled="single">修改密码</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button type="warning" plain icon="Download" @click="handleExport">导出数据</el-button>
+          </el-col>
+        </el-row>
+      </template>
+
+      <el-table v-loading="loading" border :data="customerContactList" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="员工编号" align="center" prop="contactNo" />
+        <el-table-column label="姓名" align="center" prop="contactName" />
+        <el-table-column label="手机号" align="center" prop="phone" />
+        <el-table-column label="采购角色" align="center" prop="roleName" />
+        <el-table-column label="职位" align="center" prop="postName" />
+        <el-table-column label="所属客户" align="center" prop="customerName" />
+        <el-table-column label="注册时间" align="center" prop="createTime" width="180">
+          <template #default="scope">
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d}') }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column label="状态" align="center" prop="status">
+          <template #default="scope">
+            <!-- <dict-tag :options="sys_normal_disable" :value="scope.row.status" /> -->
+            {{ scope.row.status === '0' ? '启用' : '停用' }}
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template #default="">
+            <!-- <el-button link type="primary" @click="handleUpdate(scope.row)">编辑</el-button> -->
+
+            <el-button link type="primary">查看</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <pagination v-show="total > 0" :total="total" v-model:page="queryParams.pageNum" v-model:limit="queryParams.pageSize" @pagination="getList" />
+    </el-card>
+    <!-- 添加或修改客户联系人信息对话框 -->
+    <el-dialog :title="dialog.title" v-model="dialog.visible" width="900px" append-to-body>
+      <el-form ref="customerContactFormRef" :model="form" :rules="rules" label-width="120px">
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="联系人姓名" prop="contactName">
+              <el-input v-model="form.contactName" placeholder="请输入联系人姓名" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="手机号码" prop="phone">
+              <el-input v-model="form.phone" placeholder="请输入手机号码" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="办公电话" prop="officePhone">
+              <el-input v-model="form.officePhone" placeholder="请输入办公电话" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="自定义登录名" prop="customLoginName">
+              <el-input v-model="form.customLoginName" placeholder="请输入自定义登录名" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="所属部门" prop="deptId">
+              <el-tree-select
+                v-model="form.deptId"
+                :data="customerDeptList"
+                :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
+                value-key="deptId"
+                placeholder="请选择"
+                check-strictly
+                :render-after-expand="false"
+                @change="handleDeptChange"
+                filterable
+                style="width: 100%"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="邮箱" prop="email">
+              <el-input v-model="form.email" placeholder="请输入邮箱" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="采购角色" prop="roleId">
+              <el-select v-model="form.roleId" placeholder="请选择采购角色" clearable filterable style="width: 100%" @change="handleRoleChange">
+                <el-option v-for="role in roleOptions" :key="role.roleId" :label="role.roleName" :value="role.roleId" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="生日" prop="birthday">
+              <el-date-picker v-model="form.birthday" type="date" placeholder="请选择" class="w-full" value-format="YYYY-MM-DD" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="12">
+            <el-form-item label="性别" prop="gender">
+              <el-radio-group v-model="form.gender">
+                <el-radio v-for="dict in sys_user_sex" :key="dict.value" :label="dict.value">{{ dict.label }}</el-radio>
+              </el-radio-group>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="启用状态" prop="status">
+              <el-switch v-model="form.status" active-value="0" inactive-value="1" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="20">
+          <el-col :span="24">
+            <el-form-item label="详细地址" prop="codeArr">
+              <el-cascader v-model="codeArr" :options="regionOptions" placeholder="请选择" @change="handleChange" style="width: 100%"></el-cascader>
+            </el-form-item>
+            <el-form-item prop="addressDetail">
+              <el-input v-model="form.addressDetail" type="textarea" :rows="3" placeholder="请输入详细地址" style="width: 100%" />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <template #footer>
+        <div class="dialog-footer">
+          <el-button type="primary" :loading="buttonLoading" @click="submitForm">确认</el-button>
+          <el-button @click="cancel">取消</el-button>
+        </div>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup name="CustomerContact" lang="ts">
+import {
+  listCustomerContact,
+  getCustomerContact,
+  changeIsPrimary,
+  delCustomerContact,
+  addCustomerContact,
+  updateCustomerContact
+} from '@/api/customer/customerFile/customerContact';
+import { CustomerContactVO, CustomerContactQuery, CustomerContactForm } from '@/api/customer/customerFile/customerContact/types';
+import { listCustomerDept, getCustomerDept } from '@/api/customer/customerFile/customerDept';
+import { CustomerDeptVO, CustomerDeptQuery } from '@/api/customer/customerFile/customerDept/types';
+import { listRole } from '@/api/system/role';
+import type { RoleVO } from '@/api/system/role/types';
+import { regionData } from 'element-china-area-data';
+
+const regionOptions = regionData as any;
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
+const { sys_platform_yes_no, sys_user_sex, sys_normal_disable } = toRefs<any>(
+  proxy?.useDict('sys_platform_yes_no', 'sys_user_sex', 'sys_normal_disable')
+);
+
+const customerContactList = ref<CustomerContactVO[]>([]);
+const customerDeptList = ref<CustomerDeptVO[]>([]);
+const buttonLoading = ref(false);
+const loading = ref(true);
+const showSearch = ref(true);
+const ids = ref<Array<string | number>>([]);
+const single = ref(true);
+const multiple = ref(true);
+const total = ref(0);
+
+const queryFormRef = ref<ElFormInstance>();
+const customerContactFormRef = ref<ElFormInstance>();
+const codeArr = ref([]);
+const dialog = reactive<DialogOption>({
+  visible: false,
+  title: ''
+});
+
+const roleOptions = ref<any>([]);
+
+const initFormData: CustomerContactForm = {
+  id: undefined,
+  customerId: undefined,
+  contactName: undefined,
+  phone: undefined,
+  customLoginName: undefined,
+  officePhone: undefined,
+  officePhoneTwo: undefined,
+  gender: '2',
+  roleId: undefined,
+  deptId: undefined,
+  email: undefined,
+  birthday: undefined,
+  isPrimary: undefined,
+  addressDetail: undefined,
+  addressProvince: undefined,
+  addressCity: undefined,
+  addressCounty: undefined,
+  provincialCityCounty: undefined,
+  status: '0',
+  remark: undefined
+};
+const data = reactive<PageData<CustomerContactForm, CustomerContactQuery>>({
+  form: { ...initFormData },
+  queryParams: {
+    pageNum: 1,
+    pageSize: 10,
+    customerId: undefined,
+    contactName: undefined,
+    phone: undefined,
+    officePhone: undefined,
+    officePhoneTwo: undefined,
+    gender: undefined,
+    roleId: undefined,
+    isPrimary: undefined,
+    addressDetail: undefined,
+    addressProvince: undefined,
+    addressCity: undefined,
+    addressCounty: undefined,
+    provincialCityCounty: undefined,
+    status: undefined,
+    platformCode: undefined,
+    params: {}
+  },
+  rules: {
+    contactName: [{ required: true, message: '联系人姓名不能为空', trigger: 'blur' }],
+    phone: [
+      { required: true, message: '手机号码不能为空', trigger: 'blur' },
+      { pattern: /^1[3-9]\d{9}$/ as RegExp, message: '请输入正确的手机号格式', trigger: 'blur' }
+    ]
+  }
+});
+
+const { queryParams, form, rules } = toRefs(data);
+
+/** 查询客户联系人信息列表 */
+const getList = async () => {
+  loading.value = true;
+  const res = await listCustomerContact(queryParams.value);
+  customerContactList.value = res.rows;
+  total.value = res.total;
+  loading.value = false;
+};
+
+/** 加载角色列表 */
+const loadRoleOptions = async () => {
+  try {
+    // const res: any = await listRole({
+    //   pageNum: 1,
+    //   pageSize: 9999,
+    //   roleName: '',
+    //   roleKey: '',
+    //   status: ''
+    // } as any);
+    // roleOptions.value = res?.rows || res?.data?.rows || res?.data || [];
+    roleOptions.value = [
+      { roleId: 1, roleName: '管理角色' },
+      { roleId: 2, roleName: '采购角色' },
+      { roleId: 3, roleName: '查询角色' },
+      { roleId: 4, roleName: '审核角色' }
+    ];
+  } catch (error) {
+    console.error('加载角色列表失败:', error);
+    roleOptions.value = [];
+  }
+};
+
+const handleDeptChange = (deptId: string | number) => {
+  const dept = customerDeptList.value.find((d) => d.deptId === deptId);
+  form.value.deptName = dept?.deptName;
+};
+
+const handleRoleChange = (roleId: string | number) => {
+  const role = roleOptions.value.find((r) => r.roleId === roleId);
+  form.value.roleName = role?.roleName;
+};
+
+/** 加载客户部门列表 */
+const loadCustomerDeptList = async () => {
+  try {
+    const query: CustomerDeptQuery = {};
+    const res = await listCustomerDept(query);
+    // 将数据转换为树形结构
+    customerDeptList.value = proxy?.handleTree<CustomerDeptVO>(res.data, 'id', 'parentId') || [];
+  } catch (error) {
+    console.error('加载部门列表失败:', error);
+  }
+};
+
+/** 状态修改  */
+const handlePrimaryChange = async (row: any) => {
+  //   const text = row.status === '0' ? '是' : '否';
+  try {
+    // await proxy?.$modal.confirm('确认要"' + text + '"吗?');
+    await changeIsPrimary(row.id, row.isPrimary);
+    proxy?.$modal.msgSuccess('操作成功');
+    getList();
+  } catch (err) {
+    row.status = row.status === '0' ? '1' : '0';
+  }
+};
+
+/** 取消按钮 */
+const cancel = () => {
+  reset();
+  dialog.visible = false;
+};
+
+/** 表单重置 */
+const reset = () => {
+  form.value = { ...initFormData };
+  codeArr.value = [];
+  customerContactFormRef.value?.resetFields();
+};
+
+/** 搜索按钮操作 */
+const handleQuery = () => {
+  queryParams.value.pageNum = 1;
+  getList();
+};
+
+/** 处理区域选择变化 */
+const handleChange = (val: string[]) => {
+  // 保存编码
+  form.value.addressProvince = val[0];
+  form.value.addressCity = val[1];
+  form.value.addressCounty = val[2];
+
+  // 根据编码获取名称
+  const names: string[] = [];
+  if (val[0]) {
+    const province = regionData.find((item: any) => item.value === val[0]);
+    if (province) {
+      names.push(province.label);
+
+      if (val[1] && province.children) {
+        const city = province.children.find((item: any) => item.value === val[1]);
+        if (city) {
+          names.push(city.label);
+
+          if (val[2] && city.children) {
+            const county = city.children.find((item: any) => item.value === val[2]);
+            if (county) {
+              names.push(county.label);
+            }
+          }
+        }
+      }
+    }
+  }
+
+  // 将省市区名称用斜杠连接
+  form.value.provincialCityCounty = names.join('/');
+};
+
+/** 重置按钮操作 */
+const resetQuery = () => {
+  queryFormRef.value?.resetFields();
+  handleQuery();
+};
+
+/** 多选框选中数据 */
+const handleSelectionChange = (selection: CustomerContactVO[]) => {
+  ids.value = selection.map((item) => item.id);
+  single.value = selection.length != 1;
+  multiple.value = !selection.length;
+};
+
+/** 修改按钮操作 */
+const handleUpdate = async (row?: CustomerContactVO) => {
+  reset();
+  // 加载部门列表
+  await loadCustomerDeptList();
+  const _id = row?.id || ids.value[0];
+  const res = await getCustomerContact(_id);
+  // 如果有省市区编码,回显到级联选择器
+  if (res.data.addressProvince && res.data.addressCity && res.data.addressCounty) {
+    codeArr.value = [res.data.addressProvince, res.data.addressCity, res.data.addressCounty] as any;
+  }
+  Object.assign(form.value, res.data);
+  dialog.visible = true;
+  dialog.title = '修改客户联系人信息';
+};
+
+/** 提交按钮 */
+const submitForm = () => {
+  customerContactFormRef.value?.validate(async (valid: boolean) => {
+    if (valid) {
+      buttonLoading.value = true;
+      if (form.value.id) {
+        await updateCustomerContact(form.value).finally(() => (buttonLoading.value = false));
+      } else {
+        await addCustomerContact(form.value).finally(() => (buttonLoading.value = false));
+      }
+      proxy?.$modal.msgSuccess('操作成功');
+      dialog.visible = false;
+      await getList();
+    }
+  });
+};
+
+/** 删除按钮操作 */
+const handleDelete = async (row?: CustomerContactVO) => {
+  const _ids = row?.id || ids.value;
+  await proxy?.$modal.confirm('是否确认删除客户联系人信息编号为"' + _ids + '"的数据项?').finally(() => (loading.value = false));
+  await delCustomerContact(_ids);
+  proxy?.$modal.msgSuccess('删除成功');
+  await getList();
+};
+
+/** 导出按钮操作 */
+const handleExport = () => {
+  proxy?.download(
+    'customer/customerContact/export',
+    {
+      ...queryParams.value
+    },
+    `customerContact_${new Date().getTime()}.xlsx`
+  );
+};
+
+onMounted(() => {
+  loadRoleOptions();
+  getList();
+});
+</script>

+ 10 - 10
src/views/customer/customerFile/customerInfo/edit.vue

@@ -10,14 +10,14 @@
 
     <!-- 菜单导航 -->
     <el-card shadow="never" class="mb-4">
-      <el-menu :default-active="activeMenu" class="el-menu-demo" mode="horizontal" @select="handleSelect">
+      <el-menu :default-active="activeMenu" class="el-menu-demo" mode="horizontal" @select="handleSelect" :ellipsis="false">
         <el-menu-item index="baseInfo">基本信息</el-menu-item>
-        <el-menu-item index="orgStructure">企业组织结构</el-menu-item>
-        <el-menu-item index="contactInfo">联系人信息</el-menu-item>
+        <el-menu-item index="orgStructure">组织结构</el-menu-item>
+        <el-menu-item index="contactInfo">联系人</el-menu-item>
         <el-menu-item index="shippingAddress">收货地址</el-menu-item>
         <el-menu-item index="contractManagement">合同管理</el-menu-item>
-        <el-menu-item index="procurementProfile">采购画像</el-menu-item>
-        <el-menu-item index="operationLog">日志管理</el-menu-item>
+        <!-- <el-menu-item index="procurementProfile">采购画像</el-menu-item>
+        <el-menu-item index="operationLog">日志管理</el-menu-item> -->
       </el-menu>
       <!-- 动态组件显示区域 -->
       <component :is="currentComponent" :customer-id="customerId" :customer-no="customerNo" :customer-name="customerName" />
@@ -40,8 +40,8 @@ const OrgStructure = defineAsyncComponent(() => import('@/views/customer/custome
 const ContactInfo = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/contactInfo.vue'));
 const ShippingAddress = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/shippingAddress.vue'));
 const ContractManagement = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/contractManagement.vue'));
-const ProcurementProfile = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/procurementProfile.vue'));
-const OperationLog = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/operationLog.vue'));
+// const ProcurementProfile = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/procurementProfile.vue'));
+// const OperationLog = defineAsyncComponent(() => import('@/views/customer/customerFile/customerInfo/overview/operationLog.vue'));
 
 // 组件映射
 const componentMap: Record<string, any> = {
@@ -49,9 +49,9 @@ const componentMap: Record<string, any> = {
   orgStructure: OrgStructure,
   contactInfo: ContactInfo,
   shippingAddress: ShippingAddress,
-  contractManagement: ContractManagement,
-  procurementProfile: ProcurementProfile,
-  operationLog: OperationLog
+  contractManagement: ContractManagement
+  // procurementProfile: ProcurementProfile,
+  // operationLog: OperationLog
 };
 
 const currentComponent = ref(componentMap['baseInfo']); // 默认显示基本信息

+ 8 - 7
src/views/customer/customerFile/customerInfo/index.vue

@@ -107,12 +107,12 @@
           </el-col>
           <el-col :span="1.5">
             <el-button type="primary" plain :disabled="single" @click="handleTransferSalesPerson" v-hasPermi="['customer:customerInfo:edit']"
-              >转移业务</el-button
+              >转移业务负责人</el-button
             >
           </el-col>
           <el-col :span="1.5">
             <el-button type="primary" plain :disabled="single" @click="handleTransferServiceStaff" v-hasPermi="['customer:customerInfo:edit']"
-              >转移客服人员</el-button
+              >转移客服支持</el-button
             >
           </el-col>
           <el-col :span="1.5">
@@ -137,17 +137,17 @@
         <el-table-column label="归属公司" align="left" prop="companyName" min-width="150" />
         <el-table-column label="客户编号" align="center" prop="customerNo" min-width="120" />
         <el-table-column label="行业" align="center" prop="industryCategory" min-width="120"> </el-table-column>
-        <el-table-column label="业务" align="center" min-width="100">
+        <el-table-column label="业务负责人" align="center" min-width="100">
           <template #default="scope">
             <span>{{ scope.row.customerSalesInfoVo?.salesPerson }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="客服人员" align="center" min-width="100">
+        <el-table-column label="客服支持" align="center" min-width="100">
           <template #default="scope">
             <span>{{ scope.row.customerSalesInfoVo?.serviceStaff }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="归属部门" align="center" prop="belongingDepartmentId" min-width="120">
+        <el-table-column label="部门" align="center" prop="belongingDepartmentId" min-width="120">
           <template #default="scope">
             <span>{{ scope.row.customerSalesInfoVo?.belongingDepartment }}</span>
           </template>
@@ -157,11 +157,11 @@
             <span>{{ scope.row.customerSalesInfoVo?.creditAmount }}</span>
           </template>
         </el-table-column>
-        <el-table-column label="临时额度" align="center" prop="temporaryQuota" min-width="80">
+        <!-- <el-table-column label="临时额度" align="center" prop="temporaryQuota" min-width="80">
           <template #default="scope">
             <span>{{ scope.row.customerSalesInfoVo?.temporaryQuota }}</span>
           </template>
-        </el-table-column>
+        </el-table-column> -->
         <el-table-column label="状态" align="center" prop="status" min-width="80">
           <template #default="scope">
             <dict-tag :options="sys_check_status" :value="scope.row.status" />
@@ -169,6 +169,7 @@
         </el-table-column>
         <el-table-column label="操作" align="center" width="150" fixed="right">
           <template #default="scope">
+            <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:customerInfo:edit']">查看</el-button>
             <el-button link type="primary" @click="handleUpdate(scope.row)" v-hasPermi="['customer:customerInfo:edit']">编辑</el-button>
             <el-button link type="primary" v-if="scope.row.status == '0'" @click="handleCheck(scope.row)" v-hasPermi="['customer:customerInfo:edit']"
               >审核</el-button

+ 2 - 2
src/views/customer/customerFile/customerInfo/overview/baseInfo.vue

@@ -242,7 +242,7 @@
         </el-row>
 
         <el-row :gutter="20">
-          <el-col :span="24">
+          <!-- <el-col :span="24">
             <el-form-item label="营业执照">
               <div
                 v-if="!businessInfo.businessLicense"
@@ -284,7 +284,7 @@
                 />
               </div>
             </el-form-item>
-          </el-col>
+          </el-col> -->
         </el-row>
       </el-form>
     </el-card>