Browse Source

我要发布详情页面静态页面开发

Liuzhenyu 10 hours ago
parent
commit
735ce8ad24

+ 1 - 1
.env.development

@@ -5,4 +5,4 @@ VITE_APP_TITLE = 中华人民共和国海事局
 VITE_APP_ENV = 'development'
 
 # 中华人民共和国海事局/开发环境
-VITE_APP_BASE_API = 'http://192.168.101.110:8080/api'
+VITE_APP_BASE_API = 'http://192.168.86.149:8080/api'

+ 1 - 1
src/api/login.ts

@@ -9,7 +9,7 @@ export function login(username: string, password: string, code: string, uuid: st
         uuid,
     };
     return request({
-        url: '/login',
+        url: '/auth/login',
         headers: {
             isToken: false,
         },

+ 106 - 0
src/components/components/notificationManageDetails.vue

@@ -0,0 +1,106 @@
+<template>
+    <div class="form-page">
+      <div class="page-header">
+        <h2 class="page-title">{{ pageTitle }}</h2>
+      </div>
+  
+      <!-- 主要内容容器 -->
+      <slot name="content"></slot>
+  
+      <!-- 底部按钮区 -->
+      <div class="form-actions">
+        <slot name="btn"></slot>
+      </div>
+    </div>
+  </template>
+  
+  <script setup lang="ts" name="CommonForm">
+  import { ref, onMounted, onBeforeUnmount } from 'vue';
+  import { useRoute, useRouter } from 'vue-router';
+  
+  // --- 路由与Store ---
+  const route = useRoute();
+  const router = useRouter();
+  
+  const pageTitle = ref(''); // 页面标题
+  const isDetail = ref(false); // 是否为详情模式
+  const isEdit = ref(false); // 是否为编辑模式
+  
+  onMounted(async () => {
+    const { type, id } = route.query;
+    try {
+      switch (type as string) {
+        case 'add':
+          pageTitle.value = '水上交通安全信息发布与处置完成管理 新增发布';
+          isEdit.value = false;
+          break;
+        case 'edit':
+          pageTitle.value = '水上交通安全信息发布与处置完成管理 编辑发布';
+          isEdit.value = true;
+          break;
+        case 'detail':
+          pageTitle.value = '水上交通安全信息发布与处置完成管理 查看发布';
+          isDetail.value = true;
+          break;
+        default:
+          throw new Error(`无效操作类型: ${type}`);
+      }
+    } catch (error) {
+      handleBack();
+    } finally {}
+  });
+  
+  const handleBack = () => {
+    router.go(-1);
+  };
+  
+  onBeforeUnmount(() => {
+    isDetail.value = false;
+    isEdit.value = false;
+  });
+  </script>
+  
+  <style scoped lang="scss">
+  .form-page {
+    padding: 20px;
+    background-color: #fff;
+  }
+  
+  .page-header {
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    margin-bottom: 30px;
+  
+    .page-title {
+      font-size: 22px;
+      font-weight: 500;
+      color: #5070ae;
+    }
+  }
+  
+  .form-actions {
+    display: flex;
+    justify-content: center;
+    margin-top: 40px;
+    gap: 16px;
+  
+    .el-button {
+      padding: 8px 24px;
+    }
+  }
+  
+  // 响应式调整
+  @media (max-width: 768px) {
+    .form-container {
+      padding: 15px;
+    }
+  
+    .page-header {
+      flex-direction: column;
+      align-items: flex-start;
+      gap: 10px;
+    }
+  }
+  </style>

+ 1 - 3
src/components/components/pageSearch.vue

@@ -8,13 +8,11 @@
       class="search-form"
     >
       <!-- 第一行:筛选项(自动换行,每行3列) -->
-      <el-row :gutter="16" class="form-row">
+      <el-row :gutter="12" class="form-row">
         <template v-for="item in searchConfig.formItems" :key="item.prop">
           <!-- 响应式列:大屏3列,中屏2列,小屏1列 -->
           <el-col
             :span="8"
-            :md="12"
-            :sm="24"
             class="form-col"
           >
             <el-form-item :label="item.label" :prop="item.prop">

+ 196 - 0
src/components/notificationDetailsParts/addNewVesselsDrawer.vue

@@ -0,0 +1,196 @@
+<template>
+  <div class="ship-info-drawer">
+    <el-drawer
+      v-model="visible"
+      title="新增船舶信息"
+      :with-header="true"
+      :close-on-click-modal="false"
+      size="70%"
+    >
+      <div class="business-desc">
+        <h4 class="text-danger">业务说明:</h4>
+        <ul class="ml-4 mt-2 text-sm text-gray-700 space-y-1">
+          <li>1、通过选择船舶信息查询到船舶信息的,可点击“添加”按钮将该船舶信息带入到涉事主体基本信息中。</li>
+          <li>2、通过选择船舶信息未查询到船舶信息的,可点击“新增船舶”按钮维护涉事主体基本信息即可。</li>
+        </ul>
+      </div>
+
+      <el-form
+        ref="searchFormRef"
+        :model="searchForm"
+        label-width="120px"
+        size="small"
+        class="mt-4 search-form"
+      >
+        <el-row :gutter="20">
+          <!-- 第一行:船名、船舶识别号、船舶登记号 -->
+          <el-col :span="8">
+            <el-form-item label="船名:">
+              <el-input
+                v-model="searchForm.shipName"
+                placeholder="请填写船名"
+                maxlength="50"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="船舶识别号:">
+              <el-input
+                v-model="searchForm.shipId"
+                placeholder="请填船舶识别号"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="船舶登记号:">
+              <el-input
+                v-model="searchForm.registrationNo"
+                placeholder="请填船舶登记号"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+
+          <!-- 第二行:初次登记号、船检登记号、IMO -->
+          <el-col :span="8">
+            <el-form-item label="初次登记号:">
+              <el-input
+                v-model="searchForm.firstRegNo"
+                placeholder="请填初次登记号"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="船检登记号:">
+              <el-input
+                v-model="searchForm.surveyRegNo"
+                placeholder="请填船检登记号"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="8">
+            <el-form-item label="IMO:">
+              <el-input
+                v-model="searchForm.imo"
+                placeholder="请填IMO"
+                maxlength="10"
+              />
+            </el-form-item>
+          </el-col>
+
+          <!-- 第三行:牌薄号 + 查询/重置按钮 -->
+          <el-col :span="8">
+            <el-form-item label="牌薄号:">
+              <el-input
+                v-model="searchForm.licenseNo"
+                placeholder="请填写牌薄号"
+                maxlength="20"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <div class="demo-drawer__footer">
+          <el-button type="primary" class="search-btn" @click="emit('selectShip', searchForm)">
+            新增
+          </el-button>
+          <el-button type="default" @click="handleReset">
+            重置
+          </el-button>
+        </div>
+      </el-form>
+    </el-drawer>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, defineProps, defineEmits } from 'vue';
+import type { FormInstance } from 'element-plus';
+
+const props = defineProps<{
+  visible: boolean;
+}>();
+
+// 向父组件发送事件
+const emit = defineEmits<{
+  (e: 'update:visible', value: boolean): void;
+  (e: 'selectShip', shipData: any): void; // 选择船舶时通知父组件(预留)
+}>();
+
+// 抽屉显示状态(双向绑定)
+const visible = ref(props.visible);
+
+// 查询表单数据
+const searchForm = reactive({
+  shipName: '',
+  shipId: '',
+  registrationNo: '',
+  firstRegNo: '',
+  surveyRegNo: '',
+  imo: '',
+  licenseNo: ''
+});
+
+// 表单实例
+const searchFormRef = ref<FormInstance>();
+
+// 重置按钮事件
+const handleReset = () => {
+  if (searchFormRef.value) {
+    searchFormRef.value.resetFields(); // 重置表单
+  }
+};
+
+// 监听抽屉显示状态变化,通知父组件
+watch(
+  () => visible.value,
+  (newVal) => {
+    emit('update:visible', newVal);
+  }
+);
+
+// 监听父组件传入的visible变化(同步抽屉状态)
+watch(
+  () => props.visible,
+  (newVal) => {
+    visible.value = newVal;
+  }
+);
+</script>
+
+<style scoped lang="scss">
+.ship-info-drawer {
+  :deep(.el-drawer__header) {
+    background-color: #163a8a !important; 
+    margin: 0 !important;
+    padding: 20px !important;
+    color: white !important;
+  }
+}
+
+.business-desc {
+  padding-bottom: 15px;
+  border-bottom: 1px dashed #e0e0e0;
+
+  h4 {
+    font-weight: 500;
+    margin-bottom: 5px;
+  }
+}
+
+.search-form {
+  .el-form-item {
+    margin-bottom: 15px;
+  }
+}
+
+.demo-drawer__footer {
+  display: flex;        /* 使用flex布局 */
+  justify-content: center; /* 水平居中 */
+  gap: 12px;            /* 按钮间距(可选,根据需要调整) */
+  margin-top: 20px;     /* 与上方表单的间距(可选) */
+}
+
+</style>

+ 103 - 0
src/components/notificationDetailsParts/mattersListDrawer.vue

@@ -0,0 +1,103 @@
+<template>
+  <div class="ship-info-drawer">
+    <el-drawer
+      v-model="visible"
+      title="事项清单查询列表"
+      :with-header="true"
+      :close-on-click-modal="false"
+      size="70%"
+    >
+
+    </el-drawer>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, defineProps, defineEmits } from 'vue';
+import type { FormInstance } from 'element-plus';
+
+const props = defineProps<{
+  visible: boolean;
+}>();
+
+// 向父组件发送事件
+const emit = defineEmits<{
+  (e: 'update:visible', value: boolean): void;
+  (e: 'selectShip', shipData: any): void; // 选择船舶时通知父组件(预留)
+}>();
+
+// 抽屉显示状态(双向绑定)
+const visible = ref(props.visible);
+
+// 查询表单数据
+const searchForm = reactive({
+  shipName: '',
+  shipId: '',
+  registrationNo: '',
+  firstRegNo: '',
+  surveyRegNo: '',
+  imo: '',
+  licenseNo: ''
+});
+
+// 表单实例
+const searchFormRef = ref<FormInstance>();
+
+// 重置按钮事件
+const handleReset = () => {
+  if (searchFormRef.value) {
+    searchFormRef.value.resetFields(); // 重置表单
+  }
+};
+
+// 监听抽屉显示状态变化,通知父组件
+watch(
+  () => visible.value,
+  (newVal) => {
+    emit('update:visible', newVal);
+  }
+);
+
+// 监听父组件传入的visible变化(同步抽屉状态)
+watch(
+  () => props.visible,
+  (newVal) => {
+    visible.value = newVal;
+  }
+);
+</script>
+
+<style scoped lang="scss">
+.ship-info-drawer {
+  :deep(.el-drawer__header) {
+    background-color: #163a8a !important; 
+    margin: 0 !important;
+    padding: 20px !important;
+    color: white !important;
+  }
+}
+
+.business-desc {
+  padding-bottom: 15px;
+  border-bottom: 1px dashed #e0e0e0;
+
+  h4 {
+    font-weight: 500;
+    margin-bottom: 5px;
+  }
+}
+
+.search-form {
+  .el-form-item {
+    margin-bottom: 15px;
+  }
+}
+
+.demo-drawer__footer {
+  display: flex;        /* 使用flex布局 */
+  justify-content: center; /* 水平居中 */
+  gap: 12px;            /* 按钮间距(可选,根据需要调整) */
+  margin-top: 20px;     /* 与上方表单的间距(可选) */
+}
+
+</style>

+ 41 - 0
src/components/notificationDetailsParts/publishUnitInformation.vue

