Selaa lähdekoodia

fix:submit employee views

jimmyyem 6 kuukautta sitten
vanhempi
commit
4bba8e11ce

+ 74 - 0
src/api/wechat/employee.ts

@@ -0,0 +1,74 @@
+import { defHttp } from '@/utils/http/axios';
+import { ErrorMessageMode } from '/#/axios';
+import { BaseDataResp, BaseListReq, BaseResp, BaseIDsReq, BaseIDReq } from '@/api/model/baseModel';
+import { EmployeeInfo, EmployeeListResp } from './model/employeeModel';
+
+enum Api {
+  CreateEmployee = '/wechat-api/employee/create',
+  UpdateEmployee = '/wechat-api/employee/update',
+  GetEmployeeList = '/wechat-api/employee/list',
+  DeleteEmployee = '/wechat-api/employee/delete',
+  GetEmployeeById = '/wechat-api/employee',
+}
+
+/**
+ * @description: Get employee list
+ */
+
+export const getEmployeeList = (params: BaseListReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<EmployeeListResp>>(
+    { url: Api.GetEmployeeList, params },
+    { errorMessageMode: mode },
+  );
+};
+
+/**
+ *  @description: Create a new employee
+ */
+export const createEmployee = (params: EmployeeInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.CreateEmployee, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Update the employee
+ */
+export const updateEmployee = (params: EmployeeInfo, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.UpdateEmployee, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Delete employees
+ */
+export const deleteEmployee = (params: BaseIDsReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseResp>(
+    { url: Api.DeleteEmployee, params: params },
+    {
+      errorMessageMode: mode,
+      successMessageMode: mode,
+    },
+  );
+};
+
+/**
+ *  @description: Get employee By ID
+ */
+export const getEmployeeById = (params: BaseIDReq, mode: ErrorMessageMode = 'notice') => {
+  return defHttp.post<BaseDataResp<EmployeeInfo>>(
+    { url: Api.GetEmployeeById, params: params },
+    {
+      errorMessageMode: mode,
+    },
+  );
+};

+ 31 - 0
src/api/wechat/model/employeeModel.ts

@@ -0,0 +1,31 @@
+import { BaseListResp } from '@/api/model/baseModel';
+
+/**
+ *  @description: Employee info response
+ */
+export interface EmployeeInfo {
+  id?: number;
+  createdAt?: number;
+  updatedAt?: number;
+  title?: string;
+  avatar?: string;
+  tags?: string;
+  hireCount?: number;
+  serviceCount?: number;
+  achievementCount?: number;
+  intro?: string;
+  estimate?: string;
+  skill?: string;
+  abilityType?: string;
+  scene?: string;
+  switchIn?: string;
+  tutorial?: []TutorialInfo;
+  videoUrl?: string;
+  workExperience?: []WorkExperienceInfo;
+}
+
+/**
+ *  @description: Employee list response
+ */
+
+export type EmployeeListResp = BaseListResp<EmployeeInfo>;

+ 20 - 0
src/locales/lang/en/wechat.ts

@@ -103,4 +103,24 @@ export default {
     editBatchMsg: 'Edit BatchMsg',
     batchMsgList: 'BatchMsg List',
   },
+  employee: {
+    title: 'Title',
+    avatar: 'Avatar',
+    tags: 'Tags',
+    hireCount: 'HireCount',
+    serviceCount: 'ServiceCount',
+    achievementCount: 'AchievementCount',
+    intro: 'Intro',
+    estimate: 'Estimate',
+    skill: 'Skill',
+    abilityType: 'AbilityType',
+    scene: 'Scene',
+    switchIn: 'SwitchIn',
+    tutorial: 'Tutorial',
+    videoUrl: 'VideoUrl',
+    workExperience: 'WorkExperience',
+    addEmployee: 'Add Employee',
+    editEmployee: 'Edit Employee',
+    employeeList: 'Employee List',
+  },
 };

+ 20 - 0
src/locales/lang/zh-CN/wechat.ts

@@ -107,4 +107,24 @@ export default {
     editBatchMsg: '编辑 群发消息',
     batchMsgList: '群发消息 列表',
   },
+  employee: {
+    title: '标题',
+    avatar: '头像',
+    tags: '标签',
+    hireCount: '被雇佣次数',
+    serviceCount: '已服务次数',
+    achievementCount: '业绩单数',
+    intro: '个人介绍',
+    estimate: '自我评价',
+    skill: '技能卡',
+    abilityType: '能力类型',
+    scene: '场景',
+    switchIn: '适用接入',
+    tutorial: '使用教程',
+    videoUrl: '视频',
+    workExperience: '工作经验',
+    addEmployee: '添加数字员工',
+    editEmployee: '编辑数字员工',
+    employeeList: '数字员工列表',
+  },
 };

+ 75 - 0
src/views/wechat/employee/EmployeeDrawer.vue

