Browse Source

Merge branch 'hotfix/hotfix-2022082314test'

tangning 3 năm trước cách đây
mục cha
commit
2ff8de6e09

+ 13 - 1
src/api/device/list.ts

@@ -1,5 +1,6 @@
 import { defHttp } from '/@/utils/http/axios';
-import { PageParams, RentListGetResultModel, addCameraParams } from './model';
+import { PageParams, RentListGetResultModel, addCameraParams, updateParams } from './model';
+import { Result } from '/#/axios';
 
 enum Api {
   pageList = '/zfb-api/zfb/camera/pageList',
@@ -7,6 +8,7 @@ enum Api {
   allCompany = '/zfb-api/zfb/company/listAll',
   unbindDevice = '/zfb-api/zfb/company/unbindDevice',
   editCamera = '/zfb-api/zfb/camera/update',
+  updateLiveRoomInfo = '/zfb-api/zfb/company/updateLiveRoomInfo',
 }
 
 /**
@@ -62,3 +64,13 @@ export const editCameraApi = (params: addCameraParams) =>
       ignoreCancelToken: true,
     },
   });
+
+export const updateLiveRoomInfoApi = (params: updateParams) =>
+  defHttp.post<Result>({
+    url: Api.updateLiveRoomInfo,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 5 - 0
src/api/device/model.ts

@@ -15,6 +15,11 @@ export interface addCameraParams {
   snCode?: string;
   wifiName: string;
 }
+export interface updateParams {
+  id: number;
+  canShow: number;
+  liveRoomCapacities: number;
+}
 export interface DeviceListItem {
   id: number;
   activatedTime: string;

+ 11 - 0
src/api/rightsEnterprises/list.ts

@@ -25,6 +25,7 @@ enum Api {
   allListType = '/zfb-api/zfb/shop/staffPerm/allListType',
   deviceType = '/zfb-api/zfb/cameraIncrement/incrementTypes',
   addCamrea = '/zfb-api/zfb/cameraIncrement/add',
+  deleteRights = '/zfb-api/zfb/shop/staffPerm/delete',
 }
 
 /**
@@ -139,6 +140,16 @@ export const unbindRights = (params) =>
     },
   });
 
+export const deleteRights = (params) =>
+  defHttp.post<Result>({
+    url: Api.deleteRights,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const unbindCamera = (params) =>
   defHttp.post<Result>({
     url: Api.cameraUnbind,

+ 54 - 0
src/api/scene/list.ts

@@ -15,6 +15,11 @@ enum Api {
   downloadSceneData = '/zfb-api/zfb/scene/downloadSceneData',
   getDownloadProcess = '/zfb-api/zfb/scene/getDownloadProcess',
   update = '/zfb-api/zfb/scene/update',
+  listRooms = '/zfb-api/zfb/liveRoom/listRooms',
+  bindUserList = '/zfb-api/zfb/brand/bindUserList',
+  createOrUpdate = '/zfb-api/zfb/liveRoom/createOrUpdate',
+  dismissRoom = '/zfb-api/zfb/liveRoom/dismissRoom',
+  deleteRoom = '/zfb-api/zfb/liveRoom/deleteRoom',
   generateDefaultLiveRoom = '/zfb-api/zfb/scene/generateDefaultLiveRoom',
 }
 
@@ -32,6 +37,55 @@ export const UpdateApi = (params: UpdateParams) =>
     },
   });
 
+export const bindUserList = (params: UpdateParams) =>
+  defHttp.post<Result>({
+    url: Api.bindUserList,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const deleteRoom = (params) =>
+  defHttp.post<Result>({
+    url: Api.deleteRoom,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const dismissRoom = (params) =>
+  defHttp.post<Result>({
+    url: Api.dismissRoom,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const createOrUpdate = (params) =>
+  defHttp.post<Result>({
+    url: Api.createOrUpdate,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const listRoomsApi = (params: UpdateParams) =>
+  defHttp.post<Result>({
+    url: Api.listRooms,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
 export const ListApi = (params: PageParams) =>
   defHttp.post<RentListGetResultModel>({
     url: Api.pageList,

+ 1 - 0
src/api/scene/live.ts

@@ -24,6 +24,7 @@ enum Api {
   getAllScene = '/zfb-api/zfb/scene/list',
   getBrandInfo = '/zfb-api/zfb/brand/info',
   addSave = '/zfb-api/zfb/brand/save',
+  // addSave = '/zfb-api/zfb/brand/save',
 }
 export type SceneLiveItemResult = SceneLiveItem;
 /**

+ 11 - 0
src/api/staff/list.ts

@@ -30,6 +30,17 @@ export const clean = (params) =>
     },
   });
 
+export const staffListApi = (params: PageParams) =>
+  defHttp.post<ListGetResultModel>({
+    url: Api.pageList,
+    params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
 export const ListApi = (params: PageParams) =>
   defHttp.post<ListGetResultModel>({
     url: Api.pageList,

+ 1 - 0
src/locales/lang/zh-CN/routes/dashboard.ts

@@ -17,6 +17,7 @@ export default {
   scenesDownload: '场景下载',
   scenesList: '场景列表',
   scenesLive: '直播',
+  scenesRoom: '房间管理',
   devices: '设备管理',
   product: '商品管理',
   productRef: '商品属性',

+ 60 - 0
src/locales/lang/zh-CN/routes/room.ts

@@ -0,0 +1,60 @@
+export default {
+  sceneName: '场景名称',
+  webSite: '场景链接',
+  childName: '拍摄设备ID',
+  brandName: '直播场景',
+  viewCount: '场景访问量',
+  createTime: '拍摄时间',
+  num: '场景码',
+  process: '下载进度',
+  sceneList: '场景列表',
+  bindAnchor: '绑定主播',
+  anchorRoom: '房间名称',
+  appListPicUrl: '房间间封面',
+  sortOrder: '排序',
+  anchorUserName: '主持人名称',
+  isShow: '是否显示',
+  livestream: '开播',
+  capacities: '带看模式(人)',
+  listRoomsState: '房间状态',
+  bindShowerNameList: '已绑定主播',
+  livestreamStatus: '是否开播',
+  liveBroadcast: '房间列表',
+  downloadScene: '下载场景',
+  downloadSceneConfirm: '是否确认下载场景',
+  editor: '打开编辑器',
+  cancelDownload: '取消下载',
+  own: '主播选择',
+  userName: '员工名称',
+  canShow: '是否同时开通一起逛',
+  bindTime: '绑定时间',
+  anchorList: '主播列表',
+  addLive: '新增场景',
+  liveType: '房间类型',
+  liveName: '房间名称',
+  makeLiveCover: '生成房间',
+  sceneUrl: '场景链接',
+  detailAddr: '详细地址',
+  contractPhone: '联系电话',
+  simpleDesc: '房间间描述',
+  roleType: {
+    0: '公司管理员',
+    1: '公司员工',
+  },
+  houseType: {
+    0: '新房',
+    1: '二手房',
+    2: '公寓',
+    3: '民宿',
+    9: '全部',
+  },
+  status: '状态',
+  roomStatus: '房间状态',
+  statusText: {
+    1: '正常',
+    0: '封存',
+    101: '已开始',
+    102: '待开始',
+    103: '已结束',
+  },
+};

+ 7 - 0
src/locales/lang/zh-CN/routes/scenes.ts

@@ -11,8 +11,11 @@ export default {
   anchorRoom: '直播间名称',
   appListPicUrl: '直播间封面',
   sortOrder: '排序',
+  anchorUserName: '主持人名称',
   isShow: '是否显示',
   livestream: '开播',
+  capacities: '带看模式(人)',
+  listRoomsState: '直播间状态',
   bindShowerNameList: '已绑定主播',
   livestreamStatus: '是否开播',
   liveBroadcast: '直播列表',
@@ -45,8 +48,12 @@ export default {
     9: '全部',
   },
   status: '状态',
+  roomStatus: '房间状态',
   statusText: {
     1: '正常',
     0: '封存',
+    101: '直播中',
+    102: '未开始',
+    103: '已结束',
   },
 };

+ 9 - 0
src/router/routes/modules/scenes.ts

@@ -41,6 +41,15 @@ const scenes: AppRouteModule = {
         icon: 'carbon:flow-stream',
       },
     },
+    {
+      path: 'room',
+      name: 'ScenesRoom',
+      component: () => import('/@/views/scenes/room.vue'),
+      meta: {
+        title: t('routes.dashboard.scenesRoom'),
+        icon: 'carbon:flow-stream',
+      },
+    },
   ],
 };
 

+ 1 - 1
src/views/corporation/AddModal.vue

@@ -31,7 +31,7 @@
         span: 24,
       },
       componentProps: {
-        maxLength: 25,
+        maxLength: 15,
       },
       rules: [
         {

+ 180 - 0
src/views/corporation/SetMealModal.vue

@@ -0,0 +1,180 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :title="'带看套餐'"
+    :minHeight="200"
+    @visible-change="handleVisibleChange"
+    @ok="handleSubmit"
+    @cancel="resetFields"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model" />
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  // import { checkUserAddAble } from '/@/api/corporation/modal';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { updateLiveRoomInfoApi } from '/@/api/device/list';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['register', 'submit'],
+    setup(props, { emit }) {
+      const modelRef = ref({
+        ifShow: true,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+        {
+          show: false,
+          field: 'canShow',
+          component: 'RadioGroup',
+          label: '是否支持带逛',
+          required: true,
+          colProps: {
+            span: 22,
+          },
+          defaultValue: '0',
+          componentProps: {
+            options: [
+              {
+                label: '支持',
+                value: 1,
+              },
+              {
+                label: '不支持',
+                value: 0,
+              },
+            ],
+            onChange: (e) => {
+              console.log('data', e.target.value);
+              updateSchema({
+                field: 'liveRoomCapacities',
+                // ifShow: e.target.value == 1 ? true : false,
+              });
+            },
+          },
+        },
+        {
+          field: 'liveRoomCapacities',
+          component: 'Select',
+          label: '套餐',
+          required: true,
+          colProps: {
+            span: 22,
+          },
+          // ifShow: modelRef.value.ifShow,
+          componentProps: {
+            options: [
+              {
+                label: '1+4',
+                value: 5,
+              },
+              {
+                label: '1+29',
+                value: 30,
+              },
+              {
+                label: '1+39',
+                value: 40,
+              },
+              {
+                label: '1+49',
+                value: 50,
+              },
+              {
+                label: '1+99',
+                value: 100,
+              },
+            ],
+            onChange: (data, item) => {
+              console.log('data', data, item);
+            },
+          },
+        },
+      ];
+      const [
+        registerForm,
+        {
+          // getFieldsValue,
+          setFieldsValue,
+          // setProps
+          resetFields,
+          updateSchema,
+          validate,
+        },
+      ] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        console.log('insertData', data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value.ifShow = data.canShow == 1 ? true : false;
+        console.log('insertData', modelRef.value.ifShow);
+        setFieldsValue({ ...data });
+        updateSchema({
+          field: 'liveRoomCapacities',
+          // ifShow: modelRef.value.ifShow,
+        });
+      }
+      const handleSubmit = async () => {
+        const values = await validate();
+        //TODO hack parameter
+        console.log('values', values);
+        const res = await updateLiveRoomInfoApi({
+          id: values.id,
+          canShow: values.canShow,
+          liveRoomCapacities: values.liveRoomCapacities,
+        });
+        // let res = await checkUserAddAble({ phoneNum: values.managerPhone });
+        console.log('insertData', res);
+        emit('submit');
+        closeModal();
+        resetFields();
+        createMessage.success(t('common.optSuccess'));
+        // createMessage.success(t('routes.corporation.optSuccess'));
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+
+      return {
+        t,
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        closeModal,
+        resetFields,
+        // nextTick,
+      };
+    },
+  });
+</script>

+ 18 - 5
src/views/corporation/index.vue

@@ -2,6 +2,11 @@
   <div class="p-4">
     <BasicTable @register="registerTable">
       <template #toolbar> </template>
+      <template #setMeal="{ record }">
+        <div style="color: #0960bd; cursor: pointer" @click="opensetMealModal(true, record)">{{
+          record.liveRoomCapacities || '不支持'
+        }}</div>
+      </template>
       <template #sceneLogo="{ record }">
         <CropperAvatar
           :showBtn="false"
@@ -98,23 +103,21 @@
     <SubaccountModal @register="registerSubaccountModal" @update="reload" />
     <cameraModal @register="registerCameraModal" @ok="reload" />
     <TimeModal @register="registerTimeModal" @submit="reload" />
+    <SetMealModal @register="registersetMealModal" @submit="reload" />
   </div>
 </template>
 <script lang="ts">
   import { useI18n } from '/@/hooks/web/useI18n';
   import { defineComponent, nextTick } from 'vue';
   import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
-  // import { CollapseContainer } from '/@/components/Container';
   import { CropperAvatar } from '/@/components/Cropper';
   import { BasicUpload } from '/@/components/Upload';
-  // import { uploadApi } from '/@/api/sys/upload';
-  // import { Avatar } from 'ant-design-vue';
-  // import { getBasicColumns, getBasicData } from './tableData';
   import { ListApi, uploadLogoApi, updateCompnayApi } from '/@/api/corporation/list';
   import { useModal } from '/@/components/Modal';
   import chargeModal from './chargeModal.vue';
   import deviceModal from './deviceModal.vue';
   import TimeModal from './setTime.vue';
+  import SetMealModal from './SetMealModal.vue';
   import SubaccountModal from './SubaccountModal.vue';
   import cameraModal from './cameraModal.vue';
   import { Time } from '/@/components/Time';
@@ -134,6 +137,7 @@
       BasicUpload,
       Tag,
       TimeModal,
+      SetMealModal,
     },
     setup() {
       const [registerDeviceModal, { openModal: openDeviceModal }] = useModal();
@@ -141,6 +145,7 @@
       const [registerSubaccountModal, { openModal: openSubaccountModal }] = useModal();
       const [registerCameraModal, { openModal: openCameraModal }] = useModal();
       const [registerTimeModal, { openModal: openTimeModal }] = useModal();
+      const [registersetMealModal, { openModal: opensetMealModal }] = useModal();
       const { t } = useI18n();
       const columns: BasicColumn[] = [
         // {
@@ -179,7 +184,7 @@
           width: 190,
         },
         {
-          title: t('routes.corporation.cameraNum'),
+          title: '设备信息',
           dataIndex: 'cameraNum',
           slots: { customRender: 'cameraNum' },
           width: 80,
@@ -197,6 +202,12 @@
           width: 80,
         },
         {
+          title: '带看套餐',
+          dataIndex: 'liveRoomCapacities',
+          slots: { customRender: 'setMeal' },
+          width: 80,
+        },
+        {
           title: t('routes.corporation.point'),
           ellipsis: false,
           dataIndex: 'point',
@@ -316,6 +327,7 @@
         registerChargeModal,
         registerDeviceModal,
         registerTimeModal,
+        registersetMealModal,
         registerSubaccountModal,
         handleOpenModal,
         uploadLogoApi: uploadLogoApi as any,
@@ -326,6 +338,7 @@
         registerCameraModal,
         openCameraModal,
         openTimeModal,
+        opensetMealModal,
       };
     },
   });

+ 16 - 1
src/views/rightsEnterprises/list.vue

@@ -28,6 +28,15 @@
               onClick: handleDelete.bind(null, record),
             },
             {
+              color: 'error',
+              label: '删除',
+              ifShow: !record.userId,
+              popConfirm: {
+                title: '是否确认删除',
+                confirm: deleteConfirm.bind(null, record),
+              },
+            },
+            {
               label: '解绑',
               ifShow:
                 getCheckRole([RoleEnum.PLAT_ADMIN]) &&
@@ -53,7 +62,7 @@
   import { uploadApi } from '/@/api/sys/upload';
   import BindModal from './BindModal.vue';
   import addModal from './addModal.vue';
-  import { staffList, unbindRights } from '/@/api/rightsEnterprises/list';
+  import { staffList, unbindRights, deleteRights } from '/@/api/rightsEnterprises/list';
   import { useI18n } from '/@/hooks/web/useI18n';
   // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
   import dayjs from 'dayjs';
@@ -276,6 +285,11 @@
           ...modelRef,
         });
       }
+      async function deleteConfirm(record) {
+        let res = await deleteRights({ id: record.id });
+        console.log('deleteRights', res);
+        reload();
+      }
       function handleUpBind(record) {
         createConfirm({
           iconType: 'warning',
@@ -304,6 +318,7 @@
         register,
         handleEdit,
         handleDelete,
+        deleteConfirm,
         uploadApi: uploadApi as any,
         RoleEnum,
         surplusSubNum,

+ 93 - 22
src/views/scenes/liveDrawer.vue

@@ -33,6 +33,19 @@
             </template>
           </a-input>
         </template>
+        <template #sceneNum="{ model, field }">
+          <Select
+            :disabled="isUpdate"
+            v-bind="$attrs"
+            v-model:value="model[field]"
+            @change="handleChange"
+            @search="handleSearch"
+            showSearch
+            placeholder="请选择场景链接"
+            :options="getOptions"
+            :filterOption="filterOption"
+          />
+        </template>
       </BasicForm>
     </div>
   </BasicDrawer>
@@ -46,7 +59,8 @@
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useUserStore } from '/@/store/modules/user';
   import { data as CascaderData, getCode } from '/@/utils/cascaderData';
-
+  import { ListApi } from '/@/api/scene/list';
+  import { Select } from 'ant-design-vue';
   import {
     brandTypeListApi,
     uploadLiveApi,
@@ -57,7 +71,6 @@
     brandUpdateApi,
     // LiveSceneDeleteApi,
   } from '/@/api/scene/live';
-
   import { useScript } from '/@/hooks/web/useScript';
   const A_MAP_URL = 'https://webapi.amap.com/maps?v=2.0&key=e661b00bdf2c44cccf71ef6070ef41b8';
 
@@ -70,7 +83,7 @@
 
   export default defineComponent({
     name: 'MenuDrawer',
-    components: { BasicDrawer, BasicForm },
+    components: { BasicDrawer, BasicForm, Select },
     emits: ['success', 'register'],
     setup(_, { emit }) {
       const isUpdate = ref(true);
@@ -79,7 +92,13 @@
       const token = userStore.getToken;
       const userinfo = computed(() => userStore.getUserInfo);
       const wrapRef = ref<HTMLDivElement | null>(null);
-
+      const sceneNumOption = reactive({
+        list: [],
+        allList: [],
+      });
+      const getOptions = computed(() => {
+        return sceneNumOption.list;
+      });
       interface AddressComponentType {
         city: string;
         district: string;
@@ -111,6 +130,9 @@
         id: '',
         introduceVideoCover: '',
       });
+      const filterOption = (input, option) => {
+        return option.sceneName.includes(input.toLowerCase());
+      };
       const defaultAddress = reactive({
         address: '山阴路688号恒隆广场B座1217',
         // address: '权晖花园21栋',
@@ -152,7 +174,7 @@
           required: true,
           helpMessage: '仅能输入 英文大小写和中文,最多可输入50个字',
           componentProps: {
-            maxLength: 50,
+            maxLength: 25,
           },
         },
         {
@@ -188,7 +210,7 @@
         {
           field: 'sceneNum',
           label: t('routes.scenes.sceneUrl'),
-          component: 'ApiSelect',
+          component: 'Input',
           colProps: {
             span: 10,
           },
@@ -197,21 +219,25 @@
           },
           required: true,
           helpMessage: '直播间绑定后,将无法修改',
-          componentProps: {
-            api: getAllSceneApi,
-            immediate: true,
-            resultField: 'list',
-            labelField: 'sceneName',
-            valueField: 'num',
-            onChange: function (_, item) {
-              console.log('onChange', item);
-              myData.sceneUrl = item.webSite || item.sceneUrl || item.liveRoomUrl;
-            },
-            params: {
-              page: 1,
-              limit: 100,
-            },
-          },
+          slot: 'sceneNum',
+          // componentProps: {
+          //   api: getAllSceneApi,
+          //   immediate: true,
+          //   resultField: 'list',
+          //   labelField: 'sceneName',
+          //   valueField: 'num',
+          //   onChange: function (_, item) {
+          //     console.log('onChange', item);
+          //     myData.sceneUrl = item.webSite || item.sceneUrl || item.liveRoomUrl;
+          //   },
+          //   onSearch:function(vale,item) {
+          //     console.log('onChange', vale,item);
+          //   },
+          //   params: {
+          //     page: 1,
+          //     limit: 100,
+          //   },
+          // },
         },
 
         {
@@ -370,8 +396,21 @@
         resetFields();
         setDrawerProps({ confirmLoading: false });
         isUpdate.value = !!data?.isUpdate;
-        console.log('isUpdate', isUpdate.value);
         const { record } = data;
+        let Option = await getAllSceneApi({
+          page: 1,
+          limit: 100,
+          sceneNum: record && record.sceneNum,
+        });
+        sceneNumOption.list = Option.list.map((ele) => {
+          return {
+            ...ele,
+            label: ele.sceneName,
+            value: ele.num,
+          };
+        });
+        sceneNumOption.allList = sceneNumOption.list;
+        console.log('isUpdate', isUpdate.value, Option.list);
         await updateSchema({
           field: 'sceneNum',
           componentProps: {
@@ -498,6 +537,33 @@
         });
       }
 
+      function handleChange(value, item) {
+        console.log('handleChange', value, item);
+        console.log('myData.sceneUrl', myData.sceneUrl);
+        setFieldsValue({
+          sceneNum: value,
+        });
+      }
+
+      async function handleSearch(value) {
+        if (!value) {
+          return (sceneNumOption.list = sceneNumOption.allList);
+        }
+        let { list } = await ListApi({
+          sceneName: value,
+          limit: 100,
+          page: 1,
+        });
+        sceneNumOption.list = list.map((ele) => {
+          return {
+            ...ele,
+            value: ele.num,
+            label: ele.sceneName,
+          };
+        });
+        console.log('handleSearch', value, list);
+      }
+
       function getCodeArray(addressComponent) {
         let { province, city, district } = addressComponent;
         return [province, city, district];
@@ -616,7 +682,12 @@
         handleClose,
         t,
         token,
+        sceneNumOption,
         isUpdate,
+        handleChange,
+        handleSearch,
+        getOptions,
+        filterOption,
       };
     },
   });

+ 430 - 0
src/views/scenes/room.vue

@@ -0,0 +1,430 @@
+<template>
+  <div class="p-4">
+    <BasicTable @register="registerTable" :rowSelection="{ type: 'checkbox' }">
+      <template #toolbar>
+        <a-button
+          type="primary"
+          v-show="
+            getCheckRole(['super', 'plat_admin']) ||
+            (getCheckRole(['company_admin', 'staff']) && getEquity([2]))
+          "
+          @click="handleAddLiveScene"
+        >
+          创建房间</a-button
+        >
+      </template>
+      <template #cover="{ record }">
+        <TableImg
+          :size="150"
+          :simpleShow="true"
+          :imgList="[record.appListPicUrl || '/resource/img/pic_bg@2x.png']"
+        />
+      </template>
+      <template #Time="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <template #liveEndTime="{ record }">
+        <Time v-if="record.liveEndTime" :value="record.liveEndTime" mode="datetime" />
+        <span v-else>-</span>
+      </template>
+
+      <template #liveTime="{ record }">
+        <Time :value="record.effectiveStartTime" mode="datetime" />
+        <br />
+        <Time :value="record.effectiveEndTime" mode="datetime" />
+      </template>
+
+      <template #houseType="{ record }">
+        {{ renderHouseType(Number(record.type)) }}
+      </template>
+
+      <template #action="{ record }">
+        <TableAction :actions="renderActions(record)" />
+      </template>
+    </BasicTable>
+    <roomDeital @success="reload" @register="registerModal" @submit="handleAddUser" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, toRaw } from 'vue';
+  import dayjs from 'dayjs';
+  import {
+    BasicTable,
+    useTable,
+    BasicColumn,
+    FormProps,
+    TableAction,
+    TableImg,
+  } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { Time } from '/@/components/Time';
+  // import { LiveSceneDeleteApi } from '/@/api/scene/live';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useUserStore } from '/@/store/modules/user';
+  import { useModal } from '/@/components/Modal';
+  import roomDeital from './roomDeital.vue';
+  import { listRoomsApi, dismissRoom, deleteRoom } from '/@/api/scene/list';
+
+  export default defineComponent({
+    components: { BasicTable, TableAction, TableImg, roomDeital, Time },
+    setup() {
+      const { createMessage, createConfirm } = useMessage();
+      const userStore = useUserStore();
+      const { getCheckRole, getEquity } = userStore;
+      const { t } = useI18n();
+      const [registerModal, { openModal: addopenModal }] = useModal();
+      const permList = computed(() => userStore.getPermList);
+      const columns: BasicColumn[] = [
+        {
+          title: 'ID',
+          dataIndex: 'id',
+          fixed: 'left',
+          width: 100,
+        },
+        {
+          title: t('routes.room.anchorRoom'),
+          dataIndex: 'name',
+          ellipsis: false,
+          width: 130,
+        },
+        {
+          title: t('routes.room.brandName'),
+          dataIndex: 'brandName',
+          ellipsis: false,
+          width: 130,
+        },
+        {
+          title: t('routes.room.capacities'),
+          dataIndex: 'capacities',
+          // slots: { customRender: 'houseType' },
+          width: 100,
+          customRender: ({ record }) => {
+            return record.capacities || '-';
+          },
+        },
+        {
+          title: '主持人',
+          dataIndex: 'anchorUserName',
+          width: 140,
+        },
+        {
+          title: '助理',
+          dataIndex: 'assistantUserName',
+          width: 140,
+          customRender: ({ record }) => {
+            return record.assistantUserName || '-';
+          },
+        },
+        {
+          title: '助理手机号',
+          dataIndex: 'assistantPhone',
+          width: 140,
+          customRender: ({ record }) => {
+            return record.assistantPhone || '-';
+          },
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createTime',
+          slots: { customRender: 'Time' },
+          width: 150,
+        },
+        {
+          title: '开播时间段',
+          dataIndex: 'effectiveStartTime',
+          slots: { customRender: 'liveTime' },
+          width: 180,
+        },
+        {
+          title: '房间结束时间',
+          dataIndex: 'liveEndTime',
+          slots: { customRender: 'liveEndTime' },
+          width: 140,
+        },
+        {
+          title: '创建人',
+          dataIndex: 'createUserName',
+          width: 180,
+        },
+        {
+          title: t('routes.room.roomStatus'),
+          dataIndex: 'state',
+          width: 180,
+          customRender: ({ record }) => {
+            const enable = record.state;
+            const text = renderRoomType(enable); // ? t('routes.room.statusText.1') : t('routes.room.statusText.0');
+            return text;
+          },
+        },
+        {
+          title: t('common.operation'),
+          dataIndex: '',
+          slots: { customRender: 'action' },
+          ifShow:
+            (!getCheckRole(['host', 'tourist']) && getEquity(2)) ||
+            getCheckRole(['super', 'plat_admin']),
+          width: 100,
+          fixed: 'right',
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 100,
+        schemas: [
+          {
+            field: 'name',
+            label: t('routes.room.anchorRoom'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+          },
+          {
+            field: 'anchorUserName',
+            label: t('routes.room.anchorUserName'),
+            component: 'Input',
+            componentProps: {
+              maxLength: 100,
+            },
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+          },
+          {
+            field: 'state',
+            label: t('routes.room.listRoomsState'),
+            component: 'Select',
+            colProps: {
+              xl: 5,
+              xxl: 5,
+            },
+            defaultValue: '',
+            componentProps: {
+              options: [
+                {
+                  label: t('common.all'),
+                  value: '',
+                  key: '0',
+                },
+                {
+                  label: t('routes.room.statusText.101'),
+                  value: 101,
+                  key: '101',
+                },
+                {
+                  label: t('routes.room.statusText.102'),
+                  value: 102,
+                  key: '102',
+                },
+                {
+                  label: t('routes.room.statusText.103'),
+                  value: 103,
+                  key: '103',
+                },
+              ],
+            },
+          },
+        ],
+      };
+
+      function renderHouseType(type: number): string {
+        switch (type) {
+          case 0:
+            return '新房';
+          case 1:
+            return '二手房';
+          case 2:
+            return '公寓';
+          case 3:
+            return '民宿';
+          case 4:
+            return '装修';
+          default:
+            return t(`routes.room.houseType.9`);
+        }
+      }
+
+      function renderRoomType(type: number): string {
+        switch (type) {
+          case 0:
+            return '新房';
+          case 1:
+            return '二手房';
+          case 2:
+            return '公寓';
+          case 3:
+            return '民宿';
+          case 4:
+            return '装修';
+          case 101:
+            return t('routes.room.statusText.101');
+          case 102:
+            return t('routes.room.statusText.102');
+          case 103:
+            return t('routes.room.statusText.103');
+          default:
+            return t(`routes.room.houseType.9`);
+        }
+      }
+
+      const [registerTable, { reload }] = useTable({
+        title: t(`routes.room.liveBroadcast`),
+        api: listRoomsApi,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: false,
+        rowKey: 'id',
+        pagination: { pageSize: 20 },
+        clickToRowSelect: false,
+        fetchSetting: {
+          pageField: 'page',
+          sizeField: 'limit',
+          listField: 'list',
+          totalField: 'totalCount',
+        },
+        sortFn: (sortInfo) => {
+          console.log('sortInfo', sortInfo);
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function handleBindAnchor(record: Recordable) {
+        createConfirm({
+          width: 500,
+          iconType: 'warning',
+          title: '温馨提示',
+          content: `关闭房间后,房间内的所有人都会退出房间,是否继续关闭?<br>(关闭后,房间状态将改为已结束)`,
+          onOk: async () => {
+            handleDismissRoom(record);
+          },
+        });
+      }
+      function openTargetModal(record: Recordable) {
+        addopenModal(true, {
+          isUpdate: true,
+          record: {
+            ...toRaw(record),
+            launchPeriod: [
+              record.effectiveEndTime &&
+                dayjs(record.effectiveEndTime).format('YYYY-MM-DD HH:mm:ss'),
+              record.effectiveStartTime &&
+                dayjs(record.effectiveStartTime).format('YYYY-MM-DD HH:mm:ss'),
+            ],
+          },
+        });
+      }
+      function handleAddLiveScene() {
+        addopenModal(true, {});
+      }
+
+      function handleSeeLiveScene(record: Recordable) {
+        let setRecord = toRaw(record);
+        addopenModal(true, {
+          isSetData: true,
+          record: {
+            ...setRecord,
+            brandId: setRecord.brandName,
+            anchorUserId: setRecord.anchorUserName,
+            assistantUserId: setRecord.assistantUserName,
+            launchPeriod: [
+              record.effectiveEndTime &&
+                dayjs(record.effectiveEndTime).format('YYYY-MM-DD HH:mm:ss'),
+              record.effectiveStartTime &&
+                dayjs(record.effectiveStartTime).format('YYYY-MM-DD HH:mm:ss'),
+            ],
+          },
+        });
+      }
+      function handleDtelRoom(record) {
+        createConfirm({
+          width: 500,
+          iconType: 'warning',
+          title: '删除房间',
+          content: `删除房间后,房间信息及数据将进行销毁,是否继续删除?`,
+          onOk: async () => {
+            handleDeleteLiveScene(record);
+          },
+        });
+      }
+
+      function renderActions(record: Recordable) {
+        if (record.state == '101') {
+          return [
+            {
+              label: '结束房间',
+              color: 'error',
+              onClick: handleBindAnchor.bind(null, record),
+            },
+          ];
+        } else if (record.state == '102') {
+          //未开播
+          return [
+            {
+              color: 'warning',
+              label: '编辑',
+              onClick: openTargetModal.bind(null, record),
+            },
+            {
+              color: 'error',
+              label: '删除',
+              onClick: handleDtelRoom.bind(null, record),
+            },
+          ];
+        } else {
+          //103:已结束
+          return [
+            {
+              color: 'warning',
+              label: '查看',
+              onClick: handleSeeLiveScene.bind(null, record),
+            },
+            {
+              color: 'error',
+              label: '删除',
+              onClick: handleDtelRoom.bind(null, record),
+            },
+          ];
+        }
+      }
+      async function handleDismissRoom(record: Recordable) {
+        await dismissRoom({ id: record.id });
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+
+      async function handleDeleteLiveScene(record: Recordable) {
+        await deleteRoom({ id: record.id });
+        createMessage.success(t('common.optSuccess'));
+        reload();
+      }
+      return {
+        registerTable,
+        createMessage,
+        handleDtelRoom,
+        renderActions,
+        renderRoomType,
+        renderHouseType,
+        t,
+        registerModal,
+        handleBindAnchor,
+        permList,
+        reload,
+        openTargetModal,
+        handleAddLiveScene,
+        handleSeeLiveScene,
+        handleDeleteLiveScene,
+        getCheckRole,
+        getEquity,
+      };
+    },
+  });
+</script>

+ 451 - 0
src/views/scenes/roomDeital.vue

@@ -0,0 +1,451 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    :minHeight="340"
+    :width="580"
+    :title="modalTitle"
+    @visible-change="handleVisibleChange"
+    @ok="handleSubmit"
+    @cancel="handleClose"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm">
+        <template #text="{ model, field }">
+          {{ model[field] || '' }}
+        </template>
+      </BasicForm>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, nextTick, ref, computed, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  // import { checkUserAddAble } from '/@/api/corporation/modal';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useUserStore } from '/@/store/modules/user';
+  import { staffListApi } from '/@/api/staff/list';
+  import { ListApi } from '/@/api/scene/live';
+  import { bindUserList, createOrUpdate } from '/@/api/scene/list';
+  import dayjs from 'dayjs';
+  import { cloneDeep } from 'lodash-es';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['register', 'submit', 'tablelist'],
+    setup(props, { emit }) {
+      const { createMessage } = useMessage();
+      const modalTitle = ref('编辑');
+      const userStore = useUserStore();
+      const userinfo = computed(() => userStore.getUserInfo);
+      const { companyId } = userinfo.value;
+      console.log('userinfovalue', userinfo.value);
+      const { getCheckRole } = userStore;
+      const isPropsData = reactive({
+        isUpdate: true,
+        isSetData: true,
+        record: {},
+      });
+      const userIdList = reactive({
+        list: [],
+      });
+      const schemas: FormSchema[] = [
+        {
+          field: 'name',
+          label: '房间名称',
+          component: 'Input',
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          componentProps: {
+            maxLength: 15,
+            autoComplete: 'off',
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                if (!value) {
+                  return Promise.reject('请输入房间名称');
+                }
+                let iconRule2 =
+                  /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/gi;
+                if (iconRule2.test(value)) {
+                  return Promise.reject('不支持特殊符号');
+                } else {
+                  return Promise.resolve();
+                }
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'brandId',
+          label: '房间场景',
+          component: 'ApiSelect',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          componentProps: {
+            api: ListApi,
+            showSearch: true,
+            resultField: 'list',
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+            onChange: brandIdChange,
+          },
+        },
+        {
+          field: 'anchorUserId',
+          label: '主持人',
+          component: 'ApiSelect',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          componentProps: {
+            api: bindUserList,
+            showSearch: true,
+            disabled: true,
+            resultField: 'list',
+            labelField: 'userAndNick',
+            valueField: 'id',
+            immediate: false,
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+          },
+        },
+        {
+          field: 'launchPeriod', //'effectiveStartTime',
+          component: 'RangePicker',
+          label: '开播时间段',
+          colProps: {
+            span: 22,
+          },
+          required: true,
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                if (!value) {
+                  return Promise.reject('请选择开播时间段');
+                }
+                if (modalTitle.value == '查看') {
+                  return Promise.resolve();
+                }
+                let start, end;
+                if (dayjs(value[0]).isAfter(dayjs(value[1]))) {
+                  start = dayjs(value[1]);
+                  end = dayjs(value[0]);
+                } else {
+                  end = dayjs(value[1]);
+                  start = dayjs(value[0]);
+                }
+                console.log('start', start.format('YYYY-MM-DD'), end.format('YYYY-MM-DD'), value);
+                if (end.isSame(start, 'minute')) {
+                  return Promise.reject('结束时间应大于开始时间');
+                } else if (dayjs().isAfter(dayjs(end))) {
+                  return Promise.reject('结束时间应大于当前时间');
+                } else {
+                  return Promise.resolve();
+                }
+              },
+              trigger: 'change',
+            },
+          ],
+          componentProps: {
+            onChange: async (data) => {
+              console.log('data', data);
+              setFieldsValue({
+                incrementEndTime: '',
+              });
+            },
+            // valueFormat: 'YYYY-MM-DD HH:mm',
+            format: 'YYYY-MM-DD HH:mm',
+            showTime: true,
+            // disabledDate: validateStartTime,
+          },
+        },
+        // {
+        //   field: 'effectiveEndTime',
+        //   component: 'DatePicker',
+        //   label: '计划结束时间',
+        //   colProps: {
+        //     span: 22,
+        //   },
+        //   required: true,
+        //   componentProps: {
+        //     // valueFormat: 'YYYY-MM-DD HH:mm',
+        //     format: 'YYYY-MM-DD HH:mm',
+        //     showTime: true,
+        //     disabledDate: validateDate,
+        //     disabledTime: validateTime,
+        //   },
+        // },
+        {
+          field: 'assistantUserId',
+          component: 'ApiSelect',
+          label: '助理',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 22,
+          },
+          required: false,
+          componentProps: {
+            api: staffListApi,
+            showSearch: true,
+            resultField: 'list',
+            labelField: 'nickName',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              page: 1,
+              limit: 1000,
+              companyId: companyId,
+            },
+            onChange: async (data) => {
+              console.log('data', data, arguments);
+            },
+          },
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: '测试',
+          ifShow: false,
+          // slot: 'text',
+        },
+      ];
+      const [
+        registerForm,
+        {
+          getFieldsValue,
+          // validateFields,
+          setFieldsValue,
+          // setProps
+          updateSchema,
+          resetFields,
+          validate,
+        },
+      ] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner(async (data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        isPropsData.isUpdate = data.isUpdate || false;
+        isPropsData.isSetData = data.isSetData || false;
+        modalTitle.value = data.isSetData ? '查看' : data.isUpdate ? '编辑' : '新增';
+        // const  = ref('编辑');
+        isPropsData.record = data.record || {};
+        if (data.isUpdate) {
+          //编辑
+          setFieldsValue({
+            ...data.record,
+          });
+          updateSchema(
+            schemas.map((ele, index) => {
+              return {
+                ...ele,
+                componentProps: {
+                  ...ele.componentProps,
+                  disabled: index < 3 && index != 0 ? true : false,
+                },
+                slot: '',
+              };
+            }),
+          );
+          if (data.record && data.record.brandId) {
+            brandIdChange(data.record.brandId);
+          }
+          if (data.record && data.record.anchorUserId) {
+            UserIdChange(data.record.anchorUserId);
+          }
+        } else if (data.isSetData) {
+          //查看
+          let setSchemas = [];
+          console.log('setFieldsValue', data.record);
+          schemas.map((ele) => {
+            let setSchemasItem = {
+              ...ele,
+              componentProps: {
+                ...ele.componentProps,
+                disabled: true,
+              },
+              // slot: 'text',
+            };
+            setSchemas.push(cloneDeep(setSchemasItem));
+          });
+          updateSchema(setSchemas);
+          setFieldsValue(data.record);
+        } else {
+          //新增
+          resetFields();
+          updateSchema(
+            schemas.map((ele) => {
+              return {
+                ...ele,
+                componentProps: {
+                  ...ele.componentProps,
+                  disabled: false,
+                },
+                // slot: '',
+              };
+            }),
+          );
+        }
+      }
+      const handleSubmit = async () => {
+        const values = await validate();
+        const { launchPeriod } = values;
+        console.log('validate', values, launchPeriod);
+        let apiData = {
+          ...values,
+          effectiveEndTime:
+            new Date(launchPeriod[0]).getTime() > new Date(launchPeriod[1]).getTime()
+              ? new Date(launchPeriod[0]).getTime()
+              : new Date(launchPeriod[1]).getTime(),
+          effectiveStartTime:
+            new Date(launchPeriod[0]).getTime() > new Date(launchPeriod[1]).getTime()
+              ? new Date(launchPeriod[1]).getTime()
+              : new Date(launchPeriod[0]).getTime(),
+        };
+        if (!isPropsData.isSetData) {
+          apiData.id = isPropsData.record.id;
+          await createOrUpdate(apiData);
+          createMessage.success(t('common.optSuccess'));
+        }
+        resetFields();
+        closeModal();
+        emit('success');
+      };
+      function handleVisibleChange(v) {
+        v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      function handleClose() {
+        resetFields();
+      }
+      function brandIdChange(brandId) {
+        let disabled = isPropsData.isUpdate ? isPropsData.isUpdate : brandId ? false : true;
+        if (!brandId) {
+          return;
+        }
+        console.log('userinfo.value.id,', userinfo.value.id, getCheckRole(['staff']));
+        if (getCheckRole(['staff'])) {
+          disabled = true;
+          setFieldsValue({
+            anchorUserId: userinfo.value.id,
+          });
+        } else if (!disabled) {
+          setFieldsValue({
+            anchorUserId: '',
+          });
+        }
+        updateSchema({
+          field: 'anchorUserId',
+          componentProps: {
+            immediate: true,
+            disabled,
+            params: {
+              page: 1,
+              limit: 1000,
+              id: brandId,
+            },
+            onChange: UserIdChange,
+          },
+        });
+      }
+      function UserIdChange(data) {
+        console.log('UserIdChange,', data, userinfo.value.id, isPropsData.isUpdate);
+        if (!isPropsData.isUpdate) {
+          setFieldsValue({
+            assistantUserId: '',
+          });
+        }
+        updateSchema({
+          field: 'assistantUserId',
+          componentProps: {
+            api: async function (params) {
+              const res = await staffListApi({ ...params, id: data });
+              return res.list.filter((ele) => {
+                return ele.id !== data;
+              });
+            },
+            showSearch: true,
+            resultField: 'list',
+            labelField: 'nickName',
+            valueField: 'id',
+            immediate: true,
+            params: {
+              page: 1,
+              limit: 1000,
+            },
+            onChange: async (data) => {
+              console.log('data', data, arguments);
+            },
+          },
+        });
+      }
+      return {
+        t,
+        modalTitle,
+        register,
+        userIdList,
+        schemas,
+        isPropsData,
+        registerForm,
+        brandIdChange,
+        UserIdChange,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        closeModal,
+        handleClose,
+        getFieldsValue,
+        setFieldsValue,
+        // nextTick,
+      };
+    },
+  });
+</script>
+<style lang="less">
+  .ant-form-item-control-input {
+    div {
+      div {
+        width: 100%;
+      }
+    }
+  }
+</style>

+ 4 - 1
src/views/staff/detailsModal.vue

@@ -73,8 +73,11 @@
                   return Promise.reject(t('common.phoneError'));
                 }
                 try {
+                  if (title.value == '编辑') {
+                    return Promise.resolve();
+                  }
                   let res = await checkUserApi({ phone: value });
-                  console.log('res', res);
+                  console.log('res', res, 'title', title.value);
                   if (res == true) {
                     return Promise.resolve();
                   } else {