Bläddra i källkod

#add 接口对接

jc-wangyt 1 månad sedan
förälder
incheckning
663d970261

+ 2 - 1
.env.development

@@ -5,7 +5,8 @@ VUE_APP_TITLE = 若依管理系统
 ENV = 'development'
 
 # 若依管理系统/开发环境
-VUE_APP_BASE_API = '/dev-api'
+# VUE_APP_BASE_API = '/dev-api'
+VUE_APP_BASE_API = ''
 
 # 路由懒加载
 VUE_CLI_BABEL_TRANSPILE_MODULES = true

+ 1 - 0
package.json

@@ -36,6 +36,7 @@
     "js-beautify": "1.13.0",
     "js-cookie": "3.0.1",
     "jsencrypt": "3.0.0-rc.1",
+    "moment": "^2.30.1",
     "nprogress": "0.2.0",
     "quill": "2.0.2",
     "screenfull": "5.0.2",

+ 17 - 0
src/api/newApi/bizoppmanage.js

@@ -0,0 +1,17 @@
+import request from '@/utils/request'
+
+// 项目商机列表
+export function getOpportunityList(data) {
+  return request({
+    url: '/opportunity/list',
+    method: 'get',
+    params: data
+  })
+}
+// 项目商机详情
+export function getOpportunityDetail(noticeId) {
+  return request({
+    url: `/opportunity/${noticeId}`,
+    method: 'get'
+  })
+}

+ 19 - 0
src/api/newApi/openMarketBid.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 自由市场商机列表
+export function getFreeMarketList(data) {
+  return request({
+    url: '/freemarket/list',
+    method: 'get',
+    params: data
+  })
+}
+
+ // 自由市场商机详情
+ export function getFreeMarketDetail(noticeId) {
+   return request({
+     url: `/freemarket/${noticeId}`,
+     method: 'get'
+   })
+ }
+ 

+ 0 - 1
src/layout/components/Navbar.vue

@@ -1,7 +1,6 @@
 <template>
   <div class="navbar" :class="'nav' + navType">
     <hamburger id="hamburger-container" :is-active="sidebar.opened" class="hamburger-container" @toggleClick="toggleSideBar" />
-
     <breadcrumb v-if="navType == 1" id="breadcrumb-container" class="breadcrumb-container" />
     <top-nav v-if="navType == 2" id="topmenu-container" class="topmenu-container" />
     <template v-if="navType == 3">

+ 33 - 5
src/router/index.js

@@ -66,14 +66,42 @@ export const constantRoutes = [
     component: Layout,
     redirect: 'index',
     children: [
+      // {
+      //   path: 'index',
+      //   component: () => import('@/views/index'),
+      //   name: 'Index',
+      //   meta: { title: '首页', icon: 'dashboard', affix: true }
+      // },
+       {
+        path: 'bizoppmanage',
+        component: () => import('@/views/bizoppmanage/index'),
+        name: 'BizOppManage',
+        meta: { title: '商机运营', icon: 'dashboard', affix: true }
+      },
+       {
+        path: 'bizoppdetails',
+        component: () => import('@/views/bizoppmanage/details'),
+        name: 'BizOppDetails',
+        meta: {title: '商机详情', noCache: true, icon: 'dashboard',breadcrumb: false },
+        hidden: true
+      },
       {
-        path: 'index',
-        component: () => import('@/views/index'),
-        name: 'Index',
-        meta: { title: '首页', icon: 'dashboard', affix: true }
-      }
+        path: 'openMarketBid',
+        component: () => import('@/views/openMarketBid/index'),
+        name: 'OpenMarketBid',
+        meta: { title: '公开市场', icon: 'dashboard', affix: true }
+      },
+      {
+        path: 'openMarketBidDetails',
+        component: () => import('@/views/openMarketBid/details'),
+        name: 'OpenMarketBidDetails',
+        meta: {title: '公开市场详情', noCache: true, icon: 'dashboard',breadcrumb: false },
+        hidden: true
+      },
+
     ]
   },