@@ -0,0 +1,75 @@
+<template>
+  <BasicDrawer
+    v-bind="$attrs"
+    @register="registerDrawer"
+    showFooter
+    :title="getTitle"
+    width="35%"
+    @ok="handleSubmit"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicDrawer>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed, unref } from 'vue';
+  import { BasicForm, useForm } from '@/components/Form/index';
+  import { formSchema } from './employee.data';
+  import { BasicDrawer, useDrawerInner } from '@/components/Drawer';
+  import { useI18n } from 'vue-i18n';
+
+  import { createEmployee, updateEmployee } from '@/api/wechat/employee';
+
+  export default defineComponent({
+    name: 'EmployeeDrawer',
+    components: { BasicDrawer, BasicForm },
+    emits: ['success', 'register'],
+    setup(_, { emit }) {
+      const isUpdate = ref(true);
+      const { t } = useI18n();
+
+      const [registerForm, { resetFields, setFieldsValue, validate }] = useForm({
+        labelWidth: 160,
+        baseColProps: { span: 24 },
+        layout: 'vertical',
+        schemas: formSchema,
+        showActionButtonGroup: false,
+      });
+
+      const [registerDrawer, { setDrawerProps, closeDrawer }] = useDrawerInner(async (data) => {
+        resetFields();
+        setDrawerProps({ confirmLoading: false });
+
+        isUpdate.value = !!data?.isUpdate;
+
+        if (unref(isUpdate)) {
+          setFieldsValue({
+            ...data.record,
+          });
+        }
+      });
+
+      const getTitle = computed(() =>
+        !unref(isUpdate) ? t('wechat.employee.addEmployee') : t('wechat.employee.editEmployee'),
+      );
+
+      async function handleSubmit() {
+        const values = await validate();
+        setDrawerProps({ confirmLoading: true });
+        values['id'] = unref(isUpdate) ? Number(values['id']) : 0;
+        let result = unref(isUpdate) ? await updateEmployee(values) : await createEmployee(values);
+        if (result.code === 0) {
+          closeDrawer();
+          emit('success');
+        }
+        setDrawerProps({ confirmLoading: false });
+      }
+
+      return {
+        registerDrawer,
+        registerForm,
+        getTitle,
+        handleSubmit,
+      };
+    },
+  });
+</script>

+ 205 - 0
src/views/wechat/employee/employee.data.ts

