Explorar o código

Merge remote-tracking branch 'origin/dev' into dev

Hwf hai 6 meses
pai
achega
1e62150fd6

+ 11 - 0
src/api/login.ts

@@ -105,3 +105,14 @@ export function getTenantList(): AxiosPromise<TenantInfo> {
     method: 'get'
   });
 }
+
+// 粤政易登录
+export function yzyLogin(code) {
+  return request({
+    url: '/api/auth/yzylogin',
+    method: 'post',
+    data: {
+      code
+    }
+  });
+}

+ 1 - 1
src/permission.ts

@@ -10,7 +10,7 @@ import useSettingsStore from '@/store/modules/settings';
 import usePermissionStore from '@/store/modules/permission';
 
 NProgress.configure({ showSpinner: false });
-const whiteList = ['/login', '/register', '/social-callback'];
+const whiteList = ['/login', '/yzylogin', '/register', '/social-callback', '/noyzyuser'];
 
 router.beforeEach(async (to, from, next) => {
   NProgress.start();

+ 10 - 0
src/router/index.ts

@@ -42,6 +42,16 @@ export const constantRoutes: RouteRecordRaw[] = [
     component: () => import('@/views/login.vue'),
     hidden: true
   },
+  {
+    path: '/yzylogin',
+    component: () => import('@/views/yzylogin.vue'),
+    hidden: true
+  },
+  {
+    path: '/noyzyuser',
+    component: () => import('@/views/noyzyuser.vue'),
+    hidden: true
+  },
   {
     path: '/:pathMatch(.*)*',
     component: () => import('@/views/error/404.vue'),

+ 20 - 1
src/store/modules/user.ts

@@ -1,6 +1,6 @@
 import { to } from 'await-to-js';
 import { getToken, removeToken, setToken } from '@/utils/auth';
-import { login as loginApi, logout as logoutApi, getInfo as getUserInfo } from '@/api/login';
+import { login as loginApi, logout as logoutApi, getInfo as getUserInfo, yzyLogin as yzyLoginApi } from '@/api/login';
 import { LoginData } from '@/api/types';
 import defAva from '@/assets/images/profile.jpg';
 import store from '@/store';
@@ -31,6 +31,24 @@ export const useUserStore = defineStore('user', () => {
     return Promise.reject(err);
   };
 
+  
+  /**
+   * 粤政易登录
+   * @param userInfo
+   * @returns
+   */
+  const yzyLogin = async (code: string): Promise<void> => {
+    const [err, res] = await to(yzyLoginApi(code));
+    if (res) {
+      const data = res.data;
+      setToken(data.access_token);
+      token.value = data.access_token;
+      return Promise.resolve();
+    }
+    return Promise.reject(err);
+  };
+
+
   // 获取用户信息
   const getInfo = async (): Promise<void> => {
     const [err, res] = await to(getUserInfo());
@@ -78,6 +96,7 @@ export const useUserStore = defineStore('user', () => {
     roles,
     permissions,
     login,
+    yzyLogin,
     getInfo,
     logout,
     setAvatar

+ 0 - 1
src/types/components.d.ts

@@ -107,7 +107,6 @@ declare module 'vue' {
     VideoContainer: typeof import('./../components/HKVideo/video-container.vue')['default']
     VideoContainer2: typeof import('./../components/HKVideo/video-container2.vue')['default']
     YMap: typeof import('./../components/Map/YMap.vue')['default']
-    YMapold: typeof import('./../components/Map/YMapold.vue')['default']
     YztMap: typeof import('./../components/Map/YztMap/index.vue')['default']
   }
   export interface ComponentCustomProperties {

+ 87 - 0
src/views/emergencyCommandMap/RightSection/dutyManagement.vue

@@ -0,0 +1,87 @@
+<template>
+  // type分别为sm、md、lg
+  <Dialog custom-show type="sm" title="值班信息" @close="closeDialog">
+    <div class="dialog-content">
+      <p class="form-group">当天值班:{{ currentDate }}</p>
+      <div class="form-group">
+        <p v-for="item in tableData" :key="item" class="text item">值班领导: {{ item.class_leader }}</p>
+      </div>
+      <div class="form-group">
+        <p v-for="item in tableData" :key="item" class="text item">主班: {{ item.main_class }}</p>
+      </div>
+      <div class="form-group">
+        <p v-for="item in tableData" :key="item" class="text item">副班: {{ item.deputy_class }}</p>
+      </div>
+      <div class="form-group">
+        <p v-for="item in tableData" :key="item" class="text item">备班: {{ item.prepare_class }}</p>
+      </div>
+    </div>
+  </Dialog>
+</template>
+<script setup lang="ts">
+import { reactive } from 'vue';
+const tableData = [
+  {
+    class_leader: '梁文龙',
+    main_class: '邓思远',
+    deputy_class: '姚意恒',
+    prepare_class: '张三'
+  }
+];
+const currentDate = new Date()
+  .toLocaleDateString('zh-CN', {
+    year: 'numeric',
+    month: '2-digit',
+    day: '2-digit'
+  })
+  .replace(/\//g, '年')
+  .replace(/(\d{2})$/, '月$1日');
+const emit = defineEmits(['update:show']);
+const closeDialog = () => {
+  emit('update:show', false);
+};
+</script>
+
+<style scoped>
+.dialog-content {
+  padding: 20px;
+  height: 100%;
+  display: flex;
+  flex-direction: column;
+}
+.form-group {
+  margin-bottom: 15px;
+  font-size: 48px;
+}
+.dialog-footer {
+  display: flex;
+  justify-content: flex-end;
+  padding: 10px;
+}
+button {
+  margin-left: 10px;
+  padding: 5px 15px;
+  border: none;
+  background-color: #3498db;
+  color: white;
+  border-radius: 4px;
+  cursor: pointer;
+}
+button:hover {
+  background-color: #2980b9;
+}
+textarea,
+select,
+input[type='text'] {
+  width: 100%;
+  box-sizing: border-box;
+  padding: 5px;
+  margin-top: 5px;
+  border-radius: 4px;
+  border: 1px solid #ccc;
+}
+.error-message {
+  color: red;
+  font-size: 14px;
+}
+</style>

+ 35 - 7
src/views/emergencyCommandMap/RightSection/index.vue

@@ -25,12 +25,18 @@
         </div>
         <div class="task-text gradient-text">任务登记</div>
       </div>
-      <div class="task-item">
+      <div class="task-item" @click="openKnowledgeWarehouse">
         <div class="icon">
           <div class="icon5"></div>
         </div>
         <div class="task-text gradient-text">知识库</div>
       </div>
+      <div class="task-item" @click="openDutyManagement">
+        <div class="icon">
+          <div class="icon3"></div>
+        </div>
+        <div class="task-text gradient-text">值班管理</div>
+      </div>
     </div>
     <RightTop :event-id="eventId" />
     <PublicOpinionSupervision />
@@ -39,6 +45,8 @@
     <StartPlan v-if="startPlanState.show" v-model:show="startPlanState.show" :title="startPlanState.title" :event-id="startPlanState.eventId" />
     <SelectPlan v-model="selectPlanState.show" :title="selectPlanState.title" :temp-event-id="eventId" @update-plan="updatePlan" />
     <RenWuDengJi v-if="renWuDengJiState.show" v-model:show="renWuDengJiState.show" :event-id="eventId" />
+    <dutyManagement v-if="dutyManagementState.show" v-model:show="dutyManagementState.show" :event-id="eventId" />
+    <knowledgeWarehouse v-if="knowledgeWarehouseState.show" v-model:show="knowledgeWarehouseState.show" :event-id="eventId" />
   </div>
 </template>
 
@@ -53,11 +61,31 @@ import SelectPlan from './SelectPlan.vue';
 import InitConsultation from './InitConsultation.vue';
 import PublicOpinionSupervision from '@/views/emergencyCommandMap/RightSection/PublicOpinionSupervision.vue';
 import RenWuDengJi from '@/views/emergencyCommandMap/RightSection/RenWuDengJi.vue';
+import dutyManagement from './dutyManagement.vue';
+import knowledgeWarehouse from './knowledgeWarehouse.vue';
 
 const route = useRoute();
 let eventId = ref('');
 // let tempEventId = ref<string | null>(null);
 
+// 创建值班管理的状态管理
+const dutyManagementState = reactive({
+  show: false
+});
+// 打开值班管理弹窗
+const openDutyManagement = () => {
+  dutyManagementState.show = true;
+};
+
+// 创建知识库的状态管理
+const knowledgeWarehouseState = reactive({
+  show: false
+});
+// 打开知识库弹窗
+const openKnowledgeWarehouse = () => {
+  knowledgeWarehouseState.show = true;
+};
+
 // 创建任务登记弹窗的状态管理
 const renWuDengJiState = reactive({
   show: false
@@ -91,10 +119,10 @@ const getEventIdFromUrl = () => {
 */
 
 // 更新 startPlan 方法
-const startPlan = async() => {
-  const response = await getEventDetail({ event_id: eventId.value })
-  const event_data = (response.data);
-  if(event_data.emergency_notify_count > 0) {
+const startPlan = async () => {
+  const response = await getEventDetail({ event_id: eventId.value });
+  const event_data = response.data;
+  if (event_data.emergency_notify_count > 0) {
     ElMessage.warning('预案已启动');
     return;
   }
@@ -108,7 +136,7 @@ const startPlan = async() => {
     nextTick().then(() => {
       console.log('DOM updated, showing StartPlan:', startPlanState.show);
     });
-  } else if(event_data.del_flag === '9') {
+  } else if (event_data.del_flag === '9') {
     selectPlanState.title = '预案任务下发';
     selectPlanState.tempEventId = eventId.value;
     selectPlanState.show = true;
@@ -132,7 +160,7 @@ const handleShowInitConsultation = () => {
 };
 // 初始化数据
 const initData = () => {
-  eventId.value = route.query.event_id as string || '';
+  eventId.value = (route.query.event_id as string) || '';
   // getEventIdFromUrl();
   console.log('URL中的eventId:', route.query.event_id);
 };

+ 84 - 0
src/views/emergencyCommandMap/RightSection/knowledgeWarehouse.vue

@@ -0,0 +1,84 @@
+<template>
+  <Dialog custom-show type="xl" title="事件管理列表" @close="closeDialog">
+    <!-- 表格组件 -->
+    <div class="common-table">
+      <div class="table-header">
+        <div class="td">报告编号</div>
+        <div class="td">报告名称</div>
+        <div class="td">主题词</div>
+        <div class="td">事件类型</div>
+        <div class="td">摘要</div>
+        <div class="td">来源单位</div>
+        <div class="td">发布时间</div>
+      </div>
+      <div v-for="(item, index) in tableData" :key="index" class="tr">
+        <div class="td">{{ item.report_id }}</div>
+        <div class="td">{{ item.report_name }}</div>
+        <div class="td">{{ item.source_unit }}</div>
+        <div class="td">{{ item.keyword }}</div>
+        <div class="td">{{ item.event_type }}</div>
+        <div class="td">{{ item.abstract }}</div>
+        <div class="td">{{ item.release_time }}</div>
+      </div>
+    </div>
+    <!--    <div class="footer">-->
+    <!--      <pagination-->
+    <!--        v-show="total > 0"-->
+    <!--        v-model:page="queryParams.page"-->
+    <!--        v-model:limit="queryParams.page_size"-->
+    <!--        :total="total"-->
+    <!--        layout="total, prev, pager, next"-->
+    <!--        @pagination="getList"-->
+    <!--      />-->
+    <!--    </div>-->
+    <!--    <CloseEventDialog-->
+    <!--      v-model="closeDialogState.show"-->
+    <!--      :data="closeDialogState.form"-->
+    <!--      :event-id="eventId"-->
+    <!--      @update:model-value="handleCloseEventDialog"-->
+    <!--    />-->
+  </Dialog>
+</template>
+<script setup lang="ts">
+import CloseEventDialog from '@/views/routineCommandMap/eventing/CloseEventDialog.vue';
+import { reactive } from 'vue';
+
+const emit = defineEmits(['update:show']);
+const closeDialog = () => {
+  emit('update:show', false);
+};
+const queryParams = reactive({
+  page: 1,
+  page_size: 10
+});
+
+const tableData = [
+  {
+    report_id: '001',
+    report_name: '测试报告1',
+    source_unit: '市应急局',
+    keyword: '干旱',
+    event_type: ' drought',
+    abstract: '干旱事件',
+    release_time: '2023-05-01'
+  },
+  {
+    report_id: '002',
+    report_name: '测试报告2',
+    source_unit: '市应急局',
+    keyword: ' flood',
+    event_type: 'flood',
+    abstract: '水灾事件',
+    release_time: '2023-05-02'
+  },
+  {
+    report_id: '003',
+    report_name: '测试报告3',
+    source_unit: '市应急局',
+    keyword: ' wildfire',
+    event_type: 'wildfire',
+    abstract: ' bushfire事件',
+    release_time: '2023-05-03'
+  }
+];
+</script>

+ 14 - 2
src/views/login.vue

@@ -5,7 +5,7 @@
       <div class="title2">茂名智慧应急一张图</div>
       <div class="login-box">
         <div class="login-tabs">
-          <div v-for="(item, index) in tabs" :key="index" :class="tabActive === index ? 'login-tab tab-active' : 'login-tab'">{{ item }}</div>
+          <div v-for="(item, index) in tabs" :key="index" :class="tabActive === index ? 'login-tab tab-active' : 'login-tab'" @click="handleTab(index)">{{ item }}</div>
         </div>
         <el-form-item prop="username">
           <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
@@ -75,7 +75,7 @@ const userStore = useUserStore();
 const router = useRouter();
 const tabActive = ref(0);
 // '粤政易扫码登录',
-const tabs = reactive(['账号密码登录']);
+const tabs = reactive(['账号密码登录', '粤政易登录']);
 const loginForm = ref<LoginData>({
   tenantId: '000000',
   username: 'admin',
@@ -205,6 +205,17 @@ const doSocialLogin = (type: string) => {
   });
 };
 
+
+const handleTab = (tab) => {
+  if(tab == 1) {
+    // const redirect_uri = encodeURIComponent(import.meta.env.YZY_REDIRECT_URI);
+    // const tyrz_url = import.meta.env.YZY_TYRZ_URL + redirect_uri;
+    const redirect_uri = encodeURIComponent("http://19.155.220.206:8086/tyrz/login?src=yjdp&redirect="+redirect.value);
+    const tyrz_url = "https://xtbg.digitalgd.com.cn/zwrz/rz/sso/oauth/authorize?response_type=code&scope=all&client_id=zwrz_mmzhyj&redirect_uri="+redirect_uri;
+    window.location.href = tyrz_url;
+  }
+}
+
 onMounted(() => {
   getCode();
   initTenantList();
@@ -303,6 +314,7 @@ onMounted(() => {
   border-bottom: 1px solid #eeeeee;
   margin-bottom: 15px;
   .login-tab {
+    padding: 0 10px;
   }
   .tab-active {
     color: #5695eb;

+ 3 - 0
src/views/noyzyuser.vue

@@ -0,0 +1,3 @@
+<template>
+    当前粤政易账号没有匹配到系统用户
+    </template>

+ 30 - 0
src/views/yzylogin.vue

@@ -0,0 +1,30 @@
+<template>
+粤政易登录中...
+</template>
+
+<script setup lang="ts">
+import { useUserStore } from '@/store/modules/user';
+import { to } from 'await-to-js';
+
+const route = useRoute();
+const router = useRouter();
+const userStore = useUserStore();
+const code = ref('');
+const loading = ref(true);
+const redirect = ref(undefined);
+
+onMounted(async() => {
+    code.value = route.query && route.query.code as string;
+    redirect.value = route.query && route.query.redirect;
+
+    loading.value = true;
+    const [err] = await to(userStore.yzyLogin(code.value));
+      if (!err) {
+        const redirectUrl = redirect.value || '/';
+        await router.push(redirectUrl);
+        loading.value = false;
+      } else {
+        loading.value = false;
+      }
+})
+</script>