Pārlūkot izejas kodu

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

# Conflicts:
#	src/views/inspectionWork/patrolTask.vue
zhangyihao 6 mēneši atpakaļ
vecāks
revīzija
7858712f2f

+ 4 - 0
.env.development

@@ -19,6 +19,10 @@ VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications'
 # SnailJob 控制台地址
 VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job'
 
+# 粤政易回调页面
+YZY_REDIRECT_URI = 'http://19.155.220.206:8086/tyrz/login'
+YZY_TYRZ_URL = 'https://xtbg.digitalgd.com.cn/zwrz/rz/sso/oauth/authorize?response_type=code&scope=all&client_id=zwrz_mmzhyj&redirect_uri='
+
 VITE_APP_PORT = 8086
 
 # 接口加密功能开关(如需关闭 后端也必须对应关闭)

+ 4 - 5
src/components/Map/map.scss

@@ -1,6 +1,5 @@
 @use "sass:math";
-$vw_base: 8960;
-$vh_base: 2520;
+$vw_base: 4480;
 
 @function vw($px) {
   @return math.div($px, $vw_base) * 100vw;
@@ -25,7 +24,7 @@ $vh_base: 2520;
     overflow-y: auto;
     width: 100%;
     &::-webkit-scrollbar {
-      width: vw(6);
+      width: vw(12);
     }
   }
   .table {
@@ -75,8 +74,8 @@ $vh_base: 2520;
     position: absolute;
     top: vw(20);
     right: vw(60);
-    width: vw(32);
-    height: vw(32);
+    width: vw(54);
+    height: vw(54);
     background: url('@/assets/images/close.png') no-repeat;
     background-size: 100% 100%;
     cursor: pointer;

+ 4 - 0
src/hooks/AMap/useAMap.ts

@@ -208,9 +208,13 @@ export function useAMap(options) {
     // 打开InfoWindow,并设置其内容和位置
     infoWindow.setContent(content);
     infoWindow.open(map, lnglat);
+    // 解决2.0版本无法滚动问题
+    infoWindow.on('mouseover', () => map.setStatus({ zoomEnable: false }));
+    infoWindow.on('mouseout', () => map.setStatus({ zoomEnable: true }));
   };
 
   const hideInfo = (e) => {
+    map.setStatus({ zoomEnable: true });
     if (!!infoWindow) {
       infoWindow.close();
       if (!!clickMarker && e) {

+ 4 - 0
src/types/auto-imports.d.ts

@@ -312,6 +312,10 @@ declare module 'vue' {
   interface GlobalComponents {}
   interface ComponentCustomProperties {
     readonly EffectScope: UnwrapRef<typeof import('vue')['EffectScope']>
+    readonly ElLoading: UnwrapRef<typeof import('element-plus/es')['ElLoading']>
+    readonly ElMessage: UnwrapRef<typeof import('element-plus/es')['ElMessage']>
+    readonly ElMessageBox: UnwrapRef<typeof import('element-plus/es')['ElMessageBox']>
+    readonly ElNotification: UnwrapRef<typeof import('element-plus/es')['ElNotification']>
     readonly acceptHMRUpdate: UnwrapRef<typeof import('pinia')['acceptHMRUpdate']>
     readonly asyncComputed: UnwrapRef<typeof import('@vueuse/core')['asyncComputed']>
     readonly autoResetRef: UnwrapRef<typeof import('@vueuse/core')['autoResetRef']>

+ 16 - 2
src/types/components.d.ts

@@ -19,13 +19,19 @@ declare module 'vue' {
     Dialog: typeof import('./../components/Dialog/index.vue')['default']
     DictTag: typeof import('./../components/DictTag/index.vue')['default']
     Editor: typeof import('./../components/Editor/index.vue')['default']
+    ElAnchor: typeof import('element-plus/es')['ElAnchor']
+    ElAnchorLink: typeof import('element-plus/es')['ElAnchorLink']
     ElAutocomplete: typeof import('element-plus/es')['ElAutocomplete']
     ElBadge: typeof import('element-plus/es')['ElBadge']
     ElButton: typeof import('element-plus/es')['ElButton']
+    ElCard: typeof import('element-plus/es')['ElCard']
     ElCheckbox: typeof import('element-plus/es')['ElCheckbox']
     ElCol: typeof import('element-plus/es')['ElCol']
     ElColorPicker: typeof import('element-plus/es')['ElColorPicker']
     ElConfigProvider: typeof import('element-plus/es')['ElConfigProvider']
+    ElDatePicker: typeof import('element-plus/es')['ElDatePicker']
+    ElDescriptions: typeof import('element-plus/es')['ElDescriptions']
+    ElDescriptionsItem: typeof import('element-plus/es')['ElDescriptionsItem']
     ElDialog: typeof import('element-plus/es')['ElDialog']
     ElDivider: typeof import('element-plus/es')['ElDivider']
     ElDrawer: typeof import('element-plus/es')['ElDrawer']
@@ -36,26 +42,36 @@ declare module 'vue' {
     ElForm: typeof import('element-plus/es')['ElForm']
     ElFormItem: typeof import('element-plus/es')['ElFormItem']
     ElIcon: typeof import('element-plus/es')['ElIcon']
+    ElImage: typeof import('element-plus/es')['ElImage']
     ElInput: typeof import('element-plus/es')['ElInput']
     ElInputNumber: typeof import('element-plus/es')['ElInputNumber']
     ElLink: typeof import('element-plus/es')['ElLink']
     ElMenu: typeof import('element-plus/es')['ElMenu']
     ElMenuItem: typeof import('element-plus/es')['ElMenuItem']
     ElOption: typeof import('element-plus/es')['ElOption']
+    ElPagination: typeof import('element-plus/es')['ElPagination']
     ElPopover: typeof import('element-plus/es')['ElPopover']
     ElRadio: typeof import('element-plus/es')['ElRadio']
     ElRadioGroup: typeof import('element-plus/es')['ElRadioGroup']
     ElRow: typeof import('element-plus/es')['ElRow']
     ElScrollbar: typeof import('element-plus/es')['ElScrollbar']
+    ElSegmented: typeof import('element-plus/es')['ElSegmented']
     ElSelect: typeof import('element-plus/es')['ElSelect']
+    ElSlider: typeof import('element-plus/es')['ElSlider']
     ElSubMenu: typeof import('element-plus/es')['ElSubMenu']
     ElSwitch: typeof import('element-plus/es')['ElSwitch']
     ElTable: typeof import('element-plus/es')['ElTable']
     ElTableColumn: typeof import('element-plus/es')['ElTableColumn']
+    ElTabPane: typeof import('element-plus/es')['ElTabPane']
+    ElTabs: typeof import('element-plus/es')['ElTabs']
     ElTag: typeof import('element-plus/es')['ElTag']
     ElText: typeof import('element-plus/es')['ElText']
+    ElTimeline: typeof import('element-plus/es')['ElTimeline']
+    ElTimelineItem: typeof import('element-plus/es')['ElTimelineItem']
     ElTooltip: typeof import('element-plus/es')['ElTooltip']
+    ElTree: typeof import('element-plus/es')['ElTree']
     ElTreeSelect: typeof import('element-plus/es')['ElTreeSelect']
+    ElUpload: typeof import('element-plus/es')['ElUpload']
     ExcelEditor: typeof import('./../components/ExcelEditor/index.vue')['default']
     FileUpload: typeof import('./../components/FileUpload/index.vue')['default']
     FooterSection: typeof import('./../components/FooterSection/index.vue')['default']
@@ -66,8 +82,6 @@ declare module 'vue' {
     HikvisionPlayer: typeof import('./../components/HKVideo/hikvision-player.vue')['default']
     HKVideo: typeof import('./../components/HKVideo/index.vue')['default']
     IconSelect: typeof import('./../components/IconSelect/index.vue')['default']
-    IEpCaretBottom: typeof import('~icons/ep/caret-bottom')['default']
-    IEpCaretTop: typeof import('~icons/ep/caret-top')['default']
     IFrame: typeof import('./../components/iFrame/index.vue')['default']
     ImagePreview: typeof import('./../components/ImagePreview/index.vue')['default']
     ImageUpload: typeof import('./../components/ImageUpload/index.vue')['default']

+ 29 - 29
src/views/globalMap/data/mapData.ts

@@ -4125,22 +4125,22 @@ export const iconList = {
   '1': {
     image: getImageUrl('1_expert.png'),
     imageHover: getImageUrl('1_expert_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '2': {
     image: getImageUrl('2_rescue_supplies.png'),
     imageHover: getImageUrl('2_rescue_supplies_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '3': {
     image: getImageUrl('3_emergency_shelter.png'),
     imageHover: getImageUrl('3_emergency_shelter_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '4': {
     image: getImageUrl('4_easy_flood_point.png'),
     imageHover: getImageUrl('4_easy_flood_point_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   'common': {
     image: 'https://webapi.amap.com/theme/v1.3/markers/n/mark_b.png',
@@ -4150,127 +4150,127 @@ export const iconList = {
   '5': {
     image: getImageUrl('5_school.png'),
     imageHover: getImageUrl('5_school_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '6': {
     image: getImageUrl('6_hospital.png'),
     imageHover: getImageUrl('6_hospital_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '7': {
     image: getImageUrl('7_gas_station.png'),
     imageHover: getImageUrl('7_gas_station_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '8': {
     image: getImageUrl('8_non_coal_mine.png'),
     imageHover: getImageUrl('8_non_coal_mine_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '9': {
     image: getImageUrl('9_hazardous_chemical_enterprises.png'),
     imageHover: getImageUrl('9_hazardous_chemical_enterprises_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '10': {
     image: getImageUrl('10_ship_dynamics.png'),
     imageHover: getImageUrl('10_ship_dynamics_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '11': {
     image: getImageUrl('9_hazardous_chemical_enterprises.png'),
     imageHover: getImageUrl('9_hazardous_chemical_enterprises_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '12': {
     image: getImageUrl('9_hazardous_chemical_enterprises.png'),
     imageHover: getImageUrl('9_hazardous_chemical_enterprises_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '13': {
     image: getImageUrl('9_hazardous_chemical_enterprises.png'),
     imageHover: getImageUrl('9_hazardous_chemical_enterprises_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '14': {
     image: getImageUrl('9_hazardous_chemical_enterprises.png'),
     imageHover: getImageUrl('9_hazardous_chemical_enterprises_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '15': {
     image: getImageUrl('15_UAV.png'),
     imageHover: getImageUrl('15_UAV_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '16': {
     image: getImageUrl('16_rainbow.png'),
     imageHover: getImageUrl('16_rainbow_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '17': {
     image: getImageUrl('17_midmapdzzh.png'),
     imageHover: getImageUrl('17_midmapdzzh_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '18': {
     image: getImageUrl('18_miningoperations.png'),
     imageHover: getImageUrl('18_miningoperations_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '19': {
     image: getImageUrl('19_commercialtrade.png'),
     imageHover: getImageUrl('19_commercialtrade_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '20': {
     image: getImageUrl('20_meteorological_disaster.png'),
     imageHover: getImageUrl('20_meteorological_disaster_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '21': {
     image: getImageUrl('21_buildingproject.png'),
     imageHover: getImageUrl('21_buildingproject_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '22': {
     image: getImageUrl('22_storage_tank.png'),
     imageHover: getImageUrl('22_storage_tank_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '23': {
     image: getImageUrl('22_storage_tank.png'),
     imageHover: getImageUrl('22_storage_tank_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '24': {
     image: getImageUrl('24_stationinfo.png'),
     imageHover: getImageUrl('24_stationinfo_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '25': {
     image: getImageUrl('25_yardsites.png'),
     imageHover: getImageUrl('25_yardsites_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '26': {
     image: getImageUrl('26_tourist_destinations.png'),
     imageHover: getImageUrl('26_tourist_destinations_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '27': {
     image: getImageUrl('27_constructionsites.png'),
     imageHover: getImageUrl('27_constructionsites_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '28': {
     image: getImageUrl('28_emergencytransportresources.png'),
     imageHover: getImageUrl('28_emergencytransportresources_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
   '29': {
     image: getImageUrl('29_emergencyofficer.png'),
     imageHover: getImageUrl('29_emergencyofficer_hover.png'),
-    size: [40, 40]
+    size: [60, 60]
   },
 };
 

+ 13 - 7
src/views/informationissue/informationApplication.vue

@@ -99,13 +99,13 @@
         </div>
       </div>
     </div>
+    <ContactSelect
+      v-model="contactSelectState.show"
+      :tree-data="treeData"
+      :default-check-data="selectContactSelectData"
+      @confirm="handleContactSelectData"
+    />
   </div>
-  <ContactSelect
-    v-model="contactSelectState.show"
-    :tree-data="treeData"
-    :default-check-data="selectContactSelectData"
-    @confirm="handleContactSelectData"
-  />
 </template>
 
 <script setup lang="ts">
@@ -266,6 +266,11 @@ const fetchTreeData = async () => {
     console.error('Failed to fetch information:', error);
   }
 };
+
+const openUserSelect = async() => {
+
+};
+
 onMounted(() => {
   fetchTreeData();
   formData.value.publish_time = formattedCurrentTime.value;
@@ -274,7 +279,8 @@ onMounted(() => {
       presetTemplates.value.push({ value: item.name, label: item.name, content: item.content });
     });
     getUser({}).then((res) => {
-      users.value = res.data.map((user) => ({ value: user.username, username: user.username }));
+      // console.log('res:', res);
+      users.value = res.rows.map((user) => ({ value: user.username, username: user.username }));
     });
   });
 });

+ 5 - 1
src/views/informationissue/informationApproval.vue

@@ -62,7 +62,7 @@
                     <el-row :gutter="18">
                       <el-col :span="6">
                         <el-form-item label="发布时间:" prop="releaseTime">
-                          <el-button type="text" @click="publishNow">立即发布</el-button>
+                          <el-button @click="publishNow">立即发布</el-button>
                         </el-form-item>
                       </el-col>
                       <el-col :span="12">
@@ -231,6 +231,10 @@ const fetchInformation = async () => {
   }
 };
 
+const publishNow = ()=> {
+
+};
+
 // 审批form
 const form2Ref = ref(null);
 const buttonLoading = ref(false);

+ 2 - 2
src/views/informationissue/informationList.vue

@@ -220,7 +220,7 @@ let informationApprovalState = reactive({
 
 const handleView = (row) => {
   if (row) {
-    informationViewState.eventId = row.id; // 假设eventId是id字段
+    informationViewState.eventId = row.id+""; // 假设eventId是id字段
     informationViewState.show = true;
   }
 };
@@ -233,7 +233,7 @@ const handleUpdate = (row) => {
 
 const handleApproval = (row) => {
   if (row) {
-    informationApprovalState.eventId = row.id; // 假设eventId是id字段
+    informationApprovalState.eventId = row.id+""; // 假设eventId是id字段
     informationApprovalState.show = true;
   }
 };

+ 5 - 2
src/views/informationissue/informationView.vue

@@ -94,7 +94,7 @@
                     <el-row :gutter="18">
                       <el-col :span="6">
                         <el-form-item label="发布时间:" prop="publish_time">
-                          <el-button type="text" disabled @click="publishNow">立即发布</el-button>
+                          <el-button disabled @click="publishNow">立即发布</el-button>
                         </el-form-item>
                       </el-col>
                       <el-col :span="12">
@@ -164,8 +164,8 @@
         </div>
       </div>
     </div>
+    <SendDetail v-if="sendDetailState.show" :info_id="sendDetailState.info_id" @close="handleCancel" />
   </div>
-  <SendDetail v-if="sendDetailState.show" :info_id="sendDetailState.info_id" @close="handleCancel" />
 </template>
 
 <script setup lang="ts">
@@ -234,6 +234,9 @@ const showSendDetails = () => {
   sendDetailState.info_id = props.eventId; // 假设eventId是id字段
   sendDetailState.show = true;
 };
+const publishNow = () => {
+
+};
 
 const showTemplateExample = () => {
   ElMessage.info('点击了查看模板样例');

+ 13 - 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,16 @@ 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");
+    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 +313,7 @@ onMounted(() => {
   border-bottom: 1px solid #eeeeee;
   margin-bottom: 15px;
   .login-tab {
+    padding: 0 10px;
   }
   .tab-active {
     color: #5695eb;

+ 41 - 40
src/views/setting/riskPrevention/userManage.vue

@@ -58,50 +58,51 @@
       </el-table>
     </div>
     <pagination v-show="total > 0" v-model:page="queryForm.page" v-model:limit="queryForm.pageSize" :total="total" @pagination="getList" />
-  </div>
-  <!-- 新增/修改弹窗 -->
-  <div v-show="addDialog.visible" class="common-dialog">
-    <div class="common-dialog-content">
-      <div class="common-dialog-title-box">
-        <i class="common-dialog-title-icon" />
-        <div>{{ addDialog.title }}</div>
+
+    <!-- 新增/修改弹窗 -->
+    <div v-show="addDialog.visible" class="common-dialog">
+      <div class="common-dialog-content">
+        <div class="common-dialog-title-box">
+          <i class="common-dialog-title-icon" />
+          <div>{{ addDialog.title }}</div>
+        </div>
+        <div class="common-dialog-box">
+          <el-form ref="addFormRef" :model="addForm" :rules="rules" label-width="120px">
+            <el-form-item label="单位名称:" prop="unitId">
+              <el-select v-model="addForm.unitId" placeholder="请选择单位" clearable style="width: 468px !important">
+                <el-option v-for="item in unitList" :key="item.deptId" :label="item.deptName" :value="item.deptId"></el-option>
+              </el-select>
+            </el-form-item>
+            <el-form-item label="联系人:" prop="contactName">
+              <el-input v-model="addForm.contactName" placeholder="请输入联系人" style="width: 468px !important" />
+            </el-form-item>
+            <el-form-item label="职务:" prop="position">
+              <el-input v-model="addForm.position" placeholder="请输入职务" style="width: 468px !important" />
+            </el-form-item>
+            <el-form-item label="粤政易手机号码:" prop="phone">
+              <el-input v-model="addForm.phone" placeholder="请输入粤政易手机号码" style="width: 468px !important" />
+            </el-form-item>
+          </el-form>
+        </div>
+        <div class="common-dialog-footer" style="display: flex; justify-content: center">
+          <el-button type="primary" @click="submitForm">确 定</el-button>
+          <el-button @click="cancel">取 消</el-button>
+        </div>
       </div>
-      <div class="common-dialog-box">
-        <el-form ref="addFormRef" :model="addForm" :rules="rules" label-width="120px">
-          <el-form-item label="单位名称:" prop="unitId">
-            <el-select v-model="addForm.unitId" placeholder="请选择单位" clearable style="width: 468px !important">
-              <el-option v-for="item in unitList" :key="item.deptId" :label="item.deptName" :value="item.deptId"></el-option>
-            </el-select>
-          </el-form-item>
-          <el-form-item label="联系人:" prop="contactName">
-            <el-input v-model="addForm.contactName" placeholder="请输入联系人" style="width: 468px !important" />
-          </el-form-item>
-          <el-form-item label="职务:" prop="position">
-            <el-input v-model="addForm.position" placeholder="请输入职务" style="width: 468px !important" />
-          </el-form-item>
-          <el-form-item label="粤政易手机号码:" prop="phone">
-            <el-input v-model="addForm.phone" placeholder="请输入粤政易手机号码" style="width: 468px !important" />
-          </el-form-item>
+
+      <el-dialog v-model="showImportDlg" title="导入人员" width="500px" append-to-body>
+        <el-form ref="importFormRef" :model="importForm" :rules="importRules">
+          <FileUpload v-model="importForm.filename" :file-type="['xls', 'xlsx']" :limit="1" />
         </el-form>
-      </div>
-      <div class="common-dialog-footer" style="display: flex; justify-content: center">
-        <el-button type="primary" @click="submitForm">确 定</el-button>
-        <el-button @click="cancel">取 消</el-button>
-      </div>
+        <template #footer>
+          <div class="dialog-footer">
+            <el-button type="primary" @click="submitImportForm">确 定</el-button>
+            <el-button @click="cancelImport">取 消</el-button>
+          </div>
+        </template>
+      </el-dialog>
     </div>
   </div>
-
-  <el-dialog v-model="showImportDlg" title="导入人员" width="500px" append-to-body>
-    <el-form ref="importFormRef" :model="importForm" :rules="importRules">
-      <FileUpload v-model="importForm.filename" :file-type="['xls', 'xlsx']" :limit="1" />
-    </el-form>
-    <template #footer>
-      <div class="dialog-footer">
-        <el-button type="primary" @click="submitImportForm">确 定</el-button>
-        <el-button @click="cancelImport">取 消</el-button>
-      </div>
-    </template>
-  </el-dialog>
 </template>
 
 <script setup lang="ts">