@@ -0,0 +1,41 @@
+<template>
+  <div class="ship-info-form">
+    <el-collapse v-model="activeNames">
+      <el-collapse-item name="1">
+        <template #title="{ isActive }">
+          <div class="collapse-title">
+            发布单位信息
+          </div>
+        </template>
+        <div class="flex mb20 mt20">
+          <div class="mr20">发布单位:交通运输部海事局</div>
+          <div>发布日期:2025-04-17</div>
+        </div>
+        <div>
+          根据《交通运输部办公厅关于印发〈水上交通安全信息共享共治专项行动方案〉的通知》(交办海涵),现将相关情况向你单位通报,请予以处理。
+        </div>
+      </el-collapse-item>
+    </el-collapse>
+  </div>
+</template>
+
+<script setup lang="ts">
+  const activeNames = ref(['1']);
+</script>
+
+<style scoped>
+.ship-info-form {
+  background: #fff;
+  border-radius: 8px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
+}
+:deep .el-collapse-item__header {
+  color: #5070ae;
+  size: 24px;
+  background: linear-gradient(135deg, #d2e8ff, #fcfeff);
+	box-shadow: 0 8px 20px #fcfeff;
+	text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+  padding-left: 20px;
+}
+</style>

+ 384 - 0
src/components/notificationDetailsParts/questionInformation.vue

@@ -0,0 +1,384 @@
+<template>
+  <div class="ship-info-form">
+    <!-- 折叠面板 -->
+    <el-collapse v-model="activeNames" class="collapse-panel">
+      <el-collapse-item title="涉事主体基本信息" name="1" :border="false">
+        <div v-if="isShowAdd" class="flex-cc">
+          <el-button @click="onAddVessels" :icon="Plus">添加船舶</el-button>
+          <el-tooltip content="Bottom center" placement="bottom" effect="light">
+              <el-button link :icon="Warning">业务说明</el-button>
+          </el-tooltip>
+        </div>
+        <div v-else>
+          <el-form
+            ref="ruleFormRef"
+            :model="formData"
+            :rules="formRules"
+            label-width="130px"
+            size="default"
+            class="form-container"
+          >
+            <!-- 第一行:中文船名、英文船名、船舶识别号 -->
+            <el-row :gutter="24">
+              <el-col :span="8">
+                <el-form-item label="中文船名" prop="chineseName" required>
+                  <el-input 
+                    v-model="formData.chineseName" 
+                    placeholder="请填写中文船名"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="英文船名" prop="englishName">
+                  <el-input 
+                    v-model="formData.englishName" 
+                    placeholder="请填写英文船名"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="船舶识别号" prop="vesselId">
+                  <el-input 
+                    v-model="formData.vesselId" 
+                    placeholder="请填写船舶识别号"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第二行:MMSI、IMO编号、呼号 -->
+            <el-row :gutter="24">
+              <el-col :span="8">
+                <el-form-item label="MMSI" prop="mmsi">
+                  <el-input 
+                    v-model="formData.mmsi" 
+                    placeholder="请填写MMSI"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="IMO编号" prop="imoNumber">
+                  <el-input 
+                    v-model="formData.imoNumber" 
+                    placeholder="请填写IMO编号"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="呼号" prop="callSign">
+                  <el-input 
+                    v-model="formData.callSign" 
+                    placeholder="请填写呼号"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第三行:牌薄号、船舶种类、船籍港 -->
+            <el-row :gutter="24">
+              <el-col :span="8">
+                <el-form-item label="牌薄号" prop="registrationNo">
+                  <el-input 
+                    v-model="formData.registrationNo" 
+                    placeholder="请填写牌薄号"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="船舶种类" prop="vesselType" required>
+                  <el-select 
+                    v-model="formData.vesselType" 
+                    placeholder="请选择船舶种类"
+                    :disabled="isUnknownVessel"
+                  >
+                    <el-option label="散货船" value="bulkCarrier" />
+                    <el-option label="集装箱船" value="containerShip" />
+                    <el-option label="油船" value="tanker" />
+                    <el-option label="杂货船" value="generalCargo" />
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="船籍港" prop="portOfRegistry" required>
+                  <el-input 
+                    v-model="formData.portOfRegistry" 
+                    placeholder="请填写船籍港"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第四行:国籍 -->
+            <el-row :gutter="24">
+              <el-col :span="8">
+                <el-form-item label="国籍" prop="nationality">
+                  <el-input 
+                    v-model="formData.nationality" 
+                    placeholder="请填写国籍"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第五行:船舶所有人、所有人电话 -->
+            <el-row :gutter="24">
+              <el-col :span="12">
+                <el-form-item label="船舶所有人" prop="owner" required>
+                  <el-input 
+                    v-model="formData.owner" 
+                    placeholder="请填写船舶所有人"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="所有人电话" prop="ownerPhone">
+                  <el-input 
+                    v-model="formData.ownerPhone" 
+                    placeholder="请填写船舶所有人联系电话"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第六行:船舶经营人、经营人电话 -->
+            <el-row :gutter="24">
+              <el-col :span="12">
+                <el-form-item label="船舶经营人" prop="operator" required>
+                  <el-input 
+                    v-model="formData.operator" 
+                    placeholder="请填写船舶经营人"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="经营人电话" prop="operatorPhone">
+                  <el-input 
+                    v-model="formData.operatorPhone" 
+                    placeholder="请填写船舶经营人联系电话"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第七行:其他相关组织、其他相关组织电话 -->
+            <el-row :gutter="24">
+              <el-col :span="12">
+                <el-form-item label="其他相关组织" prop="otherOrg">
+                  <el-input 
+                    v-model="formData.otherOrg" 
+                    placeholder="请填写其他相关组织"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="其他相关组织电话" prop="otherOrgPhone">
+                  <el-input 
+                    v-model="formData.otherOrgPhone" 
+                    placeholder="请填写其他相关组织联系电话"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 第八行:船舶信息描述 -->
+            <el-row :gutter="24">
+              <el-col :span="24">
+                <el-form-item label="船舶信息描述" prop="description">
+                  <el-input 
+                    v-model="formData.description" 
+                    placeholder="请填写船舶信息描述"
+                    type="textarea" 
+                    :rows="4"
+                    :disabled="isUnknownVessel"
+                  />
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+          <div class="form-actions">
+            <el-button 
+              type="default" 
+              text 
+              class="reset-btn" 
+              @click="handleReset"
+            >
+              船舶信息重置
+            </el-button>
+            <el-tooltip content="Bottom center" placement="bottom" effect="light">
+                <el-button link :icon="Warning">业务说明</el-button>
+            </el-tooltip>
+          </div>
+        </div>
+      </el-collapse-item>
+    </el-collapse>
+    <AddNewVesselsDrawer
+      v-model:visible="drawerVisible"
+      @selectShip="handleSelectShip"
+    ></AddNewVesselsDrawer>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive } from 'vue';
+import type { FormInstance, FormRules } from 'element-plus';  // 导入表单类型
+import { Plus, Warning } from '@element-plus/icons-vue';
+import AddNewVesselsDrawer from './addNewVesselsDrawer.vue';
+
+const ruleFormRef = ref<FormInstance>();
+const activeNames = ref(['1']);
+const isUnknownVessel = ref(false);
+const isShowAdd = ref(true);
+const drawerVisible = ref(false);
+const formData = reactive({
+  chineseName: '',
+  englishName: '',
+  vesselId: '',
+  mmsi: '',
+  imoNumber: '',
+  callSign: '',
+  registrationNo: '',
+  vesselType: '',
+  portOfRegistry: '',
+  nationality: '',
+  owner: '',
+  ownerPhone: '',
+  operator: '',
+  operatorPhone: '',
+  otherOrg: '',
+  otherOrgPhone: '',
+  description: ''
+});
+
+const formRules = reactive<FormRules>({
+  chineseName: [
+    { required: true, message: '请输入中文船名', trigger: 'blur' },
+    { max: 50, message: '长度不能超过50个字符', trigger: 'blur' }
+  ],
+  vesselType: [
+    { required: true, message: '请选择船舶种类', trigger: 'change' }
+  ],
+  portOfRegistry: [
+    { required: true, message: '请输入船籍港', trigger: 'blur' },
+    { max: 30, message: '长度不能超过30个字符', trigger: 'blur' }
+  ],
+  owner: [
+    { required: true, message: '请输入船舶所有人', trigger: 'blur' },
+    { max: 50, message: '长度不能超过50个字符', trigger: 'blur' }
+  ],
+  operator: [
+    { required: true, message: '请输入船舶经营人', trigger: 'blur' },
+    { max: 50, message: '长度不能超过50个字符', trigger: 'blur' }
+  ],
+  ownerPhone: [
+    { pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }
+  ],
+  operatorPhone: [
+    { pattern: /^1[3-9]\d{9}$/, message: '请输入有效的手机号码', trigger: 'blur' }
+  ]
+});
+
+// 重置按钮功能
+const handleReset = () => {
+  if (!ruleFormRef.value) return;
+  
+  // 重置表单(清除验证状态 + 恢复初始数据)
+  ruleFormRef.value.resetFields();
+  
+  // (可选)如需自定义默认值,取消以下注释并修改
+  // formData.chineseName = '扬子10';
+  // formData.vesselType = 'bulkCarrier';
+};
+
+formData.chineseName = '扬子10';
+formData.englishName = 'YANGZE 10';
+formData.mmsi = '636017533';
+formData.imoNumber = '9574444';
+formData.callSign = 'D5LK6';
+formData.vesselType = 'bulkCarrier'; // 散货船
+formData.portOfRegistry = '蒙罗维亚';
+formData.nationality = '利比里亚';
+
+const handleSelectShip = (data) => {
+  console.log(data);
+  drawerVisible.value = false
+  isShowAdd.value = false
+}
+
+const onAddVessels = () => {
+  drawerVisible.value = true
+}
+</script>
+
+<style scoped lang="scss">
+.ship-info-form {
+  background: #fff;
+  border-radius: 8px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
+}
+
+/* 折叠面板样式 */
+:deep .el-collapse-item__header {
+  color: #5070ae;
+  size: 24px;
+  background: linear-gradient(135deg, #d2e8ff, #fcfeff);
+	box-shadow: 0 8px 20px #fcfeff;
+	text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+  padding-left: 20px;
+}
+
+:deep .el-collapse-item__content {
+  padding-top: 25px;
+}
+
+/* 表单容器 */
+.form-container {
+  margin-top: 10px;
+}
+
+/* 按钮区域 */
+.form-actions {
+  display: flex;
+  justify-content: center;
+  margin-top: 30px;
+  gap: 20px;
+  
+  .reset-btn {
+    color: #f56c6c;
+  }
+}
+
+/* 适配小屏幕 */
+@media (max-width: 1024px) {
+  .el-row {
+    .el-col {
+      &:nth-child(3n) {
+        margin-bottom: 15px;
+      }
+    }
+  }
+}
+
+@media (max-width: 768px) {
+  .el-col {
+    flex: 0 0 100% !important;
+    max-width: 100% !important;
+    margin-bottom: 15px;
+  }
+}
+</style>

+ 519 - 0
src/components/notificationDetailsParts/waterSafetyInformation.vue

@@ -0,0 +1,519 @@
+<template>
+  <div class="ship-info-form">
+    <el-collapse v-model="activeNames">
+      <el-collapse-item title="水上交通安全通报信息" name="1" :border="false">
+        <el-form
+          v-for="(item, index) in noticeItems"
+          :key="index"
+          :ref="(el) => noticeFormRefs[index] = el"
+          :model="item"
+          :rules="formRules"
+          label-width="160px"
+          size="default"
+          class="notice-form"
+        >
+          <!-- 通报信息标题 + 删除按钮 -->
+          <div class="notification-header">
+            <div class="notification-matters">{{ '通报信息' + (index + 1) }}</div>
+            <!-- 删除按钮:仅当表单数量 > 1 时显示 -->
+            <el-button
+              v-if="noticeItems.length > 1"
+              type="danger"
+              text
+              size="small"
+              :icon="Delete"
+              @click="handleDelete(index)"
+            >
+              删除
+            </el-button>
+          </div>
+
+          <!-- 通报事项 -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="通报事项" prop="noticeItem" required>
+                <el-input
+                  v-model="item.noticeItem"
+                  placeholder="请填写通报事项"
+                  maxlength="500"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 通报标准或具体行为 -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="通报标准或具体行为" prop="noticeStandard" required>
+                <el-input
+                  v-model="item.noticeStandard"
+                  placeholder="请输入通报依据,内容1000字以内"
+                  maxlength="1000"
+                  show-word-limit
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 通报类别(单选框) -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="通报类别" prop="noticeType" required>
+                <el-radio-group v-model="item.noticeType">
+                  <el-radio label="info" border>信息告知类</el-radio>
+                  <el-radio label="assist" border>协助处置类</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 水上交通安全信息(多行文本) -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="水上交通安全信息" prop="safetyInfo" required>
+                <el-input
+                  v-model="item.safetyInfo"
+                  type="textarea"
+                  :rows="4"
+                  placeholder="违法违规信息(内容3000字以内)"
+                  maxlength="3000"
+                  show-word-limit
+                />
+                <div class="example-text mt-1 text-primary">
+                  通报标准1:具体行为列举<br>
+                  具体的业务描述XXXXXX
+                </div>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 接收单位名称(下拉选择) -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="接收单位名称" prop="receiveUnit" required>
+                <el-select
+                  v-model="item.receiveUnit"
+                  placeholder="请选择单位名称"
+                  style="width: 100%"
+                >
+                  <el-option label="单位名称1" value="unit1" />
+                  <el-option label="单位名称2" value="unit2" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 行业外分类和接收单位 -->
+          <el-row :gutter="24" class="industry-row">
+            <el-col :span="6">
+              <el-form-item label="行业外分类" prop="industryType">
+                <el-select
+                  v-model="item.industryType"
+                  placeholder="请选择行业外分类"
+                >
+                  <el-option label="海警机构" value="marine" />
+                  <el-option label="公安机关" value="public" />
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="18">
+              <el-form-item label="行业外接收单位名称" prop="otherUnit">
+                <el-input
+                  v-model="item.otherUnit"
+                  placeholder="请输入行业外接收单位名称 如:XXX1海警机构,XXX2海警机构,XX公安机关"
+                  maxlength="200"
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 上传附件区域 -->
+          <el-row :gutter="24" class="upload-area">
+            <el-col :span="24">
+              <div class="upload-cards">
+                <div class="upload-card">
+                  <div class="card-title">行政处罚决定</div>
+                  <el-upload
+                    class="upload-demo"
+                    drag
+                    action="#"
+                    multiple
+                    :before-upload="beforeUpload"
+                  >
+                    <el-icon class="el-icon-upload"><UploadFilled /></el-icon>
+                    <div class="el-upload__text">点击上传文件</div>
+                  </el-upload>
+                </div>
+                <div class="upload-card">
+                  <div class="card-title">通报事项的相关证据 <span class="required-mark">*</span></div>
+                  <el-upload
+                    class="upload-demo"
+                    drag
+                    action="#"
+                    multiple
+                    :before-upload="beforeUpload"
+                  >
+                    <el-icon class="el-icon-upload"><UploadFilled /></el-icon>
+                    <div class="el-upload__text">点击上传文件</div>
+                  </el-upload>
+                </div>
+                <div class="upload-card">
+                  <div class="card-title">通报事项的其他材料</div>
+                  <el-upload
+                    class="upload-demo"
+                    drag
+                    action="#"
+                    multiple
+                    :before-upload="beforeUpload"
+                  >
+                    <el-icon class="el-icon-upload"><UploadFilled /></el-icon>
+                    <div class="el-upload__text">点击上传文件</div>
+                  </el-upload>
+                </div>
+                <div class="upload-tip text-danger">
+                  提示:目前支持的文件格式:*.gif, *.jpeg, *.jpg, *.png, *.rar, *.zip, *.doc, *.ppt, *.xls, *.pdf, *.docx *.xlsx, *.bmp, *.xml,*.ofd,*.wps。文件大小支持:100M以内。
+                </div>
+              </div>
+            </el-col>
+          </el-row>
+
+          <!-- 安全管理建议 -->
+          <el-row :gutter="24" class="mt-4">
+            <el-col :span="24">
+              <el-form-item label="安全管理建议" prop="safetySuggestion" required>
+                <el-input
+                  v-model="item.safetySuggestion"
+                  type="textarea"
+                  :rows="2"
+                  placeholder="安全管理建议(内容200字以内)"
+                  maxlength="200"
+                  show-word-limit
+                />
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 安全管理建议附件 -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="安全管理建议附件">
+                <el-upload
+                  class="upload-demo mt-2"
+                  action="#"
+                  multiple
+                  :before-upload="beforeUpload"
+                >
+                  <el-button size="small" type="primary">上传文件</el-button>
+                </el-upload>
+              </el-form-item>
+              <div class="upload-tip text-danger text-sm">
+                提示:目前支持的文件格式:*.gif, *.jpeg, *.jpg, *.png, *.rar, *.zip, *.doc, *.ppt, *.xls, *.pdf, *.docx *.xlsx, *.bmp, *.xml,*.ofd,*.wps。文件大小支持:100M以内。
+              </div>
+            </el-col>
+          </el-row>
+
+          <!-- 是否需要反馈 -->
+          <el-row :gutter="24">
+            <el-col :span="24">
+              <el-form-item label="是否需要反馈" prop="needFeedback" required>
+                <el-radio-group v-model="item.needFeedback" disabled>
+                  <el-radio label="no" border>否</el-radio>
+                  <el-radio label="yes" border>是</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <!-- 分隔线(区分多个通报事项) -->
+          <el-divider v-if="index !== noticeItems.length - 1" />
+        </el-form>
+
+        <!-- 添加通报事项按钮 -->
+        <div class="add-matters">
+          <el-button type="primary" plain :icon="Plus" @click="addNoticeItem">添加通报事项</el-button>
+        </div>
+      </el-collapse-item>
+    </el-collapse>
+  </div>
+</template>
+
+<script setup lang="ts">
+import { ref, reactive, defineEmits, defineExpose } from 'vue';
+import type { FormInstance, FormRules } from 'element-plus';
+import { UploadFilled, Plus, Delete } from '@element-plus/icons-vue';
+import { ElMessage } from 'element-plus';
+
+const activeNames = ref(['1']);
+
+const noticeItems = ref([
+  {
+    noticeItem: '',
+    noticeStandard: '',
+    noticeType: 'info',
+    safetyInfo: '',
+    receiveUnit: '',
+    industryType: '',
+    otherUnit: '',
+    safetySuggestion: '',
+    needFeedback: 'no'
+  },
+  {
+    noticeItem: '',
+    noticeStandard: '',
+    noticeType: 'info',
+    safetyInfo: '',
+    receiveUnit: '',
+    industryType: '',
+    otherUnit: '',
+    safetySuggestion: '',
+    needFeedback: 'no'
+  }
+]);
+
+const noticeFormRefs = ref<(FormInstance | undefined)[]>([]);
+
+const formRules = reactive<FormRules>({
+  noticeItem: [
+    { required: true, message: '请填写通报事项', trigger: 'blur' },
+    { max: 500, message: '长度不能超过500个字符', trigger: 'blur' }
+  ],
+  noticeStandard: [
+    { required: true, message: '请输入通报标准或具体行为', trigger: 'blur' },
+    { max: 1000, message: '长度不能超过1000个字符', trigger: 'blur' }
+  ],
+  noticeType: [
+    { required: true, message: '请选择通报类别', trigger: 'change' }
+  ],
+  safetyInfo: [
+    { required: true, message: '请填写水上交通安全信息', trigger: 'blur' },
+    { max: 3000, message: '长度不能超过3000个字符', trigger: 'blur' }
+  ],
+  receiveUnit: [
+    { required: true, message: '请选择接收单位名称', trigger: 'change' }
+  ],
+  otherUnit: [
+    { 
+      pattern: /^[\u4e00-\u9fa5a-zA-Z0-9,,\s]{0,200}$/, 
+      message: '请输入合法的单位名称(支持中文、字母、数字和逗号)', 
+      trigger: 'blur' 
+    }
+  ],
+  safetySuggestion: [
+    { required: true, message: '请填写安全管理建议', trigger: 'blur' },
+    { max: 200, message: '长度不能超过200个字符', trigger: 'blur' }
+  ],
+  needFeedback: [
+    { required: true, message: '请选择是否需要反馈', trigger: 'change' }
+  ]
+});
+
+const handleDelete = (index: number) => {
+  if (noticeItems.value.length <= 1) {
+    ElMessage.warning('至少保留一个通报事项');
+    return;
+  }
+  noticeItems.value.splice(index, 1);
+  noticeFormRefs.value.splice(index, 1);
+  noticeFormRefs.value = [];
+};
+
+const addNoticeItem = () => {
+  noticeItems.value.push({
+    noticeItem: '',
+    noticeStandard: '',
+    noticeType: 'info',
+    safetyInfo: '',
+    receiveUnit: '',
+    industryType: '',
+    otherUnit: '',
+    safetySuggestion: '',
+    needFeedback: 'no'
+  });
+  // 添加后表单实例会通过:ref自动绑定到noticeFormRefs
+};
+
+// 批量校验所有动态表单
+const validateForm = async () => {
+  let isAllValid = true;
+  const invalidForms: { formIndex: number; fields: any }[] = [];
+
+  for (let i = 0; i < noticeFormRefs.value.length; i++) {
+    const formRef = noticeFormRefs.value[i];
+    if (!formRef) continue;
+
+    try {
+      await formRef.validate();
+    } catch (error: any) {
+      isAllValid = false;
+      invalidForms.push({ formIndex: i, fields: error.fields });
+    }
+  }
+
+  emit('validate', isAllValid, invalidForms);
+  return isAllValid;
+};
+
+// 重置所有表单
+const resetAllForms = () => {
+  noticeFormRefs.value.forEach(formRef => {
+    formRef?.resetFields();
+  });
+};
+
+// 通知父组件校验结果
+const emit = defineEmits<{
+  (e: 'validate', isValid: boolean, invalidForms?: { formIndex: number; fields: any }[]): void;
+}>();
+
+// 暴露方法给父组件
+defineExpose({
+  validateForm,
+  resetAllForms
+});
+
+// 文件上传前校验(示例)
+const beforeUpload = (file: File) => {
+  console.log('文件上传前校验:', file.name);
+  return false; // 阻止默认上传,实际项目中替换为真实上传逻辑
+};
+</script>
+
+<style scoped lang="scss">
+.ship-info-form {
+  background: #fff;
+  border-radius: 8px;
+  padding: 20px;
+  box-shadow: 0 2px 12px rgba(0, 0, 0, 0.04);
+}
+
+// 折叠面板样式
+:deep .el-collapse-item__header {
+  color: #5070ae;
+  size: 24px;
+  background: linear-gradient(135deg, #d2e8ff, #fcfeff);
+	box-shadow: 0 8px 20px #fcfeff;
+	text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
+  padding-left: 20px;
+}
+
+:deep .el-collapse-item__content {
+  padding-top: 25px;
+}
+
+// 表单标题+删除按钮容器
+.notification-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 20px;
+}
+
+// 通报事项标题样式
+.notification-matters {
+  font-size: 20px;
+  color: #163a8a;
+  font-weight: 500;
+  margin-bottom: 0;
+}
+
+// 删除按钮样式
+:deep .el-button--text {
+  color: #f56c6c;
+  &:hover {
+    color: #ff4d4f;
+    background: rgba(245, 108, 108, 0.1);
+  }
+}
+
+// 表单样式
+.notice-form {
+  .el-form-item__label {
+    color: #333;
+    font-weight: 500;
+  }
+
+  .el-form-item {
+    align-items: center;
+    margin-bottom: 15px;
+  }
+
+  .example-text {
+    font-size: 14px;
+    line-height: 1.5;
+  }
+
+  .industry-row {
+    margin-top: 15px;
+  }
+
+  .upload-area {
+    margin: 20px 0;
+
+    .upload-tip {
+      font-size: 14px;
+      line-height: 1.5;
+      margin-bottom: 15px;
+    }
+
+    .upload-cards {
+      display: flex;
+      gap: 20px;
+      flex-wrap: wrap;
+
+      .upload-card {
+        flex: 1;
+        min-width: 250px;
+        border: 1px dashed #e0e0e0;
+        border-radius: 4px;
+        padding: 15px;
+
+        .card-title {
+          font-weight: 500;
+          margin-bottom: 10px;
+          color: #333;
+
+          .required-mark {
+            color: #f56c6c;
+          }
+        }
+      }
+    }
+  }
+
+  .upload-tip {
+    font-size: 14px;
+    line-height: 1.5;
+  }
+}
+
+// 上传组件样式
+:deep .el-upload--text {
+  .el-upload-dragger {
+    padding: 30px 0;
+  }
+}
+
+// 添加按钮样式
+.add-matters {
+  display: flex;
+  justify-content: center;
+  margin-top: 20px;
+}
+
+// 分隔线样式
+:deep .el-divider {
+  margin: 25px 0;
+  border-color: #f0f0f0;
+}
+
+// 响应式调整
+@media (max-width: 768px) {
+  .notice-form .upload-cards {
+    flex-direction: column;
+  }
+
+  .notification-matters {
+    font-size: 18px;
+  }
+}
+</style>

+ 102 - 102
src/permission.ts

@@ -26,108 +26,108 @@ router.beforeEach((to, from, next) => {
 			pageSize: 10,
 		};
 
-		to.meta.title && useSettingsStore().setTitle(to.meta.title);
-		/* has token*/
-		if (to.path === '/login') {
-			next({ path: '/' });
-			NProgress.done();
-		} else {
-			/* TODO 暂时隐藏登陆逻辑 */
-			// if (useUserStore().roles.length === 0) {
-			//     isRelogin.show = true;
-			//     // 判断当前用户是否已拉取完user_info信息
-			//     useUserStore()
-			//         .getInfo()
-			//         .then(() => {
-			//             isRelogin.show = false;
-			//             usePermissionStore()
-			//                 .generateRoutes()
-			//                 .then(accessRoutes => {
-			//                     // 根据roles权限生成可访问的路由表
-			//                     accessRoutes.forEach(route => {
-			//                         if (!isHttp(route.path)) {
-			//                             router.addRoute(route); // 动态添加可访问路由表
-			//                         }
-			//                     });
-			//                     next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
-			//                 });
-			//         })
-			//         .catch(err => {
-			//             useUserStore()
-			//                 .logOut()
-			//                 .then(() => {
-			//                     ElMessage.error(err);
-			//                     next({ path: '/' });
-			//                 });
-			//         });
-			// } else {
-			//     next();
-			// }
-			next();
-		}
-	}
-	next();
-	// else {
-	//     // 没有token
-	//     if (whiteList.indexOf(to.path) !== -1) {
-	//         // 在免登录白名单,直接进入
-	//         next();
-	//     } else if (to.fullPath.includes('code=')) {
-	//         const codeFromUrl = to.fullPath.split('=')[1];
-	//         callback(codeFromUrl).then((res: any) => {
-	//             setToken(res.token);
-	//             to.meta.title && useSettingsStore().setTitle(to.meta.title);
-	//             /* has token*/
-	//             if (to.path === '/login') {
-	//                 next({ path: '/' });
-	//                 NProgress.done();
-	//             } else {
-	//                 if (useUserStore().roles.length === 0) {
-	//                     isRelogin.show = true;
-	//                     // 判断当前用户是否已拉取完user_info信息
-	//                     useUserStore()
-	//                         .getInfo()
-	//                         .then(() => {
-	//                             isRelogin.show = false;
-	//                             usePermissionStore()
-	//                                 .generateRoutes()
-	//                                 .then(accessRoutes => {
-	//                                     // 根据roles权限生成可访问的路由表
-	//                                     accessRoutes.forEach(route => {
-	//                                         if (!isHttp(route.path)) {
-	//                                             router.addRoute(route); // 动态添加可访问路由表
-	//                                         }
-	//                                     });
-	//                                     next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
-	//                                 });
-	//                         })
-	//                         .catch(err => {
-	//                             useUserStore()
-	//                                 .logOut()
-	//                                 .then(() => {
-	//                                     ElMessage.error(err);
-	//                                     next({ path: '/' });
-	//                                 });
-	//                         });
-	//                 } else {
-	//                     next();
-	//                 }
-	//             }
-	//             next();
-	//         });
-	//     } else if (process.env.NODE_ENV === 'production') {
-	//         // 单点登录
-	//         if (to.fullPath.includes('manage')) {
-	//             next('/login');
-	//         } else {
-	//             location.href = `${import.meta.env.VITE_APP_BASE_API}/thirdPartyLogin`;
-	//         }
-	//     } else {
-	//         // next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
-	//         next('/login');
-	//         NProgress.done();
-	//     }
-	// }
+        to.meta.title && useSettingsStore().setTitle(to.meta.title);
+        /* has token*/
+        if (to.path === '/login') {
+            next({ path: '/' });
+            NProgress.done();
+        } else {
+            /* TODO 暂时隐藏登陆逻辑 */
+            // if (useUserStore().roles.length === 0) {
+            //     isRelogin.show = true;
+            //     // 判断当前用户是否已拉取完user_info信息
+            //     useUserStore()
+            //         .getInfo()
+            //         .then(() => {
+            //             isRelogin.show = false;
+            //             usePermissionStore()
+            //                 .generateRoutes()
+            //                 .then(accessRoutes => {
+            //                     // 根据roles权限生成可访问的路由表
+            //                     accessRoutes.forEach(route => {
+            //                         if (!isHttp(route.path)) {
+            //                             router.addRoute(route); // 动态添加可访问路由表
+            //                         }
+            //                     });
+            //                     next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
+            //                 });
+            //         })
+            //         .catch(err => {
+            //             useUserStore()
+            //                 .logOut()
+            //                 .then(() => {
+            //                     ElMessage.error(err);
+            //                     next({ path: '/' });
+            //                 });
+            //         });
+            // } else {
+            //     next();
+            // }
+            next();
+        }
+    } else {
+        // 暂时使用 待联调登陆的时候删除
+        next();
+        // 没有token
+        if (whiteList.indexOf(to.path) !== -1) {
+            // 在免登录白名单,直接进入
+            next();
+        } else if (to.fullPath.includes('code=')) {
+            const codeFromUrl = to.fullPath.split('=')[1];
+            callback(codeFromUrl).then((res: any) => {
+                setToken(res.token);
+                to.meta.title && useSettingsStore().setTitle(to.meta.title);
+                /* has token*/
+                if (to.path === '/login') {
+                    next({ path: '/' });
+                    NProgress.done();
+                } else {
+                    if (useUserStore().roles.length === 0) {
+                        isRelogin.show = true;
+                        // 判断当前用户是否已拉取完user_info信息
+                        useUserStore()
+                            .getInfo()
+                            .then(() => {
+                                isRelogin.show = false;
+                                usePermissionStore()
+                                    .generateRoutes()
+                                    .then(accessRoutes => {
+                                        // 根据roles权限生成可访问的路由表
+                                        accessRoutes.forEach(route => {
+                                            if (!isHttp(route.path)) {
+                                                router.addRoute(route); // 动态添加可访问路由表
+                                            }
+                                        });
+                                        next({ ...to, replace: true }); // hack方法 确保addRoutes已完成
+                                    });
+                            })
+                            .catch(err => {
+                                useUserStore()
+                                    .logOut()
+                                    .then(() => {
+                                        ElMessage.error(err);
+                                        next({ path: '/' });
+                                    });
+                            });
+                    } else {
+                        next();
+                    }
+                }
+                next();
+            });
+        } else if (process.env.NODE_ENV === 'production') {
+            // 单点登录
+            if (to.fullPath.includes('manage')) {
+                next('/login');
+            } else {
+                location.href = `${import.meta.env.VITE_APP_BASE_API}/thirdPartyLogin`;
+            }
+        } else {
+            // next(`/login?redirect=${to.fullPath}`); // 否则全部重定向到登录页
+            next('/login');
+            NProgress.done();
+        }
+    }
 });
 
 router.afterEach(() => {

+ 24 - 5
src/router/index.ts

@@ -127,18 +127,37 @@ export const constantRoutes: RouteRecordRaw[] = [
 		],
 	},
 	{
-		path: '/illegalSwitch',
+		path: '/myPublish',
 		component: Layout,
 		children: [
 			{
-				path: 'switch',
-				component: () => import('@/views/illegalInfoSwitch/index.vue'),
-				name: 'switch',
+				path: 'publish',
+				component: () => import('@/views/myPublish/index.vue'),
+				name: 'publish',
 				meta: { title: '我要发布', icon: 'user' },
 			},
+
+			{
+				path: 'addPublish',
+				component: () => import('@/views/myPublish/components/detail.vue'),
+				name: 'addPublish',
+				meta: { title: '新增发布', icon: 'user' },
+			}
 		],
 	},
 	{
+		path: '/notificationManageDetails',
+		component: Layout,
+		children: [
+			{
+				path: 'notificationDetails',
+				component: () => import('@/components/components/notificationManageDetails.vue'),
+				name: 'notificationDetails',
+				meta: { title: '新增发布', icon: 'user' },
+			}
+		]
+	},
+	{
 		path: '/notificationListManage',
 		component: Layout,
 		children: [
@@ -146,7 +165,7 @@ export const constantRoutes: RouteRecordRaw[] = [
 				path: 'notificationList',
 				component: () => import('@/views/InformationDisposalManage/index.vue'),
 				name: 'notificationList',
-				meta: { title: '信息处置管理', icon: 'user' },
+				meta: { title: '我的接收处置', icon: 'user' },
 			},
 		],
 	},

+ 0 - 95
src/views/InformationDisposalManage/config/detail.config.ts

@@ -7,10 +7,6 @@ const modalConfig = {
         rentalCompanyCode: [{ required: true, message: '请输入公司编码', trigger: 'change' }],
         rentalCompanyName: [{ required: true, message: '请输入公司名称', trigger: 'change' }],
         deptId: [{ required: true, message: '请选择关联部门', trigger: 'change' }],
-        calculationFormulaName: [{ required: true, message: '请输入费用计算公式', trigger: 'change' }],
-        // energyElectricIds: [{ required: true, message: '电能耗系统ID不能为空', trigger: 'select' }],
-        // energyGasIds: [{ required: true, message: '气能耗系统ID不能为空', trigger: 'select' }],
-        // energyWaterIds: [{ required: true, message: '水能耗系统ID不能为空', trigger: 'select' }],
     },
     formItems: [
         {
@@ -31,103 +27,12 @@ const modalConfig = {
             type: 'deptId',
             placeholder: '请选择关联部门',
         },
-        // {
-        //     label: '公司人员数',
-        //     prop: 'numberOfPersonnel',
-        //     type: 'number',
-        //     numberType: '1',
-        //     placeholder: '请输入人员数',
-        // },
-        // {
-        //     label: '密集架节数',
-        //     prop: 'shelving',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 0,
-        //     placeholder: '请输入密集架节数',
-        // },
-        // {
-        //     label: '能源单价标志',
-        //     prop: 'unitPriceSign',
-        //     type: 'unitPriceSign',
-        //     initialValue: '0',
-        // },
-        // {
-        //     label: '能源列表',
-        //     prop: 'energyList',
-        //     type: 'energyList',
-        // },
-        {
-            label: '电能耗系统ID(加)',
-            prop: 'energyElectricIds',
-            type: 'energyElectricIds',
-            placeholder: '请输入电能耗系统ID',
-        },
-        {
-            label: '电能耗系统ID(减)',
-            prop: 'energyElectricIdsMin',
-            type: 'energyElectricIdsMin',
-            placeholder: '请输入电能耗系统ID',
-        },
-        // {
-        //     label: '电能耗占比(%)',
-        //     prop: 'energyElectricExpense',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 100,
-        //     placeholder: '请输入电能耗占比',
-        // },
-        {
-            label: '气能耗系统ID(加)',
-            prop: 'energyGasIds',
-            type: 'energyGasIds',
-            placeholder: '请输入气能耗系统ID',
-        },
-        {
-            label: '气能耗系统ID(减)',
-            prop: 'energyGasIdsMin',
-            type: 'energyGasIdsMin',
-            placeholder: '请输入气能耗系统ID',
-        },
-        // {
-        //     label: '气能耗占比(%)',
-        //     prop: 'energyGasExpense',
-        //     type: 'number',
-        //     initialValue: 100,
-        //     numberType: '1',
-        //     placeholder: '请输入气能耗占比',
-        // },
-        {
-            label: '水能耗系统ID(加)',
-            prop: 'energyWaterIds',
-            type: 'energyWaterIds',
-            placeholder: '请输入水能耗系统ID',
-        },
-        {
-            label: '水能耗系统ID(减)',
-            prop: 'energyWaterIdsMin',
-            type: 'energyWaterIdsMin',
-            placeholder: '请输入水能耗系统ID',
-        },
-        // {
-        //     label: '水能耗占比(%)',
-        //     prop: 'energyWaterExpense',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 100,
-        //     placeholder: '请输入水能耗占比',
-        // },
         {
             label: '备注',
             prop: 'notes',
             type: 'input',
             placeholder: '请输入备注',
         },
-        {
-            label: '天费用计算公式',
-            prop: 'calculationFormulaName',
-            type: 'calculationFormulaName',
-        },
     ],
 };
 

+ 0 - 42
src/views/InformationDisposalManage/index.vue

@@ -7,48 +7,6 @@
                 <el-button type="primary" @click="handleAdd()"
                     v-hasPermi="['business:rentalCompany:add']">新增</el-button>
             </template>
-            <!-- 水 -->
-            <template #water="scope">
-                <div class="flex">
-                    <!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[0].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[0].valleyValueUnitPrice }}</span>
-                    </div> -->
-                    <div>
-                        平段单价:<span>{{ scope.row.energyList[0].averageUnitPrice }}</span>
-                    </div>
-                </div>
-            </template>
-            <!-- 电 -->
-            <template #electric="scope">
-                <div class="flex">
-                    <!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[1].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[1].valleyValueUnitPrice }}</span>
-                    </div> -->
-                    <div>
-                        平段单价:<span>{{ scope.row.energyList[1].averageUnitPrice }}</span>
-                    </div>
-                </div>
-            </template>
-            <!-- 燃气 -->
-            <template #coal="scope">
-                <div class="flex">
-                    <!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[2].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[2].valleyValueUnitPrice }}</span>
-                    </div> -->
-                    <div>
-                        平段单价:<span>{{ scope.row.energyList[2].averageUnitPrice }}</span>
-                    </div>
-                </div>
-            </template>
             <template #operate="scope">
                 <el-button type="primary" link @click="handleEdit(scope.row.rentalCompanyId)"
                     v-hasPermi="['business:rentalCompany:edit']">