+
   {
     path: '/user',
     component: Layout,

+ 19 - 2
src/store/modules/permission.js

@@ -32,8 +32,24 @@ const permission = {
     // 生成路由
     GenerateRoutes({ commit }) {
       return new Promise(resolve => {
-        // 向后端请求路由数据
-        getRouters().then(res => {
+        // 开发环境临时使用模拟数据,避免调用真实后端接口
+        const mockRes = {
+          data: []
+        }
+        const sdata = JSON.parse(JSON.stringify(mockRes.data))
+        const rdata = JSON.parse(JSON.stringify(mockRes.data))
+        const sidebarRoutes = filterAsyncRouter(sdata)
+        const rewriteRoutes = filterAsyncRouter(rdata, false, true)
+        const asyncRoutes = filterDynamicRoutes(dynamicRoutes)
+        rewriteRoutes.push({ path: '*', redirect: '/404', hidden: true })
+        router.addRoutes(asyncRoutes)
+        commit('SET_ROUTES', rewriteRoutes)
+        commit('SET_SIDEBAR_ROUTERS', constantRoutes.concat(sidebarRoutes))
+        commit('SET_DEFAULT_ROUTES', sidebarRoutes)
+        commit('SET_TOPBAR_ROUTES', sidebarRoutes)
+        resolve(rewriteRoutes)
+        // 真实后端接口调用(已注释)
+        /*getRouters().then(res => {
           const sdata = JSON.parse(JSON.stringify(res.data))
           const rdata = JSON.parse(JSON.stringify(res.data))
           const sidebarRoutes = filterAsyncRouter(sdata)
@@ -47,6 +63,7 @@ const permission = {
           commit('SET_TOPBAR_ROUTES', sidebarRoutes)
           resolve(rewriteRoutes)
         })
+        */
       })
     }
   }

+ 76 - 33
src/store/modules/user.js

@@ -1,5 +1,5 @@
 import router from '@/router'
-import { MessageBox, } from 'element-ui'
+import { MessageBox } from 'element-ui'
 import { login, logout, getInfo } from '@/api/login'
 import { getToken, setToken, removeToken } from '@/utils/auth'
 import { isHttp, isEmpty } from "@/utils/validate"
@@ -61,38 +61,81 @@ const user = {
     // 获取用户信息
     GetInfo({ commit, state }) {
       return new Promise((resolve, reject) => {
-        getInfo().then(res => {
-          const user = res.user
-          let avatar = user.avatar || ""
-          if (!isHttp(avatar)) {
-            avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar
-          }
-          if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
-            commit('SET_ROLES', res.roles)
-            commit('SET_PERMISSIONS', res.permissions)
-          } else {
-            commit('SET_ROLES', ['ROLE_DEFAULT'])
-          }
-          commit('SET_ID', user.userId)
-          commit('SET_NAME', user.userName)
-          commit('SET_NICK_NAME', user.nickName)
-          commit('SET_AVATAR', avatar)
-          /* 初始密码提示 */
-          if(res.isDefaultModifyPwd) {
-            MessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
-              router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
-            }).catch(() => {})
-          }
-          /* 过期密码提示 */
-          if(!res.isDefaultModifyPwd && res.isPasswordExpired) {
-            MessageBox.confirm('您的密码已过期,请尽快修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
-              router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
-            }).catch(() => {})
-          }
-          resolve(res)
-        }).catch(error => {
-          reject(error)
-        })
+        // 开发环境临时使用模拟数据,避免调用真实后端接口
+        const mockRes = {
+          user: {
+            userId: '1',
+            userName: 'admin',
+            nickName: '管理员',
+            avatar: ''
+          },
+          roles: ['admin'],
+          permissions: ['*:*:*'],
+          isDefaultModifyPwd: false,
+          isPasswordExpired: false
+        }
+        const user = mockRes.user
+        let avatar = user.avatar || ""
+        if (!isHttp(avatar)) {
+          avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar
+        }
+        if (mockRes.roles && mockRes.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+          commit('SET_ROLES', mockRes.roles)
+          commit('SET_PERMISSIONS', mockRes.permissions)
+        } else {
+          commit('SET_ROLES', ['ROLE_DEFAULT'])
+        }
+        commit('SET_ID', user.userId)
+        commit('SET_NAME', user.userName)
+        commit('SET_NICK_NAME', user.nickName)
+        commit('SET_AVATAR', avatar)
+        /* 初始密码提示 */
+        if(mockRes.isDefaultModifyPwd) {
+          MessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
+            router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
+          }).catch(() => {})
+        }
+        /* 过期密码提示 */
+        if(!mockRes.isDefaultModifyPwd && mockRes.isPasswordExpired) {
+          MessageBox.confirm('您的密码已过期,请尽快修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
+            router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
+          }).catch(() => {})
+        }
+        resolve(mockRes)
+        // 真实后端接口调用(已注释)
+        // getInfo().then(res => {
+        //   const user = res.user
+        //   let avatar = user.avatar || ""
+        //   if (!isHttp(avatar)) {
+        //     avatar = (isEmpty(avatar)) ? defAva : process.env.VUE_APP_BASE_API + avatar
+        //   }
+        //   if (res.roles && res.roles.length > 0) { // 验证返回的roles是否是一个非空数组
+        //     commit('SET_ROLES', res.roles)
+        //     commit('SET_PERMISSIONS', res.permissions)
+        //   } else {
+        //     commit('SET_ROLES', ['ROLE_DEFAULT'])
+        //   }
+        //   commit('SET_ID', user.userId)
+        //   commit('SET_NAME', user.userName)
+        //   commit('SET_NICK_NAME', user.nickName)
+        //   commit('SET_AVATAR', avatar)
+        //   /* 初始密码提示 */
+        //   if(res.isDefaultModifyPwd) {
+        //     MessageBox.confirm('您的密码还是初始密码,请修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
+        //       router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
+        //     }).catch(() => {})
+        //   }
+        //   /* 过期密码提示 */
+        //   if(!res.isDefaultModifyPwd && res.isPasswordExpired) {
+        //     MessageBox.confirm('您的密码已过期,请尽快修改密码!',  '安全提示', {  confirmButtonText: '确定',  cancelButtonText: '取消',  type: 'warning' }).then(() => {
+        //       router.push({ name: 'Profile', params: { activeTab: 'resetPwd' } })
+        //     }).catch(() => {})
+        //   }
+        //   resolve(res)
+        // }).catch(error => {
+        //   reject(error)
+        // })
+        //
       })
     },
 

+ 3 - 1
src/utils/auth.js