@@ -0,0 +1,205 @@
+import { BasicColumn, FormSchema } from '@/components/Table';
+import { useI18n } from '@/hooks/web/useI18n';
+import { formatToDateTime } from '@/utils/dateUtil';
+
+const { t } = useI18n();
+
+export const columns: BasicColumn[] = [
+  {
+    title: t('wechat.employee.title'),
+    dataIndex: 'title',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.avatar'),
+    dataIndex: 'avatar',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.tags'),
+    dataIndex: 'tags',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.hireCount'),
+    dataIndex: 'hireCount',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.serviceCount'),
+    dataIndex: 'serviceCount',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.achievementCount'),
+    dataIndex: 'achievementCount',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.intro'),
+    dataIndex: 'intro',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.estimate'),
+    dataIndex: 'estimate',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.skill'),
+    dataIndex: 'skill',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.abilityType'),
+    dataIndex: 'abilityType',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.scene'),
+    dataIndex: 'scene',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.switchIn'),
+    dataIndex: 'switchIn',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.tutorial'),
+    dataIndex: 'tutorial',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.videoUrl'),
+    dataIndex: 'videoUrl',
+    width: 100,
+  },
+  {
+    title: t('wechat.employee.workExperience'),
+    dataIndex: 'workExperience',
+    width: 100,
+  },
+  {
+    title: t('common.createTime'),
+    dataIndex: 'createdAt',
+    width: 70,
+    customRender: ({ record }) => {
+      return formatToDateTime(record.createdAt);
+    },
+  },
+];
+
+export const searchFormSchema: FormSchema[] = [
+  {
+    field: 'title',
+    label: t('wechat.employee.title'),
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+  {
+    field: 'tags',
+    label: t('wechat.employee.tags'),
+    component: 'Input',
+    colProps: { span: 8 },
+  },
+];
+
+export const formSchema: FormSchema[] = [
+  {
+    field: 'id',
+    label: 'ID',
+    component: 'Input',
+    show: false,
+  },
+  {
+    field: 'title',
+    label: t('wechat.employee.title'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'avatar',
+    label: t('wechat.employee.avatar'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'tags',
+    label: t('wechat.employee.tags'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'hireCount',
+    label: t('wechat.employee.hireCount'),
+    component: 'InputNumber',
+    required: true,
+  },
+  {
+    field: 'serviceCount',
+    label: t('wechat.employee.serviceCount'),
+    component: 'InputNumber',
+    required: true,
+  },
+  {
+    field: 'achievementCount',
+    label: t('wechat.employee.achievementCount'),
+    component: 'InputNumber',
+    required: true,
+  },
+  {
+    field: 'intro',
+    label: t('wechat.employee.intro'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'estimate',
+    label: t('wechat.employee.estimate'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'skill',
+    label: t('wechat.employee.skill'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'abilityType',
+    label: t('wechat.employee.abilityType'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'scene',
+    label: t('wechat.employee.scene'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'switchIn',
+    label: t('wechat.employee.switchIn'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'tutorial',
+    label: t('wechat.employee.tutorial'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'videoUrl',
+    label: t('wechat.employee.videoUrl'),
+    component: 'Input',
+    required: true,
+  },
+  {
+    field: 'workExperience',
+    label: t('wechat.employee.workExperience'),
+    component: 'Input',
+    required: true,
+  },
+];

+ 152 - 0
src/views/wechat/employee/index.vue

@@ -0,0 +1,152 @@
+<template>
+  <div>
+    <BasicTable @register="registerTable">
+      <template #tableTitle>
+        <Button
+          type="primary"
+          danger
+          preIcon="ant-design:delete-outlined"
+          v-if="showDeleteButton"
+          @click="handleBatchDelete"
+        >
+          {{ t('common.delete') }}
+        </Button>
+      </template>
+      <template #toolbar>
+        <a-button type="primary" @click="handleCreate">
+          {{ t('wechat.employee.addEmployee') }}
+        </a-button>
+      </template>
+      <template #bodyCell="{ column, record }">
+        <template v-if="column.key === 'action'">
+          <TableAction
+            :actions="[
+              {
+                icon: 'clarity:note-edit-line',
+                onClick: handleEdit.bind(null, record),
+              },
+              {
+                icon: 'ant-design:delete-outlined',
+                color: 'error',
+                popConfirm: {
+                  title: t('common.deleteConfirm'),
+                  placement: 'left',
+                  confirm: handleDelete.bind(null, record),
+                },
+              },
+            ]"
+          />
+        </template>
+      </template>
+    </BasicTable>
+    <EmployeeDrawer @register="registerDrawer" @success="handleSuccess" />
+  </div>
+</template>
+<script lang="ts">
+  import { createVNode, defineComponent, ref } from 'vue';
+  import { Modal } from 'ant-design-vue';
+  import { ExclamationCircleOutlined } from '@ant-design/icons-vue/lib/icons';
+  import { BasicTable, useTable, TableAction } from '@/components/Table';
+  import { Button } from '@/components/Button';
+
+  import { useDrawer } from '@/components/Drawer';
+  import EmployeeDrawer from './EmployeeDrawer.vue';
+  import { useI18n } from 'vue-i18n';
+
+  import { columns, searchFormSchema } from './employee.data';
+  import { getEmployeeList, deleteEmployee } from '@/api/wechat/employee';
+
+  export default defineComponent({
+    name: 'EmployeeManagement',
+    components: { BasicTable, EmployeeDrawer, TableAction, Button },
+    setup() {
+      const { t } = useI18n();
+      const selectedIds = ref<number[] | string[]>();
+      const showDeleteButton = ref<boolean>(false);
+
+      const [registerDrawer, { openDrawer }] = useDrawer();
+      const [registerTable, { reload }] = useTable({
+        title: t('wechat.employee.employeeList'),
+        api: getEmployeeList,
+        columns,
+        formConfig: {
+          labelWidth: 120,
+          schemas: searchFormSchema,
+        },
+        useSearchForm: true,
+        showTableSetting: true,
+        bordered: true,
+        showIndexColumn: false,
+        clickToRowSelect: false,
+        actionColumn: {
+          width: 30,
+          title: t('common.action'),
+          dataIndex: 'action',
+          fixed: undefined,
+        },
+        rowKey: 'id',
+        rowSelection: {
+          type: 'checkbox',
+          columnWidth: 20,
+          onChange: (selectedRowKeys, _selectedRows) => {
+            selectedIds.value = selectedRowKeys as number[];
+            showDeleteButton.value = selectedRowKeys.length > 0;
+          },
+        },
+      });
+
+      function handleCreate() {
+        openDrawer(true, {
+          isUpdate: false,
+        });
+      }
+
+      function handleEdit(record: Recordable) {
+        openDrawer(true, {
+          record,
+          isUpdate: true,
+        });
+      }
+
+      async function handleDelete(record: Recordable) {
+        const result = await deleteEmployee({ ids: [record.id] });
+        if (result.code === 0) {
+          await reload();
+        }
+      }
+
+      async function handleBatchDelete() {
+        Modal.confirm({
+          title: t('common.deleteConfirm'),
+          icon: createVNode(ExclamationCircleOutlined),
+          async onOk() {
+            const result = await deleteEmployee({ ids: selectedIds.value as number[] });
+            if (result.code === 0) {
+              showDeleteButton.value = false;
+              await reload();
+            }
+          },
+          onCancel() {
+            console.log('Cancel');
+          },
+        });
+      }
+
+      async function handleSuccess() {
+        await reload();
+      }
+
+      return {
+        t,
+        registerTable,
+        registerDrawer,
+        handleCreate,
+        handleEdit,
+        handleDelete,
+        handleSuccess,
+        handleBatchDelete,
+        showDeleteButton,
+      };
+    },
+  });
+</script>