+ 0 - 322
src/views/illegalInfoSwitch/components/detail.vue

@@ -1,322 +0,0 @@
-<template>
-	<div class="modal">
-		<el-dialog v-model="props.isVisible" width="70%" left :close-on-click-modal="false" @close="onCancel">
-			<template #header>
-				<div class="dialog-header">{{ props.title }}</div>
-			</template>
-			<el-collapse accordion v-model="activeNames">
-				<el-collapse-item name="1">
-					<template #title>
-						<div class="collapse-title">发布单位信息</div>
-					</template>
-					<el-row class="collapse-item-body collapse-item-body-header">
-						<el-col :span="12">发布单位:{{ release_unit_info.name }} </el-col>
-						<el-col :span="12">发布日期:{{ release_unit_info.time }} </el-col>
-						<el-col :span="24">{{ release_unit_info.info }}</el-col>
-					</el-row>
-				</el-collapse-item>
-				<el-collapse-item name="2">
-					<template #title>
-						<div class="collapse-title">涉事主体基本信息</div>
-					</template>
-					<el-row class="collapse-item-body">
-						<div class="form">
-							<el-form
-								ref="ruleFormRef"
-								label-suffix=":"
-								:rules="formRules"
-								:model="formData"
-								label-width="140px"
-								size="large"
-							>
-								<el-row>
-									<el-col :span="6">
-										<el-form-item label="发布单位" prop="release_unit">
-											<el-input
-												:disabled="true"
-												v-model="formData.release_unit"
-												placeholder="请输入发布单位"
-											/>
-										</el-form-item>
-									</el-col>
-									<el-col :span="6">
-										<el-form-item label="创建日期" prop="createDate">
-											<el-input :disabled="true" v-model="formData.createDate" placeholder="请输入创建日期" />
-										</el-form-item>
-									</el-col>
-									<el-col :span="6">
-										<el-form-item label="创建人员" prop="creater">
-											<el-input :disabled="true" v-model="formData.creater" placeholder="请输入创建人员" />
-										</el-form-item>
-									</el-col>
-									<el-col :span="6">
-										<el-form-item label="发布状态" prop="send_status">
-											<el-select
-												v-model="formData.send_status"
-												placeholder="请选择发布状态"
-												style="width: 100%"
-												:disabled="true"
-											>
-												<template v-for="(val, index) in sendStatusOptions" :key="index">
-													<el-option :value="val.value" :label="val.label" />
-												</template>
-											</el-select> </el-form-item
-									></el-col>
-								</el-row>
-								<el-row>
-									<el-col :span="8">
-										<el-form-item label="通报类型" prop="report_type">
-											<el-select
-												v-model="formData.report_type"
-												placeholder="请选择通报类型"
-												style="width: 100%"
-											>
-												<template v-for="(val, index) in reportTypeOptions" :key="index">
-													<el-option :value="val.value" :label="val.label" />
-												</template>
-											</el-select>
-										</el-form-item>
-									</el-col>
-									<el-col :span="8">
-										<el-form-item label="通报事件类别" prop="report_event_type">
-											<el-select
-												v-model="formData.report_event_type"
-												placeholder="请选择通报事件类别"
-												style="width: 100%"
-											>
-												<template v-for="(val, index) in reportEventTypeOptions" :key="index">
-													<el-option :value="val.value" :label="val.label" />
-												</template>
-											</el-select>
-										</el-form-item>
-									</el-col>
-									<el-col :span="8">
-										<el-form-item label="事项编号" prop="event_code">
-											<el-input v-model="formData.event_code" placeholder="请输入事项编号" />
-										</el-form-item>
-									</el-col>
-								</el-row>
-								<el-form-item label="通报事项" prop="report_event">
-									<el-input
-										v-model="formData.report_event"
-										maxlength="200"
-										show-word-limit
-										type="textarea"
-										placeholder="请输入通报事项,内容200字以内"
-									/>
-								</el-form-item>
-								<el-form-item label="通报标准或具体行为列举" prop="report_standard">
-									<el-input
-										v-model="formData.report_standard"
-										maxlength="1000"
-										show-word-limit
-										type="textarea"
-										autosize
-										placeholder="请输入通报标准或具体行为列举,内容200字以内"
-									/>
-								</el-form-item>
-								<el-form-item label="通报依据" prop="report_base">
-									<el-input
-										v-model="formData.report_base"
-										maxlength="200"
-										show-word-limit
-										autosize
-										type="textarea"
-										placeholder="请输入通报依据,内容200字以内"
-									/>
-								</el-form-item>
-								<el-form-item label="发出单位" prop="send_unit">
-									<el-select v-model="formData.send_unit" placeholder="请选择发出单位" style="width: 100%">
-										<template v-for="(val, index) in sendUnitOptions" :key="index">
-											<el-option :value="val.value" :label="val.label" />
-										</template>
-									</el-select>
-								</el-form-item>
-								<el-form-item label="接收单位" prop="receive_unit">
-									<el-input v-model="formData.receive_unit" placeholder="请输入择接收单位" />
-								</el-form-item>
-							</el-form>
-						</div>
-					</el-row>
-				</el-collapse-item>
-			</el-collapse>
-
-			<template #footer>
-				<span class="dialog-footer">
-					<el-button type="primary" @click="handleConfirmClick(ruleFormRef)">保存</el-button>
-					<el-button type="primary" @click="handleConfirmClick(ruleFormRef)">提交</el-button>
-					<el-button @click="onCancel()">返回</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script setup lang="ts" name="modal">
-import { reactive, ref } from 'vue';
-import type { FormInstance } from 'element-plus';
-import useSystemStore from '@/store/main';
-const activeNames = ref(['1']);
-const props = defineProps({
-	isVisible: {
-		type: Boolean,
-		default: false,
-	},
-	title: {
-		type: String,
-		default: '',
-	},
-});
-const release_unit_info = reactive<any>({
-	name: '交通运输部海事局',
-	time: '2025-07-24',
-	info: '根据《交通运输部办公厅关于印发<水上交通安全信息共享共治专项行动方案>的通知》(交办海涵(2024)448号),现将相关情况向你单位通报,请予以处理。',
-});
-type Emit = {
-	(e: 'update:isVisible', isVisible: boolean): void;
-};
-const emit = defineEmits<Emit>();
-
-const formData = reactive<any>({
-	release_unit: '交通运输部海事局',
-	createDate: '2025-07-28',
-	type: 'mobile',
-	creater: '张三',
-	send_status: 'inner',
-	report_type: '',
-	report_event_type: '',
-	event_code: '',
-	report_event: '',
-	report_standard: '',
-	report_base: '',
-	send_unit: '',
-	receive_unit: '',
-});
-const ruleFormRef = ref<FormInstance>();
-
-const systemStore = useSystemStore();
-
-const onCancel = () => {
-	resetForm();
-	emit('update:isVisible', false);
-};
-
-const resetForm = () => {
-	if (!ruleFormRef.value) return;
-	ruleFormRef.value.resetFields();
-};
-
-const formRules = {
-	report_type: [{ required: true, message: '请选择通报类型', trigger: 'select' }],
-	report_event_type: [{ required: true, message: '请选择通报类型', trigger: 'select' }],
-	report_event: [{ required: true, message: '请输入通报事项', trigger: 'change' }],
-	report_base: [{ required: true, message: '请输入通报依据', trigger: 'change' }],
-	send_unit: [{ required: true, message: '请选择发出单位', trigger: 'select' }],
-	receive_unit: [{ required: true, message: '请选择接收单位', trigger: 'change' }],
-	report_standard: [{ required: true, message: '请选择通报标准或具体行为列举', trigger: 'select' }],
-};
-
-// 通报类型
-const reportTypeOptions = [
-	{
-		label: '内部',
-		value: 'inner',
-	},
-	{
-		label: '外部',
-		value: 'outer',
-	},
-];
-// 通报事项类别
-const reportEventTypeOptions = [
-	{
-		label: '信息告知类',
-		value: 'msg',
-	},
-	{
-		label: '协助处理类',
-		value: 'assist',
-	},
-];
-// 发布状态
-const sendStatusOptions = [
-	{
-		label: '待发布',
-		value: 'inner',
-	},
-	{
-		label: '已发布',
-		value: 'outer',
-	},
-	{
-		label: '已结案',
-		value: 'outer',
-	},
-];
-// 发出单位
-const sendUnitOptions = [
-	{
-		label: '上海海事',
-		value: 'msg',
-	},
-	{
-		label: '广州海事',
-		value: 'assist',
-	},
-];
-
-// 点击确定
-function handleConfirmClick(formEl: FormInstance | undefined) {
-	if (!formEl) return;
-	formEl.validate((valid, fields) => {
-		if (valid) {
-		} else {
-			console.log('error submit!', fields);
-		}
-	});
-}
-</script>
-
-<style scoped lang="scss">
-.form {
-	padding: 10px 30px;
-}
-.form .el-input__wrapper {
-	width: 100% !important;
-}
-.dialog-header {
-	text-align: center;
-	color: #216abb;
-	font-size: larger;
-}
-.release-unit-item {
-	box-shadow: var(--el-box-shadow-light);
-}
-.collapse-title {
-	color: #0253b0;
-	width: 100%;
-	text-align: left;
-	font-size: 16px;
-	padding: 0px 15px;
-	height: 40px;
-	line-height: 40px;
-	background: linear-gradient(135deg, #d2e8ff, #fcfeff);
-	box-shadow: 0 8px 20px #fcfeff;
-	text-shadow: 0 2px 4px rgba(0, 0, 0, 0.3);
-}
-::v-deep .el-collapse-item {
-	box-shadow: var(--el-box-shadow-light);
-	margin-bottom: 10px;
-	padding: 10px;
-}
-::v-deep .el-collapse-item .el-collapse-item__content {
-	padding-bottom: 10px;
-}
-.collapse-item-body {
-	padding: 10px;
-}
-.collapse-item-body-header .el-col {
-	height: 40px;
-	font-size: 13px;
-}
-</style>

+ 0 - 150
src/views/illegalInfoSwitch/index.vue

@@ -1,150 +0,0 @@
-<template>
-	<div class="sensitive-words">
-		<pageSearch ref="searchTableRef" :searchConfig="searchConfig" />
-
-		<pageContent ref="tableListRef" :total="total" :contentConfig="contentConfig" :pageList="tableData">
-			<template #button>
-				<el-button type="primary" @click="handleAdd()">新增</el-button>
-				<el-button type="primary" @click="handleExport()">导出</el-button>
-			</template>
-			<template #operate="scope">
-				<el-button
-					type="primary"
-					link
-					@click="handleEdit(scope.row.rentalCompanyId)"
-					v-hasPermi="['business:rentalCompany:edit']"
-				>
-					编辑
-				</el-button>
-				<el-button
-					type="primary"
-					link
-					@click="handleDelete(scope.row.rentalCompanyId)"
-					v-hasPermi="['business:rentalCompany:remove']"
-				>
-					删除
-				</el-button>
-			</template>
-		</pageContent>
-		<pageDetail
-			v-model:isVisible="detailConfig.dialogVisible"
-			:title="detailConfig.dialogTitle"
-			:type="detailConfig.type"
-		>
-		</pageDetail>
-	</div>
-</template>
-
-<script setup lang="ts">
-import contentConfig from './config/content.config';
-import pageContent from '@/components/components/pageContent.vue';
-import searchConfig from './config/search.config';
-import pageSearch from '@/components/components/pageSearch.vue';
-import pageDetail from './components/detail.vue';
-import useSystemStore from '@/store/main';
-// 使用pinia数据
-const systemStore = useSystemStore();
-
-const total = ref(0);
-const pageSize = ref([10, 20, 30]);
-const tableData = ref([]);
-const tableListRef = ref();
-
-// 操作弹框
-import usePageModal from '@/components/components/hooks/usePageDetails';
-const { modalRef, handleNewDataClick, handleEditDataClick, handlePageDetail } = usePageModal();
-
-const handleEdit = async (id: string) => {
-	await handlePageDetail(id);
-	await handleEditDataClick();
-};
-
-// 新增按钮
-const detailConfig = reactive({
-	dialogVisible: false,
-	dialogTitle: '',
-	id: '',
-	type: 'add',
-});
-const handleAdd = (id: any) => {
-	detailConfig.type = 'add';
-	detailConfig.dialogTitle = '水上交通安全信息发布与处置完成管理 新增发布';
-	detailConfig.id = id;
-	detailConfig.dialogVisible = true;
-};
-const searchTableRef = ref();
-const onClickDeleta = async (row: any) => {
-	ElMessageBox.confirm('确认删除此条数据吗?', '删除', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(() => {
-		// 删除后的回调
-	});
-};
-// 删除按钮
-function handleDelete(value: any) {
-	ElMessageBox.confirm('是否删除这条数据?', '删除提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			systemStore.deletePageDataAction(contentConfig.pageName, value);
-		})
-		.catch(() => {
-			ElMessage({
-				type: 'info',
-				message: '取消删除',
-			});
-		});
-}
-
-// 导出
-function handleExport() {
-	ElMessageBox.confirm('是否导出所选数据?', '导出提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {})
-		.catch(() => {
-			ElMessage({
-				type: 'info',
-				message: '取消导出',
-			});
-		});
-}
-
-// 筛选-状态赋值
-async function searchItem() {
-	searchConfig.formItems.forEach(item => {
-		if (item.prop === 'status') {
-			// item.options = searchList.value;
-		}
-	});
-}
-searchItem();
-</script>
-
-<style scoped lang="scss">
-.sensitive-words {
-	margin: 20px;
-	// background-color: #fff;
-}
-
-.status {
-	cursor: pointer;
-	position: relative;
-
-	.status-tip {
-		position: absolute;
-		top: 2px;
-		left: 60px;
-	}
-}
-
-.dialog-tip {
-	text-align: center;
-}
-</style>

+ 0 - 441
src/views/leasingCompany/components/detail.vue

@@ -1,441 +0,0 @@
-<template>
-    <div class="modal">
-        <el-dialog v-model="dialogVisible" :title="dialogTitle" :width="modalConfig.dialogWidth || '40%'" center
-            @close="handleExcel(ruleFormRef)" :close-on-click-modal="false">
-            <div class="form">
-                <el-form ref="ruleFormRef" :rules="modalConfig.formRules" :model="formData"
-                    :label-width="modalConfig.labelWidth || '100px'" size="large">
-                    <template v-for="item in modalConfig.formItems" :key="item.prop">
-                        <el-form-item :label="item.label" :prop="item.prop">
-                            <template v-if="item.type === 'input'">
-                                <el-input :disabled="item.disabled" v-model="formData[item.prop]"
-                                    :placeholder="item.placeholder" />
-                            </template>
-                            <template v-if="item.type === 'number'">
-                                <el-input v-model="formData[item.prop]" type="number" :min="0" :max="999999999999"
-                                    :disabled="item.disabled" :placeholder="item.placeholder"
-                                    @blur="onBlur(formData[item.prop], item.prop, item.numberType)" />
-                            </template>
-                            <template v-if="item.type === 'select'">
-                                <el-select v-model="formData[item.prop]" :placeholder="item.placeholder"
-                                    style="width: 100%" :disabled="item.disabled">
-                                    <template v-for="(val, index) in item.options" :key="index">
-                                        <el-option :value="val.value" :label="val.label" />
-                                    </template>
-                                </el-select>
-                            </template>
-                            <template v-if="item.type === 'date-picker'">
-                                <el-date-picker :type="item.dateType || 'daterange'" range-separator="-"
-                                    start-placeholder="开始时间" end-placeholder="结束时间" v-model="formData[item.prop]"
-                                    :disabled="item.disabled" />
-                            </template>
-                            <!-- 关联部门 -->
-                            <template v-if="item.type === 'deptId'">
-                                <el-tree-select v-model="formData.deptId" :data="deptOptions"
-                                    @change="dapartTreeChange(formData.deptId)"
-                                    :props="{ value: 'deptId', label: 'deptName', children: 'children' }"
-                                    value-key="deptId" placeholder="选择上级部门" style="width: 100%" check-strictly
-                                    clearable />
-                            </template>
-                            <!-- 能源单价标志 -->
-                            <template v-if="item.type === 'unitPriceSign'">
-                                <el-radio-group v-model="formData.unitPriceSign"
-                                    @change="unitPriceChange(formData.unitPriceSign)">
-                                    <el-radio v-for="item in unitPriceOptions" :value="item.value"
-                                        :label="item.value">{{ item.label }}</el-radio>
-                                </el-radio-group>
-                            </template>
-                            <!-- 能源列表 -->
-                            <template v-if="item.type === 'energyList'">
-                                <!-- 能源单价标志为否的时候 -->
-                                <el-tabs v-if="formData.unitPriceSign === '2'" v-model="customEnergy" type="card"
-                                    class="demo-tabs">
-                                    <el-tab-pane v-for="item in formData.energyList" :key="item.energyUnitPriceId"
-                                        :label="item.energyName" :name="item.energyUnitPriceId">
-                                        <!-- <el-input
-                                            v-model="item.valleyValueUnitPrice"
-                                            placeholder="请输入谷值单价"
-                                            type="number"
-                                            :min="0"
-                                            :max="999999999999"
-                                        >
-                                            <template #prepend>谷值单价(元)</template>
-</el-input>
-<el-input v-model="item.peakUnitPrice" placeholder="请输入峰值单价" type="number" :min="0" :max="999999999999">
-    <template #prepend>峰值单价(元)</template>
-</el-input> -->
-                                        <el-input v-model="item.averageUnitPrice" placeholder="请输入平均单价" type="number"
-                                            :min="0" :max="999999999999">
-                                            <template #prepend>平段单价(元)</template>
-                                        </el-input>
-                                    </el-tab-pane>
-                                </el-tabs>
-
-                                <!-- 能源单价标志为是的时候 -->
-                                <el-tabs v-else v-model="initEnergy" type="card" class="demo-tabs">
-                                    <el-tab-pane v-for="item in initEnergyList" :key="item.energyUnitPriceId"
-                                        :label="item.energyName" :name="item.energyUnitPriceId">
-                                        <!-- <el-input
-                                            v-model="item.valleyValueUnitPrice"
-                                            placeholder="请输入谷值单价"
-                                            :disabled="true"
-                                        >
-                                            <template #prepend>谷值单价(元)</template>
-                                        </el-input>
-                                        <el-input v-model="item.peakUnitPrice" placeholder="请输入峰值单价" :disabled="true">
-                                            <template #prepend>峰值单价(元)</template>
-                                        </el-input> -->
-                                        <el-input v-model="item.averageUnitPrice" placeholder="请输入平均单价"
-                                            :disabled="true">
-                                            <template #prepend>平段单价(元)</template>
-                                        </el-input>
-                                    </el-tab-pane>
-                                </el-tabs>
-                            </template>
-                            <!-- 计算公式 -->
-                            <template v-if="item.type === 'calculationFormulaName'">
-                                <Formula :dictType="dictType" @getValue="getValue"></Formula>
-                            </template>
-                            <!-- 电能耗系统ID(加) -->
-                            <template v-if="item.type === 'energyElectricIds'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in elecEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                            <!-- 电能耗系统ID(减) -->
-                            <template v-if="item.type === 'energyElectricIdsMin'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in elecEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                            <!-- 气能耗系统ID(加) -->
-                            <template v-if="item.type === 'energyGasIds'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in gasEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                            <!-- 气能耗系统ID(减) -->
-                            <template v-if="item.type === 'energyGasIdsMin'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in gasEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                            <!-- 水能耗系统ID(加) -->
-                            <template v-if="item.type === 'energyWaterIds'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in waterEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                            <!-- 水能耗系统ID(减) -->
-                            <template v-if="item.type === 'energyWaterIdsMin'">
-                                <el-select v-model="formData[item.prop]" multiple filterable remote reserve-keyword
-                                    :disabled="item.disabled" style="width: 100%">
-                                    <el-option v-for="item in waterEnerty" :key="item.value" :label="item.label"
-                                        :value="item.value" />
-                                </el-select>
-                            </template>
-                        </el-form-item>
-                    </template>
-                </el-form>
-            </div>
-            <template #footer>
-                <span class="dialog-footer">
-                    <el-button @click="handleExcel(ruleFormRef)">取消</el-button>
-                    <el-button type="primary" @click="handleConfirmClick(ruleFormRef)">确定</el-button>
-                    <slot name="button"></slot>
-                </span>
-            </template>
-        </el-dialog>
-    </div>
-</template>
-
-<script setup lang="ts" name="modal">
-import { reactive, ref } from 'vue';
-import type { FormInstance, FormRules } from 'element-plus';
-import useSystemStore from '@/store/main';
-import { listDept } from '@/api/system/dept';
-import { ComponentInternalInstance } from 'vue';
-import cache from '@/plugins/cache';
-import Formula from '@/components/Formula/index.vue';
-import { outTypeList } from '@/libs/commonMeth';
-const elecEnerty = outTypeList('dh_ec_electricity');
-const gasEnerty = outTypeList('dh_ec_gas');
-const waterEnerty = outTypeList('dh_ec_water');
-// 定义props
-interface IProps {
-    modalConfig: {
-        pageName: string;
-        addTitle: string;
-        editTitle: string;
-        detailTitle: string;
-        dialogWidth: string;
-        labelWidth: string;
-        formItems: any[];
-        formRules: object;
-        pageListParams?: object; //新增一个对象,用来传给特殊的列表接口刷新页面(非必传)
-    };
-    otherInfo?: any;
-}
-
-const props = defineProps<IProps>();
-
-const dialogVisible = ref(false);
-const isEdit = ref(false);
-
-const ruleFormRef = ref<FormInstance>();
-
-const systemStore = useSystemStore();
-
-const { pageDetailInfo, pageOperateType } = storeToRefs(systemStore);
-import { energyUnitPrice } from '@/api/leasingCompany';
-import { matchStringAndFormat } from '@/utils/commonMeth';
-
-// 获取字段
-const dictType = 'dh_company_independent_energy_costs_calculation_formula_value';
-// 组合两个字典数组
-let fieldNameList = ref([] as any);
-// 获取费用计算公式组件的数据
-const getValue = (calculationFormulaName, dictList, globalList) => {
-    formData.value.calculationFormulaName = calculationFormulaName;
-    fieldNameList.value = [...dictList.value, ...globalList.value];
-};
-// 父组件的值
-const formulaValue = ref('初始值') as any;
-provide('calculationFormulaName', formulaValue);
-
-// 重置数据
-const handleClearDate = () => {
-    // 重置父组件的值
-    formData.value.calculationFormulaName = '';
-    // 重置子组件的值
-    formulaValue.value = +new Date();
-};
-// ---------------------费用总计 结束----------------------
-
-onMounted(async () => {
-    await getListDept();
-    await getEnergyUnitPrice();
-});
-
-// 获取能源单价
-const getEnergyUnitPrice = () => {
-    energyUnitPrice().then((res: any) => {
-        initEnergyList.value = res.rows;
-        initEnergy.value = res.rows[0].energyUnitPriceId;
-    });
-};
-
-// 部门树形数据
-const deptOptions = ref<any[]>([]);
-const departTree = ref([]);
-const { proxy } = getCurrentInstance() as ComponentInternalInstance;
-const getListDept = async () => {
-    // 获取关联部门列表
-    await listDept().then(response => {
-        departTree.value = response.data;
-        deptOptions.value = proxy!.handleTree(response.data, 'deptId');
-    });
-};
-// 部门树形的chang事件
-const dapartTreeChange = id => {
-    departTree.value.forEach((item: any) => {
-        if (item.deptId === id) {
-            formData.value.numberOfPersonnel = item.numberOfPersonnel;
-        }
-    });
-    console.log(formData.value.numberOfPersonnel);
-};
-// 能源单价标志
-const unitPriceOptions = [
-    {
-        label: '是',
-        value: '0',
-    },
-    {
-        label: '否',
-        value: '2',
-    },
-];
-// 水电燃气单价
-const customEnergy = ref('1');
-const initEnergyList = ref([] as any);
-const initEnergy = ref('1');
-// 能源单价标志的change事件
-const unitPriceChange = async (e: string) => {
-    customEnergy.value = '1';
-    initEnergy.value = '1';
-    console.log(formData.value.energyList);
-
-    await getEnergyUnitPrice();
-};
-// ----------------------------------------------------------------
-// 定义数据绑定
-const initialForm: any = {};
-for (const item of props.modalConfig.formItems) {
-    initialForm[item.prop] = item.initialValue ?? '';
-}
-
-let formData = ref(JSON.parse(JSON.stringify(initialForm)));
-
-const dialogTitle = ref();
-const initData = ref({});
-// 新建或者编辑
-async function setDialogVisible(isNew: boolean = true, check: boolean = false) {
-    await getEnergyUnitPrice();
-    dialogVisible.value = true;
-    ruleFormRef.value?.resetFields();
-    // 清空数据
-    handleClearDate();
-    await nextTick();
-    if (!isNew) {
-        watch(pageDetailInfo, newVal => {
-            formData.value = pageDetailInfo.value;
-            console.log(formData.value);
-            // 赋值
-            formulaValue.value = formData.value.calculationFormulaName;
-        });
-
-        customEnergy.value = '1';
-        initEnergy.value = '1';
-
-        // 判断如果不是新增的话就获取store中的详情
-        if (check) {
-            dialogTitle.value = props.modalConfig.detailTitle;
-            systemStore.getDetailType('detail');
-        } else {
-            dialogTitle.value = props.modalConfig.editTitle;
-            systemStore.getDetailType('edit');
-        }
-    } else {
-        props.modalConfig.formItems.map((m: any) => {
-            if (m.numberType === '2') {
-                if (m.porp === initialForm[m.porp]) {
-                    initialForm[m.prop] = (0.0).toFixed(2);
-                }
-            } else if (m.numberType === '1') {
-                if (m.porp === initialForm[m.porp]) {
-                    initialForm[m.prop] = Math.trunc(0);
-                }
-            }
-        });
-        formData.value = JSON.parse(JSON.stringify(initialForm));
-        await nextTick();
-        setTimeout(() => {
-            formData.value.energyList = initEnergyList.value;
-        }, 500);
-        customEnergy.value = '1';
-        initEnergy.value = '1';
-        dialogTitle.value = props.modalConfig.addTitle;
-        systemStore.detailPageEval(initialForm);
-        systemStore.getDetailType('add');
-    }
-    isEdit.value = !isNew;
-}
-// 点击确定
-function handleConfirmClick(formEl: FormInstance | undefined) {
-    if (!formEl) return;
-    formEl.validate((valid, fields) => {
-        if (valid) {
-            // 费用计算公式数据处理
-            // formData.value.calculationFormula = formData.value.calculationFormulaName
-            formData.value.calculationFormula = matchStringAndFormat(
-                formData.value.calculationFormulaName,
-                fieldNameList.value
-            );
-            dialogVisible.value = false;
-            let data = { ...formData.value };
-            data.energyList.forEach((item, index) => {
-                initEnergyList.value.forEach((row, d) => {
-                    if (index === d) {
-                        item.energyUnitPriceId = row.energyUnitPriceId;
-                    }
-                });
-            });
-            if (props.otherInfo) {
-                data = { ...data, ...props.otherInfo };
-            }
-            if (!isEdit.value) {
-                systemStore.newPageDataAction(
-                    props.modalConfig.pageName,
-                    data,
-                    props.modalConfig.pageListParams
-                );
-            } else {
-                if (pageOperateType.value === 'edit') {
-                    systemStore.editPageDataAction(
-                        props.modalConfig.pageName,
-                        data,
-                        props.modalConfig.pageListParams
-                    );
-                }
-            }
-        } else {
-            console.log('error submit!', fields);
-        }
-    });
-}
-// 取消
-function handleExcel(formEl: FormInstance | undefined) {
-    dialogVisible.value = false;
-    if (!formEl) return;
-    formEl.resetFields();
-}
-
-// 获取详情
-function onPageDetail(urlId: number | [] | string) {
-    systemStore.detailPageDataAction(props.modalConfig.pageName, urlId);
-}
-
-function onBlur(e: any, prop: any, type: any) {
-    let a = 0;
-    if (type === '1') {
-        if (e < 0) {
-            e = 0;
-        } else if (e > 999999999999999) {
-            e = 999999999999999;
-        }
-        a = Math.trunc(e);
-        for (const item of props.modalConfig.formItems) {
-            if (item.type === 'number') {
-                if (prop === item.prop) {
-                    formData.value[item.prop] = a;
-                }
-            }
-        }
-    } else if (type === '2') {
-        if (e < 0) {
-            e = 0.0;
-        } else if (e > 999999999999999) {
-            e = 999999999999999.0;
-        }
-        a = Number(Number(e).toFixed(2));
-        for (const item of props.modalConfig.formItems) {
-            if (item.type === 'number') {
-                if (prop === item.prop) {
-                    formData.value[item.prop] = a;
-                }
-            }
-        }
-    }
-}
-defineExpose({
-    setDialogVisible,
-    onPageDetail,
-});
-</script>
-
-<style scoped lang="scss">
-.form {
-    padding: 10px 30px;
-}
-</style>

+ 0 - 32
src/views/leasingCompany/config/content.config.ts

@@ -1,32 +0,0 @@
-const contentConfig = {
-    pageName: 'rentalCompany',
-    header: {
-        title: '费用输入列表',
-    },
-    propsList: [
-        // { type: 'index', label: '序号' },
-        { type: 'normal', label: '公司编码', prop: 'rentalCompanyCode', fixed: true },
-        { type: 'normal', label: '公司名称', prop: 'rentalCompanyName', width: 140 },
-        { type: 'normal', label: '关联部门', prop: 'deptName', width: 140 },
-        // { type: 'normal', label: '人员数', prop: 'numberOfPersonnel', width: 80 },
-        // { type: 'normal', label: '密集架节数', prop: 'shelving', width: 90 },
-        // { type: 'custom', label: '水单价(元)', slotName: 'water', prop: 'water', width: 220 },
-        // { type: 'custom', label: '电单价(元)', slotName: 'electric', prop: 'electric', width: 220 },
-        // { type: 'custom', label: '燃气单价(元)', slotName: 'coal', prop: 'coal', width: 220 },
-        { type: 'normal', label: '电能耗系统(加)', prop: 'energyElectricName', width: 140 },
-        { type: 'normal', label: '电能耗系统(减)', prop: 'energyElectricNameMin', width: 140 },
-        // { type: 'normal', label: '电能耗占比(%)', prop: 'energyElectricExpense', width: 140 },
-        { type: 'normal', label: '气能耗系统(加)', prop: 'energyGasName', width: 140 },
-        { type: 'normal', label: '气能耗系统(减)', prop: 'energyGasNameMin', width: 140 },
-        // { type: 'normal', label: '气能耗占比(%)', prop: 'energyGasExpense', width: 140 },
-        { type: 'normal', label: '水能耗系统(加)', prop: 'energyWaterName', width: 140 },
-        { type: 'normal', label: '水能耗系统(减)', prop: 'energyWaterNameMin', width: 140 },
-        // { type: 'normal', label: '水能耗占比(%)', prop: 'energyWaterExpense', width: 140 },
-        { type: 'normal', label: '创建时间', prop: 'createTime', width: 180 },
-        { type: 'normal', label: '修改时间', prop: 'updateTime', width: 180 },
-        { type: 'normal', label: '备注', prop: 'notes', width: 140 },
-        { type: 'handler', label: '操作', slotName: 'operate', width: 180 },
-    ],
-};
-
-export default contentConfig;

+ 0 - 134
src/views/leasingCompany/config/detail.config.ts

@@ -1,134 +0,0 @@
-const modalConfig = {
-    pageName: 'rentalCompany',
-    addTitle: '新建租赁公司',
-    editTitle: '编辑租赁公司',
-    labelWidth: '150px',
-    formRules: {
-        rentalCompanyCode: [{ required: true, message: '请输入公司编码', trigger: 'change' }],
-        rentalCompanyName: [{ required: true, message: '请输入公司名称', trigger: 'change' }],
-        deptId: [{ required: true, message: '请选择关联部门', trigger: 'change' }],
-        calculationFormulaName: [{ required: true, message: '请输入费用计算公式', trigger: 'change' }],
-        // energyElectricIds: [{ required: true, message: '电能耗系统ID不能为空', trigger: 'select' }],
-        // energyGasIds: [{ required: true, message: '气能耗系统ID不能为空', trigger: 'select' }],
-        // energyWaterIds: [{ required: true, message: '水能耗系统ID不能为空', trigger: 'select' }],
-    },
-    formItems: [
-        {
-            label: '公司编码',
-            prop: 'rentalCompanyCode',
-            type: 'input',
-            placeholder: '请输入公司编码',
-        },
-        {
-            label: '公司名称',
-            prop: 'rentalCompanyName',
-            type: 'input',
-            placeholder: '请输入公司名称',
-        },
-        {
-            label: '关联部门',
-            prop: 'deptId',
-            type: 'deptId',
-            placeholder: '请选择关联部门',
-        },
-        // {
-        //     label: '公司人员数',
-        //     prop: 'numberOfPersonnel',
-        //     type: 'number',
-        //     numberType: '1',
-        //     placeholder: '请输入人员数',
-        // },
-        // {
-        //     label: '密集架节数',
-        //     prop: 'shelving',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 0,
-        //     placeholder: '请输入密集架节数',
-        // },
-        // {
-        //     label: '能源单价标志',
-        //     prop: 'unitPriceSign',
-        //     type: 'unitPriceSign',
-        //     initialValue: '0',
-        // },
-        // {
-        //     label: '能源列表',
-        //     prop: 'energyList',
-        //     type: 'energyList',
-        // },
-        {
-            label: '电能耗系统ID(加)',
-            prop: 'energyElectricIds',
-            type: 'energyElectricIds',
-            placeholder: '请输入电能耗系统ID',
-        },
-        {
-            label: '电能耗系统ID(减)',
-            prop: 'energyElectricIdsMin',
-            type: 'energyElectricIdsMin',
-            placeholder: '请输入电能耗系统ID',
-        },
-        // {
-        //     label: '电能耗占比(%)',
-        //     prop: 'energyElectricExpense',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 100,
-        //     placeholder: '请输入电能耗占比',
-        // },
-        {
-            label: '气能耗系统ID(加)',
-            prop: 'energyGasIds',
-            type: 'energyGasIds',
-            placeholder: '请输入气能耗系统ID',
-        },
-        {
-            label: '气能耗系统ID(减)',
-            prop: 'energyGasIdsMin',
-            type: 'energyGasIdsMin',
-            placeholder: '请输入气能耗系统ID',
-        },
-        // {
-        //     label: '气能耗占比(%)',
-        //     prop: 'energyGasExpense',
-        //     type: 'number',
-        //     initialValue: 100,
-        //     numberType: '1',
-        //     placeholder: '请输入气能耗占比',
-        // },
-        {
-            label: '水能耗系统ID(加)',
-            prop: 'energyWaterIds',
-            type: 'energyWaterIds',
-            placeholder: '请输入水能耗系统ID',
-        },
-        {
-            label: '水能耗系统ID(减)',
-            prop: 'energyWaterIdsMin',
-            type: 'energyWaterIdsMin',
-            placeholder: '请输入水能耗系统ID',
-        },
-        // {
-        //     label: '水能耗占比(%)',
-        //     prop: 'energyWaterExpense',
-        //     type: 'number',
-        //     numberType: '1',
-        //     initialValue: 100,
-        //     placeholder: '请输入水能耗占比',
-        // },
-        {
-            label: '备注',
-            prop: 'notes',
-            type: 'input',
-            placeholder: '请输入备注',
-        },
-        {
-            label: '天费用计算公式',
-            prop: 'calculationFormulaName',
-            type: 'calculationFormulaName',
-        },
-    ],
-};
-
-export default modalConfig;

+ 0 - 44
src/views/leasingCompany/config/search.config.ts

@@ -1,44 +0,0 @@
-interface Inew {
-    label: string;
-    value: string;
-}
-
-const searchConfig = {
-    pageName: 'rentalCompany',
-    formItems: [
-        // {
-        //     label: '状态',
-        //     prop: 'status',
-        //     type: 'select',
-        //     options: [] as Array<Inew>,
-        //     placeholder: '请选择状态',
-        // },
-        {
-            label: '公司编码',
-            prop: 'rentalCompanyCode',
-            type: 'input',
-            placeholder: '请输入公司编码',
-        },
-        {
-            label: '公司名称',
-            prop: 'rentalCompanyName',
-            type: 'input',
-            placeholder: '请输入公司名称',
-        },
-        {
-            label: '关联部门',
-            prop: 'deptName',
-            type: 'input',
-            placeholder: '请输入关联部门',
-        },
-        {
-            label: '创建时间',
-            prop: 'createDate',
-            type: 'date-picker',
-            placeholder: '请选择创建时间',
-        },
-   
-    ],
-};
-
-export default searchConfig;

+ 0 - 169
src/views/leasingCompany/index.vue

@@ -1,169 +0,0 @@
-<template>
-	<div class="sensitive-words">
-		<pageSearch ref="searchTableRef" :searchConfig="searchConfig" />
-
-		<pageContent ref="tableListRef" :total="total" :contentConfig="contentConfig" :pageList="tableData">
-			<template #button>
-				<el-button type="primary" @click="handleAdd()" v-hasPermi="['business:rentalCompany:add']"
-					>新增</el-button
-				>
-			</template>
-			<!-- 水 -->
-			<template #water="scope">
-				<div class="flex">
-					<!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[0].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[0].valleyValueUnitPrice }}</span>
-                    </div> -->
-					<div>
-						平段单价:<span>{{ scope.row.energyList[0].averageUnitPrice }}</span>
-					</div>
-				</div>
-			</template>
-			<!-- 电 -->
-			<template #electric="scope">
-				<div class="flex">
-					<!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[1].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[1].valleyValueUnitPrice }}</span>
-                    </div> -->
-					<div>
-						平段单价:<span>{{ scope.row.energyList[1].averageUnitPrice }}</span>
-					</div>
-				</div>
-			</template>
-			<!-- 燃气 -->
-			<template #coal="scope">
-				<div class="flex">
-					<!-- <div class="mr5">
-                        谷值:<span>{{ scope.row.energyList[2].peakUnitPrice }}</span>
-                    </div>
-                    <div class="mr5">
-                        峰值:<span>{{ scope.row.energyList[2].valleyValueUnitPrice }}</span>
-                    </div> -->
-					<div>
-						平段单价:<span>{{ scope.row.energyList[2].averageUnitPrice }}</span>
-					</div>
-				</div>
-			</template>
-			<template #operate="scope">
-				<el-button
-					type="primary"
-					link
-					@click="handleEdit(scope.row.rentalCompanyId)"
-					v-hasPermi="['business:rentalCompany:edit']"
-				>
-					编辑
-				</el-button>
-				<el-button
-					type="primary"
-					link
-					@click="handleDelete(scope.row.rentalCompanyId)"
-					v-hasPermi="['business:rentalCompany:remove']"
-				>
-					删除
-				</el-button>
-			</template>
-		</pageContent>
-		<pageDetail :modalConfig="detailConfig" ref="modalRef"> </pageDetail>
-	</div>
-</template>
-
-<script setup lang="ts">
-import { ComponentInternalInstance } from 'vue';
-// import { useRouter } from 'vue-router';
-import router from '@/router';
-import contentConfig from './config/content.config';
-import pageContent from '@/components/components/pageContent.vue';
-import searchConfig from './config/search.config';
-import pageSearch from '@/components/components/pageSearch.vue';
-import detailConfig from './config/detail.config';
-import pageDetail from './components/detail.vue';
-import useSystemStore from '@/store/main';
-// 使用pinia数据
-const systemStore = useSystemStore();
-const { pageDetailInfo } = storeToRefs(systemStore);
-
-const total = ref(0);
-const pageSize = ref([10, 20, 30]);
-const tableData = ref([]);
-const tableListRef = ref();
-
-// 操作弹框
-import usePageModal from '@/components/components/hooks/usePageDetails';
-const { modalRef, handleNewDataClick, handleEditDataClick, handleCheckDataClick, handlePageDetail } =
-	usePageModal();
-
-const handleEdit = async (id: string) => {
-	await handlePageDetail(id);
-	await handleEditDataClick();
-};
-
-// 新增按钮
-const handleAdd = () => {
-	handleNewDataClick();
-};
-const searchTableRef = ref();
-const onClickDeleta = async (row: any) => {
-	ElMessageBox.confirm('确认删除此条数据吗?', '删除', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(() => {
-		// 删除后的回调
-	});
-};
-// 删除按钮
-function handleDelete(value: any) {
-	ElMessageBox.confirm('是否删除这条数据?', '删除提示', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			systemStore.deletePageDataAction(contentConfig.pageName, value);
-		})
-		.catch(() => {
-			ElMessage({
-				type: 'info',
-				message: '取消删除',
-			});
-		});
-}
-
-// 筛选-状态赋值
-async function searchItem() {
-	searchConfig.formItems.forEach(item => {
-		if (item.prop === 'status') {
-			// item.options = searchList.value;
-		}
-	});
-}
-searchItem();
-</script>
-
-<style scoped lang="scss">
-.sensitive-words {
-	margin: 20px;
-	// background-color: #fff;
-}
-
-.status {
-	cursor: pointer;
-	position: relative;
-
-	.status-tip {
-		position: absolute;
-		top: 2px;
-		left: 60px;
-	}
-}
-
-.dialog-tip {
-	text-align: center;
-}
-</style>