@@ -3,7 +3,9 @@ import Cookies from 'js-cookie'
 const TokenKey = 'Admin-Token'
 
 export function getToken() {
-  return Cookies.get(TokenKey)
+  // 开发环境临时使用假token,跳过登录
+  return '123456'
+  // return Cookies.get(TokenKey)
 }
 
 export function setToken(token) {

+ 167 - 0
src/views/bizoppmanage/details.vue

@@ -0,0 +1,167 @@
+<template>
+  <div class="app-container">
+    <!-- 商机信息模块 -->
+    <div class="module-container">
+      <div class="module-header">
+        <i class="el-icon-document"></i>
+        <span>商机信息</span>
+      </div>
+      <div class="module-content">
+        <el-descriptions :column="3" border>
+          <el-descriptions-item label="商机编号">1552025070900407</el-descriptions-item>
+          <el-descriptions-item label="商机名称">天津市南区辛庄社区卫生服务中心项目</el-descriptions-item>
+          <el-descriptions-item label="商机阶段">支撑确认</el-descriptions-item>
+          <el-descriptions-item label="填报时间">2025-07-09 19:13:59</el-descriptions-item>
+          <el-descriptions-item label="预计签约时间">2026-07-16</el-descriptions-item>
+          <el-descriptions-item label="预计合同总金额">20万元</el-descriptions-item>
+          <el-descriptions-item label="自然客户名称">天津市南区辛庄社区卫生服务中心</el-descriptions-item>
+          <el-descriptions-item label="自然客户ID">33666606</el-descriptions-item>
+          <el-descriptions-item label="客户需求来源">***</el-descriptions-item>
+          <el-descriptions-item label="商机归属人">王健 wangj1181/</el-descriptions-item>
+          <el-descriptions-item label="商机单位">津南区政务服务管理中心</el-descriptions-item>
+          <el-descriptions-item label="商机创建">津南区</el-descriptions-item>
+          <el-descriptions-item label="客户需求简介">天津市津南区要求,将卫生监控站的广播扩至全个月</el-descriptions-item>
+          <el-descriptions-item label="支援负责人">邢立红 xinglh186022559</el-descriptions-item>
+          <el-descriptions-item label="支援部门">津南区分公司政企客户事业部</el-descriptions-item>
+        </el-descriptions>
+      </div>
+    </div>
+
+    <!-- 公开市场模块 -->
+    <div class="module-container">
+      <div class="module-header">
+        <i class="el-icon-money"></i>
+        <span>公开市场</span>
+      </div>
+      <div class="module-content">
+        <!-- 招标信息 -->
+        <div class="section-container">
+          <h3>招标信息</h3>
+          <el-descriptions :column="3" border>
+            <el-descriptions-item label="招标编号">ZB202412001</el-descriptions-item>
+            <el-descriptions-item label="招标公告发布时间">2024-12-10 09:00:00</el-descriptions-item>
+            <el-descriptions-item label="购买标书截止时间">2024-12-15 17:00:00</el-descriptions-item>
+            <el-descriptions-item label="项目编号">XM202412001</el-descriptions-item>
+            <el-descriptions-item label="项目名称">算网全流程平台升级改造项目</el-descriptions-item>
+            <el-descriptions-item label="招标方式">公开招标</el-descriptions-item>
+            <el-descriptions-item label="开标时间">2024-12-20 10:30:00</el-descriptions-item>
+            <el-descriptions-item label="采购预算">¥1,500,000.00</el-descriptions-item>
+            <el-descriptions-item label="红军降标">10%</el-descriptions-item>
+            <el-descriptions-item label="是否参与">是</el-descriptions-item>
+          </el-descriptions>
+        </div>
+
+        <!-- 中标信息 -->
+        <div class="section-container">
+          <h3>中标信息</h3>
+          <el-descriptions :column="3" border>
+            <el-descriptions-item label="中标标识"></el-descriptions-item>
+            <el-descriptions-item label="中标单位"></el-descriptions-item>
+            <el-descriptions-item label="中标价"></el-descriptions-item>
+            <el-descriptions-item label="项目编号"></el-descriptions-item>
+            <el-descriptions-item label="项目名称"></el-descriptions-item>
+            <el-descriptions-item label="中标公告发布时间"></el-descriptions-item>
+            <el-descriptions-item label="是否关联"></el-descriptions-item>
+          </el-descriptions>
+        </div>
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import { getOpportunityDetail } from '@/api/newApi/bizoppmanage'
+export default {
+  data() {
+    return {
+      // 页面标题
+      title: '商机详情'
+    }
+  },
+  mounted() {
+    // 初始化获取商机详情
+    this.getDetail();
+    // 页面加载完成后的处理
+    document.title = this.title
+  },
+  methods: {
+    // 获取商机详情
+    getDetail() {
+      getOpportunityDetail(this.$route.query.id).then(response => {
+        if (response.code === 200) {
+          this.currentData = response.data || {};
+        } else {
+          this.$message.error(response.msg || '获取商机详情失败');
+        }
+      });
+    }
+  }
+}
+</script>
+
+<style scoped>
+.app-container {
+  padding: 20px;
+  background-color: #f5f7fa;
+}
+
+.module-container {
+  background-color: #fff;
+  border-radius: 4px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  margin-bottom: 20px;
+  overflow: hidden;
+}
+
+.module-header {
+  padding: 15px 20px;
+  background-color: #ecf5ff;
+  border-bottom: 1px solid #e6f2ff;
+  font-weight: bold;
+  display: flex;
+  align-items: center;
+}
+
+.module-header .el-icon {
+  margin-right: 8px;
+  color: #409eff;
+}
+
+.module-content {
+  padding: 20px;
+}
+
+.section-container {
+  margin-bottom: 20px;
+}
+
+.section-container h3 {
+  margin: 0 0 15px 0;
+  padding: 0 0 10px 0;
+  border-bottom: 1px solid #ebeef5;
+  font-size: 16px;
+  font-weight: 500;
+  color: #303133;
+}
+
+/* 响应式布局调整 */
+@media (max-width: 1200px) {
+  .el-descriptions {
+    --el-descriptions-column: 2 !important;
+  }
+}
+
+@media (max-width: 768px) {
+  .el-descriptions {
+    --el-descriptions-column: 1 !important;
+  }
+
+  .app-container {
+    padding: 10px;
+  }
+
+  .module-content {
+    padding: 15px;
+  }
+}
+</style>

+ 294 - 0
src/views/bizoppmanage/index.vue

@@ -0,0 +1,294 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索条件区域 -->
+    <div class="search-container">
+      <el-collapse-transition>
+        <div v-show="searchExpanded">
+          <el-form :model="searchForm" class="search-form" label-width="100px">
+            <el-row :gutter="20">
+              <!-- 第一行:基本信息 -->
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="商机名称" prop="opportunityName">
+                  <el-input v-model="searchForm.opportunityName" placeholder="请输入商机名称" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="商机编号" prop="opportunityCode">
+                  <el-input v-model="searchForm.opportunityCode" placeholder="请输入商机编号" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="商机单位" prop="opportunityUnit">
+                  <el-input v-model="searchForm.opportunityUnit" placeholder="请输入商机单位" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="指标标签" prop="indicatorTag">
+                  <el-input v-model="searchForm.indicatorTag" placeholder="请输入指标标签" clearable></el-input>
+                </el-form-item>
+              </el-col>
+
+              <!-- 第二行:客户与负责人信息 -->
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="目标客户" prop="targetCustomer">
+                  <el-input v-model="searchForm.targetCustomer" placeholder="请输入目标客户" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="商机归属人" prop="bizOwner">
+                  <el-input v-model="searchForm.bizOwner" placeholder="请输入商机归属人" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="支援负责人" prop="supportPerson">
+                  <el-input v-model="searchForm.supportPerson" placeholder="请输入支援负责人" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="支援单位" prop="supportUnit">
+                  <el-input v-model="searchForm.supportUnit" placeholder="请输入支援单位" clearable></el-input>
+                </el-form-item>
+              </el-col>
+
+              <!-- 第三行:合同与项目信息 -->
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="合同编号" prop="contractCode">
+                  <el-input v-model="searchForm.contractCode" placeholder="请输入合同编号" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="项目编号" prop="projectCode">
+                  <el-input v-model="searchForm.projectCode" placeholder="请输入项目编号" clearable></el-input>
+                </el-form-item>
+              </el-col>
+              <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                <el-form-item label="商机阶段" prop="opportunityStage">
+                  <el-input v-model="searchForm.opportunityStage" placeholder="请输入商机阶段" clearable></el-input>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 日期选择区域 -->
+            <el-row :gutter="20" class="date-row">
+              <el-col :span="8">
+                <el-form-item label="立项时间" prop="approvalDate">
+                  <el-date-picker v-model="searchForm.approvalDate" type="daterange" range-separator="至"
+                    start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+                    clearable></el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="预计签约时间" prop="estimatedSignDate">
+                  <el-date-picker v-model="searchForm.estimatedSignDate" type="daterange" range-separator="至"
+                    start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+                    clearable></el-date-picker>
+                </el-form-item>
+              </el-col>
+              <el-col :span="8">
+                <el-form-item label="签约时间" prop="signDate">
+                  <el-date-picker v-model="searchForm.signDate" type="daterange" range-separator="至"
+                    start-placeholder="开始日期" end-placeholder="结束日期" format="yyyy-MM-dd" value-format="yyyy-MM-dd"
+                    clearable></el-date-picker>
+                </el-form-item>
+              </el-col>
+            </el-row>
+
+            <!-- 操作按钮区域 -->
+            <el-row>
+              <el-col :span="24" class="form-actions">
+                <el-form-item>
+                  <el-button type="primary" @click="handleSearch" :loading="searchLoading">搜索</el-button>
+                  <el-button @click="handleReset">重置</el-button>
+                </el-form-item>
+              </el-col>
+            </el-row>
+          </el-form>
+        </div>
+      </el-collapse-transition>
+      <!-- <el-button type="text" @click="toggleSearch" class="toggle-btn">
+        {{ searchExpanded ? '收起搜索 ^' : '展开搜索 v' }}
+      </el-button> -->
+    </div>
+
+    <!-- 商机列表区域 -->
+    <div class="list-container">
+      <div class="list-header">
+        <el-button type="primary" @click="handleAdd">新增商机</el-button>
+      </div>
+      <el-table :data="bizList" header-align="center" style="width: 100%" stripe v-loading="tableLoading" border empty-text="-">
+        <el-table-column prop="opportunityName" label="商机名称" min-width="150" align="center"></el-table-column>
+        <el-table-column prop="opportunityCode" label="商机编号" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="naturalCustomerName" label="自然客户名称" min-width="180" align="center"></el-table-column>
+        <el-table-column prop="naturalCustomerId" label="自然客户ID" min-width="100" align="center"></el-table-column>
+        <el-table-column prop="estimatedContractAmount" label="预计合同总金额(万元)" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="estimatedSignDate" label="预计签约时间" min-width="100" align="center">
+          <template slot-scope="scope">
+            {{ parseTime(scope.row.estimatedSignDate, '{y}-{m}-{d}') || '-' }}
+          </template>
+        </el-table-column>
+        <el-table-column prop="opportunityOwner" label="商机归属人" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="opportunityUnit" label="商机单位" min-width="80" align="center"></el-table-column>
+        <el-table-column prop="supportPerson" label="支援负责人" min-width="120" align="center"></el-table-column>
+        <el-table-column prop="supportUnit" label="支援单位" min-width="80" align="center"></el-table-column>
+        <el-table-column label="操作" min-width="80" fixed="right">
+          <template slot-scope="scope">
+            <el-button type="text" @click="handleDetail(scope.row)">查看详情</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+
+      <!-- 分页 -->
+      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum" :limit.sync="queryParams.pageSize"
+        @pagination="getList" />
+    </div>
+  </div>
+</template>
+
+<script>
+import { getOpportunityList } from '@/api/newApi/bizoppmanage'
+import { get } from 'sortablejs';
+export default {
+  data() {
+    return {
+      // 搜索表单数据
+      searchForm: {
+        opportunityName: '',
+        opportunityCode: '',
+        opportunityUnit: '',
+        estimatedSignDate: '',
+        indicatorTag: '',
+        targetCustomer: '',
+        opportunityOwne: '',
+        supportPerson: '',
+        supportUnit: '',
+        contractCode: '',
+        projectCode: '',
+        signDate: '',
+        approvalDate: '',
+        opportunityStage: ''
+      },
+      // 搜索加载状态
+      searchLoading: false,
+      // 表格加载状态
+      tableLoading: false,
+      // 商机列表数据
+      bizList: [],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      },
+      // 总条数
+      total: 7,
+      // 搜索区域展开状态
+      searchExpanded: true
+    }
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 搜索
+    handleSearch() {
+      this.queryParams.pageNum = 1;
+      console.log('搜索条件:', this.searchForm);
+      this.searchLoading = true;
+      this.getList();
+      this.searchLoading = false;
+    },
+
+    // 重置
+    handleReset() {
+      this.searchForm = {
+        opportunityName: '',
+        opportunityCode: '',
+        opportunityUnit: '',
+        estimatedSignDate: '',
+        indicatorTag: '',
+        targetCustomer: '',
+        opportunityOwne: '',
+        supportPerson: '',
+        supportUnit: '',
+        contractCode: '',
+        projectCode: '',
+        signDate: '',
+        approvalDate: '',
+        opportunityStage: ''
+      };
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    // 展开/收起搜索
+    toggleSearch() {
+      this.searchExpanded = !this.searchExpanded;
+    },
+    // 新增商机
+    handleAdd() {
+      console.log('新增商机');
+      // 这里可以添加新增逻辑
+    },
+    // 查看详情
+    handleDetail(row) {
+      this.$router.push({
+        path: '/bizoppdetails',
+        query: {
+          id: row.id
+        }
+      });
+      console.log('查看详情:', row);
+    },
+    // 获取列表数据
+    getList() {
+      console.log('分页参数:', this.queryParams);
+      console.log('搜索条件:', this.searchForm);
+      this.tableLoading = true;
+      getOpportunityList(this.queryParams).then(res => {
+        if (res.code === 200) {
+          this.bizList = res.rows
+          this.total = res.total;
+          this.tableLoading = false;
+        }
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.bizopp-manage {
+  padding: 20px;
+  background-color: #f5f7fa;
+}
+
+.search-container {
+  background-color: #fff;
+  padding: 20px;
+  border-radius: 4px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+  margin-bottom: 20px;
+}
+
+.search-form {
+  margin-bottom: 0;
+}
+
+.search-form .el-form-item {
+  margin-bottom: 15px;
+}
+
+.list-container {
+  background-color: #fff;
+  padding: 20px;
+  border-radius: 4px;
+  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.list-header {
+  margin-bottom: 20px;
+}
+
+.pagination-container {
+  margin-top: 20px;
+  text-align: right;
+}
+</style>

+ 490 - 0
src/views/openMarketBid/details.vue

@@ -0,0 +1,490 @@
+<template>
+    <div class="app-container">
+        <el-dialog :title="title" :visible.sync="dialogVisible" width="70%" :before-close="handleClose">
+            <!-- 公告信息 -->
+            <div class="detail-section">
+                <h3 class="section-title">公告信息</h3>
+                <el-form :model="mockFormData" label-width="130px" size="small" class="detail-form">
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="公告标题">
+                                {{ mockFormData.noticeTitle }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="公告类型">
+                                {{ mockFormData.noticeType }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="发布时间">
+                                {{ mockFormData.publishTime }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="信息匹配词">
+                                {{ mockFormData.infoMatchingWords }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="是否有关">
+                                {{ mockFormData.isRelated ? '是' : '否' }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="省份">
+                                {{ mockFormData.province }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="城市">
+                                {{ mockFormData.city }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="数据来源">
+                                {{ mockFormData.dataSource }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="公告地址">
+                                <a :href="mockFormData.noticeAddress" target="_blank" class="link-text">{{
+                                    mockFormData.noticeAddress }}</a>
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="剑鱼标训地址">
+                                <a :href="mockFormData.jianyuAddress" target="_blank" class="link-text">{{
+                                    mockFormData.jianyuAddress }}</a>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="24">
+                            <el-form-item label="公告正文">
+                                <div class="content-box">{{ mockFormData.noticeContent }}</div>
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </div>
+
+            <!-- 采购信息 -->
+            <div class="detail-section">
+                <h3 class="section-title">采购信息</h3>
+                <el-form :model="mockFormData" label-width="130px" size="small" class="detail-form">
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="采购单位">
+                                {{ mockFormData.purchaserName }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="对应自然客户">
+                                {{ mockFormData.naturalCustomerName }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="自然客户标签名称">
+                                {{ mockFormData.naturalCustomerLabel }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="采购单位地址">
+                                {{ mockFormData.purchaserAddress }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="采购单位联系人">
+                                {{ mockFormData.purchaserContact }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="采购单位联系电话">
+                                {{ mockFormData.purchaserPhone }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="招标信息发布时间">
+                                {{ mockFormData.bidPublishTime }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="开标日期">
+                                {{ mockFormData.bidOpeningDate }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="预算(万元)">
+                                {{ mockFormData.budgetAmount }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </div>
+
+            <!-- 项目信息 -->
+            <div class="detail-section">
+                <h3 class="section-title">项目信息</h3>
+                <el-form :model="mockFormData" label-width="130px" size="small" class="detail-form">
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="项目编号">
+                                {{ mockFormData.projectCode }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="项目名称">
+                                {{ mockFormData.projectName }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="招标代理">
+                                {{ mockFormData.bidAgentName }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="招标代理联系电话">
+                                {{ mockFormData.bidAgentPhone }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="项目范围">
+                                {{ mockFormData.projectScope }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="信息标识">
+                                {{ mockFormData.infoIdentifier }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </div>
+
+            <!-- 扩展信息 -->
+            <div class="detail-section">
+                <h3 class="section-title">扩展信息</h3>
+                <el-form :model="mockFormData" label-width="130px" size="small" class="detail-form">
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="分公司">
+                                {{ mockFormData.branchCompany }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="分类">
+                                {{ mockFormData.category }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="商机编号">
+                                {{ mockFormData.businessNumber }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="是否知晓">
+                                {{ mockFormData.isKnown ? '是' : '否' }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                    <el-row :gutter="20">
+                        <el-col :span="12">
+                            <el-form-item label="是否参与">
+                                {{ mockFormData.isParticipate ? '是' : '否' }}
+                            </el-form-item>
+                        </el-col>
+                        <el-col :span="12">
+                            <el-form-item label="不参与原因">
+                                {{ mockFormData.nonParticipationReason }}
+                            </el-form-item>
+                        </el-col>
+                    </el-row>
+                </el-form>
+            </div>
+
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="handleClose">关 闭</el-button>
+            </span>
+        </el-dialog>
+    </div>
+</template>
+
+<script>
+export default {
+    props: {
+        dialogVisible: {
+            type: Boolean,
+            default: false
+        },
+        formData: {
+            type: Object,
+            default: () => ({})
+        },
+        title: {
+            type: String,
+            default: '详情'
+        }
+    },
+    data() {
+        return {
+            // 模拟详情数据
+            mockFormData: {
+                // 公告信息
+                noticeTitle: '河北工业大学北辰校区智慧热网系统软硬件升级项目单一来源公告',
+                noticeType: '单一',
+                publishTime: '2025-10-29 10:35:36',
+                infoMatchingWords: '智慧,系统',
+                isRelated: true,
+                province: '天津',
+                city: '天津市',
+                dataSource: '剑鱼',
+                noticeAddress: 'https://szj.hebei.gov.cn/zbtbfwpt/en...',
+                jianyuAddress: 'https://www.jianyu360.cn/article/ents...',
+                noticeContent: '河北工业大学北辰校区智慧热网系统软硬件升级项目单一来源公告 河北工业大学北辰校区智慧热网系统软硬件升级项目单一来源公告招标项目名称:河北工业大学北辰校区智慧热网系统软硬件升级项目招标编号:TJHY-2025-A-072招标项目编号:ZJ210010084X000185001所属行业:科教文卫所属地区:天津市北辰区招标单位:河北工业大学招标代理:天津市宏宇工程通造价咨询有限公司发布时间:2025-10-29',
+
+                // 采购信息
+                purchaserName: '河北工业大学',
+                naturalCustomerName: '河北工业大学',
+                naturalCustomerLabel: '2022年4月要害拍图',
+                purchaserAddress: '',
+                purchaserContact: '',
+                purchaserPhone: '',
+                bidPublishTime: '2025-10-29 10:35:36',
+                bidOpeningDate: '',
+                budgetAmount: 20,
+
+                // 项目信息
+                projectCode: 'ZJ210010084X000185001',
+                projectName: '河北工业大学北辰校区智慧热网系统软硬件升级项目',
+                bidAgentName: '天津市宏宇工程通造价咨询有限公司',
+                bidAgentPhone: '',
+                projectScope: '',
+                infoIdentifier: 'QIZAaE24mbrFccCFOQdkF8bhHNqBaBV...',
+
+                // 扩展信息
+                branchCompany: '政要',
+                category: 'G',
+                businessNumber: '',
+                isKnown: false,
+                isParticipate: false,
+                nonParticipationReason: ''
+            }
+        };
+    },
+    methods: {
+        handleClose() {
+            this.$emit('update:dialogVisible', false);
+        }
+    }
+}
+</script>
+
+<style scoped>
+.app-container {
+    padding: 0;
+}
+
+/* 详情区域整体样式优化 */
+.detail-section {
+    margin-bottom: 24px;
+    padding: 20px;
+    border: 1px solid #ebeef5;
+    border-radius: 8px;
+    background-color: #ffffff;
+    box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.05);
+    transition: all 0.3s ease;
+}
+
+/* 悬停效果 */
+.detail-section:hover {
+    box-shadow: 0 4px 16px 0 rgba(0, 0, 0, 0.08);
+    border-color: #dcdfe6;
+}
+
+/* 标题样式优化 */
+.section-title {
+    margin: 0 0 20px 0;
+    padding-bottom: 8px;
+    border-bottom: 2px solid #409eff;
+    font-size: 16px;
+    font-weight: bold;
+    color: #303133;
+    display: flex;
+    align-items: center;
+}
+
+/* 标题前添加图标 */
+.section-title::before {
+    content: '';
+    display: inline-block;
+    width: 4px;
+    height: 18px;
+    background-color: #409eff;
+    margin-right: 8px;
+    border-radius: 2px;
+}
+
+.detail-form {
+    margin: 0;
+}
+
+/* 表单行间距优化 */
+.el-row {
+    margin-bottom: 16px;
+}
+
+/* 表单列间距优化 */
+.el-col {
+    margin-bottom: 0;
+}
+
+/* 表单内容样式优化 */
+.el-form-item {
+    margin-bottom: 0;
+}
+
+/* 标签样式增强 */
+.el-form-item__label {
+    font-weight: 500;
+    color: #606266;
+}
+
+/* 表单内容区域 */
+.el-form-item__content {
+    word-break: break-all;
+    color: #303133;
+    line-height: 1.5;
+}
+
+/* 公告正文样式优化 */
+.content-box {
+    max-height: 250px;
+    overflow-y: auto;
+    padding: 15px;
+    border: 1px solid #ebeef5;
+    border-radius: 6px;
+    background-color: #fafafa;
+    white-space: pre-wrap;
+    line-height: 1.6;
+    font-size: 14px;
+    color: #303133;
+}
+
+/* 滚动条样式 */
+.content-box::-webkit-scrollbar {
+    width: 6px;
+    height: 6px;
+}
+
+.content-box::-webkit-scrollbar-track {
+    background: #f1f1f1;
+    border-radius: 3px;
+}
+
+.content-box::-webkit-scrollbar-thumb {
+    background: #c0c4cc;
+    border-radius: 3px;
+}
+
+.content-box::-webkit-scrollbar-thumb:hover {
+    background: #909399;
+}
+
+/* 链接样式优化 */
+.link-text {
+    color: #409eff;
+    text-decoration: none;
+    overflow: hidden;
+    text-overflow: ellipsis;
+    white-space: nowrap;
+    display: inline-block;
+    max-width: 100%;
+    transition: all 0.3s ease;
+    padding: 2px 0;
+}
+
+.link-text:hover {
+    color: #66b1ff;
+    text-decoration: underline;
+}
+
+/* 对话框底部按钮居中 */
+.dialog-footer {
+    text-align: center;
+    padding-top: 20px;
+}
+
+/* 响应式设计 */
+@media screen and (max-width: 768px) {
+    .detail-section {
+        padding: 15px;
+        margin-bottom: 16px;
+    }
+
+    .section-title {
+        font-size: 14px;
+        margin-bottom: 15px;
+    }
+
+    .content-box {
+        max-height: 200px;
+        padding: 12px;
+    }
+
+    .el-form-item__label {
+        font-size: 13px;
+    }
+
+    .el-form-item__content {
+        font-size: 13px;
+    }
+}
+
+/* 数据为空时的占位样式 */
+.el-form-item__content:empty::after {
+    content: '-';
+    color: #c0c4cc;
+}
+
+/* 布尔值样式优化 */
+.bool-value {
+    display: inline-block;
+    padding: 2px 8px;
+    border-radius: 10px;
+    font-size: 12px;
+    font-weight: 500;
+}
+
+.bool-value.true {
+    background-color: #f0f9eb;
+    color: #67c23a;
+}
+
+.bool-value.false {
+    background-color: #fef0f0;
+    color: #f56c6c;
+}
+</style>

+ 0 - 0
src/views/openMarketBid/edit.vue


+ 441 - 0
src/views/openMarketBid/index.vue

@@ -0,0 +1,441 @@
+<template>
+    <div class="app-container">
+        <!-- 标签页导航 -->
+        <div class="tab-container">
+            <el-tabs v-model="activeTab" type="card">
+                <el-tab-pane label="未确认" name="unconfirmed"></el-tab-pane>
+                <!-- <el-tab-pane label="已确认" name="confirmed"></el-tab-pane>
+                <el-tab-pane label="挂网区" name="published"></el-tab-pane> -->
+            </el-tabs>
+        </div>
+
+        <!-- 搜索条件区域 -->
+        <div class="search-container">
+            <el-collapse-transition>
+                <div v-show="searchExpanded">
+                    <el-form :model="searchForm" class="search-form" label-width="100px">
+                        <el-row :gutter="20">
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="公告标题" prop="noticeTitle">
+                                    <el-input v-model="searchForm.noticeTitle" placeholder="请输入公告标题"
+                                        clearable></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="项目名称" prop="projectName">
+                                    <el-input v-model="searchForm.projectName" placeholder="请输入项目名称"
+                                        clearable></el-input>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="是否有关" prop="isRelated">
+                                    <el-select v-model="searchForm.isRelated" placeholder="请选择是否有关" clearable>
+                                        <el-option v-for="item in isRelatedOptions" :key="item.value"
+                                            :label="item.label" :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="分公司" prop="branchCompany">
+                                    <el-select v-model="searchForm.branchCompany" placeholder="请选择分公司" clearable>
+                                        <el-option v-for="item in branchCompanyOptions" :key="item.value"
+                                            :label="item.label" :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="分类" prop="category">
+                                    <el-select v-model="searchForm.category" placeholder="请选择分类" clearable>
+                                        <el-option v-for="item in categoryOptions" :key="item.value" :label="item.label"
+                                            :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="数据来源" prop="dataSource">
+                                    <el-select v-model="searchForm.dataSource" placeholder="请选择数据来源" clearable>
+                                        <el-option v-for="item in dataSourceOptions" :key="item.value"
+                                            :label="item.label" :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="公告类型" prop="noticeType">
+                                    <el-select v-model="searchForm.noticeType" placeholder="请选择公告类型" clearable>
+                                        <el-option v-for="item in noticeTypeOptions" :key="item.value"
+                                            :label="item.label" :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :xs="24" :sm="12" :md="8" :lg="6">
+                                <el-form-item label="是否复制" prop="isCopied">
+                                    <el-select v-model="searchForm.isCopied" placeholder="请选择是否复制" clearable>
+                                        <el-option v-for="item in isCopiedOptions" :key="item.value" :label="item.label"
+                                            :value="item.value"></el-option>
+                                    </el-select>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+
+                        <!-- 日期选择区域 -->
+                        <el-row :gutter="20" class="date-row">
+                            <el-col :span="8">
+                                <el-form-item label="发布时间" prop="publishDate">
+                                    <el-date-picker v-model="searchForm.publishDate" type="daterange"
+                                        range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+                                        format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable></el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="开标日期" prop="bidOpeningDate">
+                                    <el-date-picker v-model="searchForm.bidOpeningDate" type="daterange"
+                                        range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+                                        format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable></el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                            <el-col :span="8">
+                                <el-form-item label="入库时间" prop="storageDate">
+                                    <el-date-picker v-model="searchForm.storageDate" type="daterange"
+                                        range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"
+                                        format="yyyy-MM-dd" value-format="yyyy-MM-dd" clearable></el-date-picker>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+
+                        <!-- 操作按钮区域 -->
+                        <el-row>
+                            <el-col :span="24" class="form-actions">
+                                <el-form-item>
+                                    <el-button type="primary" @click="handleSearch"
+                                        :loading="searchLoading">搜索</el-button>
+                                    <el-button @click="handleReset">重置</el-button>
+                                </el-form-item>
+                            </el-col>
+                        </el-row>
+                    </el-form>
+                </div>
+            </el-collapse-transition>
+        </div>
+
+        <!-- 列表操作按钮区域 -->
+        <div class="list-header">
+            <div class="left-buttons">
+                <el-button type="primary" @click="handleBatchConfirm">批量确认人选</el-button>
+                <el-button @click="handleCancelCustomer">批量有关</el-button>
+                <el-button @click="handleCancelSection">批量无关</el-button>
+                <el-button type="primary" @click="handleAdd">新增</el-button>
+            </div>
+            <div class="right-buttons">
+                <div class="export-section">
+                    <span style="margin-right: 5px; font-size: 14px;">导出方式 </span>
+                    <el-select v-model="exportScope" placeholder="本次范围" style="width: 120px; margin-right: 10px;">
+                        <el-option v-for="item in exportScopeOptions" :key="item.value" :label="item.label"
+                            :value="item.value"></el-option>
+                    </el-select>
+                    <el-button type="primary" @click="handleGenerateTask">审批导出</el-button>
+                </div>
+                <el-button type="primary" @click="handleAddStandardFormat">+ 审批导出周报</el-button>
+            </div>
+        </div>
+
+        <!-- 列表区域 -->
+        <div class="list-container">
+            <el-table :data="noticeList" header-align="center" style="width: 100%" stripe v-loading="tableLoading"
+                border>
+                <el-table-column type="selection" width="55" align="center"></el-table-column>
+                <el-table-column prop="announcementType" label="公告类型" fixed="left" min-width="100"
+                    align="center"></el-table-column>
+                <el-table-column prop="announcementTitle" label="公告标题" fixed="left" min-width="200"
+                    align="center"></el-table-column>
+                <el-table-column prop="projectCode" label="项目编号" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="isRelevant" label="是否相关" min-width="80" align="center">
+                    <template slot-scope="scope">
+                        <el-tag v-if="scope.row.isRelevant === 1" type="success">是</el-tag>
+                        <el-tag v-else-if="scope.row.isRelevant === 0" type="info">否</el-tag>
+                        <el-tag v-else-if="scope.row.isRelevant === 2" type="warning">重复</el-tag>
+                        <el-tag v-else type="info">否</el-tag>
+                    </template>
+                </el-table-column>
+                <el-table-column prop="purchaseUnit" label="采购单位" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="finalUser" label="最终使用客户" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="naturalCustomerId" label="对应自然客户ID" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="customerGroup" label="客户群" min-width="100" align="center"></el-table-column>
+                <el-table-column prop="category" label="分类" min-width="80" align="center"></el-table-column>
+                <el-table-column prop="projectName" label="项目名称" min-width="120" align="center"></el-table-column>
+                <el-table-column prop="tenderAgent" label="招标代理" min-width="120" align="center"></el-table-column>
+                <el-table-column prop="tenderAgentPhone" label="代理联系电话" min-width="120" align="center"></el-table-column>
+                <el-table-column prop="matchKeywords" label="信息匹配词" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="bidDocumentDeadline" label="购买标书截止时间" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="industry" label="行业" min-width="100" align="center"></el-table-column>
+                <el-table-column prop="branchCompany" label="分公司" min-width="100" align="center"></el-table-column>
+                <el-table-column prop="businessCategory" label="业务分类" min-width="100" align="center"></el-table-column>
+                <el-table-column prop="businessDemand" label="业务需求" min-width="120" align="center"></el-table-column>
+                <el-table-column prop="budget" label="预算(万元)" min-width="100" align="center"></el-table-column>
+                <el-table-column prop="bidOpeningDate" label="开标日期" min-width="120" align="center"></el-table-column>
+                <el-table-column prop="announcementUrl" label="公告地址" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="jianyuUrl" label="剑鱼地址" min-width="200" align="center"></el-table-column>
+                <el-table-column prop="tenderInfoPublishTime" label="招标信息发布时间" min-width="150" align="center"></el-table-column>
+                <el-table-column prop="publishTime" label="发布时间" min-width="120" align="center"></el-table-column>
+                <el-table-column label="操作" min-width="100" fixed="right">
+                    <template slot-scope="scope">
+                        <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
+                        <el-dropdown @command="(command) => handleCommand(command, scope.row)"
+                            class="avatar-container right-menu-item hover-effect" trigger="click">
+                            <div class="avatar-wrapper">
+                                <el-button type="text">更多</el-button>
+                            </div>
+                            <template #dropdown>
+                                <el-dropdown-menu>
+                                    <el-dropdown-item command="detail">
+                                        <span>详情</span>
+                                    </el-dropdown-item>
+                                </el-dropdown-menu>
+                            </template>
+                        </el-dropdown>
+                    </template>
+                </el-table-column>
+
+            </el-table>
+
+            <!-- 分页 -->
+            <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNum"
+                :limit.sync="queryParams.pageSize" @pagination="getList" />
+        </div>
+
+        <!-- 详情组件 -->
+        <OpenMarketBidDetails :dialog-visible.sync="dialogVisible" :form-data="currentData" />
+    </div>
+</template>
+
+<script>
+// 组件引入详情
+import OpenMarketBidDetails from './details.vue'
+import { getFreeMarketList } from '@/api/newApi/openMarketBid'
+export default {
+    components: {
+        OpenMarketBidDetails
+    },
+    data() {
+        return {
+            // 活动标签页
+            activeTab: 'unconfirmed',
+            // 搜索表单数据
+            searchForm: {
+                noticeTitle: '',
+                projectName: '',
+                isRelated: '',
+                branchCompany: '',
+                category: '',
+                dataSource: '',
+                noticeType: '',
+                isCopied: '',
+                publishDate: '',
+                bidOpeningDate: '',
+                storageDate: ''
+            },
+            // 下拉选择项数据
+            isRelatedOptions: [
+                { label: '是', value: 'true' },
+                { label: '否', value: 'false' }
+            ],
+            branchCompanyOptions: [
+                { label: '天津分公司', value: 'tianjin' },
+                { label: '北京分公司', value: 'beijing' },
+                { label: '湖南分公司', value: 'hunan' }
+            ],
+            categoryOptions: [
+                { label: 'B', value: 'B' }
+            ],
+            dataSourceOptions: [
+                { label: '剑鱼', value: '剑鱼' },
+                { label: '千里马', value: '千里马' }
+            ],
+            noticeTypeOptions: [
+                { label: '公开招标', value: 'public' },
+                { label: '单一来源', value: 'single' }
+            ],
+            isCopiedOptions: [
+                { label: '是', value: 'true' },
+                { label: '否', value: 'false' }
+            ],
+            exportScopeOptions: [
+                { label: '全部数据', value: 'all' },
+                { label: '本次查询', value: 'current' }
+            ],
+            // 搜索加载状态
+            searchLoading: false,
+            // 表格加载状态
+            tableLoading: false,
+            // 公告列表数据
+            noticeList: [ ],
+            // 查询参数
+            queryParams: {
+                pageNum: 1,
+                pageSize: 10
+            },
+            // 总条数
+            total: 6,
+            // 搜索区域展开状态
+            searchExpanded: true,
+            // 导出方式
+            exportMethod: '',
+            // 详情对话框可见性
+            dialogVisible: false,
+            // 当前选中的数据
+            currentData: {},
+            // 导出范围
+            exportScope: ''
+        }
+    },
+    created() {
+        this.getList();
+    },
+    methods: {
+        // 搜索
+        handleSearch() {
+            this.queryParams.pageNum = 1;
+            console.log('搜索条件:', this.searchForm);
+            this.searchLoading = true;
+            this.getList();
+            this.searchLoading = false;
+        },
+        // 重置
+        handleReset() {
+            this.searchForm = {
+                noticeTitle: '',
+                projectName: '',
+                isRelated: '',
+                branchCompany: '',
+                category: '',
+                dataSource: '',
+                noticeType: '',
+                isCopied: '',
+                publishDate: '',
+                bidOpeningDate: '',
+                storageDate: ''
+            };
+            this.queryParams.pageNum = 1;
+            this.getList();
+        },
+        // 批量确认人选
+        handleBatchConfirm() {
+            console.log('批量确认人选');
+        },
+        // 批量有关
+        handleCancelCustomer() {
+            console.log('批量有关');
+        },
+        // 批量无关
+        handleCancelSection() {
+            console.log('批量无关');
+        },
+        // 新增
+        handleAdd() {
+            console.log('新增公告');
+        },
+        // 导出范本
+        handleExportTemplate() {
+            console.log('导出范本');
+        },
+        // 添加审批导出周报
+        handleAddStandardFormat() {
+            console.log('添加审批导出周报');
+        },
+        // 编辑
+        handleEdit(row) {
+            this.currentData = { ...row };
+            this.dialogVisible = true;
+        },
+        // 更多操作命令处理
+        handleCommand(command, row) {
+            switch (command) {
+                case 'detail':
+                    this.currentData = { ...row };
+                    this.dialogVisible = true;
+                    break;
+                default:
+                    console.log('未知命令:', command);
+            }
+        },
+        // 获取列表数据
+        getList() {
+            console.log('分页参数:', this.queryParams);
+            console.log('搜索条件:', this.searchForm);
+            this.tableLoading = true;
+            /**
+             * @description: 获取公开市场列表
+             * @param {*}
+             * @return {*}
+             */
+            getFreeMarketList(this.queryParams).then(response => {
+                if (response.code === 200) {
+                    this.noticeList = response.rows || [];
+                    this.total = response.total || 0;
+                } else {
+                    this.$message.error(response.msg || '获取公开市场列表失败');
+                }
+            }).finally(() => {
+                this.tableLoading = false;
+            });
+        },
+        // 审批导出
+        handleGenerateTask() {
+            console.log('审批导出', { exportMethod: this.exportMethod, exportScope: this.exportScope });
+        }
+    }
+}
+</script>
+
+<style scoped>
+.search-container {
+    background-color: #fff;
+    padding: 20px;
+    border-radius: 4px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+    margin-bottom: 20px;
+}
+
+.search-form {
+    margin-bottom: 0;
+}
+
+.search-form .el-form-item {
+    margin-bottom: 15px;
+}
+
+.list-container {
+    background-color: #fff;
+    padding: 20px;
+    border-radius: 4px;
+    box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
+}
+
+.list-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    margin-bottom: 20px;
+}
+
+.tab-container {
+    margin-bottom: 20px;
+}
+
+.left-buttons {
+    display: flex;
+    gap: 10px;
+}
+
+.right-buttons {
+    display: flex;
+    gap: 10px;
+    align-items: center;
+}
+
+.export-section {
+    display: flex;
+    align-items: center;
+    padding: 5px 10px;
+}
+</style>

+ 3 - 1
vue.config.js

@@ -9,7 +9,9 @@ const CompressionPlugin = require('compression-webpack-plugin')
 
 const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
 
-const baseUrl = 'http://localhost:8080' // 后端接口
+// const baseUrl = 'http://10.130.22.73:1090' // 后端接口
+const baseUrl = 'http://10.64.12.216:12321' // 后端接口
+
 
 const port = process.env.port || process.env.npm_config_port || 80 // 端口