tangning hace 9 meses
padre
commit
c870e93f2b

+ 1 - 1
.env.development

@@ -6,7 +6,7 @@ VITE_PUBLIC_PATH = ./
 
 # Cross-domain proxy, you can configure multiple
 # Please note that no line breaks
-VITE_PROXY = [["/service","http://v4-test.4dkankan.com"]]
+VITE_PROXY = [["/service","http://192.168.0.25"]]
 # VITE_PROXY=[["/api","https://vvbin.cn/test"]]
 
 # Delete console

+ 12 - 0
src/api/account/index.ts

@@ -14,6 +14,7 @@ enum Api {
   allList = '/service/manage/incrementType/allList',
   userShareList = '/service/manage/jy/userShare/list',
   userShareDel = '/service/manage/jy/userShare/delete',
+  platformallList = '/service/manage/jyPlatform/allList',
 }
 
 /**
@@ -142,3 +143,14 @@ export const UnbindCameraApi = (params: PageParams) =>
       ignoreCancelToken: true,
     },
   });
+
+//相机解绑
+export const platformallList = (params: PageParams) =>
+  defHttp.get<userList>({
+    url: Api.platformallList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 21 - 14
src/api/customer/index.ts

@@ -67,24 +67,31 @@ export const downTemplate = (params: companyExcelParams) =>
     method: 'GET',
     url: Api.downTemplate,
     params: params,
-    // data: params, 
-    fileName:params.type == 0?'入库模板.xlsx':params.type == 1?'出库模板.xlsx':'客户关联模板.xlsx',
+    // data: params,
+    fileName:
+      params.type == 0
+        ? '入库模板.xlsx'
+        : params.type == 1
+        ? '出库模板.xlsx'
+        : params.type == 6
+        ? '用户模板.xlsx'
+        : '客户关联模板.xlsx',
     headers: {
       // @ts-ignore
       ignoreCancelToken: true,
     },
-    responseType: 'blob'
+    responseType: 'blob',
   });
 
 export function companyUploadExcel(
-    params: UploadFileParams,
-    onUploadProgress: (progressEvent: ProgressEvent) => void,
-  ) {
-    return defHttp.uploadFile<Result>(
-      {
-        url: Api.companyUploadExcel,
-        onUploadProgress,
-      },
-      params,
-    );
-   }
+  params: UploadFileParams,
+  onUploadProgress: (progressEvent: ProgressEvent) => void,
+) {
+  return defHttp.uploadFile<Result>(
+    {
+      url: Api.companyUploadExcel,
+      onUploadProgress,
+    },
+    params,
+  );
+}

+ 175 - 0
src/api/jyUserPlatform/index.ts

@@ -0,0 +1,175 @@
+import { defHttp } from '/@/utils/http/axios';
+import { PageParams, userList } from './model';
+import { Result } from '/#/axios';
+
+enum Api {
+  allList = '/service/manage/jyPlatform/allList',
+  list = '/service/manage/jyPlatform/list',
+  addOrUpdate = '/service/manage/jyPlatform/addOrUpdate',
+  enable = '/service/manage/jyPlatform/enable',
+  disable = '/service/manage/jyPlatform/disable',
+  del = '/service/manage/jyPlatform/del',
+  queryByKey = '/service/manage/jyUserPlatform/queryByKey',
+  jyUserPlatformadd = '/service/manage/jyUserPlatform/add',
+  yhlist = '/service/manage/jyUserPlatform/list',
+  yhadd = '/service/manage/jyUserPlatform/add',
+  yhupdate = '/service/manage/jyUserPlatform/update',
+  yhdel = '/service/manage/jyUserPlatform/del',
+}
+
+/**
+ * @description: Get sample list value
+ */
+
+export const allList = (params: PageParams) =>
+  defHttp.get<userList>({
+    url: Api.allList,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const jyPlatformlist = (params: PageParams) =>
+  defHttp.post({
+    url: Api.list,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const delplatformList = (params) =>
+  defHttp.post<Result>({
+    url: Api.del,
+    params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+export const addOrUpdate = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.addOrUpdate,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+export const queryByKey = (params) =>
+  defHttp.post<userList>({
+    url: Api.queryByKey,
+    params: params,
+    data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//权益详情
+export const jyUserPlatformadd = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.jyUserPlatformadd,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//权益详情
+export const DetailsApi = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.getIncrementListByUserId,
+    params: params,
+    // data: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//权益延期
+export const IncrementDelayApi = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.IncrementDelay,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//权益延期
+export const yhList = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.yhlist,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//添加用户权益
+export const AddUserIncrementApi = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.addUserIncrement,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//加用户下载次数
+export const AddDownNumApi = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.addDownNum,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//获取相机详情
+export const GetCameraDetailApi = (params: PageParams) =>
+  defHttp.post<userList>({
+    url: Api.getCameraDetail,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//相机解绑
+export const UnbindCameraApi = (params: PageParams) =>
+  defHttp.get<userList>({
+    url: Api.unbindCamera,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });
+
+//相机解绑
+export const platformallList = (params: PageParams) =>
+  defHttp.get<userList>({
+    url: Api.platformallList,
+    params: params,
+    headers: {
+      // @ts-ignore
+      ignoreCancelToken: true,
+    },
+  });

+ 3 - 0
src/design/index.less

@@ -42,3 +42,6 @@ svg,
 span {
   outline: none !important;
 }
+.ant-table-cell-content {
+  display: inline-block !important;
+}

+ 71 - 104
src/views/lanUser/adddetailsModal.vue

@@ -17,6 +17,9 @@
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useUserStore } from '/@/store/modules/user';
+  import { debounce } from 'lodash-es';
+  import { jyPlatformlist, delplatformList } from '/@/api/jyUserPlatform/index'; //roleLIstApi
+  import { platformallList, jyUserPlatformadd, queryByKey } from '/@/api/jyUserPlatform/index';
   const { t } = useI18n();
   export default defineComponent({
     components: { BasicModal, BasicForm },
@@ -26,117 +29,84 @@
     emits: ['ok'],
     setup(_, context) {
       const modelRef = ref({});
+      const options = ref([]);
       const userStore = useUserStore();
       const userinfo = computed(() => userStore.getUserInfo);
       const preventAutoFill = ref(true);
       const { companyId } = userinfo.value;
+      let lastFetchId = 0;
+      const fetchUser = debounce((value) => {
+        console.log('fetching user', value);
+        if(!value){
+          return;
+        }
+        lastFetchId += 1;
+        const fetchId = lastFetchId;
+        options.value = [];
+        queryByKey({queryKey: value}).then((res) => {
+          console.log('queryByKey', res);
+          const data = res.map((user) => ({
+            label: `${user.queryKey}`,
+            value: user.id,
+          }));
+          options.value = data;
+        });
+      }, 300);
       const schemas: FormSchema[] = [
+        // {
+        //   field: 'nickName',
+        //   component: 'Input',
+        //   label: '姓名',
+        //   colProps: {
+        //     span: 20,
+        //   },
+        //   componentProps: {
+        //     maxLength: 15,
+        //   },
+        //   rules: [
+        //     {
+        //       required: true,
+        //       // @ts-ignore
+        //       validator: async (rule, value) => {
+        //         var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
+        //         // var reg = /\S+@\S+\.\S+/;
+        //         if (!value) {
+        //           return Promise.reject('请输入姓名');
+        //         }
+        //         if (!reg_tel.test(value)) {
+        //           /* eslint-disable-next-line */
+        //           return Promise.reject('请输入正确的姓名');
+        //         }
+        //         return Promise.resolve();
+        //       },
+        //       trigger: 'change',
+        //     },
+        //   ],
+        // },
         {
-          field: 'nickName',
-          component: 'Input',
-          label: '姓名',
-          colProps: {
-            span: 20,
-          },
-          componentProps: {
-            maxLength: 15,
-          },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
-                // var reg = /\S+@\S+\.\S+/;
-                if (!value) {
-                  return Promise.reject('请输入姓名');
-                }
-                if (!reg_tel.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('请输入正确的姓名');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-        },
-        {
-          field: 'userName',
-          component: 'Input',
+          field: 'id',
+          component: 'ApiSelect',
           label: '账号',
           required: true,
           colProps: {
             span: 20,
           },
-          componentProps:{
-            placeholder:"请输入手机号",
-            maxLength: 15,
-            readonly:preventAutoFill.value
-          },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                console.log('value',value)
-                const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
-                if (!value) {
-                  return Promise.reject('请输入正确的手机号');
-                }
-                if (!regPos.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('请输入正确的手机号');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-        },
-        {
-          field: 'password',
-          component: 'StrengthMeter',
-          label: '密码',
-          required: true,
-          colProps: {
-            span: 20,
+          componentProps: {
+            // api: queryByKey,
+            placeholder: '请选择平台',
+            'label-in-value': true,
+            options: options.value,
+            showSearch: true,
+            onSearch: fetchUser,
+            numberToString: true,
+            labelField: 'name',
+            valueField: 'id',
+            immediate: true,
+            onChange:handleChange
           },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                console.log('value',value)
-                const regPos = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/; // 非中文
-                if (!value) {
-                  return Promise.reject('请输入8-16位数字、字母大小写组合');
-                }
-                if (!regPos.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('请输入8-16位数字、字母大小写组合');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
-          componentProps:{
-            placeholder:"请输入8-16位数字、字母大小写组合",
-            maxLength: 16,
-            readonly:preventAutoFill.value,
-            minLength: 8,
-            autoComplete:'off',
-          }
-        },
-        {
-          field: 'id',
-          component: 'Input',
-          label: 'id',
-          show: false,
         },
       ];
-      const title = ref('新增账号');
+      const title = ref('添加用户');
       const { createMessage } = useMessage();
       const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
         labelWidth: 120,
@@ -188,20 +158,17 @@
       async function handleOk() {
         let data = await validate();
         const requestApi =  saveAddApi; //data.id ? updateApi :
-        let res = await requestApi({
+        let res = await jyUserPlatformadd({
           ...data,
-          // userName: data.phone,
-          phone: data.phone,
-          nickName: data.nickName,
-          roleId: data.roleId,
-          id: data.id,
         });
         context && context.emit('ok', res);
         createMessage.success(t('common.optSuccess'));
         closeModal();
         resetFields();
       }
-
+      function handleChange(value,b,a) {
+        console.log('value', value,b, a);
+      }
       return {
         register,
         title,

+ 217 - 0
src/views/lanUser/addplatformModal.vue

@@ -0,0 +1,217 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @cancel="resetFields"
+    @register="register"
+    :title="title"
+    @ok="handleOk"
+  >
+    <BasicForm @register="registerForm" />
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, computed } from 'vue';
+  import { checkUserApi, saveAddApi, updateApi, getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useUserStore } from '/@/store/modules/user';
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['ok'],
+    setup(_, context) {
+      const modelRef = ref({});
+      const userStore = useUserStore();
+      const userinfo = computed(() => userStore.getUserInfo);
+      const preventAutoFill = ref(true);
+      const { companyId } = userinfo.value;
+      const schemas: FormSchema[] = [
+        {
+          field: 'nickName',
+          component: 'Input',
+          label: '姓名',
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            maxLength: 15,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
+                // var reg = /\S+@\S+\.\S+/;
+                if (!value) {
+                  return Promise.reject('请输入姓名');
+                }
+                if (!reg_tel.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入正确的姓名');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'userName',
+          component: 'Input',
+          label: '账号',
+          required: true,
+          colProps: {
+            span: 20,
+          },
+          componentProps:{
+            placeholder:"请输入手机号",
+            maxLength: 15,
+            readonly:preventAutoFill.value
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                console.log('value',value)
+                const regPos = /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[89])\d{8}$/; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入正确的手机号');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入正确的手机号');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+        },
+        {
+          field: 'password',
+          component: 'StrengthMeter',
+          label: '密码',
+          required: true,
+          colProps: {
+            span: 20,
+          },
+          rules: [
+            {
+              required: true,
+              // @ts-ignore
+              validator: async (rule, value) => {
+                console.log('value',value)
+                const regPos = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/; // 非中文
+                if (!value) {
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                if (!regPos.test(value)) {
+                  /* eslint-disable-next-line */
+                  return Promise.reject('请输入8-16位数字、字母大小写组合');
+                }
+                return Promise.resolve();
+              },
+              trigger: 'change',
+            },
+          ],
+          componentProps:{
+            placeholder:"请输入8-16位数字、字母大小写组合",
+            maxLength: 16,
+            readonly:preventAutoFill.value,
+            minLength: 8,
+            autoComplete:'off',
+          }
+        },
+        {
+          field: 'id',
+          component: 'Input',
+          label: 'id',
+          show: false,
+        },
+      ];
+      const title = ref('新增账号');
+      const { createMessage } = useMessage();
+      const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+
+      const [register, { closeModal }] = useModalInner((data) => {
+        data && onDataReceive(data);
+      });
+      function onDataReceive(data) {
+        console.log('onDataReceive',data)
+        // 方式1;
+        setTimeout(()=>{
+          preventAutoFill.value = false
+          updateSchema([{
+            field: 'userName',
+            componentProps:{
+              readonly:false,
+            }
+          },{
+            field: 'password',
+            componentProps:{
+              readonly:false,
+            }
+          }])
+          // updateSchema(schemas);
+        },500)
+      }
+      function companyIdChange(companyId) {
+        // resetFields(['permList'])
+        updateSchema([
+          {
+            field: 'permList',
+            componentProps: {
+              params: {
+                companyId: companyId,
+              },
+            },
+          },
+        ]);
+        setFieldsValue({
+          permList: [],
+        });
+      }
+      async function handleOk() {
+        let data = await validate();
+        const requestApi =  saveAddApi; //data.id ? updateApi :
+        let res = await requestApi({
+          ...data,
+          // userName: data.phone,
+          phone: data.phone,
+          nickName: data.nickName,
+          roleId: data.roleId,
+          id: data.id,
+        });
+        context && context.emit('ok', res);
+        createMessage.success(t('common.optSuccess'));
+        closeModal();
+        resetFields();
+      }
+
+      return {
+        register,
+        title,
+        preventAutoFill,
+        schemas,
+        registerForm,
+        modelRef,
+        handleOk,
+        resetFields,
+      };
+    },
+  });
+</script>

+ 141 - 0
src/views/lanUser/batchPutModal.vue

@@ -0,0 +1,141 @@
+<template>
+  <BasicModal
+    v-bind="$attrs"
+    @register="register"
+    title="批量导入"
+    @visible-change="handleVisibleChange"
+    @cancel="resetFields"
+    @ok="handleSubmit"
+    :min-height="0"
+  >
+    <div class="pt-2px pr-3px">
+      <BasicForm @register="registerForm" :model="model">
+        <template #text="{ model, field }">
+          {{ model[field] }}
+        </template>
+      </BasicForm>
+      <a @click="getTemplate" style="padding: 20px 0 0 80px">下载批量导入模板</a>
+    </div>
+  </BasicModal>
+</template>
+<script lang="ts">
+  import { defineComponent, ref, nextTick, onMounted, reactive } from 'vue';
+  import { BasicModal, useModalInner } from '/@/components/Modal';
+  import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  // import { sceneMove } from '/@/api/operate';
+  import { companyUploadExcel, downTemplate } from '/@/api/customer';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  import { downloadByData } from '/@/utils/file/download'
+  const { t } = useI18n();
+  export default defineComponent({
+    components: { BasicModal, BasicForm },
+    props: {
+      userData: { type: Object },
+    },
+    emits: ['update', 'register'],
+    setup(props, { emit }) {
+      const modelRef = ref({});
+      const fileFlow = reactive({
+        file: null,
+      });
+      const { createMessage } = useMessage();
+      const schemas: FormSchema[] = [
+        {
+          field: 'file',
+          component: 'Upload',
+          label: t('routes.product.file'),
+          required: true,
+          rules: [{ required: true, message: t('common.uploadMessge') }],
+          // helpMessage: t('routes.corporation.uploadHelp'),
+          itemProps: {
+            validateTrigger: 'onBlur',
+          },
+          componentProps: {
+            maxNumber: 1,
+            maxSize: 5,
+            fileFlow: true,
+            accept: ['xls', 'xlsx'],
+            afterFetch: function (data) {
+              // console.log('uploadApi', data);
+              // Reflect.set(data, 'url', data.file);
+              fileFlow.file = data.file;
+              console.log(fileFlow.file);
+              return data;
+            },
+          },
+
+          colProps: {
+            span: 22,
+          },
+        },
+      ];
+      const [registerForm, { validate, resetFields, setFieldsValue }] = useForm({
+        labelWidth: 120,
+        schemas,
+        showActionButtonGroup: false,
+        actionColOptions: {
+          span: 24,
+        },
+      });
+      onMounted(() => {});
+      let addListFunc = () => {};
+      const [register, { closeModal }] = useModalInner((data) => {
+        // console.log(data);
+        data && onDataReceive(data);
+      });
+
+      function onDataReceive(data) {
+        modelRef.value = data;
+        resetFields();
+        setFieldsValue({
+          type: data.sceneName,
+        });
+      }
+      const handleSubmit = async () => {
+        try {
+          const params = await validate();
+          const apiData = {
+            file: fileFlow.file,
+            data:{
+              type: 6,
+            }
+          };
+          const res = await companyUploadExcel(apiData);
+          closeModal();
+          resetFields();
+          emit('reload');
+          createMessage.success( res || '导入成功');
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      };
+      function handleVisibleChange(v) {
+        // console.log(v);
+        // v && props.userData && nextTick(() => onDataReceive(props.userData));
+      }
+      async function getTemplate() {
+        try {
+          const res:BlobPart = await downTemplate({ type: 6 });
+          console.log('downTemplate',res)
+          downloadByData(res.data,'入库模板.xlsx')
+        } catch (error) {
+          console.log('not passing', error);
+        }
+      }
+      return {
+        register,
+        schemas,
+        registerForm,
+        model: modelRef,
+        fileFlow,
+        handleVisibleChange,
+        handleSubmit,
+        addListFunc,
+        resetFields,
+        t,
+        getTemplate,
+      };
+    },
+  });
+</script>

+ 83 - 33
src/views/lanUser/detailsModal.vue

@@ -11,13 +11,14 @@
   </BasicModal>
 </template>
 <script lang="ts">
-  import { defineComponent, ref, computed } from 'vue';
+  import { defineComponent, ref, computed, h } from 'vue';
   import { updateUcenterUser } from '/@/api/staff/list'; //roleLIstApi
   import { BasicModal, useModalInner } from '/@/components/Modal';
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { useI18n } from '/@/hooks/web/useI18n';
   import { useMessage } from '/@/hooks/web/useMessage';
   import { useUserStore } from '/@/store/modules/user';
+  import { addOrUpdate } from '/@/api/jyUserPlatform/index';
   const { t } = useI18n();
   export default defineComponent({
     components: { BasicModal, BasicForm },
@@ -34,35 +35,70 @@
       console.log('companyId', companyId);
       const schemas: FormSchema[] = [
         {
-          field: 'nickName',
+          field: 'label1',
+          component: 'Divider',
+          label: '平台首页',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'platformName',
+          component: 'Input',
+          label: '平台名称',
+          required: true,
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            maxLength: 50,
+            required: true,
+          },
+        },
+        {
+          field: 'label2',
+          component: 'Divider',
+          label: '平台管理员',
+          colProps: {
+            span: 24,
+          },
+        },
+        {
+          field: 'name',
           component: 'Input',
           label: '姓名',
           colProps: {
             span: 20,
           },
+          required: true,
           componentProps: {
-            maxLength: 15,
+            maxLength: 18,
+          },
+        },
+        {
+          field: 'idCard',
+          component: 'Input',
+          required: true,
+          label: '身份证',
+          colProps: {
+            span: 20,
+          },
+          componentProps: {
+            maxLength: 18,
           },
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                var reg_tel = /^[a-zA-Z\u4e00-\u9fa5]+$/;
-                // var reg = /\S+@\S+\.\S+/;
-                if (!value) {
-                  return Promise.reject('请输入姓名');
-                }
-                if (!reg_tel.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('请输入正确的姓名');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
-            },
-          ],
         },
+        // {
+        //   field: 'phone',
+        //   component: 'Input',
+        //   required: true,
+        //   label: '手机号码',
+        //   colProps: {
+        //     span: 20,
+        //   },
+        //   componentProps: {
+        //     maxLength: 15,
+        //   },
+        // },
         {
           field: 'id',
           component: 'Input',
@@ -70,8 +106,8 @@
           show: false,
         },
       ];
-      const title = ref('编辑账号');
-      const { createMessage } = useMessage();
+      const title = ref('创建平台');
+      const { createMessage, createConfirm } = useMessage();
       const [registerForm, { setFieldsValue, validate, updateSchema, resetFields }] = useForm({
         labelWidth: 120,
         schemas,
@@ -86,17 +122,17 @@
       });
       function onDataReceive(data) {
         // 方式1;
-        console.log('useModalInner', data);
+        title.value = data.id ? '修改平台' : '启用平台';
         // preventAutoFill.value = false
-        setTimeout(()=>{
-            console.log('useModalInner', data);
-            setFieldsValue({
+        setTimeout(() => {
+          console.log('useModalInner', data);
+          setFieldsValue({
             ...data,
-            userName:'',
-            password:'',
+            userName: '',
+            password: '',
             roleId: data.roleId != 2 ? data.roleId : '',
           });
-        },200)
+        }, 200);
       }
       function companyIdChange(companyId) {
         // resetFields(['permList'])
@@ -116,7 +152,7 @@
       }
       async function handleOk() {
         let data = await validate();
-        let res = await updateUcenterUser({
+        let res = await addOrUpdate({
           ...data,
           // userName: data.phone,
           phone: data.phone,
@@ -124,7 +160,21 @@
           roleId: data.roleId,
           id: data.id,
         });
+        console.log('res', res);
         context && context.emit('ok', res);
+        createConfirm({
+          iconType: 'warning',
+          title: () => h('span', data.id ? '修改成功' : '平台创建成功'),
+          content: () =>
+            h('div', {}, [
+              h('div', null, `平台名称:${res.platformName}`),
+              h('div', null, `平台地址:${res.platformAddress}`),
+              h('div', null, `平台管理员:${res.name}`),
+            ]),
+          onOk: async () => {
+            // await this.logout(true);
+          },
+        });
         createMessage.success(t('common.optSuccess'));
         closeModal();
         resetFields();
@@ -144,4 +194,4 @@
   });
 </script>
 
-.
+.

+ 68 - 61
src/views/lanUser/list.vue

@@ -5,8 +5,11 @@
         <a-button
           type="primary"
           @click="handleCreate"
-           v-if="getCheckPerm('lanuser-add')"
-          >新增账号</a-button
+          >添加用户</a-button
+        ><a-button
+          type="primary"
+          @click="openModalPut(true, {})"
+          >批量导入</a-button
         >
       </template>
       <template #role="{ record }">
@@ -23,19 +26,19 @@
         <TableAction
           :actions="[
             {
-              color: 'warning',
-              label: '重置密码',
-              ifShow:getCheckPerm('lanuser-pasword'),
-              onClick: handleOpenModal.bind(null, record),
-            },{
+            //  color: 'warning',
+            //  label: '重置密码',
+            //  ifShow:getCheckPerm('lanuser-pasword'),
+            //  onClick: handleOpenModal.bind(null, record),
+            //},{
               label: '编辑',
-              ifShow:getCheckPerm('lanuser-update'),
+              //ifShow:getCheckPerm('lanuser-update'),
               onClick: handleEdit.bind(null, record),
             },
             {
               label: '删除',
               color: 'error',
-              ifShow:getCheckPerm('lanuser-delete'),
+              //ifShow:getCheckPerm('lanuser-delete'),
               onClick:handDelconfirm.bind(null, record),
             },
           ]"
@@ -45,6 +48,7 @@
     <DetailsModal @register="registerDetail" @ok="reload" />
     <SetpaswordModal @register="register" @reload="reload" />
     <addDetailsModal @register="registerAddDetail" @ok="reload" />
+    <batchPutModal @register="registerPut" @reload="reload" />
   </div>
 </template>
 <script lang="ts">
@@ -55,6 +59,7 @@
   import { uploadApi } from '/@/api/sys/upload';
   import SetpaswordModal from './setpaswordModal.vue';
   import DetailsModal from './detailsModal.vue';
+  import batchPutModal from './batchPutModal.vue';
   import addDetailsModal from './adddetailsModal.vue';
   import { Switch } from 'ant-design-vue';
   // import DelListModal from './delListModal.vue';
@@ -69,13 +74,14 @@
   import { Time } from '/@/components/Time';
   import { useUserStore } from '/@/store/modules/user';
   import { usePermissionStore } from '/@/store/modules/permission';
-  import { getRoleListByParam } from '/@/api/staff/list'; //roleLIstApi
+  import { yhList } from '/@/api/jyUserPlatform/index'; //roleLIstApi
   export default defineComponent({
     components: {
       BasicTable,
       TableAction,
       Time,
       SetpaswordModal,
+      batchPutModal,
       DetailsModal,
       addDetailsModal,
       Alert,
@@ -89,6 +95,7 @@
       const [registerDetail, { openModal: openDetaileModal }] = useModal();
       const [registerAddDetail, { openModal: openAddDetaileModal }] = useModal();
       const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const [registerPut, { openModal:openModalPut }] = useModal();
       const { createConfirm, createMessage } = useMessage();
       const userStore = useUserStore();
       const permissionStore = usePermissionStore();
@@ -103,12 +110,6 @@
 
       const columns: BasicColumn[] = [
         {
-          title: '人员ID',
-          dataIndex: 'ryId',
-          fixed: 'left',
-          width: 60,
-        },
-        {
           title: t('routes.staff.userName'),
           dataIndex: 'nickName',
           width: 120,
@@ -118,23 +119,27 @@
           dataIndex: 'userName',
           width: 150,
         },
-        // {
-        //   title: '手机',
-        //   dataIndex: 'phone',
-        //   width: 160,
-        // },
-        // {
-        //   title: t('common.roleName'),
-        //   dataIndex: 'roleName',
-        //   width: 100,
-        // },
-
-        // {
-        //   title: '创建人',
-        //   dataIndex: 'sysUserName',
-        //   width: 80,
-        // },
-
+        {
+          title: '人员ID',
+          dataIndex: 'ryId',
+          fixed: 'left',
+          width: 60,
+        },
+        {
+          title: '手机',
+          dataIndex: 'phone',
+          width: 160,
+        },
+        {
+          title: '身份证',
+          dataIndex: 'carId',
+          width: 100,
+        },
+        {
+          title: '部门',
+          dataIndex: 'sysUserName',
+          width: 80,
+        },
         {
           title: '注册时间',
           dataIndex: 'createTime',
@@ -147,34 +152,34 @@
           // ifShow:getCheckPerm('sysuser-enable'),
           width: 80,
           customRender: ({ record }) => {
-            return record.status == 1 ? '正常' : '冻结';
-            // if (!Reflect.has(record, 'status')) {
-            //   record.pendingStatus = false;
-            // }
-            // return h(Switch, {
-            //   checked: record.status == 1 ? true : false,
-            //   checkedChildren: '启用',
-            //   unCheckedChildren: '禁用',
-            //   loading: false,
-            //   onChange: async (checked: boolean) => {
-            //     record.pendingStatus = true;
-            //     const newStatus = checked?1:0;
-            //     await updateApi({...record,status:newStatus});
-            //     Reflect.set(record, 'status', checked);
-            //     createMessage.success(t('common.optSuccess'));
-            //     reload()
-            //   },
-            // });
+            // return record.status == 1 ? '启用' : '禁用';
+            if (!Reflect.has(record, 'status')) {
+              record.pendingStatus = false;
+            }
+            return h(Switch, {
+              checked: record.status == 1 ? true : false,
+              checkedChildren: '启用',
+              unCheckedChildren: '禁用',
+              loading: false,
+              onChange: async (checked: boolean) => {
+                record.pendingStatus = true;
+                const newStatus = checked?1:0;
+                await updateApi({...record,status:newStatus});
+                Reflect.set(record, 'status', checked);
+                createMessage.success(t('common.optSuccess'));
+                reload()
+              },
+            });
           },
         },
-        // {
-        //   title: '操作',
-        //   dataIndex: '',
-        //   // ifShow: !getCheckRole('tourist'),
-        //   slots: { customRender: 'action' },
-        //   fixed: 'right',
-        //   width: 100,
-        // },
+        {
+          title: '操作',
+          dataIndex: '',
+          // ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          fixed: 'right',
+          width: 100,
+        },
       ];
 
       const searchForm: Partial<FormProps> = {
@@ -208,8 +213,8 @@
       };
 
       const [registerTable, { reload }] = useTable({
-        // title: t('routes.staff.staffList'),
-        api: ListApi,
+        title: '用户列表',
+        api: yhList,
         columns: columns,
         useSearchForm: true,
         formConfig: searchForm,
@@ -320,6 +325,8 @@
         surplusSubNum,
         getCheckPerm,
         getNumByStaffData,
+        openModalPut,
+        registerPut,
       };
     },
   });

+ 335 - 0
src/views/lanUser/platformList.vue

@@ -0,0 +1,335 @@
+<template>
+  <div class="p-4">
+    <BasicTable @register="registerTable">
+      <template #toolbar>
+        <a-button type="primary" @click="handleCreate">创建平台</a-button>
+      </template>
+      <template #role="{ record }">
+        {{ renderRoleType(record.role) }}
+      </template>
+      <template #status="{ record }">
+        {{ renderStatus(record.status) }}
+      </template>
+      <template #createTime="{ record }">
+        <Time :value="record.createTime" mode="datetime" />
+      </template>
+      <!-- , -->
+      <template #action="{ record }">
+        <TableAction
+          :actions="[
+            {
+              color: 'warning',
+              label: '禁用',
+              onClick: handleOpenModal.bind(null, record),
+            },
+            {
+              label: '编辑',
+              //ifShow:getCheckPerm('lanuser-update'),
+              onClick: handleEdit.bind(null, record), //handleEdit.bind(null, record),
+            },
+            //{
+            //  label: '删除',
+            //  color: 'error',
+            //  //ifShow:getCheckPerm('lanuser-delete'),
+            //  onClick: handDelconfirm.bind(null, record),
+            //},
+          ]"
+        />
+      </template>
+    </BasicTable>
+    <DetailsModal @register="registerDetail" @ok="reload" />
+    <SetpaswordModal @register="register" @reload="reload" />
+    <addDetailsModal @register="registerAddDetail" @ok="reload" />
+  </div>
+</template>
+<script lang="ts">
+  import { defineComponent, computed, onMounted, ref, h } from 'vue';
+  import { BasicTable, useTable, BasicColumn, FormProps, TableAction } from '/@/components/Table';
+  import { useMessage } from '/@/hooks/web/useMessage';
+  import { useModal } from '/@/components/Modal';
+  import { uploadApi } from '/@/api/sys/upload';
+  import SetpaswordModal from './setpaswordModal.vue';
+  import DetailsModal from './detailsModal.vue';
+  import addDetailsModal from './adddetailsModal.vue';
+  import { Switch } from 'ant-design-vue';
+  // import DelListModal from './delListModal.vue';
+  import { Alert } from 'ant-design-vue';
+  // import { h } from 'vue';
+  import { delUcenterUser, preDelApi, updateApi, getNumByStaff } from '/@/api/staff/list';
+  import { ListApi } from '/@/api/account';
+  import { useI18n } from '/@/hooks/web/useI18n';
+  // import { useCopyToClipboard } from '/@/hooks/web/useCopyToClipboard';
+  import { RoleEnum } from '/@/enums/roleEnum';
+  import { useGo } from '/@/hooks/web/usePage';
+  import { Time } from '/@/components/Time';
+  import { useUserStore } from '/@/store/modules/user';
+  import { usePermissionStore } from '/@/store/modules/permission';
+  import { jyPlatformlist, delplatformList } from '/@/api/jyUserPlatform/index'; //roleLIstApi
+  export default defineComponent({
+    components: {
+      BasicTable,
+      TableAction,
+      Time,
+      SetpaswordModal,
+      DetailsModal,
+      addDetailsModal,
+      Alert,
+    },
+    setup() {
+      const [register, { openModal }] = useModal();
+      const surplusSubNum = ref({
+        lookNum: 0,
+        shotNum: 0,
+      });
+      const [registerDetail, { openModal: openDetaileModal }] = useModal();
+      const [registerAddDetail, { openModal: openAddDetaileModal }] = useModal();
+      const [registerDelList, { openModal: openDelListeModal }] = useModal();
+      const { createConfirm, createMessage } = useMessage();
+      const userStore = useUserStore();
+      const permissionStore = usePermissionStore();
+      const { getCheckPerm } = permissionStore;
+      const roleList = computed(() => userStore.getRoleList);
+      console.log('getRoleList', roleList);
+      const go = useGo();
+      const { t } = useI18n();
+      onMounted(() => {
+        // getNumByStaffData();
+      });
+      const deseHandler = (str, frontLen, endLen, wildcard) => {
+        if (!str) {
+          return '--';
+        } else if (str.length < 9) {
+          return str;
+        } else {
+          var len = str.length - frontLen - endLen;
+          var xing = '';
+          for (var i = 0; i < len; i++) {
+            xing += wildcard;
+          }
+          return str.substring(0, frontLen) + xing + str.substring(str.length - endLen);
+        }
+      };
+      const columns: BasicColumn[] = [
+        {
+          title: '平台名称',
+          dataIndex: 'platformName',
+          width: 120,
+        },
+        {
+          title: '平台地址',
+          dataIndex: 'platformAddress',
+          width: 150,
+        },
+        {
+          title: '平台管理员姓名',
+          dataIndex: 'name',
+          fixed: 'left',
+          width: 60,
+        },
+        {
+          title: '平台管理员手机号码',
+          dataIndex: 'phone',
+          width: 80,
+        },
+        {
+          title: '添加时间',
+          dataIndex: 'createTime',
+          width: 100,
+        },
+        // {
+        //   title: '状态',
+        //   dataIndex: 'status',
+        //   // ifShow:getCheckPerm('sysuser-enable'),
+        //   width: 80,
+        //   customRender: ({ record }) => {
+        //     // return record.status == 1 ? '启用' : '禁用';
+        //     if (!Reflect.has(record, 'status')) {
+        //       record.pendingStatus = false;
+        //     }
+        //     return h(Switch, {
+        //       checked: record.status == 1 ? true : false,
+        //       checkedChildren: '启用',
+        //       unCheckedChildren: '禁用',
+        //       loading: false,
+        //       onChange: async (checked: boolean) => {
+        //         record.pendingStatus = true;
+        //         const newStatus = checked?1:0;
+        //         await updateApi({...record,status:newStatus});
+        //         Reflect.set(record, 'status', checked);
+        //         createMessage.success(t('common.optSuccess'));
+        //         reload()
+        //       },
+        //     });
+        //   },
+        // },
+        {
+          title: '操作',
+          dataIndex: '',
+          // ifShow: !getCheckRole('tourist'),
+          slots: { customRender: 'action' },
+          // fixed: 'right',
+          width: 80,
+        },
+      ];
+
+      const searchForm: Partial<FormProps> = {
+        labelWidth: 90,
+        schemas: [
+          {
+            field: 'platformName',
+            label: '平台名称',
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+          {
+            field: 'name',
+            labelWidth: 120,
+            label: '平台管理员姓名',
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+          {
+            field: 'phone',
+            label: '平台管理员手机号码',
+            labelWidth: 140,
+            component: 'Input',
+            componentProps: {
+              maxLength: 15,
+            },
+            colProps: {
+              xl: 6,
+              xxl: 6,
+            },
+          },
+        ],
+      };
+
+      const [registerTable, { reload }] = useTable({
+        // title: t('routes.staff.staffList'),
+        api: jyPlatformlist,
+        columns: columns,
+        useSearchForm: true,
+        formConfig: searchForm,
+        showTableSetting: true,
+        tableSetting: { fullScreen: true },
+        showIndexColumn: false,
+        canResize: true,
+        rowKey: 'id',
+        fetchSetting: {
+          pageField: 'pageNum',
+          sizeField: 'pageSize',
+          listField: 'list',
+          totalField: 'total',
+        },
+        pagination: { pageSize: 10 },
+        afterFetch: (T) => {
+          return T;
+        },
+        bordered: true,
+        sortFn: (sortInfo) => {
+          let order = sortInfo.order && sortInfo.order.replace('end', '');
+          return { ...sortInfo, sidx: sortInfo.field, order: order };
+        },
+      });
+
+      function renderRoleType(type: number): string {
+        switch (type) {
+          case 0:
+            return t('routes.staff.roleType.0');
+          case 1:
+            return t('routes.staff.roleType.1');
+          default:
+            return '';
+        }
+      }
+      function renderStatus(type: number): string {
+        switch (type) {
+          case 1:
+            return t('common.normal');
+          case 0:
+            return t('common.unNormal');
+          default:
+            return '';
+        }
+      }
+      function handleOpenModal(record: Recordable) {
+        openModal(true, record);
+      }
+      function handleCreate() {
+        openDetaileModal(true, {});
+      }
+      function handleEdit(record: Recordable) {
+        openDetaileModal(true, {
+          ...record,
+          phone: record.userName,
+        });
+      }
+      function getNumByStaffData() {
+        getNumByStaff({}).then((res) => {
+          surplusSubNum.value.lookNum = res.lookNum;
+          surplusSubNum.value.shotNum = res.shotNum;
+        });
+      }
+      async function handleDelete(record) {
+        let check = await preDelApi(record.id); //
+        if (Array.isArray(check)) {
+          return openDelListeModal(true, {
+            ...record,
+            option: check,
+          });
+        }
+        createMessage.success(t('common.optSuccess'));
+        reload();
+        // handDelconfirm(record);
+      }
+      function handDelconfirm(record) {
+        createConfirm({
+          iconType: 'warning',
+          title: '警告',
+          content: `此操作将对${record.userName}进行删除, 是否继续?`,
+          onOk: async () => {
+            await delplatformList({ id: record.id });
+            createMessage.success(t('common.optSuccess'));
+            reload();
+          },
+        });
+      }
+      return {
+        registerTable,
+        registerDetail,
+        registerDelList,
+        registerAddDetail,
+        openDelListeModal,
+        createMessage,
+        handDelconfirm,
+        t,
+        reload,
+        go,
+        renderRoleType,
+        renderStatus,
+        handleCreate,
+        handleOpenModal,
+        register,
+        handleEdit,
+        handleDelete,
+        uploadApi: uploadApi as any,
+        RoleEnum,
+        surplusSubNum,
+        getCheckPerm,
+        getNumByStaffData,
+      };
+    },
+  });
+</script>

+ 62 - 31
src/views/lanUser/setpaswordModal.vue

@@ -3,14 +3,16 @@
     v-bind="$attrs"
     @register="register"
     @ok="handSubmit"
-    title="重置密码"
-    :min-height="100"
+    title="提示"
+    :min-height="200"
     @visible-change="handleVisibleChange"
     @cancel="resetFields"
   >
     <div class="pt-3px pr-3px">
+      <span style="margin-left: 100px; color: #9f9c9c"
+        >禁用后,该平台无法打开。请为已有用户分配平台:</span
+      >
       <BasicForm @register="registerForm" />
-      <span style="margin-left:100px;color:#9f9c9c">请设置新密码,设置后,管理员可使用新密码登录。</span>
     </div>
   </BasicModal>
 </template>
@@ -22,6 +24,8 @@
   import { BasicForm, FormSchema, useForm } from '/@/components/Form/index';
   import { ReUcenterUserPassword } from '/@/api/staff/list';
   import { useMessage } from '/@/hooks/web/useMessage';
+  import { debounce } from 'lodash-es';
+  import { platformallList } from '/@/api/account/index';
 
   const { createMessage } = useMessage();
 
@@ -32,6 +36,27 @@
     },
     setup(props) {
       const { t } = useI18n();
+      const options = ref([]);
+      let lastFetchId = 0;
+      const fetchUser = debounce((value) => {
+        console.log('fetching user', value);
+        lastFetchId += 1;
+        const fetchId = lastFetchId;
+        options.value = [];
+        fetch('https://randomuser.me/api/?results=5')
+          .then((response) => response.json())
+          .then((body) => {
+            if (fetchId !== lastFetchId) {
+              // for fetch callback order
+              return;
+            }
+            const data = body.results.map((user) => ({
+              label: `${user.name.first} ${user.name.last}`,
+              value: user.login.username,
+            }));
+            options.value = data;
+          });
+      }, 300);
       const preventAutoFill = ref(true);
       const schemas: FormSchema[] = [
         {
@@ -41,39 +66,45 @@
           show: false,
         },
         {
-          field: 'password',
-          component: 'StrengthMeter',
-          label: t('routes.staff.password'),
-          labelWidth: 100,
+          field: 'roleId',
+          component: 'ApiSelect',
+          label: '角色',
           required: true,
-          rules: [
-            {
-              required: true,
-              // @ts-ignore
-              validator: async (rule, value) => {
-                console.log('value',value)
-                const regPos = /^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)[a-zA-Z\d]{8,}$/; // 非中文
-                if (!value) {
-                  return Promise.reject('请输入8-16位数字、字母大小写组合');
-                }
-                if (!regPos.test(value)) {
-                  /* eslint-disable-next-line */
-                  return Promise.reject('请输入8-16位数字、字母大小写组合');
-                }
-                return Promise.resolve();
-              },
-              trigger: 'change',
+          itemProps: {
+            validateTrigger: 'blur',
+          },
+          colProps: {
+            span: 20,
+          },
+          defaultValue: '',
+          componentProps: {
+            api: platformallList,
+            labelField: 'roleName',
+            valueField: 'id',
+            params: {
+              type: 1,
             },
-          ],
-          componentProps:{
-            placeholder:"请输入8-16位数字、字母大小写组合",
-            maxLength: 16,
-            minLength: 8,
           },
-          colProps: { span: 18 },
         },
+        // {
+        //   field: 'password',
+        //   component: 'ApiSelect',
+        //   label: '平台',
+        //   labelWidth: 100,
+        //   required: true,
+        //   componentProps: {
+        //     placeholder: '请选择平台',
+        //     api: platformallList,
+        //     options: options.value,
+        //     numberToString: true,
+        //     labelField: 'name',
+        //     valueField: 'value',
+        //     immediate: true,
+        //     search: fetchUser,
+        //   },
+        //   colProps: { span: 18 },
+        // },
       ];
-
       const [
         registerForm,
         {

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 654 - 578
src/views/productOperation/cameraScene.vue