+ 4 - 184
src/views/login.vue

@@ -1,9 +1,7 @@
 <template>
     <div class="login">
-        <!--  -->
         <el-form v-if="isFlag" ref="loginFirstRef" :model="loginForm" :rules="loginRules" class="login-form">
             <h3 class="title">中华人民共和国海事局</h3>
-            <!-- 步骤一 -->
             <el-form-item prop="username">
                 <el-input v-model="loginForm.username" type="text" size="large" auto-complete="off" placeholder="账号">
                     <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
@@ -15,21 +13,10 @@
                     <template #prefix><svg-icon icon-class="password" class="el-input__icon input-icon" /></template>
                 </el-input>
             </el-form-item>
-            <el-form-item prop="code" v-if="captchaEnabled">
-                <el-input v-model="loginForm.code" size="large" auto-complete="off" placeholder="验证码" style="width: 63%"
-                    @keyup.enter="handleAllLogin">
-                    <template #prefix><svg-icon icon-class="validCode" class="el-input__icon input-icon" /></template>
-                </el-input>
-                <div class="login-code">
-                    <img :src="codeUrl" @click="getCode" class="login-code-img" />
-                </div>
-            </el-form-item>
             <el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
             <el-form-item style="width: 100%">
                 <el-button :loading="loading" size="large" type="primary" style="width: 100%"
                     @click.prevent="handleAllLogin">
-                    <!-- <span v-if="!loading">登 录</span>
-                    <span v-else>登 录 中...</span> -->
                     登 录
                 </el-button>
                 <div style="float: right" v-if="register">
@@ -37,40 +24,6 @@
                 </div>
             </el-form-item>
         </el-form>
-        <!-- 步骤二 -->
-        <el-form v-else ref="loginRef" :model="loginForm" :rules="loginRules" class="login-form">
-            <h3 class="title">中华人民共和国海事局</h3>
-            <el-form-item prop="phone">
-                <el-input v-model="loginForm.phone" type="text" size="large" auto-complete="off" placeholder="手机号"
-                    :disabled="true">
-                    <template #prefix><svg-icon icon-class="user" class="el-input__icon input-icon" /></template>
-                </el-input>
-            </el-form-item>
-            <el-form-item style="width: 100%">
-                <div class="flex">
-                    <el-input v-model="loginForm.code" class="mr10" type="text" size="large" auto-complete="off"
-                        placeholder="请输入验证码">
-                        <template #prefix><svg-icon icon-class="validCode"
-                                class="el-input__icon input-icon" /></template>
-                    </el-input>
-                    <el-button size="large" type="primary" style="width: 30%" @click.prevent="getVerificationCode">
-                        {{ countdownText }}
-                    </el-button>
-                </div>
-            </el-form-item>
-            <el-form-item style="width: 100%">
-                <el-button :loading="loading" size="large" type="primary" style="width: 100%"
-                    @click.prevent="handleEndLogin">
-                    <span v-if="!loading">登 录</span>
-                    <span v-else>登 录 中...</span>
-                </el-button>
-            </el-form-item>
-        </el-form>
-
-        <!--  底部  -->
-        <!-- <div class="el-login-footer">
-            <span>Copyright © 2018-2023 ruoyi.vip All Rights Reserved.</span>
-        </div> -->
     </div>
 </template>
 
@@ -95,51 +48,18 @@ const loginForm = ref<any>({
 });
 
 const loginRules = {
-    username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
-    password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
-    code: [{ required: true, trigger: 'change', message: '请输入验证码' }],
+    // username: [{ required: true, trigger: 'blur', message: '请输入您的账号' }],
+    // password: [{ required: true, trigger: 'blur', message: '请输入您的密码' }],
+    // code: [{ required: true, trigger: 'change', message: '请输入验证码' }],
 };
 
-const codeUrl = ref('');
 const loading = ref(false);
-// 验证码开关
-const captchaEnabled = ref(true);
 // 注册开关
 const register = ref(false);
 const redirect = ref(undefined);
-const loginRef = ref<FormInstance>();
 const loginFirstRef = ref<FormInstance>();
 
-// -------------- 获取验证码 倒计时60秒 开始 ----------------
-const env = process.env.NODE_ENV;
 const isFlag = ref(true);
-let countdown = ref(60);
-const isCountingDown = ref(false);
-const countdownText = computed(() => {
-    return isCountingDown.value ? `${countdown.value}s 后重新获取` : '获取验证码';
-});
-const getVerificationCode = async () => {
-    if (!isCountingDown.value) {
-        await getPhoneCode({ uuid: loginForm.value.uuid }).then((res: any) => {
-            console.log(res);
-            if (res.code === 200) {
-                ElMessage.success('验证码发送成功');
-            } else {
-                ElMessage.error('验证码发送失败,请稍后重试');
-            }
-        });
-        isCountingDown.value = true;
-        countdown.value = 60;
-        const intervalId = setInterval(() => {
-            countdown.value--;
-            if (countdown.value <= 0) {
-                isCountingDown.value = false;
-                clearInterval(intervalId);
-            }
-        }, 1000);
-    }
-};
-
 const publicKey =
     'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdH\n' +
     'nzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==';
@@ -152,71 +72,7 @@ const privateKey =
     'DQIgIdhDTIqD2jfYjPTY8Jj3EDGPbH2HHuffvflECt3Ek60CIQCFRlCkHpi7hthh\n' +
     'YhovyloRYsM+IS9h/0BzlEAuO0ktMQIgSPT3aFAgJYwKpqRYKlLDVcflZFCKY7u3\n' +
     'UP8iWi1Qw0Y=';
-// -------------- 获取验证码 倒计时60秒 end ----------------
-// 有下一步的登陆
-const handleNext = () => {
-    loginFirstRef.value?.validate(valid => {
-        if (valid) {
-            loading.value = true;
-            // 勾选了需要记住密码设置在 cookie 中设置记住用户名和密码
-            if (loginForm.value.rememberMe) {
-                Cookies.set('username', loginForm.value.username, { expires: 30 });
-                const enPwd = encrypt(loginForm.value.password, publicKey);
-                // const enPwd = loginForm.value.password;
-                if (enPwd) {
-                    Cookies.set('password', enPwd, { expires: 30 });
-                }
-                if (loginForm.value.rememberMe) {
-                    Cookies.set('rememberMe', String(loginForm.value.rememberMe), { expires: 30 });
-                }
-            } else {
-                // 否则移除
-                Cookies.remove('username');
-                Cookies.remove('password');
-                Cookies.remove('rememberMe');
-            }
-            // 调用action的登录方法
-            userStore
-                .phoneLogin(loginForm.value)
-                .then((res: any) => {
-                    console.log(res);
-                    // router.push({ path: redirect.value || '/' });
-                    isFlag.value = false;
-                    loading.value = false;
-                    loginForm.value.code = '';
-                    loginForm.value.uuid = res.uuid;
-                    loginForm.value.phone = res.phone;
-                })
-                .catch(() => {
-                    loading.value = false;
-                    // 重新获取验证码
-                    if (captchaEnabled.value) {
-                        getCode();
-                    }
-                });
-        }
-    });
-};
-
-// 有下一步的最后一步
-const handleEndLogin = () => {
-    userStore
-        .phoneLogin(loginForm.value)
-        .then((res: any) => {
-            if (res.token) {
-                ElMessage.success('登陆成功');
-                router.push({ path: redirect.value || '/' });
-            } else {
-                ElMessage.error('登陆失败');
-            }
-            loading.value = false;
-        })
-        .catch(() => {
-            loading.value = false;
-        });
-};
 
-// 无下一步的登陆
 function handleLogin() {
     loginFirstRef.value?.validate(valid => {
         if (valid) {
@@ -245,10 +101,6 @@ function handleLogin() {
                 })
                 .catch(() => {
                     loading.value = false;
-                    // 重新获取验证码
-                    if (captchaEnabled.value) {
-                        getCode();
-                    }
                 });
         }
     });
@@ -256,52 +108,20 @@ function handleLogin() {
 
 // 登陆按钮
 const handleAllLogin = () => {
-    // 本地
-    // if (env === 'development') {
-    //     handleLogin();
-    // } else {
-    //     handleNext();
-    // }
-    // handleNext();
-    if (phoneCaptchaEnabled.value) {
-        handleNext();
-    } else {
-        handleLogin();
-    }
+    handleLogin();
 };
 
-// 是否有手机号
-const phoneCaptchaEnabled = ref(false);
-function getCode() {
-    getCodeImg().then((res: any) => {
-        captchaEnabled.value = res.captchaEnabled === undefined ? true : res.captchaEnabled;
-        phoneCaptchaEnabled.value = res.phoneCaptchaEnabled;
-        if (captchaEnabled.value) {
-            codeUrl.value = 'data:image/gif;base64,' + res.img;
-            loginForm.value.uuid = res.uuid;
-        }
-    });
-}
-
 function getCookie() {
     const username = Cookies.get('username');
     const password = Cookies.get('password');
     const rememberMe = Cookies.get('rememberMe');
-    // let publicKey = '';
-
-    // getPublicKey().then((res: any) => {
-    //     publicKey = res.publicKey;
-    // });
-
     loginForm.value = {
         username: username === undefined ? loginForm.value.username : username,
         password: password === undefined ? loginForm.value.password : decrypt(password, privateKey) || '',
-        // password: password === undefined ? loginForm.value.password : password || '',
         rememberMe: rememberMe === undefined ? false : Boolean(rememberMe),
     };
 }
 
-getCode();
 getCookie();
 </script>
 

+ 128 - 0
src/views/myPublish/components/detail.vue

@@ -0,0 +1,128 @@
+<template>
+	<div class="form-page">
+		<div class="page-header">
+			<h2 class="page-title">{{ pageTitle }}</h2>
+		</div>
+
+		<!-- 发布单位信息 -->
+		<PublishUnitInformation class="mb20" />
+		<!-- 涉事主体基本信息 -->
+		<QuestionInformation />
+		<!-- 水上交通安全通报信息 -->
+		<WaterSafetyInformation ref="noticeChildRef" />
+		<!-- 底部按钮区 -->
+		<div class="form-actions">
+			<slot name="btn">
+				<el-button type="primary" @click="handleSubmit">保存</el-button>
+				<el-button type="primary" @click="handleSubmit">发布</el-button>
+				<el-button type="primary" @click="router.back">返回</el-button>
+			</slot>
+		</div>
+	</div>
+</template>
+
+<script setup lang="ts" name="CommonForm">
+import { ref, onMounted, onBeforeUnmount } from 'vue';
+import { useRoute, useRouter } from 'vue-router';
+import PublishUnitInformation from '@/components/notificationDetailsParts/publishUnitInformation.vue';
+import QuestionInformation from '@/components/notificationDetailsParts/questionInformation.vue';
+import WaterSafetyInformation from '@/components/notificationDetailsParts/waterSafetyInformation.vue';
+
+// --- 路由与Store ---
+const route = useRoute();
+const router = useRouter();
+
+const pageTitle = ref(''); // 页面标题
+const isDetail = ref(false); // 是否为详情模式
+const isEdit = ref(false); // 是否为编辑模式
+const noticeChildRef = ref<any>();
+
+onMounted(async () => {
+	const { type, id } = route.query;
+	try {
+		switch (type as string) {
+			case 'add':
+				pageTitle.value = '水上交通安全信息发布与处置完成管理 新增发布';
+				isEdit.value = false;
+				break;
+			case 'edit':
+				pageTitle.value = '水上交通安全信息发布与处置完成管理 编辑发布';
+				isEdit.value = true;
+				break;
+			case 'detail':
+				pageTitle.value = '水上交通安全信息发布与处置完成管理 查看发布';
+				isDetail.value = true;
+				break;
+			default:
+				throw new Error(`无效操作类型: ${type}`);
+		}
+	} catch (error) {
+		handleBack();
+	} finally {}
+});
+
+const handleBack = () => {
+	router.go(-1);
+};
+
+onBeforeUnmount(() => {
+	isDetail.value = false;
+	isEdit.value = false;
+});
+
+const handleSubmit = async () => {
+  // 调用子组件的校验方法
+  const isValid = await noticeChildRef.value.validateForm();
+  
+  if (isValid) {
+    console.log('校验通过,执行提交逻辑');
+  } else {
+    console.log('校验失败,请检查表单');
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.form-page {
+	padding: 20px;
+	background-color: #fff;
+}
+
+.page-header {
+	display: flex;
+	align-items: center;
+	justify-content: center;
+	width: 100%;
+	margin-bottom: 30px;
+
+	.page-title {
+		font-size: 22px;
+		font-weight: 500;
+		color: #5070ae;
+	}
+}
+
+.form-actions {
+	display: flex;
+	justify-content: center;
+	margin-top: 40px;
+	gap: 16px;
+
+	.el-button {
+		padding: 8px 24px;
+	}
+}
+
+// 响应式调整
+@media (max-width: 768px) {
+	.form-container {
+		padding: 15px;
+	}
+
+	.page-header {
+		flex-direction: column;
+		align-items: flex-start;
+		gap: 10px;
+	}
+}
+</style>

+ 3 - 3
src/views/illegalInfoSwitch/config/content.config.ts → src/views/myPublish/config/content.config.ts

@@ -1,10 +1,10 @@
 const contentConfig = {
-	pageName: 'rentalCompany',
+	pageName: 'released',
 	header: {
 		title: '',
 	},
 	propsList: [
-		{ type: 'index', label: '序号' },
+		{ type: 'index', label: '序号', fixed: true  },
 		{ type: 'normal', label: '违法事件编号', prop: 'illegal_event_code' },
 		{ type: 'normal', label: '发布单位', prop: 'send_unit', width: 140 },
 		{ type: 'normal', label: '船舶名称', prop: 'ship_name', width: 140 },
@@ -15,7 +15,7 @@ const contentConfig = {
 		{ type: 'custom', label: '是否需要反馈', prop: 'is_feedback', width: 220 },
 		{ type: 'normal', label: '发布日期', prop: 'createDate', width: 140 },
 		{ type: 'normal', label: '发布人员', prop: 'creater', width: 140 },
-		{ type: 'handler', label: '操作', slotName: 'operate', width: 180, fixed: true },
+		{ type: 'handler', label: '操作', slotName: 'operate', width: 180},
 	],
 };
 

+ 76 - 0
src/views/myPublish/config/detail.config.ts

@@ -0,0 +1,76 @@
+const modalConfig = {
+    pageName: 'rentalCompany',
+    addTitle: '新增行业内违法信息通报通讯录',
+    editTitle: '编辑行业内违法信息通报通讯录',
+    detailTitle: '查看行业内违法信息通报通讯录',
+    labelWidth: '150px',
+    formRules: {
+        rentalCompanyCode: [{ required: true, message: '请选择单位名称', trigger: 'change' }],
+        rentalCompanyName: [{ required: true, message: '请输入联络人名称', trigger: 'change' }],
+        deptId: [{ required: true, message: '请选择关联部门', trigger: 'change' }],
+        calculationFormulaName: [{ required: true, message: '请输入费用计算公式', trigger: 'change' }],
+    },
+    formItems: [
+        {
+            label: '单位名称',
+            prop: 'rentalCompanyCode',
+            type: 'select',
+            placeholder: '请选择单位名称',
+        },
+        {
+            label: '联络人名称',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入联络人名称',
+        },
+        {
+            label: '所属部门',
+            prop: 'rentalCompanyCode',
+            type: 'select',
+            placeholder: '请选择所属部门',
+        },
+        {
+            label: '所属职务',
+            prop: 'rentalCompanyCode',
+            type: 'select',
+            placeholder: '请选择所属职务',
+        },
+        {
+            label: '微信号',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入微信号',
+        },
+        {
+            label: '联系电话',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入联系电话',
+        },
+        {
+            label: '固定电话',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入固定电话',
+        },
+        {
+            label: '传真号',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入传真号',
+        },
+        {
+            label: '电子邮箱',
+            prop: 'rentalCompanyName',
+            type: 'input',
+            placeholder: '请输入电子邮箱',
+        },
+        {
+            label: '短信接收人',
+            prop: 'textMessage',
+            type: 'textMessage',
+        },
+    ],
+};
+
+export default modalConfig;

+ 0 - 0
src/views/illegalInfoSwitch/config/search.config.ts → src/views/myPublish/config/search.config.ts


+ 113 - 0
src/views/myPublish/index.vue

@@ -0,0 +1,113 @@
+<template>
+	<div class="sensitive-words">
+			<pageSearch ref="searchTableRef" :searchConfig="searchConfig" />
+
+			<pageContent ref="tableListRef" :total="total" :contentConfig="contentConfig" :pageList="tableData">
+					<template #button>
+							<el-button type="primary" @click="handleAdd()">新增</el-button>
+							<el-button type="primary" @click="handleAdd()">导出</el-button>
+					</template>
+					<template #operate="scope">
+							<el-button type="primary" link @click="handleEdit(scope.row.rentalCompanyId)">
+									编辑
+							</el-button>
+							<el-button type="primary" link @click="handleDelete(scope.row.rentalCompanyId)">
+									删除
+							</el-button>
+					</template>
+			</pageContent>
+	</div>
+</template>
+
+<script setup lang="ts">
+import { useRouter } from 'vue-router';
+import contentConfig from './config/content.config';
+import pageContent from '@/components/components/pageContent.vue';
+import searchConfig from './config/search.config';
+import pageSearch from '@/components/components/pageSearch.vue';
+import useSystemStore from '@/store/main';
+const systemStore = useSystemStore();
+
+const total = ref(0);
+const pageSize = ref([10, 20, 30]);
+const tableData = ref([]);
+const tableListRef = ref();
+const router = useRouter()
+
+// 操作弹框
+import usePageModal from '@/components/components/hooks/usePageDetails';
+const { modalRef, handleNewDataClick, handleEditDataClick, handleCheckDataClick, handlePageDetail } =
+	usePageModal();
+
+const handleEdit = async (id: string) => {
+	await handlePageDetail(id);
+	await handleEditDataClick();
+};
+
+// 新增按钮
+const handleAdd = () => {
+	router.push({
+    name: 'addPublish',
+    query: { type: 'add' }
+  });
+};
+const searchTableRef = ref();
+const onClickDeleta = async (row: any) => {
+	ElMessageBox.confirm('确认删除此条数据吗?', '删除', {
+			confirmButtonText: '确认',
+			cancelButtonText: '取消',
+			type: 'warning',
+	}).then(() => {
+			// 删除后的回调
+	});
+};
+// 删除按钮
+function handleDelete(value: any) {
+	ElMessageBox.confirm('是否删除这条数据?', '删除提示', {
+			confirmButtonText: '确定',
+			cancelButtonText: '取消',
+			type: 'warning',
+	})
+			.then(() => {
+					systemStore.deletePageDataAction(contentConfig.pageName, value);
+			})
+			.catch(() => {
+					ElMessage({
+							type: 'info',
+							message: '取消删除',
+					});
+			});
+}
+
+// 筛选-状态赋值
+async function searchItem() {
+	searchConfig.formItems.forEach(item => {
+			if (item.prop === 'status') {
+					// item.options = searchList.value;
+			}
+	});
+}
+searchItem();
+</script>
+
+<style scoped lang="scss">
+.sensitive-words {
+	margin: 20px;
+	// background-color: #fff;
+}
+
+.status {
+	cursor: pointer;
+	position: relative;
+
+	.status-tip {
+			position: absolute;
+			top: 2px;
+			left: 60px;
+	}
+}
+
+.dialog-tip {
+	text-align: center;
+}
+</style>